处理器管道状态保存

时间:2015-09-11 14:28:14

标签: linux-kernel arm x86-64 cpu-architecture

是否存在处理器流水线的状态(已经解码或预取的指令)被保存并随后在线程休眠/上下文切换/中断等期间恢复后重新加载的情况? (可以作为优化)。

2 个答案:

答案 0 :(得分:4)

对于我所知道的任何CPU都不可能。这样做没有接口,也没有CPU独立完成的条件。将大量内部CPU状态转储到RAM将花费比保存更多的周期。让操作系统跟踪所需的可变大小的RAM块只会使开销变得更糟。

如果有什么值得保存,顺便说一句,那就是已经执行的指令的结果还不能退出,因为缓存中错过了一个负载。 (主流ISA的所有常见的无序执行设计都使用有序退役来支持精确的异常。已经提出了对异常和误预测进行检查点/回滚的无序退出。搜索公用指令处理器,IIRC。 )

(缺陷的想法):一个积极的无序设计可以通过在外部中断到来时延迟写入中断返回地址来避免在上下文切换上浪费太多工作。也就是说,他们可以通过允许管道中已有的一些指令继续执行来假装中断进入的时间晚于它。如果在中断处理程序返回之前不需要用户空间指令指针,则CPU可以清除管道。

Hrm,这有一个主要困难,即进入中断处理程序的寄存器值也取决于架构状态,所以这可能无法工作。

这个def。不适用于用户空间生成的中断,因为它修复了返回地址。

对于在使用monitor / mwait或其他东西等待自旋锁时让自己进入睡眠状态的线程,这不是问题。 mwait大概在退休之前不会生效,并且在完成之前的所有工作之前不会退休。我认为,它会破坏CPU在推测性地执行过去mwait方面的积极性。或者mwait甚至不会冲洗管道,只是节省电力。

答案 1 :(得分:2)

这个想法已被提出,但你需要一个更密集的内存技术,现在才变得可用。例如,参见本文:

http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=6489970

基本上,他们提出的管道由一组新的锁存器组成。基于忆阻器(电阻性非易失性存储器组件)的寄存器,可以保存对应于多个线程的多个值。然后,控制逻辑可以告诉所有锁存器哪个线程应该处于活动状态,并允许在整个管道中同时进行上下文切换。

请记住,这只会增加锁存级别的粒度。具有同步多线程的现代CPU已经可以在不同的单元级别上具有不同的线程,而无需上下文切换,通过仲裁简单。具有固有并行性的其他单元可能已经在每个周期处理多个线程(例如, - 多端口ALU)