[解決済み] CUDAのピン留めメモリはなぜ速いのか?
質問
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()などの関数への呼び出しを自動的に高速化します。
関連
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] CUDAバージョンの取得方法を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】'cout'は型名ではない
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む