如何强制CPU按顺序执行程序而没有任何循环或分支?

Rec*_*ker 2 compiler-construction cpu gcc cpu-architecture

可能吗?对于没有任何分支/循环的小代码。是否有gcc诸如SSE x86和其他处理器系列的标志或内在指令?我很好奇,因为这些天所有可用的处理器都遵循乱序执行模型。

提前致谢

osg*_*sgx 5

大多数现代乱序CPU本质上都是乱序的,无法在乱序和乱序模式之间进行切换。

您可以尝试找到一些有序的CPU,其中有一些:

  • x86:Intel Atom(仅45 nm和更早的版本;它们具有两个并行管线,但是按顺序执行所有指令)
  • 手臂:Cortex-A8和许多较旧的内核;

虽然不可能在典型的乱序CPU中直接关闭指令重排序,但是您可以在每条指令之间注入一些序列化的东西(例如cpuid在x86环境中)以模拟顺序执行。

英特尔手册(vol 3a)中有一部分关于序列化指令(从http://objectmix.com/asm-x86-asm-370/69413-serializing-instructions.html复制):

第3A卷:系统编程指南规定

7.4序列化说明

英特尔64和IA-32架构定义了多个序列化指令。这些指令迫使处理器完成前一条指令对标志,寄存器和存储器的所有修改,并在提取和执行下一条指令之前将所有缓冲的写操作排入存储器。例如,当使用MOV到控制寄存器的指令将新值加载到控制寄存器CR0中以启用保护模式时,处理器必须执行串行化操作才能进入保护模式。此序列化操作可确保在切换到保护模式之前,完成在处理器处于实地址模式时启动的所有操作。

指令序列化的概念已引入奔腾处理器的IA-32体系结构中,以支持并行指令执行。串行化指令对于没有实现并行指令执行的Intel486和更早版本的处理器没有意义。

重要的是要注意,在P6和更新的处理器系列上执行序列化指令会限制推测性执行,因为推测性执行指令的结果将被丢弃。以下说明是序列化说明:

o特权序列化指令-MOV(用于控制寄存器,MOV CR8除外),MOV(用于调试寄存器),WRMSR,INVD,INVLPG,WBINVD,LGDT,LLDT,LIDT和LTR。

o非特权序列化指令-CPUID,IRET和RSM。

当处理器将指令执行序列化时,它确保在执行下一条指令之前,所有未决的内存事务已完成(包括存储在其存储缓冲区中的写操作)。任何东西都不能传递序列化指令,序列化指令也不能传递任何其他指令(读,写,指令提取或I / O)。例如,除了修改EAX,EBX,ECX和EDX寄存器外,可以在任何特权级别执行CPUID以序列化指令执行,而对程序流程没有影响。