CUDAのshfl便利すぎて生きるのがつらい

まあ存在は知ってたし、それなりに便利だと思ってたが、最後に条件が成立しなかったスレッドの値をbroadcastするみたいなサンプルが↓に書いてあったのを見て、
http://on-demand.gputechconf.com/gtc/2013/presentations/S3174-Kepler-Shuffle-Tips-Tricks.pdf
思ってたよりもうちょっと便利だと思った。


CUDA はビット演算充実してて、

  • clz
  • popcnt
  • bfind (立ってないビットを返す)
  • brev (ビット反転)

とかがある。

http://docs.nvidia.com/cuda/cuda-binary-utilities/index.html#kepler SASSレベルでもFLO,POPCとかが一命令でできるような雰囲気がある(brevはよくわからん)

あと、 __ballotがあって 32thread の bit を 32bit 整数に変換できる。なので、SSEのpmovmskbが便利な状況では、常に有効に活用できる気がする。というか途中の要素ごとの条件if文で書けるのでpmovmskbよりかなり書きやすい。

あと SSE の pmovmskb は要素のbit幅ごとに使いかた考えないといけないのでちょっと面倒なのだけど、CUDAは全部32bitなのであんまり頭使わなくていい。(その分無駄があるとも言えるが)