2013-10-15 2 views
2

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

Répondre

3

arithmétique à virgule flottante est pas strictement associative, l'ordre dans lequel les opérations sont effectuées peuvent avoir un impact sur le résultat. Alors que

(a+b)+c == a+(b+c) 

est vrai pour de vrai (comme en mathématiques, plutôt que Fortran, terminologie) chiffres n'est pas (universellement) vrai pour les nombres à virgule flottante. Il n'est donc pas surprenant que la réduction incorporée produise un résultat différent de votre propre réduction à domicile. Comme vous faites varier le nombre de processeurs, vous n'avez aucun contrôle sur l'ordre des ajouts individuels dans le calcul; même sur un nombre fixe de processeurs je ne serais pas surpris par une petite différence entre les résultats des différentes exécutions du même programme. En revanche, votre propre réduction fait toujours les ajouts dans le même ordre.

Quelle est l'erreur relative des deux résultats? La donnée de 10^(-5) ne nous dit que l'erreur absolue et cela ne nous permet pas de conclure que votre erreur peut être entièrement expliquée par la non-associativité de f-p arithmétique.

+0

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

+0

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

Questions connexes