Skip to main content

2. 寄存器与控制状态

文件数量/宽度用途
v0–v127每 lane,32 bit向量、地址和临时值;vpair 使用偶数起始寄存器表示 64 bit。
u0–u63每 warp,32 bituniform 运算、地址、描述符、控制和 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舍入、次正规数、异常模式。
fflagsNV/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_hiCODE_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 控制流仍需保持结构化。