在执行指令之前的Conveyor架构中,它们被分解为较小的。所以他们运行得更快。但是在指令执行整个之前,不可能执行以下指令寻址到相同的寄存器。 这是正确的,为了优化对同一寄存器(或RAM单元)有吸引力的指令的顺序,这些指令的位置尽可能远离彼此吗? 或者在这方面没有任何意义,因为编译器会自行优化这种方式吗?
例如:
int a = 1, b = 2, c = 3;
a *= a;
b *= a; // stop and waiting for the end of calculating (a)
c *= c;
优化
int a = 1, b = 2, c = 3;
a *= a;
c *= c; // calculating (a), but we don't need this and don't stop
b *= a;
答案 0 :(得分:1)
这显然取决于您的编译器和架构。现代X86处理器支持out of order execution,这意味着处理器实际上不需要按顺序执行指令。相反,它将提前读取一些指令(实际上它甚至不是那么少)并在执行前重新排序它们以获得更好的性能。这意味着对于乱序cpus来说,这种优化实际上并不是必需的,因为实际执行顺序不依赖于代码中指令的顺序。
对于有序架构(例如Cell),指令的顺序很重要。然而,在许多情况下,正确优化的编译器很可能能够自行重新排序(只要它可以证明,这不会改变代码的行为)。如果涉及指针(或volatile
变量),则可能无法执行此操作的主要方案是,因为在大多数情况下,编译器无法证明不同的指针不指向同一变量。 __restrict
之类的内容可以帮助解决这个问题。
要考虑的另一点是,在许多情况下,整数乘法之类的延迟不会对运行时产生实际影响,因为对于许多程序而言,性能受内存访问的限制。如果它确实有所作为,考虑使用simd和/或多线程来优化代码,然后考虑指令放置可能更有用。
总之,我会说这种优化在编译语言中并不真正有用(当编写汇编时情况可能不同),因为cpu和编译器都可能会改变顺序而且它甚至可能都不会做出改变。这并不意味着没有这种优化有用的情况,但实际上只有在最关键的代码路径中,才能证明编译器/ cpu不能完成任务。 / p>