基于OpenMP+MPI+CUDA并行混合编程的N体问题实现Word下载.docx
- 文档编号:16209205
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:13
- 大小:207.03KB
基于OpenMP+MPI+CUDA并行混合编程的N体问题实现Word下载.docx
《基于OpenMP+MPI+CUDA并行混合编程的N体问题实现Word下载.docx》由会员分享,可在线阅读,更多相关《基于OpenMP+MPI+CUDA并行混合编程的N体问题实现Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
因此,出现了并行体系结构计算机和并行编程技术。
高性能并行计算(HPC)是求解大规模计算问题的有力手段之一。
HPC把计算问题分解成小的计算任务,同时在多个计算单元上执行各个计算任务。
本文基于当前流行的SMP集群硬件体系结构和SMP集群多层次并行化编程模型,采用OpenMP+MPI+CUDA的混合编程模型进行了N-body问题的算法实现,并将该算法与传统的N体并行算法进行了执行时间与加速比的比较。
2.SMP多核集群体系结构
高性能并行计算的研究包括并行计算机体系结构、并行程序设计、并行算法理论模型和并行算法实践应用四个方面。
2.1并行计算机系统结构
并行计算机体系结构主要有对称多处理器共享存储并行机(SMP)、分布式共享存储并行机(DSM)、大规模并行机(MPP)和SMP多核集群系统等。
其中,SMP体系结构采用商用微处理器,通常有片上和外置Cache,具有低通信延迟的特点,可采用多线程机制(如Pthreads)和编译制导(如OpenMP)并行编程,其实现较为简单,但缺点是可扩展性较差;
MPP则是指由数百或者数千台处理器所构成的规模较大的计算机系统,基于分布存储的多计算机系统,具有良好的可扩展性,主要采用消息传递机制,实现标准有MPI,PVM等,但其处理器之间的通信开销大,编程比较困难。
2.2多核SMP集群系统
SMP多核机群系统(SymmetricMultiprocessorCluster)由固定数量的独立节点构成的多级体系结构,这些节点有拥有多个CPU的SMP、普通计算机以及服务器,它们之间能够协同工作,并且能作为一个独立的计算机资源运用。
SMP计算机系统因其高性价比而得到广泛应用。
全球超级计算机2014年TOP500是以Linkpack浮点计算能力来排位的,现在全球最快的超级计算机是我国的天河2号,已经达到了33.86petanops(千万亿次)的浮点峰值计算能力。
目前超级计算机的体系结构主要有两类,一类是机群架构(C1usters),另外一类是大规模并行处理机架构(MPP)。
目前,在前十名超级计算机中,大部分是SMP机群系统。
其物理结构如下图2-1所示。
图2-1SMP集群体系结构
SMP集群架构一方面,节点内一般采用两个或以上的偶数个多核CPU,来保证单个节点的处理性能;
另一方面,节点之间使用InfiniBand高速计算网络进行数据通信,延迟仅100ns,保证了节点间通信控制的实时性。
很多高性能计算平台(HPC)采用具有层次结构的SMP集群系统。
SMP集群节点间采用消息传递的分布式存储结构,集群节点内部采用共享存储模型。
如图1所示。
因此,SMP集群不仅兼顾了单个节点的强大的并行能力,而且具有分布式并行系统的高扩展性,强连通。
3SMP多层次并行程序设计模型
并行算法设计模型是高性能计算中软硬件之间的桥梁。
并行编程模型是一个程序抽象的集合,用于并行程序设计的编程模型包括:
分布式存储消息传递编程模型MPI、共享内存模型OpenMP、多核微处理器细粒度编程模型CUDA和基于MPI、OpenMP+CUDA的多层次混合编程模型等。
3.1SMP多核体系结构
SMP集群(cluster)层次并行体系结构计算机已经成为国内外主流的并行体系结构。
3.1分布式存储编程模型MPI
消息传递模型MPI(MessagePassingInterface)是目前分布式存储系统上的主流编程模型。
它是基于进程并行,需要用到明显的发送和接收消息。
消息传递模型在C、Fortran和C++等编程语言都有相应的函数库。
开发人员在编写并行程序时,只要安装MPI的函数库,就可以方便的调用MPI的函数。
而在分布式存储结构中,处理器之间常常要采用消息传递来完成消息交换、同步等等功能。
MPI模型适用于大规模并行处理机(MPP)和机群。
MPI具有可移植性好、功能强大、效率高等优点,特别适用于粗粒度的并行,几乎被所有多线程操作系统(包括UNIX,WindowsNT等)支持,是目前超大规模并行计算最可信赖的平台。
。
但它也有许多不足之处:
消息传递和全局操作的开销非常大;
细粒度任务会引发大量的通信;
动态负载平衡困难;
将串行程序转换为并行程序需要对代码作大量改动;
程序员完成数据和任务的划分,编程和调试的难度大。
3.2共享主存模型OpenMP
基于编译制导的OpenMP是目前广泛使用的共享存储编程模型。
它是多线程编程模型之一,在共享存储体系结构上应用的一种应用程序编程接口(API)[]。
OpenMP并行编程技术因为它的编程简单、可移植性好,多使用在UNIX以及WindowsNT等等各种平台,OpenMP的应用广泛,因此被当做共享变量编程模型的一个代表。
OpenMP是对一些基本语言进行的扩展,它并不是一种新的语言,比如常用的Fortan、C和C++等等。
OpenMP编程环境包括编译指导语句、运行库函数和环境变量。
OpenMP的编程相对简单,充分利用了共享存储体系结构的特点,避免了消息传递的开销。
虽然它也支持粗粒度的并行,但主要还是针对细粒度的循环级并行。
OpenMP的另一个特点在于将串行程序转换为并行程序时无须对代码作大的改动。
其不足之处有只能在共享存储结构的机器上运行;
数据的放置策略不当可能会引发其他问题;
并行化的循环粒度过小会增加系统开销等。
OpenMP的并行机制主要是fork-join(如图3-1所示),当程序开始串行执行时是有一个主线程,并行制导语句是在并行区域中建立了很多线程。
在这个区域内,多个线程执行同样的代码块,也可以用工作共享结构体来并行执行各种任务。
图3-1fork-join并行机制
(1)Fork:
主线程在遇到parallel指令后,会自动创建一组并行的线程,这样并行区域中的代码被复制,各个线程都会对这段代码进行并行执行。
(2)Join:
并行域运行结束以后会产生一个路障,除主线程以外的其他线程或者被中断或者被同步,这时只有主线程能通过路障,最后程序中只有主线程在执行。
3.3多核微处理器细粒度编程模型CUDA
CUDA(ComputeUnifiedDeviceArchitecture,统一计算设备架构)是2007年由nVidia推出的一套并行编程模型。
以游戏加速和图像处理为初衷设计的GPU(graphicsprocessingunit,图形处理器)以超出摩尔定律的速度发展,在利用GPU进行并行计算的迫切需求下,CUDA编程模型产生。
至今已有众多研究者利用GPU的高度并行性特点将科学计算算法迁移至CUDA编程模型并在GPU上获得了相对于CPU平均数十倍的性能提升。
CUDA是首款并行运算语言,CPU专用于解决可表示为数据并行计算的问题,即在许多数据元素上并行执行的程序,具有极高的计算密度(数学运算与存储器运算的比率)。
由于所有数据元素都执行相同的程序,因此对精密流控制的要求不高;
由于在许多数据元素上运行,且具有较高的计算密度,因而可通过计算隐藏存储器访问延迟,而不必使用较大的数据缓存。
CUDA编程模型主要有SIMT和显示数据调用2个主要特点。
CUDA的运行方式为SIMT(SingleInstructionMultipleThread,单指令多线程),即编程设计人员把编程的SIMD硬件多项作为若干个标量处理器调用,保证每个处理器核心一直处于被利用的状态,达到提升并行化效果的目的。
CUDA访存指令比C语言增加了一项对共享内存(SharedMemory)的显示操作指令,以此提高CUDA并行程序运行效率。
3.4多核机群SMP系统上MPI+OpenMP+CUDA三级混合编程模型
程序提交到SMP集群系统后,由于各物理节点间的分布式存储结构,节点间通过MPI消息传递模式,由程序员在不存在相关性的情况下,将任务划分为子任务,每个子任务通过MPI编程模型的消息广播到SMP集群的每个节点机上;
由于节点机采用共享存储体系结构,每个节点机在收到广播的子任务后,内部通过OpenMP并行模型,利用OpenMP编译制导语句按照某种规约将子程序分配到几点的多核处理器的每个CPU上,此过程对程序员是透明的,再由每个处理器建立若干线程。
GPU是具有可并行执行多条线程的设备。
利用CUDA进行GPU编程时,GPU可以视为CPU的哟个协助处理器CPU的线程运行在CUDA设备上,每个CPU线程控制一个不同的CUDA设备,CUDA程序把从每个核心中要处理的数据细分成更小的区块,然后并行的执行它们。
在CUDA的编程模型下,将问题划分为两部分,一部分在host端执行"
另外一部分在device端执行。
host端是指在CPU上执行的部分,而device端是在显示芯片上执行的部分。
当GPU计算程序运行的时候,只是需要在主CPU上运行程序,CUDA会自动在GPU上载入和执行程序。
主机端程序可以通过高速的PCIExpress总线与GPU进行信息交互。
在运行期间,CUDA线程可以从多个存储区访问数据。
每个线程有一块私有的本地存储区。
每个线程block有一个共享存储区。
只要block存在,相应的共享存储区就可以访问。
该共享存储区对于block内的所有线程都是可见的,在最高层次上,所有的线程都可以访问同一块全局存储区。
4.N体问题程序实现
5.
4.1N体问题的数学描述
N体问题是为了确定给定的N个粒子或者天体通过引力的相互作用以后速度和位置的变化情况,因此首先要用到牛顿定律,来计算两个物体相互之间的引力:
(1)
在整个系统中的每个物体都会受到来自其他N-1个物体的影响,于是在每个方向上的力都可以被一起累加,在总的力的作用下,物体会做加速运动,这时可以根据F=ma求出加速度。
根据上面的两个基本概念,对N体问题的就可以进行对应的计算,假设有一个系统集合
,它表示一个系统空间里面的N个粒子,
、
分别表示粒子q、k的位置,其中
和
分别表示粒子q和k的质量,在这里用万有引力公式来对任意两个粒子之间的相互作用力进行计算,公式如下:
(2)
要求解粒子q的整体受力时,需要将系统中除q以外的其他所有粒子作用在粒子q上的力进行叠加,其计算公式如下:
(3)
计算出受力以后,根据加速度求解公式a=F/m又可以求出粒子q的加速度
(4)
(5)
在t时刻时物体q的位置向量为
,速度为
,利用欧拉法求得t+1时刻物体q的位置向量为
,如图4-1,t+1时刻物体q的速度为
图4-1欧拉图
4.2N-body问题的算法思想
N体问题的算法思想是:
在这个系统中有N个粒子或天体,其中一个粒子要受到其他N-1个粒子的作用力,需要算出这个系统中每个粒子的所受的力,根据力求得该粒子此刻的速率,得出位移变化,这样确定了粒子运动后的所处的位置。
这种算法较为简单直接,精度较高,称为PP(Particle-Particle)算法,可以做并行计算处理。
算法可以描述如下:
foreachparticleq
forces[q]=0;
foreachparticleq{
foreachparticlek>
q{
x_diff=pos[q][X]-pos[k][X];
y_diff=pos[q][Y]-pos[k][Y];
dist=sqrt(x_diff*x_diff+y_diff*y_diff);
dist_cubed=dist*dist*dist;
force_qk[X]=G*masses[q]*masses[k]/dist_cubed*x_diff;
force_qk[Y]=G*masses[q]*masses[k]/dist_cubed*y_diff;
forces[q][X]+=force_qk[X];
forces[q][Y]+=force_qk[Y];
forces[k][X]+=force_qk[X];
forces[k][Y]+=force_qk[Y];
}
该算法是研究二维空间的N体问题的简化算法,这个算法中每个线程使用一个一维数组来存储计算的所有粒子的力,这些力将被添加到一个共享数组。
除了循环部分,使用一个区块时间表来表示每个并行程序计算的力,它使用一个循环分布。
基于pp算法的三级hybrid编程的N-body问题程序框架如下:
#include<
stdio.h>
omp.h>
__globa__voidkemel(int*arrary1,int*arrary2,int*arrary3)/*CUDA内核程序*/
{
…………//CUDA内核操作
exterm”C”voidrun_kemel()
#pragmaompparalleldefault(shared)private(i,j)/*OpenMP多线程并行*/
cudaMalloc((void**)&
devarray1,sizeof(int)*BLOCK-SIZE);
/*CUDA操作*/
devarray2,sizeof(int)*BLOCK-SIZE);
devarray3,sizeof(int)*BLOCK-SIZE);
cudaMemcpy(devarry1,array1,sizeof(int)*BLOCKSIZE,cudaMemcpyHostToDevice);
cudaMemcpy(devarry2,array2,sizeof(int)*BLOCKSIZE,cudaMemcpyHostToDevice);
kemel<
<
n,m>
>
(devarry1,devarry2,devarry3);
cudaMemcpy(devarry3,array3,sizeof(int)*BLOCKSIZE,cudaMemcpyHostToDevice);
…………/*CUDA其他操作*/
cudaFree(devarry1);
/**********************************/
Mainprogram
/*********************************/
mpi.h>
Voidrun_kemel();
intmain(int&
arge,char*argv[])
intrank,size;
MPI_Init(&
arge,&
argv);
/*MPI初始化*/
MPI_Comm_rank(MPI_COMON_WORLD,&
rank);
/*获取进程号*/
MPI_Comm_size(MPI_COMM_WORLD,&
size);
/*每个进程分配的大小*/
run_kemel();
/*调用CUDA程序*/
MPI_Finalize();
/*MPI结束*/
4.3实验的软硬件环境
4.3.1实验的硬件环境
针对N体问题,选择在曙光W580I机群进行,曙光W580I机群属于刀片式服务器机群,由一些刀片服务器作为计算节点,每个刀片服务器上拥有两个AMD四核处理器。
4.3.2实验的软件环境
曙光W580I机群使用SUSELinuxEnterpriseServer10SP2这个操作系统,在这里选用Linux是由于它是个开源操作系统,它的优势在于可操作性好、二次开发性强。
曙光W580I机群所使用的网络协议是IPv4,系统内使用的MPI消息传递库版本为MPICH2,OpenMP编译器采用的是OMPi-1.4版本,采用GCC4.2.4编译器进行编译基于OpenMP编程模型设计的程序。
系统使用InfiniBand高速计算网络进行数据通信,提供NFS文件共享服务。
通过千兆管理网络管理和提供用户登录。
在这里通过Windows客户端远程登陆来操作曙光W580I机群,Windows客户端能使用SSHSecureShellClient,Putty
对N体问题进行并行化程序设计就是使用远程操作完成的。
4.4多核SMP集群层次化编程的性能评测参数
对于N体问题,关于这个问题的PP(particle-particle)算法使用OpenMP+MPI+CUDA三级混合并行编程模型,在曙光W580I上编译和运行,然后得出运行时间,计算加速比。
Amdahl定律是并行存储的主要性能模型。
公式如下:
(6)
其中
(
)是代码中串行部分所占比例,n是CPU可执行单元的个数。
串行比例;
(7)
表示指令总数,
表示程序中串行代码的指令数,
表示并行代码的指令数。
由于Amdahl定律受限于1/f的不足,而且Amdahl定律对于多级编程模型的评测误差很大,提出一种基于多核SMP集群的层次化编程模型的效率评测规则。
定义1三级层次化混合编程模型加速比:
(8)
其中,
为串行计算部分所占比例,
)为进程串行比,k为集群节点数,
线程并行比,p为节点CPU数目(假设SMP集群每个节点的CPU个数相等)。
5.仿真实验结果分析.
在4.3节的实验软硬件环境下,使用4.2节的又换算法。
然后通过改变线程数,numberofthreads分别给定2,4,6,8,10,12,14,16,18,20,得出节点内使用不同线程数的执行时间,结果如表3。
表4-1执行线程数与执行时间
线程数
执行时间(s)
2
15.76066
12
3.361357
4
8.191064
14
4.524781
6
5.791845
16
4.051018
8
4.556821
18
3.672812
10
3.816411
20
3.457803
线程数/个
时间/s
图3OpenMP线程数与执行时间
图3表明了OpenMP并行程序在执行时节点内线程数和执行时间之间的关系。
已有的工作成果表明:
线程数与机群里物理CPU的个数相同时,加速比达到最优;
在这个图中我们可以看出,在运行并行程序时线程数为12时,运行的时间最低,而12正是机群里物理CPU的个数。
这一部分是由于当线程数比CPU的个数小的时候,机群的性能还没有达到最好的状态,运行并行程序时会花费较多的时间;
当节点内线程数大于CPU的个数时,线程之间会在总线和带宽上有竞争,而且进程与线程间的频繁切换、多线程的启动和终止等等原因造成了较长的运行时间。
因此在执行OpenMP并行程序时,节点内的线程数最好不要采用过多,最好采用与硬件处理器相等的个数,这时花费的时间最少。
表1优化后程序的执行线程数与加速比
节点数(处理器个数)
Hybrid编程加速比
OpenMP加速比
1
(2)
1.937588
1.99538
2(4)
3.728168
4.04274
3(6)
5.272527
5.84153
4(8)
6.701527
7.13475
5(10)
8.00167
8.87423
6(12)
9.08492
9.8422
图4纯OpenMP和hybrid编程模型加速比对比图
加速比的值显示在表1中,OpenMP编程优化前后加速比的对比在图4中显示,由此可以得出结论:
在相应的条件下优化一些程序可以提升计算速率,而且也说明了用OpenMP并行程序设计时需要根据特定的条件进行优化。
6.结束语
本
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 OpenMP MPI CUDA 并行 混合 编程 问题 实现