MPI_Probe-Dynamically allocate memory

在MPI并行编程中,当接收方不确定消息大小时,可以使用MPI_Probe先探测消息尺寸,然后根据探测到的尺寸动态分配内存,再进行接收。通过这种方法,可以避免预定义过大内存空间。例如,进程1向其他进程发送不同数量的数据,其他进程通过MPI_Probe获取实际数据量,然后接收。输出显示了各个进程接收的数据数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

某些情况下,接收者不知道消息尺寸,此时当然可以用一个足够大的空间去接收,但我们可以用MPI_Probe去首先探测消息尺寸,然后再分配相应空间,然后再正式接收消息,可以认为MPI_Probe和MPI_Recv很类似,只是不真正执行接收操作

MPI_Probe(
int source, //source rank, or MPI_ANY_SOURCE (integer)
int tag, //tag value or MPI_ANY_TAG (integer)
MPI_Comm comm, //communicator (handle)
MPI_Status *status)

例子,设进程1随机决定发送给其它进程的数据个数,其他进程需要先探测真实尺寸,然后接收:

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
int main(int argc, char** argv) {
  MPI_Init(NULL, NULL);

  int nProcs,Rank;
  int i;
  MPI_Status status;
  MPI_Comm_size(MPI_COMM_WORLD, &nProcs);
  MPI_Comm_rank(MPI_COMM_WORLD, &Rank);

  int NumToBeSent;

  if (Rank == 0) {

    const int MaxNum = 6000;
    std::vector<double> Data;
    srand(time(NULL));

        for(i=0;i<MaxNum;i++)Data.resize(MaxNum);
        for(i=0;i<MaxNum;i++)Data[i] = i;

    for(i=1;i<nProcs;i++)
    {   
        NumToBeSent = rand() % MaxNum;
        MPI_Send(&Data[0],NumToBeSent, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
        printf("0 sent %d numbers to %d\n", NumToBeSent,i);
    }
  }
  else {

     MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
    //When MPI_Probe returns, the size information is included, the MPI_Get_count function can extract size information
     MPI_Get_count(&status, MPI_DOUBLE, &NumToBeSent);
      // Now we can allocate suitable memory for the receive buffer
    double* recvbuf = (double*)malloc(sizeof(double) * NumToBeSent);
    // Now the message can be received properly
    MPI_Recv(recvbuf, NumToBeSent, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD,&status);
    printf("%d Received %d Data From 0.\n", Rank, NumToBeSent);
    free(recvbuf);
  }
  system("pause");
  MPI_Finalize();
}

一个执行输出如下(设4个进程):
0 sent 5646 numbers to 1
0 sent 430 numbers to 2
0 sent 1365 numbers to 3

1 received 5646 Data From 0
2 received 430 Data From 0
3 received 1365 Data From 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值