私はGPUなどのOpenCLデバイスのアーキテクチャを理解しようとしていますが、ローカルワークグループ内の作業項目の数、つまり定数CL_DEVICE_MAX_WORK_GROUP_SIZEに明示的な境界がある理由がわかりません。CL_DEVICE_MAX_WORK_GROUP_SIZEはなぜですか?
これはコンパイラによって処理されるべきであると思われます。つまり、物理的な最大値が100でありながらカーネルがローカルワークグループサイズ500で実行され、カーネルが
__kernel void test(float* input) {
i = get_global_id(0);
someCode(i);
barrier();
moreCode(i);
barrier();
finalCode(i);
}
それは、このカーネル上のワークグループサイズ100で実行に自動的に変換することができます:このよう
__kernel void test(float* input) {
i = get_global_id(0);
someCode(5*i);
someCode(5*i+1);
someCode(5*i+2);
someCode(5*i+3);
someCode(5*i+4);
barrier();
moreCode(5*i);
moreCode(5*i+1);
moreCode(5*i+2);
moreCode(5*i+3);
moreCode(5*i+4);
barrier();
finalCode(5*i);
finalCode(5*i+1);
finalCode(5*i+2);
finalCode(5*i+3);
finalCode(5*i+4);
}
しかし、これはデフォルトで実行されていないようです。何故なの?このプロセスを自動化する方法はありますか(それのためにプリコンパイラを書くこと以外にも)?それとも、私のメソッドが特定の例で失敗するようにする本質的な問題がありますか?
これは5つの関数呼び出しを連続して実行しますか?だから、ある種の秋に戻ってくるだけだろう。また、作業ディメンションを5の倍数にする必要があります。ただバイナリカーネルの場合は – rdoubleui