|
|
|
|
移动端

2.4.6 算术效率和指令级并行

《高性能并行珠玑:多核和众核编程方法》第2章从正确到正确&高效:Godunov格式的Hydro2D案例学习,本章将探讨一段科学模拟代码,这段代码是一个以气体动力学为基础的模拟程序。这份程序的输出结果正确,但(初始版本)性能欠佳。本节为大家介绍算术效率和指令级并行。

作者:张云泉 等译来源:机械工业出版社|2017-11-14 17:52

技术沙龙 | 6月30日与多位专家探讨技术高速发展下如何应对运维新挑战!


2.4.6 算术效率和指令级并行

现代处理器的微架构是非常精细的,但掌握一定基础后就可以依照此进行优化。

记住。除法和超越数学函数对计算机而言代价是很高的,即便当直接被指令集支持时,也是这样,它们通常会比乘法和除法慢1~2个数量级。这份参考Hydro2D代码使用了很多除法和开方操作,这些操作占据了程序大量的运行时间。硬件中执行这些操作的功能单元可成为运算流水线的瓶颈,它会限制吞吐量和指令级并行。

因为这些操作如此昂贵,同时一些平方根和除法要重复多次计算,所以一些经常使用的值可以之前就计算好。在原始代码中,constoprim()、equation_of_state()和trace()都是ρ和c(声音的本地速度)相除许多次的操作。可以计算它们的倒数并把结果记录下来用于之后的流量计算。除此之外,相对于除法,使用倒数和乘法在现代操作系统中更快。要知道很多编译器出于精度考虑不会自动做这样的转换。

分解。Hydro2D代码最核心的部分(Newton-Raphson迭代,位于riemann.c中)有8次除法;参考图2-18。使用迭代中简单的代数操作,我们能够减少这些操作的数量。检查迭代的更新Δp*,我们将会看到表达式(从图2-18中第15行开始)。

(这里,r是媒介的隔热率,在该方法中是一个常数。)结合式(2-3a)和式(2-3b)~(2-3g),我们能够减少总的除法数量:

这个等式消除了中间值ql,r和u*l,r同时没有引入额外的除法。最终我们能够结合w′lr与式(2-3c)从而避免除法。

对w′r使用相似的表达式;使用我们重写的式(2-4)和式(2-5),我们又减少了Newton-Raphson迭代中除法/求倒数的数量,从原先的8个减少到两个。参考图2-19中优化的代码。

进一步优化性能。使用结合了旋转更新的线程级/内存分块方法,以及结合了数值计算方法提升的Courant/更新方法后,对于程序性能的提升会在图2-20中展示。我们看到我们的使用了特定的指令和计算使得处理器性能提升了1.2~1.7倍,协处理器提升了1.4~1.6倍。再一次,使用提升计算环境的原则和完全一样的代码在两种架构上得到了相似的加速比。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

ASP.NET 2.0数据库开发实例精粹

本书分为8章,首先介绍ASP.NET的开发技巧和重点技术,尤其针对初学者如何快速入门并掌握ASP.NET编程做了深入浅出的介绍;然后重点介绍ASP.N...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊