《高性能科学与工程计算》——2.2 优化常识

简介:

本节书摘来自华章计算机《高性能科学与工程计算》一书中的第2章,第2.2节,作者:(德)Georg Hager Gerhard Wellein 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.2 优化常识

简单的代码修改经常会带来性能的显著提升。下面的章节总结了避免性能缺陷的几个最重要的“优化常识”。这些方法看似微不足道,但许多科学应用程序在应用这些方法后,性能都有了显著提升。
2.2.1 少做工作
重新组织代码以减少代码工作量,在很多情况下可显著提升性能。最常见的例子是循环检测一组对象是否具有特定属性,任一对象具备该属性即可:


b144ea7625d565fcd44311ee8b798ffafae9b3e4

如果complex_func()函数没有其他作用,FLAG是唯一和循环外部通信的变量。这种情况下,FLAG值一经改变,就立即退出循环可明显减少计算工作量(取决于条件判断变为true的概率):

<a href=https://yqfile.alicdn.com/b7d273e971274bde46269576ca7d51640b7cc023.png
" >

2.2.2 避免耗时运算
算法的实现通常采用“步步为营”的策略。首先不做性能方面(因为在进行性能优化时,往往存在更改数值运算的风险)的考虑,将公式直接翻译成代码。第二步使用“便宜”运算替代“昂贵”运算。三角函数和幂运算是“强”运算(“昂贵”运算)的典型代表。记住类似x *2.0的表达式是不会被编译器优化成xx的,而指数(对数)的运算性能是很低的。避免“昂贵”运算的优化方法称为强度消减(strength reduction)。除上述简单情况外,“强”运算有时会关联一组有限的固定参数。下面是一个非平衡自旋系统仿真代码的例子:

121cd17dcca4a89ffec2ca3408165bf1fe15c9ea

程序的最后两行代码包含在一个循环中,并占用该应用程序几乎全部的运行时间。整型变量用于存储自旋取向(向上或者向下,对应值为1或者-1),所以变量edelz的取值范围为{-6,…,+6}。在整个应用程序中,tanh()函数即便用硬件实现也是最耗时的操作(至少几十个时钟周期)。根据以上描述,可根据参数范围将该函数结果转存在一个数组中,循环内部完全消除对tanh()函数的调用。假设tt为定值,那么这个表格只需创建一次:

<a href=https://yqfile.alicdn.com/3f76ed1878eb497ec08fa747a0e19cea569a20e9.png" >

这个数组存储在访存性能非常高的L1 cache中。因此,相对于tanh()函数,该数组的查找时间可以忽略不计。由于该数组尺寸较小且被频繁调用,所以整个计算过程都会被存储在L1 cache中。
2.2.3 缩减工作集
程序代码在计算过程中或至少在整体运行时间中的内存使用量称为该代码的工作集。一般情况下,压缩工作集会提高cache命中率,对性能提升有正面影响。如何实现工作集压缩以及是否会带来性能提升,很大程度上取决于算法和它的实现。上例中,原始代码使用了4字节的整除存储自旋取向,工作集也因此远远大于所有处理器的L2 cache。如果改变数组定义,使用1字节的整数来存储自旋取向。工作集会因此减小将近4倍,从而接近cache大小。
然而,并不是所有处理器都能有效处理“小”数据类型。如果处理器采用较大的字长,单字节类型数据通过移位和标记操作抽取,那么使用单字节整型数据的程序会非常低效。另一方面,如果可以采用SIMD指令,那么采用简单数据类型的程序就会非常高效(具体见2.3.3节)。
相关文章
|
存储 缓存 Android开发
android分区概述
android分区概述
845 0
|
Java
SpringBoot实现文件上传接口
文件上传是很多业务场景需要实现的功能,今天就简单以Springboot框架为基础实现文件上传的接口。
2664 0
SpringBoot实现文件上传接口
|
缓存 监控 安全
构建高效后端系统的最佳实践
本文将深入探讨如何构建一个高效的后端系统,从设计原则、架构选择到性能优化等方面详细阐述。我们将结合实际案例和理论分析,帮助读者了解在构建后端系统时需要注意的关键点,并提供一些实用的建议和技巧。
290 6
|
11月前
|
存储 关系型数据库 分布式数据库
PolarDB PG 版冷热数据分层功能介绍
本文介绍了云原生数据库PolarDB PG版的冷热数据分层存储功能,涵盖其原理、特性及最佳实践。冷热分层存储通过将冷数据归档至OSS(对象存储服务),实现低成本高效存储,同时保持SQL操作透明性和性能优化。支持多种分层模式,如表与索引分层、大字段独立归档等,并提供压缩和缓存机制以提升访问速度。此外,还介绍了如何通过DDL语句轻松转存数据至OSS,以及一系列最佳实践,包括自动冷热分层、无锁表转存和一键转存等功能。
714 36
|
11月前
|
机器学习/深度学习 开发框架 人工智能
操作系统生态兼容与创新的平衡艺术
本次分享的主题是操作系统生态兼容与创新的平衡艺术,由中科方德周杰分享。主要分为五个部分: 1.操作系统生态中的兼容与创新之争 2.版本进化中库兼容与隔离平衡 3.跨架构生态的隔离与统一 4.多系统融合的生态新可能 5.生态兼容与创新平衡
298 2
|
Oracle Java 关系型数据库
Java SpringBoot集成Activiti7工作流
Java SpringBoot集成Activiti7工作流
|
SQL 数据库 关系型数据库
【SQL注入】 注入神器sqlmap的使用
数据库 SQL注入漏洞 sqlmap
720 2
|
量子技术
量子雷达:隐身技术的挑战者与未来防御系统
【9月更文挑战第19天】量子雷达凭借其突破隐身技术、高灵敏度及抗干扰性的优势,正成为未来防御系统的关键组成部分。本文深入探讨了量子雷达如何挑战传统隐身技术,并介绍了其在反隐身作战、导弹防御及空间探测等领域的广阔应用前景。随着技术进步,量子雷达将彻底改变现代战争模式,提升防御体系的效能。中国在这一领域已取得显著进展,展现出量子雷达的强大潜力。
|
Oracle 关系型数据库 数据库
Oracle 11gR2学习之三(创建用户及表空间、修改字符集和Oracle开机启动)
Oracle 11gR2学习之三(创建用户及表空间、修改字符集和Oracle开机启动)
|
存储 编解码 监控
一文详解|如何写出优雅的代码
和大家一起探讨一下优雅代码
121020 20
一文详解|如何写出优雅的代码