2013-10-15 87 views
0

這是關於openCL編譯時參數的問題。 我有固定大小的常數的陣列,並且我將它作爲編譯時參數,如下所示:AMD編譯時參數錯誤

-DCOEFF=0.1f,0.2f,0.5f,0.2f,0.1f 

而在內核,我讀它作爲,

__kernel void Smoothing(__global const float *in, __global float *out) 
{ 
    float chnWeight[] = {COEFF}; 

} 

這樣,使用intel-SDK,與將係數作爲內核的另一個參數傳遞相比,我獲得了相當大的性能優勢。

問題出在AMD上,這是沒有得到編譯。我收到以下錯誤:

0.2f: 
Catastrophic error: cannot open source file "0.2f" 

1 catastrophic error detected in the compilation of "0.2f". 
Compilation terminated. 

據我所知,在AMD(逗號)也作爲對編譯時間參數的分隔符,這是造成錯誤。

任何幫助解決這個問題將不勝感激。提前致謝。

+0

這同時使用英特爾和AMD的OpenCL爲我工作。我的AMD opencl版本是「OpenCL 1.2 AMD-APP(937.2)」。什麼版本產生這個錯誤? – ScottD

+0

我使用OpenCL 1.2 AMD-APP(1311.2) – Neeba

+0

我切換到了我能找到的最新AMD Windows OpenCL(Op​​enCL 1.2 AMD-APP(1268.1)),現在我遇到了與您完全相同的問題。我所知道的只是使用一個較老的OpenCL,或者是一個有些醜陋的解決方法,比如用'-DCOEFF0 = 0.1f -DCOEFF1 = 0.2f -DCOEFF2 = 0.5f -DCOEFF3 = 0.2f -DCOEFF4 = 0.1f'編譯以及使用C代碼:'float chnWeight [] = {COEFF0,COEFF1,COEFF2,COEFF3,COEFF4};' – ScottD

回答

0

在某些版本937.2和1268.1之間的AMD OpenCL中引入了此問題。這裏是一個變通:

更換, -DCOEFF=0.1f,0.2f,0.5f,0.2f,0.1f-D COEFF=0.1f,0.2f,0.5f,0.2f,0.1f

+0

非常感謝這個解決方法。我也在intel和NVDIA上測試了這項工作,並且在任何地方工作都很好。 – Neeba

0

嘗試引用該字符串-DCOEFF="0.1f,0.2f,0.5f,0.2f,0.1f"

它看起來編譯器正在尋找文件「0.2F」,這是第二個元素,所以第一個元素與逗號後的編譯器已經停止解釋輸入作爲COEFF定義的一部分。

+0

使用這種方式,可以消除報告的錯誤。但是,它會在內核失敗,'float chnWeight [] = {COEFF}'。 – Neeba

+0

你可以在'float chnWeight [] = {COEFF}'上發佈編譯錯誤日誌嗎? – DarkZeros

+0

line(171)OpenCL錯誤:clBuildProgram失敗,[CL_BUILD_PROGRAM_FAILURE]。實際上,在內核中,我試圖在'chnWeight []'中使用數據,之後。 – Neeba