與虹膜臨GPU和OS X 10.11是它(但可在10.12)?因爲上週我們遇到了類似的問題。編譯調用會掛起幾分鐘,使用大量內存,然後返回一個無用的錯誤代碼。在其他GPU上工作良好,並於10月12日,感覺像英特爾/蘋果編譯器的錯誤。內核相對簡單;它是if/else條件的鏈條。使用邏輯AND運算符(&&
),每個條件都有它檢查的條件。基於英特爾年前小費,我們記得,在C的經營者是「短路」,這意味着你在語義上創建多個可能的分支(即使編譯器真的應該知道有沒有副作用,但顯然並不總是)。
我們的解決方案是拉那些進行了一系列布爾分配的,所以每個如果有一個布爾和周圍的if和else塊沒有分支。因此,更改代碼沿着這些線路:
if (cond1 && cond2 && cond3)
...
else if (cond4 && cond5 && cond6)
...
要
bool b1 = cond1 && cond2 && cond3;
bool b2 = cond4 && cond5 && cond6;
if (b1)
...
else if (b2)
...
這允許內核編譯。
我看到你的內核有一些if語句有三個&&
運營商向上,所以也許你有同樣的問題。
我也看到這個解決方案使用&
而不是&&
,但我從來沒有覺得使用按位AND而不是邏輯AND,以防萬一某些條件不是相同的位模式。
相同的邏輯適用於||
,這也是短路。
祝你好運!我希望這可以幫助你,或者至少是某個人。
編輯:在英特爾提到我們存在短路問題(並建議使用&
)時,爲了給出額外的功勞,AMD還在其OpenCL優化指南中提到了它,並建議使用布爾變量來修復它(第2.8.7.2節旁路短路),這是我們用來解決它的。