OpenCVなどを使用していると、ホスト側のメモリ領域は勝手に作成されるため、
Page-Lockedメモリを使用して転送することができません。
memcpyでメモリーをホスト側で一旦コピーすればできますが、
そのコピー時間が無駄となります。
(ホスト-デバイス間の転送速度が遅い場合は、コピーも有効です)
少しイレギュラーな使い方かもしれませんが、
出力(デバイスからホストに転送)するメモリを、
Page-Lockedメモリにし、元のポインタが指すアドレスを、
Page-Lockedメモリのアドレスに変更してしまう方法があります。
CUDA_SAFE_CALL(cudaMemcpy(h_pinned, d_mem, sizeof(float) * N, cudaMemcpyDeviceToHost));
h_out = h_pinned;
一旦pinnedメモリに転送して、
h_outのアドレスをpinnedメモリのアドレスに変更してしまっています。
「h_out = h_pinned」はアドレスを代入しているだけなので、
殆ど時間はかかりません。
※後ほどOpenCVを利用したソースも公開します。
基本的には同じで、「h_out」が「->imageData」となるだけです。