第二章
代码分为两类,一类叫作主机代码(host code),而一类叫做设备代码(device code)。前者在CPU上运行,后者在GPU上运行。访问的内存也是不一样的。本书代码主机内存中的变量名以h_
为前缀,设备内存的变量名以d_
为前缀。
从CUDA 6.0开始,可以使用一个指针访问CPU或GPU内存,不用担心无法寻址而崩溃的事情。
在核函数执行的时候,控制权马上交回给CPU。也就是说CPU和GPU是并行运行的,两者是异步的。如果主机代码需要GPU计算完成后返回的结果,则须使用cudaDeviceSychronize()
函数来使得主机代码等待GPU完成。
主机内存和设备内存之间的数据是不互通的,因此执行核函数需要进行以下几个步骤:
(1)使用cudaMemcpy来将主机内存的数据拷贝进设备内存(前提是已经使用cudaMalloc来为设备变量开辟内存空间)),第四个参数为:cudaMemcpyHostToDevice
(2)调用核函数进行计算。
(3)使用cudaMemcpy将设备内存的数据拷贝回主机内存,第四个参数为:cudaMemcpyDeviceToHost
cudaMalloc的使用方法:
cudaMalloc的原型为:
cudaError_t cudaMalloc(void ** devPtr, size_t size);
返回值有两种可能:cudaSuccess和cudaErrorMemoryAl