nVidia CUDA でデータのプリフェッチに取り組んでいます。デバイス自体でのプリフェッチ、つまり共有メモリからキャッシュへのプリフェッチに関するドキュメントをいくつか読みました。
しかし、CPU と GPU 間のデータのプリフェッチに興味があります。どなたか、この件に関する文書か何かで私に連絡していただけませんか。どんな助けでも大歓迎です。
あなたのコメントに基づいて答えてください:
大きなデータに対して計算を実行したい場合、理想的には最大データを GPU に送信し、計算を実行し、それを CPU に送り返します。今、私の計画には CU プログラムが与えられています。たとえば、グローバル メモリ全体で実行されるとします。残りの半分をデータのプリフェッチに使用できるように、グローバル メモリの半分で実行するように強制します。半分同時に、他の半分のデータをプリフェッチします。ストールは発生しません。実行可能か教えてください。パフォーマンスは低下またはアップグレードされますか?改善する必要があります..
CUDAストリームは、まさにこのアプローチを可能にするために導入されました。
計算がかなり集中している場合は、そうです --- パフォーマンスを大幅に高速化できます。一方、たとえばデータ転送に 90% の時間がかかる場合、節約できるのは計算時間だけです。
ストリームの使用方法の例を含む詳細は、CUDA プログラミング ガイドに記載されています。バージョン 4.0 の場合、それはセクション「3.2.5.5 ストリーム」、特に「3.2.5.5.5 オーバーラップ動作」になります --- そこで、カーネルがまだ実行されている間に別の非同期メモリ コピーを起動します。
おそらく、CUDA 4.0の非同期ホスト/デバイスメモリ転送機能に興味がありますか?ページロックされたホストメモリを使用して、ホスト/デバイスのメモリ転送とカーネルをオーバーラップさせることができます。これを使用して...
したがって、GPUにデータをストリーミングしたり、GPUからデータをストリーミングしたり、GPUで一度に計算したりすることができます(!)。詳細については、CUDA4.0プログラミングガイドおよびCUDA4.0ベストプラクティスガイドを参照してください。幸運を!
Cuda 6 では、コピーする必要がなくなります。つまり、コピーは自動的に行われます。ただし、プリフェッチの恩恵を受ける場合もあります。
簡単に言えば、現在の計算を完了している間に転送する「次の」計算用のデータが必要です。これを実現するには、CPU に少なくとも 2 つのスレッドが必要であり、何らかのシグナリング スキーム (次のデータをいつ送信するかを知るため) が必要です。もちろん、チャンキングは大きな役割を果たし、パフォーマンスに影響を与えます。
両方のプロセッサが同じメモリにアクセスできるため、コピーする必要がなくなるため、上記は APU (同じダイ上の CPU + GPU) でより簡単になる場合があります。
GPU プリフェッチに関する論文を見つけたい場合は、Google Scholar を使用してください。