subgroupIndex
subgroupIndex
在计算着色器中,获取当前计算调用(Invocation)在其所属工作组(Workgroup)内的子组(Subgroup)的唯一索引。这是一个由 GPU 提供的只读内置变量。
核心优势
解锁了子组级别的高效并行操作(如投票、洗牌、归约),这些操作利用专门的硬件指令,远比通过共享内存手动实现的同类算法快得多,是实现高性能计算的关键。
常见用途
并行归约:让每个子组计算局部结果,并使用其索引将结果安全写入共享内存的不同位置。
优化共享内存访问:用作偏移量,错开不同子组对共享内存的访问,避免“Bank Conflict”。
任务专业化:根据子组索引为不同的子组分配不同的任务,实现功能分化。
数据划分:作为高层级的索引,在工作组内对数据或任务进行划分,简化逻辑。
如何调整
由于 `subgroupIndex` 是一个只读的内置变量,无法直接调整。但你可以根据它的值来改变着色器行为。例如,使用 `if ( subgroupIndex.equal( 0 ) ) { ... }` 条件分支,让工作组内的第一个子组执行与其他子组完全不同的代码逻辑,从而实现任务分工。
代码示例
1// 获取当前调用所属的子组的索引。
2const sIndex = TSL.subgroupIndex;
3
4// 将子组索引写入输出缓冲区,以供调试或后续处理。
5outputBuffer.element( globalInvocationIndex.x ).assign( sIndex );