NTL.ALL

RISC-V NTL.ALL 指令详解

指令手册I-type

Zihintntl 所有缓存非时间局部性提示,作用于紧随其后的显式内存访问目标指令。

指令语法

ntl.all
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数所在的寄存器。
立即数 imm:12 位有符号立即数,符号扩展后与 rs1 进行运算。
Zihintntl微架构提示缓存与同步

指令行为说明

NTL.ALL 是 Zihintntl 非时间局部性 HINT,编码为 ADD x0, x0, x5。它提示实现:紧随其后的目标指令的显式内存访问目标指令在任何缓存层级内不应期待时间局部性。该提示不改变架构状态,也不改变目标指令的架构可见效果;实现可以完全忽略它。NTL 会影响除 Zicbom 缓存管理指令之外的显式内存访问,也可影响 Zicbop 预取提示。

快速理解与检索要点

NTL.ALL 是非时间局部性前缀 HINT,用来描述下一条显式内存访问的预期复用情况,而不是改变该访问的架构语义。

四个 NTL 变体只在缓存层级范围上不同:P1、PALL、S1、ALL。
如果目标指令陷入异常,官方建议实现不要把 NTL 应用到 trap handler 的第一条指令。

常见使用场景

缓存与提示

结合 «ntl.all» 等实际代码理解该场景。

并发与多核

结合 «ntl.all» 等实际代码理解该场景。

性能优化

结合 «ntl.all» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 I-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

只作用于紧随其后的目标指令;后面更远的内存访问不受该 NTL 前缀约束。
这是 HINT,实现可忽略;不能把它作为正确性、同步或一致性机制。
官方建议不要让 NTL 后面跟随不显式访问内存的指令;这样做无架构可见影响,但可能降低性能。
NTL 不影响 Zicbom 的 CBO.CLEAN/CBO.FLUSH/CBO.INVAL,但可影响其他显式内存访问和预取提示。

常见问题

NTL.ALL 会改变下一条 load/store 的结果吗?

不会。它不改变目标指令的架构可见效果。

NTL.ALL 可以被实现忽略吗?

可以。它是 HINT,软件不能依赖它保证性能或正确性。