这是opencl内核代码。这不起作用:
__kernel void testKernel(__global const int* srcA,
__global const int* srcB,
__global int* res,
const int num)
{
const int idx = get_global_id(0);
if (idx < num)
res[idx] = srcA[idx] * srcB[idx];
}
以上代码的日志是“:12:2:错误:预期标识符或'(' } ^“
但是,如果你包括大括号,那么它是有效的。这是工作代码:
__kernel void testKernel(__global const int* srcA,
__global const int* srcB,
__global int* res,
const int num)
{
const int idx = get_global_id(0);
if (idx < num)
{
res[idx] = srcA[idx] * srcB[idx];
}
}
我知道opencl内核语言遵循C99,但如果我正确理解C99,只有在if语句下有多行代码时才需要大括号。有谁知道我为什么会收到这些错误?
更新: 重写if语句后,错误不再显示。我无法重现错误。
更新:错误再次出现,但如果我使用空格键而不是制表符缩进if语句下面的一行代码,它会再次消失
更新:重写后,可以立即编译内核。它不是标签。
答案 0 :(得分:1)
如果你正在从文件中读取内核,请确保在存储它的数组的末尾添加一个'\ 0'字符,否则编译器会变得混乱并且看起来以非确定的方式运行
添加括号和空格通常会使内核工作,但它不是问题的根源。
我知道这是一篇旧帖子,但请测试一下,因为在这个问题上有关于interwebz的多个未答复的论坛帖子。