J'ai besoin de faire un produit scalaire dans Fortran. Je peux faire avec la fonction intrinsèque dot_product
de Fortran ou utiliser ddot
de OpenBLAS. Le problème est le ddot
est plus lent. Ceci est mon code:OpenBLAS plus lent que la fonction intrinsèque dot_product
Avec BLAS:
program VectorBLAS
! time VectorBlas.e = 0.30s
implicit none
double precision, dimension(3) :: b
double precision :: result
double precision, external :: ddot
integer, parameter :: LargeInt_K = selected_int_kind (18)
integer (kind=LargeInt_K) :: I
DO I = 1, 10000000
b(:) = 3
result = ddot(3, b, 1, b, 1)
END DO
end program VectorBLAS
Avec dot_product
program VectorModule
! time VectorModule.e = 0.19s
implicit none
double precision, dimension (3) :: b
double precision :: result
integer, parameter :: LargeInt_K = selected_int_kind (18)
integer (kind=LargeInt_K) :: I
DO I = 1, 10000000
b(:) = 3
result = dot_product(b, b)
END DO
end program VectorModule
Les deux codes sont compilés à l'aide:
gfortran file_name.f90 -lblas -o file_name.e
Qu'est-ce que je fais mal? BLAS ne doit pas être plus rapide?
très liée http://stackoverflow.com/questions/35926940/ fortran-lapack-haut-cpu-sys-usage-avec-dsyev-no-parallelization-normal/36035152 # 36035152 –