運行零塊我有這樣一個循環:在CUDA
while (...) {
...
kernel<<<blocks, threads>>>(...);
}
,並在某些迭代blocks
或threads
具有價值0
。當我使用它時,我的代碼運行。我的問題是如果這被認爲是不好的做法,並且如果有任何其他不良的副作用。
運行零塊我有這樣一個循環:在CUDA
while (...) {
...
kernel<<<blocks, threads>>>(...);
}
,並在某些迭代blocks
或threads
具有價值0
。當我使用它時,我的代碼運行。我的問題是如果這被認爲是不好的做法,並且如果有任何其他不良的副作用。
這是不好的做法,因爲它會干擾proper CUDA error checking。
如果你做了適當的錯誤檢查,你的內核啓動的塊或網格尺寸的全零值將會引發錯誤。
由於各種原因,最好編寫無差錯程序。
相反,包含這些情況的測試,並在尺寸爲零時跳過內核啓動。 C代碼中的小開銷可以通過減少API開銷來抵消,而不會造成虛假的內核啓動請求。
我試圖通過簡單地寫下面的空內核來嘗試零塊內核調用。
文件:
#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。
這種副作用是由於內核對零塊的頭部調用引起的。
我不認爲它會在程序上產生開銷,因爲如果你指定了0個線程,內核將不會啓動。 – sgarizvi