2012-04-24 5 views
1

ここにopenclカーネルコードがあります。これは動作しません:OpenCLカーネル言語:if文を中括弧なしで使用すると、バグが発生する可能性があります。

__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

openclカーネルはCに基づいていますが、Cのサブセットであり、Cのすべての側面が動作することは保証されていません。私はそれが動作することを期待しています... –

+2

あなたが見ているコードは、実際にはOpenCLに適切にフィードされていることを確認していますか?私は一度clCreateProgramWithSourceに正しいパラメータを渡さないことによって引き起こされたあなたのものに似たバグがありました。 – vocaro

答えて

1

ファイルからカーネルを読み込んでいる場合は、格納している配列の最後に '\ 0'文字を追加してください。そうしないと、コンパイラが混乱し、非決定論的ファッション。

大括弧とスペースを追加すると、カーネルが動作することがよくありますが、問題の根源ではありません。

私はこれが古い投稿であることは知っていますが、この問題に関するウェブサイトの周りには未回答の複数のフォーラム投稿があるので、テストしてください。

関連する問題