subgroupSize
subgroupSize
一个只读的计算着色器节点,它提供硬件“子组(Subgroup)”中的线程(调用)数量。这个值对于编写可移植且高效的并行算法至关重要。
核心优势
核心优势在于实现了与硬件无关的计算着色器编程。通过动态提供 GPU 的子组大小,它允许开发者编写单个、可移植的算法,该算法能自动适应不同硬件(如 NVIDIA 的 32 线程 Warp 或 AMD 的 64 线程 Wavefront),无需为特定平台硬编码。
常见用途
在子组内进行并行归约(如求和、求最大值)。
计算线程所属的子组索引。
在工作组共享内存中为每个子组分配专属空间。
如何调整
subgroupSize 是一个只读的硬件常量,无法更改。因此,代码设计的关键在于“响应”其值,而非“调整”它。例如,并行归约算法的循环边界应基于 subgroupSize 定义(如 `offset = subgroupSize.div(2)`),以确保在任何 GPU 上都能正确运行。此外,可以使用条件逻辑(如 `if (subgroupSize.equal(64))`)为特定硬件创建高度优化的代码路径,同时为其他硬件保留通用的后备方案。
代码示例
1// 获取当前硬件的子组大小。这是一个 uint 类型的常量。
2const sSize = TSL.subgroupSize;
3
4// 为了方便可视化,将 uint 类型的 subgroupSize 转换为浮点数并进行归一化。
5// 这里除以 128.0 是因为常见的 subgroupSize 是 32 或 64。
6const normalizedSize = sSize.tofloat().div( 128.0 );