2013-09-26 51 views
0

運行零塊我有這樣一個循環:在CUDA

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

,並在某些迭代blocksthreads具有價值0。當我使用它時,我的代碼運行。我的問題是如果這被認爲是不好的做法,並且如果有任何其他不良的副作用。

+0

我不認爲它會在程序上產生開銷,因爲如果你指定了0個線程,內核將不會啓動。 – sgarizvi

回答

1

這是不好的做法,因爲它會干擾proper CUDA error checking

如果你做了適當的錯誤檢查,你的內核啓動的塊或網格尺寸的全零值將會引發錯誤。

由於各種原因,最好編寫無差錯程序。

相反,包含這些情況的測試,並在尺寸爲零時跳過內核啓動。 C代碼中的小開銷可以通過減少API開銷來抵消,而不會造成虛假的內核啓動請求。

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。

這種副作用是由於內核對零塊的頭部調用引起的。