构建返回-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)
答案 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)
CL_PROGRAM_BUILD_LOG
说什么?这应该会给你一个更详细的错误信息。用这个更新问题,我也许可以扩展这个答案。pow()
函数仅针对浮点类型定义;你希望它能用于整数。