2

私はこのような解決策を見てきました:

kernel dp_square (const float *a,
float *result)
{
int id = get_global_id(0);
result[id] = a[id] * a[id];
}

kernel dp_square (const float *a,
float *result, const unsigned int count)
{
int id = get_global_id(0);
if(id < count)
    result[id] = a[id] * a[id];
}

id <countのチェックは重要ですか?カーネル作業項目が使用できない項目を処理しようとするとどうなりますか?最初の例にない理由は、プログラマーがグローバルサイズが処理される要素の数と等しいことを確認するだけであるということでしょうか(これは正常です)。

4

1 に答える 1

4

これは多くの場合、2つの理由で行われます-

  1. 開発者エラーがコードを強制終了したり、不良メモリを読み取ったりしないようにするため

  2. データポイントよりも多くの作業項目を実行することが最適な場合があるためです。たとえば、デバイスの最適なワークグループサイズが32(珍しいことではありません)で、61個のデータの配列がある場合、64個のワークアイテムを実行し、最後の3つは単に「完全に再生されます。 「」

このチェックを含めないようにするには、ワークアイテムの総数を分割するワークグループサイズを使用する必要があります。この場合、ワークグループのサイズは1になり(61が素数であるため)、非常に遅くなります。

于 2012-06-21T14:29:20.280 に答える