2010-10-06 29 views
1

J'ai une implémentation MPI essentiellement pour le maillage basé sur IDW2 sur un ensemble de points faiblement échantillonnés. J'ai divisé les travaux comme suit:Traitement Round-robin avec MPI (off de un/un)

  1. Tous les nœuds lisent toutes les données, le dernier nœud n'a pas besoin de quoi que ce soit.
  2. Node0 prend chaque point de données et envoie à des nœuds 1 ... N-1 avec le code suivant:

     
    int nodes_in_play = NNodes-2; 
    for(int i=0;i < data_size;i++) 
    { 
        int dest = (i%nodes_in_play)+1; 
        //printf("Point %d of %d going to %d\n",i+1,data_size,dest); 
        Error = MPI_Send(las_points[i],3,MPI_DOUBLE,dest,PIPE_MSG,MPI_COMM_WORLD); 
        if(Error != MPI_SUCCESS) break; 
    } 
    

  3. nœuds 1 ... N-1 d'effectuer des estimations basées IDW


    for(int i=0;i<=data_size-nodes_in_play;i+=nodes_in_play) { Error = MPI_Recv(test_point,3,MPI_DOUBLE,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status); if(status.MPI_TAG == END_MSG) break; ... IDW2 code Error = MPI_Send(&zdiff,1,MPI_DOUBLE,NNodes-1,PIPE_MSG,MPI_COMM_WORLD); }

  4. le noeud N ne reçoit et sérialise le fichier de sortie

Cela fonctionne bien pour 3 nœuds mais avec plusieurs noeuds de la boucle IDW est désactivée par certains en raison des limites de la boucle délicate et la course globale est bloquée. Ce qui serait un moyen simple d'exécuter le processus receive .. envoie des tâches dans les nœuds intermédiaires. Je cherche un astucieux pour la ligne de boucle.

Ce que je l'ai fait:

boucle

Contre mon meilleur jugement que j'ai ajouté un while (1) dans les noeuds intermédiaires, avec une condition de sortie si un message est reçu avec END_TAG. Node0 envoie un message END_TAG à tous les nœuds intermédiaires une fois que tous les points ont été envoyés.

+0

pouvez-vous formater votre code en tant que tel, ce qui nous facilitera la lecture et éventuellement l'aide. –

Répondre

0

La boucle while est une solution laide mais fonctionne avec un indicateur de fin. Je m'en tiendrai à ça pour le moment.