Призыв к пау неоднозначен
Работая с 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 ответ
Решение
Просто предположение:
для целочисленных типов перегрузка pow отсутствует, поэтому компилятор попытается найти наиболее близкое соответствие среди всех доступных перегрузок:
- Pow(двойной, двойной)
- Pow(плавать, плавать)
- ...
Но поскольку short может быть преобразован в число с плавающей запятой, равно как и в double, он не находит единственной перегрузки для использования, следовательно, это ошибка.
Чтобы проверить эту гипотезу, попробуйте явное преобразование, которое вы хотите использовать с приведением:
(pow((float)x[j],0)*pow((float)y[j],0))