并行与CPE
来自csapp第5章. 关于指令级并行, 我觉得一个典型的例子是多项式求值(练习5.5与练习5.6).
看这两个循环哪个会快一些?
如果没有并行的意识, 那么我想都会觉得第二个快, 因为第一个多了一次乘法操作.
但考虑到并行, 是第一个快. 第一个有两条关键路径. 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. 两个例子结合起来, 说明: 只看操作次数没什么意义, 指令级并行和局部性可能都比它来得重要.