Je ne suis pas expert en mpi4py, mais en supposant qu'il se comporte comme son homologue MPI C (ce qui semble être une hypothèse juste), alors en effet, il y a peu de surprise ici.
Eh bien, en toute justice, la sortie de votre code n'est pas indiquée par la norme MPI. Qu'est-ce que les garanties est que, après un nombre des appels à la fonction MPI_Test()
, il renverra true
. Ce nombre peut être n'importe quoi, et donc il renvoie true
au premier appel, ou à la seconde, ou seulement après un milliard d'appels ... Par conséquent, la manière habituelle/recommandée d'utiliser la fonction MPI_Test()
est de l'utiliser ici et là, et de terminer avec soit une boucle infinie (avec une condition de sortie basée sur sa sortie), soit utiliser un appel MPI_Wait()
. Maintenant, la raison en est la suivante: la bibliothèque MPI n'effectue généralement aucune action en dehors des appels MPI explicites. Par conséquent, afin de voir une communication non bloquante à progresser, vous devez effectuer certains appels MPI. Ces appels n'ont pas besoin d'être liés aux communications permanentes (généralement tout appel MPI déclenchera en interne un certain niveau de progression de la file d'attente des messages) mais vous devez donner la main à la bibliothèque MPI pour l'obtenir. Et c'est ce que font les appels à MPI_Test()
. Et cela explique aussi pourquoi ce n'est pas vraiment lié au temps: votre appel à la fonction sleep()
donne en effet le temps à la communication de se produire, mais comme la bibliothèque MPI ne reçoit pas la main, rien ne s'est réellement passé.
Enfin, une certaine modération à mes explications ci-dessus:
- Les ci-dessus suppose pas mécanisme externe pour faire avancer les messages en vol. Cependant, les moteurs d'accès direct à la mémoire (à distance), tels que ceux disponibles sur les cartes InfiniBand par exemple, peuvent en effet faire progresser les messages sans avoir à effectuer d'appels MPI supplémentaires. Cependant, cela ne se produit généralement que pour les communications entre nœuds et dépend fortement de votre matériel et de vos logiciels.
- Certaines bibliothèques MPI offrent comme extension la possibilité de dédier un thread CPU pour faire progresser la communication MPI en dehors des appels MPI. Certaines bibliothèques MPI basées sur MPICH, comme Intel MPI par exemple, proposent la variable d'environnement
MPICH_ASYNC_PROGRESS
qui, une fois définie sur 1
, déclenchera la création de ce thread de communication MPI pour faire progresser les communications non bloquantes derrière la scène. Je ne sais pas si OpenMPI propose cette fonctionnalité aussi ...
Etes-vous sûr que c'est le programme que vous utilisez? Il y a des ';' qui n'appartiennent pas. Que se passe-t-il si vous mettez 'sleep/test' dans une boucle? – Zulan
Bizarre. Si j'appelle la commande 'test' deux fois de suite, la deuxième (et toute ultérieure) est bonne. Pourtant, pas un comportement normal, donc si quelqu'un peut me donner d'autres instructions, il serait apprécié .. –