mirror of https://github.com/QMCPACK/qmcpack.git
397 lines
14 KiB
Bash
Executable File
397 lines
14 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -x
|
|
HOST_NAME=$(hostname -s)
|
|
|
|
case "$1" in
|
|
|
|
# Configure qmcpack using cmake out-of-source builds
|
|
configure)
|
|
|
|
if [[ "$HOST_NAME" =~ (sulfur) || "$HOST_NAME" =~ (nitrogen) ]]
|
|
then
|
|
echo "Use recent cmake v3.21.3"
|
|
export PATH=/opt/cmake-3.21.3-linux-x86_64/bin:$PATH
|
|
# Make current environment variables available to subsequent steps,
|
|
# e.g. ctest
|
|
echo "PATH=$PATH" >> $GITHUB_ENV
|
|
fi
|
|
|
|
if [ -d ${GITHUB_WORKSPACE}/../qmcpack-build ]
|
|
then
|
|
echo "Found existing out-of-source build directory ${GITHUB_WORKSPACE}/../qmcpack-build, removing"
|
|
rm -fr ${GITHUB_WORKSPACE}/../qmcpack-build
|
|
fi
|
|
|
|
echo "Creating new out-of-source build directory ${GITHUB_WORKSPACE}/../qmcpack-build"
|
|
cd ${GITHUB_WORKSPACE}/..
|
|
mkdir qmcpack-build
|
|
cd qmcpack-build
|
|
|
|
# MPI or not configuration
|
|
if [[ "${GH_JOBNAME}" =~ (-NoMPI) ]] ; then
|
|
echo 'Configure for build without MPI'
|
|
CMAKE_OPTIONS="-DQMC_MPI=OFF"
|
|
else
|
|
echo 'Configure for MPI build'
|
|
CMAKE_OPTIONS="-DQMC_MPI=ON"
|
|
fi
|
|
|
|
# OpenMP or not configuration
|
|
if [[ "${GH_JOBNAME}" =~ (-NoOMP) ]] ; then
|
|
echo 'Configure for build without OpenMP'
|
|
CMAKE_OPTIONS="$CMAKE_OPTIONS -DQMC_OMP=OFF"
|
|
else
|
|
echo 'Configure for OpenMP build'
|
|
CMAKE_OPTIONS="$CMAKE_OPTIONS -DQMC_OMP=ON"
|
|
fi
|
|
|
|
# build type configuration
|
|
if [[ "${GH_JOBNAME}" =~ (-Debug) ]] ; then
|
|
echo 'Configure for Debug build'
|
|
CMAKE_OPTIONS="$CMAKE_OPTIONS -DCMAKE_BUILD_TYPE=Debug"
|
|
else
|
|
echo 'Configure for RelWithDebInfo build'
|
|
CMAKE_OPTIONS="$CMAKE_OPTIONS -DCMAKE_BUILD_TYPE=RelWithDebInfo"
|
|
fi
|
|
|
|
# Real or Complex configuration
|
|
case "${GH_JOBNAME}" in
|
|
*"Real"*)
|
|
echo 'Configure for real build -DQMC_COMPLEX=OFF'
|
|
CMAKE_OPTIONS="$CMAKE_OPTIONS -DQMC_COMPLEX=OFF"
|
|
;;
|
|
*"Complex"*)
|
|
echo 'Configure for complex build -DQMC_COMPLEX=ON'
|
|
CMAKE_OPTIONS="$CMAKE_OPTIONS -DQMC_COMPLEX=ON"
|
|
;;
|
|
esac
|
|
|
|
if [[ "${GH_JOBNAME}" =~ (-CUDA) ]]
|
|
then
|
|
if [[ "${GH_JOBNAME}" =~ (-Offload) ]]
|
|
then
|
|
echo "Set PATH to cuda-11.2 to be associated with the C and C++ compilers"
|
|
export PATH=/usr/local/cuda-11.2/bin:$PATH
|
|
echo "Set CUDACXX CMake environment variable to nvcc cuda 11.2 location due to a regression bug in 11.6"
|
|
export CUDACXX=/usr/local/cuda-11.2/bin/nvcc
|
|
|
|
# Make current environment variables available to subsequent steps
|
|
echo "PATH=$PATH" >> $GITHUB_ENV
|
|
echo "CUDACXX=/usr/local/cuda-11.2/bin/nvcc" >> $GITHUB_ENV
|
|
|
|
else
|
|
echo "Set CUDACXX CMake environment variable to nvcc 11.8"
|
|
export CUDACXX=/usr/local/cuda-11.8/bin/nvcc
|
|
|
|
# Make current environment variables available to subsequent steps
|
|
echo "CUDACXX=/usr/local/cuda-11.8/bin/nvcc" >> $GITHUB_ENV
|
|
fi
|
|
fi
|
|
|
|
# Sanitizer
|
|
case "${GH_JOBNAME}" in
|
|
*"ASan"*)
|
|
echo 'Configure for address sanitizer including leak sanitizer (lsan) -DENABLE_SANITIZER=asan'
|
|
IS_SANITIZER=asan
|
|
;;
|
|
*"UBSan"*)
|
|
echo 'Configure for undefined behavior sanitizer -DENABLE_SANITIZER=ubsan'
|
|
IS_SANITIZER=ubsan
|
|
;;
|
|
*"TSan"*)
|
|
echo 'Configure for thread sanitizer -DENABLE_SANITIZER=tsan'
|
|
IS_SANITIZER=tsan
|
|
;;
|
|
esac
|
|
|
|
# Mixed or Non-Mixed (default, full) precision
|
|
if [[ "${GH_JOBNAME}" =~ (-Mixed) ]] ; then
|
|
echo 'Configure for mixed precision build -DQMC_MIXED_PRECISION=ON'
|
|
CMAKE_OPTIONS="$CMAKE_OPTIONS -DQMC_MIXED_PRECISION=ON"
|
|
else
|
|
CMAKE_OPTIONS="$CMAKE_OPTIONS -DQMC_MIXED_PRECISION=OFF"
|
|
fi
|
|
|
|
if [[ "$CONTAINER_OS" =~ (centos) ]]
|
|
then
|
|
# use spack
|
|
export PATH=/opt/rh/gcc-toolset-11/root/bin/:/opt/view:/opt/view/bin:$PATH
|
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`which gcc|sed 's/bin\/gcc/lib64/g'`
|
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/view/lib
|
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/view/include
|
|
export FFTW_HOME=/opt/view
|
|
export LibXml2_ROOT=/opt/view
|
|
export HDF5_ROOT=/opt/view
|
|
export BOOST_ROOT=/opt/view
|
|
|
|
|
|
# Make current environment variables available to subsequent steps
|
|
echo "PATH=/opt/rh/gcc-toolset-11/root/bin/:/opt/view:/opt/view/bin:$PATH" >> $GITHUB_ENV
|
|
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`which gcc|sed 's/bin\/gcc/lib64/g'`" >> $GITHUB_ENV
|
|
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/view/lib" >> $GITHUB_ENV
|
|
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/view/include" >> $GITHUB_ENV
|
|
echo "FFTW_HOME=/opt/view" >> $GITHUB_ENV
|
|
echo "LibXml2_ROOT=/opt/view" >> $GITHUB_ENV
|
|
echo "HDF5_ROOT=/opt/view" >> $GITHUB_ENV
|
|
echo "BOOST_ROOT=/opt/view" >> $GITHUB_ENV
|
|
fi
|
|
|
|
case "${GH_JOBNAME}" in
|
|
*"macOS-GCC14"*"-Real"*)
|
|
echo 'Configure for building on macOS using gcc14'
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DCMAKE_C_COMPILER=gcc-14 \
|
|
-DCMAKE_CXX_COMPILER=g++-14 \
|
|
-DCMAKE_EXE_LINKER_FLAGS="-Wl,-ld_classic" \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
*"GCC9"*"-CUDA-AFQMC"*)
|
|
echo 'Configure for building with CUDA and AFQMC, need built-from-source OpenBLAS due to bug in rpm'
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DCMAKE_C_COMPILER=/usr/lib64/openmpi/bin/mpicc \
|
|
-DCMAKE_CXX_COMPILER=/usr/lib64/openmpi/bin/mpicxx \
|
|
-DMPIEXEC_EXECUTABLE=/usr/lib64/openmpi/bin/mpirun \
|
|
-DBUILD_AFQMC=ON \
|
|
-DQMC_GPU=cuda \
|
|
-DQMC_GPU_ARCHS=sm_70 \
|
|
-DCMAKE_PREFIX_PATH="/opt/OpenBLAS/0.3.18" \
|
|
-DQMC_DATA=$QMC_DATA_DIR \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
*"GCC9"*"-MKL-"*)
|
|
echo 'Configure for building with GCC and Intel MKL'
|
|
|
|
source /opt/intel2020/mkl/bin/mklvars.sh intel64
|
|
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DBLA_VENDOR=Intel10_64lp \
|
|
-DQMC_DATA=$QMC_DATA_DIR \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
*"GCC"*"-Sandbox"*)
|
|
echo 'Configure for enabling sandbox (minimal) only option with gcc'
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DCMAKE_C_COMPILER=gcc \
|
|
-DCMAKE_CXX_COMPILER=g++ \
|
|
-DQMC_BUILD_SANDBOX_ONLY=ON \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
*"GCC"*"-Gcov"*)
|
|
echo 'Configure for code coverage with gcc and gcovr -DENABLE_GCOV=TRUE and upload reports to Codecov'
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DMPI_C_COMPILER=mpicc \
|
|
-DMPI_CXX_COMPILER=mpicxx \
|
|
-DENABLE_GCOV=TRUE \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
*"GCC"*"-Werror"*)
|
|
echo 'Configure for building with gcc -Werror flag enabled'
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DCMAKE_C_COMPILER=gcc \
|
|
-DCMAKE_CXX_COMPILER=g++ \
|
|
-DCMAKE_CXX_FLAGS=-Werror \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
*"GCC"*)
|
|
echo 'Configure for disabling OpenMP with QMC_OMP=0'
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DCMAKE_C_COMPILER=gcc \
|
|
-DCMAKE_CXX_COMPILER=g++ \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
*"Clang"*"San"*) # Sanitize with clang compilers
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DCMAKE_C_COMPILER=clang \
|
|
-DCMAKE_CXX_COMPILER=clang++ \
|
|
-DENABLE_SANITIZER=$IS_SANITIZER \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
*"Clang16"*"-Offload"*)
|
|
echo 'Configure for building OpenMP offload with clang16 on x86_64 target'
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DCMAKE_C_COMPILER=clang-16 \
|
|
-DCMAKE_CXX_COMPILER=clang++-16 \
|
|
-DQMC_GPU=openmp \
|
|
-DOFFLOAD_TARGET=x86_64-pc-linux-gnu \
|
|
-DUSE_OBJECT_TARGET=ON \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
*"Clang15"*"-CUDA-AFQMC-Offload"*)
|
|
echo "Configure for building with CUDA and AFQMC using OpenMP offload on x86_64 " \
|
|
"with latest llvm, need built-from-source OpenBLAS due to bug in rpm"
|
|
|
|
# todo: update to llvm 15 release, currently using release candidate
|
|
export OMPI_CC=/opt/llvm/15.0.0/bin/clang
|
|
export OMPI_CXX=/opt/llvm/15.0.0/bin/clang++
|
|
|
|
# Make current environment variables available to subsequent steps
|
|
echo "OMPI_CC=/opt/llvm/15.0.0/bin/clang" >> $GITHUB_ENV
|
|
echo "OMPI_CXX=/opt/llvm/15.0.0/bin/clang++" >> $GITHUB_ENV
|
|
|
|
# Confirm that cuda 11.2 gets picked up by the compiler
|
|
/opt/llvm/15.0.0/bin/clang++ -v
|
|
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DCMAKE_C_COMPILER=/usr/lib64/openmpi/bin/mpicc \
|
|
-DCMAKE_CXX_COMPILER=/usr/lib64/openmpi/bin/mpicxx \
|
|
-DMPIEXEC_EXECUTABLE=/usr/lib64/openmpi/bin/mpirun \
|
|
-DBUILD_AFQMC=ON \
|
|
-DQMC_GPU="cuda;openmp" \
|
|
-DQMC_GPU_ARCHS=sm_70 \
|
|
-DCMAKE_PREFIX_PATH="/opt/OpenBLAS/0.3.18" \
|
|
-DQMC_DATA=$QMC_DATA_DIR \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
*"Intel21"*"-CUDA-AFQMC"*)
|
|
echo "Configure for building with CUDA and AFQMC " \
|
|
"with Intel classic compiler in OneAPI 2021 (to be deprecated in 2023), " \
|
|
"need built-from-source OpenBLAS due to bug in rpm"
|
|
|
|
source /opt/intel/oneapi/setvars.sh
|
|
|
|
export OMPI_CC=/opt/intel/oneapi/compiler/2023.0.0/linux/bin/intel64/icc
|
|
export OMPI_CXX=/opt/intel/oneapi/compiler/2023.0.0/linux/bin/intel64/icpc
|
|
|
|
# Make current environment variables available to subsequent steps
|
|
echo "OMPI_CC=/opt/intel/oneapi/compiler/2023.0.0/linux/bin/intel64/icc" >> $GITHUB_ENV
|
|
echo "OMPI_CXX=/opt/intel/oneapi/compiler/2023.0.0/linux/bin/intel64/icpc" >> $GITHUB_ENV
|
|
|
|
cmake -GNinja $CMAKE_OPTIONS \
|
|
-DCMAKE_C_COMPILER=/usr/lib64/openmpi/bin/mpicc \
|
|
-DCMAKE_CXX_COMPILER=/usr/lib64/openmpi/bin/mpicxx \
|
|
-DMPIEXEC_EXECUTABLE=/usr/lib64/openmpi/bin/mpirun \
|
|
-DCMAKE_C_FLAGS="-diag-disable=10441" \
|
|
-DCMAKE_CXX_FLAGS="-diag-disable=10441" \
|
|
-DCMAKE_CUDA_FLAGS="-diag-disable=10441" \
|
|
-DBUILD_AFQMC=ON \
|
|
-DQMC_GPU=cuda \
|
|
-DQMC_GPU_ARCHS=sm_70 \
|
|
-DCMAKE_PREFIX_PATH="/opt/OpenBLAS/0.3.18" \
|
|
-DQMC_DATA=$QMC_DATA_DIR \
|
|
${GITHUB_WORKSPACE}
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
# Build using ninja (~ 25 minutes on GitHub-hosted runner)
|
|
build)
|
|
# CUDA toolchain can be used implicitly by the compiler. Double check the location.
|
|
if [[ "${GH_JOBNAME}" =~ (CUDA) ]]
|
|
then
|
|
which nvcc
|
|
fi
|
|
|
|
cd ${GITHUB_WORKSPACE}/../qmcpack-build
|
|
ninja
|
|
;;
|
|
|
|
# Run deterministic tests
|
|
test)
|
|
|
|
# Run only deterministic tests (reasonable for CI) by default
|
|
case "${GH_JOBNAME}" in
|
|
*"macOS-GCC14"*"-Real"*)
|
|
TEST_LABEL="-L deterministic -E deterministic-unit_test_estimators"
|
|
# estimator test bus error on mac only
|
|
;;
|
|
*)
|
|
TEST_LABEL="-L deterministic"
|
|
;;
|
|
esac
|
|
|
|
cd ${GITHUB_WORKSPACE}/../qmcpack-build
|
|
|
|
# Enable oversubscription in OpenMPI
|
|
if [[ "${GH_JOBNAME}" =~ (-MPI-) ]]
|
|
then
|
|
echo "Enabling OpenMPI oversubscription"
|
|
export OMPI_MCA_rmaps_base_oversubscribe=1
|
|
export OMPI_MCA_hwloc_base_binding_policy=none
|
|
|
|
if [[ "$HOST_NAME" =~ (sulfur) || "$HOST_NAME" =~ (nitrogen) ]]
|
|
then
|
|
echo "Set the management layer to ucx"
|
|
export OMPI_MCA_pml=ucx
|
|
fi
|
|
fi
|
|
|
|
if [[ "${GH_JOBNAME}" =~ (Clang16-NoMPI-Offload) ]]
|
|
then
|
|
export KMP_TEAMS_THREAD_LIMIT=1
|
|
# Run only unit tests (reasonable for CI)
|
|
TEST_LABEL="-L unit"
|
|
fi
|
|
|
|
if [[ "${GH_JOBNAME}" =~ (CUDA) ]]
|
|
then
|
|
if [[ "${GH_JOBNAME}" =~ (-Offload) ]]
|
|
then
|
|
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64:${LD_LIBRARY_PATH}
|
|
else
|
|
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:${LD_LIBRARY_PATH}
|
|
fi
|
|
fi
|
|
|
|
if [[ "${GH_JOBNAME}" =~ (AFQMC) ]]
|
|
then
|
|
# Avoid polluting the stderr output with libfabric error message
|
|
export OMPI_MCA_btl=self
|
|
fi
|
|
|
|
if [[ "${GH_JOBNAME}" =~ (Offload) ]]
|
|
then
|
|
# Clang helper threads used by target nowait is very broken. Disable this feature
|
|
export LIBOMP_USE_HIDDEN_HELPER_TASK=0
|
|
fi
|
|
|
|
if [[ "${GH_JOBNAME}" =~ (AFQMC-Offload) ]]
|
|
then
|
|
export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:${LD_LIBRARY_PATH}
|
|
fi
|
|
|
|
if [[ "${GH_JOBNAME}" =~ (Intel21) ]]
|
|
then
|
|
source /opt/intel/oneapi/setvars.sh
|
|
fi
|
|
|
|
if [[ "${GH_JOBNAME}" =~ (MKL) ]]
|
|
then
|
|
source /opt/intel2020/mkl/bin/mklvars.sh intel64
|
|
fi
|
|
|
|
# Add ctest concurrent parallel jobs
|
|
# 4 for Linux and macOS GitHub Actions free runners
|
|
ctest --output-on-failure $TEST_LABEL -j 4
|
|
;;
|
|
|
|
# Generate coverage reports
|
|
coverage)
|
|
cd ${GITHUB_WORKSPACE}/../qmcpack-build
|
|
# filter unreachable branches with gcovr
|
|
# see https://gcovr.com/en/stable/faq.html#why-does-c-code-have-so-many-uncovered-branches
|
|
gcovr --exclude-unreachable-branches --exclude-throw-branches --root=${GITHUB_WORKSPACE}/.. --xml-pretty -o coverage.xml
|
|
du -hs coverage.xml
|
|
cat coverage.xml
|
|
;;
|
|
|
|
# Install the library (not triggered at the moment)
|
|
install)
|
|
cd ${GITHUB_WORKSPACE}/../qmcpack-build
|
|
ninja install
|
|
;;
|
|
|
|
rebase)
|
|
source external_codes/github_actions/auto-rebase.sh
|
|
;;
|
|
|
|
pull-rebase)
|
|
source external_codes/github_actions/trigger-rebase-on-push.sh
|
|
;;
|
|
|
|
*)
|
|
echo " Invalid step" "$1"
|
|
exit -1
|
|
;;
|
|
esac
|