Je rencontre des problèmes de précision avec MPI_REDUCE() dans fortran. J'ai testé deux méthodes de sommation de nombres double précision stockés sur chaque nœud. La ligne I utilise estMPI_REDUCE problèmes de précision
call MPI_REDUCE(num,total,1,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,ierr)
MPI_REDUCE()
qui mémorise la somme des valeurs de « num » sur chaque noyau et l'envoie au « total » sur le noyau de la racine.
L'autre méthode que j'utilise implique envoie et reçoit
if (rank .eq. 0) total = num
do i = 1,nproc-1
if (rank .eq. i) call MPI_SEND(num,1,MPI_DOUBLE_PRECISION,0,&
100,MPI_COMM_WORLD,ierr)
if (rank .eq. 0) then
call MPI_RECV(num,1,MPI_DOUBLE_PRECISION,i,&
100,MPI_COMM_WORLD,stat,ierr)
total = total + num
end if
end do
Ce dernier me donne toujours le même nombre pour le total, alors que le premier produit une valeur différente en fonction du nombre de processeurs que j'utilise (Il change habituellement par 1x10^-5 ou plus). ierr est 0 dans tous les cas. Est-ce que je fais quelque chose de mal?
Merci
Merci pour la réponse. Voici un exemple. Pour 4 cœurs, chacun stocke l'un des nombres suivants. -.016578650712928463 -.005729268089031345 -.012569993133665655 -.055321271877137639 Ma méthode send/recv donne un résultat de -9.0199183812763095E-002 La méthode MPI_REDUCE donne un résultat de -9.0199110912786068E-002 Mathematica est d'accord avec ma méthode send/recv. Merci encore – DJames
Non seulement cela, mais 'MPI_SUM' et tous les autres opérateurs de réduction MPI prédéfinis sont également ** commutatifs ** et donc les arguments de la somme peuvent être appariés dans n'importe quel ordre. –