在库达运行零块

时间:2013-09-26 08:10:26

标签: cuda

我有一个这样的循环:

while ( ... ) {
    ...
    kernel<<<blocks, threads>>>( ... );
}

并且在某些迭代中blocksthreads具有值0。当我使用它时,我的代码运行。我的问题是,如果这被认为是不好的做法,如果还有其他不良副作用。

2 个答案:

答案 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。

这种副作用是由于内核调用为零块而引起的。