【发布时间】:2018-10-06 04:50:45
【问题描述】:
我正在研究处理器,引起我注意的一件事是高性能 CPU 能够execute more than one instruction during a clock cycle 甚至execute them out of order 以提高性能。所有这一切都没有编译器的任何帮助。
据我了解,处理器能够通过分析 data dependencies 来确定哪些指令可以先运行/在同一 ILP 并行步骤(问题)中运行。
@edit
我会试着举个例子。想象一下这两段代码:
int myResult;
myResult = myFunc1(); // 1
myResult = myFunc2(); // 2
j = myResult + 3; // 3
-
int myFirstResult, mySecondResult;
myFirstResult = myFunc1(); // 1
mySecondResult = myFunc2(); // 2
j = mySecondResult + 3; // 3
它们都做同样的事情,不同之处在于第一次我重用了我的变量,而第二次我没有。
我假设(如果我错了,请纠正我)处理器可以在第二个示例的指令 1 之前运行指令 2 和 3,因为数据将存储在两个不同的位置(寄存器?)。
对于第一个示例,这是不可能的,因为如果它在指令 1 之前运行指令 2 和 3,则分配给指令 1 的值将保存在内存中(而不是来自指令 2 的值)。
问题是:
如果我重用变量(如第一个示例),是否有任何策略在 1 之前运行指令 2 和 3?
或者重用变量会阻止指令级并行性和 OoO 执行?
【问题讨论】:
-
你需要举个具体的例子。 “处理器”不是一种编程语言。每个 ISA 都有自己的规则和指南,每种编程语言、编译器和相关的运行时也规定了一些事情。变量只是对人类的一种方便。 CPU 看不到这样的东西。
-
另外,请记住,“没有优化”并不是“从这段代码到汇编的最愚蠢的转换”。例如,如果编译器必须将代码翻译成SSA form(比如说,因为这是编译的两个阶段之间选择的中间表示),那么就不会有变量重用,无论什么可能出现在源代码中。
-
您可能还想阅读Register Renaming
-
@tadman 我试着举个例子。然而,在写这个问题时,我在想如果理论上有任何 CPU(它们中的任何一个)可以实施来解决这个问题的策略(比如@Damien_The_Unbeliever 指出的寄存器重命名技术)。不知道它是否适合网站的范围,虽然
-
@Damien_The_Unbeliever 是的!注册重命名绝对是我一直在寻找的东西。关于“无优化”:我的意思是编译器不会检测到这是一个错误的依赖项并使用不同的寄存器(这会是一种优化吗?)
标签: parallel-processing processor instructions