CUDA入門 > メモリ > Page-Lockedメモリで転送

Page-Lockedメモリで転送


Page-Lockedメモリ
Page-Lockedメモリ(別名pinnedメモリ)は、
ホストメモリに、CUDA用にページングしない(固定の)メモリ領域を割り当てます。

普通にcudaMallocでホスト側のメモリを確保した場合に比べ、
転送速度が速くなります。

速度の違いは、CUDA SDKのbandwidthTestを実行すると分かります。

実行時、コマンドラインから --memory=pinnedをつけて実行すると確認できます。

コマンドラインの使用方法が分からない、という人は、

149行目辺りに
memMode = PINNED;

を追加すれば、pinnedメモリの転送速度を確認できます。


自作プログラムで確認したところ、
float型10万個だと、普通に確保した方が速いようです・・・。
15万個辺りから、Page-Lockedメモリの方が速くなっています。

Page-Lockedメモリを使用したプログラム例
#include <stdio.h> #include <cutil.h> #define N 1000 int main(int argc, char** argv){ float *h_pinned, *d_pinned; // ホスト側にCUDA用のメモリ領域確保 CUDA_SAFE_CALL(cudaMallocHost((void**)&h_pinned, sizeof(float) * N)); // デバイス(GPU)のメモリ領域確保 CUDA_SAFE_CALL(cudaMalloc((void**)&d_pinned, sizeof(float) * N)); // ホストからデバイスへ転送(ホスト側はpinnedメモリ) CUDA_SAFE_CALL(cudaMemcpy(d_pinned, h_pinned, sizeof(float) * N, cudaMemcpyHostToDevice)); // ホストメモリ解放 cudaFreeHost(h_pinned); // デバイスメモリ解放 cudaFree(d_pinned); // 終了処理 CUT_EXIT(argc, argv); return 0; }

ソースの説明
cudaMallocHostで、ホスト側にCUDA専用のメモリ領域(ページングしない)を確保します。
解放する際は、cudaFreeHost()を使用します。

cudaMallocHost(void** ptr, size_t size)
ptr:メモリアドレス
size:確保メモリのサイズ