20

わかりました。関連する質問が何度も繰り返されていることを知っています。これについて見つけたほとんどすべてを読みましたが、状況はまだ不明です。おそらく、私が互いに矛盾するものを見つけて読んだためです(おそらく、異なる時代からのものであり、それらは異なる計算能力を持つデバイスを参照しており、その間にかなりのギャップがあるようです)。実行時間を短縮するために、より効率的になることを目指しています。したがって、同時に実行できるスレッド/ワープ/ブロックの数を正確に知る必要があります。また、これを一般化し、カーネルに渡す最適なスレッドとブロックの数を、(より単純なプログラムの場合)実行する必要があることがわかっている操作の数とシステム仕様のみに基づいて計算することを考えていました。

私はGTX550Tiを持っていますが、コンピューティング機能2.1を備えています。4 SMx48コア=192CUDAコア。

わかりました。私にはわかりませんが、次のとおりです。

マルチプロセッサ(SM)で複数のブロックを一度に(並列に)実行できますか?SMには最大8つのブロックを割り当てることができると読みましたが、それらがどのように実行されるかについては何もありません。SMあたりの最大スレッド数(1536)が、ブロックあたりの最大スレッド数(1024)よりもわずかに多いという事実から、ブロックは並列に実行されていないと思います(おそらく1.5?)。または、少なくともスレッドの最大数がある場合はそうではありません。また、ブロック数を4(私のSMの数)に設定した場合、それらはそれぞれ異なるSMに送信されますか?または、これらすべてがハードウェア上でどのように分散されるかを実際に制御することはできません。これは重要なポイントです。実行時間は、デバイスの気まぐれによって異なります...

次に、ブロックがそのスレッドを、ワープと呼ばれる、並列に実行される32のスレッドのグループに分割することを知っています。これで、これらのワープ(互いに関係がないと仮定)も並行して実行できますか?Fermiアーキテクチャでは、2つのワープが同時に実行され、各ワープから16(?)コアのグループに1つの命令が送信されると記載されているため、他の場所では、各コアがワープを処理することを読みました。これは、1536の最大スレッドを説明します( 32 * 48)しかし、少し多いようです。1つのCUDAコアで32のスレッドを同時に処理できますか?

簡単に言うと、私が求めているのは次のとおりです。(たとえば)2つのベクトルを3つ目のベクトルで合計する場合、それらにどのくらいの長さ(操作の数)を与える必要があり、どのようにブロックとスレッドに分割する必要がありますか?私のデバイスは、(アイドル状態のコアやSMがなくても)フルキャパシティーで同時に(並行して)動作します。

これが以前に尋ねられて、私がそれを受け取らなかったか、それを見なかったならば、すみません。あなたが私を助けてくれることを願っています。ありがとうございました!

4

3 に答える 3

18

作業の分散と並列実行は、起動構成とデバイスによって決まります。起動構成では、グリッドディメンション、ブロックディメンション、スレッドごとのレジスタ、およびブロックごとの共有メモリが示されます。この情報とデバイスに基づいて、デバイスで同時に実行できるブロックとワープの数を決定できます。カーネルを開発するときは、通常、デバイスのSMごとのワープの最大数に対するSMでアクティブにできるワープの比率を確認します。これは理論上の占有率と呼ばれます。CUDA Occupancy Calculatorを使用して、さまざまな起動構成を調査できます。

グリッドが起動されると、コンピューティング作業ディストリビューターはグリッドをラスタライズし、スレッドブロックをSMに配布し、SMリソースがスレッドブロックに割り当てられます。SMに十分なリソースがある場合、複数のスレッドブロックをSMで同時に実行できます。

ワープを起動するために、SMはワープをワープスケジューラに割り当て、ワープにレジスタを割り当てます。この時点で、ワープはアクティブなワープと見なされます。

各ワープスケジューラは、一連のワープを管理します(Fermiでは24、Keplerでは16)。ストールしていないワープは、適格ワープと呼ばれます。各サイクルで、ワープスケジューラは適格なワープを選択し、int / fpユニット、倍精度浮動小数点ユニット、特殊機能ユニット、分岐解決ユニット、ロードストアユニットなどの実行ユニットにワープの命令を発行します。実行ユニットはパイプライン化されており、多くのワープが各サイクルで1つ以上の命令を実行できるようになっています。ワープは、命令フェッチ、データ依存関係、実行依存関係、バリアなどで停止する可能性があります。

各カーネルには、異なる最適な起動構成があります。Nsight VisualStudioEditionやNVIDIAVisualProfilerなどのツールは、起動構成の調整に役立ちます。複数の起動構成を試すことができるように、柔軟な方法でコードを記述してみることをお勧めします。まず、少なくとも50%の占有率が得られる構成を使用してから、占有率を増減してみます。

各質問への回答

Q:マルチプロセッサ(SM)で複数のブロックを一度に(並列に)実行できますか?

はい、最大数はデバイスの計算能力に基づいています。表10を参照してください。計算機能ごとの技術仕様:値を決定するためのマルチプロセッサごとの常駐ブロックの最大数。一般に、起動構成は実行時の値を制限します。詳細については、占有計算機またはNVIDIA分析ツールの1つを参照してください。

Q:SMあたりの最大スレッド数(1536)が、ブロックあたりの最大スレッド数(1024)よりもわずかに多いという事実から、ブロックは並列に実行されていないと思います(おそらく1.5?)。

起動構成によって、SMごとのブロック数が決まります。SMあたりの最大スレッド数に対するブロックあたりの最大スレッド数の比率は、開発者がパーティションの動作をより柔軟に行えるように設定されています。

Q:ブロック数を4(たとえばSMの数)に設定した場合、それらはそれぞれ異なるSMに送信されますか?または、これらすべてがハードウェア上でどのように分散されるかを実際に制御することはできません。これは重要なポイントです。実行時間は、デバイスの気まぐれによって異なります...

作業配分の制御は制限されています。より多くの共有メモリを割り当てることで占有を制限することでこれを人為的に制御できますが、これは高度な最適化です。

Q:次に、ブロックがそのスレッドを、ワープと呼ばれる、並行して実行される32のスレッドのグループに分割することを知っています。これで、これらのワープ(互いに関係がないと仮定)も並行して実行できますか?

はい、ワープは並行して実行できます。

Q:Fermiアーキテクチャでは、2つのワープが同時に実行されると記載されているためです

各FermiSMには、2つのワープスケジューラがあります。各ワープスケジューラは、各サイクルで1ワープの命令をディスパッチできます。命令の実行はパイプライン化されているため、多くのワープはサイクルごとに1つ以上の命令を実行できます。

Q:各ワープから16(?)コアのグループに1つの命令を送信しますが、他の場所で、各コアがワープを処理することを読みました。これは、1536の最大スレッド(32x48)を説明しますが、少し多いようです。1つのCUDAコアで32のスレッドを同時に処理できますか?

はい。CUDAコアは、整数および浮動小数点の実行ユニットの数です。SMには、上記でリストした他のタイプの実行ユニットがあります。GTX550はCC2.1デバイスです。各サイクルで、SMはサイクルごとに最大4つの命令(128スレッド)をディスパッチする可能性があります。実行の定義に応じて、サイクルごとの飛行中のスレッドの総数は、数百から数千の範囲になります。

于 2013-03-23T19:42:02.043 に答える
1

実行時間を短縮するために、より効率的になることを目指しています。したがって、同時に実行できるスレッド/ワープ/ブロックの数を正確に知る必要があります。

つまり、同時に実行できるスレッド/ワープ/ブロックの数は、いくつかの要因によって異なります。CUDA Cベストプラクティスガイドには、実行構成の最適化に関する記事があり、これらの要因を説明し、アプリケーションの形成方法について推論するためのヒントを提供しています。

于 2013-03-23T18:21:39.887 に答える
-2

私にとって、沈むのに苦労した概念の1つは、CUDAチップでのコンテキストスイッチングのハードウェアサポートの効率です。

その結果、コンテキストスイッチがすべてのメモリアクセスで発生し、他のコンテキストがメモリアクセスを待機している間、多くのコンテキストに対して計算を交互に進めることができます。GPGPUアーキテクチャがパフォーマンスを実現する方法の1つは、マルチコアでの並列化に加えて、この方法で並列化する機能です。

最高のパフォーマンスは、コアがメモリアクセスを待機していないときに達成され、これを確実に実行するのに十分なコンテキストを持つことによって達成されます。

于 2013-03-20T15:10:29.867 に答える