本节书摘来自华章计算机《高性能科学与工程计算》一书中的第1章,第1.7节,作者:(德)Georg Hager Gerhard Wellein 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.7 习题
1.1 除法的速度。写一段代码对下列函数积分:
x从0~1,结果应该是π的近似值。用一个简单的矩形积分就可以实现,即矩形宽为xi,步长Δx,高为f(xi),对面积累加:
https://yqfile.alicdn.com/11ffab67a981a59cd14a151369a5f6e148d4e87a.png" >
完成程序段,选择合适的Δx,判断结果是不是π的近似值,并计算性能,结果单位为MFlop/s。假设浮点除法不能被流水线运行,试估计延迟为多少时间周期。
1.2 数据依赖。在1.2.3节我们讨论了流水线,请看以下代码:
s是一个非零的双精度浮点标量,ofs是一个正整数,A是一个长度为N的双精度数组。如果N足够小,能使数组A的元素在L1 cache中都能命中,对于不同的ofs,请预计循环的性能。
1.3 硬件预取。预取是一个有效利用内存接口的重要操作。x86设计的硬件预取通常一次取满整内存页数据。试说明这可能对程序性能产生的负面效应。
1.4 点积和预取。考虑双精度浮点数的点积操作:
https://yqfile.alicdn.com/25e3361b8572c5b691ce0f1ddcb946c54b36d54d.png" >
N非常大。CPU(时间周期为1ns)能在一个周期内做一次读取(或者存储),一次乘法和一次加法(假设循环计数和分支不产生时间消耗)。存储总线的传输速率为3.2GB/s。假设从存储读取一个cache行的延迟为100个CPU周期,一个cache行的长度为4个双精度浮点数。在以下情况下:
(a)如果没有指令预取,循环的性能怎样?
(b)假设CPU有预取的能力,为了使代码有效利用带宽(隐藏延迟),需要CPU能容忍预取多少条指令?
(c)如果cache行的长度变为以前的2倍、4倍,(b)中算出的数值会怎样变化?
(d)如果我们假设指令预取能隐藏所有的延迟,循环的性能怎样?