CUDA编程整理
CUDA编程的理论部分可以参考模型部署篇 中的GPU 的 CUDA 编程方法。
虽然CUDA有很多的C代码,这里我们主要以C++为主。一个完整的CUDA程序,需要经历7个步骤
- 设置显卡设备
- 分配显存空间
- 从内存到显存拷贝数据
- 执行CUDA并行函数
- CUDA函数结束后,将结果从显存拷贝回内存
- 释放显存空间
- 设备重置
如果是单GPU的话可以省略1跟7两个步骤。
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime_api.h>
#include <iostream>
using namespace std;
/* 核函数 */
__global__ void kernelFunc(float *a) {
a[threadIdx.x] = 1;
}
int main(int argc, char **argv) {
//获取GPU的数量
int gpuCount = -1;
cudaGetDeviceCount(&gpuCount);
cout << gpuCount << endl;
if (gpuCount < 0) {
cout << "no device" << endl;
}
//设置显卡设备
cudaSetDevice(0);
//分配显存空间
float *aGpu;
cudaMalloc((void**)&aGpu, 16 * sizeof(float));
//从内存到显存拷贝数据
float a[16] = {0};
cudaMemcpy(aGpu, a, 16 * sizeof(float), cudaMemcpyHostToDevice);
//执行CUDA并行函数
kernelFunc <<<1, 16>> >(aGpu);
//CUDA函数结束后,将结果从显存拷贝回内存
cudaMemcpy(a, aGpu, 16 * sizeof(float), cudaMemcpyDeviceToHost);
for (int i = 0; i < 16; i++) {
printf("%f", a[i]);
}
printf("\n");
//释放显存空间
cudaFree(aGpu);
//设备重置
cudaDeviceReset();
//获取设备的属性
cudaDeviceProp prop;
cudaGetDeviceProperties(&prop, 0);
//块最大线程数
printf("maxThreadsPerBlock: %d\n", prop.maxThreadsPerBlock);
//块维度最大值
printf("maxThreadsDim: %d\n", prop.maxThreadsDim[0]);
//Grid各维度最大值
printf("maxGridSize: %d\n", prop.maxGridSize[0]);
//常量内存的大小
printf("totalConstMem: %d\n", prop.totalConstMem);
//时钟频率
printf("clockRate: %d\n", prop.clockRate);
//GPU是否集成
printf("initegrated: %d\n", prop.integrated);
return 0;
}
CUDA的源码文件以.cu为后缀,编译命令如下(需要先安装CUDA,安装方式可以参考乌班图安装Pytorch、Tensorflow Cuda环境 )
nvcc main.cu -o main
运行结果
1
1.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.000000
maxThreadsPerBlock: 1024
maxThreadsDim: 1024
maxGridSize: 2147483647
totalConstMem: 65536
clockRate: 921600
initegrated: 1
「其他文章」