【发布时间】:2013-07-08 06:21:25
【问题描述】:
优化编译器通常考虑通过软件流水线进行指令调度。但是既然有硬件流水线,我想知道软件流水线调度有什么好处?
【问题讨论】:
-
编译器对整体计算的了解比硬件更大,因此它可能能够通过软件调度更多地提高性能,而将最后的调整留给硬件调度。
标签: compiler-construction compiler-optimization
优化编译器通常考虑通过软件流水线进行指令调度。但是既然有硬件流水线,我想知道软件流水线调度有什么好处?
【问题讨论】:
标签: compiler-construction compiler-optimization
在某些情况下(特定于 CPU)的执行速度可能取决于执行顺序。使用软件流水线,编译器会重新排序您的语句以获得最佳顺序,如果可以这样做而不影响最终结果的话。
最佳顺序可能取决于现有的硬件流水线,或者某些寄存器可能在某些执行顺序下使用得更优化,等等。
【讨论】:
软件流水线可以使循环执行得更快。在某些情况下确实更快。
例如:
num = 100;
i = 0;
loop:
load r0 sp+i;
add r2 r1 r0;
i++;
if ( i < num) goto loop
在此示例中,添加指令必须等到r0 从内存中加载值。如果延迟是 3 个周期。那么每次迭代都会有 3 个循环的开销来执行这个循环。这可能是一个很大的开销。通过软件流水线可以减少一点点开销。
num = 100;
load r0 sp+0;
i=0;
loop:
add r2 r1 r0;
i++;
load r0 sp+i
if (i < num) goto loop
在第二种情况下,当程序进入循环时,在执行add 指令时它已经具有r0 中的值。在每次迭代中程序到达add 指令时,值在r0 中。所以延迟减少了。
PS:我刚刚使用了助记符来解释这个想法。这不是某些架构的真正汇编语言。
【讨论】: