问题描述
所以我有一些实验的结果,我需要写一下流水线的效率。
我没有源代码,但我确实有时间用 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 处理器上运行。
- 无流水线:0.106 秒
- 2 层管道:0.064 秒
- 4 层管道:0.046 秒
- 8 层流水线:0.048 秒
很明显,从没有流水线到 4 层流水线,效率变得更好,但我正在努力思考为什么效率实际上从 4 层流水线到 8 层流水线变得最差。考虑到总和是由不同的寄存器完成的,那么不应该有任何类型的依赖风险影响这些值。我的一个想法是,可能没有足够的 ALU 一次处理超过 4 个浮点数,这会导致停顿,但它至少不会比 4 级流水线性能更好。我已经在 excel 中绘制了这些过程,试图找出出现停滞/气泡的位置,但我看不到任何。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)