2010年第9期
SCIENCE&TECHNOLOGYINFORMATIONOIT论坛。科技信息
基于OpenMP的多核程序设计
周淑贤
(中南林业科技大学信息与计算机工程学院
湖南长沙410004)
【摘要J多核技术的发展正引领软件研发发生基础性的变化。开发人员可以在代码中添加线程来利用系统所提供的多个内核。从而提升PC应用软件的功能和性能。本文介绍了共享存储系统并行编程接口OpenMP的模型、指令和库函数,以厦IntelC++编译嚣9.1和MicrosoftVisualStudio2005等对OpenMP的支持;着重探讨了二雏离散快速傅里叶变换并行算法的设计、实现与优化技术;展望了高性能并行计算软构件库的开发前景。
【关键词】多核计算机;并行计算;多线程;OpenMP
OpenMP-basedProgramming
(College
【Abstract]Softwaredevelopmentwill
to
on
Multi--corePC
ZHoUShu-xian
ofComputer&InformationEngineering,CentralSouthUniversityofForestry&Technology,ChangshaHunan,410004)
receive
a
foundationalinnovation
makefull
USe
ofthenew
processor,thatimprovesbothfunction
requires
all
byreasonofmulti--coretechnology.Programmersaddthreadsintocodes
andperformanceofIntemetapplications.Originatesfromparallelprogrammingon
multi--corecomputers.UsingtheOpenMPprograms
9.1
andMicrosofiVisualStudio2005
design,realizationand
are
Open
MP--eompatiblecompilerandthread--safelibraries.bothIntelC++compiler
perfectchoice,Thenstudiedtwo--dimensionaldiscretefastFouriertechnology.Finally,thoughtthathish
transform(F踊,focused
software
component
on
parallel
a
programoptimization
performanceparallel
computing
librarymustbe
perfectexploitationfieldinthefurtherfuture.
【Keywords】Multi--corecompute;OpenMP
O背景
在现有工艺下.改善CPU性能的传统方法如提升时钟速度和指令吞吐量等在摩尔定律限制下已经难有大的进展。近年来新型芯片性能提升将主要从超线程.多核和缓存三个方面人手,其中最为瞩目的当属多核技术。Intel、AMD等主要的处理器厂商均将提高处理器性能的途径从提高主频转向整合多个处理引擎。多核引领软件研发发生基础性变化。开发人员需要在代码中添加线程来利用系统所提供的多个内核,并将对性能比较敏感的代码分隔在多个内核上,但同时又必须确保代码具有良好的可伸缩性,无论在单核、双核、四核或者更高级别的计算机七,同样的代码都必须能够运行良好。传统程序基本上是为顺序处理器书写的.大部分程序在多处理器上不能直接获得加速。解决这一问题的途径之一是使用多处理器编译器把顺序程序自动转换为并行程序。多核处理器编译器的自动并行化功能能够解决一部分问题,但是依然不能令人满意。解决这一问题的另一途径是手工重写程序库。长期以来.计算机界积累了大量的库程序,尤其是在科学计算领域,经典算法均已收入库程序。如果把程序库中所有程序用适合并行计算的方法莺写。那么用户在写应用程序时就可以直接调用这些并行程序库,从而加速应用程序的运行。目前可选择的多核多线程开发工具有Win32线程库、p111read库以及OpenMP。Win32线程库运行于winNT和win9X平台,拥有完善丽复杂的函数库.目前比较成熟,但对编程人员有较高的要求:pThread库是Linux下最常用的多线程支持库,具有方便移植的特点,但使用难度比较大:OpenMP则针对共享地址空间的并行计算机提供并行计算支持,具有使用简单的特点。目前Intel极力推荐多线程开发工具OpenMP,在IntelC++编译器9.1、
MicrosoftVisual1
共享存储模型是一般的集中式多处理机的抽象。其底层为一系列处理器,这砦处理器访问同一个共享存储器。由于所有处理器可以访问内存中的同一位置.因而它们可以通过共享变量进行交互和同步。OpenMP采用了共享存储中标准的并行模式fjrk—ioin,当程序开始执行时只有主线程存在。主线程执行程序的串行部分,通过派生出其他的线程来执行其他的并行部分。当重新执行程序的串行部分时.这些线程将终止。
1.2
OpenMP指令
工业标准OpenMP是对C语言的一个扩展。目的是支持并行程序设计。书写OpenMP程序同书写C语言程序相似,只是在c程序中加入了OpenMP的编译指示。这些编译指示描述了程序应该以何种方式并行执行。加入了OpenMP指示的C程序可以由任意支持OpenMP的编译器编译,在不同平台的硬件上执行。OpenMP编译器命令以#pragma开始.在其后面是omp,名字和可选的子句,并用新行结束。某些子句可出现在不同的命令中,但需要对它们加以分别的定义。某些命令将作用于整个结构块,所渭的构造是由编译器命令及跟在其后的结构块所组成。在C/C++中,OpenMP指令使用格式是#pragmaomp指令【子句[子句】...】。OpenMP编译制导包括并行域结构、共享任务结构、组合的并行共享任务和同步结构四类。OpenMP编译制导可根据需要包含子句项,在没有其它约束条件下.子句可以无序,也可以任意地选择。#pragma
omp
parallelfor{子句…]是最频繁使用的编译指导语句,可
搭配使用的子句有firstprivate,if,lastprivate。private,reduction,schedule等。fimtprivate子句指定每个线程都有它自己的变景私有副本,并且变量要被继承主线程中的初值;lastprivate子句指定将线程中的私有变量的值在并行处理结束后复制回主线程中的对应变量:private子句指定每个线程都有它自己的变量私有副本:reduction子句指定一个或多个变量是私有的。并且在并行处理结束后这些变量要执行指定的运算;schedule子句指定如何调度for循环迭代。
1.3
Studi02005等都增加了对OpenMP的支持。
OpenMP剖析
OpenMP是一个为在共享存储的多处理机上编写并行程序而设计的应用编程接口.由一个小型的编译器命令集组成。包括一套编译制导语句和一个用来支持它的函数库。OpenMP是通过与标准Fortran,C和c+十结合进行工作的,对于同步共享变量、合理分配负载等任务,都提供了有效的支持.具有简单通用、开发快速的特点。OpenMP是可移植多线程应用程序开发的行业标准,在细粒度(循环级别)与粗粒度(函数级别)线程技术上具有很高的效率。OpmMP自动将循环线程化,提高多处理器系统上的应用程序性能。用户不必处理迭代划分、数据共享、线程调度及同步等低级别的细节。目前IntelC++编译器9.1、Studi02005均支持OpenMP2.5。文中
Studio主要介绍在MierosofiVisual2005中OpenMP的使用。
Visual
OpeaMP库函数
OpenMP使用库函数<omp.h>,库函数包括执行环境函数、锁函数
和定时三类。
.
2FFT并行算法探讨
2.1二维离散快速傅里叶变换(H)数字图像处理中进行频谱分析经常使用二维傅里叶变换(Fn),二维傅里叶变换在一维傅里叶变换的基础上推导得出.即将一个二维傅里叶变换的运算分解成水平和垂直方向上的一维傅里叶变换运算。一维离散傅里叶变换公式为:
C++8.0和MicrosofiVisual
1.1
OpenMP模型
删=古弘弦~