2012-05-05 1 views
2

Je construis un serveur web distribué dans C/MPI et il semble que la communication point à point cesse complètement de fonctionner après le premier MPI_BARRIER dans mon code. Le code C standard fonctionne après la barrière, donc je sais que chacun des fils passe à travers la barrière. La communication point à point fonctionne également très bien avant la barrière. Cependant, quand je copie-colle le même code qui a travaillé la ligne avant la barrière dans la ligne après la barrière, il cesse de fonctionner entièrement. L'ENVOI attendra simplement pour toujours. Lorsque j'essaie d'utiliser un ISEND à la place, il passe à travers la ligne, mais le message n'est jamais reçu. J'ai été googling ce problème beaucoup et tout le monde qui a des problèmes avec MPI_BARRIER est dit la barrière fonctionne correctement et leur code est faux, mais je ne peux pas pour la vie de moi comprendre pourquoi mon code est faux. Qu'est-ce qui pourrait causer ce comportement?MPI_SEND cesse de fonctionner après MPI_BARRIER

Voici un programme qui illustre ceci:

#include <mpi.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int procID; 
    int val; 
    MPI_Status status; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &procID); 
    MPI_Barrier(MPI_COMM_WORLD); 

    if (procID == 0) 
    { 
    val = 4; 
    printf("Before send\n"); 
    MPI_Send(&val, 1, MPI_INT, 1, 4, MPI_COMM_WORLD); 
    printf("after send\n"); 
    } 

    if (procID == 1) 
    { 
    val = 1; 
    printf("before: val = %d\n", val); 
    MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 
    printf("after: val = %d\n", val); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

Déplacer les deux if déclarations avant la barrière provoque ce programme afin de fonctionner correctement.

EDIT - Il semble que la première communication, quel que soit le type, fonctionne et que toutes les futures communications échouent. C'est beaucoup plus général que je pensais au début. Peu importe que la première communication soit une barrière ou un autre message, aucune communication future ne fonctionne correctement.

+0

Le code que vous avez posté me semble bien. Quelle version de MPI utilisez-vous? – suszterpatt

+0

Avec openmpi 1.5.5 fonctionne très bien pour moi. – chemeng

+0

Je sais que c'est openmpi, mais je n'arrive pas à comprendre quel numéro de version. Y a-t-il une commande qui vous dit? – TEOUltimus

Répondre

5

Open MPI a une fonction connue lorsqu'il utilise le protocole TCP/IP pour les communications: il essaie d'utiliser toutes les interfaces réseau configurées qui sont dans l'état "UP". Cela se présente comme un problème si certains des autres nœuds ne sont pas accessibles via toutes ces interfaces. Cela fait partie de l'optimisation de la communication gourmande qu'utilise Open MPI et parfois, comme dans votre cas, conduit à des problèmes.

Il semble que au moins le second noeud a plus d'une des interfaces qui sont en place et que ce fait a été introduit dans le premier noeud au cours de la phase de négociation:

  • configuré avec une 128.2.100.167
  • configuré avec un 192.168.109.1 (avez-vous un tunnel ou Xen en cours d'exécution sur la machine?)

la communication barrière se produit sur le premier réseau, puis les prochaines MPI_Send tente d'envoyer à la deuxième adresse ov er le second réseau qui ne relie évidemment pas tous les nœuds.

La solution la plus simple est de dire à Open MPI d'utiliser uniquement le nework qui connecte vos nœuds. Vous pouvez dire qu'il le faire en utilisant le paramètre MCA suivant:

--mca btl_tcp_if_include 128.2.100.0/24 

(ou quel que soit votre réseau de communication est)

Vous pouvez également spécifier la liste des interfaces réseau si elle est la même sur toutes les machines, par exemple

--mca btl_tcp_if_include eth0 

ou vous pouvez dire ouvrir MPI d'exclure spécifiquement certaines interfaces (mais vous devez toujours dire d'exclure la réalimentation « lo » si vous le faites):

--mca btl_tcp_if_exclude lo,virt0 

Espoir qui vous aide et beaucoup d'autres qui semblent avoir les mêmes problèmes ici à SO.Il semble que récemment, presque toutes les distributions Linux ont commencé à mettre en place diverses interfaces réseau par défaut, ce qui risque de causer des problèmes avec Open MPI.

P.S. Mettez ces nœuds derrière un pare-feu, s'il vous plaît!

+0

Merci! La deuxième correction que vous avez recommandée (en spécifiant l'interface réseau) a fonctionné à merveille. En outre, le cluster que j'utilise est derrière le pare-feu de mon école. Je suis sûr qu'ils savent ce qu'ils font. :RÉ – TEOUltimus

Questions connexes