Tri*_*ock 7 c c++ compiler-optimization
只要as-if规则成立,C&C++编译器就可以重新排序操作.编译器执行此类重新排序的示例是什么,通过这样做可以获得哪些潜在的性能提升?
欢迎在任何平台上涉及任何(C/C++)编译器的示例.
Pra*_*han 10
假设您正在执行以下操作:
int i=0,j=0;
i++;
i++;
i++;
j++;
j++;
j++;
Run Code Online (Sandbox Code Playgroud)
暂时忽略三个增量可能会被编译器优化为一个+=3,如果您将操作重新排序为最后,您将最终获得更高的处理器 - 管道吞吐量
i++;
j++;
i++;
j++;
i++;
j++;
Run Code Online (Sandbox Code Playgroud)
因为在前一种情况下j++不必等待i++while 的结果,所以大多数指令都对前一条指令有数据依赖性.在更复杂的计算中,在没有简单的方法来减少要执行的指令数量的情况下,编译器仍然可以查看数据依赖性并重新排序指令,以便根据早期指令的结果的指令尽可能远从它尽可能.
这种优化的另一个例子是当你处理纯函数时.再看一个简单的例子,假设你有一个纯函数f(int x),你在循环中求和.
int tot = 0;
int x;//something known only at runtime
for(int i = 0; i < 100; i++)
tot += f(x);
Run Code Online (Sandbox Code Playgroud)
由于f是一个纯函数,编译器可以根据需要重新排序对它的调用.特别是,它可以将此循环转换为
int tot = 0;
int x;//something known only at runtime
int fval = f(x);
for(int i = 0; i < 100; i++)
tot += fval;
Run Code Online (Sandbox Code Playgroud)
我确信有很多例子表明重新排序操作会产生更快的性能。一个明显的例子是尽早重新排序负载,因为这些操作通常比其他 CPU 操作慢得多。通过在获取内存的同时执行其他不相关的工作,CPU 可以节省总体时间。
也就是说,考虑到这样的事情:
expensive_calculation();
x = load();
do_something(x);
Run Code Online (Sandbox Code Playgroud)
我们可以像这样重新排序:
x = load();
expensive_calculation();
do_something(x);
Run Code Online (Sandbox Code Playgroud)
因此,当我们等待加载完成时,我们基本上可以expensive_calculation()免费完成。
| 归档时间: |
|
| 查看次数: |
1434 次 |
| 最近记录: |