MPI (message passing interface) --- run several M2 processes in parallel #4016
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
################################################################################ | |
# | |
# Github actions trigger (workflow script) for building Macaulay2 | |
# | |
# See https://help.github.com/en/actions for the documentation. | |
# | |
################################################################################ | |
name: Build and Test Macaulay2 | |
on: | |
workflow_dispatch: | |
push: | |
branches: | |
- pre-master # when we're ready to merge 'development' into 'master', we merge it first into 'pre-master', so it can be tested | |
pull_request: | |
branches: | |
- master | |
- development | |
schedule: | |
# cron time in UTC | |
# a scheduled job runs on the default branch: 'master' | |
- cron: '0 6 * * *' | |
defaults: | |
run: | |
working-directory: M2/BUILD/build | |
jobs: | |
build: | |
if: github.repository == 'Macaulay2/M2' || contains(github.ref, 'global') | |
name: ${{ matrix.build-system }}-${{ matrix.os }}-${{ matrix.compiler }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
build-system: | |
- cmake | |
- autotools | |
os: | |
- ubuntu-22.04 | |
- macos-12 | |
compiler: | |
- default | |
include: | |
- build-system: cmake | |
os: ubuntu-22.04 | |
compiler: clang-14 | |
cxx: clang++-14 | |
cc: clang-14 | |
# This build tests Clang rather than AppleClang (keep) | |
- build-system: cmake | |
os: macos-12 | |
compiler: clang-14 | |
cxx: clang++ | |
cc: clang | |
# This build tests MPI | |
- build-system: cmake | |
os: macos-12 | |
compiler: MPI | |
cxx: clang++ | |
cc: clang | |
- build-system: cmake | |
os: ubuntu-22.04 | |
compiler: MPI | |
exclude: | |
- build-system: cmake | |
os: macos-12 | |
compiler: default | |
env: | |
VERBOSE: 1 | |
steps: | |
- uses: actions/checkout@v3 | |
# ---------------------- | |
# Install missing tools and libraries for macOS | |
# ---------------------- | |
- name: Install requirements for macOS | |
if: runner.os == 'macOS' | |
run: | | |
brew config | |
brew tap macaulay2/tap | |
brew install automake boost tbb ccache ctags llvm@14 make ninja yasm libffi | |
brew install --only-dependencies macaulay2/tap/M2 | |
brew install mpich | |
# ---------------------- | |
# Install missing tools and libraries for Linux | |
# ---------------------- | |
- name: Install requirements for Linux | |
if: runner.os == 'Linux' | |
run: | | |
sudo add-apt-repository -y -n ppa:macaulay2/macaulay2 | |
sudo add-apt-repository -y -n ppa:savoury1/backports | |
sudo apt-get update | |
sudo apt-get install -y -q --no-install-recommends clang-14 gfortran libtool-bin ninja-build yasm ccache | |
sudo apt-get install -y -q --no-install-recommends libatomic-ops-dev libboost-stacktrace-dev \ | |
libncurses-dev libncurses5-dev libreadline-dev libeigen3-dev liblapack-dev libxml2-dev \ | |
libgc-dev libgdbm-dev libglpk-dev libgmp3-dev libgtest-dev libmpfr-dev libmpfi-dev libntl-dev gfan \ | |
libgivaro-dev libboost-regex-dev fflas-ffpack libflint-dev libmps-dev libfrobby-dev \ | |
libsingular-dev singular-data libcdd-dev cohomcalg topcom 4ti2 normaliz coinor-csdp \ | |
nauty lrslib polymake phcpack w3c-markup-validator libtbb-dev qepcad libomp-14-dev | |
sudo apt-get install -y -q --no-install-recommends mpich libmpich-dev | |
# ---------------------- | |
# Steps common to all build variants | |
# ---------------------- | |
- name: Prepare build environment | |
run: | | |
echo "CC=${{ matrix.cc }}" >> $GITHUB_ENV | |
echo "CXX=${{ matrix.cxx }}" >> $GITHUB_ENV | |
if [[ "${{ matrix.compiler }}" == "MPI" ]] | |
then echo "CC=mpicc" >> $GITHUB_ENV | |
echo "CXX=mpicxx" >> $GITHUB_ENV | |
echo "MPICH_CC=${{ matrix.cc }}" >> $GITHUB_ENV | |
echo "MPICH_CXX=${{ matrix.cxx }}" >> $GITHUB_ENV | |
fi | |
if [[ "${{ runner.os }}" == "Linux" ]] | |
then alias llvm-config="llvm-config-14" | |
echo "/usr/lib/ccache" >> $GITHUB_PATH | |
else echo `brew --prefix ccache`/libexec >> $GITHUB_PATH | |
echo `brew --prefix make `/libexec/gnubin >> $GITHUB_PATH | |
echo `brew --prefix llvm@14`/bin >> $GITHUB_PATH | |
PATH=`brew --prefix llvm@14`/bin:$PATH | |
fi | |
# Necessary for clang to find the right libomp | |
echo "LIBRARY_PATH=`llvm-config --libdir`" >> $GITHUB_ENV | |
- uses: actions/cache@v3 | |
if: matrix.build-system == 'cmake' | |
id: restore-cache | |
with: | |
path: | | |
~/.ccache | |
~/work/M2/M2/M2/BUILD/build/usr-host | |
key: build-cache-${{ runner.os }}-${{ matrix.compiler }}-${{ matrix.build-system }}-${{ hashFiles('**/cmake/*-libraries.cmake', '.github/workflows/test_build.yml') }} | |
# ---------------------- | |
# Configure and build M2 using CMake | |
# ---------------------- | |
- name: Configure Macaulay2 using CMake | |
if: matrix.build-system == 'cmake' | |
run: | | |
cmake -S../.. -B. -GNinja \ | |
-DCMAKE_BUILD_TYPE=Release -DBUILD_NATIVE=OFF \ | |
-DCMAKE_PREFIX_PATH="`brew --prefix`;`brew --prefix libffi`" \ | |
-DCMAKE_INSTALL_PREFIX=/usr \ | |
-DWITH_PYTHON=ON \ | |
-DWITH_MPI=`[[ "${{ matrix.compiler }}" == MPI ]] && echo ON || echo OFF` \ | |
--debug-trycompile | |
- name: Build libraries using Ninja | |
if: matrix.build-system == 'cmake' | |
run: | | |
cmake --build . --target build-libraries build-programs | |
- name: Build Macaulay2 using Ninja | |
if: matrix.build-system == 'cmake' | |
run: | | |
cmake --build . --target M2-core M2-emacs install-packages | |
if [[ "${{ runner.os }}" == "Linux" ]] && [[ "${{ matrix.compiler }}" == "clang-14" ]]; then | |
sudo apt-get install -y -q --no-install-recommends dpkg-dev | |
echo "GIT_COMMIT=`git describe --dirty --always --match HEAD`" >> $GITHUB_ENV | |
cpack -G DEB | |
fi | |
# ---------------------- | |
# Configure and build M2 using Autotools | |
# ---------------------- | |
- name: Configure Macaulay2 using Autotools | |
if: matrix.build-system == 'autotools' | |
run: | | |
make -C ../.. get-libtool get-automake get-autoconf | |
make -C ../.. all | |
export PYVERSION=`python3 -c "from sys import version_info; \ | |
print(f'{version_info.major}.{version_info.minor}')"` | |
export CPPFLAGS="-I`brew --prefix`/include -I`brew --prefix libomp`/include" | |
export LDFLAGS="-L`brew --prefix`/lib -L`brew --prefix libomp`/lib \ | |
-L/Library/Frameworks/Python.framework/Versions/${PYVERSION}/lib" | |
../../configure --enable-download --with-python --with-system-gc | |
- name: Build Macaulay2 using Make | |
if: matrix.build-system == 'autotools' | |
run: | | |
make | |
# ---------------------- | |
# Run tests | |
# ---------------------- | |
- name: Run Tests using CTest | |
if: matrix.build-system == 'cmake' && runner.os == 'Linux' && matrix.compiler == 'clang-14' | |
run: | | |
set -xe | |
./M2 -q --check 1 -e 'exit 0' | |
./M2 -q --check 2 -e 'exit 0' | |
./M2 -q --check 3 -e 'exit 0' | |
cmake --build . --target M2-tests | |
cmake --build . --target M2-unit-tests | |
cmake --build . --target memtailor-unit-tests mathic-unit-tests mathicgb-unit-tests | |
ctest -j1 --output-on-failure -R "unit-tests" | |
ctest -j4 --output-on-failure -R "ComputationsBook" | |
# TODO: add Macaulay2/tests/engine when https://github.com/Macaulay2/M2/issues/1213 is fixed | |
- name: Run MPI test examples | |
if: matrix.compiler == 'MPI' | |
run: | | |
mpirun -np 4 ./M2 --script ../../Macaulay2/packages/MPI/example-homotopies.m2 | |
mpirun -np 4 ./M2 --script ../../Macaulay2/packages/MPI/example2.m2 | |
mpirun -np 4 ./M2 --script ../../Macaulay2/packages/MPI/master-worker-MPI.m2 | |
- name: Run Tests using Autotools | |
if: matrix.build-system == 'autotools' && runner.os == 'Linux' && matrix.compiler == 'default' | |
run: | | |
make check -o check-in-libraries | |
make -C Macaulay2/html-check-links check | |
# ---------------------- | |
# Upload build artifacts | |
# ---------------------- | |
- name: Upload build logs | |
if: always() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ matrix.build-system }}-${{ matrix.os }}-${{ matrix.compiler }}-logs | |
path: | | |
# Autotools | |
M2/BUILD/build/config.log | |
M2/BUILD/build/include/* | |
M2/BUILD/build/libraries/*/build/*/config.log | |
# CMake | |
M2/BUILD/build/CMakeCache.txt | |
M2/BUILD/build/CMakeFiles/CMakeError.log | |
M2/BUILD/build/CMakeFiles/CMakeOutput.log | |
M2/BUILD/build/libraries/*/build/config.log | |
# package example errors | |
M2/BUILD/build/usr-dist/common/share/doc/Macaulay2/*/example-output/*.errors | |
# package test errors under Ubuntu | |
/tmp/M2-*/*.tmp | |
/tmp/M2-*/*.m2 | |
# Test errors | |
M2/BUILD/build/Macaulay2/tests/*/*.errors | |
- name: Upload Macaulay2 package for Ubuntu (x86_64) | |
if: matrix.build-system == 'cmake' && runner.os == 'Linux' && matrix.compiler == 'clang-14' && success() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: Macaulay2-${{ env.GIT_COMMIT }}-ubuntu-x86_64 | |
path: | | |
M2/BUILD/build/Macaulay2-* | |
retention-days: 1 |