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,一样可以正确的得到结果,因此是安全的。



应聘者轻专业 招聘者重经验

招聘会上新发现:应聘者轻专业 招聘者重经验  昨天,在国展中心的招聘会上,记者发现,今年应聘人员中,跨专业应聘者比以往有所增加。  北京一家文化传播公司的负责人告诉记者,今年在他们公司应聘的人员中,有...
  • stanely
  • stanely
  • 2001-06-04 16:34:00
  • 607

MPI 并行计算出现的问题!!!(已解决)

he@yuanhe:~/nfs_he$ mpirun -f nodes -n 3 ./example1 rank :0 ,source: -1 ,dest: 1 rank :2 ,source: 1 ...
  • yhsweetlife
  • yhsweetlife
  • 2015-06-26 21:18:35
  • 3992

MPI应用:实现节点之间的循环消息传递

MPI应用:实现节点之间的循环消息传递 一、问题描述 实现节点之间的循环消息传递 二、方法选择 使用阻塞方法,第一步,偶数节点发送,奇数节点接收;第二步,奇数节点发送,偶数节点接收。考...
  • houzijushi
  • houzijushi
  • 2018-03-28 10:58:10
  • 37

mpi阻塞型函数的死锁

1. 总会死锁的情形  CALL MPI_COMM_RANK(comm, rank, ierr)  IF (rank.EQ.0) THEN   CALL MPI_RECV(recvbuf, count...
  • matricer
  • matricer
  • 2016-03-30 23:07:56
  • 737

关于MPI语义的简单测试

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

MPI函数说明及示例

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

MPI入门基础(程序欣赏)

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

MPI编程--Parallel Rank

问题概述 每一个进程随机产生一个数字存储在本地,然后对比所有进程所包含的整个数字集,进行排序,最后将排序号输出。 算法思路 整个程序所要做的就是收集所有进程产生的一个随机数,然后进行排序,最后将...
  • qq_29777421
  • qq_29777421
  • 2017-06-08 22:53:01
  • 266

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

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

MPI一个简单的发送和接收的例子

#include"mpi.h" int main(int argc,char *argv[]) {        char message[20]="";        int myran...
  • ziren235
  • ziren235
  • 2007-07-23 22:26:00
  • 9545
收藏助手
不良信息举报
您举报文章:MPI 每个rank依次往下一个rank发送消息的循环
举报原因:
原因补充:

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