为什么不能在OpenCL中使用数学内置函数?我应该使用一些指令来激活吗?
构建返回-11错误。删除pow函数可以很好地编译。我没有使用嵌入式配置文件为什么不能在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
__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)
CL_PROGRAM_BUILD_LOG
表示什么?这将为您提供更详细的错误消息。用这个更新这个问题,我也许可以扩展这个答案pow()
函数仅为浮点类型定义;您希望它能处理整数CL_PROGRAM_BUILD_LOG
表示什么?这将为您提供更详细的错误消息。用这个更新这个问题,我也许可以扩展这个答案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()
,但第一个参数必须是浮点值。