intel - 在计算总和时了解管道不同层/阶段的效率
问题描述
所以我有一些实验的结果,我需要写下流水线的效率。
我没有源代码,但我确实有时间将 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 处理器中运行。
- 无管道:0.106 秒
- 2 层管道:0.064 秒
- 4 层管道:0.046 秒
- 8 层管道:0.048 秒
很明显,从无管道到 4 层管道,效率会变得更好,但我正在尝试思考为什么效率实际上从 4 层管道到 8 层管道变得最差。考虑到总和是由不同的寄存器完成的,那么不应该有任何类型的依赖危害影响这些值。我的一个想法是,可能没有足够的 ALU 一次处理超过 4 个浮点数,这会导致停顿,但它至少不会比 4 级流水线执行得更好。我已经在 excel 中绘制了这些过程,以试图找到停顿/气泡发生的位置,但我看不到任何。
解决方案
推荐阅读
- internet-explorer-11 - fls.doubleclick.net 仅在 IE11 中下载缓慢
- python - 谷歌 SMTP 在发送邮件时出错
- python-3.x - 在 python 中使用 pandas 打印名为 12/12/12 的列
- google-cloud-platform - 从 Cloud Source 启动 Dataproc PySpark 作业
- java - Java 8 将简单的列表转换为地图
- c++ - 了解使用堆栈实现队列的递归调用机制
- c++ - 从资源视图访问对话框的问题
- python - python 3.7 list.pop 按名称而不是索引
- c# - 如何在列表视图上添加项目(每列)
- django - 如何为同一个静态数据设置多个 STATIC_URL?