From cbaf4c30f24015a829dd36de388b80f3ee598ba2 Mon Sep 17 00:00:00 2001 From: Dominik 'Rathann' Mierzejewski Date: Mon, 12 Jun 2017 10:06:22 +0200 Subject: [PATCH] build against openblas on supported arches to match scalapack update URL and Source URL, switch to https factorize build process fix Fortran mods path (#1409235) don't run the testsuite on ARM 32bit (takes 6.5 hours) execstack is not available on some arches for EPEL (#1460531) --- elpa-blas.patch | 2 +- elpa-pc.patch | 2 +- elpa-simd.patch | 23 ++++----- elpa.spec | 124 +++++++++++++++++++++++++++++------------------- 4 files changed, 86 insertions(+), 65 deletions(-) diff --git a/elpa-blas.patch b/elpa-blas.patch index c089eba..a9a0c5d 100644 --- a/elpa-blas.patch +++ b/elpa-blas.patch @@ -6,7 +6,7 @@ diff -up mpich/configure.ac.atlas mpich/configure.ac dnl first check blas - AC_SEARCH_LIBS([dgemm],[blas],[have_blas=yes],[have_blas=no]) -+ AC_SEARCH_LIBS([dgemm],[satlas blas],[have_blas=yes],[have_blas=no]) ++ AC_SEARCH_LIBS([dgemm],[openblas satlas 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}]) diff --git a/elpa-pc.patch b/elpa-pc.patch index fc43c57..bd8599a 100644 --- a/elpa-pc.patch +++ b/elpa-pc.patch @@ -6,4 +6,4 @@ diff -up mpich/elpa.pc.in.r mpich/elpa.pc.in Libs: -L${libdir} -lelpa@SUFFIX@ @LIBS@ @OPENMP_FCFLAGS@ Cflags: -I${includedir}/elpa@SUFFIX@-@PACKAGE_VERSION@ @OPENMP_CFLAGS@ -fcflags= -I${includedir}/elpa@SUFFIX@-@PACKAGE_VERSION@/modules @OPENMP_FCFLAGS@ -+fcflags= -I${libdir}/gfortran/modules @OPENMP_FCFLAGS@ ++fcflags= -I@MPI_FORTRAN_MOD_DIR@ @OPENMP_FCFLAGS@ diff --git a/elpa-simd.patch b/elpa-simd.patch index 9467178..9f21424 100644 --- a/elpa-simd.patch +++ b/elpa-simd.patch @@ -1,19 +1,17 @@ -diff -up mpich/configure.ac.avx mpich/configure.ac ---- mpich/configure.ac.avx 2016-04-03 16:02:10.334634259 +0200 -+++ mpich/configure.ac 2016-04-03 16:03:45.419882924 +0200 -@@ -196,8 +196,12 @@ AC_MSG_RESULT([${can_compile_sse}]) +diff -up mpich/configure.ac.simd mpich/configure.ac +--- mpich/configure.ac.simd 2017-06-11 17:52:18.981738700 +0200 ++++ mpich/configure.ac 2017-06-11 17:55:02.104726066 +0200 +@@ -196,6 +196,10 @@ AC_MSG_RESULT([${can_compile_sse}]) dnl check whether one can compile with avx - gcc intrinsics +save_CFLAGS="$CFLAGS" +save_CXXFLAGS="$CXXFLAGS" ++CFLAGS="$CFLAGS -mavx" + dnl first pass: try with specified CFLAGS and CXXFLAGS AC_MSG_CHECKING([whether we can compile AVX intrinsics in C]) -+CFLAGS="$CFLAGS -mavx" AC_COMPILE_IFELSE([AC_LANG_SOURCE([ - #include - int main(int argc, char **argv){ @@ -211,6 +215,8 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ) AC_MSG_RESULT([${can_compile_avx}]) @@ -23,7 +21,7 @@ diff -up mpich/configure.ac.avx mpich/configure.ac AC_MSG_CHECKING([whether we can compile AVX intrinsics in C++]) AC_LANG_PUSH([C++]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ -@@ -228,10 +234,16 @@ if test "${can_compile_avx}" = "yes" ; t +@@ -228,9 +234,15 @@ if test "${can_compile_avx}" = "yes" ; t AC_MSG_RESULT([${can_compile_avx}]) if test "${can_compile_avx}" = "no" ; then AC_MSG_WARN([Cannot compile C++ with AVX: disabling AVX alltogether]) @@ -34,12 +32,11 @@ diff -up mpich/configure.ac.avx mpich/configure.ac +CFLAGS=$save_CFLAGS +CXXFLAGS=$save_CXXFLAGS ++CFLAGS="$CFLAGS -mavx2 -mfma" + AC_MSG_CHECKING([whether we can compile AVX2 intrinsics in C]) -+CFLAGS="$CFLAGS -mavx2 -mfma" AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include - int main(int argc, char **argv){ @@ -246,6 +258,8 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ) AC_MSG_RESULT([${can_compile_avx2}]) @@ -72,9 +69,9 @@ diff -up mpich/configure.ac.avx mpich/configure.ac rm -rf modules/ .fortran_dependencies/ mkdir modules -diff -up mpich/Makefile.am.avx mpich/Makefile.am ---- mpich/Makefile.am.avx 2015-11-22 20:05:49.000000000 +0100 -+++ mpich/Makefile.am 2016-04-03 16:02:10.336634243 +0200 +diff -up mpich/Makefile.am.simd mpich/Makefile.am +--- mpich/Makefile.am.simd 2015-11-22 20:05:49.000000000 +0100 ++++ mpich/Makefile.am 2017-06-11 17:52:18.983738737 +0200 @@ -8,6 +8,8 @@ AM_LDFLAGS = $(SCALAPACK_LDFLAGS) # libelpa lib_LTLIBRARIES = libelpa@SUFFIX@.la diff --git a/elpa.spec b/elpa.spec index 0f351e0..fe8c982 100644 --- a/elpa.spec +++ b/elpa.spec @@ -1,9 +1,27 @@ +%if 0%{?fedora} >= 26 +%ifnarch x86_64 %{ix86} armv7hl %{power64} aarch64 +# matches openblas/scalapack ExclusiveArch +%global with_atlas 1 +%endif +%else +%global with_atlas 1 +%endif + +%if 0%{?rhel} +# execstack (prelink) is built only for x86_64 and ppc64 on RHEL +%ifarch x86_64 ppc64 +%global with_execstack 1 +%endif +%else +%global with_execstack 1 +%endif + Summary: High-performance library for parallel solution of eigenvalue problems Name: elpa Version: 2015.11.001 -Release: 4%{?dist} -URL: http://elpa.mpcdf.mpg.de/software -Source0: http://elpa.mpcdf.mpg.de/elpa-%{version}.tar.gz +Release: 5%{?dist} +URL: https://elpa.mpcdf.mpg.de/software +Source0: https://elpa.mpcdf.mpg.de/html/Releases/%{version}/elpa-%{version}.tar.gz # fix pkgconfig file Patch1: elpa-pc.patch # build against atlas instead of reference blas @@ -11,10 +29,16 @@ Patch2: elpa-blas.patch # fix detection of AVX(2) compiler support and use them only in the library Patch3: elpa-simd.patch License: LGPLv3+ +%if %{with atlas} BuildRequires: atlas-devel +%else +BuildRequires: openblas-devel +%endif BuildRequires: gcc-gfortran BuildRequires: libtool +%if %{with execstack} BuildRequires: /usr/bin/execstack +%endif %description ELPA is a Fortran-based high-performance computational library for the @@ -125,69 +149,60 @@ mkdir _openmp cp -pr mpich openmpi _openmp/ %build -%global defopts --disable-silent-rules --disable-static -%global ldflags -L%{_libdir}/atlas -%global fcflags -ffree-line-length-none +%global defopts --disable-silent-rules --disable-static --docdir=%{_pkgdocdir} +%global ldflags %{__global_ldflags} +%if %{with atlas} +%global ldflags %{ldflags} -L%{_libdir}/atlas +%endif +%global fcflags %{optflags} -I%{_fmoddir} -ffree-line-length-none -%{_mpich_load} -export LDFLAGS="%{ldflags} -L$MPI_LIB" -export FCFLAGS="%{fcflags} -I$MPI_FORTRAN_MOD_DIR" -pushd mpich -%configure %{defopts} \ - --libdir=$MPI_LIB +. /etc/profile.d/modules.sh -make %{?_smp_mflags} V=1 -popd +for mpi in mpich openmpi ; do + module load mpi/${mpi}-%{_arch} + export CFLAGS="%{optflags}" + export LDFLAGS="%{ldflags} -L$MPI_LIB" + export FCFLAGS="%{fcflags} -I$MPI_FORTRAN_MOD_DIR" + for s in '' _openmp ; do + pushd ${s:-.}/${mpi} + sed -i -e "s,@MPI_FORTRAN_MOD_DIR@,$MPI_FORTRAN_MOD_DIR," elpa.pc.in + %configure %{defopts} \ + ${s:+--enable-openmp} \ + --libdir=$MPI_LIB -pushd _openmp/mpich -%configure %{defopts} \ - --enable-openmp \ - --libdir=$MPI_LIB - -make %{?_smp_mflags} V=1 -popd -%{_mpich_unload} - -%{_openmpi_load} -export LDFLAGS="%{ldflags} -L$MPI_LIB" -export FCFLAGS="%{fcflags} -I$MPI_FORTRAN_MOD_DIR" -pushd openmpi -%configure %{defopts} \ - --libdir=$MPI_LIB - -make %{?_smp_mflags} V=1 -popd - -pushd _openmp/openmpi -%configure %{defopts} \ - --enable-openmp \ - --libdir=$MPI_LIB - -make %{?_smp_mflags} V=1 -popd -%{_openmpi_unload} + make %{?_smp_mflags} V=1 + popd + done + module unload mpi/${mpi}-%{_arch} +done %install +. /etc/profile.d/modules.sh for s in '' _openmp ; do for mpi in mpich openmpi ; do + module load mpi/${mpi}-%{_arch} pushd ${s:-.}/${mpi} make DESTDIR=%{buildroot} install rm %{buildroot}%{_bindir}/elpa?_test_* - mkdir -p %{buildroot}%{_libdir}/${mpi}/bin - mv %{buildroot}%{_bindir}/elpa2_print_kernels${s} %{buildroot}%{_libdir}/${mpi}/bin/ + mkdir -p %{buildroot}$MPI_BIN + mv %{buildroot}%{_bindir}/elpa2_print_kernels${s} %{buildroot}$MPI_BIN +%if %{with execstack} execstack -c .libs/libelpa${s}.so.?.* %{buildroot}%{_libdir}/${mpi}/lib/libelpa${s}.so.?.* - mkdir -p %{buildroot}%{_fmoddir}/${mpi} +%endif + mkdir -p %{buildroot}$MPI_FORTRAN_MOD_DIR for f in $(ls -1 %{buildroot}%{_includedir}/elpa${s}-%{version}/modules/*.mod) ; do m=$(basename ${f} .mod) - mv %{buildroot}%{_includedir}/elpa${s}-%{version}/modules/${m}.mod %{buildroot}%{_fmoddir}/${mpi}/${m}${s}.mod + mv %{buildroot}%{_includedir}/elpa${s}-%{version}/modules/${m}.mod %{buildroot}$MPI_FORTRAN_MOD_DIR/${m}${s}.mod done + rmdir %{buildroot}%{_includedir}/elpa${s}-%{version}/modules rm %{buildroot}%{_libdir}/${mpi}/lib/libelpa${s}.la -# fix-up fcflags include path per mpi implementation - sed -i -e "/^fcflags.*modules/s,/modules,/modules/${mpi}," %{buildroot}%{_libdir}/${mpi}/lib/pkgconfig/elpa${s}-%{version}.pc popd + module unload mpi/${mpi}-%{_arch} done done +# testsuite takes 6.5 hours on ARMv7 +%ifnarch %{arm} %if 1 %check %{_mpich_load} @@ -206,6 +221,7 @@ make check V=1 || cat ./test-suite.log popd %{_openmpi_unload} %endif +%endif %post mpich -p /sbin/ldconfig @@ -237,7 +253,7 @@ popd %{_libdir}/mpich/lib/libelpa_openmp.so %{_libdir}/mpich/lib/pkgconfig/elpa-%{version}.pc %{_libdir}/mpich/lib/pkgconfig/elpa_openmp-%{version}.pc -%{_fmoddir}/mpich/*.mod +%{_fmoddir}/mpich*/*.mod # only non-mt openmpi build, see bug #1105902 %files openmpi @@ -251,10 +267,18 @@ popd %exclude %{_libdir}/openmpi/lib/libelpa_openmp.so %{_libdir}/openmpi/lib/pkgconfig/elpa-%{version}.pc %exclude %{_libdir}/openmpi/lib/pkgconfig/elpa_openmp-%{version}.pc -%{_fmoddir}/openmpi/*.mod -%exclude %{_fmoddir}/openmpi/*_openmp.mod +%{_fmoddir}/openmpi*/*.mod +%exclude %{_fmoddir}/openmpi*/*_openmp.mod %changelog +* Sun Jun 11 2017 Dominik Mierzejewski 2015.11.001-5 +- update URL and Source URL, switch to https +- factorize build process +- fix Fortran mods path (#1409235) +- build against openblas on supported arches to match scalapack +- don't run the testsuite on ARM 32bit (takes 6.5 hours) +- execstack is not available on some arches for EPEL (#1460531) + * Fri Feb 10 2017 Fedora Release Engineering - 2015.11.001-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild