可能是什么原因导致无法在OpenCL中使用Math内置函数?我应该使用某些指令来激活吗?

时间:2017-11-08 11:23:33

标签: opencl

构建返回-11错误。删除pow功能编译好。我没有使用嵌入式配置文件。

__kernel void VectorAdd(__global int* a)
{
    unsigned int n = get_global_id(0);
    a[n] = pow(2, 2); 
}

我抓住错误但字符串为空

int err = clBuildProgram(OpenCLProgram, 0, NULL, NULL, NULL, NULL);
if (err != CL_SUCCESS)  
{ 
    size_t len;  
    char buffer[2048];                  
    printf("Error: Failed to build program executable!\n");
    clGetProgramBuildInfo(OpenCLProgram, cdDevice, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len);
    printf("%s\n", buffer);
    exit(1);
}  

一些有用的信息:
CL_DEVICE_NAME:AMD Radeon HD - FirePro D300计算引擎
CL_DRIVER_VERSION:1。1(2017年1月10日22:25:08)

2 个答案:

答案 0 :(得分:4)

如果查看OpenCL documentation for pow,您会发现它被定义为gentype pow(gentype x, gentype y)。该文件还指出

  

泛型类型名称gentype用于指示函数可以将float,float2,float3,float4,float8,float16,double,double2,double3,double4,double8或double16作为参数的类型。

因此pow()需要两个float或两个double值或其向量,并返回相同类型的值。由于编译器无法确定是否要调用pow(2.0, 2.0)(双精度)或pow(2.0f, 2.0f)(单精度),因此会出现错误。

请注意,还有类似命名的函数float pown(float x, int y),它为指数采用整数值(例如pown(2.0f, 2)),并且可以提供此案例的优化实现。

答案 1 :(得分:0)

  1. clGetProgramBuildInfo() param_name = CL_PROGRAM_BUILD_LOG说什么?这应该会给你一个更详细的错误信息。用这个更新问题,我也许可以扩展这个答案。
  2. 这是什么版本的OpenCL?请注意,在1.2之前,pow()函数仅针对浮点类型定义;你希望它能用于整数。