2017-08-17 75 views
0

我已經編譯在Windows和Linux操作系統Ubuntu罰款,但未能MacOSX上一個相當大的OpenCL文件。 cvmcompiler進程使用100%的CPU並且永遠不會完成。該項目的完整的代碼有:OpenCL的文件無法被編譯在OS X

https://github.com/favreau/Sol-R

和有問題的文件是:

https://github.com/favreau/Sol-R/blob/master/solr/engines/opencl/RayTracer.cl

這個問題應該很容易通過克隆項目和運行cmake的重現/製作過程。請注意,由於OpenCL是在運行時編譯的,因此需要啓動應用程序來重現問題。

回答

1

與虹膜臨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節旁路短路),這是我們用來解決它的。