CUDAがメモリを固定するのはなぜそんなに速いのですか?


83

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

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

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


mlock自体の時間を測定しましたか?
osgx 2011

いいえ、mlock呼び出しの実行にかかる実際の時間はごくわずかであると推定されます(それがあなたが求めているものである場合)。実際のオーバーヘッドは実際のデータ転送であり、私のアルゴリズムでは、これは総サイクル時間のかなりの部分です。
ギアロイドマーフィー2011

あなたのCPUは何ですか?たぶん、NUMA対応ノードは単純なものの恩恵を受けないでしょうmlock()
osgx 2011

AMD Phenom(tm)II X4 970プロセッサ
Gearoid Murphy 2011

回答:


83

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

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

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

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

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


1
非同期コピーコマンドを発行した後、別のスレッドにページのマンロックを試行させることで、どれだけの混乱を引き起こすことができるでしょうか。
Zan Lynx

1
Zan Lynx、興味深い質問です。なぜこのメモリのロックを解除したいのですか?32ビットPCでも最大2〜4 GBのメモリがロックされる可能性があり、PCI-expressカードが64ビット(実際には40ビットまたは48ビット)のアドレス指定にアクセスできる場合はさらに多くなります。より多くのメモリを購入する方が、非常に期限切れの(SOで18k rep!)プログラマーに支払うよりもはるかに安価です。Linuxの場合と同様に(信じています)、munlockはブロックされるか、エラーが返され、システムへの損傷は発生しません。
osgx 2013

cudaHostRegisterメモリマップトファイルへのポインタに適用できますか?
Tomilov Anatoliy 2018

15

CUDAはDMAを使用して、固定されたメモリをGPUに転送します。ページング可能なホストメモリは、ディスク上に存在する可能性があるため、DMAでは使用できません。メモリが固定されていない(つまりページロックされている)場合は、最初にページロックされた「ステージング」バッファにコピーされ、次にDMAを介してGPUにコピーされます。したがって、固定されたメモリを使用すると、ページング可能なホストメモリからページロックされたホストメモリにコピーする時間を節約できます。


5

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


それは実際のプログラムであり、プログラムの中mlock()で速かったので(私の答えの初期の変形でそれについて書いています)、そうではないと思います(Qのコメント#2を確認してください)。
osgx 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.