1

这是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: error: expected identifier or '(' } ^"

但是,如果您包含大括号,那么它可以工作。这是工作代码:

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

更新:重写后,现在可以编译内核了。这不是标签。

4

1 回答 1

1

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

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

我知道这是一篇旧帖子,但请对其进行测试,因为在这个问题上,interwebz 周围有多个未答复的论坛帖子。

于 2013-02-01T14:25:36.177 回答