c++ - 优化输送机执行

标签 c++ c cpu compiler-optimization hpc

在执行指令之前的传送带架构中,它们被分解成更小的指令。所以他们跑得更快。但是在整个指令执行完之前,不可能再执行寻址到相同寄存器的后续指令。 是这样吗,为了优化指令的顺序,这些指令会吸引同一个寄存器(或 RAM 单元),这些指令彼此之间的距离尽可能远? 或者这没有意义,因为编译器会以这种方式 self 优化?

例如:

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;

最佳答案

这显然取决于您的编译器和架构。现代 X86 处理器支持 out of order execution ,这意味着处理器实际上不需要按顺序执行指令。相反,它会提前读取一些指令(实际上它甚至不是那么少)并在执行前重新排序以获得更好的性能。这意味着这种优化对于乱序 cpus 来说真的没有必要,因为实际的执行顺序不依赖于代码中指令的顺序。

对于有序架构(例如 Cell),指令的顺序很重要。然而,在许多情况下,经过适当优化的编译器很可能能够自行重新排序(只要它能证明这不会改变代码的行为)。它可能无法这样做的主要场景是,如果涉及指针(或 volatile 变量),因为在大多数情况下,编译器无法证明不同的指针不指向相同的指针多变的。在这种情况下,__restrict 之类的东西可以提供帮助。

要考虑的另一点是,在许多情况下,诸如整数乘法之类的延迟不会真正影响运行时,因为对于许多程序而言,性能更多地受内存访问限制。在确实有所不同的情况下,考虑使用 simd 和/或多线程优化代码,然后再考虑指令放置可能更有用。

总而言之,我会说这种优化在编译语言中并不是很有用(编写汇编时情况可能会有所不同),因为 cpu 和编译器都可能改变顺序,甚至可能不会做出改变。这并不意味着这种优化在任何情况下都没有用,但实际上只有在最关键的代码路径中,当证明编译器/cpu 无法完成任务时。

关于c++ - 优化输送机执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12602832/

相关文章:

c++ - 模仿 socket.h (C++) 的 OpenSSL 包装器

linux - [Linux]按组或用户限制CPU使用

javascript - 比较列表时我的 Node.js 会锁定吗?

R降雪并行,Rscript.exe随着时间的推移逐渐变得不活跃

c++ - 找不到导入的项目 "C:\Microsoft.Cpp.Redirect.14.props"

c++ - 处理命令行参数,允许任何顺序

c - 使用链表创建堆栈时出错

C 从字符串中删除字符

c++ - 引用TC++PL第3版10.4.6.3 "copying members"部分

C++ 简单条件记录