私が見つけたNVIDIAフォーラムを検索する これらの質問 、これも私にとって興味深いものですが、ここ4日間ほどで誰も答えていませんでした。手伝ってくれますか?
OpenCLのリーディングチュートリアルを掘り下げると、私には不明瞭な点がいくつか残っていました。ローカルおよびグローバルなワークサイズに関する私の質問のコレクションを以下に示します。
global_work_size
はCL_DEVICE_MAX_WORK_ITEM_SIZES
より小さくなければなりませんか?私のマシンではCL_DEVICE_MAX_WORK_ITEM_SIZES
= 512、512、64。
CL_KERNEL_WORK_GROUP_SIZE
は、使用するカーネルに推奨されるwork_group_size
ですか?
- または、これがGPUで許可される唯一の
work_group_size
ですか?私のマシンではCL_KERNEL_WORK_GROUP_SIZE
= 512ワークグループに分割する必要がありますか、それとも1つだけで、
local_work_size
を指定しないでください。
- ワークグループが1つしかない場合、何に注意する必要がありますか?
CL_DEVICE_MAX_WORK_GROUP_SIZE
はどういう意味ですか?私のマシンではCL_DEVICE_MAX_WORK_GROUP_SIZE
= 512、512、64
- これは、
CL_DEVICE_MAX_WORK_ITEM_SIZES
と同じ大きさのワークグループを1つ持つことができるということですか?
global_work_size
はCL_DEVICE_MAX_WORK_ITEM_SIZES
の約数になっていますか?私のコードではglobal_work_size
= 20。
一般に、global_work_sizeは必要なだけ大きく選択できますが、local_work_sizeは基盤となるデバイス/ハードウェアによる制約があるため、すべてのクエリ結果はglobal_work_sizeではなくlocal_work_sizeの可能なディメンションを示します。 global_work_sizeの唯一の制約は、local_work_sizeの倍数でなければならないことです(各ディメンションに対して)。
ワークグループのサイズはワークグループのサイズを指定するので、CL_DEVICE_MAX_WORK_ITEM_SIZES
が512, 512, 64
の場合、local_work_sizeはxディメンションとyディメンションおよび512
の64
より大きくできません。 z次元の場合。
ただし、カーネルに応じてローカルグループサイズにも制約があります。これはCL_KERNEL_WORK_GROUP_SIZE
で表されます。累積ワークサイズ(すべてのディメンションの積のように、たとえば256
のローカルサイズがある場合は16, 16, 1
)はその数より大きくてはいけません。これは、スレッド間で分割されるハードウェアリソースが限られているためです(クエリ結果から、NVIDIA GPUでプログラミングしていると想定しているため、スレッドが使用するローカルメモリとレジスタの量により、スレッド数が制限されます並行して実行されます)。
CL_DEVICE_MAX_WORK_GROUP_SIZE
は、CL_KERNEL_WORK_GROUP_SIZE
と同じ方法でワークグループの最大サイズを定義しますが、カーネルではなくデバイスに固有です(また、512
として知られるスカラー値でなければなりません)。
Local_work_group_sizeを指定しないことを選択できます。この場合、OpenCL実装はローカルワークグループサイズを選択します(したがって、1つのワークグループのみを使用する保証はありません)。ただし、作業がどのようにワークグループに分割されるかわからないため、一般的にはお勧めできません。さらに、選択したワークグループサイズが最適であるとは限りません。
ただし、通常、1つのワークグループのみを使用することは、パフォーマンスに関しては良い考えではないことに注意する必要があります(パフォーマンスが重要でない場合にOpenCLを使用する理由)。一般に、ワークグループは1つのコンピューティングユニットで実行する必要がありますが、ほとんどのデバイスは複数あります(最新のCPUはコアごとに2つ以上、最新のGPUは20以上を持つことができます)。さらに、複数のワークグループがSMTスタイルの1つのコンピューティングユニットで実行できるため、ワークグループが実行される1つのコンピューティングユニットでさえ完全に使用されない場合があります。 NVIDIA GPUを最適に使用するには、1つのコンピューティングユニットで実行される768/1024/1536スレッド(世代に応じて、G80/GT200/GF100を意味します)が必要です。AMDの数は今のところわかりませんが、同じ規模なので、複数のワークグループを用意することをお勧めします。さらに、GPUの場合、通常は少なくとも64スレッド(およびワークグループごとに32/64(nvidia/AMD)で割り切れるスレッド数)のワークグループを用意することをお勧めします。そうしないと、パフォーマンスが低下します(32/64はgpusでの実行の最小粒度。したがって、ワークグループ内のアイテムが少ない場合、32/64スレッドとして実行されますが、未使用のスレッドからの結果は破棄されます。