subgroupShuffleXor
subgroupShuffleXor
在同一“子组”(subgroup)内,根据 mask 与当前 subgroup_invocation_id 的按位异或(^)结果,返回来自目标调用(lane)的 v 值。签名:subgroupShuffleXor(v, mask)。
核心优势
无需共享内存或同步屏障即可进行跨调用的数据交换,天然适合蝶形(Butterfly)通信、规约(Reduction)、扫描(Scan)等并行模式;TSL 将其封装为 2 参数函数节点,类型安全、可读性高。
常见用途
相邻线程交换(mask=1u)以做边-边交互或配对计算。
蝶形(Butterfly)规约/前缀和:mask 依次取 1u、2u、4u… 进行对数步长通信。
子组内按模式重排(lane permutation)或选择性广播子集数据。
FFT/位反转等需 XOR 配对的并行通信阶段。
如何调整
通过选择 mask 的比特位决定目标调用:1u 翻转最低位(与相邻 lane 配对),2u 翻转次低位,4u 翻转第三位…… 由此可构建蝶形/对数步长的并行模式。注意:仅在底层后端启用“子组”特性时有效;在不支持的平台将不可用。
代码示例
1// 1) 邻居交换(mask=1u)
2const neighbor = subgroupShuffleXor( value, 1u );
3const pairSum = value.add( neighbor );
4
5// 2) 蝶形规约(示意)
6let s = value;
7s = s.add( subgroupShuffleXor( s, 1u ) );
8s = s.add( subgroupShuffleXor( s, 2u ) );
9s = s.add( subgroupShuffleXor( s, 4u ) );