MPI_发送和接收-包装器

MPI_发送和接收-包装器,mpi,parallel-processing,Mpi,Parallel Processing,我试图编写这段非常基本的MPI代码,但我总是挂断。 任务是为MPI_发送和接收例程编写一个包装器,以便隐藏指针的用法 以下是我开发的内容: #include "mpi.h" #include<iostream> #include<cstdlib> #define _MAXSIZE_ 10 using namespace std; /** Goal: Avoid pointers in MPI_Send and MPI_Recieve */ /* Wrapper f

我试图编写这段非常基本的MPI代码,但我总是挂断。 任务是为MPI_发送和接收例程编写一个包装器,以便隐藏指针的用法

以下是我开发的内容:

#include "mpi.h"
#include<iostream>
#include<cstdlib>

#define _MAXSIZE_ 10

using namespace std;

/** Goal: Avoid pointers in MPI_Send and MPI_Recieve */

/* Wrapper for regular MPI_Send. */
void Send(int data, int destination, MPI_Comm mpicomm) {
    MPI_Send(&data, 1, MPI_INT, destination, 0, mpicomm);
    cout << "Data sent successfully" << data << endl;
}

/* Wrapper for regular MPI_Recieve */
int Recieve(MPI_Status stat, MPI_Comm mpicomm, int source_id = 0) {
    int data;
    MPI_Recv(&data, 1, MPI_INT, source_id, 0, mpicomm, &stat);
    cout << "Data Recieved: " << data << endl;
    return data;
}

int main(int argc, char ** argv) {

    int myid, numprocs;
    int arr[10];
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    MPI_Status status;
    MPI_Comm mpicomm;

    /** Trying to send an array of 10 integers without pointer usage */
    int data = 3;
    int destination = rand() % numprocs; // choose a destination to send other than the master itself
    cout << "Destination:   " << destination << "\n" << endl;
    if(myid == 0) {
        if(destination != 0) {
            Send(data, destination, mpicomm);
        }
    }
    else if(myid == destination) {
            int data = Recieve(status,mpicomm, 0);
            cout << "Data Received Successfully" << data << endl;
    }

    MPI_Finalize();
    return 0;
    }
#包括“mpi.h”
#包括
#包括
#定义最大尺寸10
使用名称空间std;
/**目标:避免MPI_发送和MPI_接收中的指针*/
/*常规MPI_发送的包装器*/
无效发送(整数数据、整数目的地、MPI_Comm MPI Comm){
MPI_发送(和数据,1,MPI_INT,目标,0,mpicomm);

cout要指定消息源或收件人,您必须指定一个级别和一个通讯器;这对通讯器唯一地指定了流程。级别本身就像一个没有街道名称的街道编号

您正在传入一个通信器,但它有未定义的值;您的代码

MPI_Comm mpicomm;
// ...
Send(data, destination, mpicomm);
传入通信器,但您没有在任何位置为其赋值。根据该变量中的值以及MPI实现如何处理它,您可能会遇到死锁,或者,使用openmpi时,会收到有用的错误消息

您可能想要的是:

MPI_Comm mpicomm = MPI_COMM_WORLD;
//..
Send(data, destination, mpicomm);
int data = Recieve(status, mpicomm, 0);
或者,等效地,完全删除mpicomm变量:

Send(data, destination, MPI_COMM_WORLD);
//...
int data = Recieve(status, MPI_COMM_WORLD, 0);

这两种方法都应该有效。

乔纳森,非常感谢你。我现在正在尝试。我会随时通知你的。我这么说对吗(这是一个很好的比喻)要与群集中的处理器通信,我需要指定该处理器的级别,还必须指定可以使用通信器句柄与之通信,这对于MPI_COMM_WORLD中的所有节点都是通用的?没错。启动MPI程序时,所有处理器都是MPI_COMM_WORLD的成员,您可以通过规范与它们通信ifying(排名、MPI\u COMM\u WORLD)。您也可以创建自己的通讯器,这些通讯器只包含所有进程的子集,或者包含所有进程,但为了方便起见,它们以某种方式重新标记。在这种情况下,同一进程在不同的通讯器中可能具有不同的列组;这就是为什么您始终必须指定通讯器的原因。非常感谢。您能此外,还可以推荐一本好书/资源来了解这些细节。(虽然我有Michael Allen和Wilkinson),但我个人喜欢使用MPI()。还有一些在线教程,如NERSC、LLNL和cyberinfrastructure教程页面(需要免费注册):