260 likes | 678 Views
并行程序设计及 ScaLAPACK 函数库应用简介. 报告人:罗正平 导师:肖炳甲研究员. 并行计算 -- 高性能计算. 并行计算 ( Parallel Computing ) 是指在并行计算机上,将一个应用分解成多个子任务,分配给不同处理器,各个处理器之间相互协同,并行地执行子任务,从而达到加快求解的速度或提高求解应用问题规模的目的。 高性能计算 ( High Performance Computing , HPC) 超级计算 ( Super Computing ). 为什么需要并行计算机. 问题 : 科学和工程问题的数值模拟与仿真 计算密集
E N D
并行程序设计及ScaLAPACK函数库应用简介 报告人:罗正平 导师:肖炳甲研究员
并行计算--高性能计算 并行计算(Parallel Computing) 是指在并行计算机上,将一个应用分解成多个子任务,分配给不同处理器,各个处理器之间相互协同,并行地执行子任务,从而达到加快求解的速度或提高求解应用问题规模的目的。 高性能计算(High Performance Computing,HPC) 超级计算(Super Computing)
为什么需要并行计算机 • 问题: 科学和工程问题的数值模拟与仿真 • 计算密集 • 数据密集 • 网络密集 • 三种混合 • 要求:在合理的时限内完成计算任务 • 秒级 制造业 • 分钟级 短时天气预报(当天) • 小时级 中期天气预报(3~10日) • 尽可能快 长期天气预报(气候) • 可计算湍流模拟
并行计算的基本条件 • 并行计算机 • 应用问题必须具有并行度 • 并行编程
并行计算机 由多个计算单元组成,运算速度快、存储容量大、可靠性高的计算机系统。 也称巨型机或超级计算机。 Roadrunner 1.026PetaFlops
并行计算机体系结构 对称多处理机SMP(Symmetric Multiprocessor) 分布式共享存储并行计算机DSM(Distributed Shared Memory) 大规模并行计算机MPP(Massively Parallel Processing)
机群系统(cluster) • 每个结点都是一个完整的计算机;每个结点包含数个微处理器,结点内部采取共享存储 • 各个结点之间由高性能互联网络链接 • 网络接口和I/O总线松耦合链接 • 每个结点都有完整的操作系统
IBM刀片机群(HS21) Cluster based on SMP -- MPP
并行程序开发策略 应用问题的并行度,也就是应用问题可以分解为多个可并行执行的子任务。 现有的串行源代码 有目的稍许修改源代码 自动并行化 并行应用程序 (a)自动并行化 现有的串行源代码 重新链接 并行应用程序 开发并行库 (b)并行库 现有的串行源代码 编译器支持并行化 并行应用程序 作重大修改 (c)重新编写并行代码
并行程序设计 • 共享变量模型(Shared Variable) • 消息传递模型(Message Passing)
OpenMP 共享变量(Shared Variable) • OpenMP是基于线程的并行编程模型,使用Fork-Join并行执行模型。所有的OpenMP程序开始于一个单独的主线程,主线程串行执行直到遇到并行域才开始并行执行。 • 所有的OpenMP并行化,都是通过使用嵌入到C/C++或Fortran源代码中的编译制导语句来达到的。 主线程 Fork #include “omp.h” int main(int argc, char* argv[]) { int nthreads, tid; int nprocs; char buf[32]; /* Fork a team of threads */ # pragma omp parallel private(nthreds,tid) { /* Obtain and print thread id*/ tid=omp_get_thread_num(); printf(“Hello World from OMP thread %d\n”,tid); /* Only master thread does this */ if(tip==0){ nthreads=omp_get_num_threads(); printf(“Number of threads %d\n”,nthreads); } } return 0; } 并行域 Join 主线程 Fork Join 主线程
消息传递(Data Parallel) MPI Include “mpif.h” 其他参数说明 P/M 互连网络 MPI P/M …… …… Call MPI_Init() Call MPI_Comm_rank() Call MPI_Comm_size() P/M P/M 建立进程拓扑结构和新的通信器 P/M P/M 应用程序体: 1.计算控制程序体; 2.进程间通信。 • 基于MPI的并行程序,是有一个或多个彼此通过调用库函数进行消息收发通信的进程所组成。 • 绝大部分MPI实现中,一组固定的进程在程序初始化时生成,可以执行SPMD或MPMD模式。 Call MPI_Finalize() end
MPI MPI函数 进程0 进程1 进程2 进程3 program example1 include “mpif.h” !! MPI系统头文件 integer status(MPI_STATUS_SIZE),my_rank,p,source,dest,tag,ierr,data c-------进入MPI系统 call MPI_Init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD,my_rank,ierr) call MPI_Comm_size(MPI_COMM_WORLD,p,ierr) c-------数据交换 data=0 tag= 5 source= my_rank-1 if(source.eq.-1) source=p-1 dest =my_rank+1 if(dest.eq.p) dest=0 if(my_rank.eq.0) then call MPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr) call MPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr) else call MPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr) data=data+1 call MPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr) endif c-------广播数据 call MPI_Bcast(data,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr) c------打印输出 if(my_rank.eq.0) then if(data.eq.p-1) then print *,”Successful, data=”,data else print *,”Failure, data=”,data endif endif call MPI_Finalize(ierr) end init() 进入MPI系统 comm_rank() myrank=0 myrank=1 myrank=2 myrank=3 comm_size() p=4 p=4 p=4 p=4 data=0 data=0 data=0 data=0 source=3 source=0 source=1 source=2 dest=1 dest=2 dest=3 dest=0 send() recv() recv() recv() 数据交换 data=data+1 recv() send() data=data+1 send() data=data+1 send() send() recv() recv() recv() broadcast() output “data” 退出MPI系统 finalize()
ScaLAPACK 并行库开发高性能计算程序基本思想: 并行函数库提供经过优化的通用并行算法代码,用户只需根据需要调用相应函数就可编写并行程序。 ScaLAPACK (Scalable LAPACK)是LAPACK在分布式计算环境中的扩展,主要运行在基于分布式存储和消息传递机制的MIMD计算机以及支持PVM或MPI的集群上。
ScaLAPACK层次结构 BLAS: Basic Linear Algebra Subprograms PBLAS: Parallel Basic Linear Algebra Subprograms BLACS: Basic Linear Algebra Communication Subprograms LAPACK: Linear Algebra PACKage ScaLAPACK: Scalable Linear AlgebraPACKage
BLAS简介 BLAS是一组高质量的基本向量矩阵运算子程序。其从结构上分成3部分: Level 1 BLAS: 向量和向量,向量和标量之间的运算; Level 2 BLAS: 向量和矩阵间的运算; Level 3 BLAS:矩阵和矩阵之间的运算。 BLAS支持四种浮点格式运算:单精度实数(REAL)、双精度实数(DOUBLE)、单精度复数(COMPLEX)和双精度复数(COMPLEX*16)。对应子程序的首字母分别为S、D、C和Z。
LAPACK简介 LAPACK是建立在BLAS库基础上的线性代数函数库。包含了求解科学与工程计算中常见的数值线性代数计算问题,如线性方程组、线性最小二乘问题、特征值问题和奇异值问题等。还可以实现矩阵分解和条件数估计等相关计算。 LAPACK子程序可以分成3类: (1)驱动程序(driver routines):用于解决一个完整问题,如线性方程组求解; (2)计算程序(computional routines):也叫做简单LAPACK子程序,用以完成一个特定的计算任务,如矩阵的LU分解; (3)辅助程序(auxiliary routines):是被驱动程序和计算程序调用的子程序。主要完成对子块的操作和一些常用的底层计算,如计算矩阵范数等。
BLACS简介 BLACS是为线性代数设计的消息传递函数库。计算模型由一个一维或二维进程网格构成,每个进程存储矩阵和向量的一些片断。 BLACS包括点对点通信程序和聚合通信程序,同时包含构造、改变和查询进程网格的程序。 BLACS是建立在PVM或MPI等底层消息传递函数库基础上的,其目标是为通信提供专用于线性代数的可移植层。 0 1 2 3 0 1 BLACS二维进程网格
PBLAS简介 PBLAS即并行BLAS,执行消息传递并且其接口与BLAS基本相似。在基于ScaLAPACK函数库的程序中,进程之间的通信出现在PBLAS内部,从而使ScaLAPACK代码与LAPACK代码相当接近,甚至几乎一样,简化程序设计难度。 PBLAS结构上与BLAS一样分成三部分,其子程序名为BLAS子程序名之前加上P,表示并行。
ScaLAPACK Local:表示本地组件在一个进程中被调用,其参数只存储在一个进程中。 Global:全局组件是同步的并行程序,其参数包括矩阵和向量,分布在多个进程中。
0 1 ScaLAPACK基本步骤 0 1、初始化进程网格; 2、分配数据到进程网格上; 3、调用ScaLAPACK函数; 4、释放进程网格和退出并行应用。 1 0 1 0 1
Example 16*16 16*1 串行:SGEMV -- LAPACK/BLAS SUBROUTINE SGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
Example 0 1 0 1 0 2 3 1 16*16 16*1 1-8 9-16 1 1-8 1-8 PSGEMV 9-16 9-16