configure.ac 25.8 KB
Newer Older
1
AC_PREREQ([2.69])
2

3
AC_INIT([elpa],[2015.11.001], [elpa-library@mpcdf.mpg.de])
4
AC_SUBST([PACKAGE_VERSION])
5

6 7 8
AC_CONFIG_SRCDIR([src/elpa1.F90])

AM_INIT_AUTOMAKE([foreign -Wall subdir-objects])
9 10 11 12 13 14 15 16 17

# Without this, automake tries to be smart and rebuilt
# the autoconf generated files such as configure, aclocal.m4, etc.,
# in case the timestamps of files such as configure.ac are newer
#
# This only makes trouble for end users with out-of-date autoconf versions
# that cannot produce these files
AM_MAINTAINER_MODE([disable])

18 19 20 21
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
AM_SILENT_RULES([yes])

22 23
rm -rf config.h config-f90.h

24 25 26 27 28 29 30 31 32 33 34 35 36
# Set the libtool library version, see LIBRARY_INTERFACE
#
# See http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
#
# [c:r:a]
#
# c: The currently implement interface
# r: The revision number of the current interface, that is the number
#    of released source-code changes for the current interface
# a: The "age" is the number of interfaces prior to c that are also supported
#    by the current interface, as they are ABI compatible (e.g. only new symbols
#    were added by the new interface)
#
37
AC_SUBST([ELPA_SO_VERSION], [5:0:1])
38 39
#

40

41 42 43 44 45 46
AX_CHECK_GNU_MAKE()
if test x$_cv_gnu_make_command = x ; then
        AC_MSG_ERROR([Need GNU Make])
fi

AC_CHECK_PROG(CPP_FOUND,cpp,yes,no)
47
if test x"${CPP_FOUND}" = xno; then
48 49 50 51 52 53 54
  AC_MSG_ERROR([no cpp found])
fi

# gnu-make fortran module dependencies
m4_include([fdep/fortran_dependencies.m4])
FDEP_F90_GNU_MAKE_DEPS

55 56
###

57 58
m4_include([m4/ax_elpa_openmp.m4])

59 60
AC_MSG_CHECKING(whether --enable-openmp is specified)
AC_ARG_ENABLE([openmp],
61
		AS_HELP_STRING([--enable-openmp],
62 63 64 65 66 67 68 69 70
			       [use OpenMP threading, default no.]),
	      [],
	      [enable_openmp=no])
AC_MSG_RESULT([${enable_openmp}])
AM_CONDITIONAL([WITH_OPENMP],[test x"$enable_openmp" = x"yes"])
if test x"${enable_openmp}" = x"yes"; then
	AC_DEFINE([WITH_OPENMP], [1], [use OpenMP threading])
fi

71 72 73 74 75 76 77 78 79 80 81 82
AC_MSG_CHECKING(whether --enable-shared-memory-only is specified)
AC_ARG_ENABLE([shared-memory-only],
		AS_HELP_STRING([--enable-shared-memory-only],
			       [do not use MPI; ELPA will be build for one node shared-memory runs only]),
	      [],
	      [enable_shared_memory_only=no])
AC_MSG_RESULT([${enable_shared_memory_only}])
AM_CONDITIONAL([WITH_MPI],[test x"$enable_shared_memory_only" = x"no"])
if test x"${enable_shared_memory_only}" = x"no"; then
	AC_DEFINE([WITH_MPI], [1], [use MPI])
fi

Andreas Marek's avatar
Andreas Marek committed
83 84 85
dnl check whether mpi compilers are available;
dnl if not abort since it is mandatory

86

Andreas Marek's avatar
Andreas Marek committed
87 88
# C
AC_LANG([C])
89 90
AX_PROG_CC_MPI([test x"$enable_shared_memory_only" = xno],[use_mpi=yes],[use_mpi=no])

91
if test x"${enable_openmp}" = x"yes"; then
92 93 94 95 96
  AX_ELPA_OPENMP
  if test "$ac_cv_prog_cc_openmp" = unsupported; then
    AC_MSG_ERROR([Could not compile a C program with OpenMP, adjust CFLAGS])
  fi
  CFLAGS="$OPENMP_CFLAGS $CFLAGS"
97
fi
98

99
AC_PROG_INSTALL
100 101
AM_PROG_AR
AM_PROG_AS
Andreas Marek's avatar
Andreas Marek committed
102 103 104 105

# Fortran
AC_LANG([Fortran])
m4_include([m4/ax_prog_fc_mpi.m4])
106
AX_PROG_FC_MPI([test x"$enable_shared_memory_only" = xno],[use_mpi=yes],[use_mpi=no])
107
if test x"${enable_openmp}" = x"yes"; then
108 109 110 111 112
  AX_ELPA_OPENMP
  if test "$ac_cv_prog_fc_openmp" = unsupported; then
    AC_MSG_ERROR([Could not compile a Fortran program with OpenMP, adjust FCFLAGS])
  fi
  FCFLAGS="$OPENMP_FCFLAGS $FCFLAGS"
113 114
fi

Andreas Marek's avatar
Andreas Marek committed
115 116
# C++
AC_LANG([C++])
117
AC_PROG_CXX
118

119
if test x"${enable_openmp}" = x"yes"; then
120 121 122 123 124
  AX_ELPA_OPENMP
  if test "$ac_cv_prog_cxx_openmp" = unsupported; then
    AC_MSG_ERROR([Could not compile a C++ program with OpenMP, adjust CXXFLAGS])
  fi
  CXXFLAGS="$OPENMP_CXXFLAGS $CXXFLAGS"
125
fi
Andreas Marek's avatar
Andreas Marek committed
126 127 128



Andreas Marek's avatar
Andreas Marek committed
129 130
dnl variables needed for the tests

Andreas Marek's avatar
Andreas Marek committed
131 132 133 134 135 136 137 138
dnl do NOT remove any variables here, until
dnl 1. you know 100% what you are doing
dnl 2. you tested ALL configure functionality afterwards
dnl Otherwise, you most likely break some functionality

dnl as default always define the generic kernels to be build
dnl this is only unset if gpu_support_only is defined, or
dnl other specific real/complex kernels are wanted
Andreas Marek's avatar
Andreas Marek committed
139 140 141 142 143 144

install_real_generic=yes
install_real_generic_simple=yes

install_complex_generic=yes
install_complex_generic_simple=yes
145

Andreas Marek's avatar
Andreas Marek committed
146 147
AC_LANG([C])

148 149 150 151 152 153 154 155 156
dnl build with ftimings support
AC_MSG_CHECKING(whether ELPA should be build with ftimings support)
AC_ARG_WITH([ftimings],
		AS_HELP_STRING([--with-ftimings],
			       [detailed timings, default no.]),
	      [with_ftimings=yes],
	      [with_ftimings=no])
AC_MSG_RESULT([${with_ftimings}])

157 158 159 160 161 162 163 164 165 166 167 168 169 170
dnl build with the possibilty to redirect stdout and stderr
dnl per MPI task in a file
AC_MSG_CHECKING(whether stdout/stderr file redirect should be enabled)
AC_ARG_WITH([redirect],
		AS_HELP_STRING([--with-redirect],
			       [for test programs, allow redirection of stdout/stderr per MPI taks in a file (useful for ftimings), default no.]),
	      [with_redirect=yes],
	      [with_redirect=no])
AC_MSG_RESULT([${with_redirect}])

if test x"${with_redirect}" = x"yes"; then
  AC_DEFINE([HAVE_REDIRECT], [1], [Redirect stdout and stderr of test programs per MPI tasks to a file])
fi
AM_CONDITIONAL([HAVE_REDIRECT],[test x"$with_redirect" = x"yes"])
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192

if test x"${with_ftimings}" = x"yes"; then
  AC_DEFINE([HAVE_DETAILED_TIMINGS], [1], [Enable more timings])
  AC_ARG_ENABLE([papi],
	[AS_HELP_STRING([--disable-papi],[Do not use PAPI to also measure flop count, autodetected by default])],
	[want_papi=$enableval],[want_papi="auto"])
  papi_found=unknown
  if test x"$want_papi" != x"no" ; then
    AC_CHECK_LIB([papi],[PAPI_library_init],[papi_found="yes"],[papi_found="no"])
    if test x"$want_papi" = x"yes" ; then
      if test x"$papi_found" = x"no" ; then
        AC_MSG_ERROR(["Could not find usable PAPI installation, please adjust CFLAGS, LDFLAGS"])
      fi
    fi
  fi
  if test x"$papi_found" = x"yes"; then
    AC_DEFINE([HAVE_LIBPAPI], [1], [Use the PAPI library])
    LIBS="-lpapi $LIBS"
  fi
fi
AM_CONDITIONAL([HAVE_DETAILED_TIMINGS],[test x"$with_ftimings" = x"yes"])

Andreas Marek's avatar
Andreas Marek committed
193 194
AC_MSG_CHECKING(whether SSE assembler kernel can be compiled)

195 196
$CC -c $srcdir/src/elpa2_kernels/elpa2_kernels_asm_x86_64.s -o test.o 2>/dev/null
if test "$?" == 0; then
Andreas Marek's avatar
Andreas Marek committed
197 198
  can_compile_sse=yes
  install_real_sse=yes
199 200 201 202
  install_real_sse_block2=yes
  install_real_sse_block4=yes
  install_real_sse_block6=yes

Andreas Marek's avatar
Andreas Marek committed
203
  install_complex_sse=yes
204 205 206
  install_complex_sse_block1=yes
  install_complex_sse_block2=yes

207
else
Andreas Marek's avatar
Andreas Marek committed
208 209
  can_compile_sse=no
  install_real_sse=no
210 211 212 213
  install_real_sse_block2=no
  install_real_sse_block4=no
  install_real_sse_block6=no

Andreas Marek's avatar
Andreas Marek committed
214
  install_complex_sse=no
215 216
  install_complex_sse_block1=no
  install_complex_sse_block2=no
217
fi
218

219
rm -f ./test.o
Andreas Marek's avatar
Andreas Marek committed
220
AC_MSG_RESULT([${can_compile_sse}])
221

Andreas Marek's avatar
Andreas Marek committed
222
dnl check whether one can compile with avx - gcc intrinsics
223

224
dnl first pass: try with specified CFLAGS and CXXFLAGS
225
AC_MSG_CHECKING([whether we can compile AVX intrinsics in C])
226 227
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
 #include <x86intrin.h>
228
 int main(int argc, char **argv){
229 230
 double* q;
 __m256d a1_1 = _mm256_load_pd(q);
231
 return 0;
232 233 234 235 236
 }
 ])],
 [can_compile_avx=yes],
 [can_compile_avx=no]
)
Andreas Marek's avatar
Andreas Marek committed
237
AC_MSG_RESULT([${can_compile_avx}])
238

239 240 241
if test "${can_compile_avx}" = "yes" ; then
  AC_MSG_CHECKING([whether we can compile AVX intrinsics in C++])
  AC_LANG_PUSH([C++])
242 243
  AC_COMPILE_IFELSE([AC_LANG_SOURCE([
   #include <x86intrin.h>
244
   int main(int argc, char **argv){
245 246
   double* q;
   __m256d a1_1 = _mm256_load_pd(q);
247
   return 0;
248 249 250 251 252
   }
   ])],
   [can_compile_avx=yes],
   [can_compile_avx=no]
  )
253
  AC_LANG_POP([C++])
254
  AC_MSG_RESULT([${can_compile_avx}])
255 256
  if test "${can_compile_avx}" = "no" ; then
    AC_MSG_WARN([Cannot compile C++ with AVX: disabling AVX alltogether])
257 258 259
  fi
fi

260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
AC_MSG_CHECKING([whether we can compile AVX2 intrinsics in C])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
 #include <x86intrin.h>
 int main(int argc, char **argv){
 double* q;
 __m256d q1 = _mm256_load_pd(q);
 __m256d y1 = _mm256_fmadd_pd(q1, q1, q1);
 return 0;
 }
 ])],
 [can_compile_avx2=yes],
 [can_compile_avx2=no]
)
AC_MSG_RESULT([${can_compile_avx2}])
if test "${can_compile_avx2}" = "yes" ; then
  AC_MSG_CHECKING([whether we can compile AVX2 intrinsics in C++])
  AC_LANG_PUSH([C++])
  AC_COMPILE_IFELSE([AC_LANG_SOURCE([
   #include <x86intrin.h>
   int main(int argc, char **argv){
   double* q;
   __m256d q1 = _mm256_load_pd(q);
   __m256d y1 = _mm256_fmadd_pd(q1, q1, q1);
   return 0;
   }
   ])],
   [can_compile_avx2=yes],
   [can_compile_avx2=no]
  )
  AC_LANG_POP([C++])
  AC_MSG_RESULT([${can_compile_avx2}])
  if test "${can_compile_avx2}" = "no" ; then
    AC_MSG_WARN([Cannot compile C++ with AVX2!])
  fi
fi

296
if test "${can_compile_avx}" = "yes" ; then
Andreas Marek's avatar
Andreas Marek committed
297 298 299 300 301 302
  install_real_avx_block2=yes
  install_real_avx_block4=yes
  install_real_avx_block6=yes

  install_complex_avx_block1=yes
  install_complex_avx_block2=yes
Andreas Marek's avatar
Andreas Marek committed
303 304 305 306 307 308 309 310 311 312 313

  want_avx=yes
else
  install_real_avx_block2=no
  install_real_avx_block4=no
  install_real_avx_block6=no

  install_complex_avx_block1=no
  install_complex_avx_block2=no

  want_avx=yes
314 315
fi

316 317 318 319 320 321 322 323 324 325 326 327 328
AM_CONDITIONAL([HAVE_SSE],[test x"$can_compile_sse" = x"yes"])
if test x"${can_compile_sse}" = x"yes" ; then
  AC_DEFINE([HAVE_SSE],[1],[SSE is supported on this CPU])
fi
AM_CONDITIONAL([HAVE_AVX],[test x"$can_compile_avx" = x"yes"])
if test x"${can_compile_avx}" = x"yes" ; then
  AC_DEFINE([HAVE_AVX],[1],[AVX is supported on this CPU])
fi
AM_CONDITIONAL([HAVE_AVX2],[test x"$can_compile_avx2" = x"yes"])
if test x"${can_compile_avx2}" = x"yes" ; then
  AC_DEFINE([HAVE_AVX2],[1],[AVX2 is supported on this CPU])
fi

329 330 331 332 333 334 335
dnl set the AVX optimization flags if this option is specified
AC_MSG_CHECKING(whether AVX optimization flags should be set automatically)
AC_ARG_WITH([avx-optimization],
		AS_HELP_STRING([--with-avx-optimization],
			       [use AVX optimization, default no.]),
	      [with_avx_optimization=yes],
	      [with_avx_optimization=no])
Andreas Marek's avatar
Andreas Marek committed
336
AC_MSG_RESULT([${with_avx_optimization}])
337
if test x"${with_avx_optimization}" = x"yes"; then
Andreas Marek's avatar
Andreas Marek committed
338 339 340
 CFLAGS="$CFLAGS -funsafe-loop-optimizations -funsafe-math-optimizations -ftree-vect-loop-version -ftree-vectorize"
 CXXFLAGS="$CXXFLAGS -funsafe-loop-optimizations -funsafe-math-optimizations -ftree-vect-loop-version -ftree-vectorize"
fi
341

342
AC_LANG([Fortran])
343 344 345
AC_FC_FREEFORM
AC_FC_MODULE_FLAG
AC_FC_MODULE_OUTPUT_FLAG
346
AC_FC_LIBRARY_LDFLAGS
347 348 349 350

save_FCFLAGS=$FCFLAGS
save_LDFLAGS=$LDFLAGS

351 352 353
AC_ARG_VAR([SCALAPACK_LDFLAGS],[Extra LDFLAGS necessary to link a program with Scalapack])
AC_ARG_VAR([SCALAPACK_FCFLAGS],[Extra FCFLAGS necessary to compile a Fortran program with Scalapack])

354 355
FCFLAGS="$FCFLAGS $SCALAPACK_FCFLAGS"
LDFLAGS="$LDFLAGS $SCALAPACK_LDFLAGS"
356

357
dnl check whether fortran error_unit is defined
358
AC_MSG_CHECKING([whether Fortran module iso_fortran_env is available])
359
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
360 361 362 363 364 365 366 367 368 369
  program test_error_unit
    use ISO_FORTRAN_ENV, only : error_unit
    implicit none

    write(error_unit,*) "error_unit is defined"
  end program
])],
  [can_use_iso_fortran_env=yes],
  [can_use_iso_fortran_env=no]
)
370
AC_MSG_RESULT([${can_use_iso_fortran_env}])
371

372 373 374 375
dnl check whether one can link with specified MKL (desired method)
AC_MSG_CHECKING([whether we can compile a Fortran program using MKL])


376
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
377
  program test_mkl
378
    use mkl_service
379 380 381 382 383 384 385 386 387 388 389 390
    character*198 :: string
    call mkl_get_version_string(string)
    write(*,'(a)') string
  end program
])],
  [can_compile_with_mkl=yes],
  [can_compile_with_mkl=no]
)
AC_MSG_RESULT([${can_compile_with_mkl}])

if test x"$can_compile_with_mkl" = x"yes" ; then
  AC_MSG_CHECKING([whether we can link a Fortran program with MKL])
391
  AC_LINK_IFELSE([AC_LANG_SOURCE([
392
    program test_mkl
393
      use mkl_service
394 395 396 397 398
      character*198 :: string
      call mkl_get_version_string(string)
      write(*,'(a)') string
    end program
  ])],
Andreas Marek's avatar
Andreas Marek committed
399 400
    [have_mkl=yes],
    [have_mkl=no]
401
  )
Andreas Marek's avatar
Andreas Marek committed
402
  AC_MSG_RESULT([${have_mkl}])
403 404 405
fi

dnl if not mkl, check all the necessary individually
406
if test x"${have_mkl}" = x"yes" ; then
407 408 409 410
  WITH_MKL=1
else

  dnl first check blas
Andreas Marek's avatar
Andreas Marek committed
411 412 413
  AC_SEARCH_LIBS([dgemm],[blas],[have_blas=yes],[have_blas=no])
  AC_MSG_CHECKING([whether we can link a program with a blas lib])
  AC_MSG_RESULT([${have_blas}])
414

415
  if test x"${have_blas}" = x"no" ; then
Andreas Marek's avatar
Andreas Marek committed
416
    AC_MSG_ERROR([could not link with blas: specify path])
417
  fi
418
  dnl now lapack
Andreas Marek's avatar
Andreas Marek committed
419 420 421
  AC_SEARCH_LIBS([dlarrv],[lapack],[have_lapack=yes],[have_lapack=no])
  AC_MSG_CHECKING([whether we can link a program with a lapack lib])
  AC_MSG_RESULT([${have_lapack}])
422

423
  if test x"${have_lapack}" = x"no" ; then
424
    AC_MSG_ERROR([could not link with lapack: specify path])
425
  fi
Andreas Marek's avatar
Andreas Marek committed
426

427 428 429 430 431 432 433 434 435 436 437 438 439
  if test x"${enable_shared_memory_only}" = x"no"; then
    dnl test whether scalapack already contains blacs
    scalapack_libs="mpiscalapack scalapack"
    old_LIBS="$LIBS"
    for lib in ${scalapack_libs}; do
      LIBS="-l${lib} ${old_LIBS}"
      AC_MSG_CHECKING([whether -l${lib} already contains a BLACS implementation])
      AC_LINK_IFELSE([AC_LANG_FUNC_LINK_TRY([blacs_gridinit])],[blacs_in_scalapack=yes],[blacs_in_scalapack=no])
      AC_MSG_RESULT([${blacs_in_scalapack}])
      if test x"${blacs_in_scalapack}" = x"yes"; then
        break
      fi
    done
440

441 442
    if test x"${blacs_in_scalapack}" = x"no"; then
      LIBS="${old_LIBS}"
443

444 445 446
      dnl Test for stand-alone blacs
      AC_SEARCH_LIBS([bi_f77_init],[mpiblacsF77init],[],[],[-lmpiblacs])
      AC_SEARCH_LIBS([blacs_gridinit],[mpiblacs blacs],[have_blacs=yes],[have_blacs=no])
Andreas Marek's avatar
Andreas Marek committed
447

448 449 450
      if test x"${have_blacs}" = x"no"; then
        AC_MSG_ERROR([No usable BLACS found. If installed in a non-standard place, please specify suitable LDFLAGS and FCFLAGS as arguments to configure])
      fi
451
    fi
452

453
    AC_SEARCH_LIBS([pdtran],[$scalapack_libs],[have_scalapack=yes],[have_scalapack=no])
Andreas Marek's avatar
Andreas Marek committed
454

455 456 457
    if test x"${have_scalapack}" = x"no" ; then
      AC_MSG_ERROR([could not link with scalapack: specify path])
    fi
458 459 460 461
  fi

  dnl check whether we can link alltogehter
  AC_MSG_CHECKING([whether we can link a Fortran program with all blacs/scalapack])
462
  AC_LINK_IFELSE([AC_LANG_SOURCE([
463 464
    program dgemm_test

465 466
      integer , parameter:: M = 4, N = 3, K = 2
      real :: A(M,K), B(K,N), C(M,N)
467

468
      call dgemm('N','N',M,N,K,1.0,A,M,B,K,0.0,C,M)
469 470 471 472 473 474 475 476

     end program dgemm_test
     ])],
     [can_link_with_blacs_scalapack=yes],
     [can_link_with_blacs_scalapack=no]
   )
   AC_MSG_RESULT([${can_link_with_blacs_scalapack}])

477
   if test x"${can_link_with_blacs_scalapack}" = x"yes" ; then
478 479
     WITH_BLACS=1
   else
480
   AC_MSG_ERROR([We can neither link with MKL or another Scalpack. Please specify SCALAPACK_LDFLAGS and SCALAPACK_FCFLAGS!])
481 482 483
   fi
fi

484 485 486 487
dnl important: reset them again!
FCFLAGS=$save_FCFLAGS
LDFLAGS=$save_LDFLAGS

Andreas Marek's avatar
Andreas Marek committed
488 489 490 491
dnl check for intrinsic fortran function of 2003 standard
AC_MSG_CHECKING([whether we can use the intrinsic Fortran function "get_environment_variable"])


492
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
Andreas Marek's avatar
Andreas Marek committed
493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511
  program test_get_environment
    character(len=256) :: homedir
    call get_environment_variable("HOME",homedir)
  end program
])],
  [fortran_can_check_environment=yes],
  [fortran_can_check_environment=no]
)
AC_MSG_RESULT([${fortran_can_check_environment}])

dnl now check which kernels can be compiled

dnl the checks for SSE were already done before
dnl the checks for AVX were already done before

dnl check BGP kernel
AC_MSG_CHECKING([whether we can compile with BGP intrinsics])


512
AC_LINK_IFELSE([AC_LANG_SOURCE([
Andreas Marek's avatar
Andreas Marek committed
513 514 515
  program test_bgp
    complex*16 :: y3,q3,h2
    y3 = fxcpmadd(y3,q3,h2)
516

Andreas Marek's avatar
Andreas Marek committed
517 518 519 520 521 522 523
  end program
])],
  [can_compile_bgp=yes],
  [can_compile_bgp=no]
)
AC_MSG_RESULT([${can_compile_bgp}])

524
if test x"${can_compile_bgp}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
525 526
  install_real_bgp=yes
  install_complex_bgp=yes
Andreas Marek's avatar
Andreas Marek committed
527 528 529
else
  install_real_bgp=no
  install_complex_bgp=no
Andreas Marek's avatar
Andreas Marek committed
530 531 532 533 534
fi

dnl check BGQ kernel
AC_MSG_CHECKING([whether we can compile with BGQ intrinsics])

535
AC_LINK_IFELSE([AC_LANG_SOURCE([
Andreas Marek's avatar
Andreas Marek committed
536
  program test_bgq
Andreas Marek's avatar
Andreas Marek committed
537 538
    VECTOR(REAL(8))::QPX_h2
    real*8         :: hh(10,2)
Andreas Marek's avatar
Andreas Marek committed
539
    QPX_h2 = VEC_SPLATS(hh(2,2))
540

Andreas Marek's avatar
Andreas Marek committed
541 542 543 544 545 546 547
  end program
])],
  [can_compile_bgq=yes],
  [can_compile_bgq=no]
)
AC_MSG_RESULT([${can_compile_bgq}])

548
if test x"${can_compile_bgq}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
549 550
  install_real_bgq=yes
  install_complex_bgq=yes
Andreas Marek's avatar
Andreas Marek committed
551 552 553
else
  install_real_bgq=no
  install_complex_bgq=no
Andreas Marek's avatar
Andreas Marek committed
554 555 556 557
fi


dnl environment variable setting of kernel
558
if test x"${fortran_can_check_environment}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
559 560 561
 AC_DEFINE([HAVE_ENVIRONMENT_CHECKING],[1],[Fortran can querry environment variables])
fi

562 563
dnl last check whether user wants to compile only a specific kernel
dnl
Andreas Marek's avatar
Andreas Marek committed
564

565
m4_include([m4/ax_elpa_specific_kernels.m4])
Andreas Marek's avatar
Andreas Marek committed
566

567
dnl real kernels
Andreas Marek's avatar
Andreas Marek committed
568 569
  dnl do not remove this variable it is needed in the macros
  use_specific_real_kernel=no
Andreas Marek's avatar
Andreas Marek committed
570

571 572
  dnl generic kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-generic-kernel-only],[generic-kernel],[install_real_generic])
Andreas Marek's avatar
Andreas Marek committed
573

574 575
  dnl generic-simple kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-generic-simple-kernel-only],[generic-simple-kernel],[install_real_generic_simple])
Andreas Marek's avatar
Andreas Marek committed
576

577 578
  dnl sse kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-sse-kernel-only],[sse-kernel],[install_real_sse])
Andreas Marek's avatar
Andreas Marek committed
579

580 581
  dnl bgp kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-bgp-kernel-only],[bgp-kernel],[install_real_bgp])
Andreas Marek's avatar
Andreas Marek committed
582

583 584
  dnl bgq kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-bgq-kernel-only],[bgq-kernel],[install_real_bgq])
Andreas Marek's avatar
Andreas Marek committed
585

586 587 588 589 590 591 592 593 594
  dnl real-sse-block2 kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-sse-block2-kernel-only],[real-sse-block2-kernel],[install_real_sse_block2])

  dnl real-sse-block4 kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-sse-block4-kernel]-only,[real-sse-block4-kernel],[install_real_sse_block4])

  dnl real-sse-block6 kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-sse-block6-kernel-only],[real-sse-block6-kernel],[install_real_sse_block6])

595 596
  dnl real-avx-block2 kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-avx-block2-kernel-only],[real-avx-block2-kernel],[install_real_avx_block2])
Andreas Marek's avatar
Andreas Marek committed
597

598 599
  dnl real-avx-block4 kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-avx-block4-kernel]-only,[real-avx-block4-kernel],[install_real_avx_block4])
600

601 602
  dnl real-avx-block6 kernel
  DEFINE_OPTION_SPECIFIC_REAL_KERNEL([real-avx-block6-kernel-only],[real-avx-block6-kernel],[install_real_avx_block6])
603

Andreas Marek's avatar
Andreas Marek committed
604 605 606 607 608 609

dnl complex kernels

  dnl do not remove this variable it is needed in the macros
  use_specific_complex_kernel=no

610 611
  dnl generic kernel
  DEFINE_OPTION_SPECIFIC_COMPLEX_KERNEL([complex-generic-kernel-only],[generic-kernel],[install_complex_generic])
612

613 614
  dnl generic-simple kernel
  DEFINE_OPTION_SPECIFIC_COMPLEX_KERNEL([complex-generic-simple-kernel-only],[generic-simple-kernel],[install_complex_generic_simple])
Andreas Marek's avatar
Andreas Marek committed
615

616 617
  dnl sse kernel
  DEFINE_OPTION_SPECIFIC_COMPLEX_KERNEL([complex-sse-kernel-only],[sse-kernel],[install_complex_sse])
Andreas Marek's avatar
Andreas Marek committed
618

619 620
  dnl complex-bqp kernel
  DEFINE_OPTION_SPECIFIC_COMPLEX_KERNEL([complex-bgp-kernel-only],[bgp-kernel],[install_complex_bgp])
Andreas Marek's avatar
Andreas Marek committed
621

622 623
  dnl complex-bqq kernel
  DEFINE_OPTION_SPECIFIC_COMPLEX_KERNEL([complex-bgq-kernel-only],[bgq-kernel],[install_complex_bgq])
Andreas Marek's avatar
Andreas Marek committed
624

625 626 627 628 629 630
  dnl complex-sse-block1 kernel
  DEFINE_OPTION_SPECIFIC_COMPLEX_KERNEL([complex-sse-block1-kernel-only],[complex-sse-block1-kernel],[install_complex_sse_block1])

  dnl complex-avx-block2 kernel
  DEFINE_OPTION_SPECIFIC_COMPLEX_KERNEL([complex-sse-block2-kernel-only],[complex-sse-block2-kernel],[install_complex_sse_block2])

631 632
  dnl complex-avx-block1 kernel
  DEFINE_OPTION_SPECIFIC_COMPLEX_KERNEL([complex-avx-block1-kernel-only],[complex-avx-block1-kernel],[install_complex_avx_block1])
Andreas Marek's avatar
Andreas Marek committed
633

634 635
  dnl complex-avx-block2 kernel
  DEFINE_OPTION_SPECIFIC_COMPLEX_KERNEL([complex-avx-block2-kernel-only],[complex-avx-block2-kernel],[install_complex_avx_block2])
Andreas Marek's avatar
Andreas Marek committed
636

637
dnl set the conditionals according to the previous tests
638
if test x"${can_use_iso_fortran_env}" = x"yes" ; then
639 640 641
 AC_DEFINE([HAVE_ISO_FORTRAN_ENV],[1],[can use module iso_fortran_env])
fi

Andreas Marek's avatar
Andreas Marek committed
642
AM_CONDITIONAL([WITH_REAL_GENERIC_KERNEL],[test x"$install_real_generic" = x"yes"])
643
if test x"${install_real_generic}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
644 645 646 647
 AC_DEFINE([WITH_REAL_GENERIC_KERNEL],[1],[can use real generic kernel])
fi

AM_CONDITIONAL([WITH_COMPLEX_GENERIC_KERNEL],[test x"$install_complex_generic" = x"yes"])
648
if test x"${install_complex_generic}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
649 650 651 652
 AC_DEFINE([WITH_COMPLEX_GENERIC_KERNEL],[1],[can use complex generic kernel])
fi

AM_CONDITIONAL([WITH_REAL_GENERIC_SIMPLE_KERNEL],[test x"$install_real_generic_simple" = x"yes"])
653
if test x"${install_real_generic_simple}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
654 655 656 657
 AC_DEFINE([WITH_REAL_GENERIC_SIMPLE_KERNEL],[1],[can use real generic-simple kernel])
fi

AM_CONDITIONAL([WITH_COMPLEX_GENERIC_SIMPLE_KERNEL],[test x"$install_complex_generic_simple" = x"yes"])
658
if test x"${install_complex_generic_simple}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
659 660 661 662
 AC_DEFINE([WITH_COMPLEX_GENERIC_SIMPLE_KERNEL],[1],[can use complex generic-simple kernel])
fi

AM_CONDITIONAL([WITH_REAL_SSE_KERNEL],[test x"$install_real_sse" = x"yes"])
663
if test x"${install_real_sse}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
664 665 666 667
 AC_DEFINE([WITH_REAL_SSE_KERNEL],[1],[can use real SSE kernel])
fi

AM_CONDITIONAL([WITH_COMPLEX_SSE_KERNEL],[test x"$install_complex_sse" = x"yes"])
668
if test x"${install_complex_sse}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
669 670 671
 AC_DEFINE([WITH_COMPLEX_SSE_KERNEL],[1],[can use complex SSE kernel])
fi

672 673 674 675 676 677 678 679 680 681 682 683 684 685 686
AM_CONDITIONAL([WITH_REAL_SSE_BLOCK2_KERNEL],[test x"$install_real_sse_block2" = x"yes"])
if test x"${install_real_sse_block2}" = x"yes" ; then
 AC_DEFINE([WITH_REAL_SSE_BLOCK2_KERNEL],[1],[can use real_sse_block2 kernel])
fi

AM_CONDITIONAL([WITH_REAL_SSE_BLOCK4_KERNEL],[test x"$install_real_sse_block4" = x"yes"])
if test x"${install_real_sse_block4}" = x"yes" ; then
 AC_DEFINE([WITH_REAL_SSE_BLOCK4_KERNEL],[1],[can use real_sse_block4 kernel])
fi

AM_CONDITIONAL([WITH_REAL_SSE_BLOCK6_KERNEL],[test x"$install_real_sse_block6" = x"yes"])
if test x"${install_real_sse_block6}" = x"yes" ; then
 AC_DEFINE([WITH_REAL_SSE_BLOCK6_KERNEL],[1],[can use real_sse_block6 kernel])
fi

Andreas Marek's avatar
Andreas Marek committed
687
AM_CONDITIONAL([WITH_REAL_AVX_BLOCK2_KERNEL],[test x"$install_real_avx_block2" = x"yes"])
688
if test x"${install_real_avx_block2}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
689 690 691 692
 AC_DEFINE([WITH_REAL_AVX_BLOCK2_KERNEL],[1],[can use real_avx_block2 kernel])
fi

AM_CONDITIONAL([WITH_REAL_AVX_BLOCK4_KERNEL],[test x"$install_real_avx_block4" = x"yes"])
693
if test x"${install_real_avx_block4}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
694 695 696 697
 AC_DEFINE([WITH_REAL_AVX_BLOCK4_KERNEL],[1],[can use real_avx_block4 kernel])
fi

AM_CONDITIONAL([WITH_REAL_AVX_BLOCK6_KERNEL],[test x"$install_real_avx_block6" = x"yes"])
698
if test x"${install_real_avx_block6}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
699 700 701
 AC_DEFINE([WITH_REAL_AVX_BLOCK6_KERNEL],[1],[can use real_avx_block6 kernel])
fi

702 703 704 705 706 707 708 709 710 711
AM_CONDITIONAL([WITH_COMPLEX_SSE_BLOCK1_KERNEL],[test x"$install_complex_sse_block1" = x"yes"])
if test x"${install_complex_sse_block1}" = x"yes" ; then
 AC_DEFINE([WITH_COMPLEX_SSE_BLOCK1_KERNEL],[1],[can use complex_sse_block1 kernel])
fi

AM_CONDITIONAL([WITH_COMPLEX_SSE_BLOCK2_KERNEL],[test x"$install_complex_sse_block2" = x"yes"])
if test x"${install_complex_sse_block2}" = x"yes" ; then
 AC_DEFINE([WITH_COMPLEX_SSE_BLOCK2_KERNEL],[1],[can use complex_sse_block2 kernel])
fi

Andreas Marek's avatar
Andreas Marek committed
712
AM_CONDITIONAL([WITH_COMPLEX_AVX_BLOCK1_KERNEL],[test x"$install_complex_avx_block1" = x"yes"])
713
if test x"${install_complex_avx_block1}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
714 715 716 717
 AC_DEFINE([WITH_COMPLEX_AVX_BLOCK1_KERNEL],[1],[can use complex_avx_block1 kernel])
fi

AM_CONDITIONAL([WITH_COMPLEX_AVX_BLOCK2_KERNEL],[test x"$install_complex_avx_block2" = x"yes"])
718
if test x"${install_complex_avx_block2}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
719 720 721 722
 AC_DEFINE([WITH_COMPLEX_AVX_BLOCK2_KERNEL],[1],[can use complex_avx_block2 kernel])
fi

AM_CONDITIONAL([WITH_REAL_BGP_KERNEL],[test x"$install_real_bgp" = x"yes"])
723
if test x"${install_real_bgp}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
724 725 726 727
 AC_DEFINE([WITH_REAL_BGP_KERNEL],[1],[can use real BGP kernel])
fi

AM_CONDITIONAL([WITH_REAL_BGQ_KERNEL],[test x"$install_real_bgq" = x"yes"])
728
if test x"${install_real_bgq}" = x"yes" ; then
Andreas Marek's avatar
Andreas Marek committed
729 730 731
 AC_DEFINE([WITH_REAL_BGQ_KERNEL],[1],[can use real BGQ kernel])
fi

732 733
if test x"${use_specific_complex_kernel}" = x"no" ; then
 AC_DEFINE([WITH_NO_SPECIFIC_COMPLEX_KERNEL],[1],[do not use only one specific complex kernel (set at compile time)])
Andreas Marek's avatar
Andreas Marek committed
734 735
fi

736
if test x"${use_specific_real_kernel}" = x"no" ; then
737
  AC_DEFINE([WITH_NO_SPECIFIC_REAL_KERNEL],[1],[do not use only one specific real kernel (set at compile time)])
Andreas Marek's avatar
Andreas Marek committed
738 739
fi

740 741
LT_INIT

742 743 744 745 746 747
DX_PDF_FEATURE(OFF)
DX_PS_FEATURE(OFF)
DX_MAN_FEATURE(ON)
DX_HTML_FEATURE(ON)
DX_INIT_DOXYGEN([ELPA], [Doxyfile], [docs])

748
DESPERATELY_WANT_ASSUMED_SIZE=0
749
if test x"${DESPERATELY_WANT_ASSUMED_SIZE}" = x"yes" ; then
750 751 752
  AC_DEFINE([DESPERATELY_WANT_ASSUMED_SIZE],[1],[use assumed size arrays, even if not debuggable])
fi

753 754 755 756 757
AC_SUBST([WITH_MKL])
AC_SUBST([WITH_BLACS])
AC_SUBST([with_amd_bulldozer_kernel])
AC_SUBST([FC_MODINC])
AC_SUBST([FC_MODOUT])
758 759 760
AC_SUBST([OPENMP_CFLAGS])
AC_SUBST([OPENMP_FCFLAGS])
AC_SUBST([OPENMP_LDFLAGS])
761
#AC_SUBST(OPT_FCFLAGS)
762
AC_SUBST([DOXYGEN_OUTPUT_DIR], [docs])
763

764
rm -rf modules/ .fortran_dependencies/
765 766 767 768 769 770 771 772 773 774 775
mkdir modules

#gl_VISIBILITY
#AH_BOTTOM([#if HAVE_VISIBILITY
#define EXPORTED __attribute__((__visibility__("default")))
#define HIDDEN   __attribute__((__visibility__("hidden")))
#else
#define EXPORTED
#define HIDDEN
#endif])

776 777 778 779 780 781 782 783 784

# Some part of libtool is too smart and tries to parse the output of
#   gfortran -v
# and catches anything that resembles a -l library link specification.
# Unfortunately, recent versions of gfortran emit
#   -l gfortran
# with a space between -l and gfortran. The empty -l is then included
# into "postdeps_FC" and causes linking errors later on.
postdeps_FC=$(echo $postdeps_FC | sed 's/-l //g')
785

786
if test x"${enable_openmp}" = x"yes"; then
787
	SUFFIX="_openmp"
788
else
789
	SUFFIX=""
790
fi
791 792
AC_SUBST([SUFFIX])
AC_SUBST([PKG_CONFIG_FILE],[elpa${SUFFIX}-${PACKAGE_VERSION}.pc])
793

794 795
AC_CONFIG_FILES([
  Makefile
796
  Doxyfile
797
  ${PKG_CONFIG_FILE}:elpa.pc.in
798
])
799

800
AC_OUTPUT
801 802 803 804 805 806


if test -e config.h ; then
  grep "^#define" config.h > config-f90.h
else
  echo "Warning! No config.h was generated, check for errors and re-run configure!"
Andreas Marek's avatar
Andreas Marek committed
807
  exit 1
808
fi
Andreas Marek's avatar
Andreas Marek committed
809 810 811

echo "Generating elpa/elpa_generated.h..."
mkdir -p elpa
812 813 814 815 816
grep -h "^ *!c>" $srcdir/src/elpa_c_interface.F90 | sed 's/^ *!c>//;' > elpa/elpa_generated.h || exit 1

echo "Generating test/shared_sources/generated.h..."
mkdir -p test/shared_sources
grep -h "^ *!c>" $srcdir/test/shared_sources/*.F90 | sed 's/^ *!c>//;' > test/shared_sources/generated.h || exit 1
Andreas Marek's avatar
Andreas Marek committed
817

818
if test "${can_compile_avx}" = "no" ; then
Andreas Marek's avatar
Andreas Marek committed
819 820 821
  if test x"${want_avx}" = x"yes" ; then
    AC_MSG_WARN([Could not compile AVX instructions])
  fi
822
fi
823 824 825 826 827
if test "${can_compile_avx2}" = "no" ; then
  if test x"${want_avx}" = x"yes" ; then
    AC_MSG_WARN([Could not compile AVX2 instructions])
  fi
fi
828