《并行计算教案.ppt》由会员分享,可在线阅读,更多相关《并行计算教案.ppt(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、并行算法实践,国家高性能计算中心(合肥),2,2019/10/22,SMP集群上MPI与OpenMP混合编程,国家高性能计算中心(合肥),3,2019/10/22,SMP集群体系架构,国家高性能计算中心(合肥),4,2019/10/22,SMP集群体系架构,每节点为单个计算机系统且配备一份OS节点间属分布存储;节点内为共享存储两级并行节点间消息传递节点内共享变量典型机器IBM ASCI White、Sun Ultra HPC、SGI Origin 国产的曙光3000,国家高性能计算中心(合肥),5,2019/10/22,SMP集群编程模型,根据呈现给程序员的编程界面层次数分为两类 :单一存储模
2、型SMM(Single Memory Model)混合存储模型HMM(Hybrid Memory Model),国家高性能计算中心(合肥),6,2019/10/22,SMP集群编程模型,单一存储模型具有编程界面简单、直观,大量细节被隐藏,易于算法实现等优点,但其性能大大影响了该模型的广泛应用,因为性能受底层硬件实现机制的约束。 它又可以细分为:纯共享ASMM(All Shared Memory Model)如各种DSM和SVM系统。纯消息传递模型AMPM(All Message Passing Model) 如不支持共享存储,则将SMP集群看作普通的集群。,国家高性能计算中心(合肥),7,20
3、19/10/22,SMP集群编程模型,混合存储模型 在SMP集群体系结构下,同时使用共享变量和消息传递两种编程界面的模型。针对SMP集群的特点,节点内利用共享存储进行通信,节点间采用分布式存储的消息传递进行通信。混合存储模型,因为它是针对SMP集群体系结构提出的,是SMP集群体系结构下编程模型中性能最高的。但它也有着难以使用的缺点,因为程序员需要同时掌握两种编程界面,无疑对普通程序员来说困难一些。,国家高性能计算中心(合肥),8,2019/10/22,SMP集群混合编程模型,节点内,共享变量,节点内,共享变量,消息传递,多线程OpenMP,多线程OpenMP,MPI,国家高性能计算中心(合肥)
4、,9,2019/10/22,MPI+Thread VS. MPI+OpenMP,OpenMP和Thread的根本实现机制一致,都是由操作系统支持的线程实现OpenMP比Thread易用性高很多。OpenMP直接提供了大量的并行操作语句,也封装了线程的同步和互斥操作,而使用Thread模型时却还要考虑繁杂的线程间的同步和互斥,无疑易用性远远不及OpenMP。例如,Pthreads不支持增量并行化,给定一个串行计算程序,用户很难使用Pthreads将其并行化,用户必须考虑很多低级细节,因而Pthreads不能很自然的支持循环级并行,用户需大量修改串行代码,而OpenMP能灵活的支持粗粒度和细粒度并
5、行化,很多串行代码能够简单的并行化,国家高性能计算中心(合肥),10,2019/10/22,MPI+Thread VS. MPI+OpenMP,使用Thread模型是一种低级的方法,因为它们一般使用库方法,而不是编译制导法,库方法妨碍编译优化虽然Thread的计算性能好于OpenMP,但只是略优于OpenMP,而这点性能差别与易用性和其他性能的巨大差别比较起来微不足道。我们选择MPIOpenMP,国家高性能计算中心(合肥),11,2019/10/22,MPI+OpenMP混合编程,MPI执行模型, MPI_Init( ,国家高性能计算中心(合肥),12,2019/10/22,MPI+OpenM
6、P混合编程,OpenMP执行模型, double ANN;#pragma omp parallel for for(i=0;iN;i+) for(j=0;jN;j+) Aij = #pragma omp parallel,国家高性能计算中心(合肥),13,2019/10/22,MPI+OpenMP混合编程,国家高性能计算中心(合肥),14,2019/10/22,MPI+OpenMP混合编程,在每个节点上只有一个MPI进程,该进程首先进行初始化;,国家高性能计算中心(合肥),15,2019/10/22,MPI+OpenMP混合编程,每个节点上的MPI进程可以独立作一些局部计算,需要时也可以进行节
7、点间的通信;,国家高性能计算中心(合肥),16,2019/10/22,MPI+OpenMP混合编程,在MPI进程内的主要计算部分(通常是循环部分),采用OpenMP多线程并行求解;,国家高性能计算中心(合肥),17,2019/10/22,MPI+OpenMP混合编程,在OpenMP求解部分结束后,MPI进程也可以做局部计算、通信或同步;,国家高性能计算中心(合肥),18,2019/10/22,MPI+OpenMP混合编程,OpenMP多线程求解部分和MPI进程局部计算、通信都可以穿插进行,当全部计算工作结束后,MPI进程结束;,国家高性能计算中心(合肥),19,2019/10/22,MPI+O
8、penMP混合编程,节点内并行化粒度有粗粒度并行化和细粒度并行化两种方法。,国家高性能计算中心(合肥),20,2019/10/22,MPI+OpenMP混合编程,节点内选择细粒度并行化,将可以达到性能和易用性两方面的兼顾,这是因为:绝大多数程序主要的计算量都在循环中,而细粒度并行化主要针对循环进行并行化;细粒度并行化比粗粒度并行化的工作量大大降低,程序员几乎不用关心其它并行化的细节,而只要在循环计算外使用OpenMP编译制导指令并行化即可,这样的工作量即便是相对单一编程界面来讲,也大不了多少;细粒度并行化方法对已有的MPI程序移植到SMP集群上,无疑也是最好的方法。,国家高性能计算中心(合肥)
9、,21,2019/10/22,MPI+OpenMP混合编程,细粒度并行化中循环选择可以遵循以下原则:应该选择计算时间占全局计算时间比例大的循环来进行并行化,这样才能显著提高性能;由于循环并行化会带来调度的开销,我们应该选择那些并行化后性能仍可以提高的循环。这就意味着对于计算量小的循环,我们应该直接放弃对它并行化;循环选择还有一个重要的问题就是并行化循环不能改变循环的原来语义。对循环进行并行化时,可能会改变循环的原来语义,这种情况存在跨迭代依赖关系的循环中可能会出现。因而对于并行化可能会改变原来语义的循环,我们也不能进行并行化。 (可以考虑修改原有循环。),国家高性能计算中心(合肥),22,20
10、19/10/22,MPI+OpenMP混合编程,优化措施 在OpenMP并行区域内不要通信(这里的通信指的是不同节点内的线程间的通信),在节点中多线程共用的代码间的通信会急剧增加带宽竞争;在单个线程中也尽量不要通信,因为通信一般都蕴含着同步操作,这会使得性能大大下降。如果必须在线程中通信,也应把通信次数尽可能的减少,或者把需要进行消息传递的代码改写到线程的外面进行通信;,国家高性能计算中心(合肥),23,2019/10/22,MPI+OpenMP混合编程,优化措施线程中的同步次数也是影响性能的一个重要因素,应该慎重使用同步操作和那些蕴含同步的操作。实际上,有很多程序员为了确保程序的正确性,习惯
11、于在代码中加入大量的同步操作。这样的做法虽然减少了程序受一些并行计算时不确定因素的影响,但在性能上也损失了很多;避免节点内不必要的数据拷贝;在细粒度并行化时,可能有一些循环因为数据的相互依赖性而无法进行并行化。,国家高性能计算中心(合肥),24,2019/10/22,MPI+OpenMP混合编程,MPI函数的使用情况这个模型要求MPI的实现必须线程安全 ;因为在同一个MPI进程内的OpenMP并行区域内的每个线程共用同样的MPI通信符和主线程的线程号,所以MPI_Init()不能在并行区域内调用,否则MPI_Init()将被调用多次; MPI的通信函数调用只能在SINGLE或是MASTER区域
12、内,并且要注意在多线程的情况下发送和接收的顺序,最好是都在MASTER的线程内完成;如:#pragma omp master MPI_Send();,国家高性能计算中心(合肥),25,2019/10/22,MPI+OpenMP混合编程,使用MPI通讯的线程间同步接收必须在数据使用前完成数据在发送完成前不能修改计算必须在发送操作调用前完成MPI函数调用必须保持有序,如只在master线程中调用,国家高性能计算中心(合肥),26,2019/10/22,MPI+OpenMP混合编程,使用MPI通讯的线程间同步在MPI_Send前设置路障(barrier) . . . #pragma omp para
13、llel for for() ; A = ; #pragma omp barrier #pragma omp MASTER MPI_Send ( A,. );,国家高性能计算中心(合肥),27,2019/10/22,MPI+OpenMP混合编程,使用MPI通讯的线程间同步在MPI_Recv或MPI_Wait之后设置路障(barrier) . . . #pragma omp master MPI_IRecv ( A, . ); . . . #pragma omp MASTER MPI_Wait ( . ); . . . #pragma omp barrier . = A(i),国家高性能计算中心
14、(合肥),28,2019/10/22,Pi-MPI+OpenMP混合编程示例,#include mpi.h#include omp.h#include #define N 1000000000int main( int argc, char* argv ) int rank, nproc; int i,low,up; double local = 0.0, pi, w, temp; MPI_Status status; MPI_Init( ,国家高性能计算中心(合肥),29,2019/10/22,MPI+OpenMP程序的编译 MPI编译器:mpicc Omni-OMP编译器:omcc 编译命
15、令: omcc omnicc=mpicc o exefile sourcefilempicc -cc=omcc -o pi-mpi-omp pi-mpi-omp.c -lm -O3 运行命令: export OMP_NUM_THREADS=xxx mpirun np PROCNUM exefile,# for compile your hybrid program with MPI and OpenMP mpicc -o your_mpi_omp_c_file -fopenmp your_mpi_omp_c_file.c# for run your hybrid program with MPI and OpenMPmpirun -np num_of_processes -machinefile /ma ./your_mpi_omp_c_file,国家高性能计算中心(合肥),30,2019/10/22,