2013-10-15 67 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