首页 > 解决方案 > 在计算总和时了解管道不同层/阶段的效率

问题描述

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

我没有源代码,但我确实有时间将 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;

我的结果显示了 No pipeline 、 2 layer pipeline 、 4 layer pipeline 和 8 layer pipeline 的以下时间值。无管道和 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 中绘制了这些过程,以试图找到停顿/气泡发生的位置,但我看不到任何。

标签: intelcpu-architectureprocessorpipelining

解决方案


推荐阅读