OpenCL内核语言:使用不带花括号的if语句时可能出现的错误

时间:2012-04-24 01:25:45

标签: opencl

这是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语句下面的一行代码,它会再次消失

更新:重写后,可以立即编译内核。它不是标签。

1 个答案:

答案 0 :(得分:1)

如果你正在从文件中读取内核,请确保在存储它的数组的末尾添加一个'\ 0'字符,否则编译器会变得混乱并且看起来以非确定的方式运行

添加括号和空格通常会使内核工作,但它不是问题的根源。

我知道这是一篇旧帖子,但请测试一下,因为在这个问题上有关于interwebz的多个未答复的论坛帖子。