在使用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)时,它会导致相同的错误。
我怎样才能解决这个问题?
最佳答案
只是一个猜测:
整数类型没有pow的重载,因此编译器将尝试在所有可用的重载中查找最接近的匹配项:
战俘(双,双)
战俘(浮标,浮标)
...
但是由于short可以转换为float以及double,因此找不到单个重载,因此会出现错误。
要检查此假设,请尝试明确使用类型转换要使用的转换:
(pow((float)x[j],0)*pow((float)y[j],0))