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