mirror of https://gitlab.com/QEF/q-e.git
372 lines
13 KiB
Plaintext
372 lines
13 KiB
Plaintext
# Copyright (C) 2001-2020 Quantum ESPRESSO Foundation
|
|
|
|
AC_DEFUN([X_AC_QE_BLAS], [
|
|
|
|
have_blas=0
|
|
|
|
# Flags for machine-specific libraries
|
|
have_acml=0
|
|
have_atlas=0
|
|
have_essl=0
|
|
have_mkl=0
|
|
have_armpl=0
|
|
|
|
if test "$blas_libs" != ""
|
|
then
|
|
echo setting BLAS from \$BLAS_LIBS with no check ... $blas_libs
|
|
have_blas=1
|
|
else
|
|
# check directories in LD_LIBRARY_PATH too
|
|
# (maybe they are already searched by default: useless?)
|
|
ld_library_path=`echo $LD_LIBRARY_PATH | sed 's/:/ /g'`
|
|
|
|
case "$arch:$f90" in
|
|
|
|
# search for architecture-specific libraries
|
|
|
|
x86_64:* | mac686:* )
|
|
#
|
|
# search for MKL in directory $MKL_ROOT
|
|
#
|
|
# Following architectures no longer supported:
|
|
# ia64 $MKLROOT/lib/64 -lmkl_gf_ipf, -lmkl_intel_ipf
|
|
# ia32 $MKLROOT/lib/ia32 -lmkl_gf , -lmkl_intel
|
|
#
|
|
if test "$MKLROOT" == ""; then
|
|
MKLROOT=/opt/intel/mkl
|
|
fi
|
|
case "$f90" in
|
|
ifort* | ifx* )
|
|
mkl_lib="mkl_intel_lp64"
|
|
mkl_omp="mkl_intel_thread"
|
|
if test "$arch" == "mac686"; then
|
|
# for ifort v.15 or later
|
|
add_mkl_flag="-qopenmp"
|
|
add_mkl_lib="-lpthread"
|
|
add_mkl_omp="-lpthread"
|
|
fi
|
|
;;
|
|
gfortran* )
|
|
mkl_lib="mkl_gf_lp64"
|
|
mkl_omp="mkl_gnu_thread"
|
|
;;
|
|
nvfortran* )
|
|
# NB: next two can be replaced by flag "-Mmkl"
|
|
mkl_lib="mkl_intel_lp64"
|
|
# mkl_omp="mkl_intel_thread"
|
|
# NB: with nvidia hpc sdk 2020, linking to threaded mkl
|
|
# v.19.1 update 4 fails due to a missing symbol
|
|
mkl_omp="mkl_sequential"
|
|
# NB: with (at least) nvidia 22.7, threaded mkl are
|
|
# catastrophically slow for DFT+U calculations
|
|
;;
|
|
pgf* )
|
|
# For obsolete PGI versions (superseded by nvfortran)
|
|
pgf_version=`$mpif90 -V 2>&1 | sed '/^$/d' | grep "^pgf" | cut -d ' ' -f2`
|
|
# From version 19.1, the new llvm backend requires linking to mkl_intel_thread
|
|
ompimp=""
|
|
AS_VERSION_COMPARE([$pgf_version], [19.1], [ ompimp="pgi" ], [ ompimp="intel" ], [ ompimp="intel" ] )
|
|
mkl_lib="mkl_${ompimp}_lp64"
|
|
mkl_omp="mkl_${ompimp}_thread"
|
|
add_mkl_flag="-pgf90libs"
|
|
;;
|
|
esac
|
|
try_libdirs="$libdirs $MKLROOT/lib/intel64 $ld_library_path"
|
|
for dir in none $try_libdirs
|
|
do
|
|
unset ac_cv_search_dgemm # clear cached value
|
|
if test "$dir" = "none"
|
|
then
|
|
try_loption=" "
|
|
else
|
|
echo $ECHO_N "in $dir: " $ECHO_C
|
|
try_loption="-L$dir"
|
|
fi
|
|
FFLAGS="$test_fflags"
|
|
LDFLAGS="$add_mkl_flag $test_ldflags $try_loption"
|
|
# LIBS=""
|
|
# not sure the above is needed
|
|
if test "$use_openmp" -eq 0; then
|
|
# test MKL (no OMP)
|
|
AC_SEARCH_LIBS(dgemm, $mkl_lib,
|
|
have_blas=1 have_mkl=1
|
|
blas_libs="$try_loption $LIBS -lmkl_sequential -lmkl_core"
|
|
ldflags="$add_mkl_flag $ldflags",
|
|
echo "MKL not found",
|
|
-lmkl_sequential -lmkl_core $add_mkl_lib)
|
|
else
|
|
# test MKL (OMP)
|
|
AC_SEARCH_LIBS(dgemm, $mkl_lib,
|
|
have_blas=1 have_mkl=1
|
|
blas_libs="$try_loption $LIBS -l$mkl_omp -lmkl_core"
|
|
ldflags="$add_mkl_flag $ldflags",
|
|
echo "MKL not found",
|
|
-l$mkl_omp -lmkl_core $add_mkl_omp)
|
|
fi
|
|
if test "$ac_cv_search_dgemm" != "no"
|
|
then break ; fi
|
|
done
|
|
;;
|
|
|
|
ppc64:* )
|
|
#
|
|
# search for ESSL - newer (?) powerPC machines
|
|
#
|
|
unset ac_cv_search_dgemm # clear cached value
|
|
FFLAGS="$test_fflags"
|
|
LDFLAGS="$test_ldflags"
|
|
LIBS=""
|
|
AC_SEARCH_LIBS(dgemm, essl, have_blas=1
|
|
blas_libs="$LIBS" )
|
|
# notice that some IBM machines may not need -lessl
|
|
# to load blas so the above test may fail
|
|
if test "`echo $blas_libs | grep essl`" != ""
|
|
then
|
|
have_essl=1
|
|
try_dflags="$try_dflags -D__LINUX_ESSL"
|
|
fi
|
|
# OBM:Yet another work-around if the above search
|
|
# returns "none required"
|
|
if test "$ac_cv_search_dgemm" = "none required"
|
|
then
|
|
echo "There is no need for -lessl in this machine"
|
|
have_essl=1
|
|
try_dflags="$try_dflags -D__LINUX_ESSL"
|
|
fi
|
|
# we need esslsmp for hybrid (MPI+OpenMP) build
|
|
if test "$have_essl"="1"; then
|
|
if test "$use_openmp" -ne 0 ; then
|
|
blas_libs="-lesslsmp"
|
|
fi
|
|
fi
|
|
;;
|
|
|
|
ppc64-*:* )
|
|
#
|
|
# assume ESSL without testing - old powerPC machines, BlueGene
|
|
#
|
|
unset ac_cv_search_dgemm # clear cached value
|
|
FFLAGS="$test_fflags"
|
|
LDFLAGS="$test_ldflags"
|
|
have_blas=1
|
|
have_essl=1
|
|
# BlueGene: for some obscure reason there is no need to
|
|
# specify a library path to have essl linked, while
|
|
# in reality it is needed to specify where essl are
|
|
if test "$arch"="ppc64-bg"; then
|
|
try_dflags="$try_dflags -D__LINUX_ESSL"
|
|
if test "$blas_libs"=""; then
|
|
if test "$use_openmp" -eq 0 ; then
|
|
blas_libs="-L/opt/ibmmath/essl/4.4/lib/ -lesslbg"
|
|
else
|
|
blas_libs="-L/opt/ibmmath/essl/4.4/lib/ -lesslsmpbg"
|
|
fi
|
|
fi
|
|
else
|
|
try_dflags="$try_dflags -D__LINUX_ESSL"
|
|
fi
|
|
;;
|
|
|
|
arm:armflang )
|
|
# search for ARM libs - ARM compiler
|
|
# PG: This section seems to me useless,
|
|
# just add option -armpl to $fflags, set have_blas=1 have_armpl=1
|
|
if test "$use_openmp" -eq 0; then
|
|
FFLAGS="-armpl"
|
|
ARMLIB="armpl"
|
|
else
|
|
FFLAGS="-fopenmp -armpl=parallel"
|
|
ARMLIB="armpl_mp"
|
|
fi
|
|
AC_SEARCH_LIBS(dgemm, $ARMLIB,
|
|
have_blas=1 have_armpl=1
|
|
blas_libs=""
|
|
ldflags="$ldflags \$(FFLAGS)",
|
|
echo "armpl not found"
|
|
)
|
|
if test "$have_armpl" -eq 1; then
|
|
if test "$use_openmp" -eq 0; then
|
|
fflags="$fflags -armpl"
|
|
else
|
|
fflags="$fflags -armpl=parallel"
|
|
fi
|
|
fi
|
|
;;
|
|
|
|
arm:gfortran )
|
|
# search for ARM libs - gfortran compiler
|
|
try_libdirs="$libdirs $ARMPL_LIBRARIES $ld_library_path"
|
|
for dir in none $try_libdirs
|
|
do
|
|
unset ac_cv_search_dgemm # clear cached value
|
|
if test "$dir" = "none"
|
|
then
|
|
try_loption=" "
|
|
else
|
|
echo $ECHO_N "in $dir: " $ECHO_C
|
|
try_loption="-L$dir"
|
|
fi
|
|
FFLAGS="$test_fflags"
|
|
LDFLAGS="$test_ldflags $try_loption"
|
|
# LIBS=""
|
|
# not sure the above is needed
|
|
#
|
|
if test "$use_openmp" -eq 0; then
|
|
AC_SEARCH_LIBS(dgemm, armpl,
|
|
have_blas=1 have_armpl=1
|
|
blas_libs="$try_loption $LIBS "
|
|
ldflags="$ldflags",
|
|
echo "armpl not found",
|
|
)
|
|
else
|
|
AC_SEARCH_LIBS(dgemm, armpl_mp,
|
|
have_blas=1 have_armpl=1
|
|
blas_libs="$try_loption $LIBS "
|
|
ldflags="$ldflags",
|
|
echo "armpl not found",
|
|
)
|
|
fi
|
|
if test "$ac_cv_search_dgemm" != "no"
|
|
then break ; fi
|
|
done
|
|
;;
|
|
|
|
# obsolescent or obsolete architectures
|
|
|
|
crayxt*:* )
|
|
# check for acml - OBSOLETE?
|
|
try_libdirs="$ld_library_path $libdirs"
|
|
for dir in none $try_libdirs
|
|
do
|
|
unset ac_cv_search_dgemm # clear cached value
|
|
if test "$dir" = "none"
|
|
then
|
|
try_loption=
|
|
else
|
|
echo $ECHO_N "in $dir: " $ECHO_C
|
|
try_loption="-L$dir"
|
|
fi
|
|
|
|
FFLAGS="$test_fflags"
|
|
LDFLAGS="$test_ldflags $try_loption"
|
|
LIBS=""
|
|
|
|
if test "$use_openmp" -eq 0; then
|
|
AC_SEARCH_LIBS(dgemm, acml, have_blas=1 have_lapack=1
|
|
have_acml=1 blas_libs="$try_loption $LIBS")
|
|
else
|
|
AC_SEARCH_LIBS(dgemm, acml_mp, have_blas=1 have_lapack=1
|
|
have_acml=1 blas_libs="$try_loption $LIBS")
|
|
fi
|
|
|
|
if test "$ac_cv_search_dgemm" != "no"
|
|
then break ; fi
|
|
done
|
|
;;
|
|
|
|
necsx:* )
|
|
#sx5-nec or sx6-nec or sx8-nec: check in (/SX)/usr/lib
|
|
#sx8-nec-idris: check in /SX/opt/mathkeisan/inst/lib0
|
|
try_libdirs="/SX/usr/lib /SX/opt/mathkeisan/inst/lib0"
|
|
for dir in none $try_libdirs
|
|
do
|
|
unset ac_cv_search_dgemm # clear cached value
|
|
if test "$dir" = "none"
|
|
then
|
|
try_loption=
|
|
else
|
|
echo $ECHO_N "in $dir: " $ECHO_C
|
|
try_loption="-L$dir"
|
|
fi
|
|
FFLAGS="$test_fflags"
|
|
LDFLAGS="$test_ldflags $try_loption"
|
|
LIBS=""
|
|
AC_SEARCH_LIBS(dgemm, blas, have_blas=1
|
|
blas_libs="$try_loption $LIBS")
|
|
if test "$ac_cv_search_dgemm" != "no"
|
|
then break ; fi
|
|
done
|
|
;;
|
|
esac
|
|
|
|
# blas not (yet) found: look for more possibilities
|
|
|
|
if test "$have_blas" -eq 0
|
|
then
|
|
case "$f90" in
|
|
pgf* )
|
|
# check for PGI blas
|
|
unset ac_cv_search_dgemm # clear cached value
|
|
FFLAGS="$test_fflags"
|
|
LDFLAGS="$test_ldflags"
|
|
LIBS=""
|
|
AC_SEARCH_LIBS(dgemm, blas, have_blas=1 blas_libs="$LIBS")
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
if test "$have_blas" -eq 0
|
|
then
|
|
# check for atlas (in several directories)
|
|
try_libdirs="$libdirs /usr/local/lib $ld_library_path"
|
|
|
|
for dir in none $try_libdirs
|
|
do
|
|
unset ac_cv_search_dgemm # clear cached value
|
|
if test "$dir" = "none"
|
|
then
|
|
try_loption=
|
|
else
|
|
echo $ECHO_N "in $dir: " $ECHO_C
|
|
try_loption="-L$dir"
|
|
fi
|
|
FFLAGS="$test_fflags"
|
|
LDFLAGS="$test_ldflags $try_loption"
|
|
LIBS="-latlas"
|
|
AC_SEARCH_LIBS(dgemm, f77blas, have_blas=1 have_atlas=1
|
|
blas_libs="$try_loption $LIBS", , -lg2c)
|
|
if test "$ac_cv_search_dgemm" != "no"
|
|
then break ; fi
|
|
done
|
|
fi
|
|
|
|
if test "$have_blas" -eq 0
|
|
then
|
|
# check for blas (in several directories)
|
|
try_libdirs="$libdirs /usr/local/lib $ld_library_path"
|
|
|
|
for dir in none $try_libdirs
|
|
do
|
|
unset ac_cv_search_dgemm # clear cached value
|
|
if test "$dir" = "none"
|
|
then
|
|
try_loption=
|
|
else
|
|
echo $ECHO_N "in $dir: " $ECHO_C
|
|
try_loption="-L$dir"
|
|
fi
|
|
FFLAGS="$test_fflags"
|
|
LDFLAGS="$test_ldflags $try_loption"
|
|
LIBS=""
|
|
AC_SEARCH_LIBS(dgemm, blas-3 openblas blas, have_blas=1
|
|
blas_libs="$try_loption $LIBS")
|
|
if test "$ac_cv_search_dgemm" != "no"
|
|
then break ; fi
|
|
done
|
|
fi
|
|
fi
|
|
|
|
if test "$have_blas" -eq 0 ; then
|
|
# No blas library found: use internal one (in lapack)
|
|
blas_libs="\$(TOPDIR)/external/lapack/libblas.a"
|
|
else
|
|
echo setting BLAS_LIBS... $blas_libs
|
|
fi
|
|
blas_line="BLAS_LIBS=$blas_libs"
|
|
|
|
AC_SUBST(blas_libs)
|
|
AC_SUBST(blas_line)
|
|
|
|
]
|
|
)
|