2009-04-02 6 views
0

Je souhaite imprimer le contenu du tableau d'entiers de chaque processus. Le problème est, tout est encombré en raison de l'état de la course.MPI: Verrouiller le stdout - 1 processus à la fois?

Quelle est la solution la plus simple? Je ne veux pas déboguer. Je veux montrer le contenu parce que je fais l'algorithme de tri. Il est donc utile de montrer avant et après le tri.

J'ajouté ceci dans lock.c:

#include <stdio.h> 
static int lock=0; //Don't use if timing execution 
void capture(int rank) { 
    while(lock!=0); 
    lock = 1; 
    printf("\nCaptured by %d\n", rank); 
} 
void release() { 
    lock = 0; 
} 

et capture appel() avant l'impression des choses, puis relâchez() après l'impression. Oui, c'est un hack de type sémaphore. Mais ça ne marche pas, des idées?

+0

Quand vous dites que "ça ne marche pas", que voulez-vous dire: personnellement, je suppose que vous voulez dire que la sortie de différents threads est en train de se mélanger? C'est ce que tu veux dire? –

+0

Oui, condition de concurrence. Le verrou – syaz

Répondre

1

Chaque processus a sa propre copie de la variable. Donc, ce n'est pas partagé et vous ne pouvez pas l'utiliser pour la synchronisation.

+0

est qualifié de statique et, en tant que tel, est partagé entre les threads. –

+0

@OfekShilon mais MPI n'est pas un système de mémoire partagée, donc bien qu'il puisse être partagé entre les threads, il n'est pas partagé entre les processus MPI * *. – Nathan

2

En supposant que vous entendez l'interface de transmission de messages, la meilleure approche consiste à écrire les chaînes de sortie dans un tampon et à les envoyer au processus de rang 0. Ce processus devrait être utilisé non pour faire le vrai travail, mais juste pour filtrer et sortir les chaînes de sortie. Laisser les autres rangs pour faire le vrai travail.

Je ne pense pas que votre solution ci-dessus fonctionnera parce que je suis local à chaque rang.

Vous ne voulez pas non plus utiliser la messagerie pour arrêter les rangs individuels (jusqu'à ce qu'ils puissent sortir) car ils ne pourront pas faire leur travail de tri entre-temps. Il suffit que chaque rang 1 à N fonctionne et envoie les chaînes au rang 0. Les chaînes peuvent être de la forme "NNN:SSSSSS" où N est le rang et S est la chaîne. Le rang 0 pourrait alors filtrer des messages spécifiques ou écrire différents messages dans différents fichiers, puis les combiner (triés) une fois que tous les rangs de travail se seraient arrêtés.

2

En supposant que vous utilisez un MPI qui rassemble tous les STDOUTs de processus, vous pouvez utiliser MPI_Barrier() pour faire respecter l'ordre, comme suit:

for(int i = 0; i < size; ++i) { 
    MPI_Barrier(MPI_COMM_WORLD); 
    if (i == rank) { 
     printf("..."); 
    } 
} 

Bien sûr, cela est inefficace, mais il peut être Un peu plus simple que d'organiser le retour de toutes les informations au 0.

+0

Merci beaucoup, Edric! j'ai eu à peu près votre solution exacte à ma propre version de ce ... mais je ne pas l'appel à barrière() si les choses étaient encore en train détraqué .. beaucoup apprécié. –

Questions connexes