[CUDA Samples] newdelete

目次

CUDA Advent Calendar 2019 7日目の記事です.
ネタのつなぎのCUDA Samples読み回3回目です.
今回はToolkitに入っているSampleです.

何このサンプル?

CUDA 4.2よりDynamic Global Memory Allocationなる機能が提供されており,これによりカーネル関数内でグローバルメモリに対してnew/delete,malloc/freeができるようになっています.
これはその機能のサンプルプログラムです.

Dynamic Global Memory Allocationの仕組み

どうやってメモリの確保をしているのか,SASSを見てみました.
このようなコードをcompute_70のSASSで見てみると このようになります.
このコードでは動的確保したメモリのアドレスをポインタのポインタに書き込む処理と,そのアドレスに値0x578を書き込む処理の2回の書き込み処理があるはずです.
IMAD.MOV.U32 R6, RZ, RZ, 0x578 ;
でR6レジスタに0x578を書き込み,
ST.E.SYS [R4], R6 ;
でR6をメモリ領域[R4]に書き込んでいるため,R4が動的確保したメモリのアドレスということになります(ST.E.SYS命令なのでアドレスは32bit分っぽい?).
ではアドレスR4がどのように確保されているかと言うと,
IMAD.MOV.U32 R4, RZ, RZ, 0x4 ;
よりR4=0x4なため,アドレス決め打ちでとっていることになりそうです.
ちなみに動的確保したアドレスをポインタのポインタに入れる部分は
IMAD.MOV.U32 R2, RZ, RZ, c[0x0][0x160] ;
MOV R3, c[0x0][0x164] ;
によって2命令に分けて64bit文のアドレスを関数の引数から取り出し,
STG.E.64.SYS [R2], R4 ;
で書き込んでいることになります.
コンパイル時にアドレスが決定できる場合は決め打ちされるんですかね.

終わり

動的確保したメモリへ直接ホストからアクセスできないなど不便な点もあります(ホスト側ではそのメモリへのポインタのポインタを持つことになるため)が,使い方によってはありがたいかもしれませんねー.

カテゴリー:CUDA
記事作成日:2019-12-07