纸上得来终觉浅,绝知此事要躬行
看了很久很久的书,觉得自己大致的框架以了解,但是从未动手尝试,一旦动手你就会发现很多地方就卡顿了,当你把这些卡顿解决以后,你才踏入cuda编程的大门;
#define data_size 5
__global__ void addKernel(const int *a,const int *b,int *c)
{
int tid;
tid = threadIdx.x;
c[tid] = a[tid] + b[tid];
}
int main()
{
int a[data_size] = { 1,2,3,4,5 };
int b[data_size] = { 2,4,6,7,8 };
int c[data_size] = { 0 };
int *da, *db, *dc;
cudaMalloc((void**)&da, data_size * sizeof(int));
cudaMalloc((void**)&db, data_size * sizeof(int));
cudaMalloc((void**)&dc, data_size * sizeof(int));
cudaMemcpy(da, a, data_size * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(db, b, data_size * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dc, c, data_size * sizeof(int), cudaMemcpyHostToDevice);
addKernel << <1, data_size>> > (da, db, dc);
cudaMemcpy(c, dc, data_size * sizeof(int), cudaMemcpyDeviceToHost);
printf("%d%d%d%d%d\n", c[0], c[1], c[2], c[3], c[4]);
cudaFree(da);
cudaFree(db);
cudaFree(dc);
return 0;
}
这是一个很简单的数组相加的程序,程序还是分为两部分host和device:
host:负责变量申明,赋初值,内存分配,函数调用
device:负责计算的描述,线程的分配,内存的使用