1. ホーム
  2. c++

[解決済み] CUDAのピン留めメモリはなぜ速いのか?

2023-05-05 04:58:10

質問

CUDA データ転送にピン留めされたメモリを使用すると、データ転送でかなりのスピードアップが見られます。linux では、これを達成するための基本的なシステムコールは mlock です。mlock のマニュアル ページから、ページをロックすることでスワップアウトされるのを防ぐことができると述べられています。

mlock() は addr で始まり len バイトの間続くアドレス範囲内のページをロックします。 指定されたアドレス範囲の一部を含むすべてのページは、呼び出しが正常に戻ったときにRAMに常駐していることが保証されます。

私のテストでは、私のシステム上に数ギガの空きメモリがあったので、メモリ ページがスワップアウトされるようなリスクはありませんでしたが、それでも速度向上が観察されました。どなたか、ここで実際に何が起こっているのか説明していただけませんか。

どのように解決するのですか?

CUDAドライバ チェック をチェックし、異なるコードパスを使用します。ロックされたメモリは物理メモリ(RAM)に格納されているので、デバイスはCPUの助けを借りずにそれを取得できます(DMA、別名非同期コピー、デバイスは物理ページのリストだけを必要とします)。ロックされていないメモリはアクセス時にページフォルトを生成する可能性があり、メモリ内だけでなく (スワップなど) に格納されるため、ドライバーはロックされていないメモリのすべてのページにアクセスし、それを固定バッファにコピーして DMA に渡す必要があります (同調、ページごとのコピー)。

ここで説明されているように http://forums.nvidia.com/index.php?showtopic=164661

<ブロッククオート

非同期memコピー呼び出しで使用されるホストメモリは、cudaMallocHostまたはcudaHostAllocでページロックする必要があります。

developer.download.nvidia.com の cudaMemcpyAsync と cudaHostAlloc のマニュアルを確認することもお勧めできます。HostAlloc は、cuda ドライバがピン留めされたメモリを検出できることを述べています。

ドライバはthis(cudaHostAlloc)関数で割り当てられた仮想メモリ範囲を追跡し、cudaMemcpy()などの関数への呼び出しを自動的に高速化します。