最近在看cub代码,记录对于其scan和reduce的算法理解。
线程束洗牌
线程束洗牌是线程束内的一系列操作,使用的是寄存器操作,比共享内存更快,这是它的一大优势。它的操作有__shfl,__shfl_up,_shfl_down,__shfl_xor等等。可以利用它来实现scan和reduce操作。
warp_scan_shfl
使用了线程束洗牌的命令形式:
上面是自己画的原理图,根据自己对于算法的理解。
warp_reduce_shfl
和上面一样,同样使用了线程束洗牌的形式,不过cub源码中使用的是shuffle_down的形式,我这里以shuffle_up为例,其原理是一样的: