Skip to content

Commit

Permalink
Allows serial/parallel HDF5 selection in MPI builds.
Browse files Browse the repository at this point in the history
  • Loading branch information
ye-luo committed Dec 6, 2019
1 parent efdfa85 commit 7c4cfad
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 25 deletions.
2 changes: 2 additions & 0 deletions CMake/FindMKL.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
# This needs a lot of work to make it robust
INCLUDE( CheckCXXSourceCompiles )

MESSAGE(STATUS "Looking for Intel MKL libraries")

# Extremely Basic Support of common mkl module environment variables
# or -DMKLROOT/-DMKL_HOME instead of preferred -DMKL_ROOT
# Some Linux distributions (Ubuntu >= 18.10) provide MKL
Expand Down
70 changes: 47 additions & 23 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -265,11 +265,9 @@ SET(INSTALL_NEXUS 1 CACHE BOOL "Install Nexus alongside QMCPACK")
#list of options to determine libraries. First, try to use libraries available
#FindXYZ.cmake will set the values if successful
######################################################################
SET(ENABLE_PHDF5 1 CACHE BOOL "Enable phdf5 for output")
SET(HAVE_LIBXML2 1)
SET(HAVE_LIBFFTW 0)
SET(HAVE_LIBXMLPP 0)
SET(HAVE_LIBHDF5 0)
SET(HAVE_LIBSPRNG 0)
SET(HAVE_LIBBLITZ 0)
SET(HAVE_LIBGSL 0)
Expand Down Expand Up @@ -495,7 +493,7 @@ ELSE(CMAKE_TOOLCHAIN_FILE)
# Search for Blas/Lapack
find_package(LAPACK)
IF("${LAPACK_LIBRARIES}" MATCHES "mkl")
MESSAGE(FATAL_ERROR "MKL found via LAPACK/BLAS. Please use -DENABLE_MKL=1 when invoking cmake for full Intel MKL utilization. -DMKL_ROOT may also be needed for the include files to be found.")
MESSAGE(FATAL_ERROR "MKL found via LAPACK/BLAS. Please pass -DENABLE_MKL=1 to cmake for full Intel MKL utilization. -DMKL_ROOT may also be needed for the include files to be found.")
ENDIF()
ENDIF()
IF(LAPACK_FOUND)
Expand Down Expand Up @@ -599,18 +597,58 @@ ELSE()
MESSAGE(FATAL_ERROR "Could not find required library Libxml2")
ENDIF(LIBXML2_FOUND)

set(HDF5_USE_STATIC_LIBRARIES off)
####################################################################
# set up HDF5 library
####################################################################
IF(HAVE_MPI)
SET(HDF5_PREFER_PARALLEL 1 CACHE BOOL "Request parallel/serial HDF5 library")
ELSE(HAVE_MPI)
SET(HDF5_PREFER_PARALLEL 0 CACHE BOOL "Request parallel/serial HDF5 library")
IF(HDF5_PREFER_PARALLEL)
MESSAGE(FATAL_ERROR "Parallel HDF5 library cannot be selected with QMCPACK non-MPI build. "
"Please set HDF5_PREFER_PARALLEL=0.")
ENDIF(HDF5_PREFER_PARALLEL)
ENDIF(HAVE_MPI)

if(QMC_BUILD_STATIC)
MESSAGE(STATUS "Linking static HDF5 library")
set(HDF5_USE_STATIC_LIBRARIES on)
else()
MESSAGE(STATUS "Linking dynamic HDF5 library")
set(HDF5_USE_STATIC_LIBRARIES off)
endif()

SET(HDF5_PREFER_PARALLEL 0)
IF(HAVE_MPI)
SET(HDF5_PREFER_PARALLEL 1)
ENDIF()
find_package(HDF5 COMPONENTS C)

IF(HDF5_FOUND)
SET(HAVE_LIBHDF5 1)

IF(HDF5_IS_PARALLEL)
MESSAGE(STATUS "Parallel HDF5 library found")
SET(ENABLE_PHDF5 1 CACHE BOOL "Enable code paths using parallel HDF5")
ELSE(HDF5_IS_PARALLEL)
MESSAGE(STATUS "Serial HDF5 library found")
SET(ENABLE_PHDF5 0 CACHE BOOL "Enable code paths using parallel HDF5")
IF(ENABLE_PHDF5)
IF(HAVE_MPI)
MESSAGE(FATAL_ERROR "Parallel HDF5 code paths requested but serial HDF5 library found! "
"Please either provide parallel HDF5 library or set ENABLE_PHDF5=0.")
ELSE(HAVE_MPI)
MESSAGE(FATAL_ERROR "Parallel HDF5 code paths cannot be enabled on non-MPI builds! Please set ENABLE_PHDF5=0.")
ENDIF(HAVE_MPI)
ENDIF(ENABLE_PHDF5)
ENDIF(HDF5_IS_PARALLEL)

IF(ENABLE_PHDF5)
MESSAGE(STATUS "Using HDF5 parallel collective I/O code paths")
ELSE(ENABLE_PHDF5)
MESSAGE(STATUS "Using HDF5 non-scalable serial I/O code paths")
ENDIF(ENABLE_PHDF5)

IF(HAVE_MPI AND NOT ENABLE_PHDF5)
MESSAGE(WARNING "MPI builds may have potential performance loss not using parallel HDF5!")
ENDIF()

INCLUDE_DIRECTORIES(${HDF5_INCLUDE_DIR})
IF ( CMAKE_BUILD_TYPE AND HDF5_LIBRARIES_DEBUG )
IF ( CMAKE_BUILD_TYPE MATCHES DEBUG )
Expand All @@ -620,22 +658,8 @@ IF(HDF5_FOUND)
ENDIF()
ENDIF()
SET(QMC_UTIL_LIBS ${QMC_UTIL_LIBS} ${HDF5_LIBRARIES})
IF(HDF5_IS_PARALLEL)
IF(ENABLE_PHDF5)
MESSAGE(STATUS "Using HDF5 parallel collective I/O")
ELSE(ENABLE_PHDF5)
MESSAGE(STATUS "Using HDF5 non-scalable serial I/O")
ENDIF(ENABLE_PHDF5)
ELSE(HDF5_IS_PARALLEL)
IF(ENABLE_PHDF5)
MESSAGE(STATUS "Using HDF5 non-scalable serial I/O due to the lack of library support for parallel")
SET(ENABLE_PHDF5 0)
ELSE(ENABLE_PHDF5)
MESSAGE(STATUS "Using HDF5 non-scalable serial I/O")
ENDIF(ENABLE_PHDF5)
ENDIF(HDF5_IS_PARALLEL)
ELSE(HDF5_FOUND)
MESSAGE(FATAL_ERROR "Require hdf5 1.6.4 or higher. Set HDF5_ROOT")
MESSAGE(FATAL_ERROR "Require HDF5 1.6.4 or higher. Set HDF5_ROOT")
ENDIF(HDF5_FOUND)

#make sure we can find boost if it's not in /usr
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ make -j 8

* HDF5 related
```
ENABLE_PHDF5 1(default)/0, enables/disable parallel collective IO.
HDF5_PREFER_PARALLEL 1(default for MPI build)/0, enables/disable parallel HDF5 library searching.
ENABLE_PHDF5 1(default for parallel HDF5 library)/0, enables/disable parallel collective I/O.
```

Expand Down
3 changes: 2 additions & 1 deletion manual/installation.tex
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,8 @@ \subsection{Configuration options}
\item HDF5 related
%
\begin{shade}
ENABLE_PHDF5 1(default)/0, enables/disable parallel collective IO.
HDF5_PREFER_PARALLEL 1(default for MPI build)/0, enables/disable parallel HDF5 library searching.
ENABLE_PHDF5 1(default for parallel HDF5 library)/0, enables/disable parallel collective I/O.
\end{shade}

\item FFTW related
Expand Down

0 comments on commit 7c4cfad

Please sign in to comment.