[关于CUDA编程的学习——Day-1]
记录了楼主本人在CUDA学习中的一些感受,如果有任何问题请指正
-
CUDA编程的模式
总体上学习完感觉CUDA编程和C++编程类似。不过对于CPU和GPU的变量使用部分有所不同。 -
CUDA编程的基础步骤
首先必然是头文件添加#include <cuda_runtime_api.h> #include <device_launch_parameters.h> #include <device_functions.h>
可以简单的分成4步
- 定义变量
const int num = 16;
float *InputGpu;//GPU中计算用到的变量
float Input[num];//模拟CPU中现在所使用的变量
for (int i = 0; i < num; i++)
{
Input[i] = i;
}
- 将变量导入GPU中
//将InputGPU存到显存中,为后边计算做准备
cudaMalloc((void**)&InputGpu, num*sizeof(float));
- 将所要计算的变量赋值给GPU
//将所需计算的Input赋值给已经拷贝到GPU中的InputGPU
cudaMemcpy(InputGpu, Input, num * sizeof(float), cudaMemcpyHostToDevice);
- 设计一个计算用的核函数
//这里是设计了一个赋值的核函数,会将InputGpu其中所有的数值赋值为1
//因为CUDA其实是每个线程负责一个数的计算所以‘threadIdx.x’是用来获取当前计算的数值的位置
__global__ void kernel(float *InputGpu, int num)
{
int Local = threadIdx.x;
if(Local<num)
InputGpu[Local] = 1;
}
- 在主函数中调用核函数进行计算
//启用1个block,num个thread.
kernel<< <1, num >> > (InputGpu, num);
- 计算结束,需要将结果从GPU中拷贝回CPU中
float Output[num];
cudaMemcpy(Output, InputGpu, num * sizeof(float), cudaMemcpyDeviceToHost);
- 这样一个CUDA计算的基础步骤就是完成了,最后输出来看一下结果
for (int i = 0; i < num; i++)
{
printf("%.0f ", Output[i]);
}