Warp shuffle 函数在 warp 内未退出的线程之间交换一个值,无需使用共享内存。
其实就是, 在warp内部32个线程中, 当前线程可以通过shuffle指令去获得另一个线程的值, 且这种操作无需共享内存, 直接获得, 在warp内使用很方便, 获取的方式有四种:
- 参与的线程, 统一拿某个值, 比如所以线程的值都拿0号线程的值, 也就是广播, 这就是**
__shfl_sync(0xFFFFFFFF, val, 0)**指令 - 参与的线程, 统一往下(线程数小的方向)拿相隔2个位置的值, 往小方向拿值, 那就是拿自己相隔2个位置的后面的值, 这就是**
__shfl_down_sync(0xFFFFFFFF, val, 2)** - 参与的线程, 统一往上(线程数大的方向)拿相隔2个位置的值, 往大方向拿值, 那就是拿自己相隔2个位置的前面的值,
__shfl_up_sync(0xFFFFFFFF, val, 2) - 参与的线程, 这种方式特殊, 不再是加减这种运算, 而是参与的线程通过异或操作去得到要拿线程的位置, 比如**
__shfl_xor_sync(0xFFFFFFFF, val, 1)**, 每个线程的索引号和1进行异或拿值, 比如0xor1=1, 1xor1=0, 2(10)xor1=3, 3(11)xor1=2, 4(100)xor1=5, 5(101)xor1=4, 规律就是参与的32个线程, 两两互相拿值, 异或就很神奇了, 也有点难, - 这四个函数的三个参数的意思分别是: 参与的线程数量(用16进制表示), 我这个线程的值是多少, 具体操作的数(操作的方式以及在函数名体现)