Tips for CUDA

注意点

  1. __synchthreads() 只能同步 block 中的线程,CUDA 中没有函数能够同步不同 block 中的线程。

  2. Device 上定义的函数只能被 Device 上的函数或 kernel 调用,不能被 Host 上的函数调用。Device 上定义的函数不能调用 Host 上定义的函数。

  3. __constant__ 变量在 kernel 中不能被改变,在 kernel 外部可以通过 cudaMemcpyToSymbol() 修改其值。

  4. Device 上的函数不能引用 Host 上的指针(指向 host 内存空间的指针),Device 上的代码不能访问 Host 内存空间。

  5. 使用 shared memory 时,注意前面代码是否有线程 return。

  6. shared memory 在定义时不会被初始化。

  7. 页锁定内存 (pinned memory) 在分配(cudaHostAlloc())和释放(cudaFreeHost()) 内存时消耗比较大,但是在大内存传输时有着更高的传输吞吐量,速度更快。

  8. 一般 32 个线程为一个 warp ,这 32 个线程上的指令在硬件上已经同步。

参考

  1. 在cuda的核函数中访问类的成员函数