对“战俘”的呼唤含糊

时间:2019-01-12 13:57:18

标签: c++ opencl

当我尝试运行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 ++函数呢?

1 个答案:

答案 0 :(得分:2)

该错误表示该函数没有版本采用您要传递的类型,而是存在多个版本可以将其转换为类型(例如float和{{1} }。编译器不知道您要哪个。此功能没有double版本,但是您正在传递int。可以通过将参数强制转换为函数来解决错误,使其清晰可见(在这种情况下,强制转换为int,然后将结果强制转换回float)。