为什么不能在OpenCL中使用数学内置函数?我应该使用一些指令来激活吗?

为什么不能在OpenCL中使用数学内置函数?我应该使用一些指令来激活吗?,opencl,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

构建返回-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_设备名称:AMD Radeon HD-FirePro D300计算引擎
CL_驱动程序版本:1.2(2017年1月10日22:25:08)

  • param_name=
    CL_PROGRAM_BUILD_LOG
    表示什么?这将为您提供更详细的错误消息。用这个更新这个问题,我也许可以扩展这个答案
  • 这是什么版本的OpenCL?请注意,在1.2之前,
    pow()
    函数仅为浮点类型定义;您希望它能处理整数
  • param_name=
    CL_PROGRAM_BUILD_LOG
    表示什么?这将为您提供更详细的错误消息。用这个更新这个问题,我也许可以扩展这个答案
  • 这是什么版本的OpenCL?请注意,在1.2之前,
    pow()
    函数仅为浮点类型定义;您希望它能处理整数
  • 如果查看,您会注意到它被定义为
    gentypepow(gentypex,gentypey)
    。该文件还指出

    泛型类型名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)
    ),并可能提供这种情况的优化实现。

    如果查看,您会注意到它被定义为
    gentypepow(gentypex,gentypey)
    。该文件还指出

    泛型类型名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)
    ),可以提供这种情况的优化实现。

    问题在于整数。我改成2.0,它就开始工作了。不能与整数一起使用?@Eduardo如果您的buildinfo字符串为空,请检查所需的长度并动态分配缓冲区。2048字节缓冲区可能不够大。pow有不同的版本,如果指数是整数,则可以使用
    pown()
    ,但第一个参数必须是浮点值。问题是整数。我改成2.0,它就开始工作了。不能与整数一起使用?@Eduardo如果您的buildinfo字符串为空,请检查所需的长度并动态分配缓冲区。2048字节的缓冲区可能不够大。pow有不同的版本,如果指数是整数,则可以使用
    pown()
    ,但第一个参数必须是浮点值。