web-dev-qa-db-ja.com

CUDAがメモリを固定しているのはなぜですか?

CUDAデータ転送に固定メモリを使用すると、データ転送の大幅な高速化が見られます。 Linuxでは、これを実現するための基本的なシステムコールはmlockです。 mlockのmanページから、ページをロックするとページのスワップアウトが防止されると記載されています。

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

私のテストでは、システム上に空きメモリが数ギグあったので、メモリページがスワップアウトされる危険性はありませんでしたが、速度の向上は見られました。誰もがここで実際に何が起こっているのか説明できますか?、洞察や情報は大歓迎です。

73
Gearoid Murphy

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

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

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

Developer.download.nvidia.comでcudaMemcpyAsyncおよびcudaHostAllocのマニュアルを確認することもお勧めします。 HostAllocによると、cudaドライバーは固定メモリを検出できます。

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

71
osgx

CUDAはDMAを使用して、ピン留めされたメモリをGPUに転送します。ページング可能なホストメモリは、ディスク上に存在する可能性があるため、DMA (つまり、ページロック)、最初にページロックされた「ステージング」バッファーにコピーされ、次にDMAを介してGPUにコピーされます。

9
Shen Yang

メモリページがまだアクセスされていない場合は、おそらく最初からスワップインされていないでした。特に、新しく割り当てられたページは、ユニバーサル「ゼロページ」の仮想コピーであり、書き込まれるまで物理的にインスタンス化されません。同様に、ディスク上のファイルの新しいマップは、読み取りまたは書き込みが行われるまで純粋にディスク上に残ります。

5
R..