問題タブ [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.

0 投票する
2 に答える
150 参照

cuda - 2 つの GPU で実行されているコードは同時実行に到達せず、無関係な速度向上があります

次のようなコードがあります。

上記のループの各反復は独立しています。それらを同時に実行したい。だから、私はこれを試しました:

2 つの GTX 680 を使用しており、これら 2 つのデバイスを同時に使用したいと考えています。上記のコードでは、速度が向上しません。処理時間はシングル GPU で実行した場合とほぼ同じです。

利用可能な 2 つのデバイスで同時実行を実現するにはどうすればよいですか?

0 投票する
2 に答える
1882 参照

cuda - 2 つの GPU で同時に cudaMalloc を呼び出すとパフォーマンスが低下する

ユーザーのシステム上の GPU 間で処理負荷を分割するアプリケーションがあります。基本的に、メイン アプリケーション スレッドによって定期的にトリガー されると、 GPU 処理間隔を開始する GPU ごとに CPU スレッドがあります。

GPU 処理間隔の例として、次の画像 (NVIDIA の CUDA プロファイラー ツールを使用して生成) を検討してください。ここでは、アプリケーションは単一の GPU を使用しています。

ここに画像の説明を入力

ご覧のとおり、GPU 処理時間の大部分は 2 つの並べ替え操作によって消費されます。私はこれに Thrust ライブラリ (thrust::sort_by_key) を使用しています。また、実際の並べ替えを開始する前に、thrust::sort_by_key がフードの下でいくつかの cudaMallocs を呼び出しているようです。

次に、アプリケーションが処理負荷を 2 つの GPU に分散させた同じ処理間隔を考えます。

ここに画像の説明を入力

完璧な世界では、2 つの GPU の処理間隔が 1 つの GPU の処理間隔の正確に半分になることが予想されます (各 GPU が半分の作業を行っているため)。ご覧のように、cudaMalloc が同時に呼び出されると、ある種の競合の問題により時間がかかるように見えるため (2 ~ 3 倍長くなる場合もあります)、部分的にはそうではありません。2 つの GPU のメモリ割り当てスペースは完全に独立しているため、cudaMalloc でシステム全体のロックを行うべきではないため、これが必要な理由がわかりません。GPU ごとのロックの方が合理的です。

cudaMalloc の同時呼び出しに問題があるという私の仮説を証明するために、2 つの CPU スレッド (GPU ごとに) がそれぞれ cudaMalloc を数回呼び出す非常に単純なプログラムを作成しました。最初にこのプログラムを実行して、別々のスレッドが cudaMalloc を同時に呼び出さないようにしました。

ここに画像の説明を入力

割り当てごとに最大 175 マイクロ秒かかることがわかります。次に、cudaMalloc を同時に呼び出すスレッドでプログラムを実行しました。

ここに画像の説明を入力

ここでは、各呼び出しに約 538 マイクロ秒、つまり前のケースの 3 倍の時間がかかりました! 言うまでもなく、これはアプリケーションの速度を大幅に低下させており、2 つ以上の GPU で問題が悪化するのは当然のことです。

Linux と Windows でこの動作に気付きました。Linux では Nvidia ドライバー バージョン 319.60 を使用し、Windows では 327.23 バージョンを使用しています。CUDA ツールキット 5.5 を使用しています。

考えられる理由: これらのテストでは GTX 690 を使用しています。このカードは基本的に、同じユニットに収容された 2 つの 680 のような GPU です。これは私が実行した唯一の「マルチ GPU」設定なので、cudaMalloc の問題は 690 の 2 つの GPU 間のハードウェア依存関係と関係があるのでしょうか?

0 投票する
1 に答える
1836 参照

linux - Nvidia GTX 590 でのマルチ GPU GPUDirect ピアツーピア通信の問題

2 つの GTX 590 カード (4 つの GPU) を搭載した Linux ボックスがあります。CUDA 4.0 ドライバーを使用すると、GPUDirect メモリ アクセスを呼び出して、4 つの GPU の可能なすべてのペア間でコピーが成功したことを確認できます。

しかし、CUDA 4.1 ドライバー (またはそれ以降のドライバー) にアップグレードした後、GPUDirect アクセス ペアが制限されます。

たとえば、ピアツーピアは、CUDA 4.0 の下で次の間で有効になります。

GPU0 <-> GPU1

GPU0 <-> GPU2

GPU0 <-> GPU3

GPU1 <-> GPU2

GPU1 <-> GPU3

GPU2 <-> GPU3

しかし、CUDA 4.1 (またはそれ以降) では、次の間のみのアクセスに制限されています。

GPU0 <-> GPU1 (同じカード)

GPU2 <-> GPU3 (同じカード)

GPU1 <-> GPU3

最新の CUDA 5.x ドライバーを使用する場合、誰かがこれを説明したり、回避策を知ったりできますか?


$ lspci -tv (興味深い部分):

私には、すべてのパスが物理的に利用可能 (構造のようなツリー) であり、cuda 4.0 を使用しているように見えますが、cuda 4.1 以降を使用している場合、cudaDeviceCanAccessPeer() は「クロスカード」通信に対して false を返します。すべてのホストからデバイスへのパスは常に (もちろん) 利用可能であることに注意してください。

0 投票する
1 に答える
230 参照

cuda - ピアツーピア用のマルチ GPU

ピア ツー ピア通信用に 2 つの GPU を設定するのに問題があります。Cuda 4.0 を使用し、fortran でプログラミングしています。PGI コンパイラ

ノードで 4 つの GPU が利用可能であることを確認するプログラムを作成しました。

そのうちの 2 つを使用することにしましたが、次のエラーが発生しました: 0: DEALLOCATE: invalid device pointer

次の場合、エラーはありません。

これで、エラーもありません:

しかし、このリターンエラー

そのため、プログラムを開始するために 2GPU を設定できないようです。2GPU を設定できない理由と、これを解決するためのヒントを教えてください。

0 投票する
1 に答える
356 参照

cuda - cudaMemcpy と cublas はピアツーピア モードでブロックされていますか?

を呼び出して、2 つの CUDA デバイス (UVA サポート付き) 間でメモリをコピーしたいと思いますcudaMemcpy。呼び出しがホストに対して同期しているかどうか疑問に思っていましたか? 同じデバイス内では非同期であることは承知していcudaMemcpyますが、異なるデバイス間のコピーはどうですか? cudaDeviceSynchronizeコピーが完了したことを確認するために電話する必要がありますか、それとも自動的に確認されますか?

キュブラについても同様の質問があります。あるデバイスに保存されているベクターを別のデバイスに保存されているベクターに追加したいので、それを求めcublasSaxpyています。操作が完了するまでホストをブロックしますか、それとも明示的に同期する必要がありますか?

0 投票する
1 に答える
42 参照

sorting - MultiGPU における原子交換ソートアルゴリズム

MultiGPUでアトミック交換ソートアルゴリズムをどのように実装できますか? 参考文献はありますか??