当我尝试运行opencl内核时,出现错误:
Error building: stringInput.cl:1:197: error: call to 'pow' is ambiguous
/usr/lib/x86_64-linux-gnu/beignet/include/ocl_math.h:49:20: note: candidate function
/usr/lib/x86_64-linux-gnu/beignet/include/ocl_math.h:148:19: note: candidate function
我正在使用以下c ++ opencl代码:
std::string kernel_code=
" void kernel simple_add(global const int* A, global const int* B, global int* C){ "
" for(int i=0;i<20000;i++) { "
" for(int j=0;j<20000;j++) { "
" for(int k=0;i<20000;i++) { "
" int d1 = sqrt(pow(A[i]-A[j],2)+pow(B[i]-B[j],2)+pow(C[i]-A[j],2)) "
" int d2 = sqrt(pow(A[i]-A[k],2)+pow(B[i]-B[k],2)+pow(C[i]-A[k],2)) "
" int d3 = sqrt(pow(A[k]-A[j],2)+pow(B[k]-B[j],2)+pow(C[k]-A[j],2)) "
" C[i+j]=A[i]+B[j]+k; "
" } "
" } "
" } "
" } ";
sources.push_back({kernel_code.c_str(),kernel_code.length()});
我正在使用英特尔图形卡和opencl bingnet。在这里,当我在内核代码中不使用pow或sqrt函数时,它运行正常。那么如何在opencl内核中使用其他c ++函数呢?
答案 0 :(得分:2)
该错误表示该函数没有版本采用您要传递的类型,而是存在多个版本可以将其转换为类型(例如float
和{{1} }。编译器不知道您要哪个。此功能没有double
版本,但是您正在传递int
。可以通过将参数强制转换为函数来解决错误,使其清晰可见(在这种情况下,强制转换为int
,然后将结果强制转换回float
)。