在计算总和时了解管道不同层/阶段的效率

问题描述

所以我有一些实验的结果,我需要写一下流水线的效率。

我没有源代码,但我确实有时间用 4 层管道和 8 层管道对 100,000,000 个双精度数组求和。

求和的执行方式如下。

对于 4 层流水线

d0 = 0.0; d1 = 0.0; d2 = 0.0; d3 = 0.0;
for (int i = 0; i < N; i = i + 4) {
    d0 = d0 + a[i + 0];
    d1 = d1 + a[i + 1];
    d2 = d2 + a[i + 2];
    d3 = d3 + a[i + 3];
}
c = d0 + d1 + d2 + d3;

对于 8 层流水线

d0 = 0.0; d1 = 0.0; d2 = 0.0; d3 = 0.0;
d4 = 0.0; d5 = 0.0; d6 = 0.0; d7 = 0.0;
for (int i = 0; i < N; i = i + 8) {
    d0 = d0 + a[i + 0];
    d1 = d1 + a[i + 1];
    d2 = d2 + a[i + 2];
    d3 = d3 + a[i + 3];
    d4 = d4 + a[i + 4];
    d5 = d5 + a[i + 5];
    d6 = d6 + a[i + 6];
    d7 = d7 + a[i + 7];
}
c = d0 + d1 + d2 + d3 + d4 + d5 + d6 + d7;

我的结果显示了无管道、2 层管道、4 层管道和 8 层管道的以下时间值。无管道和 2 层管道的代码类似于我上面展示的代码。结果在 10 次运行中取平均值,如下所示。实验在 Intel Core i7-9750H 处理器上运行。

  1. 无流水线:0.106 秒
  2. 2 层管道:0.064 秒
  3. 4 层管道:0.046 秒
  4. 8 层流水线:0.048 秒

很明显,从没有流水线到 4 层流水线,效率变得更好,但我正在努力思考为什么效率实际上从 4 层流水线到 8 层流水线变得最差。考虑到总和是由不同的寄存器完成的,那么不应该有任何类型的依赖风险影响这些值。我的一个想法是,可能没有足够的 ALU 一次处理超过 4 个浮点数,这会导致停顿,但它至少不会比 4 级流水线性能更好。我已经在 excel 中绘制了这些过程,试图找出出现停滞/气泡的位置,但我看不到任何。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)