Opencl AMD的编译时参数出错

Opencl AMD的编译时参数出错,opencl,intel,amd-processor,Opencl,Intel,Amd Processor,这是关于openCL中的编译时参数。 我有一个固定大小的常量数组,并将其作为编译时参数传递,如下所示: -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,与将系数作为另一个参数传递给内核相比,我获得了相当大

这是关于openCL中的编译时参数。 我有一个固定大小的常量数组,并将其作为编译时参数传递,如下所示:

 -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中,逗号也被用作编译时参数的分隔字符,这导致了错误


如能帮助解决此问题,我们将不胜感激。提前感谢。

尝试将字符串引用到
-DCOEFF=“0.1f,0.2f,0.5f,0.2f,0.1f”


看起来编译器正在查找文件“0.2f”,这是第二个元素,因此在第一个元素和逗号之后,编译器已经停止将输入解释为系数定义的一部分。

这个问题是在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

这对我使用Intel和AMD opencl都有效。我的AMD opencl版本是“OpenCL1.2AMD-APP(937.2)”。什么版本产生了这个错误?我使用的是OpenCL 1.2 AMD-APP(1311.2),我切换到了我能找到的最新的AMD Windows OpenCL(OpenCL 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}我可能无法使用您的第二个建议,因为我的数组长度不是常量<代码>-DCOEFF=0.1f,0.2f,0.5f,0.2f,0.1f
,它也可以是
-DCOEFF=0.1f,0.2f,0.5f,0.2f,0.1f,0.1,f
。通过将其保存在一个动态参数中,我实际上享受到了很大的灵活性和性能改进(仅在Intel中进行了测试)。通过这种方式,消除了报告的错误。但是,它将在内核中失败,
float-chnWeight[]={COEFF}
。您可以将编译器错误日志发布在
float-chnWeight[]={COEFF}
?第(171)行OpenCL错误:clBuildProgram因[CL\u-BUILD\u-PROGRAM\u-FAILURE]而失败。实际上,在内核中,我正在尝试使用
chnWeight[]
中的数据。我在英特尔和NVDIA也测试了这项工作,无论在哪里,它都运行良好。