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