MPI应用:实现节点之间的循环消息传递
一、问题描述
实现节点之间的循环消息传递
二、方法选择
使用阻塞方法,第一步,偶数节点发送,奇数节点接收;第二步,奇数节点发送,偶数节点接收。考虑到节点0和节点n-1的特殊性,当发送时候,节点n-1发送到节点0;当接收时候,节点0接收来自节点n-1的信息。
三、我的代码
#include <stdio.h>
#include "mpi.h"
#include <string.h>
int main( int argc, char *argv[] )
{
char msg[100] = "1234";//发送缓存
char revmsg[100]="";//接收缓存
int myid, numprocs;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank( MPI_COMM_WORLD, &myid );
MPI_Comm_size( MPI_COMM_WORLD, &numprocs );
//1--偶数发送,奇数接收
if(myid%2 == 0)//偶数发送
{
if(myid == numprocs-1)
{
MPI_Send(msg,strlen(msg),MPI_CHAR,0,99,MPI_COMM_WORLD);
}
else
{
MPI_Send(msg,strlen(msg),MPI_CHAR,myid+1,99,MPI_COMM_WORLD);
}
}
else if(myid%2 == 1)//奇数接收
{
MPI_Recv(revmsg,20,MPI_CHAR,myid-1,99,MPI_COMM_WORLD,&status);
printf("I am %d of %d\n", myid, numprocs);
printf("%s\n",revmsg);
}
//1--奇数发送,偶数接收
if(myid%2 == 1)//奇数发送
{
if(myid == numprocs-1)
{
MPI_Send(msg,strlen(msg),MPI_CHAR,0,99,MPI_COMM_WORLD);
}
else
{
MPI_Send(msg,strlen(msg),MPI_CHAR,myid+1,99,MPI_COMM_WORLD);
}
}
else if(myid%2 == 0)//偶数接收
{
if(myid == 0)
{
MPI_Recv(revmsg,20,MPI_CHAR,numprocs-1,99,MPI_COMM_WORLD,&status);
}
else
{
MPI_Recv(revmsg,20,MPI_CHAR,myid-1,99,MPI_COMM_WORLD,&status);
}
printf("I am %d of %d\n", myid, numprocs);
printf("%s\n",revmsg);
}
MPI_Finalize();
return 0;
}