对战俘的呼吁是模棱两可的

时间:2012-12-01 15:53:42

标签: java opencl jocl

在使用JOCl(java版本opencl)时,我遇到了这个错误。

Exception in thread "main" org.jocl.CLException: CL_BUILD_PROGRAM_FAILURE
Build log for device 0:
<program source>:3:255: error: **call to '__cl_pow' is ambiguous**
__kernel void sampleKernel(__global short *x,             __global short *y,           __global uint *stop,           __global uint *moment){private uint a = 1;private uint b = 2;for(uint i =0; i<= 100;i++){ for(uint j = stop[i]; j < stop[i+1]; j++){    pow(a,b)      }  }}

我的内核代码:

  private static String programSource =
            "__kernel void "
            + "sampleKernel(__global short *x,"
            + "             __global short *y,"
            + "           __global uint *stop,"
            + "           __global uint *moment)"
            + "{"
            + "for(uint i =0; i<= 100;i++){"
            + " for(uint j = stop[i]; j < stop[i+1]; j++){"
            + "    moment[i] = moment[i] + (pow(x[j],0)*pow(y[j],0))  "
            + "     }"
            + "  }"
            + "}";

我认为这是因为x和y的数据类型。但是当我做一个简单的pow(1,1)时,它会导致相同的错误。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

只是一个猜测:

整数类型没有 pow 的重载,因此编译器会尝试在所有可用的重载中找到最接近的匹配项:

  • pow(double,double)
  • pow(float,float)
  • ...

但是,由于 short 可以转换为 float 以及 double ,因此它找不到单个重载,因此错误。

要检查此假设,请尝试使用强制转换显示您要使用的转换:

(pow((float)x[j],0)*pow((float)y[j],0))