cuda的一些注意和疑问

     Grid 和Block维度的设计

             1   首先,每个Block的线程数量不能超过512个。而且尽量让线程数是32的整数倍(warp内线程数量的整数倍)。

                 __global__ void  kernalfunction(...)

                      在主程序中如此调用内核函数一定会在运行中出错(编译检测不出来):

                      dim3 Block(64,64,1);

                     kernalfunction<<<1, Block,>>>(...) ///错误的原因就是block的线程数量不能超过512.。

           2 grid内block的数量应该尽可能的大,理想情况下,grid中的block数量应该至少比gpu内 总的active block数量大几倍。

 

      异步执行

             cudaMemcpy函数对于主机是同步的,但是cudaMemcpyAsyn是异步的,执行GPU内核函数对于主机也是异步的。

              cudaDevicesynchronize()  是cudaThreadSynchronize()在新版本CUDA里的替代函数,用device更加贴切。

          注意:

                     在传输数据量大小一样的情况下,使用 cudaMemcpyAsyn()后加  cudaDevicesynchronize() ,与单一条cudaMemcpy(),测试时间相同。

                     若是在cudaMemcpy()后面加一条  cudaDevicesynchronize() ,然后测试时间的话,会多0.5ms。也就是说在同步执行的函数后,写一条强制同步语句  cudaDevicesynchronize() ,会多耗时0.5ms,这是应该避免的。

 

      在主机和GPU之间拷贝内存

            一般主机至GPU的拷贝要比GPU至主机稍微快一点,大约都是3GB/s,也就是说,对于char类型的数组,1ms传输3M数组元素;对于int类型的数组,1ms传输0.75M数组元素。

                      

你可能感兴趣的:(线程,CUDA)