并行与CPE

来自csapp第5章. 关于指令级并行, 我觉得一个典型的例子是多项式求值(练习5.5与练习5.6).
并行与CPE

并行与CPE
看这两个循环哪个会快一些?
如果没有并行的意识, 那么我想都会觉得第二个快, 因为第一个多了一次乘法操作.
但考虑到并行, 是第一个快. 第一个有两条关键路径. xpwr构成的, 和result构成的. 前者的CPE是5, 后者是3(浮点数的乘法和加法周期数). 它与第二个循环的区别是, xpwr并不依赖result, 不过result依赖xpwr. 这种情况下, 总用时应该是max(xpwr的延迟时间,result的延迟时间). 显然加法快于乘法, 因此是xpwr的延迟. 它的CPE是5. 为什么不考虑吞吐量下界? 因为达不到. 乘法功能单元貌似是2个, 周期数为5, 这意味着它支持10条指令的并行. 但现在只有2条乘法指令并行(分别是a[i]*xwpr与xpwr自己). 因此CPE就是5.
第二个, 关键路径同时有加法和乘法, 因为它们相互依赖, 加法要等乘法算完了才能进行, 乘法也要等加法算完了才行. CPE是8.
因此, 第一个快于第二个.
之前某博客说了cache. 两个例子结合起来, 说明: 只看操作次数没什么意义, 指令级并行和局部性可能都比它来得重要.

上一篇:subline 快捷键


下一篇:冷静看 5G:不应捧杀,更别抹杀