Programme de double précision Fortran avec une simple routine MKL BLAS
-
30-10-2019 - |
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