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?
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. –