2012-02-12 10 views
1

プログラムでエラーを修正しようとしていて、それを実際に小さな領域に特定しました。OpenCLプライベートメモリからグローバルにコピーするときに無効なコマンドキューエラー

デバイスのプライベートメモリからグローバルメモリにデータをコピーしようとすると、コマンドキューが無効になり、clFinish()がエラーを返します。

は、簡単な例を考えてみましょう:

kernel void example(global int *data, const int width) { 
    int id = get_global_id(0); 

    if (id == 0) { 
     int copy[width]; // private memory? 
     for (int i = 0; i < width; i++) { 
      copy[i] = data[i]; // works 
      data[i] = copy[i]; // works 
     } 

     // whenever this loop is here 
     // i get invalid command queue from clFinish 
     for (int i = 0; i < width; i++) { 
      data[i] = copy[i]; 
     } 
    } 
} 

理由ということである理由だから、誰かが私に説明することができますか?

は幅が最大サイズを超える場合、プライベートメモリは罰金になりますあなたの

+0

最初のループの2番目のステートメントと2番目のループのステートメントは、基本的に同じことを行います。なぜ?。コンパイラがここで果たすべき役割を持っていると思っています。どのカードを使用していますか? NVIDIAまたはAMD?あなたはPTX(NVIDIAの場合)を見て、それが同じコードを表すかどうかを調べることができます – nouveau

+0

カーネルをコンパイルしようとすると、次のようになります: 'openCLは可変長配列をサポートしていません int copy [width];' – rdoubleui

+3

可変長配列は仕様に従ってサポートされていません。 1.2仕様では、これを第6.9節dで見つけることができます。 – James

答えて

3

ありがとうございます。例えば、の幅= 8/16でカーネルを実行し、その結果を見ることをお勧めします。幅に大きな値を渡していた場合。すべてのデータをプライベートメモリに保持することは不可能かもしれません。それらはレジスタであり、サイズは非常に限られています。

関連する問題