我有一个这样的循环:
while ( ... ) {
...
kernel<<<blocks, threads>>>( ... );
}
并且在某些迭代中blocks
或threads
具有值0
。当我使用它时,我的代码运行。我的问题是,如果这被认为是不好的做法,如果还有其他不良副作用。
答案 0 :(得分:1)
这是不好的做法,因为它会干扰proper CUDA error checking。
如果您进行了正确的错误检查,那么对于块或网格维度具有全零值的内核启动将引发错误。
出于各种原因,最好编写无错误的程序。
相反,请对这些情况进行测试,并在尺寸为零时跳过内核启动。由于没有做出虚假的内核启动请求,所以C代码中用于实现此目的的小开销将被减少的API开销所抵消。
答案 1 :(得分:0)
我通过编写以下空核来尝试零块内核调用。
文件:
#include<stdio.h>
__global__ void fg()
{
}
int main()
{
fg<<<0,1>>>();
}
我注意到唯一的副作用是执行所需的时间。
运行时间:
真正的0m0.242s, 用户0m0.004s, sys 0m0.148s。
当我使用内核调用运行相同的文件时,开销的副作用会减少。
运行时间:
真实0m0.003s, 用户0m0.000s, sys 0m0.000s。
这种副作用是由于内核调用为零块而引起的。