2013-02-13 4 views
1

J'ai un réseau où les processus envoie un message aléatoire à ses voisins et reçoivent simultanément des messages de ses voisins. Je suis capable de le faire en utilisant des douilles et des filetages. Un thread reçoit des messages et un autre envoie des messages à un voisin choisi au hasard. Est-il possible d'y parvenir en utilisant MPI_SEND et MPI_RECV?envoyer et recevoir simultanément en utilisant MPI

+0

Vous voulez dire la version non bloquante de l'envoi et de la réception? – arunmoezhi

+0

Peu importe. En fait, je ne comprends pas bien votre question pour y répondre. – nhahtdh

+0

J'ai essayé d'utiliser cela mais j'ai besoin de mettre l'envoi dans une boucle qui envoie des messages à des intervalles de temps aléatoires. Pendant cette exécution de boucle le rang devrait recevoir n'importe quel message envoyé à lui – arunmoezhi

Répondre

1

Vous pouvez utiliser des appels MPI dans un environnement multithread. Consultez le manuel de la fonction MPI_Init_thread et ce document: http://www.mcs.anl.gov/~thakur/papers/mpi-threads.pdf. Gardez à l'esprit que la norme MPI-1 ne nécessite pas une implémentation thread-safe, seulement MPI-2 (mais l'implémentation que vous utilisez est probablement MPI-2).

+0

Merci. La multi-threading est-elle la seule option ou est-il théoriquement possible d'y parvenir en utilisant l'envoi et la réception non-bloquants? – arunmoezhi

+0

Il est difficile de dire sans connaître en détail ce que fait votre code, c'est-à-dire qu'il est peut-être possible de réorganiser votre algorithme et d'utiliser des appels non bloquants. D'un autre côté, j'avais un problème très similaire dans le passé - je travaillais sur le tri parallèle et il était nécessaire d'envoyer et de recevoir des messages en même temps; la seule solution que j'ai trouvé était d'utiliser deux threads et sockets (c'était à l'époque où MPI-2 n'existait pas encore et toutes les implémentations MPI-1 à ma disposition n'étaient pas thread-safe). – miy

0

Quelle est votre définition de «simultaneous»?

Dans tous les cas, vous pourriez être intéressé par MPI_Sendrecv:

La sémantique d'une opération d'émission-réception est ce que l'on obtiendrait si l'appelant fourchue deux threads simultanés, l'un pour exécuter l'envoi, et un pour exécuter le receive, suivi d'une jointure de ces deux threads.

+0

Merci. Dis que j'ai 3 rangs et que chaque rang doit envoyer 2 messages à d'autres rangs. Par exemple, Rank1 envoie 2 messages à Rank0 et 2 messages à Rank1. Au total, chaque rang envoie 4 messages. Mais l'intervalle de temps entre chaque envoi est aléatoire. Et je ne veux pas mettre un bloc de synchronisation entre chaque sendrecv. – arunmoezhi

Questions connexes