Parallel processing 重用变量对指令级并行性和OoO执行有害吗?

Parallel processing 重用变量对指令级并行性和OoO执行有害吗?,parallel-processing,processor,instructions,Parallel Processing,Processor,Instructions,我正在研究处理器,有一件事引起了我的注意,那就是高性能CPU有能力甚至是为了提高性能。所有这些都没有编译器的帮助 据我所知,处理器可以通过分析来确定哪些指令可以在同一ILP并行步骤(问题)中首先运行 @编辑 我试着举个例子。想象一下这两段代码: int myResult; myResult = myFunc1(); // 1 myResult = myFunc2(); // 2 j = myResult + 3; // 3 - 它们都做相同的事情,区别在于第一次我重用了变量,第二次我

我正在研究处理器,有一件事引起了我的注意,那就是高性能CPU有能力甚至是为了提高性能。所有这些都没有编译器的帮助

据我所知,处理器可以通过分析来确定哪些指令可以在同一ILP并行步骤(问题)中首先运行

@编辑

我试着举个例子。想象一下这两段代码:

int myResult;

myResult = myFunc1(); // 1
myResult = myFunc2(); // 2
j = myResult + 3;     // 3
-

它们都做相同的事情,区别在于第一次我重用了变量,第二次我没有

我假设(如果我错了,请纠正我)处理器可以在第二个示例中的指令1之前运行指令2和3,因为数据将存储在两个不同的位置(寄存器?)

对于第一个示例,这是不可能的,因为如果它在指令1之前运行指令2和3,则分配给指令1的值将保留在内存中(而不是指令2的值)

问题是

如果我重用变量(如第一个示例中所示),是否有在1之前运行指令2和指令3的策略


还是重复使用变量会阻止指令级并行和OoO执行?

现代微处理器是一种极其复杂的设备,其复杂性已经足以让大多数人无法理解其功能的每一个方面。编译器或运行时引入了一个额外的层,这增加了复杂性。这里只能从一般性的角度来讨论,因为ARM处理器X可能比ARM处理器Y更能处理这一问题,而且两者都不同于Intel U或AMD V

更仔细地查看您的代码:

int myResult;

myResult = myFunc1(); // 1
myResult = myFunc2(); // 2
j = myResult + 3;     // 3
intmyresult
行不一定在CPU方面做任何事情。它只是指示编译器将有一个名为
myResult
int
类型的变量。它还没有初始化,所以还不需要做任何事情

在第一次赋值时,不使用该值。默认情况下,编译器通常会将代码直接转换为机器指令,但当您打开优化(通常对生产代码进行优化)时,这种假设就不存在了。一个好的编译器会意识到这个值从未被使用过,并且会忽略赋值。更好的编译器会警告您该值从未使用过

第二个变量实际分配给变量,该变量稍后使用。显然,在第三次任务发生之前,第二次任务必须完成。这里没有太多的优化可以进行,除非这些函数是琐碎的并且最终是内联的。然后是这些函数做什么的问题

一个“超标量”处理器,或者一个能够无序运行的处理器,对于它的雄心壮志是有限制的。它最适合的代码类型如下所示:

int a = 1;
int b = f();
int c = a * 2;
int d = a + 2;

int e = g(b);
a
的赋值是直接和直接的<代码>b是一个计算值。有趣的是,
c
d
具有相同的依赖性,实际上可以并行执行。它们也不依赖于
b
,因此理论上,只要结束状态正确,它们可以在
f()
调用之前、期间或之后运行

一个线程可以同时执行多个操作,但大多数处理器对这些操作的类型和数量都有限制。例如,可能发生浮点乘法和整数加法,也可能发生两个整数加法,但不能发生两个浮点乘法运算。这取决于CPU有哪些操作,哪些寄存器可以操作,以及编译器如何预先安排数据

如果你想优化代码,节省纳秒的时间,你需要在你的目标CPU上找到一本非常好的技术手册,还要花上数不清的时间尝试不同的方法和基准测试


简言之,变量并不重要。所有这些都是关于依赖关系、编译器以及CPU的功能。

您需要给出一个具体的例子。“处理器”不是一种编程语言。每个ISA都有自己的规则和指导方针,每种编程语言、编译器和相关的运行时都会规定一些事情。变量只是人类的一种方便。CPU看不到这样的事情。另外,请记住,“没有优化”并不是“尽可能地将代码转换成程序集”。例如,如果编译器必须将代码翻译成(例如,因为这是两个编译阶段之间选择的中间表示形式),那么无论源代码中出现什么,都不会有变量重用。您可能还需要阅读@tadman,我试着给出了一个示例。然而,在写这个问题时,我在想,理论上,CPU(其中任何一个)是否可以实现任何策略来解决这个问题(如@Damien_the_unsiver所指出的寄存器重命名技术)。不知道它是否适合网站的范围,though@Damien_The_Unbeliever对注册重命名绝对是我一直在寻找的东西。关于“无优化”:我的意思是编译器不会检测到这是一个错误的依赖项,也不会使用不同的寄存器(这会是一个优化吗?)谢谢你的回答!真的帮了大忙:)顺便说一句,我只是想更好地理解这是怎么发生的。我想如果我不得不走这么低的距离来优化代码,我会发疯的哈哈
int a = 1;
int b = f();
int c = a * 2;
int d = a + 2;

int e = g(b);