0

我有一个这样的循环:

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

并在某些迭代中blocksthreads具有价值0。当我使用它时,我的代码会运行。我的问题是这是否被认为是不好的做法,以及是否有任何其他不好的副作用。

4

2 回答 2

2

这是不好的做法,因为它会干扰正确的 CUDA 错误检查

如果您进行了正确的错误检查,那么对于块或网格尺寸具有全零值的内核启动将引发错误。

出于各种原因,最好编写无错误的程序。

相反,包括对这些情况的测试并在维度为零时跳过内核启动。通过不发出虚假内核启动请求而减少的 API 开销将大大抵消 C 代码中执行此操作的少量开销。

于 2013-09-26T12:12:03.167 回答
0

我通过简单地编写以下空内核来尝试零块内核调用。

文件:

#include<stdio.h>

__global__ void fg()
{

} 
int main()
{   
 fg<<<0,1>>>();
}

我注意到唯一的副作用是执行所需的时间。

运行 :

实际 0m0.242s,用户 0m0.004s,系统 0m0.148s。

当我使用内核调用运行相同的文件时,注释掉开销的副作用会减少。

运行:

实际 0m0.003s,用户 0m0.000s,系统 0m0.000s。

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

于 2013-09-26T11:39:59.120 回答