私のアルゴリズムがホストからデバイスおよびデバイスからホストへのメモリ転送によってボトルネックになっている場合、唯一の解決策は異なるまたは改訂されたアルゴリズムですか?
2 に答える
PCIeのボトルネックを軽減するために試すことができることがいくつかあります。
- 非同期転送-重複する計算と一括転送を許可します
- マップトメモリ-実行中にカーネルがGPUとの間でデータをストリーミングできるようにします
これらの手法はどちらも転送を高速化するものではなく、GPUがデータの到着を待機する時間を短縮するだけであることに注意してください。
API機能を使用すると、転送を開始し、転送の結果に依存しないcudaMemcpyAsync
1つ以上のカーネルを起動し、ホストとデバイスを同期してから、転送の完了を待機していたカーネルを起動できます。転送が行われている間に生産的な作業を行うようにアルゴリズムを構造化できる場合は、非同期コピーが優れたソリューションです。
API関数を使用cudaHostAlloc
すると、GPUから直接読み取りおよび書き込みが可能なホストメモリを割り当てることができます。これが高速である理由は、ホストデータを必要とするブロックは、データのごく一部が転送されるのを待つだけでよいため です。対照的に、通常のアプローチでは、転送全体が完了するまですべてのブロックが待機します。マップされたメモリは、基本的に、大きなモノリシック転送を大量のコピー操作または小さなコピー操作に分割するため、レイテンシが短縮されます。
これらのトピックの詳細については、 CUDAプログラミングガイドのセクション3.2.6-3.2.7およびCUDAベストプラクティスガイドのセクション3.1を参照してください。OpenCLベストプラクティスガイドの第3章では、 OpenCLでこれらの機能を使用する方法について説明しています。
ホストとGPU間でデータを転送する価値があるように、GPUで十分な処理を実行することを確認するために、実際に計算を行う必要があります。理想的には、コーディングを行う前の設計段階でこれを行うのが理想的です。これは、契約を破る可能性があるためです。