subgroupShuffleUp
subgroupShuffleUp
在子组内返回来自 subgroup_invocation_id = 本线程 id − delta 的活动线程的 v 值,用于按固定偏移从更低编号线程读取数据。
核心优势
提供单指令的子组内数据搬移,无需共享内存与屏障;可组合实现前缀扫描、邻域运算与 warp 级通信。
常见用途
前缀和/乘扫描的单步(配合 delta=1,2,4… 迭代)
邻域差分或滤波:v − 左邻居
子组内移位寄存器式数据搬移
作为广播/重排族函数的基础构件
如何调整
该函数固定接收两个参数:v 与 delta。增大 delta 读取更远的左侧邻居。若本线程 id < delta 或来源线程不活跃,结果未定义,需结合 invocationSubgroupIndex 做边界保护或回退策略。子组大小与可用性由平台决定,通常用于支持 Subgroup 的计算/片元阶段。
代码示例
1// 子组上移洗牌:每个线程取左侧 delta 个线程的值
2const delta = int( 1 );
3const left = subgroupShuffleUp( value, delta );
4
5// 示例:一阶差分(第 0 号线程需自行做边界保护)
6const diff = value.sub( left );