OpenCL 内核定义错误 clBuildProgram(CL_BUILD_PROGRAM_FAILURE)?
Posted
技术标签:
【中文标题】OpenCL 内核定义错误 clBuildProgram(CL_BUILD_PROGRAM_FAILURE)?【英文标题】:OpenCL kernel definition error clBuildProgram(CL_BUILD_PROGRAM_FAILURE)? 【发布时间】:2020-02-04 18:21:04 【问题描述】:运行一个 openCl 应用程序它给了我这个错误:
ERROR: clBuildProgram(CL_BUILD_PROGRAM_FAILURE)
这是内核定义, 一个错误是在 log2 函数中,
另一个错误在char* bits = &(char_array[64*(n/m)*(index-1)+it*64]);
另一个错误在max[it] = *count
最后一个错误在if(max[i] > *result)*result = max[i];
。
你能告诉我如何更正定义吗?谢谢
__kernel void vadd(
__global char* char_array,
int m,
int n,
__global long* result)
int index = get_global_id(0);
int max_n = n/m;
if(index == m-1)
max_n = n - (n/m)*(m-1);
int max[ max_n ];
int offset = log2(m);
for (int it=0; it < max_n; it++)
char* bits = &(char_array[64*(n/m)*(index-1)+it*64]);
int count=0;
for(int i=offset; i<=64; i++)
if(bits[i]=='0')
count++;
elsebreak;
max[it] = count;
*result = 0;
for(int i=0; i<max_n;i++)
if(max[i] > *result)*result = max[i];
*result = *result +1;
【问题讨论】:
您能简单地引用整个构建日志吗?错误消息将为我们节省大量时间来尝试找出不正确的地方。 catch (cl::Error err) std::cout 可以通过CL_PROGRAM_BUILD_LOG
和clGetProgramBuildInfo查询得到详细的编译日志。
【参考方案1】:
这一行有一个错误:
char* bits = &(char_array[64*(n/m)*(index-1)+it*64]);
是char* bits
在声明局部变量时实际上意味着__private char*
,而char_array
被定义为__global char*
。您需要确保 bits
使用相同的类型。
其他的对我来说不是很明显,但我建议您将完整的内核构建输出添加到您的问题中,因为这将有助于缩小范围。
【讨论】:
以上是关于OpenCL 内核定义错误 clBuildProgram(CL_BUILD_PROGRAM_FAILURE)?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 OpenCL 内核在 nVidia 驱动程序上失败,而不是 Intel(可能的驱动程序错误)?
OpenCL 在内存和性能方面,在内核代码中使用用户定义函数的效率如何