MPI 每个rank依次往下一个rank发送消息的循环

原创 2013年01月31日 09:16:23

https://www.sharcnet.ca/help/index.php/Getting_Started_with_MPI

 #include <stdio.h>
 #include <mpi.h>
 
 #define BUFMAX 81
 
 int main(int argc, char *argv[])
 {
     char outbuf[BUFMAX], inbuf[BUFMAX];
     int rank, size;
     int sendto, recvfrom;
     MPI_Status status;
 
 
     MPI_Init(&argc, &argv);
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
     MPI_Comm_size(MPI_COMM_WORLD, &size);
 
     sprintf(outbuf, "Hello, world! from process %d of %d", rank, size);
 
     sendto = (rank + 1) % size;
     recvfrom = ((rank + size) - 1) % size;
 
     MPI_Send(outbuf, BUFMAX, MPI_CHAR, sendto, 0, MPI_COMM_WORLD);
     MPI_Recv(inbuf, BUFMAX, MPI_CHAR, recvfrom, 0, MPI_COMM_WORLD, &status);
 
     printf("[P_%d] process %d said: \"%s\"]\n", rank, recvfrom, inbuf);
 
     MPI_Finalize();
 
     return(0);
 }
上面的实现之所有没有死锁是依赖于数据传输的中间buffer,也就是写的时候直接写到buffer,不需要等到接收端的回应,代码是可以正确运行的,但是他的实现是并不是完全依赖MPI的标准,下面给出一个MPI 安全的例子


#include <stdio.h>
#include <mpi.h>
 
#define BUFMAX 81
 
int main(int argc, char *argv[])
{
    char outbuf[BUFMAX], inbuf[BUFMAX];
    int rank, size;
    int sendto, recvfrom;
    MPI_Status status;
 
 
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
 
    sprintf(outbuf, "Hello, world! from process %d of %d", rank, size);
 
    sendto = (rank + 1) % size;
    recvfrom = ((rank + size) - 1) % size;
 
    if (!(rank % 2))
    {
        MPI_Send(outbuf, BUFMAX, MPI_CHAR, sendto, 0, MPI_COMM_WORLD);
        MPI_Recv(inbuf, BUFMAX, MPI_CHAR, recvfrom, 0, MPI_COMM_WORLD, &status);
    }
    else
    {
        MPI_Recv(inbuf, BUFMAX, MPI_CHAR, recvfrom, 0, MPI_COMM_WORLD, &status);
        MPI_Send(outbuf, BUFMAX, MPI_CHAR, sendto, 0, MPI_COMM_WORLD);
    }
 
    printf("[P_%d] process %d said: \"%s\"]\n", rank, recvfrom, inbuf);
 
    MPI_Finalize();
 
    return(0);
}





这个例子和上面的最大的不同就是根据rank分成两组,这两组的接收和发送的顺序是刚好相反的,这样如果没有buffer,一样可以正确的得到结果,因此是安全的。



MPI函数说明及示例

MPI函数说明(1)并行初始化函数:int MPI_Init(int *argc,char ***argv)参数描述:argc为变量数目,argv为变量数组,两个参数均来自main函数的参数(2)并行...
  • shijinupc
  • shijinupc
  • 2011年09月19日 22:57
  • 14455

MPI学习笔记——MPI基本框架

MPI程序的基本框架: MPI_Init(&argc,&argv); MPI_Comm_rank(comm,&rank); ... do something MPI_Finalize(); ...
  • rommel1
  • rommel1
  • 2012年04月23日 20:50
  • 5722

关于MPI语义的简单测试

前一段时间实现了一个简单的MPI,现在通过对MPICH的功能进行测试,来验证我的实现中是否存在问题。 现对MPI标准中感觉叙述不是特别清楚的地方(估计是我没有仔细阅读造成的)进行一些简单的测试。 ...
  • u012927281
  • u012927281
  • 2016年06月04日 16:31
  • 938

MPI入门基础(程序欣赏)

从几个简单的MPI程序领你入门 读程序学习编程,是成长最快的方式。hello程序看MPI程序结构 /** * 我是世界上引用率最高的程序,hiahia! */#include #includ...
  • lusongno1
  • lusongno1
  • 2017年03月27日 21:58
  • 296

MPI示例程序

1. 熟悉MPI定义声明 /* first.c */ #include "mpi.h" /*MPI的头函数,提供基本的MPI定义和类型*/ #include int main( argc, arg...
  • baidu_24281959
  • baidu_24281959
  • 2016年05月24日 15:26
  • 836

MPI入门实例讲解

1.一个简单的hello world程序  mpi_hello.cpp  #include #include "mpi" int main(int argv,char* argc[]...
  • tangbin330
  • tangbin330
  • 2013年03月07日 11:02
  • 13021

MPI_COMM_SPLIT函数浅尝

MPI_COMM_SPLIT 之前通常使用MPI_COMM_WORLD,但是这个范围太大了,而我要完成的cannon算法需要对于节点进行区分,使得在shift步骤的时候需要在某一个域中进行操...
  • Zhaohui1995_Yang
  • Zhaohui1995_Yang
  • 2016年05月15日 21:22
  • 1655

MPI编程及性能优化

第1节 MPI简介 1.1 MPI及其历史 与OpenMP相似,消息传递接口(Message Passing Interface,简称MPI)是一种编程接口标准,而不是一种具体的编程语言。该标准是...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年04月15日 12:55
  • 3695

MPI入门

1.什么是MPIMPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,...
  • qq_35571432
  • qq_35571432
  • 2017年10月27日 20:24
  • 178

MPI_Alltoall

Alltoall 的示意图: Alltoall 的例子: /* * ===========================================================...
  • cncnlg
  • cncnlg
  • 2014年05月27日 15:22
  • 1063
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MPI 每个rank依次往下一个rank发送消息的循环
举报原因:
原因补充:

(最多只允许输入30个字)