問題タブ [multi-gpu]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - CUDA:マルチGPUではGPU1へのメモリコピーが遅くなります
私の会社には2つのGTX295がセットアップされているため、サーバーには合計4つのGPUがあり、複数のサーバーがあります。GPU 1は、GPU 0、2、3と比較して特に遅いので、問題の原因を見つけるのに役立つ小さな速度テストを作成しました。
結果は
GPU0cudaMallocは0.908640ミリ秒かかりましたGPUへのコピーは296.058777ミリ秒かかりましたテストカーネルは326.721283ミリ秒かかりました
GPU1cudaMallocは0.913568ミリ秒かかりましたGPUへのコピーは663.182251ミリ秒かかりました テストカーネルは326.710785ミリ秒かかりました
GPU2cudaMallocは0.925600ミリ秒かかりましたGPUへのコピーは296.915039ミリ秒かかりましたテストカーネルは327.127930ミリ秒かかりました
GPU3cudaMallocは0.920416ミリ秒かかりましたGPUへのコピーは296.968384ミリ秒かかりましたテストカーネルは327.038696ミリ秒かかりました
ご覧のとおり、GPUへのcudaMemcpyは、GPU1の2倍の時間です。これはすべてのサーバー間で一貫しており、低速なのは常にGPU1です。なぜこれが起こるのか、何か考えはありますか?すべてのサーバーはWindowsXPを実行しています。
objective-c - Core Foundation /IOキットの新しいマルチGPUAppleラップトップでCGDirectDisplayIDの変更の問題を解決するにはどうすればよいですか?
Mac OS Xでは、すべてのディスプレイに一意のCGDirectDisplayID
番号が割り当てられます。)を使用するCGGetActiveDisplayList(
か[NSScreen screens]
、それらにアクセスすることができます。Appleのドキュメントによると:
表示IDは、プロセス間およびシステムの再起動後も保持でき、特定の表示パラメーターが変更されない限り、通常は一定のままです。
新しい2010年半ばのMacBookProでは、Appleは自動切り替えのIntel/nVidiaグラフィックスの使用を開始しました。ラップトップには、2つのGPU、低電力のIntelと高電力のnVidiaがあります。以前のデュアルGPUラップトップ(2009モデル)には自動GPU切り替えがなく、GPU切り替えを行うには、ユーザーが設定を変更し、ログオフしてから再度ログオンする必要がありました。古いシステムでもGPUは1つしかありませんでした。
2010年半ばのモデルには、ディスプレイが1つのGPUから次のGPUに切り替わるときにCGDirectDisplayIDが同じままにならないという問題があります。例えば:
- ノートパソコンの電源がオンになります。
- 内蔵LCDスクリーンはIntelチップセットによって駆動されます。ディスプレイID: 30002
- 外部ディスプレイが接続されています。
- 内蔵 LCDスクリーンはnVidiaチップセットに切り替わります。表示IDの変更: 30004
- 外部ディスプレイはnVidiaチップセットによって駆動されます。
- ...この時点で、Intelチップセットは休止しています...
- ユーザーが外部ディスプレイのプラグを抜きます。
- 内蔵LCDスクリーンがIntelチップセットに戻ります。表示IDが元に戻ります:30002
私の質問は、GPUの変更によって変更されたときに、古いディスプレイIDを新しいディスプレイIDに一致させるにはどうすればよいですか?
について考えた:
ディスプレイIDが2だけ変わることに気づきましたが、これがすべての新しいMacBook Proに共通するのか、それとも私のものだけなのかを判断するのに十分なテストMacがありません。とにかく、「互いに+/- 2のディスプレイIDをチェックするだけ」が機能する場合は、一種の応急修理です。
試した:
CGDisplayRegisterReconfigurationCallback()
表示が変更される前後に通知する、には、一致するロジックがありません。登録されているメソッド内にこのようなものを入れても機能しません。
上で起こっていることは次のとおりです。
- 表示設定が変更される前にoldInfoDictをキャッシュしています。
- 表示設定が変更されるのを待っています
- 次に、を使用してoldInfoDictをnewInfoDictと比較します。
IODisplayMatchDictionaries()
IODisplayMatchDictionaries()
BOOLを返します。「はい」は同じか、「いいえ」は異なります。
残念ながら、IODisplayMatchDictionaries()
同じディスプレイがGPUを変更した場合、YESは返されません。比較している辞書の例を次に示します(IODisplayLocation
キーを見てください)。
ご覧IODisplayLocation
のとおり、GPUを切り替えるとキーが変わるため、IODisplayMatchDictionaries()
機能しません。
DisplayProductID
理論的には、キーとキーだけを比較できDisplayVendorID
ますが、エンドユーザーソフトウェアを作成していて、ユーザーが2つ以上の同一のモニターを接続している(つまり、両方に同じDisplayProductID / DisplayVendorIDがある)状況が心配です。 。言い換えれば、それは潜在的なグリッチに開かれた完全ではない解決策です。
どんな助けでも大歓迎です!:)
parallel-processing - Recommendations for Open Source Parallel programming IDE
What are the best IDE's / IDE plugins / Tools, etc for programming with CUDA / MPI etc?
I've been working in these frameworks for a short while but feel like the IDE could be doing more heavy lifting in terms of scaling and job processing interactions.
(I usually use Eclipse or Netbeans, and usually in C/C++ with occasional Java, and its a vague question but I can't think of any more specific way to put it)
cuda - CUDA 計算の SLI サポートがないシステムで 2 枚の NVIDIA GPU カードを使用できますか?
CUDA アプリケーション用の現在のシステムには、古い NVIDIA カード 8800 GTX が 1 枚あります。マザーボードを更新せずに、もう 1 枚カードを追加することを考えています。PCI-E スロットが 2 つあれば、その 2 つが機能するというのは本当ですか? それとも、SLI サポート対応の新しいマザーボードを購入する必要がありますか?
c# - .NET での複数のモニター
Screen.AllScreens
ハードウェア構成に関係なく、すべてのディスプレイが .NET から返されますか? たとえば、1 台の PC で次のことができます。
- 2 つのディスプレイへのビデオ カード出力 = 合計 2 つのディスプレイ
- ビデオ カードをそれぞれ 1 ディスプレイに出力 = 合計 2 ディスプレイ、
- ビデオ カードをそれぞれ 2 つのディスプレイに出力 = 6 つのディスプレイ、
- Eyefinity カードを 6 台のディスプレイに出力 (ディスプレイポート上)
これらすべての場合、使用すると、Screen.AllScreens
各ディスプレイに個別にアクセスできますか?
また、カードが拡張モードの場合、つまり 2 つのディスプレイが 1 つのカードに接続されているが、それは 1 つの大きなデスクトップ (仕事で使用するもの) にすぎない場合はどうなりますか? コンテンツを 1 つの画面に表示するように指定することはできますか?
cuda - Cuda4のGPU間同期
誰かがCuda4でこの機能を正常にテストしましたか?それが私のコードのバグなのか、機能がまだ完全に実装されていないのかわからないので、正しく動作させることができないようです。
たとえば、1つのGPUから別のGPUにメモリをコピーした後、カーネル呼び出しを実行したいとします。ストリーム0、mem0はgpu0ストリーム1に作成され、mem1はgpu1に作成されます。どちらもFermiTesla(C2070)です
時々、メモリはまだカーネルの準備ができていないように見えるので、結果は正しくありません。Gpu0にcudaDeviceSynchronizeを追加すると、正常に機能します。
ありがとう
python - PyCUDA; ワークロードを複数のデバイスに動的に分散する方法
PyCUDAには、そのすべての欠点がありますが、通常、非常に優れた例が提供されており、wikiからダウンロードできます。しかし、複数のデバイスにワークロードを動的に割り当てるPyCUDAの方法を示す例やドキュメント(または大まかなグーグル検索)には何も見つかりませんでした。
誰かが私が何をすべきかについて私にヒントを与えるか、私に例を示すことができますか?
私の頭に浮かんだアイデアの1つは、マルチプロセッシングを使用して、それぞれが1つのデバイスに関連付けられたN個のプロセスのプールを生成し、クラスが呼び出されたときです(すべてのGPU関数は別のクラスにありますが、おそらく最良のアイデアではありませんが、動作します)それはラウンドロビンのマルチプロセスです。これはどれくらい良い/遅れたアイデアですか?
PS私の開発マシンは1GPUで、テストマシンは4 GPUであるため、動的な数のデバイスを処理できるソリューションが必要です(異なるコンピューティング機能であることも役に立ちませんが、それが寿命です)
cuda - 複数の GPU にデータを分散するためのガイダンスが必要
現在、GPU クラスター用の機械学習ツールキットを開発しています。複数の GPU でロジスティック回帰分類器をテストしました。
私は Master-Worker アプローチを使用しています。このアプローチでは、マスター CPU が複数の POSIX スレッドを作成し、マトリックスが GPU 間で分割されます。
しかし、私が抱えている問題は、単一のマシンに保存できない大きな行列を保存する方法です。ノード間でデータを共有するためのライブラリやアプローチはありますか?
windows - マルチGPU環境でレンダリングGPUをプログラムで選択する方法はありますか?(ウィンドウズ)
質問
さまざまなマルチGPU構成(および場合によってはXPから7までのさまざまなWindowsバージョン)のマシンで実行されるOpenGLアプリケーションがあります。GPUの組み合わせとは無関係にOpenGLレンダラーとして機能する特定のGPUを選択する一般的な方法はありますか(たとえば、NVIDIA + NVIDIA、NVIDIA + AMD、NVIDIA + Intelなど)?これは、アプリケーションコードから、つまりC ++で直接適用できるソリューション、またはエンドユーザーの介入なしにアプリケーションから呼び出されるスクリプトである必要があります。
以下は、非常に具体的なケースから始めて、解決策を見つけるために私が行ったいくつかのテストの詳細ですが、すべてまたはほとんどの場合に機能する解決策があるかもしれません。
どのGPUがOpenGLレンダリングを実行するかを強制する信頼できる方法はありますか?
ヒントは大歓迎です。前もって感謝します!
考えられる解決策を試しました
2つのNVIDIAQuadroを搭載したWindowsXP64
2枚のQuadroカードの組み合わせによるテスト
- Quadro FX 1700 + Quadro FX 570
- Quadro FX 1700 + Quadro FX 540
- Quadro FX 1700 + Quadro NVS 285
Windows XP 64ビットで同じドライバ(バージョン275.36)を使用して、次のようなさまざまな方法で比較的成功しました。
ドライバーに決めさせる。
このソリューションは、両方のカードが同じドライバーを使用し、目的のカードを使用することを決定した場合にのみ有効です。したがって、それは具体的すぎて、おそらく予測不可能です。ドライバーに決定させる前に、 NVAPIを使用してコード内のドライバー設定を変更します。
このソリューションでは、理論的にはドライバーに希望どおりに決定させることができますが、難しいので、両方のカードが同じドライバーを使用し、常に機能するとは限りません(FX 1700 + NVS 285では機能しません)。メイン画面の変更。
これには、デフォルトで、選択したメイン画面でアプリケーションが開くという効果があります。このソリューションは、FX 1700 +FX570の組み合わせでのみ機能します。FX 1700 + FX 540では、レンダラーはメイン画面とは関係なくドライバー設定に依存し、FX 1700 + NVS 285では、レンダラーは常にFX1700です。ウィンドウが特定の画面にあるときにOpenGLコンテキストを作成します。
ウィンドウは、メインがメインであるかどうかに関係なく、目的の画面で作成できますが、上記の解決策と同じ問題があります。目的のグラフィックカードの画面のみを有効にしてから、他の画面のみを有効にして、OpenGLコンテキストを作成します。
これは、レンダラーとしてNVS 285を使用するために私が見つけた唯一の方法ですが、それは醜く、自動化できるかどうか、またはすべての場合に機能するかどうかはわかりません。WGL_NV_gpu_affinity拡張機能を使用してレンダリングGPUを選択しようとしています。
FX1700とFX570の組み合わせにより、拡張機能は両方のGPUに互換性があると報告し、レンダリングを一方にのみ制限できます。FX 1700 + FX 540ペアでは、拡張機能は互換性のあるGPUを1つだけ報告します。これは、ドライバーがOpenGLレンダリングに使用することを決定したものです。FX 1700 + NVS 285の組み合わせでは、常にFX 1700のみが報告されます(NVS 285は、使用中の唯一のカードである場合でも拡張機能によって報告されないため、この拡張機能をサポートしていないと思います)。
IntelおよびAMDを搭載したWindows764
このシステムはWindows764ビットで動作し、グラフィックカードは1つのIntel HD Graphics 2000(CPU(Sandy Bridge)に統合)と1つのAMD Radeon HD 6450です。いずれの場合も、レンダリングは両方の画面で機能しますが、レンダリングGPUは異なります。いくつかの変数に応じて:
- メイン画面がAMDに接続されていて、この画面でウィンドウが開いている場合、AMDがレンダラーです。
- メイン画面がAMDに接続されていて、ウィンドウが他の画面で開かれている場合、レンダラーは「GDI Generic」であり、非常に低速です。
- メイン画面がIntelに接続されている場合、ウィンドウが開いている場所に関係なく、Intelがレンダラーになります。
このシステムを使用して、OpenGLフォーラムで提案されたソリューションも試しました。TL; DR:OpenGLで使用されるドライバーを選択するのはハッキーな方法なので、異なるドライバーを使用するGPUから選択できますが、同じドライバーを使用するカードからは選択できません。次の結果が得られました。
- メイン画面がAMDに接続されている場合、レンダラーとして任意のGPUを選択できます。
- メイン画面がIntelに接続されている場合、レンダラーとしてIntelを選択できますが(これは自動であるため役に立たない)、AMDを選択しようとするとエラーが発生します。これはドライバーのバグかもしれないと思います。
graphics - Windows 7システムで異種マルチGPUを個別にタスクして使用する方法はありますか?
デスクトップに2つのチップセット/世代のAMDGPUを混在させることはできますか?6950および4870、およびopencl / gpgpuの目的のみに1つのgpu(4870)を割り当て、OSによるビデオ出力またはディスプレイ駆動の考慮からデバイスを排除し、4870が本質的に深いスリープ状態に留まるか、排出/無効化されているように見えるようにします。ストリームプロセッサが呼び出されますか?
4870と比較すると、6950はopenclの計算で非常に重要です。数を処理し、アクティブなユーザーセッション、さらにはWebブラウジングを可能にするのに十分です。ただし、フラッシュビデオが埋め込まれているWebページに移動するとすぐに、実行中のものを忘れて、メディアプレーヤーまたはメディアセンターを開きます。基本的に、UVDを初期化するために6950を必要とするGPUアクセラレーションビデオタスクでは、ディスプレイシステムがハングします。
4870を開いたPCIeスロットに接続し、0に近い熱生成と電力消費で休止状態にする方法を探しています(基本的に、電源がオフのイーサネットカードのように、インターフェイスの信号のみを維持します)デスクトップが回線を維持し、WOLコマンドを待機している)、D0状態(このウェイクイベントの遅延が秒単位であるかどうかさえ気にしない)に到達して、それ自体でopencl計算を実行します。CF以外の異種GPUチーミング設定を実現したくありません!UVDがハングした状況の私の例では、6950でopencl計算を手動で停止し、それらの計算を4870で開始して、マルチメディアの使用/ゲームのために6950を解放します(計算にヒットして許可されました)。レート)。デスクトップを使用している人がいないときに、2つのGPUが独立して同様の計算を実行できれば、さらに良いでしょう。システムの再起動を必要としない限り、4870の電源状態遷移を「オフ」状態から(たとえば、デスクトップのショートカットによって)開始する必要があるかどうかさえ気にしません。ユーザーセッションを終了してログオフします...そして4870の手動ON/OFF'スイッチ'は、ショートカットをクリックしてスクリプトを実行したり、デバイス管理に移動して切り替えたりするなど、熟練したウィンドウのエンドユーザーが実行できるものです。有効化/無効化。4870が、散発的に発生する可能性のある1回の使用で無駄にアイドリングしない限り。システムの再起動、ユーザーセッションの終了、ログオフを必要としない限り、4870の手動のオン/オフ「スイッチ」は、熟練したウィンドウのエンドユーザーが実行できるものです。スクリプトを実行するか、デバイス管理に移動して有効/無効を切り替えます。4870が、散発的に発生する可能性のある1回の使用で無駄にアイドリングしない限り。システムの再起動、ユーザーセッションの終了、ログオフを必要としない限り、4870の手動のオン/オフ「スイッチ」は、熟練したウィンドウのエンドユーザーが実行できるものです。スクリプトを実行するか、デバイス管理に移動して有効/無効を切り替えます。4870が、散発的に発生する可能性のある1回の使用で無駄にアイドリングしない限り。
デバイスを一般的なグラフィックカードとして使用するために作成された一般的な電源管理特性をオーバーライドするために、4870用の新しいiniを作成する以外に、この機能を容易にするソリューションを考えることはできませんでした。 o irqまたはその他の割り当てられたリソースを放棄して、インターフェイスの可用性とアドレス指定について「ドアを開いたままにする」)。しかし、それは私の能力をはるかに超える努力であり、達成するためにライセンスの追加の関与が必要であることが容易にわかります。