cuda 原子操作、页锁定内存
·
设置运行cuda程序的计算功能集最低版本
例如1.1版本,编译参数nvcc -arch=sm_11
例如1.2版本,编译参数nvcc -arch=sm_12
原子操作
在CPU中,若两个线程对同一变量同时进行操作,可能导致结果不正确。原子操作保证多线程一次操作一个变量。GPU中也如此
GPU中启动的线程块为处理器数量的两倍时,效率最佳。
原子操作函数均以atomic开头,

使用cudaHostAlloc() 分配页锁定内存
此函数作用和参数都和malloc相似,都是在主机上分配内存,为什么cuda会设置这么一个函数呢?
不同点是malloc分配的内存为常规的页内存,根据内存的使用情况,页内存可能被计算机交换到磁盘里。而GPU和主机交换数据时,会先将主机内存中的数据拷贝至锁定页内存,再从锁定页内存拷贝至设备。直接分配锁定页内存会减少大量工作。
锁定页内存和常规页内存相对,锁定页内存不会被交换到磁盘,始终固定在内存上。
这也意味着,每分配一次锁定页内存,内存上限就少一分,所以在使用完锁定页内存后要及时释放(cudaFreeHost())分配的内存,否则会导致内存上限减少,主机性能下降。(程序运行期间)
测试程序:用cudaHostAlloc和malloc分别分配1,000,000个double,分别向GPU拷贝10,000次。
测试结果:锁定页内存拷贝时间:7190ms,常规页内存拷贝时间:28470ms.
更多推荐

所有评论(0)