2010-10-19 25 views
0

mon programme est le suivant:
Module x
utilisation mpi x comprend module mpi
aucun implicite
...
contientpoignée de MPI_COMM_WORLD perd de sa valeur dans un sous-programme

subroutine do_something_with_mpicommworld 

    !use mpi !uncommenting this makes a difference (****) 
    call MPI_...(MPI_COMM_WORLD,...,ierr) 

end subroutine 

..
module de fin x

programme principal
utilisation mpi utilisation x
MPI_Init (...)
appel do_something_with_mpicommworld principal programme de fin

Ce programme échoue avec l'erreur suivante: MPI_Cart_create (199): communication non valide, à moins la ligne marquée (* *) est décommenté.

Maintenant, peut-être ma connaissance de Fortran 90 est incomplète, mais je pensais que si vous avez une clause d'utilisation dans la définition du module (voir mon module x), quelle que soit la variable globale existe dans le module inclus (en cas de x : MPI_COMM_WORLD à partir du module include mpi) aura la même valeur dans l'un des sous-programmes contenus (do_something_with_mpicommworld) même si ces sous-programmes n'incluent pas explicitement le module (par exemple quand (* *) est mis en commentaire). Ou, pour le dire simplement, si vous incluez un module dans un autre module, les sous-routines contenues dans le second module auront accès aux globales dans le module inclus sans instruction spéciale use. Lorsque j'ai exécuté mon programme, j'ai vu un comportement différent. Le sous-contenu de x était en train de créer des erreurs à moins qu'il n'ait l'instruction 'use mpi'.

Alors, quel est le problème, ai-je une idée fausse au sujet de Fortran 90, ou y at-il quelque chose de spécial au sujet du module MPI qui induit un tel comportement?

+0

Pouvez-vous envoyer le code, plutôt que d'un condensé de votre code. Le diable est si souvent dans le détail. –

Répondre

1

Il est extrêmement difficile de trouver des détails exacts sur ce qui devrait et ne devrait pas arriver dans ces cas, et mes attentes étaient les mêmes que les vôtres - le `use mpi 'devrait fonctionner comme ci-dessus. J'ai donc essayé ce qui suit:

module hellompi 
use mpi 
implicit none 
contains 

subroutine hello 
    integer :: ierr, nprocs, rank 
    call MPI_INIT(ierr) 
    call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr) 
    call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) 
    print *, 'Hello world, from ', rank, ' of ', nprocs 
    print *, MPI_COMM_WORLD 
    call MPI_FINALIZE(ierr) 
    return 
end subroutine hello 

end module hellompi 

et cela fonctionne bien sous gfortran et ifort avec OpenMPI. L'ajout d'un cart_create ne change rien.

Ce qui me frappe aussi bizarre avec votre cas est qu'il ne se plaint pas que MPI_COMM_WORLD n'est pas défini - si évidemment certains des informations pertinentes sont propagées à la sous-routine. Pouvez-vous poster un exemple complet plus simple qui ne fonctionne toujours pas?

0

Merci Johnatan pour votre réponse. Le problème était vraiment très simple. J'ai ajouté le sous-programme en question après le "module de fin"
:-D, 'implicit none' ne s'appliquait pas aux sous-marins externes et le compilateur a heureusement initialisé une toute nouvelle variable MPI_COMM_WORLD à tout ce qui lui semblait approprié suivant les règles implicites standard.

Ceci est juste une leçon pour moi de mettre en place 'aucun implicite' non seulement par des mots-clés, mais aussi via l'indicateur du compilateur. Le mal se cache derrière chaque déclaration de fin.

Je suis désolé que vous êtes allé creux la peine de faire l'exemple de test, je vous acheter une bière si je pouvais :-)