Warp Shuffle
Warp Shuffleとは
Warp Shuffleは同Warp内の別スレッドが持つレジスタの値を受け渡すための命令です。
これを用いずにレジスタの値をスレッド間で共有するためにはシェアードメモリなどのメモリを用いる必要があります。
同Warp内(32のスレッド)でしかやりとりが出来ないので汎用性は劣りますが速度は向上します。
Warp Shuffleの使い方
WarpShuffleを行うメソッドは4種類あります。
//指定したレーン(Warp内のスレッド番号)のvarの値を受け取ります T __shfl(T var, int srcLane, int width=warpSize); //指定した数離れたスレッドのvarの値を受け取ります //upは指定した数上の番号、downは下の番号のスレッドから受け取ります //Warpの外に出てしまった場合は自身のスレッドでの値が返ってきます T __shfl_up(T var, unsigned int delta, int width=warpSize); T __shfl_down(T var, unsigned int delta, int width=warpSize); //自分のレーン番号と指定したlaneMaskをXORした結果の番号のスレッドから受け取ります //laneMaskごとにレジスタの中身を交換することが出来ます T __shfl_xor(T var, int laneMask, int width=warpSize);
渡す値はfloatもしくはintに限られます。
いずれも別のスレッドでvarに渡した値を返り値として受け取る形になります。
交換する形でなく、1つのスレッドから他のスレッドに値をブロードキャストする用途でも使えます。
高速化される?
メモリを介して値をやりとりした場合と比べてWarp Shuffleが速いのはなぜでしょうか?
メモリを介しての値をやり取りをする場合、メモリに値を書き込む→同期をとる→そのメモリから値を読み出すというプロセスが必要になります。
それに対してWarp Shuffleは1回の書き込みのみで済むのが強みです。
同Warp内であれば同期の必要もないですしね。
用途は?
調べて書いては見たものの、使い所がなかなか難しいです。
最初にも述べたように同Warp内でのやりとりに限られるのでちょっと扱いにくいかもしれません……。
とりあえず今日調べたことをまとめておきたくて書いたけどちょっとサンプルとか少なくて読みにくかったかもしれません。
ある理由から明日までに1つ記事を書いておきたかったというのもありますけどね。
その理由は明日に。