CUDAのwarpSizeについて

Warpとは

NVIDIAのGPUでの並列処理はWarpと呼ばれるスレッド単位で行われます. Warp shuffleやWMMA APIのようにWarpで協調して計算を行うAPIも提供されており,1 Warpが何Threadsなのかを取得したくなることは多々あります. 今出回っているGPUでは大体32 Threadsなので決め打ちで32というマジックナンバーを使っているプログラムも多々見ますが,CUDAではwarpSizeという変数が提供されており,Warpサイズを取得することができます.

warpSizeの不満点

上述したとおりWarpサイズは大体32 Threadsなのですが,warpSizeはconstexprではなく,コンパイル時計算等には使えません. 演算量を減らしたいなら自分で

constexpr std::size_t warp_size = 32;
みたいなことをすることになります.

warpSizeはコンパイルされるとどうなるか

例えばこのようなコードをPTXにしてみます. このようにWARP_SZという実効時即値の指定子に置き換わります. ではSASSではどうなるでしょうか. 0x20( = 32)に置き換わりました.
このようにバイナリで初めて即値が入りました.

終わりに

バイナリは実行アーキテクチャが決まって生成されるものなので,予想通りではあります. が,少々不便なのでコンパイルオプションでPTXに落とすときにconstexprとして扱うにするものを増やしてほしいです.
カテゴリー:CUDA
記事作成日:2018-12-07