`

MPI学习笔记

    博客分类:
  • MPI
阅读更多

     MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。MPI在今天仍为高性能计算的主要模型。

1.MPI初始函数

   头文件: mpi.h/mpif.h.
   int MPI_Init(int *argc, char ***argv)
     启动MPI环境,标志并行代码的开始.
     并行代码之前,第一个mpi函数(除MPI_Initialize()外).
     要求main必须带能运行,否则出错.
  通信子(通信空间): MPI_COMM_WORLD:
     一个通信空间是一个进程组和一个上下文的组合.上下文可看作为组的超级标签,用于区分不同的通信子.在执行函数MPI_Init之后,一个MPI程序的所有进程形成一个缺省的组,这个组的通信子被写作MPI_COMM_WORLD.该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围.

    int MPI_Comm_size ( MPI_Comm comm, int *size )
     获得通信空间comm中规定的组包含的进程的数量.
     指定一个communicator,也指定了一组共享该空间的进程, 这些进程组成该communicator的group.
   int MPI_Comm_rank ( MPI_Comm comm, int *rank )
     得到本进程在通信空间中的rank值,即在组中的逻辑编号(从0开始).
   int MPI_Finalize()
     标志并行代码的结束,结束除主进程外其它进程.
     之后串行代码仍可在主进程(rank = 0)上运行(如果必须).

2.点对点通信
  1.阻塞通信
    1.1 标准通信模式(MPI_Send)

      理论上要求接收进程的recv调用配合
    1.2 缓冲通信模式(MPI_Bsend)

       缓冲通信模式主要用于解开阻塞通信的发送与接收之间的耦合。有了缓冲机制,即使在接收端没有启动相应的接收的情况下,在完成其消息数据到缓冲区的转移后发送端的阻塞发送函数也可返回。

    1.3 就绪通信模式(MPI_Rsend)

       仅当对方的接收操作启动并准备就绪时,才可发送数据。否则可能导致错误或无法预知的结果。
    1.4 同步通信模式(MPI_Ssend)

        不论接收端是否启动了接收动作,发送端都可在任何时机启动发送动作。但发送端需等待接收端的接收动作发起并开始接收数据之后才可能结束。
  2.非阻塞通信:把计算和通信重叠起来,从而改进并行效率
    2.1 非重复的非阻塞通信(MPI_Isend,MPI_IBsend,MPI_IRsend,MPI_ISsend)
    2.2 可重复的非阻塞通信(MPI_Send_Init,MPI_Bsend_Init,MPI_Rsend_Init,MPI_Ssend_Init)
    2.3 通信结束测试(MPI_Wait,MPI_Test等)
    2.4 Probe和Cancel
      MPI_Probe和MPI_IProbe可在不实际接收消息的情况下检查消息中包含的信息,然后据此决定接收消息的具体方式。
      MPI_Cancel用于取消等待状态的非阻塞操作(发送或接收)。
  3.组合发送接收:MPI_Sendrecv
  4.点对点通信总结
     各个模式使用缓冲的特点可总结为:标准的Send实际利用MPI环境提供的默认缓冲区;Bsend实际相当于将MPI环境提供的buffer放在用户空间管理;Rsend实际相当于不要缓冲区,但发送端不能提前等待;Ssend实际相当于不要缓冲区,但允许等待。异步方式下各个模式工作原理类似,只不过将其理解为MPI环境会另起一个线程在后台做实际的消息传输,通过MPI_Waitxxx,MPI_Testxxx等机制与MPI进程的主线程进行通信和同步。

3.例子(send_init.c)

#include "mpi.h"
#include <stdlib.h>
#include <stdio.h>

#define BUFSIZE 5
int main(int argc,char *argv[]){
 MPI_Request r;
 MPI_Status s;
 int flag;
 int buf[BUFSIZE];
 char pstr[BUFSIZE*(sizeof(int)+8)+50];
 int tag=123;
 int dest=0;
 int rank,size,i,j;

 MPI_Init(&argc,&argv);
 MPI_Comm_size(MPI_COMM_WORLD,&size);
 MPI_Comm_rank(MPI_COMM_WORLD,&rank);

 for(i=0;i<BUFSIZE;i++){
  buf[i]=BUFSIZE*rank+1;
 }

 MPI_Send_init(buf,BUFSIZE,MPI_INT,dest,tag,MPI_COMM_WORLD,&r);

 if(rank==0){
  int rbuf1[BUFSIZE*size];
  MPI_Request *rr=(MPI_Request *)malloc(size*sizeof(MPI_Request));
  for(i=0;i<size;i++){
   fprintf(stdout,"proc:%d,before Irecv..\n",rank);
   MPI_Irecv(rbuf1+i*BUFSIZE,BUFSIZE,MPI_INT,i,tag,MPI_COMM_WORLD,&rr[i]);
   fprintf(stdout,"proc:%d,after Irecv..\n",rank);
  }
  MPI_Start(&r);
  MPI_Wait(&r,&s);
  MPI_Waitall(size,rr,MPI_STATUSES_IGNORE);

  for(i=0;i<size;i++){
   sprintf(pstr,"proc:%d received message from %d\n",rank,i);
   for(j=0;j<BUFSIZE-1;j++){
 sprintf(pstr,"%srbuf1[%d]=%d,",pstr,i*BUFSIZE+j,rbuf1[i*BUFSIZE+j]);
   }
   sprintf(pstr,"%srbuf1[%d]=%d\n",pstr,i*BUFSIZE+j,rbuf1[i*BUFSIZE+j]);
   fprintf(stdout,"%s",pstr);
  }
  free(rr);
 }else{
  MPI_Start(&r);
  MPI_Wait(&r,&s);
 }

 MPI_Request_free(&r);

 if(rank==0){
  MPI_Request sr;
  int rbuf2[BUFSIZE];
  MPI_Recv_init(rbuf2,BUFSIZE,MPI_INT,MPI_ANY_SOURCE,tag,MPI_COMM_WORLD,&r);
  fprintf(stdout,"proc: %d,before Isend...\n",rank);
  MPI_Isend(buf,BUFSIZE,MPI_INT,0,tag,MPI_COMM_WORLD,&sr);
  fprintf(stdout,"proc: %d,after Isend...\n",rank);

  for(i=0;i<size;i++){
   MPI_Start(&r);
   MPI_Wait(&r,&s);

   sprintf(pstr,"proc: %d received messages from:%d\n",rank,s.MPI_SOURCE);
   for(j=0;j<BUFSIZE-1;j++){
     sprintf(pstr,"%srbuf2[%d]=%d,",pstr,j,rbuf2[j]);
   }
   sprintf(pstr,"%srbuf2[%d]=%d\n",pstr,j,rbuf2[j]);
   fprintf(stdout,"%s",pstr);
  }
  MPI_Wait(&sr,&s);
  MPI_Request_free(&r);
 }else{
  fprintf(stdout,"proc: d,before Send....\n",rank);
  MPI_Send(buf,BUFSIZE,MPI_INT,0,tag,MPI_COMM_WORLD);
  fprintf(stdout,"proc: %d,after Send....\n",rank);
 }
 MPI_Finalize();
 return 0;
}

 Linux下编译运行指令:

    mpicc send_init.c -o send_init  
    mpirun -np 8 ./send_init

分享到:
评论

相关推荐

    OpenMPI编程学习笔记

    通过实践编写并行程序,结合MPI学习笔记中的例子和解释,能够深入理解和掌握OpenMPI的使用,为开发高效的并行应用打下坚实基础。阅读提供的PDF文件,你将有机会进一步探索OpenMPI的细节,提高你的并行编程能力。

    西门子PLC-s7z系列学习笔记

    西门子PLC-s7z系列学习笔记 西门子PLC-s7z系列学习笔记是关于西门子PLC-s7系列的编程维护与变频调速器技术学习笔记。该笔记涵盖了S7系列的概述、S7-200、S7-300、S7-400的特点、存储器、输入输出的扩展、定时器、...

    北京西门子学习笔记整理

    这些学习笔记针对初学者,旨在提供一个全面的、易于理解的入门指南,帮助读者掌握西门子自动化系统的精髓。 首先,我们从“西门子”这个词出发,西门子是一家全球领先的科技公司,其在自动化和数字化解决方案方面...

    KITTI点云数据详细分析学习笔记

    KITTI点云数据详细分析学习笔记 KITTI点云数据集是由安德烈·盖勒(MPI Tübingen)、菲利普·伦茨(KIT)和克里斯托夫·施特勒(KIT)等人创建的,旨在为三维目标检测提供一个高质量的数据集。该数据集包含7481个...

    西门子PLC STEP7学习笔记

    根据提供的标题、描述以及部分上下文内容,我们可以总结并生成以下关于“西门子PLC STEP7学习笔记”的相关知识点: ### 西门子PLC STEP7简介 **西门子PLC(可编程逻辑控制器)**是工业自动化领域的重要组成部分之...

    PFC2D学习笔记之接触模型

    ### PFC2D学习笔记之接触模型 #### PFC2D概述及组成 PFC2D是一款由Itasca公司开发的二维离散元方法(DEM)软件,主要用于模拟颗粒材料的行为,广泛应用于岩土工程、地质力学等领域。PFC2D的安装目录通常位于`X:\...

    整理后java开发全套达内学习笔记(含练习)

    编辑[,kɒmpi'leiʃәn] const (保留字) constant n. 常量, 常数, 恒量 ['kɒnstәnt] continue (关键字) coupling 耦合,联结 ['kʌpliŋ] making sure that classes know about other classes only through ...

    heat:使用Python的GPU和MPI加速的分布式张量和机器学习框架

    HeAT是一款灵活,无缝的开源软件,用于高性能数据分析和机器学习。 它在MPI之上使用CPU,GPU和分布式集群系统为张量计算提供了高度优化的算法和数据结构。 HeAT的目标是填补数据分析和机器学习库之间的空白,重点...

    MulticoreApplicationProgramming读书笔记.zip

    以下是对本书内容的详细解读和学习笔记。 一、多核处理器的基本概念 多核处理器是指在一个芯片上集成两个或更多个独立的处理核心,它们共享内存资源,但各自拥有独立的执行单元,可以同时处理多个任务或线程。这种...

    im配置笔记PPT教案.pptx

    IM配置笔记PPT教案主要涉及的是工业自动化领域中的通信配置,特别是SIMATIC S7系列PLC的DP(Distributed Periphery)配置。SIMATIC S7是西门子推出的一种广泛应用于工业控制系统的可编程逻辑控制器(PLC)。在这个...

    sst-core:SST结构仿真工具包并行离散事件核心和服务

    第二个是基于MPI的并行仿真环境。 这提供了高水平的性能以及查看大型系统的能力。 该框架已成功用于建模概念,范围从内存中的处理到通过常规网络接口连接并运行MPI的常规处理器。 访问以了解有关SST的更多信息。 请...

    西门子D7219驱动培训笔记

    1. 西门子S120驱动调试:在培训中,学员将学习如何使用西门子S120驱动进行调试。西门子S120是西门子公司生产的一款先进的驱动系统,广泛应用于工业自动化领域,支持多轴运动控制,具备高速高精度的特点。 ***Pro...

    MP1584 MP1583电源降压型AD原理图+PCB文件.zip

    在这个压缩包中,PCB文件包含了MP1584和MP1583转换器的实际布局,可以作为学习和改进的实例。 4. **电源降压型转换器工作原理**: 降压型DC-DC转换器通过控制开关元件的占空比来改变输出电压,使得输入电压高于...

    DML_test_apple.rar_oracle

    PUDN(Programmer's Ultimate Development Network)是一个中国程序员的资源分享网站,常见于技术交流和学习资料的下载链接。 综合来看,这个项目旨在测试Oracle数据库在多进程环境下处理DML操作的能力,利用MPI和...

    【云上仿真科技】联合仿真笔记资料.zip

    理解并行算法、MPI(Message Passing Interface)以及如何在云环境中部署分布式计算任务是提升仿真速度的关键。 6. **API与自动化**:通过API(Application Programming Interface)可以自动化云服务的调用,如自动...

    MIT算法导论公开课之课程笔记 21.高级课题、并行算法(二).rar

    通过学习这些笔记,读者可以深化对并行计算的理解,掌握设计和分析并行算法的方法,并具备解决实际问题的能力。在当前的计算环境中,掌握并行算法是提高计算效率和应对大数据挑战的关键技能之一。

    MIT算法导论公开课之课程笔记 0.高级课题、并行算法(一).rar

    6. **并行计算中的同步和通信**:锁、信号量、条件变量等同步机制,以及MPI(消息传递接口)和PVM(并行虚拟机)等并行编程模型的通信方式。 通过对这些高级课题和并行算法的学习,读者可以增强解决复杂计算问题的...

    DDP实验报告AAAAAAA

    - **学习成果**: 尽管过程中遇到诸多挑战,但也因此学到了很多实用的技术知识,比如DDP的具体使用方法、MPI的基础概念及其在分布式计算中的作用等。这些经验对于未来进一步探索分布式深度学习领域将大有裨益。 综上...

Global site tag (gtag.js) - Google Analytics