2013年10月13日

-maxrregcount= とComputeCapability

-maxrregcount=128でコンパイルしても,63個しかRegisterに使って貰えなくて,スピルしちゃってた現象を解決したのでメモ.原因は,ComputeCapabilityでした.

・使用できる最大Register数/Blockはデバイス毎に異なるので,コンパイル時に-maxrregcount=32とかで制限をかける場合があります.

・カーネル関数内のローカル変数は,基本的にRegisterに確保されます.が,Registerは使い回しされるので,ローカル変数の数だけ作られるわけではないらしい.あと,double(64Bit)は,二つのRegisterに分割されるらしい,多分.
・-maxrregcount=Nとした場合,N以上Registerを使えないので,それ以上使おうとした場合にはローカルメモリに待避させる=Registerspill.RAMからHDDへのスワッピングの様に,Register(キャッシュメモリ)からスピル(あふれ出た)ものをローカルメモリ(100Clock)にStore/Loadしてるんでしょう,多分.


ってことで,ローカル変数を少なくしてthreadを多くすればいいんですが,どうしてもRegisterを減らせないときもあるんですよね.
で,Registerを128以下にしようと思ったのに,63個までしかコンパイルできなかったわけです.
Maximum number of 32-bit registers per thread(thread当たりの最大Register数)は,ComputeCapabilityが1.xでは128個,2.xと3.0では63個,3.5では255個だったのです.なぜか2.xと3.0では減ってるんですよね.
なので,3.5でコンパイルしました.
posted by にゃんこ at 19:27| Comment(0) | TrackBack(0) | CUDA C
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/78117386
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック