cudaLaunchCooperativeKernel启动核函数的时候block有限制么?

  • 2 replies
  • 190 views
*

sisiy

  • *****
  • 147
    • 查看个人资料
cudaLaunchCooperativeKernel启动核函数的时候block有限制么?为什么我开启256个block会报错

显示:too many blocks in cooperative launch

Re: cudaLaunchCooperativeKernel启动核函数的时候block有限制么?
« 回复 #1 于: 六月 14, 2019, 01:37:54 pm »
cudaLaunchCooperativeKernel启动核函数的时候block有限制么?为什么我开启256个block会报错

显示:too many blocks in cooperative launch

Cooperative Launch在支持的卡上,需要确保你要求启动的数量的blocks能安全的同时驻留在设备上的。你的问题出现在要求的数量(256)超过了一次性,能驻留在设备上运行的极限(和具体的卡,具体的kernel有关)。Cooperative Launch目前不支持任务抢占和调度。

所以,安全blocks极限在于:
[最小的每个SM上的你的kernel的block数量 * sm数量,最大的你的每个SM上的kernel的block数量 * sm数量]

其中最小数量显然是1(当任一SM均不能容纳1个block的时候,kernel的所有启动方式均将失败--包括普通启动)
而最大的数量可以看profiler里报告的occupancy信息(你也可以调用occupancy api来动态确定,或者手工限定资源数量,然后根据计算能力确定),例如假设某kernel正好是4 blocks/SM好了。

这样你安全的启动范围只能限定于[SM, 4 * SM]个blocks之间,超过这个数量将无法保证他们安全的同时驻留在设备上。

在不支持Cooperative Launch的卡和平台上,通过其他技巧实现的全局同步,也拥有类似的限制。

建议的解决方案:
重新检查你的kernel的资源使用(或者看profiler的occupancy信息),确保总blocks数量在[SM, 4SM]之间,然后重新启动kernel。

Re: cudaLaunchCooperativeKernel启动核函数的时候block有限制么?
« 回复 #2 于: 六月 14, 2019, 01:59:22 pm »
在使用中发现使用协作组做块间同步,比把程序写成两个kernel,顺序执行的效率要低。请问这是正常现象么?如果是正常现象的话。协作组的作用在哪里?