Question

En essayant de mélanger la précision dans un programme simple - en utilisant à la fois réel et double - et utiliser la routine DDOT de BLAS, je suis en sortie incorrecte pour la pièce double précision. Voici le code:

program test

!! adding this statement narrowed the issue down to ddot being considered real(4)
implicit none

integer, parameter :: dp = kind(1.0d0)

!! The following 2 lines were added for the calls to the BLAS routines.
!! This fixed the issue.
real(dp), external :: ddot
real, external :: sdot

real, dimension(3) :: a,b
real(dp), dimension(3) :: d,e

integer :: i

do i = 1,3
    a(i) = 1.0*i
    b(i) = 3.5*i
    d(i) = 1.0d0*i
    e(i) = 3.5d0*i
end do

write (*,200) "sdot real(4) = ", sdot(3,a,1,b,1)  ! should work and return 49.0
write (*,200) "ddot real(4) = ", ddot(3,a,1,b,1)  ! should not work

write (*,200) "sdot real(8) = ", sdot(3,d,1,e,1)  ! should not work
write (*,200) "ddot real(8) = ", ddot(3,d,1,e,1)  ! should work and return 49.0

200 format(a,f5.2)

end program test

J'ai essayé de compiler avec GFertran et IFORT en utilisant les bibliothèques MKL BLAS comme suit:

ifort -lmkl_intel_lp64 -lmkl_sequential -lmkl_core

gfortran -lmkl_intel_lp64 -lmkl_sequential -lmkl_core main.f90

La sortie est:

sdot real(4) = 49.00
ddot real(4) =  0.00
sdot real(8) =  4.10
ddot real(8) =  0.00

Comment puis-je faire en sorte que la routine DDOT traite correctement les valeurs de double précision?

De plus, l'ajout de l'indicateur -autodouble (ifort) ou -fdefault-réal-8 (gfortran) fait que les deux routines DDOT fonctionnent, mais les routines SDOT échouent.

Éditer:J'ai ajouté l'instruction Implicit None et les instructions de deux types pour les fonctions DDOT et SDOT. Sans le type spécifié pour la fonction appelle, le DDOT a été tapé implicitement comme une seule précision réelle.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top