CUDAメモリ転送のパフォーマンス

前回に続きCUDAネタ。

メモリ転送の性能は、転送のサイズや、使用するシステムマザーボードのタイプなど、多くの要因に左右されます。

http://forum.nvidia.co.jp/EokpControl?&tid=10372&event=QE0004

そりゃ、確かに多くの要因に左右されるのは間違いないけど、自分の環境ではどの位の数値になるのだろう?試してみなければ分からないので、早速やってみた。テスト環境は下記の通り。

$ ./bin/darwin/release/bandwidthTest 
Running on......
      device 0:GeForce 9400M
Quick Mode
Host to Device Bandwidth for Pageable memory
.
Transfer Size (Bytes)	Bandwidth(MB/s)
 33554432		277.1

Quick Mode
Device to Host Bandwidth for Pageable memory
.
Transfer Size (Bytes)	Bandwidth(MB/s)
 33554432		1401.5

Quick Mode
Device to Device Bandwidth
.
Transfer Size (Bytes)	Bandwidth(MB/s)
 33554432		5870.4

&&&& Test PASSED

Press ENTER to exit...

「デバイス→ホスト」に比べると「ホスト→デバイス」の転送速度はえらく悪いような気がする。軽く一桁も違うとは凄いね。

今度はオプションで「メモリ固定」を指定して再実行。

$ ./bin/darwin/release/bandwidthTest --memory=pinned
Running on......
      device 0:GeForce 9400M
Quick Mode
Host to Device Bandwidth for Pinned memory
.
Transfer Size (Bytes)	Bandwidth(MB/s)
 33554432		4109.9

Quick Mode
Device to Host Bandwidth for Pinned memory
.
Transfer Size (Bytes)	Bandwidth(MB/s)
 33554432		4100.3

Quick Mode
Device to Device Bandwidth
.
Transfer Size (Bytes)	Bandwidth(MB/s)
 33554432		5872.3

&&&& Test PASSED

Press ENTER to exit...

今度はホストとデバイス間の速度が、両方向で同程度となった。上を見ればキリが無いのだろうけど、ノートPCとしては悪くないパフォーマンスかも知れない。でも、このマシンの場合、グラフィックの仕様として「256MB DDR3 SDRAMをメインメモリと共有」なのだ。「デバイス間転送」と「ホスト・デバイス間転送」は一体何がどう違うのだろう?