首页 文章

在执行过程中中断指令

提问于
浏览
4

假设CPU正在运行汇编指令,比如, FOO 将在几个时钟(例如10)中执行

中断请求刚刚执行 FOO ,处理器需要中断 . 它是否等到命令正确执行,或者 FOO 中止并将重新启动?考虑到不同类型的中断优先级,它的行为是否有所不同?

1 回答

  • 6

    CPU可以选择决定做任何一个,即决定何时相对于原始指令流处理中断 .

    已发布但尚未发送到执行单元的Insns在AMD和Intel的当前实施中被取消 . When an interrupt occurs, what happens to instructions in the pipeline?

    对于无序执行,通常会有数十条指令在运行,并且不止一个指令可以立即在ALU中执行 .

    但是,一个有趣的问题是,允许完成和更新中断处理程序看到或未更新的架构状态是否允许已经开始执行但尚未退出的低延迟指令(如 addimul ) .

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


    Some instructions, especially micro-coded ones, have mechanisms for being interrupted without having to restart from scratch . 例如

    • rep movsb可以将RSI,RDI和RCX更新为部分通过副本(因此它将在重新启动时完成复制) . 其他REP字符串指令可以类似地被中断 . 对于中断,只有一次操作计数是原子的 .

    • AVX2收集像vpgatherdd有一个输入掩码矢量,显示要收集哪些元素而忽略 . 它在成功收集相应的索引后清除掩码元素 . 在异常(例如页面错误)上,错误元素是最右边的元素,其掩码仍然设置(聚合顺序不保证,但故障顺序是,参见英特尔的手册条目) .

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

    在异步中断上,硬件可以类似地使聚集部分完成,使用掩码来记录进度 . IDK,如果任何硬件确实这样做,但ISA设计使该选项保持打开状态 .

    无论如何,这就是为什么你需要在循环内为每个聚集创建一个全新的全屏模板 .

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


    没有中断和重启机制的非常慢的指令包括wbinvd . (将所有缓存同步到主内存并使其无效) . Intel's manual mentions that wbinvd does delay interrupts.

    因此,使用WBINVD指令会对逻辑处理器中断/事件响应时间产生影响 .

    这可能是为什么它是一个特权指令 . 用户空间可以做很多事情来使系统变慢(例如占用大量内存带宽),但它不能过于显着地增加中断延迟 . (从ROB退出但尚未提交给L1d的商店可能会增加中断延迟,因为它们必须发生并且不能中止 . 但是在飞行中创建大量分散的缓存缺失存储的病态情况更难 . )

相关问题