第一个CUDA程序


前言

提示:这里可以添加本文要记录的大概内容:

CUDA的相关介绍网上资料一大堆,我就不介绍了,我看了很多教程,第一个cuda程序基本都是教如何编写一个乘积或者累加的核函数开始,对于一些初学的人,其实还是挺困难的。
所以我觉得,第一个cuda程序应该是从先了解GPU的特性,以及如何编译运行开始。


一、CUDA初始化

CUDA 目前有两种不同的 API:Runtime API 和 Driver API,两种 API 各有其适用的范围。由于 runtime API 较容易使用,一开始我们会以 runetime API 为主(另一个Driver API我也没用过)。

1.新建项目

新建一个main.cu的文件就行了,引入如下代码:
在这里插入图片描述

#include <stdio.h>
#include <cuda_runtime.h>



//函数名称:InitCUDA
//功能:初始化CUDA,获取CUDA基础信息
  bool InitCUDA()
  {
    int count;
    printf("进入GPU执行部分......\r\n");
    cudaGetDeviceCount(&count);//取得CUDA装置数目
    if(count == 0) {
        fprintf(stderr, "没有获取到GPU转置数目\r\n");
        return false;
    }

    int i;
    for(i = 0; i < count; i++) {
        cudaDeviceProp prop;
        //取得装置的各项数据,并判断支持的cude版本
        if(cudaGetDeviceProperties(&prop, i) == cudaSuccess) {//查询调用没有错误
            if(prop.major >= 1) {
                printf("CUDA的装置名称:%s\r\n",prop.name);
                printf("设备可用全局存储器总量(字节):%d GB\r\n",prop.totalGlobalMem/1024/1024/1024);
                printf("线程块可用共享存储器最大值(字节,多处理器所线程块可同时共享):%d 字节\r\n",prop.sharedMemPerBlock);
                printf("线程块可以使用的32位寄存器最大值(多处理器上所有线程块可以同时共享):%d\r\n",prop.regsPerBlock);
                printf("按线程计算的warp块大小:%d\r\n",prop.warpSize);
                printf("允许通过cudaMallocPitch为包含存储器区域的存储器分配的最大间距,字节:%d\r\n",prop.memPitch);
                printf("每个块中最大线程数:%d\r\n",prop.maxThreadsPerBlock);
                printf("不变存储器总量,字节:%d\r\n",prop.totalConstMem);
                printf("计算能力的主要和次要修订号:%d,%d\r\n",prop.major,prop.minor);
                printf("KHz,时钟频率:%d\r\n",prop.clockRate);
                printf("对齐要求:%d\r\n",prop.textureAlignment);
                printf("1为可在主机和设备之间并发复制存储器,同时又能执行内核:%d\r\n",prop.deviceOverlap);
                printf("设备上多处理器数量:%d\r\n",prop.multiProcessorCount);
                printf("块各个维度最大值:%d,%d,%d\r\n",prop.maxThreadsDim[0],prop.maxThreadsDim[1],prop.maxThreadsDim[2]);
                printf("网格各个维度的最大值:%d,%d,%d\r\n",prop.maxGridSize[0],prop.maxGridSize[1],prop.maxGridSize[2]);


                break;
            }
        }
    }
    if(i == count) {
        fprintf(stderr, "There is no device supporting CUDA 1.x.\r\n");
        return false;
    }
    //设置目前要使用的装置
    cudaSetDevice(i);


    return true;
  }


int main()
{

    InitCUDA();

    return 0;
}



这个函式会先呼叫 cudaGetDeviceCount 函式,取得支持 CUDA 的装置的数目。如果系统上没有支持 CUDA 的装置,则它会传回 1。
其他的都有注释,来获取GPU的基础信息。

接着在vscode下面的命令行输入:

nvcc -o main main.cu

就会生成一个main的可执行文件,./main执行即可。

### Linux 上 CUDA 的安装 为了在Linux系统上成功安装CUDA工具包并运行首个CUDA程序,需遵循一系列特定的操作指南。 #### 准备工作 确保操作系统满足最低版本需求,并已更新至最新状态。对于大多数现代Linux发行版而言,建议先移除任何旧版本的NVIDIA驱动或CUDA软件包[^1]。 #### 下载与安装 NVIDIA 驱动 访问[NVIDIA官方网站](https://www.nvidia.com/)下载适用于当前系统的图形驱动程序。按照官方说明完成驱动安装过程,在此期间可能需要重启计机以使更改生效。 #### 获取 CUDA 工具包 前往[CUDA Toolkit Archive页面](https://developer.nvidia.com/cuda-toolkit-archive),挑选适合操作环境的具体版本进行下载。推荐采用.run文件形式而非.deb/.rpm包来规避潜在依赖冲突问题。 #### 执行安装脚本 通过命令行界面执行所下载的CUDA安装器(.run文件), 使用`sudo sh cuda_<version>_linux.run`指令启动安装向导。过程中可根据提示选择组件以及同意许可协议等内容。 ```bash $ sudo sh cuda_11.8.0_520.61.05_linux.run ``` #### 设置环境变量 编辑~/.bashrc或其他shell配置文件,添加如下路径设置以便于后续编译链接: ```bash export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH ``` 保存修改后的配置文件并通过source重新加载使之立即生效: ```bash $ source ~/.bashrc ``` #### 编写并测试第一个 CUDA C/C++ 程序 创建名为vectorAdd.cu的新源码文件,输入以下简单矢量加法示例代码片段: ```cpp #include <stdio.h> __global__ void add(int n, float *x, float *y) { int index = threadIdx.x; int stride = blockDim.x; for (int i = index; i < n; i += stride) y[i] = x[i] + y[i]; } int main(void) { int N = 1<<20; float *x, *y; // Allocate Unified Memory – accessible from CPU or GPU cudaMallocManaged(&x, N*sizeof(float)); cudaMallocManaged(&y, N*sizeof(float)); for (int i = 0; i < N; i++) { x[i] = 1.0f; y[i] = 2.0f; } // Run kernel on one CUDA device int blockSize = 256; int numBlocks = (N + blockSize - 1) / blockSize; add<<<numBlocks, blockSize>>>(N, x, y); // Wait for GPU to finish before accessing on host cudaDeviceSynchronize(); printf("%f + %f = %f\n", x[0], y[0], y[0]); cudaFree(x); cudaFree(y); } ``` 利用nvcc编译上述代码生成可执行二进制文件,最后执行该程序验证一切正常运作: ```bash $ nvcc vectorAdd.cu -o vectorAdd $ ./vectorAdd ``` 如果看到预期输出,则表明CUDA开发环境搭建完毕且能够正常使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值