在OpenCL中,我有一個內核需要對複雜和真實的數據進行操作。我可以在條件語句中調用正確的代碼來處理這個問題,或者我可以調用兩個內核,並將條件語句推送給我的調用代碼。我應該創建多個OpenCL內核以避免條件語句嗎?
這顯然不利於可維護性,但對性能有重要意義嗎?
在OpenCL中,我有一個內核需要對複雜和真實的數據進行操作。我可以在條件語句中調用正確的代碼來處理這個問題,或者我可以調用兩個內核,並將條件語句推送給我的調用代碼。我應該創建多個OpenCL內核以避免條件語句嗎?
這顯然不利於可維護性,但對性能有重要意義嗎?
如果只是一個條件語句,根據我的經驗,性能差異絕對可以忽略不計,至少在NVidia硬件上是如此。
基本上,只要所有(或大部分)工作項都遵循相同的代碼路徑,就沒問題。由於代碼路徑取決於您的案例中的內核參數,因此所有工作項都遵循相同的路徑。
取決於有條件的地方。首先爲可讀性編碼,然後在測量之後進行性能測試,發現這是一個問題
例如, kernel_for_RGB_image和kernel_for_ABGR_image看起來像是一個合理的用途,不同的內核有效展開一些深層次的內部循環可能是一個更大的維護頭痛。
我認爲最好的方法是實際嘗試和測試兩個變體。在某些情況下編譯多個條件塊,即使只執行其中一個條件塊,也會導致性能下降。原因是GPR(通用寄存器):編譯器分配儘可能多的寄存器,最壞情況下需要。
我可以建議這樣的解決方案:有一個單一的內核函數,但編譯時的條件:
__kernel void work()
{
#if VAR
// one code
#else
// another code
#endif
}
然後,你需要改變狀態時true
/false
集重新編譯內核VAR
。顯然,對於編譯器來說,它與兩個內核沒有區別,但是對於這些內核來說,如果部分代碼是相同的,那麼維護可能會更好。