2011-07-01 16 views
7

私が引き受ける予定のプロジェクトについて助言が必要です。 CUDA 4.0を使用しているマルチGPUノードでは、単純なカーネルを実行する予定です(まだ決定していませんが、恥ずかしそうに並行しているカーネルで実行しています)。 CUDAがマルチGPU環境で提供するさまざまな戦略でカーネルを起動することによって、ノードのプロファイルを作成することを目的としています。CUDAを使用したマルチGPUプログラミング戦略

  1. 単一のホスト・スレッド - 複数のデバイス(共有コンテキスト)
  2. 単一のホスト・スレッド - 複数のデバイス(独立したコンテキスト(イコール) - 単一のデバイス(共有コンテキスト)
  3. 複数のホスト・スレッド上のカーネルの同時実行)
  4. シングルホストスレッド - 1つのデバイス上でシーケンシャルカーネル実行
  5. 複数のホストスレッド - 1つのデバイス上のカーネルの同時実行(独立したコンテキスト)
  6. 複数のホストのスレッド - 1つのデバイス上のカーネルの順次実行(独立したコンテキスト)

私はどのカテゴリも欠けていますか?私が選んだテストカテゴリとマルチGPUプログラミングに関する一般的なアドバイスについてのあなたの意見は歓迎します。

おかげで、
サヤン

EDIT:

は、私はそれを修正、以前の分類は、いくつかの冗長性を関与することを考えました。

+2

このアプローチではできるだけデータを共有していないため、並列性を最大限に高めることができるため、「複数のホストスレッド - (Equal)複数のデバイス、独立したコンテキスト」を使用します。しかし、私はGPGPUをしませんので、それは単なる一般的な観察です。 –

答えて

2

ほとんどの作業負荷はCPU作業で十分軽く、1つのスレッドから複数のGPUを混ぜることができますが、これはCUDA 4.0から容易に始めることができました。 CUDA 4.0の前に、cuCtxPopCurrent()/ cuCtxPushCurrent()を呼び出して、特定のスレッドに現在のコンテキストを変更します。しかし、CUDA 4.0からは、cudaSetDevice()を呼び出して、現在のコンテキストを特定のデバイスに対応するように設定できます。

GPUのコンテキストは依然として分離されており、デバイスメモリやCUDAストリームやCUDAイベントなどのオブジェクトは、「共有コンテキスト」が存在しないGPUコンテキストと関連しているため、オプション1)は誤った名前です。作成されました。

+0

SLIの設定では(1) – osgx

+1

SLIは、別々に列挙するようにGPUをセットアップしたと仮定した場合、マルチGPUの特別なケースです。デフォルトでは、SLIは複数のGPUを単一のより高速なGPUのように見せます。 CUDAは、システムがそのように構成されている場合にのみ、GPUの1つを使用することができます。 – ArchaeaSoftware

1

複数のホストスレッド - 複数のデバイスに等しい、独立したコンテキストがあれば、それを乗り越えることができます。これは、本当に独立した作業単位を得ることができると仮定しています。あなたの問題は恥ずかしそうに並行しているので、これは真実です。

警告:私は個人的に大規模なマルチGPUシステムを構築していません。私は、CPUに比べて3オーダーの加速度で成功した単一のGPUシステムを構築しました。したがって、アドバイスは、私が見た同期コストの一般化と、マルチGPUシステムを構築した同僚との議論です。

+0

マルチGPUシステムは、2 CPUと4 GPUのAppro 1Uです。私は上記のすべてのカテゴリをテストし、それらをプロファイルしたいと思います...はい、これまでのところ、このカテゴリでより良い結果が見られました。そして、そのような問題はGPUには理想的です。「複数のホストスレッド - 1つのデバイスに依存しないコンテキストでのカーネルの同時実行」が、特定の問題サイズで消費される電力に役立つかもしれないという気持ちがあります。 – Sayan

関連する問題