最大ワークグループサイズとワープサイズの関係は何ですか?私のデバイスに240 CUDAストリーミングプロセッサ(SP)があり、次の情報を返すとしましょう-
CL_DEVICE_MAX_COMPUTE_UNITS:30
CL_DEVICE_MAX_WORK_ITEM_SIZES:512/512/64
CL_DEVICE_MAX_WORK_GROUP_SIZE:512
CL_NV_DEVICE_WARP_SIZE:32
つまり、ストリーミングマルチプロセッサ(つまり、コンピューティングユニット)ごとに8つのSPがあります。さて、ワープサイズ= 32はこれらの数値にどのように関連していますか?
直接回答:ワープサイズは、ワープのスレッド数です。これは、メモリアクセスと命令ディスパッチを結合するためにハードウェア実装で使用される下位区分です。
推奨読書:
@Matiasが述べたように、私は CUDA Cベストプラクティスガイド を読みに行きます(リストされている場所までスクロールする必要があります)。 164ページの付録G.1の表をご覧になると役立つ場合があります。
説明:
CUDAは、2つのレベルで並列処理を提供する言語です。スレッドがあり、スレッドのブロックがあります。これは、カーネルを実行するときに最も顕著です。各スレッドブロックのサイズと、カーネルパラメーターの前の<<< >>>の間にあるスレッドブロックの数を指定する必要があります。
CUDAが伝えていないのは、実際には2つではなく4つのレベルで起こっていることです。バックグラウンドでは、スレッドのブロックは実際には「ワープ」と呼ばれるサブブロックに分割されます。実際に何が起こっているのかを説明するのに役立つ簡単なメタファーを次に示します。
簡潔な比phor:
あなたは高校生の現在の数学的能力に興味がある教育者/研究者/政治家のふりをします。あなたの計画は、10,240人の生徒にテストを行うことですが、すべてをサッカースタジアムなどに入れてテストすることはできません。データコレクションを再分割(並列化)するのが最も簡単です。したがって、20の異なる高校に行き、512人の先輩に数学のテストを受けてもらいます。
あなたはあなたのデータを収集し、それはあなたが気にするすべてです。あなたが知らなかった(そして本当に気にしなかった)ことは、各学校が実際に教室に細分化されているということです。したがって、512人のシニアは実際には32の16のグループに分かれています。さらに、これらの学校には実際に必要なリソースがありません。各教室には16の計算機しかありません。したがって、一度に各クラスの半分だけが数学のテストを受けることができます。
彼らは8人の教師しかいないので、一度にテストを受けることができるのは1つの学校の8つの教室だけであるという愚かなルールを引き延ばすことができます。監督者が30人しかないため、同時に30以上の学校をサンプリングすることはできません...
質問に戻る:
比phorを使用して、プログラムはできるだけ早く結果を計算したい(数学テストを収集したい)。特定の数のブロック(学校)でカーネルを発行し、各ブロックには特定の数のスレッド(生徒)があります。一度に実行できるブロックの数は非常に多くなります(アンケートの回答を収集するには、学校ごとに1人の監督者が必要です)。 CUDAでは、スレッドブロックはストリーミングマルチプロセッサ(SM)で実行されます。変数:CL_DEVICE_MAX_COMPUTE_UNITS
は、特定のカードにあるSMの数を示します。これはハードウェアによって大きく異なります- CUDA C Best Practices Guide の付録Aの表をご覧ください。各SMは、計算機能(1.Xまたは2.X)に関係なく、同時に8ブロックしか実行できないことに注意してください。
スレッドブロックの最大サイズは次のとおりです:CL_DEVICE_MAX_WORK_ITEM_SIZES
。スレッドをグリッドに配置することを考えてください。 512スレッドを超える行を持つことはできません。 512スレッドを超える列を作成することはできません。そして、64スレッドよりも多くスタックすることはできません。次に、最大値があります:CL_DEVICE_MAX_WORK_GROUP_SIZE
スレッドの数、512。ブロック内でグループ化できます。したがって、スレッドブロックの寸法は次のようになります。
512 x 1 x 1
1 x 512 x 1
4 x 2 x 64
64 x 8 x 1
等...
Compute Capability 2.Xの時点で、ブロックには最大1024のスレッドを含めることができます。最後に、変数CL_NV_DEVICE_WARP_SIZE
は、ワープサイズを指定します。2(教室あたりの生徒数)。 Compute Capability 1.Xデバイスでは、メモリ転送と命令ディスパッチがHalf-Warp粒度で行われます(教室ごとに計算機は16個しかありません)。 Compute Capability 2.0では、メモリ転送はWarpでグループ化されるため、32のフェッチが同時に行われますが、命令ディスパッチはHalf-Warpでのみグループ化されます。 Compute Capability 2.1では、メモリ転送と命令ディスパッチの両方がWarp、32スレッドによって発生します。 これらのことは将来のハードウェアで変わる可能性があります。
だから、私の言葉!ポイントに行きましょう:
概要:
ワープ/スレッドレイアウトの微妙な違いなどを説明しましたが、ここで注意すべき点がいくつかあります。まず、メモリアクセスは16または32のセットで「グループ化可能」にする必要があります。したがって、ブロックのX次元を32の倍数にしてください。2番目に、および最も重要な 、占有率を最大化する必要があります。 512スレッドの5ブロックはありません。そして、10スレッドの1,000ブロックはありません。 stronglyExcelベースのスプレッドシート ( OpenOffice でも動作しますか??と思いますか?) GPU占有率は、特定のカーネルコール用です(スレッドレイアウトand共有メモリ要件)。この説明がお役に立てば幸いです!
ワープサイズは、マルチプロセッサが同時に実行するスレッドの数です。 NVIDIAマルチプロセッサは、ハードウェアマルチスレッドを使用して、同じブロックから複数のスレッドを同時に実行できます。
すべてのメモリアクセスはワープサイズの倍数(32バイト、64バイト、128バイト)に合体され、パフォーマンスが向上するため、ワープサイズを考慮することが重要です。
CUDA Cベストプラクティスガイド には、この種の最適化に関するすべての技術情報が含まれています。
直接的な答えは簡単です:Nvidiaでは、THREADで構成されるブロックはプログラマーによって設定され、WARPは32(32スレッドで構成される)であり、これは計算ユニットによって同時に実行される最小単位です。 AMDでは、WARPはWAVEFRONT(「ウェーブ」)と呼ばれます。
OpenCLでは、WORKGROUPはCUDAのブロックを意味し、さらにWORKITEMはCUDAのスレッドを意味します。