2017-01-30 6 views
1

Je travaille sur la construction d'un programme de dynamique moléculaire basé sur MPI contre plusieurs implémentations MPI (séparément), et j'ai rencontré un problème avec MPICH 3.0: il ne semble pas fournir d'interfaces explicites pour plusieurs procédures MPI. Certaines des procédures affectées sont mpi_bcast(), mpi_ssend(), mpi_recv() et mpi_finalize(). Cependant, MPICH 3.0 fournit des interfaces explicites pour certaines procédures, telles que mpi_init(). Ce code exemple illustre le problème:Pourquoi le module 'mpi' de MPICH 3.0 omet-il des interfaces explicites pour certaines procédures?

program mpitest 
use mpi 
integer ierr 

ierr = 0 
call dummy_implicit(ierr) 

call mpi_init(ierr) 
if (ierr /= 0) then 
    write(*,*) 'MPI_Init() failed' 
    stop 
endif 

call mpi_finalize(ierr) 
if (ierr /= 0) then 
    write(*,*) 'MPI_Finalize() failed' 
endif 

stop 
end program 

Si je construis ce programme sur CentOS 7 contre MPICH 3.0.4, j'obtenir ce résultat:

$which mpif90 
/usr/lib64/mpich/bin/mpif90 
$ mpif90 -Wimplicit-interface -c -o mpitest.o mpitest.f90 mpitest.f90:6.31: 

     call dummy_implicit(ierr) 
           1 Warning: Procedure 'dummy_implicit' called with an implicit interface at (1) mpitest.f90:15.29: 

     call mpi_finalize(ierr) 
          1 Warning: Procedure 'mpi_finalize' called with an implicit interface at (1) 
$ 

L'avertissement sur la procédure dummy_implicit() est attendue et correcte, mais je m'attends à MPICH pour fournir une interface explicite pour mpi_finalize(), tout comme il le fait apparemment pour mpi_init(). De plus, je trouve que si je construis le même programme contre MPICH 3.2 ou OpenMPI 1.10.3 alors un avertissement d'interface implicite est émis seulement pour la procédure dummy_implicit().

Ce problème ressemble à one reported against MPICH2, mais un (1) a été rapporté contre MPICH 2, pas MPICH 3, et (2) a été fermé il y a environ 5 ans.

Je veux m'assurer que j'ai des interfaces explicites dans la portée de tous mes appels de procédure. Je peux fournir les manquants manuellement si nécessaire, mais ce n'est sûrement pas le modèle d'utilisation prévu, ni n'est requis pour d'autres implémentations MPI.

Qu'est-ce que je fais mal? Ai-je vraiment besoin de fournir des interfaces explicites manuellement?

Répondre

2

Il n'y a aucune garantie que le module Fortran mpi contienne une interface explicite pour une procédure particulière. Certains sont plus souvent contenus (ceux avec des types de données fixes), d'autres très rarement (ceux où des tampons de différents types sont passés, pensez simplement au nombre de versions qui doivent être générées ...).

Le nombre de procédures dans le module variera d'une bibliothèque à l'autre, d'une version à l'autre et pourrait également être affecté par la configuration avant la compilation de la bibliothèque MPI.

Je n'utiliserais simplement pas -Wimplicit-interface avec MPI. J'ai essayé de fournir quelques interfaces moi-même, mais ensuite vous découvrirez que sur un autre ordinateur l'interface est fournie et que vous avez un conflit et qu'il ne se compilera pas du tout.

Vous pouvez essayer le module mpi_f08 si votre bibliothèque le supporte, il contient généralement tout avec une interface explicite. Mais cela nécessite également certaines fonctionnalités avancées du compilateur et certaines d'entre elles ne sont pas encore largement supportées.

+0

Il est décevant de ne pas pouvoir compter sur le module 'mpi' pour fournir des interfaces explicites. Tant pis. Merci de clarifier. Merci également pour votre avertissement concernant la tentative de fournir des interfaces explicites manuellement; le module 'mpi_f08' n'est pas une option pour moi, donc je suppose que je vais juste vivre avec les interfaces implicites. –