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:エラー:予期された識別子または'('}^」です。

ただし、中かっこを含めると機能します。動作するコードは次のとおりです。

__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行のコードをインデントすると、エラーは再び表示されなくなります

更新:書き直した後、カーネルをコンパイルできるようになりました。タブではありません。

4

1 に答える 1

1

ファイルからカーネルを読み取る場合は、カーネルを格納する配列の最後に必ず '\0' 文字を追加してください。そうしないと、コンパイラが混乱し、非決定論的な方法で動作するように見えます。

括弧とスペースを追加するとカーネルが機能することがよくありますが、それは問題の根本ではありません。

これが古い投稿であることは承知していますが、この問題に関する interwebz に関する未回答のフォーラム投稿が複数あるため、テストしてください。

于 2013-02-01T14:25:36.177 に答える