2

GPU プログラミングについて調べていて、CUDA についてもっと知りたいと思っています。私はすでにそれについて多くのことを読んできました (ウィキペディア、Nvidia、およびその他の参考文献から) が、まだいくつか質問があります。

  1. 次のアーキテクチャの説明は正確ですか?: GPU にはマルチプロセッサがあり、すべてのマルチプロセッサにはストリーミング プロセッサがあり、すべてのストリーミング プロセッサはスレッドのブロックを同時に実行できます。

  2. すべての参照は、1 つのブロック内に作成するスレッドの最小数が 32 であると述べています...なぜですか?

  3. ATI Radeon ビデオ カードを使用しています。エミュレーションモードなしで簡単なCUDAプログラムをコンパイルできました!!. サポートされているNvidia VGAでのみCUDAプログラムをコンパイルして実行できると思いました。誰か説明してくれませんか?

4

3 に答える 3

6

1 - これは NVIDIA gpu に当てはまります。

2 - これはハードウェア設計の制約です。

3 - コンパイルは CPU で行われるため、x86 で PPC をクロスコンパイルするのと同じようにプログラムをコンパイルできます。

ATI カードで GPU プログラムを実行したい場合は、OpenCL または AMD Stream を検討することをお勧めします。

于 2009-12-30T16:43:19.723 に答える
6

CUDA スレッドは非常に軽量であり、ほとんどペナルティなしでスケジュール/停止できます。これは、実行の切り替えに多くのオーバーヘッドがある CPU スレッドとは異なります。その結果、CPU はタスクの並列処理に優れており、GPU はデータの並列処理に優れています。

  1. CUDA アーキテクチャでは、(NVIDIA) GPU に「ストリーミング マルチプロセッサ」(SM) があり、それぞれがスレッドのブロックを実行します。各 SM には一連のストリーム プロセッサ (SP) があり、それぞれが任意の時点 (サイクル) で 1 つのスレッドの命令を実行します。

  2. 実際には、ブロック内のスレッドの最小数は 1 です。ブロックごとに 1 つのスレッドしかない場合、コードは正しく実行されます。ただし、32 の倍数のスレッドを持つようにブロックを設定する方がはるかに効率的です。これは、ハードウェアが 32 スレッドである「ワープ」全体で操作をスケジュールする方法によるものです。

  3. プログラムをクロスコンパイルできます。エミュレーション モードで実行することもできます。つまり、CPU は CUDA GPU を「エミュレート」しますが、ハードウェアで実行するには NVIDIA GPU が必要です (CUDA が有効になっているもの、2006 年以降のものであれば何でも構いません)。

ハイエンドの現行世代の GPU には 240 個のコア (SP) があり、これを任意の時点で 240 個のスレッドを実行していると考えることができますが、複数のスレッドの状態 (コンテキスト) から、GPU を数千のスレッドを同時に実行していると考えると便利です。ロードされます。

CPU スレッドと GPU スレッドには違いがあることを認識することが重要だと思います。それらは同じ名前を持っていますが、GPU スレッドは軽量であり、通常はデータの小さなサブセットで動作します。CPU スレッド (のセット) が非並列処理を実行し、各 CPU スレッドがデータの並列処理のために数千の GPU スレッドに分岐し、CPU スレッドに再び参加することを考えると役立つかもしれません。明らかに、CPU スレッドを GPU と同時に動作させることができれば、それはさらに優れたものになります。

CPU とは異なり、GPU はスループット アーキテクチャであることを覚えておいてください。つまり、遅延を隠すためのキャッシュの代わりに、プログラムは多くのスレッドを作成して、一部のスレッドがメモリからデータが返されるのを待っている間、他のスレッドを実行できるようにする必要があります。詳細については、 GPU Technology Conferenceの「Advanced C for CUDA」の講演を視聴することをお勧めします。

于 2009-12-30T19:24:51.327 に答える
2
  1. はい。すべての GPU は、ベクトル プロセッサまたはSIMD (Single-Instruction Multiple Data) プロセッサの配列です。スレッドの 1 つのベクトル (GPU に応じて 32、64、またはその他の数) 内で、各スレッドはロック ステップでカーネルの同じ命令を実行します。この基本単位は、「ワープ」または「波面」または「SIMD」と呼ばれることもあります。

    NVidia チップでは 32、ATI では 64 が一般的なようです。IIRC、Itel の Larrabee チップの数は、そのチップが製造された場合、さらに高くなるはずです。

  2. ハードウェア レベルでは、スレッドはこれらの単位で実行されますが、プログラミング モデルでは任意の数のスレッドを使用できます。ハードウェアが 32 幅のウェーブフロントを実装していて、プログラムが 1 つのスレッドしか要求しない場合、そのハードウェア ユニットの 31/32 はアイドル状態になります。したがって、32 の倍数 (または何でも) でスレッドを作成するのが最も効率的な方法です (すべてのスレッドが有用な作業を行うようにプログラムできると仮定します)。

    ハードウェアで実際に起こることは、スレッドごとに少なくとも 1 つのビットがあるということです。スレッドが「生きている」かどうかを示します。32 のウェーブフロントの余分な未使用のスレッドは、実際には計算を実行しますが、結果をメモリの場所に書き込むことはできないため、実行されなかったかのようになります。

    GPU がゲームのグラフィックスをレンダリングしている場合、各スレッドは単一のピクセル (またはアンチエイリアシングがオンになっている場合はサブピクセル) を計算し、レンダリングされる各三角形は任意の数のピクセルを持つことができますよね? GPU が正確に 32 ピクセルの倍数を含む三角形しかレンダリングできない場合、うまく機能しません。

  3. ゴーガーの答えはそれをすべて言います。

  4. 特に質問はしていませんが、GPU カーネルが分岐を避けることも非常に重要です。Wavefront 内の 32 のスレッドすべてが同じ命令を同時に実行する必要があるためif .. then .. else、コードに and があるとどうなるでしょうか? ワープ内の一部のスレッドが「then」部分を実行したい場合と、一部のスレッドが「else」部分を実行したい場合は? 答えは、32 スレッドすべてが両方の部分を実行するということです! これには明らかに 2 倍の時間がかかるため、カーネルは半分の速度で実行されます。

于 2009-12-30T20:20:48.230 に答える