公开/公告号CN103049245A
专利类型发明专利
公开/公告日2013-04-17
原文格式PDF
申请/专利权人 浪潮电子信息产业股份有限公司;
申请/专利号CN201210411973.5
申请日2012-10-25
分类号G06F9/38(20060101);G06F9/50(20060101);
代理机构
代理人
地址 250014 山东省济南市高新区舜雅路1036号
入库时间 2024-02-19 18:28:18
法律状态公告日
法律状态信息
法律状态
2015-12-02
授权
授权
2014-04-09
实质审查的生效 IPC(主分类):G06F9/38 申请日:20121025
实质审查的生效
2013-04-17
公开
公开
技术领域
本发明涉及计算机高性能计算领域, 具体地说是一种基于CPU多核平台的软件性能优化方法。
背景技术
硬件系统在新技术的推动下进行着快速演进,表现出更好的性能、更低的价格,如传统CPU从单核向多核直至众核发展。随着多核体系结构处理器的普及,应用软件多进/线程并行处理方式将逐渐成为主流。
硬件发展的最终目的是推动应用软件的表现,进而推进整个计算系统的性能。但随着计算设备体系结构的多样化,多核化,软件系统仅仅依靠硬件的更新从而获得性能提升的方式已经不符合现有硬件的发展趋势,例如传统的单线程串行程序在多核计算设备下不能表现出更好的性能。因此软件系统必须摒弃原有继续享用免费午餐的方式,不能仅仅依靠硬件性能的发展,而应该同时针对硬件系统的发展进行软件系统的再次开发和更新。这也是目前计算架构下我们遇到的最大挑战,而软件系统的再次开发和改造则显得极为必要。
为了提高现有软件系统在新计算设备架构下的性能表现,针对软件系统进行再开发具有很强的现实意义。
目前国内外针对CPU多核体系结构的应用开发在CPU多核发展之初就如火如荼地展开了,并陆续开发或改造出相当数量的应用。
本方法关注于传统单线程串行软件的并行化改造,利用当前主流的多核CPU计算设备,最大化提升计算资源利用率,提升软件效能。
发明内容
本发明的目的是提供一种基于CPU多核平台的软件性能优化方法。
本发明的目的是按以下方式实现的,内容包括:
1)软件运行特征分析;是对应用软件进行运行特征采样与分析,定位软件性能瓶颈,特征采集与分析,需要代码分析与实验测试结合,并且善于使用软件运行特征分析工具,软件运行特征分析工具主要有用户自有性能分析工具、商业性能分析软件或开源性能分析软件;
2)性能优化方案制定;包含三个方面:并行模型方案设计、并行库的选择、进程/线程性能优化方案,其中:
并行模型方案设计,主要涉及并行层次与并行粒度设计、核心计算并行算法设计、异步并行处理框架设计、多缓冲设计、负载均衡设计、线程/进程通信设计、线程/进程函数优化;
并行库的选择,主要考滤并行模型、软件开发效率与项目周期、并行库的适用性、灵活性、性能及其开发效率;
进程/线程性能优化方案,内容有:进程/线程调度优化、任务调度优化、热点算法模型优化、访存优化、cache优化、数学函数库优化、指令优化、编译器优化,性能优化方案实施与迭代调优,并重复调优——测试——调优过程,进行迭代优化;
具体优化流程及其实施步骤、细则如下:
1)软件运行特征分析:分析软件运行特征,定位软件性能瓶颈应用软件运行特征分析,精准定位软件的性能瓶颈,使优化工作有的放矢,大大提高优化的效率;应用软件运行特征分析的原则有:
(1)系统与局部分析结合
软件整体框架与软件局部模块分析都很重要,互为补充,综合全面地掌握应用软件的运行特征;
(2)定性与定量分析并重在优化开发周期有限的条件下,定性分析为工程师指明工作方向,专注于软件的主要瓶颈,而定量分析界定了性能提升的理论极限;
(3)工具采样与代码分析结合软件运行特征分析过程中,工具采样分析与代码分析两种手段互为补充、互为指导工具采样分析,可以帮助程序员快速定位程序热点,而代码分析,为程序热点找到理论依据,从而使热点与代码映射起来;
软件运行特征分析工具,具有高效全面、数据完备直观特点,在整个性能优化过程中都能发挥极大作用;
软件运行特征分析工具,可以采集应用软件运行过程中的CPU利用率、内存特征、磁盘特征、网络特征、指令CPI信息;
软件热点分析工具,可以采集应用软件运行时各函数CPU使用率及其百分比、分析线程时序、分析程序并发度、检查软件内存和线程缺陷;
(4)宏观与微观分析结合应用软件的运行特征分析,既有高层次的宏观分析,也有底层的微观分析,宏观呈现现象,微观揭示原理,宏观分析指明优化方向,微观分析指导优化的手段;
2)性能优化方案制定:制定综合、全面的性能优化方案
(1)优化方案的总体思想高效利用系统资源,包括多核计算资源、内存资源、磁盘资源、网络资源;
(2)优化层次、效率、开发周期的关系;
优化层次与优化效率的关系:物理模型>数学模型>算法模型;
优化层次与优化周期的关系:物理模型<数学模型<算法模型;
(3)并行模型设计
1.并行算法设计
优异的并行算法,是性能优化的前提条件和基础;
深入分析数据依赖关系,充分挖掘算法的并行性,必要时,对现有算法进行并行性改造,从而最大限度减少数据依赖和交换,提高算法的并行度,并行度越高,并行可扩展性越好;
2.选择合适的并行粒度或层次
定义:高层次或外层循环,并行为粗粒度并行,低层次或内层循环,并行为细粒度并行;
并行粒度的选择非常关键,主要考虑以下因素:
a) 算法的并行性与并行的可扩展性:不同的并行粒度,数据依赖关系不同,导致并行度也不同,制定并行方案时,要充分挖掘算法的并行性,必要时,对现有算法进行并行性改造,从而最大限度减少数据依赖和交换,提高算法的并行度,并行度越高,并行可扩展性越好;
b) 并行效率——线程调度开销:并行粒度越小,线程调度越频繁,开销越大,兼顾负载均衡性,选择合适的并行粒度;
c) 线程通信开销:不同的并行粒度,用于线程通信的锁、队列开销不同,不同并行粒度,可能引入不同的线程间数据依赖关系,从而导致线程同步或等待;
d) 内存容量——空间换时间:并行化引入多缓冲,增加内存需求,不同并行粒度,引入不同缓存需求;
e) 负载均衡:并行粒度不同,可能负载均衡效果的差异;
f) 满足IO与计算异步并行的需求:并行层级必须达到一定高度,才方便实现读、写功能线程,进而与计算线程实现异步并行;
g) 平衡性能与开发周期的矛盾:优化层次越高,开发周期越长;
h) 并行粒度影响并行库的选择:并行库的选择,很大程度上取决于并行粒度;
多节点分布式内存并行方案,需要多进程并行,这样就需要选择MPI并行;
节点内共享式内存并行方案,多线程并行效率更高,如果并行粒度低且并行逻辑较简单,OpenMP基本满足要求,并且开发周期短,如果并行粒度较高或并行逻辑复杂,那么pthread是不错的选择;
3.并行模型设计
选择了合适的并行粒度之后,需要设计一个高效的并行模型,其主要内容有:
a)IO与计算异步并行处理模型设计:
为了实现读数据、计算、写数据的并行处理,设计异步并行模型,使得读、计算、写分别由相应的功能线程执行,三类线程具有异步时序,三者时间互相隐藏,从而使资源利用率达到最大化,大大提高应用软件性能,异步并行模型,需要多缓冲、任务分发机制、线程调度机制的支持;
b)多缓冲设计
设计多缓冲,用于数据预取、预输出,主要有源数据缓冲、中间数据缓冲、结果数据缓冲,各缓冲与相应进程/线程构成“生产者-消费者”模型;
c)任务调度机制设计
任务分发机制,有共享互斥锁、消息队列模式;
d)进程/线程通信机制设计
进程/线程间需要通信,通信主要是同步、等待;
进程间通信方式有管道、信号;
线程间通信方式有信号量、消息队列、共享内存;
e)负载均衡设计
为提高并行处理效率,达到资源利用最大化,需要实现各进程/线程负责均衡最优化;
负载均衡是软件设计目标,其实现载体是任务调度机制及进/线程通信机制;
负载均衡分为节点间负载均衡和节点内负载均衡;
负载均衡的原则是:能者多劳;
负载均衡的实现方式有:
i. 静态负载均衡
适用于数据并行,且运算量与数据规模呈稳定的关系,这种方式实现简单,但是系统适应性差;
ii. 动态负载均衡
适用于任务并行或者运算量无法事先预测的情形,这种方式实现起来相对复杂,但是非常高效,系统适应性好,软件健壮性高;
(4)进程/线程函数优化
软件并行化后,软件的热点部分,即核心计算,都由相应的进程/线程函数执行,因此,进程/线程的优化,成为软件性能进一步提升的关键,进程/线程函数优化的主要内容有:
a) 核心算法逻辑优化
i. 与并行优化、IO优化、热点代码优化相结合,相辅相成;
ii. 微数学模型优化,化繁琐变换为直接计算;
iii.计算过程精简,减少中间变量;
b) IO优化
i. 宏观IO优化
1. 尽量实现读、计算、写异步并行,互相掩盖;
2. 化随机、零散小数据读写为连续、大块数据读写;
ii. 微观IO优化,体现于核心算法的优化;
1. 内存管理优化
a) 减小内存使用量
b) 使内存集中分配、释放,减小内存分配、释放次数;
c) 数据结构优化,提高访存效率,将矩阵行优先存储访问,以提高矩阵的访问效率;
2. cache优化:充分利用数据局部性,平衡任务粒度与cache容量的矛盾;
3. 变量优化:常量复用,中间数据精简,最大限度减少冗余计算、冗余变量开销;
4. 寻址优化:使用临时指针,减少多级寻址次数;
c) 数据函数库优化
i. 选择不同的快速数学库:mkl/fftw;
ii. 数学函数的不同精度版本,包括:X(d),X函数的双精度版本、 cos/exp/log;Xf, X函数的单精度版本cosf/expf/logf;
d) 指令优化
i. SIMD指令集优化,即向量指令优化;
ii. 预编译指令:#pragma ivdep/simd;
iii. 编译选项:-xSSE3/4.1a/4.2a –vec-report3;
iv.控制向量化精度:-fp-model strict/precise/double/fast/source;
v. 为提高自动向量化率,对代码作必要调整;
vi. 循环拆分、循环融合、循环调序;
1. 复杂表达式拆解;
2. 统一操作数精度;
3. 查看编译日志,了解相应循环是否向量化或未能向量化原因;
e) 编译器优化;
i. 自动优化选项:-O3, -fp-model fast;
ii. 各种优化手段都依赖编译器支持,如自动向量化选项,向量化编译报告,高性能数学库链接选项;
f) 性能与精度的平衡;
大部分时候,性能与精度是互相矛盾的,程序员根据实际需求,进行取舍;
(5)并行库的选择
方案制定的最后一项,是选择合适的并行库,目前,比较主流的并行库有MPI/OpenMP/pthread;
a)不同并行库的开发周期比较:MPI/pthread>OpenMP;
b)不同并行库的灵活性比较:MPI/pthread>OpenMP;
c)不同并行库的系统适应性比较;
i. MPI既适用于多节点间分布式内存并行,也适用于节点内共享内存并行,进行间通信开销较大;
ii. OpenMP/pthread只能用于共享内存并行,线程间通信直接、高效;
程序员综合并行方案,性能目标,软件开发周期因素,选择最合适的并行库;
3)性能优化方案实施与迭代调优:实施既定的性能优化方案并迭代调优
主要是实现第2阶段制定的性能优化方案,并重复调优——测试——调优过程,进行迭代优化;
5、性能测试及分析
将该方法应用于某个典型的石油行业应用软件模块多线程并行程序开发项目,并利用真实数据进行性能测试;
本次性能测试将针对不同规模的作业,利用不同规模的任务进行多次测试,并搜集测试数据进行性能分析;
1) 测试环境及测试数据
(1)测试环境包括硬件环境、软件环境;
(2)软件环境
操作系统名称:RedHat Linux企业版,版本:5.3
编译器名称:Intel编译器,版本:10.1
数据库名称:Oracle数据库,版本:10g
应用系统名称:某地震资料解释软件模块
(3)测试数据及作业规模
测试数据为真实生产的3D实际数据;
2) 性能测试结果分析
利用该方法对该软件模块进行多线程并行化改造后,显著地提升了该软件模块的运行效率,以较短的开发周期,获得了较高的性能加速比。
本发明的有益效果是:由本发明的技术方案可见,本发明提供了一种基于CPU多核平台的软件性能优化通用方法,该方法广泛适用于具有多线程并行处理需求的应用场合,指导软件开发人员以较短的开发周期,较低的开发成本,快速高效地对现有软件进行多线程并行优化改造,实现软件对系统资源利用最优化,读数据,计算,写回数据的互相掩盖,最大限度地缩短软件运行时间,显著提高硬件资源利用率,提高软件的计算效率和软件整体性能。
附图说明
图1是典型的读、计算、写异步并行处理模型图;
图2是各缓冲与相应进程/线程构成“生产者-消费者”模型图;
图3是并行处理模型的线程通信模型图。
具体实施方式
参照说明书附图对本发明的方法作以下详细地说明。
本发明的目的在于提供一种CPU多核平台软件性能优化的通用性、系统性方法。
为了使本发明的目的、技术方案和优点更加清晰,下面结合附图和实施例,对本发明作以下详细说明。
CPU多核平台软件性能优化流程及其实施步骤、细则如下:
1)软件运行特征分析:分析软件运行特征,定位软件性能瓶颈
应用软件运行特征分析,精准定位软件的性能瓶颈,可以使优化工作有的放矢,大大提高优化的效率。
应用软件运行特征分析的原则有:
(1)系统与局部分析结合
软件整体框架与软件局部模块分析都很重要,互为补充,综合全面地掌握应用软件的运行特征;
(2)定性与定量分析并重
在优化开发周期有限的条件下,定性分析为工程师指明工作方向,专注于软件的主要瓶颈,而定量分析界定了性能提升的理论极限;
(3)工具采样与代码分析结合
软件运行特征分析过程中,工具采样分析与代码分析两种手段互为补充、互为指导工具采样分析,可以帮助程序员快速定位程序热点,而代码分析,为程序热点找到理论依据,从而使热点与代码映射起来;
软件运行特征分析工具,具有高效全面、数据完备直观的特点,在整个性能优化过程中都能发挥极大作用;
软件运行特征分析工具,可以采集应用软件运行过程中的CPU利用率、内存特征、磁盘特征、网络特征、指令CPI信息;
软件热点分析工具,可以采集应用软件运行时各函数CPU使用率及其百分比、分析线程时序、分析程序并发度、检查软件内存和线程缺陷等。
(4)宏观与微观分析结合
应用软件的运行特征分析,既有高层次的宏观分析,也有底层的微观分析,宏观呈现现象,微观揭示原理,宏观分析指明优化方向,微观分析指导优化的手段;
2)性能优化方案制定:制定综合、全面的性能优化方案
(1)优化方案的总体思想
高效利用系统资源,包括多核计算资源、内存资源、磁盘资源、网络资源等;
(2)优化层次、效率、开发周期的关系
优化层次与优化效率的关系:物理模型>数学模型>算法模型
优化层次与优化周期的关系:物理模型<数学模型<算法模型
(3)并行模型设计
1.并行算法设计
优异的并行算法,是性能优化的前提条件和基础;
深入分析数据依赖关系,充分挖掘算法的并行性,必要时,对现有算法进行并行性改造,从而最大限度减少数据依赖和交换,提高算法的并行度,并行度越高,并行可扩展性越好;
2.选择合适的并行粒度(层次)
定义:高层次(外层循环)并行为粗粒度并行,低层次(内层循环)并行为细粒度并行。
并行粒度的选择非常关键,主要考虑以下因素:
i) 算法的并行性与并行的可扩展性
不同的并行粒度,数据依赖关系不同,导致并行度也不同,制定并行方案时,要充分挖掘算法的并行性,必要时,对现有算法进行并行性改造,从而最大限度减少数据依赖和交换,提高算法的并行度,并行度越高,并行可扩展性越好;
j) 并行效率——线程调度开销
并行粒度越小,线程调度越频繁,开销越大;
兼顾负载均衡性,选择合适的并行粒度;
k) 线程通信开销
不同的并行粒度,用于线程通信的锁、队列开销不同;
不同并行粒度,可能引入不同的线程间数据依赖关系,从而导致线程同步或等待;
l) 内存容量——空间换时间
并行化引入多缓冲,增加内存需求;
不同并行粒度,引入不同缓存需求;
m) 负载均衡
并行粒度不同,可能负载均衡效果的差异;
n) 满足IO与计算异步并行的需求
并行层级必须达到一定高度,才方便实现读、写功能线程,进而与计算线程实现异步并行;
o) 平衡性能与开发周期的矛盾
优化层次越高,开发周期越长;
p) 并行粒度影响并行库的选择
并行库的选择,很大程度上取决于并行粒度;
多节点分布式内存并行方案,需要多进程并行,这样就需要选择MPI并行;
节点内共享式内存并行方案,多线程并行效率更高,如果并行粒度低且并行逻辑较简单,OpenMP基本可以满足要求,并且开发周期短,如果并行粒度较高或并行逻辑复杂,那么pthread是不错的选择;
3.并行模型设计
选择了合适的并行粒度之后,需要设计一个高效的并行模型。其主要内容有:
b) IO与计算异步并行处理模型设计
为了实现读数据、计算、写数据的并行处理,设计异步并行模型,使得读、计算、写分别由相应的功能线程执行,三类线程具有异步时序,三者时间互相隐藏,从而使资源利用率达到最大化,大大提高应用软件性能。异步并行模型,需要多缓冲、任务分发机制、线程调度机制的支持;
如图1所示,为一种典型的读、计算、写异步并行处理模型:
c) 多缓冲设计
设计多缓冲,用于数据预取、预输出等,主要有源数据缓冲、中间数据缓冲、结果数据缓冲等;
各缓冲与相应进程/线程构成“生产者-消费者”模型,如图2所示:
d) 任务调度机制设计
任务分发机制,有共享互斥锁、消息队列等模式;
e) 进程/线程通信机制设计
进程/线程间需要通信,通信主要是同步、等待等;
进程间通信方式有管道、信号;
线程间通信方式有信号量、消息队列、共享内存;
如图3所示,是一个并行处理模型的线程通信模型:
f) 负载均衡设计
为提高并行处理效率,达到资源利用最大化,需要实现各进程/线程负责均衡最优化;
负载均衡是软件设计目标,其实现载体是任务调度机制及进/线程通信机制;
负载均衡分为节点间负载均衡和节点内负载均衡;
负载均衡的原则是:能者多劳;
负载均衡的实现方式有:
i. 静态负载均衡
适用于数据并行,且运算量与数据规模呈稳定的关系,这种方式实现简单,但是系统适应性差。
ii. 动态负载均衡
适用于任务并行,或者运算量无法事先预测的情形,这种方式实现起来相对复杂,但是非常高效,系统适应性好,软件健壮性高;
(4)进程/线程函数优化
软件并行化后,软件的热点部分,即核心计算,都由相应的进程/线程函数执行。因此,进程/线程的优化,成为软件性能进一步提升的关键。进程/线程函数优化的主要内容有:
a)核心算法逻辑优化
i)与并行优化、IO优化、热点代码优化相结合,相辅相成;
ii)微数学模型优化,化繁琐变换为直接计算;
iii)计算过程精简,减少中间变量;
b)IO优化
i宏观IO优化
1. 尽量实现读、计算、写异步并行,互相掩盖。
2. 化随机、零散小数据读写为连续、大块数据读写。
ii微观IO优化(体现于核心算法的优化)
1.内存管理优化
a) 减小内存使用量
b) 使内存集中分配、释放,减小内存分配、释放次数
c) 数据结构优化,提高访存效率,如将矩阵行优先存储访问,可以提高矩阵的访问效率;
2.cache优化:充分利用数据局部性,平衡任务粒度与cache容量的矛盾;
3.变量优化:常量复用,中间数据精简,最大限度减少冗余计算、冗余变量等开销;
4.寻址优化:使用临时指针,减少多级寻址次数;
c)数据函数库优化
i选择不同的快速数学库:mkl/fftw等;
ii数学函数的不同精度版本。如:X(d),X函数的双精度版本,如cos/exp/log等;Xf, X函数的单精度版本,如cosf/expf/logf等;
g) 指令优化
i. SIMD指令集优化,即向量指令优化;
ii. 预编译指令:#pragma ivdep/simd;
iii. 编译选项:-xSSE3/4.1a/4.2a –vec-report3;
iv. 控制向量化精度:-fp-model strict/precise/double/fast/source等;
v. 为提高自动向量化率,对代码作必要调整;
vi. 循环拆分、循环融合、循环调序;
1. 复杂表达式拆解;
2. 统一操作数精度;
3. 查看编译日志,了解相应循环是否向量化或未能向量化原因;
h) 编译器优化;
i. 自动优化选项:-O3, -fp-model fast等;
ii. 各种优化手段都依赖编译器支持。如自动向量化选项,向量化编译报告,高性能数学库链接选项等;
i) 性能与精度的平衡
大部分时候,性能与精度是互相矛盾的,程序员根据实际需求,进行取舍;
(2)并行库的选择
方案制定的最后一项,是选择合适的并行库。目前,比较主流的并行库有MPI/OpenMP/pthread等;
a) 不同并行库的开发周期比较:MPI/pthread>OpenMP;
b) 不同并行库的灵活性比较:MPI/pthread>OpenMP;
c) 不同并行库的系统适应性比较:
i. MPI既适用于多节点间分布式内存并行,也适用于节点内共享内存并行,进行间通信开销较大。
ii. OpenMP/pthread只能用于共享内存并行,线程间通信直接、高效;
程序员综合并行方案,性能目标,软件开发周期等因素,选择最合适的并行库;
3)性能优化方案实施与迭代调优:实施既定的性能优化方案并迭代调优
主要是实现第2阶段制定的性能优化方案,并重复调优——测试——调优过程,进行迭代优化;
5、性能测试及分析
将该方法应用于某个典型的石油行业应用软件模块多线程并行程序开发项目,并利用真实数据进行性能测试;
本次性能测试将针对不同规模的作业,利用不同规模的任务进行多次测试,并搜集测试数据进行性能分析;
1)测试环境及测试数据
测试环境包括硬件环境、软件环境。
(1)表1是测试硬件环境表
(2)软件环境
操作系统名称:RedHat Linux企业版,版本:5.3
编译器名称:Intel编译器,版本:10.1
数据库名称:Oracle数据库,版本:10g
应用系统名称:某地震资料解释软件模块
(3)测试数据及作业规模
测试数据为真实生产的3D实际数据。
作业规模:通过CMP line和CMP数来控制作业规模,表2是作业具体参数:
2)性能测试结果
在浪潮英信NF8520四路服务器上进行了不同规模作业的测试,测试结果如表3所示:
3)性能测试结果分析
利用该方法对该软件模块进行多线程并行化改造后,显著地提升了该软件模块的运行效率,以较短的开发周期,获得了较高的性能加速比;
4)总结
由本发明的技术方案可见,本发明提供了一种基于CPU多核平台的软件性能优化通用方法,该方法广泛适用于具有多线程并行处理需求的应用场合,指导软件开发人员以较短的开发周期,较低的开发成本,快速高效地对现有软件进行多线程并行优化改造,实现软件对系统资源利用最优化,读数据,计算,写回数据的互相掩盖,最大限度地缩短软件运行时间,显著提高硬件资源利用率,提高软件的计算效率和软件整体性能。
机译: 模拟多CPU /多核CPU /多线程CPU硬件平台的方法和系统
机译: 基于manicore系统的CPU / GPU以及用于CPU / GPU并行处理的确定多核CPU的中心数的方法
机译: 基于三维图形的CPU负载优化方法及装置