嘈杂文章 勿扰
根据大佬们的教程终于完成了GPU环境的搭建,一开始是我考虑复杂了,在没人指点的情况下,各种博客天花乱坠。结果好像只需要下载cuda和cudnn两个软件。环境搭建算是到一段落,有问题再解决。
认真读了GPU高性能编程CUDA实战 2~5.2章节,作以下总结:
一、第一个代码抄书,了解本机gpu型号性能情况
具体代码忘了
二、第三章学习核函数的调用、在GPU上分配线程、GPU和CPU参数传递
1.cudaMalloc()分配的指针
int* dev;
cudaMalloc((void**)&dev,sizeof(?));
指针dev可以传递给设备上执行的函数,进行内存读写操作;
指针dev可以传递给主机上执行的函数,不能进行内存读写操作。
2.在GPU上调用核函数
__global__ void add(int a,int b ,int* c)
{
*c=a+b;
}
add<<<N,M>>>(a,b,c);
3.实现CPU-GPU的参数传递
cudaMemcpy(dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice); 将a从主机传递给设备,dev_a接收
cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost); 将dev_c从设备传递到主机,c接收
三、第四章,矢量求和运算
<<<1,N>>> 数据索引方法,对线程进行索引 int tid = threadIdx.x
<<<N,1>>> 数据索引方式,对线程块进行索引 int tid = blockIdx.x
<<<N,M>>> 数据索引方法,对线程块和线程结合 int tid = threadIdx.x + blockIdx.x * blockDim.x 其中blockDim算是一个常数,线程块每一维的线程数量(P46)
其中N为线程格中线程块的数量,M为线程块中线程的数量
N,M矢量求和运算中核函数进行了修改,while()循环,每个线程的初始索引值不同(int tid = threadIdx.x + blockIdx.x * blockDim.x ) ,每次递增的数量为 blockDim.x * gridDim.x 即M*N,每个线程可以完成属于自己的任务,互不干扰。
最后,这本书自带的辅助函数我不知道怎么添加,书中给的图形例子无法实现,甚是遗憾