在执行过程中中断指令

Interrupting instruction in the middle of execution

假设CPU是运行一条汇编指令,比方说,FOO将在几个时钟周期内执行(例如10)

正在执行 FOO 时收到中断请求,处理器需要中断。它是等到命令正确执行,还是 FOO 中止并重新启动?考虑到不同类型的中断优先级,它的行为是否不同?

CPU 可以选择执行其中任一操作,即决定相对于原始指令流何时处理中断。

已发出但尚未分派到执行单元的 Insn 在 AMD 和 Intel 的当前实现中被取消。 When an interrupt occurs, what happens to instructions in the pipeline?

在乱序执行的情况下,通常有数十条指令在执行中,而且实际上可以同时在 ALU 中执行不止一条指令。

但一个有趣的问题是,是否允许像 addimul 这样已经开始执行但尚未退出的低延迟指令完成并更新中断中断的架构状态handler 看不看

如果不是,可能是因为难以构建逻辑来检测有多少连续指令将准备好“很快”退出,超出当前退出状态。中断很少见(最坏情况下每千条指令中断一次,或者在 I/O 负载较低的情况下每百万条指令中断一次),因此在中断处理周围压缩更多周围代码吞吐量的好处很低。中断延迟的任何潜在成本都是不利的。


一些指令,尤其是微编码指令,具有无需从头重新启动即可被中断的机制。例如

  • rep movsb 可以让 RSI、RDI 和 RCX 更新到复制的中途(因此它将在重新启动时完成复制)。其他 REP-string 指令可以类似地被中断。对于中断,只有一个操作计数是原子的。

    即使在调试器中单步执行(通过设置 TF),CPU 在每次计数后都会中断,因此从中断 PoV 来看,它实际上是在重复单独的 movsb 指令 RCX 次。

  • AVX2 像 vpgatherdd 一样收集有一个输入掩码向量,显示要收集哪些元素与忽略哪些元素。它在成功收集到相应的索引后清除掩码元素。在异常(例如页面错误)时,错误元素是最右边的元素,其掩码仍然设置(不保证收集顺序,但错误顺序是,请参阅 Intel 的手册条目)。

这使得收集成功成为可能,而无需同时映射所有相关页面。在另一个元素中分页时驱逐一个已经聚集的元素不会导致无限循环,即使在内存压力极端情况下也是如此。保证前进。

在异步中断上,硬件可以类似地让收集部分完成,使用掩码记录进度。 IDK 如果有任何硬件确实这样做,但 ISA 设计保留了该选项。

无论如何,这就是为什么你需要在循环中为每次收集不断创建一个新的全一面具。

AVX512 收集和分散具有相同的机制,但使用掩码寄存器而不是向量寄存器。 http://felixcloutier.com/x86/VPSCATTERDD:VPSCATTERDQ:VPSCATTERQD:VPSCATTERQQ.html


非常慢的指令没有被中断和重新启动的机制包括wbinvd。 (将所有缓存同步到主内存并使它们失效)。 Intel 的手册中提到 wbinvd 确实延迟中断。

As a consequence, the use of the WBINVD instruction can have an impact on logical processor interrupt/event response time.

这可能就是它成为特权指令的原因。 user-space 可以做很多事情来使系统变慢(例如,耗尽大量内存带宽),但它不会显着增加中断延迟。 (已经从 ROB 退出但尚未提交到 L1d 的存储会增加中断延迟,因为它们必须发生并且不能中止。但是创建大量分散的高速缓存未命中存储在运行中的病态情况更难,并且存储缓冲区较小。)


相关:

  • Interrupting an assembly instruction while it is operating 与这个答案非常相似,并提到这适用于大多数(所有?)ISA。

  • - 单核原子性 wrt。单处理器系统的中断(以及上下文切换)。