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数组元素。

                      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值