MPI_Send and Receive - Wrapper - PullRequest
       10

MPI_Send and Receive - Wrapper

2 голосов
/ 11 июня 2011

Я пытался закодировать этот довольно простой фрагмент кода MPI, но продолжаю зависать. Задача состоит в том, чтобы написать оболочку для подпрограмм MPI_Send и Receive, чтобы использование указателя можно было скрыть.

Вот что я разработал:

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

P.S. Я отслеживаю ответы, которые я получаю сейчас. Благодарю.

Санджай

1 Ответ

1 голос
/ 12 июня 2011

Чтобы указать источник сообщения или получателя, вы должны указать ранг и коммуникатора; пара однозначно определяет процесс. Одно звание похоже на номер улицы без названия улицы.

Вы передаете коммуникатор, но он имеет неопределенное значение; твой код

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

любой из них должен работать.

...