Imtoken钱包2.9.7|mpi

作者: Imtoken钱包2.9.7
2024-03-07 20:00:35

MPI 与并行计算入门 - 知乎

MPI 与并行计算入门 - 知乎切换模式写文章登录/注册MPI 与并行计算入门牧原一、MPI 介绍MPI 全名叫 Message Passing Interface,即信息传递接口,作用是可以通过 MPI 可以在不同进程间传递消息,从而可以并行地处理任务,即进行并行计算。需要注意的是,尽管我们偶尔会说使用 MPI 编写了某某可执行程序,但是 MPI 其实只是一个库,而不是一种语言,其可以被 Fortran、C、C++、Python 调用。说到并行,为了避免在概念上混淆,那我们又不得不再提一下串行、并发、同步、异步这几个容易混淆的概念。串行:指的是在执行多个任务时,各个任务按顺序执行,完成一个后才能进行下一个并行:指的是多个任务可以同时执行并发:并发编程又叫多线程编程,指的是在执行多个任务时,因为资源不够所以采用一个 CPU 轮换着进行这些任务,从而提高任务效率,因为切换任务的速度很快,所以看上去是多个任务一起进行同步:同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。例如消息发送方必须等待消息接收方接受完才能继续执行后续任务异步:异步就是彼此独立,在等待某件事的过程中继续做自己的事。例如消息发送方再发送完一条消息后不必等待接收方的接收即可继续执行后续任务在开始 MPI 之前还需要再了解一下有关 MPI 的一些基本概念,从而帮助我们在宏观上理解 MPI 通信首先是通信域(communicating domain),通信域定义了一组能够互相发消息的进程。在这组进程中,每个进程会被分配一个序号,称为 rank,进程间显性地通过指定 rank 作为标识来进行通信,一个进程 rank 可以指定另一个进程的 rank 以及独一无二的消息标签 tag 来发送消息。接收者也可以发送一个特定标签标记的消息的请求。类似于这样的涉及一个发送者以及一个接收者的通信被称为点对点(point-to-point)通信。当然在很多情况下,某个进程可能需要跟其他所有进程进行通信,比如主进程想发一个广播给所有的从进程。在这种情况下,手动去写一个个点对点通信就显得很笨拙,而且这样会导致网络利用率很低。MPI 有专门的接口帮我们处理这里所有进程间的集体性(collective)通信以上的概念目前先有个大概的理解即可,不需要特别深入,我们还是先步入正题,可以回过头来再学习这些概念接下来我们以 Fortran 语言为例对 MPI 中常用的函数进行讲解,其他语言的函数功能与参数基本上与 Fortran 类似二、MPI程序流程以下是一个基本 MPI 程序的流程,但此刻不必须立刻掌握这些,当我们学完 MPI 的基础知识后再回头来看这些会发现有更深入的认识图源网络三、6 个基本函数先给出一个使用了 MPI 的 Fortran 版本的Hello World 程序作为例子program main

use mpi

implicit none

integer rank, size, ierr

call MPI_INIT(ierr)

call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr)

call MPI_COMM_SIZE(MPI_COMM_WORLD,size,ierr)

write(*,*) "Hello world from process", rank, " of", size

call MPI_FINALIZE(ierr)

end program main上述是一个完整的并行代码,其中必须要先在代码中声明 use mpi,表示我们使用了mpi 来并行的执行我们的代码在装有mpi的环境下就可以直接通过以下命令来运行$ mpif90 main.f90

$ mpirun -n 4 ./a.out第一行是对代码进行编译的命令,如果是用 c++ 编写的话就用 mpicxx 来进行编译第二行是运行编译后的可执行文件的命令,其中 -n 4 表示启用了 4 个进程来运行可执行程序,每一个进程都运行一遍相同的可执行程序,只不过因为分配的参数 rank 不同所以会产生不同的效果最后输出的结果是可以看到我们在代码中仅仅打印了一句Hello world,但是最终执行的时候却出现了4条语句而且值得注意的是,rank0~rank3并不是顺序执行的,而是顺序随机的,而且 rank 是从 0 开始的下面我们对上述代码中所用到的一些函数进行讲解。1. MPI_INIT功能:初始化 MPI 环境在 MPI_INIT() 的过程中,所有 MPI 的全局变量或者内部创建的变量都会被创建出来,同时,通信域 MPI_COMM_WORLD 形成MPI 是按照进程组(Process Group)的方式工作,所有 MPI 程序在开始时均被认为是在通信域 MPI_COMM_WORLD 所拥有的进程组中工作,之后可以根据用户自己的需求建立其他进程组。MPI_INIT() 中传入的参数是一个类型为 integer 的参数,之后对于每个 MPI 函数在最后都需要传输这个参数,一般为 MPI_XXX_XXX(一堆参数, ierr),integer 类型的输出参数 (IERR) 代表调用错误码,执行成功返回 0对 MPI_INIT 的调用如下integer ierr

call MPI_INIT(ierr)通过上述的代码就完成了对 MPI 环境初始化2. MPI_FINALIZE功能:结束 MPI 计算call MPI_FINALIZE(ierr)ierr 为 integer 型变量,执行成功返回 03. MPI_COMM_RANK功能:返回执行当前代码的进程号integer rank,ierr

call MPI_COMM_RANK(comm,rank,ierr)comm 是通信域,一般为 MPI_COMM_WORLDrank 返回的是进程号ierr 为错误代码4. MPI_COMM_SIZE功能:确定进程数integer size,ierr

call MPI_COMM_SIZE(comm,size,ierr)comm 是通信域size 返回的是进程总数ierr 返回错误代码掌握了上述 4 个基本函数我们就可以自己去编写我们在一开始提到的例子了但是我们进行 MPI 编程并不仅仅是为了一条命令打印出 4 条语句,而是进行进程间的消息通信,下面将介绍两个基本的消息传递函数5. MPI_SEND功能:发送一条消息call MPI_SEND(buf, count, datatype, dest, tag, comm, ierr)6. MPI_RECV功能:接收一条消息call MPI_RECV(buf, count, datatype, source, tag, comm, status, ierr)看起来消息的发送和接收参数很多,但是实际上很容易进行记忆:前3个参数可以用来描述消息的内容,在 MPI 中称为消息缓冲(Message Buffer),这三个参数分别对应着 消息起始地址(buf)、消息长度(count)和消息类型(datatype)后三个参数可以用来描述接收/发送者的地址,在 MPI 中被称为消息信封(Message Envelop),这三个参数分别对应着 接收/发送进程号(dest/source),消息标签(tag)和通信域(comm)最后一个参数是 ierr,返回错误代码MPI_RECV 倒数第二个参数是描述了消息接收的状态 status接下来我将详细介绍上述的参数接收/发送函数参数说明Buf:接收/发送数据在内存中的起始地址指应用程序定义的用于发送或接收数据的地址,Fortran 中就是变量名/数组元素2. count:数据的个数 从 buf 开始发送/接收特定类型的数据的个数 数据类型的长度 * 数据个数的值 = 用户实际传递的消息长度3. datatype:接收/发送数据的数据类型:将 Fortran 定义的数据发送时,要通知 MPI 数据类型,Fortran 与 MPI 的数据类型需要对应图源网络 4. dest:目的地进程号 发送进程指定的接收该消息的目的进程,也就是接收进程的进程号 5. souce:发送进程号 指定了接收进程从哪个进程中接收消息,也就是发送进程的进程号。 如果指定为MPI_ANY_SOURCE则表示可以与通信域内所有发送进程的进程号相匹配 6. tag:发送标识符 取值非负整数值(0-32767),两进程间可能进行多次通信,发送操作和接收操作的标识符要匹配才接受.对于接收操作来说,如果 tag 指定为 MPI_ANY_TAG 则可与任何发送操作的 tag 相匹配7. comm:通信域 包含源与目的进程的一组上下文相关的进程集合,除非用户自定义(创建)了新的通信域,否则一般使用预先定义的全局通信域 MPI_COMM_WORLD 8. status:状态 这个参数是包含 MPI_STATUS_SIZE个整数的数组 可以返回表示发送进程的进程号、发送数据使用的消息标签以及接收操作返回的错误代码 在 Fortran 中使用 status(MPI_SOURCE)、status(MPI_TAG)和 status(MPI_ERROR)来调用 为了帮助大家更好地理解上述六条函数的作用,完成一条消息发送&接收的例子如下:program main

use mpi

implicit none

integer rank, size, tag, ierr

integer senddata, recvdata

integer status(MPI_STATUS_SIZE)

call MPI_INIT(ierr) ! 初始化 MPI 环境

call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) ! 返回该进程进程号

call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) ! 返回总进程数

if(rank == 0) then

senddata = 999

! 从 rank0 向 rank1 发送一个长度为 1 的整形数据

call MPI_SEND(senddata,1,MPI_INTEGER,rank+1,1,MPI_COMM_WORLD,ierr)

print *, 'Process ', rank, ' send', senddata,' to Process ', rank+1

endif

if(rank==1) then

! rank1 从 rank0 接收一个长度为 1 的整形数据

call MPI_RECV(recvdata,1,MPI_INTEGER,rank-1,1,MPI_COMM_WORLD,status,ierr)

print *, 'Process', rank,' receive ', recvdata, ' from Process' , rank-1

print *, 'Process', rank,' receive ', recvdata, ' from Process' , status(MPI_SOURCE)

endif

call MPI_FINALIZE(ierr)

end program main一些在逻辑上稍微复杂一些的例子定义的子程序relay(senddata,rank)表示了接收一个senddata可以从rank0一直往后传递消息,并且sendata每次被接收后都会 +1 ;module para

use mpi

implicit none

integer rank,size,ierr

integer senddata,recvdata

integer status(MPI_STATUS_SIZE)

contains

subroutine relay(start_num,rank)

integer start_num

integer senddata

integer recvdata

integer tag,rank

tag = 1

! 0 进程只发送消息

if (rank == 0) then

senddata = start_num

write(*,100) 'rank', rank, ' sends data ', senddata, ' to rank', rank+1

call MPI_SEND(senddata, 1, MPI_INTEGER, &

rank + 1, tag, MPI_COMM_WORLD, ierr)

! final 进程只接收消息

else if (rank == size-1) then

call MPI_RECV(recvdata, 1, MPI_INTEGER, &

rank - 1, tag, MPI_COMM_WORLD, status,ierr)

write(*,100) 'rank', rank, ' reveives data ', recvdata, ' to rank', rank-1

! 不是 0 进程和final进程都接收和发送信息

else

call MPI_RECV(recvdata, 1, MPI_INTEGER, &

rank - 1, tag, MPI_COMM_WORLD, status, ierr)

write(*,100) 'rank', rank, ' receives data ', recvdata, ' from rank', rank-1

recvdata = recvdata + 1

call MPI_SEND(recvdata, 1, MPI_INTEGER, &

rank + 1, tag, MPI_COMM_WORLD, ierr)

write(*,100) 'rank', rank, ' sends data ', recvdata, ' to rank', rank+1

endif

100 FORMAT(A4,I0,A15,I0,A10,I0)

end subroutine relay

end module

program main

use para

use mpi

integer start_num

start_num = 999

call MPI_INIT(ierr)

call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr)

call MPI_COMM_SIZE(MPI_COMM_WORLD,size,ierr)

call relay(start_num,rank)

!call greet(start_char,rank)

call MPI_FINALIZE(ierr)

end program main定义的greet(sendchar,rank)表示了每一个进程都与其他进程互相传递消息module para

use mpi

implicit none

integer rank,size,ierr

integer senddata,recvdata

integer status(MPI_STATUS_SIZE)

contains

subroutine greet(sendchar,rank)

character(len=5) sendchar,recvchar

integer tag2,rank,dest,source

tag2 = 2

do dest = 0, size - 1

if (dest /= rank) then

call MPI_SEND(sendchar, 5, MPI_CHARACTER, &

dest, tag2, MPI_COMM_WORLD, ierr)

endif

enddo

do source = 0, size - 1

if (source /= rank) then

call MPI_RECV(recvchar, 5, MPI_CHARACTER, &

source, tag2, MPI_COMM_WORLD,status, ierr)

write(*,*) "Process ", rank, " received message ", recvchar, " from process ", source

endif

end do

end subroutine greet

end module

program main

use para

use mpi

character(len=5) start_char

start_char = 'hello'

call MPI_INIT(ierr)

call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr)

call MPI_COMM_SIZE(MPI_COMM_WORLD,size,ierr)

call greet(start_char,rank)

call MPI_FINALIZE(ierr)

end program main参考MPI编程入门(Fortran)MPI Tutorial 老师上课教授的课程声明该教程只用于学习交流,禁止用于商业用途,如转载请与我联系说明并标注来源编辑于 2023-11-27 17:36・IP 属地新加坡MPI科学计算Fortran​赞同 23​​1 条评论​分享​喜欢​收藏​申请

MPI 教程介绍 · MPI Tutorial

MPI 教程介绍 · MPI Tutorial

MPI Tutorial

   

Tutorials

   

Recommended Books

   

About

MPI 教程介绍

Author: Wes Kendall

分布式计算现在对于我们来说,就跟日常生活里的手机和电脑一样普及。你很明显应该认同这个观点,因为你发现了这个了不起的 MPI 教程网站!不管你是出于什么原因想学习并行编程(parallel programming),或者说分布式编程、并行编程,也许是因为课程需要,或者是工作,或者单纯地觉得好玩,我觉得你都应该选择一项在未来几年依然十分有价值的技术去学习。我觉得「消息传递接口」(Message Passing Interface, MPI)就是这样一项技术,而且学习它确实可以让你的并行编程知识变得更深厚。尽管 MPI 比大多数并行框架要更底层(比如 Hadoop),但是学习 MPI 会为你的并行编程打下良好的基础。

在我开始介绍 MPI 之前,我想要解释下我为什么做这个教程。当我在读研究生的时候,我大量的用到了 MPI。当我在 Argonne National Laboratory 实习的时候,我很幸运地可以跟 MPI 社区里很厉害的一些人一起工作,并且使用 MPI 在庞大的超级计算(supercomputing)集群上面做了很多疯狂的事情。然而,即使有这些资源和懂行的人可以问,我还是觉得学习 MPI 是件苦差事。

对我来说学习 MPI 很难主要是因为以下三个方面。第一,网上关于 MPI 的资料几乎都是过时的,或者不那么全的。第二,我想要自己简单地搭建一个可以运行 MPI 的集群环境,但是找不到这样的教程。最后,我读研究生的时候能买到的最便宜的关于 MPI 的书要60美元 - 对研究生来说太贵了。就目前分布式编程对我们生活的重要性来说,我觉得提供一个更好的教程能让别人学习 MPI 这样一个并行编程最重要的协议同等重要。

尽管我不敢自称是 MPI 专家,我觉得以简单易读的教程形式传播这些我在研究生阶段学习到的知识还是很有意义的一件事,你可以根据教程在你自己的集群上运行 MPI 程序!我希望这个教程能对你所有帮助,也许是事业上的,也许是学习上的,或者可能是生活上的帮助 - 因为分布式编程不仅仅意味着现在,它还是未来!

MPI 的历史简介

在 90 年代之前,程序员可没我们这么幸运。对于不同的计算架构写并发程序是一件困难而且冗长的事情。当时,很多软件库可以帮助写并发程序,但是没有一个大家都接受的标准来做这个事情。

在当时,大多数的并发程序只出现在科学和研究的领域。最广为接受的模型就是消息传递模型。什么是消息传递模型?它其实只是指程序通过在进程间传递消息(消息可以理解成带有一些信息和数据的一个数据结构)来完成某些任务。在实践中,并发程序用这个模型去实现特别容易。举例来说,主进程(manager process)可以通过对从进程(worker process)发送一个描述工作的消息来把这个工作分配给它。另一个例子就是一个并发的排序程序可以在当前进程中对当前进程可见的(我们称作本地的,locally)数据进行排序,然后把排好序的数据发送的邻居进程上面来进行合并的操作。几乎所有的并行程序可以使用消息传递模型来描述。

由于当时很多软件库都用到了这个消息传递模型,但是在定义上有些微小的差异,这些库的作者以及一些其他人为了解决这个问题就在 Supercomputing 1992 大会上定义了一个消息传递接口的标准- 也就是 MPI。这个标准接口使得程序员写的并发程序可以在所有主流的并发框架中运行。并且允许他们可以使用当时已经在使用的一些流行库的特性和模型。

到 1994 年的时候,一个完整的接口标准定义好了(MPI-1)。我们要记住 MPI 只是一个接口的定义而已。然后需要程序员去根据不同的架构去实现这个接口。很幸运的是,仅仅一年之后,一个完整的 MPI 实现就已经出现了。在第一个实现之后,MPI 就被大量地使用在消息传递应用程序中,并且依然是写这类程序的标准(de-facto)。

第一批 MPI 程序员的一个真实写照

MPI 对于消息传递模型的设计

在开始教程之前,我会先解释一下 MPI 在消息传递模型设计上的一些经典概念。第一个概念是通讯器(communicator)。通讯器定义了一组能够互相发消息的进程。在这组进程中,每个进程会被分配一个序号,称作秩(rank),进程间显性地通过指定秩来进行通信。

通信的基础建立在不同进程间发送和接收操作。一个进程可以通过指定另一个进程的秩以及一个独一无二的消息标签(tag)来发送消息给另一个进程。接受者可以发送一个接收特定标签标记的消息的请求(或者也可以完全不管标签,接收任何消息),然后依次处理接收到的数据。类似这样的涉及一个发送者以及一个接受者的通信被称作点对点(point-to-point)通信。

当然在很多情况下,某个进程可能需要跟所有其他进程通信。比如主进程想发一个广播给所有的从进程。在这种情况下,手动去写一个个进程点对点的信息传递就显得很笨拙。而且事实上这样会导致网络利用率低下。MPI 有专门的接口来帮我们处理这类所有进程间的集体性(collective)通信。

把点对点通信和集体性通信这两个机制合在一起已经可以创造十分复杂的并发程序了。事实上,这两个功能已经强大到我现在不需要再介绍任何 MPI 高级的特性了,我会把那些放到后面的教程中。现在,我们可以从在单机上安装 MPI或 启动一个 Amazon EC2 MPI 集群 开始我们的 MPI 旅途了!如果你已经把 MPI 装好了,那太好了,直接开始这个MPI Hello World 课程吧。

Want to contribute?

This site is hosted entirely on GitHub. This site is no longer being actively contributed to by the original author (Wes Kendall), but it was placed on GitHub in the hopes that others would write high-quality MPI tutorials. Click here for more information about how you can contribute.

Please enable JavaScript to view the comments powered by Disqus.

© 2023 MPI Tutorial. All rights reserved.

两小时入门MPI与并行计算(二):MPI的安装与配置 - 知乎

两小时入门MPI与并行计算(二):MPI的安装与配置 - 知乎首发于高性能计算切换模式写文章登录/注册两小时入门MPI与并行计算(二):MPI的安装与配置熊巍MPI与OpenMPI和MPICH等的关系MPI(Message Passing Interface),由其字面意思也可些许看出,是一个信息传递接口。可以理解为是一种独立于语言的信息传递标准。而OpenMPI和MPICH等是对这种标准的具体实现。也就是说,OpenMPI和MPICH这类库是具体用代码实现浏MPI标准。因此我们需要安装OpenMPI或者MPICH去实现我们所学的MPI的信息传递标准。为了考虑到教程的完整性,所以单独用一篇文章来介绍一下MPI库的安装方法。安装方法千篇一律,网上随手一查就能查到一堆,我本人也写不出什么花样来。若你已经配置好了MPI环境,可以忽略本文,直接跳到下一章去学习。考虑到大部分人在实现并行编程都是在CPU集群上完成,而这些服务器几乎都是使用的Linux系统。因此下文采用Linux来作为讲解,为了使本文看起来稍微有点干货,我尽量在安装步骤中扩展一些我认为Linux初学者有必要知道的东西。相信初学者在用集群安装时会出现各种各样的问题,报一些对于初学者来说难以解决的问题。这对于初学者来说很打击积极性,如果学习的热情被安装时的报错信息消耗殆尽是很可惜的。各位在用集群安装时,因为没有root权限,可能会出现各种各样比如编译器过老,管理员安装的编译器路径地址不知道等问题,这些可能初学者难以解决。用虚拟机学习MPI的学习者可能就会好一些,因为有root权限,所需要的环境都可以自己装。初学者如果遇到安装时的报错解决不了的话,也可以私信或者评论区留言。MPICH和OpenMPI等是采用MPI标准的通信协议。本文将选择MPICH的安装作为示范,一步一步讲解如何配置MPI的环境。 OpenMPI的按照方法也同理。一、MPI的下载与安装 在开始安装之前,先检查一下是否已经安装好了相应的编译器。 which gcc

which gfortran 当显示了gcc和gfortran的路径,即可进行下一步的安装,若没有相应的编译器,请先安装编译器。 如何安装编译器可以自行使用搜索引擎查询。在linux中,which是用来查询环境变量的地址。而这里所指的环境变量,通俗一点讲就是在当前shell中,这些如gcc这一命令是指向哪个文件。比如你安装了两个版本的gcc编译器,你就需要去设置环境变量,告诉系统当你调用gcc的时候你到底想调用哪个版本的gcc,把你想调用的那个gcc的路径和gcc绑定起来。所以,当执行上述命令,得到了编译器地址,就可以进行下一步了。如果没有,要么是环境变量中没有指定编译器路径,要么是没有安装编译器,需自行判断。当检查完编译器之后,去https://www.mpich.org/downloads/ 选择合适的版本下载,对于没有图形界面的服务器,也可使用wget命令下载。 tar命令是解压文件的命令。MPI库通常采用的是源码安装,因此,需要使用cd命令进入到解压后的文件夹中,使用./configure进行安装前的设置与检查,由于我们只需要更改一下安装的路径,因此在--prefix这一参数中,设置你想要安装的路径即可。执行这一行之后,就会开始检查编译环境是否满足,此时报错多半是因为编译器安装的问题或者编译器版本不匹配的问题,一般通过安装最新的编译器能解决。这一步成功完成之后,即可使用make命令去执行编译。该路径下makefile文件已经写好了这些源代码的编译规则,因此输入make即可开始按照makefile的规则对源码进行编译。如果你做的工作和底层语言如Fortran、C或C++之类的,还是有必要学习一下makefile的写法,有助于之后的多文件编译工作。顺便一提,使用Linux学习底层语言是更有好处的,因为Windows初学编程语言通常是使用集成开发环境,在对代码进行编译时通常是一键操作,导致中间的几个过程会被下意识的忽略掉,这将导致一开始适应不了Linux环境下编译文件的命令。当make完成之后,就可以使用make install命令进行安装了。wget http://www.mpich.org/static/downloads/3.3.2/mpich-3.3.2.tar.gz

tar -zxvf mpich-3.3.2.tar.gz #解压下载的压缩包

cd mpich-3.3.2 #进入解压后的文件夹内

./configure --prefix=/usr/local/mpich-3.3.2

# --prefix这一参数是设置安装的路径,根据需要设置合适的路径即可,但需要记住安装的位置

make

make install 如果没有报错,就说明顺利安装完成了。 二、环境变量的配置 安装完成后,可以去之前--prefix设置的路径去看一下安装结果。安装好了之后,还需要告诉系统mpi库的路径地址,这样当你调用mpi的命令时,系统才知道你在干什么。在用户的根目录下,有一个.bashrc的文本文件(默认使用的是bash,如果是zsh等自行查阅资料,我在这里避免信息过多导致初学者疑惑)。这个文件可以理解为,每次打开终端时都会加载的启动项。~即为家目录,也就是用户的根目录。vim ~/.bashrc通过vim打开当前用户下所对应的.bashrc文件,在其中加入一行(建议添加在最下面一行)export PATH="/usr/local/mpich-3.3.2/bin:$PATH" 保存退出之后 ,使用source这一命令执行一下就把新加的命令执行了。前面说过,.bashrc文件是每次开启终端后的类似加载启动项文件。也就是说,如果你不想手动source来加载的话,也可以通过新打开一个终端让它开启时自动加载。source ~/.bashrc

which mpicc

which mpif90 之后,用which来检验下配置的环境变量是否正确。如果显示了其路径,则说明安装顺利完成了。这时候,进入到最开始解压的文件夹中,到解压的文件夹内的examples文件夹中,测试一下hello是否能顺利运行。 mpirun -np 4 ./hello 若可运行说明顺利完成安装。 本系列目录如下版权声明写该教程的初衷是帮助初学者入门。因此本文欢迎转载或引用,但请标明转载或引用并说明原文出处,附上本文的链接,并私信告知我。未经允许不可用以商业用途。编辑于 2021-03-12 21:39Linux并行计算MPI​赞同 185​​42 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录高性能计算会更新一些有关并行计算

两小时入门MPI与并行计算系列 - 知乎

两小时入门MPI与并行计算系列 - 知乎首发于高性能计算切换模式写文章登录/注册两小时入门MPI与并行计算系列熊巍前言 笔者从大一时开始接触并行计算,在学习的过程中,发现并行计算和MPI适合新手入门的资料偏少。能查到的中文资料要么是专业性比较强,上手门槛高,要么就是千篇一律的基本介绍,比较缺乏系统性。因此,在我初学MPI时,就计划等学的差不多了之后写一篇对新手友好又系统的教程出来,于是就有了本文。 写这篇教程的初衷就是分享和传播知识,想更好的帮助初学者入门。因此本文欢迎转载或引用,但请标明转载或引用并说明原文出处,附上本文的链接,并私信告知我。未经允许不可用以商业用途。 在阅读和学习时遇到问题,可以在评论区留言或私信我,我会抽空解答。受限于水平,写作时难免出现错误,若有错误也欢迎私信指正。 本文持续更新,会尽可能快的将其内容更新完整,如果对你有帮助的话,可以点个关注。之后还计划写一些有关数值算法、AI for 科学计算和更多有关高性能计算的内容。本教程的使用方法 你只需要会C和C++或Fortran,掌握Linux的基本操作以及一定的计算机软硬件常识,即可学习本文。除此之外,你还需要有一个能上手练习的环境。具备了以上条件,你就可以开始对本文的学习了。 本文的目标是希望初学者在阅读和学习之后,能达到对MPI和并行计算有基本的了解。并且在此之后,可以逐渐变得更容易理解有关MPI的专业书籍。 在学习本教程时,强烈建议结合都志辉编著的《高性能计算之并行编程技术 —— MPI并行程序设计》作为本文的延伸阅读材料。本教程从都志辉编著的该书中借鉴了一部分代码和图片用于讲解。学习MPI的过程中,少不了反复的练习和实践。因此,每一章节所讲的代码都有必要亲自动手实践一遍。如果时间允许,我之后还会更新一章用于练习的题目。 目录 [1] 并行计算预备知识[2] MPI的安装与配置 [3] MPI的6个基本函数[4] 从0开始写出一个MPI并行程序[5] MPI并行算法的对等模式(实现Jacobi迭代的并行计算)[6] MPI并行算法的主从模式(实现矩阵乘法)[7] MPI进阶[8] 算法优化思路[9] 常用工具介绍其他 最后,感谢都志辉编著的《高性能计算之并行编程技术 —— MPI并行程序设计》一书。本教程参考了该书的内容,并借鉴了一部分代码。在此,感谢在我对MPI学习时给予帮助的老师们和同学们。 编辑于 2021-08-12 18:34并行计算MPI高性能计算​赞同 741​​35 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录高性能计算会更新一些有关并行计算的东西并行算法设计与性能优化并行算法,m

从并行计算的角度对比,MPI 与 OpenMP 有什么区别? - 知乎

从并行计算的角度对比,MPI 与 OpenMP 有什么区别? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册并行计算从并行计算的角度对比,MPI 与 OpenMP 有什么区别?就是想更好的对比两者之间的不同,当然入门一点最好。我要帮导师做这样的服务器,正在入手过程中。关注者691被浏览341,167关注问题​写回答​邀请回答​好问题 10​添加评论​分享​14 个回答默认排序lyyfer​ 关注两者区别很多人都提到了,至于两者的选择和性能,很多人有些误解。"多台机器,每台都是多核,那自然就是 OpenMP +

MPI",没那么自然。很多人以为SMP集群openmp+MPI混编性能最好,那都是有些想当然了,觉得MPI需要通信拷贝操作,所以性能差。业界实际测试过的人,都知道一般来说,纯MPI性能比纯openmp和MPI+openmp混合都要好很多,只是内存占用会大一些。原因是集群普遍是NUMA节点,节点内的data

locality对于openmp是一个大问题。而MPI编程模型天生强制比较好的data

locality。当然openmp结合affinity设置也能写出来locality好的程序,但是普遍的说法是,如果你想用openmp写出MPI的性

能,那你的openmp代码肯定长得像MPI代码。具体做法就是把mpi的通信,用openmp数据复制替代,还不如直接用MPI得了,至少可以扩展到分布式。还有一个做法就是每个numa单元一个MPI进程,numa单元内部用openmp。这样需要比较复杂的cpu binding设置,但是是可以部分解决locality问题的。openmp+MPI混合编程在MPI基础上加大了复杂度,采用它的目的,是减少内存占用,而非提高性能。即使是在单个节点,纯粹的共享内存系统,MPI程序在性能上也不输openmp,大多数时候甚至更好。补充:本来是对一位知友评论的回复里面的一部分,感觉可以作为答案的补充,贴过来如下mpi的很多实现有针对共享内存系统优化的,节点内并非是跟跨节点一样的网络通信,会变成直接的内存拷贝。比如openmpi的vader blt方式就是共享内存通信,延迟低带宽高。编辑于 2016-07-27 02:19​赞同 137​​20 条评论​分享​收藏​喜欢收起​李超铮​ 关注OpenMP和MPI是并行编程的两个手段,对比如下:OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式);可扩展性差;MPI:进程级;分布式存储;显式;可扩展性好。OpenMP采用共享存储,意味着它只适应于SMP,DSM机器,不适合于集群。MPI虽适合于各种机器,但它的编程模型复杂:需要分析及划分应用程序问题,并将问题映射到分布式进程集合;需要解决通信延迟大和负载不平衡两个主要问题;调试MPI程序麻烦;MPI程序可靠性差,一个进程出问题,整个程序将错误;发布于 2012-05-30 22:32​赞同 99​​3 条评论​分享​收藏​喜欢

Microsoft MPI - Message Passing Interface | Microsoft Learn

Microsoft MPI - Message Passing Interface | Microsoft Learn

跳转至主内容

此浏览器不再受支持。

请升级到 Microsoft Edge 以使用最新的功能、安全更新和技术支持。

下载 Microsoft Edge

有关 Internet Explorer 和 Microsoft Edge 的详细信息

目录

退出焦点模式

使用英语阅读

保存

目录

使用英语阅读

保存

打印

Twitter

LinkedIn

Facebook

电子邮件

目录

Microsoft MPI

项目

12/27/2023

6 个参与者

反馈

本文内容

Microsoft MPI (MS-MPI) 是用于在 Windows 平台上开发和运行并行应用程序的 消息传递接口标准的 Microsoft 实现。

MS-MPI 提供以下几个优势:

轻松移植使用 MPICH 的现有代码。

基于Active Directory 域服务的安全性。

Windows 操作系统上的高性能。

跨不同类型的互连选项实现二进制兼容性。

MS-MPI 源代码

GitHub 上提供了 Microsoft MPI 源代码。

MS-MPI 下载

以下是 MS-MPI 的当前下载:

MS-MPI v10.1.3 (new!) - 请参阅 发行说明

使用 HPC Pack 2012 R2 的 MS-MPI 应用程序的调试器

可从 Microsoft 下载中心获取早期版本的 MS-MPI。

社区资源

Windows HPC MPI 论坛

联系 MS-MPI 团队

Microsoft 高性能计算资源

精选教程: 如何编译和运行简单的 MS-MPI 程序

精选指南: 使用 HPC Pack 和 A8 和 A9 实例设置 Windows RDMA 群集以运行 MPI 应用程序

面向开发人员的 Microsoft 高性能计算

Microsoft HPC Pack 2019 概述

Azure HPC 方案

相关主题

MPI 参考

反馈

此页面是否有帮助?

反馈

Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.

提交和查看相关反馈

此页面

查看所有页面反馈

其他资源

加州消费者隐私法案 (CCPA) 禁用图标

你的隐私选择

主题

高对比度

早期版本

博客

参与

隐私

使用条款

商标

© Microsoft 2024

其他资源

本文内容

加州消费者隐私法案 (CCPA) 禁用图标

你的隐私选择

主题

高对比度

早期版本

博客

参与

隐私

使用条款

商标

© Microsoft 2024

MPI(信息传递接口)_百度百科

信息传递接口)_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心MPI是一个多义词,请在下列义项上选择浏览(共9个义项)展开添加义项MPI播报讨论上传视频信息传递接口收藏查看我的收藏0有用+10本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI的目标是高性能,大规模性,和可移植性。MPI在今天仍为高性能计算的主要模型。主要的MPI-1模型不包括共享内存概念,MPI-2只有有限的分布共享内存概念。 但是MPI程序经常在共享内存的机器上运行。在MPI模型周边设计程序比在NUMA架构下设计要好因为MPI鼓励内存本地化。尽管MPI属于OSI参考模型的第五层或者更高,他的实现可能通过传输层的sockets和Transmission Control Protocol (TCP)覆盖大部分的层。大部分的MPI实现由一些指定惯例集(API)组成,可由C,C++,Fortran,或者有此类库的语言比如C#, Java or Python直接调用。MPI优于老式信息传递库是因为他的可移植性和速度。中文名信息传递接口外文名MPI用    途编写并行计算机目录1简介2组成36个MPI调用接口4MPI并行编程5历史简介播报编辑与OpenMP并行程序不同,MPI是一种基于信息传递的并行编程技术。消息传递接口是一种编程接口标准,而不是一种具体的编程语言。简而言之,MPI标准定义了一组具有可移植性的编程接口 [1]。组成播报编辑数据类型定义了精确的数据类型参数而不使用字节计数,以数据类型为单位指定消息的长度;对于C和Fortran,MPI均预定义了一组数据类型和一些附加的数据类型;可以发送 或接收连续的数据,还可以处理不连续的数据;允许发送和接收不同的数据类型 [1]。通信域MPICH中的一个通信域定义了一组进程和一个通信的上下文,虚拟处理器拓扑、属性等内容。它以对象形式存在,作为通信操作的附加参数。MPI预定义的通信域:mpi comm world(包含所有进程)、mpi comm self(只包含各个进程自己的进程组) [1]。6个MPI调用接口播报编辑1.mpi init()初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备 [1];2.mpi finalize 结束MPI执行环境 [1];3.mpi comm rank用来标识各个MPI进程的,给出调用该函数的进程的进程号,返回整型的错误值。两个参数:MPI_Comm类型的通信域,标识参与计算的MPI进程组; &rank返回调用进程中的标识号 [1];4.mpi comm size用来标识相应进程组中有多少个进程 [1];5.mpi send(buf,counter,datatype,dest,tag,comm): buf:发送缓冲区的起始地址,可以是数组或结构指针;count:非负整数,发送的数据个数;datatype:发送数据的数据类型;dest:整型,目的的进程号;tag:整型,消息标志;comm:MPI进程组所在的通信域 [1]含义:向通信域中的dest进程发送数据,数据存放在buf中,类型是datatype,个数是count,这个消息的标志是tag,用以和本进程向同一目的进程发送的其它消息区别开来 [1]。6.mpi recv(buf,count,datatype,source,tag,comm,status): source:整型,接收数据的来源,即发送数据进程的进程号; status:MPI_Status结构指针,返回状态信息 [1]。MPI并行编程播报编辑并行编程模式对等模式—程序的各个部分地位相同,功能和代码基本一致,只是处理的数据或对象不同;主从模式—程序通信进程之间的一种主从或依赖关系 [1]。点对点通信模式阻塞—发送完成的数据已经拷贝出发送缓冲区,即发送缓冲区可以重新分配使用,阻塞接受的完成意味着接收数据已经拷贝到接收缓冲区,即接收方已可以使用。非阻塞—在必要的硬件支持下,可以实现计算和通信的重叠。4种通信模式:标准通信模式、缓存通信模式、同步通信模式、就绪通信模式 [1]。组通信一个特定组内所有进程都参加全局的数据处理和通信操作 [1]。功能:通信—组内数据的传输;同步—所有进程在特定的点上取得一致;计算—对给定的数据完成一定的操作 [1]。类型:1)数据移动:广播(mpi bcast) 收集(mpi gather) 散射(mpi scater)组收集(mpi all gather)全交换(all to all);2)聚集:规约(mpi reduce)将组内所有的进程输入 缓冲区中的数据按,定操作OP进行运算,并将起始结果返回到root进程的接收缓冲区扫描(mpi scan)要求每一个进程对排在它前面的进程进行规约操作,结果存入自身的输出缓冲区;3)同步:路障(mpi barrier)实现通信域内所有进程互相同步,它们将处于等待状态,直到所有进程执行它们各自的MPI-BARRIER调用 [1]。历史播报编辑创建信息传递接口的讨论始于1991的夏天,一个组研究员于在奥地利进行山中修养时。那次讨论之后,于1992年4月29-30号于弗吉尼亚威廉姆斯伯格召开了一次关于分布式内存环境下的信息传递标准设置研讨会。在这次研讨会上讨论了对标准信息传递接口至关重要的一些基本特征,并创建了一个继续标准化此过程的工作组。Jack Dongarra, Rolf Hempel, Tony Hey, and David W. Walker于1992年11月提出了一些初始草稿提议,后被称为MPI1。在1992年11月,一个MPI的工作组会议在Minneapolis召开,他们决定了为此标准化过程创建一个更正式的标注。MPI工作组在1993年的头九个月每6个星期见面一次。MPI标准草稿在93年11月的超级计算机会议上提出。在经过一阵子的公众论议后,MPI修改了一些部分,并于1994年6月发布了MPI1.0版本。这些会议和邮件共同创建了MPI论坛,此论坛后来开放至所有高性能计算的成员。在一九九七年的七月在对原来的MPI作了重大扩充的基础上又推出了MPI的扩充部分MPI-2 而把原来的MPI各种版本称为MPI-1。MPI-2的扩充很多但主要是三个方面并行I/O,远程存储访问和动态进程管理。MPI包含了80个人40个组织的共同努力,他们主要都在美国和欧洲。主要的时下电脑供应商也涉入MPI,还有大学的研究员,政府公务员和产业界。MPI标准定义了核心库的语法和语义,这个库可以被Fortran和C调用构成可移植的信息传递程序。MPI提供了适应各种并行硬件商的基础集,他们都被有效的实现。这导致了是硬件商可以基于这一系列底层标准来创建高层次的惯例,从而为分布式内存交互系统提供他们的并行机。MPI提供了一个简单易用的可移植接口,足够强大到程序员可以用它在高级机器上进行进行高性能信息传递操作。在创建“真正”的MPI标准过程中,研究员们集成了几个系统最有用的特征到MPI中,而不是用一个系统来适应标准。其特征为IBM,Intel, nCUBE, PVM, Express, P4 and PARMACS等系统所用。信息传递模式非常之吸引人,皆因它的广泛可移植性,以及能被用于分布式内存/共享内存的多核处理器,工作站网络,和这些架构的组合。信息传递模式可用于多重设定,独立于网络速度和内存架构。新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

Open MPI: Open Source High Performance Computing

Open MPI: Open Source High Performance Computing

Open MPI: Open Source High Performance Computing

  |  

Home

  |  

Support

  |  

FAQ

  |  

 About

  Presentations

  Open MPI Team

  FAQ

  Videos

  Performance

 Open MPI Software

  Download

  Documentation

  Source Code Access

  Bug Tracking

  Regression Testing

  Version Information

 Sub-Projects

  Hardware Locality

  Network Locality

  MPI Testing Tool

  Open Tool for Parameter Optimization

 Community

  Mailing Lists

  Getting Help/Support

  Contribute

  Contact

  License

 

A High Performance Message Passing Library

The Open MPI Project is an open source Message Passing Interface

implementation that is developed and maintained by a consortium of

academic, research, and industry partners. Open MPI is therefore able

to combine the expertise, technologies, and resources from all across

the High Performance Computing community in order to build the best

MPI library available. Open MPI offers advantages for system and

software vendors, application developers and computer science

researchers.

Features implemented or in short-term development for Open MPI

include:

Full MPI-4.1 standards conformance

Thread safety and concurrency

Dynamic process spawning

Network and process fault tolerance

Support network heterogeneity

Single library supports all networks

Run-time instrumentation

Many job schedulers supported

Many OS's supported (32 and 64 bit)

Production quality software

High performance on all platforms

Portable and maintainable

Tunable by installers and end-users

Component-based design, documented APIs

Active, responsive mailing list

Open source license based on the BSD license

Open MPI is developed in a true open source fashion by a consortium

of research, academic, and industry partners. The Open MPI Team page has a comprehensive

listing of all contributors and active members.

See the FAQ page for more technical

information

Join the mailing lists

Open MPI v5.0.2 releasedMajor new release

> Read more

Open MPI v4.1.6 releasedBug fix release

> Read more

hwloc 2.10.0Major release

> Read more

Open MPI is an Associated

Project of the

Software in the Public Interest

non-profit organization

Page last modified: 16-Feb-2024

©2004-2024 The Open MPI Project

MPI 函数 - Message Passing Interface | Microsoft Learn

MPI 函数 - Message Passing Interface | Microsoft Learn

跳转至主内容

此浏览器不再受支持。

请升级到 Microsoft Edge 以使用最新的功能、安全更新和技术支持。

下载 Microsoft Edge

有关 Internet Explorer 和 Microsoft Edge 的详细信息

目录

退出焦点模式

使用英语阅读

保存

目录

使用英语阅读

保存

打印

Twitter

LinkedIn

Facebook

电子邮件

目录

MPI 函数

项目

12/27/2023

1 个参与者

反馈

本文内容

本节内容

MPI 缓存函数

MPI 集合函数

MPI Communicator 函数

MPI 数据类型函数

MPI 组函数

MPI 点到点函数

MPI 进程拓扑函数

MPI 管理功能

MPI 信息对象函数

MPI 进程管理功能

MPI One-Sided 通信函数

MPI 外部函数

MPI 文件函数

MPI 杂项函数

反馈

此页面是否有帮助?

反馈

Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.

提交和查看相关反馈

此页面

查看所有页面反馈

其他资源

加州消费者隐私法案 (CCPA) 禁用图标

你的隐私选择

主题

高对比度

早期版本

博客

参与

隐私

使用条款

商标

© Microsoft 2024

其他资源

本文内容

加州消费者隐私法案 (CCPA) 禁用图标

你的隐私选择

主题

高对比度

早期版本

博客

参与

隐私

使用条款

商标

© Microsoft 2024

Access Denied

Access Denied

Access Denied

You don't have permission to access "http://www.intel.cn/content/www/cn/zh/developer/tools/oneapi/mpi-library.html" on this server.

Reference #18.f4231c78.1709812834.3a79cd44