【问题标题】:Should MPI_IRecv/MPI_ISend have the same `count`?MPI_IRecv/MPI_ISend 是否应该具有相同的“计数”?
【发布时间】:2017-10-01 12:08:01
【问题描述】:

一对MPI_IRecv/MPI_ISend应该得到相同的count吗?

 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)

   

documentation 似乎暗示它不应该,但我对措辞感到困惑,它的表述与MPI_Recv 有点不同。我附上了一个例子,如果我通过不同的count,它会按预期工作。

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;
}

【问题讨论】:

    标签: parallel-processing mpi


    【解决方案1】:

    MPI_RecvMPI_Irecv 都将允许写入缓冲区的数据元素的最大数量作为参数。这个数字不一定必须等于传递给MPI_Send 的计数——它可能更大或更小。当接收缓冲区中没有足够的空间来容纳消息时,MPI 将发出截断错误信号。当空间大于消息大小时,只会覆盖缓冲区的一部分。在后一种情况下,可以使用MPI_Get_count 检查MPI_Recv/MPI_Test*/MPI_Wait* 返回的 MPI 状态对象。

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

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

    【讨论】:

    • 您也可以使用MPI_Send 发送要使用MPI_Irecv 接收的消息。
    猜你喜欢
    • 2015-05-27
    • 2020-03-09
    • 1970-01-01
    • 2017-08-20
    • 2011-08-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多