【问题标题】:Error in compile-time arguments with AMDAMD 的编译时参数错误
【发布时间】:2013-10-15 13:46:07
【问题描述】:

这是关于 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 中(逗号)也被用作编译时参数的分隔符,这是导致错误的原因。

任何解决此问题的帮助将不胜感激。提前致谢。

【问题讨论】:

  • 这适用于我同时使用 Intel 和 AMD opencl。我的 AMD opencl 版本是“OpenCL 1.2 AMD-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.1f,0.1,f。通过将其保留在单个动态参数中,我实际上享受了很大的灵活性和性能改进(仅在英特尔中测试)。

标签: opencl intel amd-processor


【解决方案1】:

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

【讨论】:

  • 非常感谢这个解决方法。我也在英特尔和 NVDIA 中测试了这项工作,并且在任何地方都可以正常工作。
【解决方案2】:

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

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

【讨论】:

  • 使用这种方式,消除了报错。但是,它会在内核中失败,float chnWeight[] = {COEFF}
  • 您能否在float chnWeight[] = {COEFF} 发布编译器错误日志?
  • line(171)OpenCL 错误:clBuildProgram 因 [CL_BUILD_PROGRAM_FAILURE] 而失败。实际上,在内核中,我正在尝试使用 chnWeight[] 中的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2015-11-13
  • 2015-03-12
  • 2013-01-05
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多