2011-06-11 3 views
2

J'essayais de coder ce morceau de code MPI assez basique mais je continue à être bloqué. La tâche consiste à écrire un wrapper pour les routines MPI_Send et Receive afin que l'utilisation du pointeur puisse être masquée.MPI_Send et Receive - Wrapper

Voici ce que j'ai développé:

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

post-scriptum Je garde la trace des réponses que j'ai maintenant. Merci.

Sanjay

Répondre

1

Pour spécifier une source ou un destinataire message, vous devez spécifier un rang et un communicateur; la paire spécifie uniquement le processus. Le rang seul est comme un numéro de rue sans nom de rue.

Vous passez dans un communicateur, mais il a une valeur indéfinie; votre code

MPI_Comm mpicomm; 
// ... 
Send(data, destination, mpicomm); 

passe dans un communicateur, mais vous ne lui avez assigné une valeur nulle part. Selon la façon dont la valeur de cette variable et la façon dont votre implémentation MPI la gère, vous pouvez obtenir un blocage - ou, avec openmpi, un message d'erreur utile.

Ce que vous voulez sans doute est la suivante:

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

ou, ce qui revient, laisser tomber la variable mpicomm entièrement:

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

ou l'autre de ceux-ci devraient travailler.

+0

Jonathan Merci beaucoup. Je l'essaie maintenant. Vous tiendrons au courant. Aussi ai-je raison de dire que (par rapport à votre belle analogie) pour communiquer avec un processeur dans le cluster, je spécifie le rang de ce processeur et aussi spécifier qu'il peut être parlé à l'aide de la poignée communicateur pour tous les nœuds dans le MPI_COMM_WORLD? – svk

+1

C'est vrai. Lorsque vous démarrez un programme MPI, tous les processeurs sont membres de MPI_COMM_WORLD et communiquez avec eux en spécifiant (rank, MPI_COMM_WORLD). Vous pouvez également créer vos propres communicateurs qui ne possèdent que des sous-ensembles de tous les processus, ou qui contiennent tous les processus mais qui ont été renommés d'une manière ou d'une autre pour plus de commodité. Dans ce cas, le même processus peut avoir différents rangs dans différents communicateurs; c'est pourquoi vous devez toujours spécifier le communicateur. –

+0

Merci beaucoup. Pouvez-vous également suggérer un bon livre/ressource pour comprendre de tels détails. (Bien que j'ai Michael Allen et Wilkinson) – svk