Shader 程序,又称为 Kernel,执行于 GPU 上。
有多少个 Work-item 就要分别独立执行多少次 Shader 程序。
32 或者 64 个 Work-item 组织在一起称为 Wave,他们是并行执行的,这是 Work-item 调度的基本单位。
RDNA3 处理器主要包含:
- 一个标量算数逻辑单元(Scalar ALU)。对每个 Wave 的数据做运算。
- 一个向量算数逻辑单元(Vector ALU)。对每个 Work-item 的数据做运算。
- 本地数据存储(Local data storage)。可以让同一个 Work-group 中的 Work-item 可以共享数据。
- 标量存储(Scalar memory)。这是一个 Cache,方便在显存和标量寄存器(SGPR)之间传输数据。
- 向量存储(Vector memory)。方便在显存和向量寄存器(VGPR)之间传输数据。
- Export。用于把 Shader 数据传输到特定的渲染硬件。
程序流的控制是使用 SALU 指令
Shader 支持 32 个 Work-items 为一组(称为 Wave32)或者 64 个为一组(Wave64)。
Wave 的概念和 NVIDIA 的 Warp 的概念是一样的,只不过是叫法不一样而已。
NVIDIA | AMD |
---|---|
Warp | Wave |
Thread | Work-item |
所有的操作都支持这两种 Work-item 大小。
但是这个大小必须在编译的时候就确定下来,后面也必须以这个大小来运行。
而且,这个大小与 Wave 中有多少活动的 Work-item 的数量没有关系。
在执行 VALU 和 VMEM(LDS,texture,buffer,flat)指令时,
Wave32 情形下每一条指令最多只会发射一次,而
Wave64 会发射两次(第一次 Work-item 31-0,第二次 63-32)。
在执行 SALU、SMEM、branch、message 指令时,指令都只会发射一次,
与 Wave 大小无关。
Export 的请求也只会发射一次,与 Wave 大小无关。
Wave64 的两次发射之间可能插入其他 Wave 的指令。
硬件在指令执行过程中可以跳过 Wave64 的某一半或者全部 Work-item 的执行,这取决于其执行的掩码。
但是,在执行 VMEM 指令的时候,一般不允许跳过,
这是因为跳过会导致 outstanding-memory-instruction 计数器不好计数。
当然,如果当前 Wave 中没有 VMEM 指令,仍然允许跳过。
还有一种情形也不允许跳过:当一条 VALU 指令写 SGPR 时。
网友评论