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];
}
}
}
理由ということである理由だから、誰かが私に説明することができますか?
は幅が最大サイズを超える場合、プライベートメモリは罰金になりますあなたの
最初のループの2番目のステートメントと2番目のループのステートメントは、基本的に同じことを行います。なぜ?。コンパイラがここで果たすべき役割を持っていると思っています。どのカードを使用していますか? NVIDIAまたはAMD?あなたはPTX(NVIDIAの場合)を見て、それが同じコードを表すかどうかを調べることができます – nouveau
カーネルをコンパイルしようとすると、次のようになります: 'openCLは可変長配列をサポートしていません int copy [width];' – rdoubleui
可変長配列は仕様に従ってサポートされていません。 1.2仕様では、これを第6.9節dで見つけることができます。 – James