C Interfaces for ELPA

C interfaces are now available and definied in the header
elpa.h
parent ff61bd20
...@@ -9,11 +9,15 @@ AM_LDFLAGS = $(SCALAPACK_LDFLAGS) ...@@ -9,11 +9,15 @@ AM_LDFLAGS = $(SCALAPACK_LDFLAGS)
lib_LTLIBRARIES = libelpa@SUFFIX@.la lib_LTLIBRARIES = libelpa@SUFFIX@.la
libelpa@SUFFIX@_la_LINK = $(FCLINK) $(AM_LDFLAGS) -version-info $(ELPA_SO_VERSION) -lstdc++ libelpa@SUFFIX@_la_LINK = $(FCLINK) $(AM_LDFLAGS) -version-info $(ELPA_SO_VERSION) -lstdc++
libelpa@SUFFIX@_la_SOURCES = src/elpa_utilities.F90 src/elpa1.F90 src/elpa2_utilities.F90 src/elpa2.F90 libelpa@SUFFIX@_la_SOURCES = src/elpa_utilities.F90 \
libelpa@SUFFIX@_la_SOURCES += src/elpa_qr/qr_utils.f90 \ src/elpa1.F90 \
src/elpa_qr/elpa_qrkernels.f90 \ src/elpa2_utilities.F90 \
src/elpa_qr/elpa_pdlarfb.f90 \ src/elpa2.F90 \
src/elpa_qr/elpa_pdgeqrf.f90 src/elpa_c_interface.F90 \
src/elpa_qr/qr_utils.f90 \
src/elpa_qr/elpa_qrkernels.f90 \
src/elpa_qr/elpa_pdlarfb.f90 \
src/elpa_qr/elpa_pdgeqrf.f90
if HAVE_DETAILED_TIMINGS if HAVE_DETAILED_TIMINGS
libelpa@SUFFIX@_la_SOURCES += src/timer.F90 \ libelpa@SUFFIX@_la_SOURCES += src/timer.F90 \
src/ftimings/ftimings.F90 \ src/ftimings/ftimings.F90 \
...@@ -86,6 +90,7 @@ endif ...@@ -86,6 +90,7 @@ endif
# install any .mod files in the include/ dir # install any .mod files in the include/ dir
elpa_includedir = $(includedir)/elpa@SUFFIX@-@PACKAGE_VERSION@ elpa_includedir = $(includedir)/elpa@SUFFIX@-@PACKAGE_VERSION@
nobase_elpa_include_HEADERS = $(wildcard modules/*) nobase_elpa_include_HEADERS = $(wildcard modules/*)
nobase_elpa_include_HEADERS += elpa/elpa.h elpa/elpa_kernel_constants.h elpa/elpa_generated.h
# other files to distribute # other files to distribute
filesdir = $(docdir)/examples filesdir = $(docdir)/examples
...@@ -100,6 +105,7 @@ dist_files_DATA = \ ...@@ -100,6 +105,7 @@ dist_files_DATA = \
test/test_real2_default_kernel_qr_decomposition.F90 \ test/test_real2_default_kernel_qr_decomposition.F90 \
test/test_real2_choose_kernel_with_api.F90 \ test/test_real2_choose_kernel_with_api.F90 \
test/test_real.F90 \ test/test_real.F90 \
test/test_real_with_c.F90 \
src/print_available_elpa2_kernels.F90 src/print_available_elpa2_kernels.F90
dist_doc_DATA = README COPYING/COPYING COPYING/gpl.txt COPYING/lgpl.txt dist_doc_DATA = README COPYING/COPYING COPYING/gpl.txt COPYING/lgpl.txt
...@@ -111,6 +117,7 @@ pkgconfig_DATA = @PKG_CONFIG_FILE@ ...@@ -111,6 +117,7 @@ pkgconfig_DATA = @PKG_CONFIG_FILE@
# programs # programs
bin_PROGRAMS = \ bin_PROGRAMS = \
elpa1_test_real@SUFFIX@ \ elpa1_test_real@SUFFIX@ \
elpa1_test_real_with_c@SUFFIX@ \
elpa1_test_complex@SUFFIX@ \ elpa1_test_complex@SUFFIX@ \
elpa2_test_real@SUFFIX@ \ elpa2_test_real@SUFFIX@ \
elpa2_test_complex@SUFFIX@ \ elpa2_test_complex@SUFFIX@ \
...@@ -121,57 +128,70 @@ noinst_PROGRAMS = \ ...@@ -121,57 +128,70 @@ noinst_PROGRAMS = \
elpa2_test_real_default_kernel_qr_decomposition@SUFFIX@ \ elpa2_test_real_default_kernel_qr_decomposition@SUFFIX@ \
elpa2_test_complex_default_kernel@SUFFIX@ \ elpa2_test_complex_default_kernel@SUFFIX@ \
elpa2_test_real_choose_kernel_with_api@SUFFIX@ \ elpa2_test_real_choose_kernel_with_api@SUFFIX@ \
elpa2_test_complex_choose_kernel_with_api@SUFFIX@ elpa2_test_complex_choose_kernel_with_api@SUFFIX@ \
elpa1_test_real_c_version@SUFFIX@
build_lib = libelpa@SUFFIX@.la build_lib = libelpa@SUFFIX@.la
if HAVE_REDIRECT if HAVE_REDIRECT
redirect_sources = test/redir.c test/redirect.F90 redirect_sources = test/shared_sources/redir.c test/shared_sources/redirect.F90
else else
redirect_sources = redirect_sources =
endif endif
elpa1_test_real@SUFFIX@_SOURCES = test/test_real.F90 test/util.F90 $(redirect_sources) shared_sources = test/shared_sources/util.F90 test/shared_sources/read_input_parameters.F90 test/shared_sources/check_correctnes.F90 test/shared_sources/setup_mpi.F90 \
test/shared_sources/blacs_infrastructure.F90 test/shared_sources/prepare_matrix.F90
elpa1_test_real_c_version@SUFFIX@_SOURCES = test/test_real_c_version.c $(shared_sources) $(redirect_sources)
elpa1_test_real_c_version@SUFFIX@_LDADD = $(build_lib)
elpa1_test_real@SUFFIX@_SOURCES = test/test_real.F90 $(shared_sources) $(redirect_sources)
elpa1_test_real@SUFFIX@_LDADD = $(build_lib) elpa1_test_real@SUFFIX@_LDADD = $(build_lib)
elpa2_test_real@SUFFIX@_SOURCES = test/test_real2.F90 test/util.F90 $(redirect_sources) elpa1_test_real_with_c@SUFFIX@_SOURCES = test/test_real_with_c.F90 test//shared_sources/mod_from_c.F90 test//shared_sources/call_elpa1_real.c $(shared_sources) $(redirect_sources)
elpa1_test_real_with_c@SUFFIX@_LDADD = $(build_lib)
elpa2_test_real@SUFFIX@_SOURCES = test/test_real2.F90 $(shared_sources) $(redirect_sources)
elpa2_test_real@SUFFIX@_LDADD = $(build_lib) elpa2_test_real@SUFFIX@_LDADD = $(build_lib)
elpa2_test_real_default_kernel@SUFFIX@_SOURCES = test/test_real2_default_kernel.F90 test/util.F90 $(redirect_sources) elpa2_test_real_default_kernel@SUFFIX@_SOURCES = test/test_real2_default_kernel.F90 $(shared_sources) $(redirect_sources)
elpa2_test_real_default_kernel@SUFFIX@_LDADD = $(build_lib) elpa2_test_real_default_kernel@SUFFIX@_LDADD = $(build_lib)
elpa2_test_real_default_kernel_qr_decomposition@SUFFIX@_SOURCES = test/test_real2_default_kernel_qr_decomposition.F90 test/util.F90 $(redirect_sources) elpa2_test_real_default_kernel_qr_decomposition@SUFFIX@_SOURCES = test/test_real2_default_kernel_qr_decomposition.F90 $(shared_sources) $(redirect_sources)
elpa2_test_real_default_kernel_qr_decomposition@SUFFIX@_LDADD = $(build_lib) elpa2_test_real_default_kernel_qr_decomposition@SUFFIX@_LDADD = $(build_lib)
elpa2_test_real_choose_kernel_with_api@SUFFIX@_SOURCES = test/test_real2_choose_kernel_with_api.F90 test/util.F90 $(redirect_sources) elpa2_test_real_choose_kernel_with_api@SUFFIX@_SOURCES = test/test_real2_choose_kernel_with_api.F90 $(shared_sources) $(redirect_sources)
elpa2_test_real_choose_kernel_with_api@SUFFIX@_LDADD = $(build_lib) elpa2_test_real_choose_kernel_with_api@SUFFIX@_LDADD = $(build_lib)
elpa1_test_complex@SUFFIX@_SOURCES = test/test_complex.F90 test/util.F90 $(redirect_sources) elpa1_test_complex@SUFFIX@_SOURCES = test/test_complex.F90 $(shared_sources) $(redirect_sources)
elpa1_test_complex@SUFFIX@_LDADD = $(build_lib) elpa1_test_complex@SUFFIX@_LDADD = $(build_lib)
elpa2_test_complex@SUFFIX@_SOURCES = test/test_complex2.F90 test/util.F90 $(redirect_sources) elpa2_test_complex@SUFFIX@_SOURCES = test/test_complex2.F90 $(shared_sources) $(redirect_sources)
elpa2_test_complex@SUFFIX@_LDADD = $(build_lib) elpa2_test_complex@SUFFIX@_LDADD = $(build_lib)
elpa2_test_complex_default_kernel@SUFFIX@_SOURCES = test/test_complex2_default_kernel.F90 test/util.F90 $(redirect_sources) elpa2_test_complex_default_kernel@SUFFIX@_SOURCES = test/test_complex2_default_kernel.F90 $(shared_sources) $(redirect_sources)
elpa2_test_complex_default_kernel@SUFFIX@_LDADD = $(build_lib) elpa2_test_complex_default_kernel@SUFFIX@_LDADD = $(build_lib)
elpa2_test_complex_choose_kernel_with_api@SUFFIX@_SOURCES = test/test_complex2_choose_kernel_with_api.F90 test/util.F90 $(redirect_sources) elpa2_test_complex_choose_kernel_with_api@SUFFIX@_SOURCES = test/test_complex2_choose_kernel_with_api.F90 $(shared_sources) $(redirect_sources)
elpa2_test_complex_choose_kernel_with_api@SUFFIX@_LDADD = $(build_lib) elpa2_test_complex_choose_kernel_with_api@SUFFIX@_LDADD = $(build_lib)
elpa2_print_kernels@SUFFIX@_SOURCES = src/print_available_elpa2_kernels.F90 test/util.F90 $(redirect_sources) elpa2_print_kernels@SUFFIX@_SOURCES = src/print_available_elpa2_kernels.F90 $(shared_sources) $(redirect_sources)
elpa2_print_kernels@SUFFIX@_LDADD = $(build_lib) elpa2_print_kernels@SUFFIX@_LDADD = $(build_lib)
check_SCRIPTS = \ check_SCRIPTS = \
elpa1_test_real.sh \ elpa1_test_real.sh \
elpa1_test_real_with_c.sh \
elpa1_test_real_c_version.sh \
elpa2_test_real.sh \ elpa2_test_real.sh \
elpa2_test_real_default_kernel.sh \ elpa2_test_real_default_kernel.sh \
elpa1_test_complex.sh \ elpa1_test_complex.sh \
...@@ -183,11 +203,18 @@ check_SCRIPTS = \ ...@@ -183,11 +203,18 @@ check_SCRIPTS = \
elpa2_print_kernels@SUFFIX@ elpa2_print_kernels@SUFFIX@
TESTS = $(check_SCRIPTS) TESTS = $(check_SCRIPTS)
elpa1_test_real.sh: elpa1_test_real.sh:
echo 'mpiexec -n 2 ./elpa1_test_real@SUFFIX@ $$TEST_FLAGS' > elpa1_test_real.sh echo 'mpiexec -n 2 ./elpa1_test_real@SUFFIX@ $$TEST_FLAGS' > elpa1_test_real.sh
chmod +x elpa1_test_real.sh chmod +x elpa1_test_real.sh
elpa1_test_real_with_c.sh:
echo 'mpiexec -n 2 ./elpa1_test_real_with_c@SUFFIX@ $$TEST_FLAGS' > elpa1_test_real_with_c.sh
chmod +x elpa1_test_real_with_c.sh
elpa1_test_real_c_version.sh:
echo 'mpiexec -n 2 ./elpa1_test_real_c_version@SUFFIX@ $$TEST_FLAGS' > elpa1_test_real_c_version.sh
chmod +x elpa1_test_real_c_version.sh
elpa2_test_real.sh: elpa2_test_real.sh:
echo 'mpiexec -n 2 ./elpa2_test_real@SUFFIX@ $$TEST_FLAGS' > elpa2_test_real.sh echo 'mpiexec -n 2 ./elpa2_test_real@SUFFIX@ $$TEST_FLAGS' > elpa2_test_real.sh
chmod +x elpa2_test_real.sh chmod +x elpa2_test_real.sh
...@@ -220,6 +247,9 @@ elpa2_test_complex_choose_kernel_with_api.sh: ...@@ -220,6 +247,9 @@ elpa2_test_complex_choose_kernel_with_api.sh:
echo 'mpiexec -n 2 ./elpa2_test_complex_choose_kernel_with_api@SUFFIX@ $$TEST_FLAGS' > elpa2_test_complex_choose_kernel_with_api.sh echo 'mpiexec -n 2 ./elpa2_test_complex_choose_kernel_with_api@SUFFIX@ $$TEST_FLAGS' > elpa2_test_complex_choose_kernel_with_api.sh
chmod +x elpa2_test_complex_choose_kernel_with_api.sh chmod +x elpa2_test_complex_choose_kernel_with_api.sh
elpa2_utilities.i: $(top_srcdir)/src/elpa2_utilities.F90
$(CPP) $(CPPFLAGS) -I$(top_builddir)/ -c $(top_srcdir)/src/elpa2_utilities.F90 -o $@
elpa2.i: $(top_srcdir)/src/elpa2.F90 elpa2.i: $(top_srcdir)/src/elpa2.F90
$(CPP) $(CPPFLAGS) -I$(top_builddir)/ -c $(top_srcdir)/src/elpa2.F90 -o $@ $(CPP) $(CPPFLAGS) -I$(top_builddir)/ -c $(top_srcdir)/src/elpa2.F90 -o $@
...@@ -227,6 +257,7 @@ elpa1.i: $(top_srcdir)/src/elpa1.F90 ...@@ -227,6 +257,7 @@ elpa1.i: $(top_srcdir)/src/elpa1.F90
$(CPP) $(CPPFLAGS) -I$(top_builddir)/ -c $(top_srcdir)/src/elpa1.F90 -o $@ $(CPP) $(CPPFLAGS) -I$(top_builddir)/ -c $(top_srcdir)/src/elpa1.F90 -o $@
CLEANFILES = \ CLEANFILES = \
elpa-generated.h \
elpa1_test_real.sh \ elpa1_test_real.sh \
elpa1_test_complex.sh \ elpa1_test_complex.sh \
elpa2_test_real.sh \ elpa2_test_real.sh \
......
...@@ -52,18 +52,36 @@ fi ...@@ -52,18 +52,36 @@ fi
m4_include([fdep/fortran_dependencies.m4]) m4_include([fdep/fortran_dependencies.m4])
FDEP_F90_GNU_MAKE_DEPS FDEP_F90_GNU_MAKE_DEPS
dnl check whether mpi compilers are available;
dnl if not abort since it is mandatory
# C
AC_LANG([C])
m4_include([m4/ax_prog_cc_mpi.m4])
AX_PROG_CC_MPI([true],[],[AC_MSG_ERROR([no MPI C wrapper found])])
AC_PROG_INSTALL AC_PROG_INSTALL
: ${CFLAGS=""} : ${CFLAGS=""}
: ${CXXFLAGS=""} : ${CXXFLAGS=""}
#: ${FCLAGS="-O2"} #: ${FCLAGS="-O2"}
AC_PROG_CC
#AM_PROG_CC_C_O
AM_PROG_AR AM_PROG_AR
AM_PROG_AS AM_PROG_AS
# Fortran
AC_LANG([Fortran])
m4_include([m4/ax_prog_fc_mpi.m4])
AX_PROG_FC_MPI([],[],[AC_MSG_ERROR([no MPI Fortran wrapper found])])
# C++
AC_LANG([C++])
AC_PROG_CXX AC_PROG_CXX
dnl variables needed for the tests dnl variables needed for the tests
dnl these test will cause an abort of configure if not dnl these test will cause an abort of configure if not
...@@ -72,7 +90,6 @@ dnl lapack, and scalapack test can fail and vice versa ...@@ -72,7 +90,6 @@ dnl lapack, and scalapack test can fail and vice versa
have_blas=no have_blas=no
have_blacs=no have_blacs=no
have_mkl=no have_mkl=no
have_mpi=no
have_lapack=no have_lapack=no
have_scalapack=no have_scalapack=no
...@@ -105,6 +122,8 @@ install_complex_bgq=no ...@@ -105,6 +122,8 @@ install_complex_bgq=no
install_complex_avx_block1=no install_complex_avx_block1=no
install_complex_avx_block2=no install_complex_avx_block2=no
AC_LANG([C])
dnl build with ftimings support dnl build with ftimings support
AC_MSG_CHECKING(whether ELPA should be build with ftimings support) AC_MSG_CHECKING(whether ELPA should be build with ftimings support)
AC_ARG_WITH([ftimings], AC_ARG_WITH([ftimings],
...@@ -222,15 +241,6 @@ if test x"${with_avx_optimization}" = x"yes"; then ...@@ -222,15 +241,6 @@ if test x"${with_avx_optimization}" = x"yes"; then
fi fi
AC_LANG([Fortran]) AC_LANG([Fortran])
m4_include([m4/ax_prog_fc_mpi.m4])
dnl check whether an mpi compiler is available;
dnl if not abort since it is mandatory
AX_PROG_FC_MPI([],[have_mpi=yes],[have_mpi=no
if test x"${have_mpi}" = xno; then
AC_MSG_ERROR([no mpi found])
fi])
AC_FC_FREEFORM AC_FC_FREEFORM
AC_FC_MODULE_FLAG AC_FC_MODULE_FLAG
AC_FC_MODULE_OUTPUT_FLAG AC_FC_MODULE_OUTPUT_FLAG
...@@ -772,4 +782,10 @@ if test -e config.h ; then ...@@ -772,4 +782,10 @@ if test -e config.h ; then
grep "^#define" config.h > config-f90.h grep "^#define" config.h > config-f90.h
else else
echo "Warning! No config.h was generated, check for errors and re-run configure!" echo "Warning! No config.h was generated, check for errors and re-run configure!"
exit 1
fi fi
echo "Generating elpa/elpa_generated.h..."
mkdir -p elpa
grep "^ *!c>" $srcdir/src/elpa_c_interface.F90 | sed 's/^ *!c>//;' > elpa/elpa_generated.h || exit 1
#include <elpa/elpa_kernel_constants.h>
#include <elpa/elpa_generated.h>
#define ELPA2_REAL_KERNEL_GENERIC 1
#define ELPA2_REAL_KERNEL_GENERIC_SIMPLE 2
#define ELPA2_REAL_KERNEL_BGP 3
#define ELPA2_REAL_KERNEL_BGQ 4
#define ELPA2_REAL_KERNEL_SSE 5
#define ELPA2_REAL_KERNEL_AVX_BLOCK2 6
#define ELPA2_REAL_KERNEL_AVX_BLOCK4 7
#define ELPA2_REAL_KERNEL_AVX_BLOCK6 8
#define ELPA2_NUMBER_OF_REAL_KERNELS 8
#define ELPA2_COMPLEX_KERNEL_GENERIC 1
#define ELPA2_COMPLEX_KERNEL_GENERIC_SIMPLE 2
#define ELPA2_COMPLEX_KERNEL_BGP 3
#define ELPA2_COMPLEX_KERNEL_BGQ 4
#define ELPA2_COMPLEX_KERNEL_SSE 5
#define ELPA2_COMPLEX_KERNEL_AVX_BLOCK1 6
#define ELPA2_COMPLEX_KERNEL_AVX_BLOCK2 7
#define ELPA2_NUMBER_OF_COMPLEX_KERNELS 7
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_prog_cc_mpi.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_PROG_CC_MPI([MPI-WANTED-TEST[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]])
#
# DESCRIPTION
#
# This macro tries to find out how to compile C programs that use MPI
# (Message Passing Interface), a standard API for parallel process
# communication (see http://www-unix.mcs.anl.gov/mpi/). The macro has to
# be used instead of the standard macro AC_PROG_CC and will replace the
# standard variable CC with the found compiler.
#
# MPI-WANTED-TEST is used to test whether MPI is actually wanted by the
# user. If MPI-WANTED_TEST is omitted or if it succeeds, the macro will
# try to find out how to use MPI, if it fails, the macro will call
# AC_PROG_CC to find a standard C compiler instead.
#
# When MPI is found, ACTION-IF-FOUND will be executed, if MPI is not found
# (or MPI-WANTED-TEST fails) ACTION-IF-NOT-FOUND is executed. If
# ACTION-IF-FOUND is not set, the macro will define HAVE_MPI.
#
# The following example demonstrates usage of the macro:
#
# # If --with-mpi=auto is used, try to find MPI, but use standard C compiler if it is not found.
# # If --with-mpi=yes is used, try to find MPI and fail if it isn't found.
# # If --with-mpi=no is used, use a standard C compiler instead.
# AC_ARG_WITH(mpi, [AS_HELP_STRING([--with-mpi],
# [compile with MPI (parallelization) support. If none is found,
# MPI is not used. Default: auto])
# ],,[with_mpi=auto])
# #
# AX_PROG_CC_MPI([test x"$with_mpi" != xno],[use_mpi=yes],[
# use_mpi=no
# if test x"$with_mpi" = xyes; then
# AC_MSG_FAILURE([MPI compiler requested, but couldn't use MPI.])
# else
# AC_MSG_WARN([No MPI compiler found, won't use MPI.])
# fi
# ])
#
# LICENSE
#
# Copyright (c) 2010,2011 Olaf Lenz <olenz@icp.uni-stuttgart.de>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 1
AC_DEFUN([AX_PROG_CC_MPI], [
AC_PREREQ(2.50)
# Check for compiler
# Needs to be split off into an extra macro to ensure right expansion
# order.
AC_REQUIRE([_AX_PROG_CC_MPI],[_AX_PROG_CC_MPI([$1])])
AS_IF([test x"$_ax_prog_cc_mpi_mpi_wanted" = xno],
[ _ax_prog_cc_mpi_mpi_found=no ],
[
AC_LANG_PUSH([C])
# test whether MPI_Init is available
# We do not use AC_SEARCH_LIBS here, as it caches its outcome and
# thus disallows corresponding calls in the other AX_PROG_*_MPI
# macros.
for lib in NONE mpi mpich; do
save_LIBS=$LIBS
if test x"$lib" = xNONE; then
AC_MSG_CHECKING([for function MPI_Init])
else
AC_MSG_CHECKING([for function MPI_Init in -l$lib])
LIBS="-l$lib $LIBS"
fi
AC_LINK_IFELSE([AC_LANG_CALL([],[MPI_Init])],
[ _ax_prog_cc_mpi_mpi_found=yes ],
[ _ax_prog_cc_mpi_mpi_found=no ])
AC_MSG_RESULT($_ax_prog_cc_mpi_mpi_found)
if test "x$_ax_prog_cc_mpi_mpi_found" = "xyes"; then
break;
fi
LIBS=$save_LIBS
done
# Check for header
AS_IF([test x"$_ax_prog_cc_mpi_mpi_found" = xyes], [
AC_MSG_CHECKING([for mpi.h])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <mpi.h>])],
[ AC_MSG_RESULT(yes)],
[ AC_MSG_RESULT(no)
_ax_prog_cc_mpi_mpi_found=no
])
])
AC_LANG_POP([C])
])
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
AS_IF([test x"$_ax_prog_cc_mpi_mpi_found" = xyes], [
ifelse([$2],,[AC_DEFINE(HAVE_MPI,1,[Define if you have the MPI library.])],[$2])
:
],[
$3
:
])
])dnl AX_PROG_CC_MPI
dnl _AX_PROG_CC_MPI is an internal macro required by AX_PROG_CC_MPI.
dnl To ensure the right expansion order, the main function AX_PROG_CC_MPI
dnl has to be split into two parts.
dnl
dnl Known MPI C compilers:
dnl mpicc
dnl mpixlc_r
dnl mpixlc
dnl hcc
dnl mpxlc_r
dnl mpxlc
dnl sxmpicc NEC SX
dnl mpifcc Fujitsu
dnl mpgcc
dnl mpcc
dnl cmpicc
dnl cc
dnl
AC_DEFUN([_AX_PROG_CC_MPI], [
AC_ARG_VAR(MPICC,[MPI C compiler command])
ifelse([$1],,[_ax_prog_cc_mpi_mpi_wanted=yes],[
AC_MSG_CHECKING([whether to compile using MPI])
if $1; then
_ax_prog_cc_mpi_mpi_wanted=yes
else
_ax_prog_cc_mpi_mpi_wanted=no
fi
AC_MSG_RESULT($_ax_prog_cc_mpi_mpi_wanted)
])
if test x"$_ax_prog_cc_mpi_mpi_wanted" = xyes; then
if test -z "$CC" && test -n "$MPICC"; then
CC="$MPICC"
else
AC_CHECK_TOOLS([CC], [mpicc mpixlc_r mpixlc hcc mpxlc_r mpxlc sxmpicc mpifcc mpgcc mpcc cmpicc cc gcc])
fi
fi
AC_PROG_CC
])dnl _AX_PROG_CC_MPI
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
#include "config-f90.h" #include "config-f90.h"
#include <elpa/elpa_kernel_constants.h>
module ELPA2_utilities module ELPA2_utilities
...@@ -98,16 +99,15 @@ module ELPA2_utilities ...@@ -98,16 +99,15 @@ module ELPA2_utilities
integer, parameter :: error_unit = 6 integer, parameter :: error_unit = 6
#endif #endif
integer, parameter :: number_of_real_kernels = ELPA2_NUMBER_OF_REAL_KERNELS
integer, parameter :: number_of_real_kernels = 8 integer, parameter :: REAL_ELPA_KERNEL_GENERIC = ELPA2_REAL_KERNEL_GENERIC
integer, parameter :: REAL_ELPA_KERNEL_GENERIC = 1 integer, parameter :: REAL_ELPA_KERNEL_GENERIC_SIMPLE = ELPA2_REAL_KERNEL_GENERIC_SIMPLE
integer, parameter :: REAL_ELPA_KERNEL_GENERIC_SIMPLE = 2 integer, parameter :: REAL_ELPA_KERNEL_BGP = ELPA2_REAL_KERNEL_BGP
integer, parameter :: REAL_ELPA_KERNEL_BGP = 3 integer, parameter :: REAL_ELPA_KERNEL_BGQ = ELPA2_REAL_KERNEL_BGQ
integer, parameter :: REAL_ELPA_KERNEL_BGQ = 4 integer, parameter :: REAL_ELPA_KERNEL_SSE = ELPA2_REAL_KERNEL_SSE
integer, parameter :: REAL_ELPA_KERNEL_SSE = 5 integer, parameter :: REAL_ELPA_KERNEL_AVX_BLOCK2 = ELPA2_REAL_KERNEL_AVX_BLOCK2
integer, parameter :: REAL_ELPA_KERNEL_AVX_BLOCK2 = 6 integer, parameter :: REAL_ELPA_KERNEL_AVX_BLOCK4 = ELPA2_REAL_KERNEL_AVX_BLOCK4
integer, parameter :: REAL_ELPA_KERNEL_AVX_BLOCK4 = 7 integer, parameter :: REAL_ELPA_KERNEL_AVX_BLOCK6 = ELPA2_REAL_KERNEL_AVX_BLOCK6
integer, parameter :: REAL_ELPA_KERNEL_AVX_BLOCK6 = 8
#if defined(WITH_REAL_AVX_BLOCK2_KERNEL) #if defined(WITH_REAL_AVX_BLOCK2_KERNEL)
integer, parameter :: DEFAULT_REAL_ELPA_KERNEL = REAL_ELPA_KERNEL_GENERIC integer, parameter :: DEFAULT_REAL_ELPA_KERNEL = REAL_ELPA_KERNEL_GENERIC
...@@ -124,14 +124,14 @@ module ELPA2_utilities ...@@ -124,14 +124,14 @@ module ELPA2_utilities
"REAL_ELPA_KERNEL_AVX_BLOCK4 ", & "REAL_ELPA_KERNEL_AVX_BLOCK4 ", &
"REAL_ELPA_KERNEL_AVX_BLOCK6 "/) "REAL_ELPA_KERNEL_AVX_BLOCK6 "/)
integer, parameter :: number_of_complex_kernels = 7 integer, parameter :: number_of_complex_kernels = ELPA2_NUMBER_OF_COMPLEX_KERNELS
integer, parameter :: COMPLEX_ELPA_KERNEL_GENERIC = 1 integer, parameter :: COMPLEX_ELPA_KERNEL_GENERIC = ELPA2_COMPLEX_KERNEL_GENERIC
integer, parameter :: COMPLEX_ELPA_KERNEL_GENERIC_SIMPLE = 2 integer, parameter :: COMPLEX_ELPA_KERNEL_GENERIC_SIMPLE = ELPA2_COMPLEX_KERNEL_GENERIC_SIMPLE
integer, parameter :: COMPLEX_ELPA_KERNEL_BGP = 3 integer, parameter :: COMPLEX_ELPA_KERNEL_BGP = ELPA2_COMPLEX_KERNEL_BGP
integer, parameter :: COMPLEX_ELPA_KERNEL_BGQ = 4 integer, parameter :: COMPLEX_ELPA_KERNEL_BGQ = ELPA2_COMPLEX_KERNEL_BGQ
integer, parameter :: COMPLEX_ELPA_KERNEL_SSE = 5 integer, parameter :: COMPLEX_ELPA_KERNEL_SSE = ELPA2_COMPLEX_KERNEL_SSE
integer, parameter :: COMPLEX_ELPA_KERNEL_AVX_BLOCK1 = 6 integer, parameter :: COMPLEX_ELPA_KERNEL_AVX_BLOCK1 = ELPA2_COMPLEX_KERNEL_AVX_BLOCK1
integer, parameter :: COMPLEX_ELPA_KERNEL_AVX_BLOCK2 = 7 integer, parameter :: COMPLEX_ELPA_KERNEL_AVX_BLOCK2 = ELPA2_COMPLEX_KERNEL_AVX_BLOCK2
#if defined(WITH_COMPLEX_AVX_BLOCK1_KERNEL) #if defined(WITH_COMPLEX_AVX_BLOCK1_KERNEL)
integer, parameter :: DEFAULT_COMPLEX_ELPA_KERNEL = COMPLEX_ELPA_KERNEL_GENERIC integer, parameter :: DEFAULT_COMPLEX_ELPA_KERNEL = COMPLEX_ELPA_KERNEL_GENERIC
......
! This file is part of ELPA.
!
! The ELPA library was originally created by the ELPA consortium,
! consisting of the following organizations:
!
! - Rechenzentrum Garching der Max-Planck-Gesellschaft (RZG),
! - Bergische Universität Wuppertal, Lehrstuhl für angewandte
! Informatik,
! - Technische Universität München, Lehrstuhl für Informatik mit
! Schwerpunkt Wissenschaftliches Rechnen ,
! - Fritz-Haber-Institut, Berlin, Abt. Theorie,
! - Max-Plack-Institut für Mathematik in den Naturwissenschaftrn,
! Leipzig, Abt. Komplexe Strukutren in Biologie und Kognition,
! and
! - IBM Deutschland GmbH
!
!
! More information can be found here:
! http://elpa.rzg.mpg.de/
!
! ELPA is free software: you can redistribute it and/or modify
! it under the terms of the version 3 of the license of the
! GNU Lesser General Public License as published by the Free
! Software Foundation.
!
! ELPA is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! GNU Lesser General Public License for more details.
!
! You should have received a copy of the GNU Lesser General Public License