基于OpenMP并行求和算法分析
OpenMP并行程序设计总结(借鉴)

OpenMP并行程序设计(一)OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。
今天在双核CPU 机器上试了一下OpenMP并行程序设计,发现效率方面超出想象,因此写出来分享给大家。
在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就可以支持OpenMP了。
先看一个简单的使用了OpenMP程序int main(int argc, char* argv[]){#pragma omp parallel forfor (int i = 0; i < 10; i++ ){printf("i = %d/n", i);}return 0;}这个程序执行后打印出以下结果:i = 0i = 5i = 1i = 6i = 2i = 7i = 3i = 8i = 4i = 9可见for 循环语句中的内容被并行执行了。
(每次运行的打印结果可能会有区别)这里要说明一下,#pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,当然for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循环不依赖于前面的循环。
有关#pragma omp parallel for 这条语句的具体含义及相关OpenMP指令和函数的介绍暂时先放一放,只要知道这条语句会将后面的for循环里的内容变成并行执行就行了。
将for循环里的语句变成并行执行后效率会不会提高呢,我想这是我们最关心的内容了。
下面就写一个简单的测试程序来测试一下:void test(){int a = 0;clock_t t1 = clock();for (int i = 0; i < 100000000; i++){a = i+1;}clock_t t2 = clock();printf("Time = %d/n", t2-t1);}int main(int argc, char* argv[]){clock_t t1 = clock();#pragma omp parallel forfor ( int j = 0; j < 2; j++ ){test();}clock_t t2 = clock();printf("Total time = %d/n", t2-t1);test();return 0;}在test()函数中,执行了1亿次循环,主要是用来执行一个长时间的操作。
一种基于OpenMP的并行混合PVS算法

邹 竞 , 马 华 , 谢 鲲
( 1 . 湖南 涉外经 济学 院 信 息科 学与 工程 学院 , 长沙 4 1 0 2 0 5 ; 2 . 湖 南 大学 信 息科 学与 工程 学院 , 长沙 4 1 0 0 8 2 )
摘 要 :针对传 统 串行 混合 P V S ( p i r n c i p a l v a i r a t i o n s e a r c h , 主要 变例 搜 索) 算 法的 计 算量 大 、 执 行耗 时长 和 无 法
t i o n S c e i ce& E n n g i n e e r i n g, H u n a n U n i v e r s i t y , C h a n g s h a 4 1 0 0 8 2 ,C h i n a )
Ab s t r a c t :T h e t r a d i t i o n a l h y b i r d P VS a l g o r i t h m f a i l s i n l a r g e a mo u n t o f c lc a u l a t i o n a n d l o n g e x e c u t i o n t i me ,a n d c a n n o t t a k e a d v a n t a g e o f t h e mu l t i ・ c o r e s r e s o u r c e s .T h i s p a p e r p r o p o s e d a p a r a l l e l h y b i r d P VS a l g o it r h m b a s e d o n Op e n MP.r I 1 h i s a l g o it r h m u s e d t h e P VS p l i t t i n g s t r a t e g y.a n d t h r e a d e d t h e s e rc a h f o r t h e b r a n c h s o f e v e r y l e v e l ’ S i f r s t P V n o d e o n g a me — t r e e f r o m b o t t o m t o u p.e x e c u t e d b y p a r ll a e l p r o c e s s i n g o n mu l t i — c o r e s C P U.I t a l s o p r e s e n t e d t h e r a t i o n a l d e s i g n e d o f c it r i c a l s e c t i o n a n d t h r e a d s c h e d u l i n g or f i mp r o v i n g t h e s e a r c h e ic f i e n c y .F i n a l l y。t h i s p a p e r c o n d u c t e d e x p e ime r n t s o n t h e b a s i s o f a r e a l C h i n e s e c h e s s c o mp u t e r g a me s y s t e m. n 1 e r e s u l t s s h o w t h a t t h i s a l g o r i t h m h a s h i g h p r u n i n g e ic f i e n c y a n d s p e e d u p r a t i o .a n d c a n i mp r o v e r e — ma r k a b l y t h e p e r f o r ma n c e o f h y b i r d P V S lg a o i r t h m. Ke y wo r d s:p a r a l l e l c o mp u t i n g ;h y b id r P VS a l g o it r h m;g a me — t r e e ;Op e n MP;P V S p l i t t i n g
基于MPIOpenMP混合模型的并行处理算法设计

基于MPI+OpenMP混合模型的并行处理算法设计林荫21、黑保琴2(1.中国科学院研究生院北京 100190;2.中国科学院光电研究院北京 100190)摘要:随着空间数据量的增大和下行速率的大幅度提高,如何将并行计算技术应用于数据处理系统已经成为了当前研究的重要课题。
本文讨论了基于MPI+OpenMP混合模型的并行程序设计问题,提出了一种并行数据处理软件的设计方案。
关键词:MPI OpenMP 并行数据处理1.引言随着空间科学技术的发展,数据下行速率有了很大程度的提高,数据处理的时效性成为人们关注的焦点。
近年来多核结构和微处理技术发展迅速,集群正逐渐成为主流的并行计算平台,应用于各个领域之中。
其显著特点是性价比高和可扩展性好。
MPI是消息传递接口标准,在集群计算中广为应用,但是在多核处理器构成的集群(以SMP为代表)上仅采用MPI消息传递模型并不能取得理想的性能。
为了结合分布式内存结构和共享式内存结构两者的优势,人们提出了分布式/共享内存层次结构。
OpenMP是共享存储编程的实际工业标准,在SMP集群上应用MPI +OpenMP混合编程模型,可以实现结点内和结点间两级并行,有效地改善系统性能。
2. MPI+OpenMP混合编程模型2.1 分布式共享内存结构并行计算机按照存储方式可以分为分布式内存并行计算机,共享内存并行计算机和分布式共享内存并行计算机3种,如图2.1所示。
a)分布式内存并行计算机 b)共享内存并行计算机 c)分布式共享内存并行计算机图 2.1 按存储方式划分的并行计算机结构分布内存并行计算机由多个具有局部存储模块的相互独立的处理节点通过互联网连接而成,具有很好的可扩展性和性能,但不同节点间的通信要使用消息传递机制,加大了程序设计的难度。
共享内存并行计算机中,各处理单元通过对共享内存的访问来交换信息,协调各处理器的任务。
编程相对简单,但共享内存往往成为性能尤其是扩展性的瓶颈。
分布式共享内存并行计算机结合了以上两种二者的特点,节点间属于分布式内存结构,节点内各处理器间属于共享内存结构,MPI+OpenMP混合模型就是针对这种结构的。
基于OpenMP的并行蚁群算法求解协同空战火力分配

0引言 空战火力分配是研究现代空战中有关火力运用和作战
决策的一个重要课题。空战火力分配问题是指在超视距多 机协同多目标攻击空战环境中,我方空战指挥控制系统根 据敌方多架飞机的威胁权重值,及时有效地将我方机载空 空导弹分配到导弹攻击区内的多个目标,以最大限度地消 除敌方目标的威胁。目前,已经证明空战火力分配问题属 于完全 非 确 定 多 项 式 ( non-deterministic polynomia,NP) 问 题[1],传统的求 解 方 法 通 常 具 有 指 数 阶 的 时 间 复 杂 度,当 我机数目、导弹 数 目 和 目 标 数 目 都 很 大 时,将 发 生 组 合 爆 炸,进而在有限决策时间内难以求得问题最优解,满足不了 空战决策实时性要求。
( 6)
N
∑ xij ≤1( i = 1,2,…,Z) .
( 7)
j =1
其中,pij 为目标 j 的毁伤概率门限。式( 5) 表示在一个 火力分配方案中,如果目标 j 的联合毁伤概率 pj 小于 ptj ,则 认为是无效分配,式( 7) 表示一枚导弹只能攻击一个目标。 该数学模型的意义在于,在满足毁伤概率门限的前提下,将 目标相对我机的威胁、我机导弹对目标的毁伤概率以及导 弹武器资源的消耗 3 个因素综合考虑,通过比较各种导弹 对目标的组合对火力分配目标函数值的贡献来进行导弹的 优化分配,从而达到在获得最大火力分配效能的同时,节省 武器资源,且能保证威胁度大的目标被优先攻击。 2 并行蚁群算法求解火力分配问题
在以往的静态火力分配数学模型中,目标 j 必须被攻
击,且至少分配一枚导弹进行攻击,具体分配数目由指控系
统根据实际情况给出。本文采取优先选择毁伤概率高的导
弹优先攻击价值系数高的目标的“双优分配原则”,针对特
OpenMP在并行计算中的应用

kin=kin+dotr8(nd.vel(1,i),vel(1,j))
enddo
¥omp end parallel do
e
S
_呈_荃 叫
肚
曲
e
叩 _呈
咿
"
a
帆蚰
d
比反而降低。所以为了提高并行加速比,应该尽量优化那
些自身计算量较大的循环,而对循环耗时相当少的循环
就不必进行并行优化。
!¥omp parallel do
支持OpenMP
API的编译器通过命令行参数激
活和编译所有的OpenMP编译指令。
2.1
OpenMP指令格式 OpenMP的指令格式为: 标识符指令名[选项1[【,】选项2.】¨…・】
指令名后的选项可以以任意次序排列,需要时也可
重复。编译指令不能嵌入Fortran语句中,Fortran语句也 不能嵌入编译指令中。 Fortran自由格式文件以【¥OMP作为OpenMP编译 指令的标识符。固定格式文件以!¥OMP、C¥OMP或+ ¥OMP作为OpenMP编译指令的标识符。 在固定格式文件中,标识符必须为一行中的第一列。 自由格式文件中,标识符前面必须有空格或跳格,但不限
下的运动情况。试验中粒子数取为500,物理空间取为3 维,积分步长为10’4s,模式初态取粒子静止,模式向前积 分1 000步。 首先进行串行版本的试验,其结果为:CPU
634.51 s。然后利用PGI TIME=
选项中operator为+、}、一、.AND…OR…EQV.或.NEQV
中的一个,intrinsic—procedure—name为MAX、MIN,、 IAND、IOR、IEOR中的一个。REDUCTION选项的实现过 程为:首先,根据运算符的特点给list中的变量(假定为z) 赋初值,如operator为+时赋x=0,而operator为十时赋 x=1;然后,各进程分别计算各自的#值记为expr或ex. pr—list;最后,对各个线程依次进行如下运算:*=x
OpenMP并行计算

生成阶段实例
• 输入数据 • K.w:( 42 5 76 24 67 8 42 54) • K.p: (43 5 2 65 73 49 36 96)
• 将K平均分成2部分: • K1.w:(42 5 76 24) K1.p: (43 5 2 65) • K2.w: (67 8 42 54) K2.p: (73 49 36 96)
– PRAM共享存储计算机模型是一种理论模型 – 它对于设计和实现并行算法仍然具有重要的理 论意义
背包问题的并行算法两种基本思路
基于动态规划思想
基于分治思想
成熟
子集和问题
0-1背包问题
成熟
未获关注
基于动态规划思想0-1背包问题的并 行算法性能分析
以上基于动态规划并行算法:在复杂度分析时不仅需要考虑背包物品的规 模,而且还要考虑到背包的容量
搜索算法
• 经过剪块算法,可以保证内存中最多只剩下2l-1个 块对,将块对平均分配到l个处理器内,可以保证 每个处理机最多只包含2个块对。
• 因此在搜索阶段每个处理机对本处理机上的块对 执行单方向的顺序搜索,即串行的二表算法,可 以最终求出问题的解。如设处理器Pi中分配的块 对为(As,Bt),则搜索阶段算法如下图表示:
最优归并流程
最优归并算法复杂度分析:
• 调用log l 次切分算法,其中切分算法时间为 log(m+n) • l个处理机并行归并的时间为(m+n)/l
• 综上:总运行时间为log l * log(m+n)+(m+n)/l, 且并归算法是无存储访问冲突的。
• 值得注意:由于需要递归调用log l次切分算法, 故最优归并算法所需的处理机个数l应该是2的幂 • 该最优归并算法将在并行二表和三表并行算法的 生成阶段起到重要的作用。
基于OpenMP的并行求和算法的研究与分析
基于OpenMP的并行求和算法的研究与分析【摘要】目前几乎所有主流CPU厂商都致力于大力发展多核处理器,增加芯片支持的并行能力,从而提升计算机运算速度。
本文主要探讨近来流行的多核计算技术,介绍一种重要的工业标准OpenMP,以及通过一个基于OpenMP的并行求和的简单例子来分析和说明并行计算效率与传统串行计算效率比较的优势。
【关键词】多核处理;并行求和算法;多线程;OpenMP0.引言多核技术始终是近年来全球计算机技术发展的重要内容。
自从英特尔在2006年底发布了全球第一基于OpenMP的并行遗传算法探讨397款主流服务器四核处理器后,英特尔一直致力于推动多核应用生态系统的成熟与发展。
实际上,从2002年推出超线程技术开始,英特尔就开始了向多核技术转型的步伐。
最终,英特尔公司将四个计算“大脑”装入一枚处理器中,随着至强5300的诞生,计算机行业宣告正式进入了多核时代。
多核计算将成为一种广泛普及的计算模式,影响企业和消费者用户的使用模式。
如目前的服务器应用,要求高的吞吐率和在多处理器上的多线程应用;Internet的应用、P2P和普适计算的应用都促使了计算机性能的不断提升。
大型企业的ERP、CRM等复杂应用,科学计算、政府的大型数据库管理系统、数字医疗领域、电信、金融等都需要高性能计算,多核技术可以满足这些应用的需求。
本文主要探讨近来流行的多核计算技术,介绍一种重要的工业标准OpenMP,以及通过一个基于OpenMP的并行求和的简单例子来分析和说明并行计算效率与传统串行计算效率比较的优势。
1.OpenMPOpenMP是一种适用于多种硬件平台的共享存储编程的工业应用标准,提供了一个可用的编程模型,具有简单、可移植性和可扩展性,灵活支持多线程和负载平衡的潜在能力,目前支持Fortran语言,c和c++。
OpenMP规范中定义的制导指令、运行库和环境变量,能够在保证程序可移植性的前提下,按照标准将已有的串行程序逐步并行化。
基于OpenMP的并行克隆选择算法
活控 制 程 序 的运 行- 。其 中编译 指 导 语 句 是 9 J
O eMP组成 中最重 要 的部 分 , 是编 写 O eMP pn 也 pn 程序 的关键 。
单一的种群 P被划分为子种群 P , ”P , 。P ,f
种群规模为 :
() 2 其 中, Ⅳ为所使用处理器的数量。子种群的规
第3 卷 第6 3 期
21 年 1 月 0 2 1
武 汉 理 工 大 学 学 报 ・ 息 与 管 理 工 程 版 信
J U N L0 T IF R A IN&M N G M N N IE RN ) O R A FWU (N O M TO A A E E TE GN E IG
Vo _ 3 No 6 l3 . De . 0 1 C 2 1
摘
要: 讨论 了一种基于分布式并行模型 的并行克隆选择算法 , 并在 4核 C U的计算机上进行 了验证 。该并 P
行算法 中, 多个子种群代替 了原来单一 的种群 , 每个子种群 独立 地进 化 , 在完成一次进化后每个子种群中最好
的个体将取代其他种群最坏的个体 。并行算 法不仅克服了能量值较早 收敛 的缺点 , 而且能有效地寻找到全局
一
1 Ope M P n
1 1 Op n . e MP标 准
O eMP是 一种 针对 共享 内存 的多 线 程 编程 pn 技术 , 由一些 具有 国 际影 响 力 的 大规 模 软 件 和硬
件厂商共同定 义 的标准 。 。它是一种 编译指导 。 语句 , 指导多线程 , 共享 内存并行的应用程序编程
文章编号 :07—14 2 1 )6— 9 0一 4 10 4 X(0 1 0 0 2 o
文献标 志码 : A
OpenMP共享内存并行编程详解
OpenMP共享内存并⾏编程详解实验平台:win7, VS20101. 介绍并⾏计算机可以简单分为共享内存和分布式内存,共享内存就是多个核⼼共享⼀个内存,⽬前的PC就是这类(不管是只有⼀个多核CPU 还是可以插多个CPU,它们都有多个核⼼和⼀个内存),⼀般的⼤型计算机结合分布式内存和共享内存结构,即每个计算节点内是共享内存,节点间是分布式内存。
想要在这些并⾏计算机上获得较好的性能,进⾏并⾏编程是必要条件。
⽬前流⾏的并⾏程序设计⽅法是,分布式内存结构上使⽤MPI,共享内存结构上使⽤Pthreads或OpenMP。
我们这⾥关注的是共享内存并⾏计算机,因为编辑这篇⽂章的机器就属于此类型(普通的台式机)。
和Pthreads相⽐OpenMP更简单,对于关注算法、只要求对线程之间关系进⾏最基本控制(同步,互斥等)的我们来说,OpenMP再适合不过了。
本⽂对windows上Visual Studio开发环境下的OpenMP并⾏编程进⾏简单的探讨。
本⽂参考了wikipedia关于OpenMP条⽬、(有OpenMP Specification)、MSDM上关于OpenMP条⽬以及教材《MPI与OpenMP并⾏程序设计(C语⾔版)》:1.2.3.4. 《MPI与OpenMP并⾏程序设计(C语⾔版)》第17章,Michael J. Quinn著,陈⽂光等译,清华⼤学出版社,2004注意,OpenMP⽬前最新版本为4.0.0,⽽VS2010仅⽀持OpenMP2.0(2002年版本),所以本⽂所讲的也是OpenMP2.0,本⽂注重使⽤OpenMP获得接近核⼼数的加速⽐,所以OpenMP2.0也⾜够了。
2. 第⼀个OpenMP程序step 1:新建控制台程序step 2:项⽬属性,所有配置下“配置属性>>C/C++>>语⾔>>OpenMP⽀持”修改为是(/openmp),如下图:step 3:添加如下代码:1 #include<omp.h>2 #include<iostream>3int main()4 {5 std::cout << "parallel begin:\n";6#pragma omp parallel7 {8 std::cout << omp_get_thread_num();9 }10 std::cout << "\n parallel end.\n";11 std::cin.get();12return0;13 }step 4:运⾏结果如下图:可以看到,我的计算机是8核的(严格说是8线程的),这是我们实验室的⼩型⼯作站(⾄多⽀持24核)。
OpenMP论文:多核并行插值算法的研究
OpenMP论文:多核并行插值算法的研究【中文摘要】目前多核计算机已经普及,多核的意义在于其超高的多任务处理能力。
然而多核计算机仅仅提供了一个可以更高效工作的平台,如何实现更高效地运算的关键还是将程序并行化。
采用多核并行算法可以突破物理极限的约束,以较低的投入完成大计算量的任务,能够满足人们对更高性能的需求。
在并行程序设计领域,共享存储工业标准OpenMP因其简单易用,而且开发周期较短,并行效率较高等优点,在多核体系结构的并行编程中得到了广泛的应用。
插值法具有广泛的应用背景和实用价值,被应用于外形设计、图像重建、现代土木、天文学以及水利等许多与科学计算相关的领域。
关于插值的理论与应用方面的研究一直是极受关注的重要课题。
随着科技的发展,对插值问题的求解速度也提出了极高的要求,因此学者们开始研究各种加快插值问题求解速度的方法,多核计算机的出现为其提供了一个更加有效的途径。
本文研究了三次样条插值和双线性插值算法,针对三次样条插值过程中因需求解大量的三对角方程组而运算量大、运行速度慢的问题,提出了一种加速三次样条插值计算的方法。
解三对角方程组的并行算法有矩阵分解法、循环约化法、递推耦合法等,本文选择比较适合于多核环境的奇偶约化法进行并行化。
通过实验结果的加速比对比,证明本并行算法加快了求解三对角方程组的速度,从而减少了求解样条插值问题的时间。
其次针对目前一些特殊场合实时图像处理的需要,对常用的图像插值算法进行了比较分析,研究了双线性插值算法的计算过程及数据相关性,提出了基于OpenMP的双线性插值多核并行算法,并通过在图像放大处理中的应用,证明了此并行算法的有效性及可行性。
本文验证了并行程序设计理论与多核平台相结合提高插值问题速度的优越性,具有重要的现实意义和使用价值,达到了研究的。
【英文摘要】At present multi-core computers are widespread.The significance of multi-core lies in its high multi-tasking capability.However,multi-core only provides a platform for more efficient work, the key of how to achieve more efficient operation is to parallel the programs. Multi-core parallel algorithms can break the constraints of physical limit,complete large calculating tasks in lower investments and can meet the demand of higher performance.In parallel programming field,the industry standard of shared memory OpenMP is ease to use,its development cycle is shorter and parallel efficiency is higher.It is widely used inmulti-coreparallel programming. Interpolation has widely practical background and value,be used to shape design, image reconstruction,modern civil,astronomy,water calculation and many other science-related fields.The research about interpolation theory and application is an important subject always be great concerned.With the development oftechnology,requirements about resolving interpolation speed also be proposed,scholars began to study variety interpolation methods to accelerate resolve speed, the emergence ofmulti-core provides a more effective way.This paper studies cubic spline interpolation and bilinear interpolation algorithm. Because in cubic spline interpolation processing demands resolving tridiagonal equations,so has many operations and running slowly,proposes a method of resovling cubic spline interpolation acceleratly.The parallel algorithm of solving tridiagonal equations has matrix decomposition,cyclic reduction,recursive coupling,etc.This paper chooses odd-even reduction method to parallelization,because it is suitable for multi-core environment.Through compare with the speedup ratio,proves this parallel algorithm can resolve tridiagonal equations acceleratly,then reduce the time of resolving spline interpolation.Secondly,according to some special occasion’s demands of real-time image processing,contrasts common image interpolation algorithm,researches the calculating process and data dependency of bilinear interpolation algorithm.The paper raises the bilinear interpolation multi-core parallel algorithm based on OpenMP.Through apply in the image zooming processing,indicates that the algorithm is effective andfeasible.This paper verifies the advantage of combining parallel programming theory with multi-core platform to enhance the interpolation speed.It has realistic significance and the value of use,achieving the purpose of the research.【关键词】OpenMP 多核CPU 并行算法插值【英文关键词】OpenMP multi-core parallel algorithm interpolation【目录】多核并行插值算法的研究摘要3-4Abstract41 绪论7-111.1 研究背景和意义7-81.1.1 硬件平台的多核趋势71.1.2 多核并行编程的意义7-81.2 研究现状8-91.3 本文主要工作及组织结构9-112 多核并行计算11-192.1 并行机体系结构11-132.2 并行算法13-162.2.1 数据相关性13-142.2.2 并行算法设计方法142.2.3 并行算法性能度量14-162.3 并行编程环境16-172.3.1 共享存储编程环境162.3.2 分布存储编程环境16-172.4 多核技术17-192.4.1 多核处理器硬件结构17-182.4.2 多核并行设计模式182.4.3 多核编程面临的挑战18-193 插值的基本理论19-233.1 插值概念19-203.2 插值算法20-213.3 插值的应用21-234 OpenMP 多核程序设计23-304.1 OpenMP 并行编程基础23-254.1.1 OpenMP 编译指导语句23-244.1.2 OpenMP 任务调度24-254.1.3 OpenMP 常用库函数254.2 OpenMP 性能优化25-274.2.1 影响OpenMP 程序性能的因素25-264.2.2 提高OpenMP 程序性能的方法26-274.3 编译环境的设置27-304.3.1 Microsoft Visual Studio27-284.3.2 VC6.0+Intel编译器28-305 三次样条插值多核并行算法30-375.1 三次样条插值函数的定义305.2 三次样条插值函数的构造30-315.3 求解三对角方程组31-355.3.1 串行追赶算法32-335.3.2 奇偶约化并行算法33-355.4 实验结果分析35-365.5 小结36-376 双线性插值图像放大多核并行算法37-436.1 图像放大37-386.2 常用算法38-396.3 双线性插值原理396.4 并行算法设计与实现39-416.5 实验结果分析41-426.6 小结42-43结论43-44参考文献44-47攻读硕士学位期间发表学术论文情况47-48致谢48。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于OpenMP的并行求和算法的研究与分析【摘要】目前几乎所有主流cpu厂商都致力于大力发展多核处理器,增加芯片支持的并行能力,从而提升计算机运算速度。
本文主要探讨近来流行的多核计算技术,介绍一种重要的工业标准openmp,以及通过一个基于openmp的并行求和的简单例子来分析和说明并行计算效率与传统串行计算效率比较的优势。
【关键词】多核处理;并行求和算法;多线程;openmp
0.引言
多核技术始终是近年来全球计算机技术发展的重要内容。
自从英特尔在2006年底发布了全球第一基于openmp的并行遗传算法探讨397款主流服务器四核处理器后,英特尔一直致力于推动多核应用生态系统的成熟与发展。
实际上,从2002年推出超线程技术开始,英特尔就开始了向多核技术转型的步伐。
最终,英特尔公司将四个计算“大脑”装入一枚处理器中,随着至强5300的诞生,计算机行业宣告正式进入了多核时代。
多核计算将成为一种广泛普及的计算模式,影响企业和消费者用户的使用模式。
如目前的服务器应用,要求高的吞吐率和在多处理器上的多线程应用;internet的应用、p2p和普适计算的应用都促使了计算机性能的不断提升。
大型企业的erp、crm等复杂应用,科学计算、政府的大型数据库管理系统、数字医疗领域、电信、金融等都需要高性能计算,多核技术可以满足这些应用的需求。
本文主要探讨近来流行的多核计算技术,介绍一种重要的工业
标准openmp,以及通过一个基于openmp的并行求和的简单例子来分析和说明并行计算效率与传统串行计算效率比较的优势。
1.openmp
openmp是一种适用于多种硬件平台的共享存储编程的工业应用标准,提供了一个可用的编程模型,具有简单、可移植性和可扩展性,灵活支持多线程和负载平衡的潜在能力,目前支持fortran语言,c和c++。
openmp规范中定义的制导指令、运行库和环境变量,能够在保证程序可移植性的前提下,按照标准将已有的串行程序逐步并行化。
openmp程序开始于一个单独的主线程。
主线程会一直串行地执行,直到遇见第一个并行域才开始并行执行。
并行域表示该部分程序计算量大,需要多个处理器共同来处理以提高效率和运行速度;并行区间以外的部分表示该部分的程序不适宜或者不能并行执行,只能由一个处理器来执行。
主线程创建一队并行线程,然后,并行域中的代码在不同的线程队中并行执行,当主线程在并行域中执行完后,它们或被同步或被中断,最后只有主线程在执行。
实际上,所有的openmp的并行化,都是通过使用嵌入到c/c++或foaran源代码中的编译制导语句来达到的。
在具体实现时,在并行域开始处添加openmp制导指令#pragma,另外,openmp是独立于平台的,如果编译器不支持openmp,将会自动忽略预处理指令#pragma,程序依然可以按照串行程序代码顺利编译执行。
2.传统求和算法
2.1算法设计
传统的求和算法思路相当简单,先定义一个数组,然后随机生成一系列数据放入数组中,再使用循环将各个数据累加存入最后结果变量中即可。
本文先约定定义的是一个long型的数组a,存入的数据为long 型整数,考虑到数组元素的最多个数与测试机器的字长有关,而笔者所使用的测试环境是字长为32位的win7系统,且此算法要与下面的并行求和算法进行比较,因此本着尽可能选取多数据且不超过long型数据范围(2- 1)的原则,本文将存入数组的数据个数n定为65536。
然后使用rand()函数只随机生成1-100的整数,这样保证最后求和的结果也不会超过long型数据的范围,防止了计算过程中数据溢出情况的发生。
2.2具体实现
(1)随机生成数组数据代码实现:
3.基于openmp的并行求和算法
3.1实验前准备
由于现在电脑cpu一般都有两个核,4核与8核的cpu也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核cpu的强大功能,于是多核编程应运而生。
多核编程可以认为是对多线程编程做了一定程度的抽象,提供一些简单的api,使得用户不必花费太多精力来了解多线程的底层知识,从而提高编程效率。
openmp支持的编程语言包括c语言、c++和fortran,支持openmp的编译器包
括sun studio,intel compiler,microsoft visual studio,gcc。
实验使用的是microsoft visual studio 2008,c++语言,cpu为intel i3 2350 双核四线程。
在microsoft visual studio 2008
上openmp的配置非常简单,总共分2步:
(1)新建一个工程。
(2)建立工程后,点击菜单栏->project->properties,弹出菜单里,点击 configuration
properties->c/c++->language->openmp support,在下拉菜单里选择yes。
3.2算法设计
openmp简单易用,在设计算法时我们不需要添加额外的include 头文件和link库文件,只须在合适的地方添加openmp语句即可,例如在for循环前加一句“#pragma omp parallel for”。
而且这些语句运行在单核机器上,或者编译器没有将openmp设为可用的机器上编译也不会报错,将自动忽略#pragma这行代码,然后按照传统单核串行的方式编译运行。
使用openmp来实现并行求和的算法思路也是非常简单的,即把数组分成多块,每个 cpu 核心负责一块的求和,最后把每块的和加起来即可。
但考虑到当多个线程并行执行时,有可能多个线程同时对某变量进行了读写操作,从而导致不可预知的结果,即和的计算不准确的问题,实验使用了openmp 提供的一个工具,归约(reduction),也就是在#pragma omp parallel for 后面加上了 reduction(+:sum),它可以告诉编译
器:下面的for循环你要分成多个线程跑,但每个线程都要保存变量sum的拷贝,循环结束后,所有线程把自己的sum累加起来作为最后的输出。
3.3具体实现
并行求和计算代码实现:
4.算法效率的比较与分析
4.1比较实现
首先,为了保证测试比较的准确性,每一次比较我们都是使用同一个数组,同一组随机生成的数据测。
使用openmp函数库里面的omp_get_wtime()函数来获取当前时间,通过运行前后两个时间值之差来计算算法运行时间。
考虑到单次执行时间远远小于1秒,时间太短,不利于分析,所以在两个求和的算法的代码前加上一个次数为5000的循环。
最后输出求和结果和运行时间。
代码如下:
4.2比较结果与分析
表4.1为两个算法运行5000次的时间累积的时间值。
由表格中的测试结果数据看,平均起来并行求和相对于串行只用了其57% 的时间,效率是有所提高。
但是,由于本实验使用的cpu为双核四线程处理器,即伪四核。
想来如果四核并行求和的话,耗时应是串行的 25% 左右,而这个结果与期望值相差太大。
于是,笔者又将该程序放置安装有货真价实的四核处理器i5 2450上,进行实验,测试结果如表4.2。
测试结果数据表明:并行求和算法用时约为串行的29%。
29% 与
最初预期的 25% 相当接近,考虑到cpu被其他程序共享占用的情况,该结果已经符合之前的期望值,但也从一定程度上说明了使用openmp的归约工具进行并行求和其算法的效率确实要比串行的要高,但是在双核四线程处理器下的效率却不能达到真正四线程的效果。
至此,实验的结束。
5.结束语
本文使用基于openmp工具实现了并行求和算法,并将之与传统的串行求和算法进行了对比和分析,计算效率优势明显。
在这个以多核处理器为主流的时代,openmp将成为程序员必不可少的工具。
随着应用需求的扩大和技术的不断进步,多核技术必将展示出其强大的性能优势。
多核处理器是处理器发展的必然趋势,无论是移动与嵌入式应用、桌面应用还是服务器应用,都将采用多核的架构,因此多核技术应用前景广阔。
参考文献:
[1] 张引琼,戴小鹏. 独立学院java语言教学改革与实践研究[j]. 电脑知识与技术, vol.8,no.8,march 2012:1886~1887.
[2] 骆挺,徐婷婷,孙霞. java课程在民办院校实践教学的思考[j]. 福建电脑, 2012年第3期:43~44.。