Commit 460b754c authored by Lorenz Huedepohl's avatar Lorenz Huedepohl

Work-In-Progress commit for new ELPA interface

parent dbe258d9
......@@ -20,6 +20,7 @@ libelpa@SUFFIX@_public_la_SOURCES = \
src/elpa1/legacy_interface/elpa1_auxiliary_legacy.F90 \
src/elpa1/elpa1_auxiliary.F90 \
src/elpa_t.F90 \
src/elpa_constants.F90 \
src/general/elpa_utilities.F90
# internal parts
......@@ -53,8 +54,8 @@ libelpa@SUFFIX@_private_la_SOURCES = \
src/elpa2/qr/elpa_pdgeqrf.F90 \
src/elpa1/elpa1.F90 \
src/elpa2/elpa2.F90 \
src/elpa_index.c \
src/elpa_options.c
src/elpa_constants.c \
src/elpa_index.c
EXTRA_libelpa@SUFFIX@_private_la_DEPENDENCIES = \
src/elpa1/elpa_reduce_add_vectors.X90 \
......@@ -322,10 +323,9 @@ endif
include generated_headers.am
BUILT_SOURCES = $(generated_headers)
# install public Fortran modules files in the include/ dir
# install public headers and Fortran modules files in the include/ dir
elpa_includedir = $(includedir)/elpa@SUFFIX@-@PACKAGE_VERSION@
nobase_elpa_include_HEADERS = $(wildcard modules/*)
nobase_elpa_include_HEADERS += elpa/elpa.h elpa/elpa_kernel_constants.h elpa/elpa_solver_constants.h elpa/elpa_constants.h elpa/elpa_generated.h
nobase_elpa_include_HEADERS = $(wildcard modules/*) $(wildcard elpa/*)
dist_man_MANS = \
man/solve_evp_real.3 \
......
This diff is collapsed.
#define ELPA_INVALID_INT INT_MIN
#define ELPA_C_ERROR 0
#define ELPA_C_OK 1
#ifdef ELPA_H
#define ELPA_ERROR ELPA_C_ERROR
#define ELPA_OK ELPA_C_OK
#endif
#include <elpa/elpa_kernel_constants.h>
#include <elpa/elpa_solver_constants.h>
#pragma once
/* This might seem over-engineered, but helps to re-use this file also on the
* Fortran side and thus to keep the definitions in this one place here
*/
/* Private helper macros */
#define ELPA_ENUM_ENTRY(name, value) \
name = value,
#define ELPA_ENUM_SUM(name, value) +1
/* Solver constants */
#define ELPA_SOLVER_MAP(X) \
X(ELPA_SOLVER_1STAGE, 1) \
X(ELPA_SOLVER_2STAGE, 2)
enum ELPA_SOLVERS {
ELPA_SOLVER_MAP(ELPA_ENUM_ENTRY)
};
#define ELPA_NUMBER_OF_SOLVERS (0 ELPA_SOLVER_MAP(ELPA_ENUM_SUM))
/* Kernel constants */
#define ELPA_REAL_KERNEL_MAP(X) \
X(ELPA_2STAGE_REAL_GENERIC, 1) \
X(ELPA_2STAGE_REAL_GENERIC_SIMPLE, 2) \
X(ELPA_2STAGE_REAL_BGP, 3) \
X(ELPA_2STAGE_REAL_BGQ, 4) \
X(ELPA_2STAGE_REAL_SSE, 5) \
X(ELPA_2STAGE_REAL_SSE_BLOCK2, 6) \
X(ELPA_2STAGE_REAL_SSE_BLOCK4, 7) \
X(ELPA_2STAGE_REAL_SSE_BLOCK6, 8) \
X(ELPA_2STAGE_REAL_AVX_BLOCK2, 9) \
X(ELPA_2STAGE_REAL_AVX_BLOCK4, 10) \
X(ELPA_2STAGE_REAL_AVX_BLOCK6, 11) \
X(ELPA_2STAGE_REAL_AVX2_BLOCK2, 12) \
X(ELPA_2STAGE_REAL_AVX2_BLOCK4, 13) \
X(ELPA_2STAGE_REAL_AVX2_BLOCK6, 14) \
X(ELPA_2STAGE_REAL_AVX512_BLOCK2, 15) \
X(ELPA_2STAGE_REAL_AVX512_BLOCK4, 16) \
X(ELPA_2STAGE_REAL_AVX512_BLOCK6, 17) \
X(ELPA_2STAGE_REAL_GPU, 18) \
X(ELPA_2STAGE_REAL_DEFAULT, @ELPA_2STAGE_REAL_DEFAULT@)
enum ELPA_REAL_KERNELS {
ELPA_REAL_KERNEL_MAP(ELPA_ENUM_ENTRY)
};
#define ELPA_COMPLEX_KERNEL_MAP(X) \
X(ELPA_2STAGE_COMPLEX_GENERIC, 1) \
X(ELPA_2STAGE_COMPLEX_GENERIC_SIMPLE, 2) \
X(ELPA_2STAGE_COMPLEX_BGP, 3) \
X(ELPA_2STAGE_COMPLEX_BGQ, 4) \
X(ELPA_2STAGE_COMPLEX_SSE, 5) \
X(ELPA_2STAGE_COMPLEX_SSE_BLOCK1, 6) \
X(ELPA_2STAGE_COMPLEX_SSE_BLOCK2, 7) \
X(ELPA_2STAGE_COMPLEX_AVX_BLOCK1, 8) \
X(ELPA_2STAGE_COMPLEX_AVX_BLOCK2, 9) \
X(ELPA_2STAGE_COMPLEX_AVX2_BLOCK1, 10) \
X(ELPA_2STAGE_COMPLEX_AVX2_BLOCK2, 11) \
X(ELPA_2STAGE_COMPLEX_AVX512_BLOCK1, 12) \
X(ELPA_2STAGE_COMPLEX_AVX512_BLOCK2, 13) \
X(ELPA_2STAGE_COMPLEX_GPU, 14) \
X(ELPA_2STAGE_COMPLEX_DEFAULT, @ELPA_2STAGE_COMPLEX_DEFAULT@)
enum ELPA_COMPLEX_KERNELS {
ELPA_COMPLEX_KERNEL_MAP(ELPA_ENUM_ENTRY)
};
/* General constants */
#define ELPA_CONSTANTS_MAP(X) \
X(ELPA_ERROR, -1) \
X(ELPA_NO, 0) \
X(ELPA_OK, 1)
enum ELPA_CONSTANTS {
ELPA_CONSTANTS_MAP(ELPA_ENUM_ENTRY)
/* -1 to take out the default kernel again */
ELPA_2STAGE_NUMBER_OF_COMPLEX_KERNELS = (0 ELPA_COMPLEX_KERNEL_MAP(ELPA_ENUM_SUM) -1),
ELPA_2STAGE_NUMBER_OF_REAL_KERNELS = (0 ELPA_REAL_KERNEL_MAP(ELPA_ENUM_SUM) -1),
};
This diff is collapsed.
#define ELPA_C_SOLVER_1STAGE 1
#define ELPA_C_SOLVER_2STAGE 2
#define ELPA_C_NUMBER_OF_SOLVERS 2
#ifdef ELPA_H
#define ELPA_SOLVER_1STAGE ELPA_C_SOLVER_1STAGE
#define ELPA_SOLVER_2STAGE ELPA_C_SOLVER_2STAGE
#define ELPA_NUMBER_OF_SOLVERS ELPA_C_NUMBER_OF_SOLVERS
#endif
......@@ -28,7 +28,13 @@ elpa/elpa_generated_fortran_interfaces.h: $(wildcard $(top_srcdir)/src/elpa2/ker
$(call extract_interface,!f>)
$(call extract_interface,#!f>)
generated_headers= config-f90.h elpa/elpa_generated.h test/shared/generated.h elpa/elpa_generated_fortran_interfaces.h
src/fortran_constants.X90: $(top_srcdir)/src/fortran_constants.h
$(CPP) $(CPPFLAGS) -I$(top_builddir)/ -I$(top_srcdir)/ -I. $< -o $@_ || { rm -f $@; exit 1; }
awk '/!ELPA_C_DEFINE/ {gsub(/!ELPA_C_DEFINE/, "\n"); gsub(/NEWLINE/, "\n"); print;}' < $@_ > $@ || { rm -f $@; exit 1; }
rm $@_
generated_headers= config-f90.h elpa/elpa_generated.h test/shared/generated.h elpa/elpa_generated_fortran_interfaces.h src/fortran_constants.X90
generated-headers: $(generated_headers)
......
dnl macro for testing whether the user wanted to compile only with the GPU version
dnl usage: DEFINE_OPTION([gpu-support-only],[gpu-support],[with_gpu_support],[install_gpu])
AC_DEFUN([DEFINE_OPTION_GPU_SUPPORT_ONLY],[
AC_ARG_WITH([$1],
AS_HELP_STRING([--with-$1],
[only compile $2 ]),
[with_option=yes],[with_option=no])
if test x"${with_option}" = x"yes" ; then
dnl make sure that all the other kernels are unset
install_real_generic=no
install_real_generic_simple=no
install_real_sse=no
install_real_bgp=no
install_real_bgq=no
install_real_avx_block2=no
install_real_avx_block4=no
install_real_avx_block6=no
install_complex_generic=no
install_complex_generic_simple=no
install_complex_sse=no
install_complex_bgp=no
install_complex_bgq=no
install_complex_avx_block1=no
install_complex_avx_block2=no
install_gpu=yes
want_avx=no
build_with_gpu_support_only=yes
use_specific_complex_kernel=yes
use_specific_real_kernel=yes
dnl now set the specific kernel
$3=yes
AC_MSG_NOTICE([ELPA will be build only with $1])
else
build_with_gpu_support_only=no
fi
])
This diff is collapsed.
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_prog_cxx_mpi.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_PROG_CXX_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_CXX and will replace the
# standard variable CXX 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_CXX_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 2
AC_DEFUN([AX_PROG_CXX_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_CXX_MPI],[_AX_PROG_CXX_MPI([$1])])
AS_IF([test x"$_ax_prog_cxx_mpi_mpi_wanted" = xno],
[ _ax_prog_cxx_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_PROGRAM([
extern "C" { void MPI_Init(); }
],[MPI_Init();])],
[ _ax_prog_cxx_mpi_mpi_found=yes ],
[ _ax_prog_cxx_mpi_mpi_found=no ])
AC_MSG_RESULT($_ax_prog_cxx_mpi_mpi_found)
if test "x$_ax_prog_cxx_mpi_mpi_found" = "xyes"; then
break;
fi
LIBS=$save_LIBS
done
# Check for header
AS_IF([test x"$_ax_prog_cxx_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_cxx_mpi_mpi_found=no
])
])
AC_LANG_POP([C++])
])
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
AS_IF([test x"$_ax_prog_cxx_mpi_mpi_found" = xyes], [
ifelse([$2],,[AC_DEFINE(HAVE_MPI,1,[Define if you have the MPI library.])],[$2])
:
],[
$3
:
])
])dnl AX_PROG_CXX_MPI
dnl _AX_PROG_CXX_MPI is an internal macro required by AX_PROG_CXX_MPI.
dnl To ensure the right expansion order, the main function AX_PROG_CXX_MPI
dnl has to be split into two parts.
dnl
dnl Known MPI C++ compilers:
dnl mpic++
dnl mpicxx
dnl mpiCC
dnl sxmpic++ NEC SX
dnl hcp
dnl mpxlC_r
dnl mpxlC
dnl mpixlcxx_r
dnl mpixlcxx
dnl mpg++
dnl mpc++
dnl mpCC
dnl cmpic++
dnl mpiFCC Fujitsu
dnl CC
dnl
AC_DEFUN([_AX_PROG_CXX_MPI], [
ifelse([$1],,[_ax_prog_cxx_mpi_mpi_wanted=yes],[
AC_MSG_CHECKING([whether to compile using MPI])
if $1; then
_ax_prog_cxx_mpi_mpi_wanted=yes
else
_ax_prog_cxx_mpi_mpi_wanted=no
fi
AC_MSG_RESULT($_ax_prog_cxx_mpi_mpi_wanted)
])
if test x"$_ax_prog_cxx_mpi_mpi_wanted" = xyes; then
AC_CHECK_TOOLS([CXX], [mpic++ mpicxx mpiCC sxmpic++ hcp mpxlC_r mpxlC mpixlcxx_r mpixlcxx mpg++ mpc++ mpCC cmpic++ mpiFCC CCicpc pgCC pathCC sxc++ xlC_r xlC bgxlC_r bgxlC openCC sunCC crayCC g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC])
fi
AC_PROG_CXX
])dnl _AX_PROG_CXX_MPI
......@@ -89,7 +89,7 @@
! integer(kind=ik) :: istat
! character(200) :: errorMessage
type(elpa_t) :: elpaAPI
type(elpa_t) :: e
call timer%start("elpa_cholesky_&
&MATH_DATATYPE&
......@@ -99,15 +99,25 @@
success = .true.
if (elpa_init(20170403) /= ELPA_OK) then
if (elpa_init(20170403) /= ELPA_OK) then
print *, "ELPA API version not supported"
success = .false.
stop
return
endif
nev = 10
elpaAPI = elpa_create(na, nev, lda, matrixCols, nblk, successInternal)
e = elpa_allocate()
call e%set("na", na)
call e%set("local_nrows", lda)
call e%set("local_ncols", matrixCols)
call e%set("nblk", nblk)
call e%set("mpi_comm_rows", mpi_comm_rows)
call e%set("mpi_comm_cols", mpi_comm_cols)
call e%setup(successInternal)
if (successInternal .ne. ELPA_OK) then
print *, "Cannot create elpa object"
success = .false.
......@@ -115,10 +125,8 @@
return
endif
call elpaAPI%set_comm_rows(mpi_comm_rows)
call elpaAPI%set_comm_cols(mpi_comm_cols)
call elpaAPI%cholesky(a(1:lda,1:matrixCols), successInternal)
call e%cholesky(a(1:lda,1:matrixCols), successInternal)
if (successInternal .ne. ELPA_OK) then
print *, "Cannot run cholesky"
......@@ -128,7 +136,7 @@
else
success =.true.
endif
call elpaAPI%destroy()
call e%destroy()
call elpa_uninit()
......
......@@ -81,9 +81,9 @@
#endif
#endif
! integer(kind=ik) :: my_prow, my_pcol, np_rows, np_cols, mpierr
! integer(kind=ik) :: l_cols, l_rows, l_col1, l_row1, l_colx, l_rowx
! integer(kind=ik) :: n, nc, i, info, ns, nb
! integer(kind=ik) :: my_prow, my_pcol, np_rows, np_cols, mpierr
! integer(kind=ik) :: l_cols, l_rows, l_col1, l_row1, l_colx, l_rowx
! integer(kind=ik) :: n, nc, i, info, ns, nb
!#if REALCASE == 1
! real(kind=REAL_DATATYPE), allocatable :: tmp1(:), tmp2(:,:), tmat1(:,:), tmat2(:,:)
!#endif
......@@ -92,12 +92,12 @@
!#endif
logical, intent(in) :: wantDebug
logical :: success
! integer(kind=ik) :: istat
! character(200) :: errorMessage
! integer(kind=ik) :: istat
! character(200) :: errorMessage
integer(kind=ik) :: nev
integer(kind=iK) :: successInternal
type(elpa_t) :: elpaAPI
type(elpa_t) :: e
call timer%start("elpa_invert_trm_&
&MATH_DATATYPE&
......@@ -114,8 +114,18 @@
return
endif
nev = 10
elpaAPI = elpa_create(na, nev, lda, matrixCols, nblk, successInternal)
e = elpa_allocate()
call e%set("na", na)
call e%set("local_nrows", lda)
call e%set("local_ncols", matrixCols)
call e%set("nblk", nblk)
call e%set("mpi_comm_rows", mpi_comm_rows)
call e%set("mpi_comm_cols", mpi_comm_cols)
call e%setup(successInternal)
if (successInternal .ne. ELPA_OK) then
print *, "Cannot create elpa object"
success = .false.
......@@ -123,10 +133,8 @@
return
endif
call elpaAPI%set_comm_rows(mpi_comm_rows)
call elpaAPI%set_comm_cols(mpi_comm_cols)
call elpaAPI%invert_trm(a(1:lda,1:matrixCols), successInternal)
call e%invert_tridiagonal(a(1:lda,1:matrixCols), successInternal)
if (successInternal .ne. ELPA_OK) then
print *, "Cannot run invert_trm"
......@@ -136,7 +144,7 @@
else
success =.true.
endif
call elpaAPI%destroy()
call e%destroy()
call elpa_uninit()
......
......@@ -102,7 +102,7 @@
! character(200) :: errorMessage
logical :: success
integer(kind=ik) :: successInternal
type(elpa_t) :: elpaAPI
type(elpa_t) :: e
call timer%start("elpa_mult_at_b_&
&MATH_DATATYPE&
......@@ -127,19 +127,25 @@
return
endif
nev = 10
elpaAPI = elpa_create(na, nev, lda, ldaCols, nblk, successInternal)
e = elpa_allocate()
call e%set("na", na)
call e%set("local_nrows", lda)
call e%set("local_ncols", matrixCols)
call e%set("nblk", nblk)
call e%set("mpi_comm_rows", mpi_comm_rows)
call e%set("mpi_comm_cols", mpi_comm_cols)
call e%setup(successInternal)
if (successInternal .ne. ELPA_OK) then
print *, "Cannot create elpa object"
success = .false.
print *, "Cannot run multiply_a_b"
stop
success = .false.
return
endif
call elpaAPI%set_comm_rows(mpi_comm_rows)
call elpaAPI%set_comm_cols(mpi_comm_cols)
call elpaAPI%multiply_a_b(uplo_a, uplo_c, na, ncb, a(1:lda,1:ldaCols), lda, ldaCols, &
call e%hermitian_multiply(uplo_a, uplo_c, na, ncb, a(1:lda,1:ldaCols), lda, ldaCols, &
b(1:ldb,1:ldbCols), ldb, ldbCols, &
c(1:ldc,1:ldcCols), ldc, ldcCols, successInternal)
......@@ -149,7 +155,7 @@
success = .false.
return
endif
call elpaAPI%destroy()
call e%destroy()
call elpa_uninit()
......
......@@ -78,7 +78,7 @@ static __forceinline void hh_trafo_complex_kernel_4_SSE_1hv_double(double comple
static __forceinline void hh_trafo_complex_kernel_2_SSE_1hv_double(double complex* q, double complex* hh, int nb, int ldq);
/*
!f>#ifdef HAVE_SSE_INTRINSICS
!f>#ifdef WITH_COMPLEX_SSE_BLOCK1_KERNEL
!f> interface
!f> subroutine single_hh_trafo_complex_sse_1hv_double(q, hh, pnb, pnq, pldq) &
!f> bind(C, name="single_hh_trafo_complex_sse_1hv_double")
......
......@@ -49,17 +49,15 @@
!
! Author: Andreas Marek, MPCDF
#include "config-f90.h"
#include <elpa/elpa_kernel_constants.h>
module elpa2_utilities
!use elpa2_utilities_private
use elpa_constants
use elpa_utilities
use precision
implicit none
PRIVATE ! By default, all routines contained are private
private ! by default, all routines contained are private
! The following routines are public:
......@@ -94,26 +92,26 @@ module elpa2_utilities
public :: elpa_real_kernel_name, elpa_complex_kernel_name
integer(kind=ik), parameter :: number_of_real_kernels = ELPA_C_2STAGE_NUMBER_OF_REAL_KERNELS
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_GENERIC = ELPA_C_2STAGE_REAL_GENERIC
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_GENERIC_SIMPLE = ELPA_C_2STAGE_REAL_GENERIC_SIMPLE
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_BGP = ELPA_C_2STAGE_REAL_BGP
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_BGQ = ELPA_C_2STAGE_REAL_BGQ
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_SSE = ELPA_C_2STAGE_REAL_SSE
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_SSE_BLOCK2 = ELPA_C_2STAGE_REAL_SSE_BLOCK2
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_SSE_BLOCK4 = ELPA_C_2STAGE_REAL_SSE_BLOCK4
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_SSE_BLOCK6 = ELPA_C_2STAGE_REAL_SSE_BLOCK6
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX_BLOCK2 = ELPA_C_2STAGE_REAL_AVX_BLOCK2
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX_BLOCK4 = ELPA_C_2STAGE_REAL_AVX_BLOCK4
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX_BLOCK6 = ELPA_C_2STAGE_REAL_AVX_BLOCK6
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX2_BLOCK2 = ELPA_C_2STAGE_REAL_AVX2_BLOCK2
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX2_BLOCK4 = ELPA_C_2STAGE_REAL_AVX2_BLOCK4
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX2_BLOCK6 = ELPA_C_2STAGE_REAL_AVX2_BLOCK6
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX512_BLOCK2 = ELPA_C_2STAGE_REAL_AVX512_BLOCK2
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX512_BLOCK4 = ELPA_C_2STAGE_REAL_AVX512_BLOCK4
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX512_BLOCK6 = ELPA_C_2STAGE_REAL_AVX512_BLOCK6
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_GPU = ELPA_C_2STAGE_REAL_GPU
integer(kind=ik), parameter :: DEFAULT_REAL_ELPA_KERNEL = ELPA_C_2STAGE_REAL_DEFAULT
integer(kind=ik), parameter :: number_of_real_kernels = ELPA_2STAGE_NUMBER_OF_REAL_KERNELS
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_GENERIC = ELPA_2STAGE_REAL_GENERIC
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_GENERIC_SIMPLE = ELPA_2STAGE_REAL_GENERIC_SIMPLE
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_BGP = ELPA_2STAGE_REAL_BGP
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_BGQ = ELPA_2STAGE_REAL_BGQ
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_SSE = ELPA_2STAGE_REAL_SSE
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_SSE_BLOCK2 = ELPA_2STAGE_REAL_SSE_BLOCK2
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_SSE_BLOCK4 = ELPA_2STAGE_REAL_SSE_BLOCK4
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_SSE_BLOCK6 = ELPA_2STAGE_REAL_SSE_BLOCK6
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX_BLOCK2 = ELPA_2STAGE_REAL_AVX_BLOCK2
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX_BLOCK4 = ELPA_2STAGE_REAL_AVX_BLOCK4
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX_BLOCK6 = ELPA_2STAGE_REAL_AVX_BLOCK6
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX2_BLOCK2 = ELPA_2STAGE_REAL_AVX2_BLOCK2
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX2_BLOCK4 = ELPA_2STAGE_REAL_AVX2_BLOCK4
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX2_BLOCK6 = ELPA_2STAGE_REAL_AVX2_BLOCK6
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX512_BLOCK2 = ELPA_2STAGE_REAL_AVX512_BLOCK2
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX512_BLOCK4 = ELPA_2STAGE_REAL_AVX512_BLOCK4
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_AVX512_BLOCK6 = ELPA_2STAGE_REAL_AVX512_BLOCK6
integer(kind=ik), parameter :: REAL_ELPA_KERNEL_GPU = ELPA_2STAGE_REAL_GPU
integer(kind=ik), parameter :: DEFAULT_REAL_ELPA_KERNEL = ELPA_2STAGE_REAL_DEFAULT
character(35), parameter, dimension(number_of_real_kernels) :: &
REAL_ELPA_KERNEL_NAMES = (/"REAL_ELPA_KERNEL_GENERIC ", &
......@@ -135,22 +133,22 @@ module elpa2_utilities
"REAL_ELPA_KERNEL_AVX512_BLOCK6 ", &
"REAL_ELPA_KERNEL_GPU "/)
integer(kind=ik), parameter :: number_of_complex_kernels = ELPA_C_2STAGE_NUMBER_OF_COMPLEX_KERNELS
integer(kind=ik), parameter :: COMPLEX_ELPA_KERNEL_GENERIC = ELPA_C_2STAGE_COMPLEX_GENERIC