2. 寄存器与控制状态
| 文件 | 数量/宽度 | 用途 |
|---|---|---|
v0–v127 | 每 lane,32 bit | 向量、地址和临时值;vpair 使用偶数起始寄存器表示 64 bit。 |
u0–u63 | 每 warp,32 bit | uniform 运算、地址、描述符、控制和 lane 掩码。 |
vreg16 把一个向量寄存器拆成 .l(低 16 bit)和 .h(高 16 bit),编码原始字段为 [7:1]=寄存器号、[0]=0/1;半精度操作不改变另一半。vpair/upair 必须偶数对齐,低编号寄存器存低字。udesc4 是连续四个 u 寄存器,udesc8 是连续八个 u 寄存器;全零描述符是 null。
特殊状态通过 CSR 格式和 csrr/csrw/csrs/csrc/csrwi/csrsi/csrci 访问:
| CSR | 作用 |
|---|---|
exec | 当前 32 lane 执行掩码。 |
mode | 舍入、次正规数、异常模式。 |
fflags | NV/DZ/OF/UF/NX 累积浮点标志,写入按实现定义的清除语义。 |
trapctl | 陷阱使能和暂停策略。 |
warpid/spid/coreid/wgslot | 调度和调试识别。 |
clock/clockh/time/timeh | 低/高 32 bit 的时钟和时间计数器。 |
scratch_lo/scratch_hi/scratch_size | 当前 lane scratch 区域。 |
code_lo/code_hi | CODE_BASE。 |
trapbase/trapcause/trappc/trapinfo | 陷阱向量和保存现场。 |
EXEC 模型
EXEC 是 u 中的 32-bit lane mask。exec.get 读出它,exec.set 写入它;exec.wqm 将当前掩码扩展到包含相关 2x2 quad 的 helper lanes。saveexec.* 原子地把旧 EXEC 写入目的 uniform,并按逻辑运算设置新 EXEC:
saveexec.and u_old, u_cond : u_old = EXEC; EXEC = EXEC & u_cond
saveexec.or u_old, u_cond : u_old = EXEC; EXEC = EXEC | u_cond
saveexec.xor u_old, u_cond : u_old = EXEC; EXEC = EXEC ^ u_cond
saveexec.andn1 u_old, u_cond : u_old = EXEC; EXEC = u_cond & ~EXEC (else = saved & ~then)
saveexec.andn2 u_old, u_cond : u_old = EXEC; EXEC = EXEC & ~u_cond (loop continue mask)
saveexec.mov u_old, u_cond : u_old = EXEC; EXEC = u_cond
典型 if/else 使用 saveexec.and 保存 then 掩码,再以 saveexec.andn1 得到 else 掩码,最后 exec.set 恢复保存值。循环使用 saveexec.andn2 保存退出条件的补集,并用 bexecnz 在 EXEC 非零时回跳;循环尾恢复外层掩码。EXEC 为零的 warp 可提前跳过向量指令,但 uniform 控制流仍需保持结构化。