Parallel processing MPI IRecv/MPI是否应该具有相同的“计数”?

Parallel processing MPI IRecv/MPI是否应该具有相同的“计数”?,parallel-processing,mpi,Parallel Processing,Mpi,一对MPI\u IRecv/MPI\u ISend是否应获得相同的计数 int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request) ... count number of elements in receive buffer (integer) 政府似乎建议不应这样做,但我对

一对
MPI\u IRecv/MPI\u ISend
是否应获得相同的
计数

 int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source,
           int tag, MPI_Comm comm, MPI_Request *request)
 ...
  count
    number of elements in receive buffer (integer)

   
政府似乎建议不应这样做,但我对措辞感到困惑,而且它的表述方式与我的有所不同。我附上了一个示例,如果我通过不同的
计数
,它将按照我的预期工作

isend.c

#include <stdio.h>
#include <mpi.h>  
#define send_cnt  1
#define recv_cnt 10    
#define SEND 0 /* who sends and who receives? */
#define RECV 1    
#define TAG 0
#define COMM MPI_COMM_WORLD  

MPI_Status  status;
MPI_Request request;

void send() {
  int dest = RECV;
  int buf[] = {42};
  MPI_Isend(buf, send_cnt, MPI_INT, dest, TAG, COMM, &request);
  MPI_Wait(&request, &status);
}

void recv() {
  int dest = SEND;
  int buf[123];
  MPI_Irecv(buf, recv_cnt, MPI_INT, dest, TAG, COMM, &request);
  MPI_Wait(&request, &status);
  printf("recv: %d\n", buf[0]);
}
    
int main(int argc, char *argv[]) {
  int rank;
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(COMM, &rank);    
  if (rank == SEND) send();
  else              recv();    
  MPI_Finalize();
  return 0;
}
#包括
#包括
#定义发送\u cnt 1
#定义recv_cnt 10
#定义发送0/*谁发送谁接收*/
#定义RECV 1
#定义标记0
#定义通信MPI_通信世界
MPI_状态;
MPI_请求;
作废发送(){
int dest=RECV;
int buf[]={42};
MPI Isend(buf、发送、MPI INT、目的地、标记、通信和请求);
MPI_等待(&请求,&状态);
}
void recv(){
int dest=发送;
int buf[123];
MPI_Irecv(buf、recv_cnt、MPI_INT、目的地、标签、通信和请求);
MPI_等待(&请求,&状态);
printf(“recv:%d\n”,buf[0]);
}
int main(int argc,char*argv[]){
整数秩;
MPI_Init(&argc,&argv);
MPI_通信等级(通信和等级);
if(rank==SEND)SEND();
else recv();
MPI_Finalize();
返回0;
}

MPI_Recv
MPI_Irecv
都将允许写入缓冲区的最大数据元素量作为参数。此数字不一定必须等于传递给MPI_Send的计数-它可以更大或更小。当接收缓冲区中没有足够的空间容纳消息时,MPI将发出截断错误信号。当空间大于消息大小时,只会写入缓冲区的一部分。在后一种情况下,可以使用
MPI\u Get\u count
检查由
MPI\u Recv
/
MPI\u Test*
/
MPI\u Wait*
返回的MPI status对象

传递给
MPI(I)Recv
的计数小于传递给
MPI\u Send
的计数是一种合法情况-不同的数据类型。例如,可以发送10
MPI_INT
s并接收由10
MPI_INT
s组成的连续数据类型的单个元素。在您的情况下,发送和接收操作都使用相同的数据类型,因此接收计数必须至少与发送计数一样大


顺便说一句,您的代码缺少一个调用来等待/测试由
MPI\u Isend
创建的请求,这是错误的。

您也可以使用
MPI\u Send
发送消息,以便通过
MPI\u Irecv
接收。