12

OpenCL 標準では、デバイスとコンパイルされたカーネルに関する情報を取得するために、次のオプションが定義されています。

  • CL_DEVICE_MAX_COMPUTE_UNITS

  • CL_DEVICE_MAX_WORK_GROUP_SIZE

  • CL_KERNEL_WORK_GROUP_SIZE

  • CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE

この値が与えられた場合、ワーク グループの最適なサイズとワーク グループの数を計算するにはどうすればよいですか?

4

2 に答える 2

8

これらの値は、アルゴリズムに対して実験的に発見します。プロファイラーを使用して厳密な数値を取得します。

ワークアイテムの同期に頼ることが多いので、CL_DEVICE_MAX_COMPUTE_UNITS をワークグループの数として使用するのが好きです。私は通常、ほとんど分岐しないでカーネルを実行するので、各計算ユニットで実行するのに同じ時間がかかります。

CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE の倍数がデバイスに最適です。その倍数が実際に何であるかは、メモリアクセスパターンと、各作業項目で行っている作業の種類によって異なります。重い計算バウンド (ALU) カーネルを実行している場合は、倍数として 1 を使用します。メモリ アクセスがボトルネックになっている場合は、メモリ レイテンシを隠すために、より大きな倍数を試してください。プロファイラーを使用して、アクセス時間と ALU 時間が最適な時期を判断します。

ALU とフェッチの最適な比率は、どのデバイスでも 1:1 です。これが実際に達成されることはめったにないため、ALU/SIMD バンクを飽和させておく必要があります。これは、可能な限り ALU:fetch を 1 より大きくする必要があることを意味します。1 未満の場合は、より大きな作業グループ サイズを試して、メモリ レイテンシをより適切に隠す必要があることを意味します。

于 2012-04-10T23:50:20.313 に答える