Parallel processing MPI不一致接收机

Parallel processing MPI不一致接收机,parallel-processing,mpi,Parallel Processing,Mpi,有人能解释一下这种点对点的交流是怎么回事吗 我原以为进程1将始终从0接收,但大多数情况下会发生以下情况 Rank[0] Sent Rank[132802] Got 0.456700 [132802]Source:0 Tag:999999 Error:0 注意:有时它可以正常工作。见下文 Rank[0] Sent Rank[1] Got 0.456700 [1]Source:0 Tag:999999 Error:0 使用mpicc-MPITu.c-o out-Wall编译 使用mpi

有人能解释一下这种点对点的交流是怎么回事吗

我原以为进程1将始终从0接收,但大多数情况下会发生以下情况

Rank[0] Sent
Rank[132802] Got 0.456700
[132802]Source:0    Tag:999999  Error:0
注意:有时它可以正常工作。见下文

Rank[0] Sent
Rank[1] Got 0.456700
[1]Source:0 Tag:999999  Error:0
使用
mpicc-MPITu.c-o out-Wall编译

使用
mpiexec-n 5 out 0 1执行
//我在此处分配了发送方和接收方列组

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

int main(int argc, char *argv[])
{
  int rank, nprocs;
  double data, bag;
  int sender = atoi( argv[1]);
  int target = atoi(argv[2]);
  int Max_Count = 100;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Status status;
  data = .4567;
  int count =10;
  if(rank==sender){
    MPI_Send(&data,count,MPI_DOUBLE,target,999999,MPI_COMM_WORLD);
    printf("Rank[%d] Sent\n",rank );}
  else if(rank==target) { MPI_Recv(&bag,Max_Count,MPI_DOUBLE,sender,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
    printf("Rank[%d] Got %f\n",rank,bag );
    printf("[%d]Source:%d\tTag:%d\tError:%d\n",rank, status.MPI_SOURCE,status.MPI_TAG,status.MP\
I_ERROR);
  }

  MPI_Finalize();
  return 0;
}
#包括
#包括
#包括“mpi.h”
int main(int argc,char*argv[])
{
国际排名,NPROC;
双数据包;
int sender=atoi(argv[1]);
int target=atoi(argv[2]);
int Max_Count=100;
MPI_Init(&argc,&argv);
MPI通信大小(MPI通信世界和NPROC);
MPI通信等级(MPI通信世界和等级);
MPI_状态;
数据=0.4567;
整数计数=10;
if(秩==发送方){
MPI_发送(和数据、计数、MPI_双精度、目标、999999、MPI_通信世界);
printf(“秩[%d]已发送\n”,秩);}
else if(rank==target){MPI_Recv(&bag,Max_Count,MPI_DOUBLE,sender,MPI_ANY_标记,MPI_COMM_WORLD,&status);
printf(“排名[%d]获得%f\n”,排名,包);
printf(“[%d]源:%d\t标记:%d\t错误:%d\n”,等级,状态.MPI\u源,状态.MPI\u标记,状态.MP\
I_错误);
}
MPI_Finalize();
返回0;
}

您有一个编程错误:您的“数据”只是一个标量值。在您的MPI_发送中,您正在从该地址发送count=10个数字。@macelee它已修复!非常感谢。你能解释一下计数和排名之间的关系吗?因为它有时确实有效。秩是地址,即它们指定消息的发送者或接收者。计数是计数,即消息中有多少个元素。两者都是完全正交的。在您的示例中,您正在将位于内存地址“data”的双精度数据的“count”数量发送到“target”列组,给消息一个标记“999999”。