注意点
__synchthreads()
只能同步 block 中的线程,CUDA 中没有函数能够同步不同 block 中的线程。Device 上定义的函数只能被 Device 上的函数或 kernel 调用,不能被 Host 上的函数调用。Device 上定义的函数不能调用 Host 上定义的函数。
__constant__
变量在 kernel 中不能被改变,在 kernel 外部可以通过cudaMemcpyToSymbol()
修改其值。Device 上的函数不能引用 Host 上的指针(指向 host 内存空间的指针),Device 上的代码不能访问 Host 内存空间。
使用 shared memory 时,注意前面代码是否有线程 return。
shared memory 在定义时不会被初始化。
页锁定内存 (pinned memory) 在分配(
cudaHostAlloc()
)和释放(cudaFreeHost()
) 内存时消耗比较大,但是在大内存传输时有着更高的传输吞吐量,速度更快。一般 32 个线程为一个 warp ,这 32 个线程上的指令在硬件上已经同步。
参考
在cuda的核函数中访问类的成员函数