前言
提示:这里可以添加本文要记录的大概内容:
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执行即可。