Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use universal references in generic communciations #24

Merged
merged 2 commits into from
Nov 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 12 additions & 23 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ jobs:
matrix:
include:
- {os: ubuntu-24.04, cc: gcc, cxx: g++, doc: OFF}
- {os: ubuntu-24.04, cc: clang, cxx: clang++, doc: ON}
- {os: ubuntu-24.04, cc: clang, cxx: clang++, doc: OFF}
- {os: macos-14, cc: gcc-14, cxx: g++-14, doc: OFF}
- {os: macos-14, cc: clang, cxx: clang++, doc: OFF}
- {os: macos-14, cc: clang, cxx: clang++, doc: ON}

runs-on: ${{ matrix.os }}

Expand Down Expand Up @@ -78,34 +78,23 @@ jobs:
python3-sphinx
python3-nbsphinx

- name: Set up virtualenv
run: |
mkdir $HOME/.venv
python3 -m venv --system-site-packages $HOME/.venv/my_python
source $HOME/.venv/my_python/bin/activate
echo "VIRTUAL_ENV=$VIRTUAL_ENV" >> $GITHUB_ENV
echo "PATH=$PATH" >> $GITHUB_ENV

- name: Install homebrew dependencies
if: ${{ contains(matrix.os, 'macos') }}
run: |
brew update
brew install ccache gcc llvm hdf5 open-mpi openblas
mkdir $HOME/.venv
python3 -m venv $HOME/.venv/my_python
source $HOME/.venv/my_python/bin/activate
brew install ccache gcc llvm hdf5 open-mpi openblas doxygen
pip install mako numpy scipy mpi4py
pip install -r requirements.txt
echo "VIRTUAL_ENV=$VIRTUAL_ENV" >> $GITHUB_ENV
echo "PATH=$(brew --prefix llvm)/bin:$(brew --prefix gcc)/bin:$PATH" >> $GITHUB_ENV

- name: Build doxygen
if: matrix.doc == 'ON'
env:
CC: ${{ matrix.cc }}
CXX: ${{ matrix.cxx }}
run: |
cd $HOME
git clone https://github.com/doxygen/doxygen.git
cd doxygen
git checkout Release_1_12_0
mkdir build
cd build
cmake .. -Duse_libclang=ON -Duse_libc++=OFF
make -j 2 VERBOSE=1
cp bin/doxygen /usr/local/bin/doxygen
echo "PYTHONPATH=$(brew --prefix llvm)/lib/python3.13/site-packages" >> $GITHUB_ENV

- name: Add clang CXXFLAGS
if: ${{ contains(matrix.cxx, 'clang') }}
Expand Down
8 changes: 4 additions & 4 deletions c++/mpi/generic_communication.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ namespace mpi {
* @param c mpi::communicator.
* @param root Rank of the root process.
*/
template <typename T> [[gnu::always_inline]] void broadcast(T &x, communicator c = {}, int root = 0) {
template <typename T> [[gnu::always_inline]] void broadcast(T &&x, communicator c = {}, int root = 0) {
static_assert(not std::is_const_v<T>, "mpi::broadcast cannot be called on const objects");
if (has_env) mpi_broadcast(x, c, root);
if (has_env) mpi_broadcast(std::forward<T>(x), c, root);
}

/**
Expand Down Expand Up @@ -121,9 +121,9 @@ namespace mpi {
* @param op `MPI_Op` used in the reduction.
*/
template <typename T>
[[gnu::always_inline]] inline void reduce_in_place(T &x, communicator c = {}, int root = 0, bool all = false, MPI_Op op = MPI_SUM) {
[[gnu::always_inline]] inline void reduce_in_place(T &&x, communicator c = {}, int root = 0, bool all = false, MPI_Op op = MPI_SUM) {
static_assert(not std::is_const_v<T>, "In-place mpi functions cannot be called on const objects");
if (has_env) mpi_reduce_in_place(x, c, root, all, op);
if (has_env) mpi_reduce_in_place(std::forward<T>(x), c, root, all, op);
}

/**
Expand Down
15 changes: 10 additions & 5 deletions c++/mpi/ranges.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ namespace mpi {
* @param c mpi::communicator.
* @param root Rank of the root process.
*/
template <contiguous_sized_range R> void broadcast_range(R &&rg, communicator c = {}, int root = 0) {
template <contiguous_sized_range R> void broadcast_range(R &&rg, communicator c = {}, int root = 0) { // NOLINT (ranges need not be forwarded)
// check the sizes of all ranges
using value_t = std::ranges::range_value_t<R>;
auto const size = std::ranges::size(rg);
Expand Down Expand Up @@ -151,7 +151,9 @@ namespace mpi {
* @param all Should all processes receive the result of the reduction.
* @param op `MPI_Op` used in the reduction.
*/
template <contiguous_sized_range R> void reduce_in_place_range(R &&rg, communicator c = {}, int root = 0, bool all = false, MPI_Op op = MPI_SUM) {
template <contiguous_sized_range R>
void reduce_in_place_range(R &&rg, communicator c = {}, int root = 0, bool all = false, // NOLINT (ranges need not be forwarded)
MPI_Op op = MPI_SUM) {
// check the sizes of all ranges
using value_t = std::ranges::range_value_t<R>;
auto const size = std::ranges::size(rg);
Expand Down Expand Up @@ -221,7 +223,8 @@ namespace mpi {
* @param op `MPI_Op` used in the reduction.
*/
template <contiguous_sized_range R1, contiguous_sized_range R2>
void reduce_range(R1 &&in_rg, R2 &&out_rg, communicator c = {}, int root = 0, bool all = false, MPI_Op op = MPI_SUM) {
void reduce_range(R1 &&in_rg, R2 &&out_rg, communicator c = {}, int root = 0, bool all = false, // NOLINT (ranges need not be forwarded)
MPI_Op op = MPI_SUM) {
// check input and output ranges
auto const in_size = std::ranges::size(in_rg);
EXPECTS_WITH_MESSAGE(all_equal(in_size, c), "Input range sizes are not equal across all processes in mpi::reduce_range");
Expand Down Expand Up @@ -311,7 +314,8 @@ namespace mpi {
*/
template <contiguous_sized_range R1, contiguous_sized_range R2>
requires(std::same_as<std::ranges::range_value_t<R1>, std::ranges::range_value_t<R2>>)
void scatter_range(R1 &&in_rg, R2 &&out_rg, long in_size, communicator c = {}, int root = 0, long chunk_size = 1) {
void scatter_range(R1 &&in_rg, R2 &&out_rg, long in_size, communicator c = {}, int root = 0, // NOLINT (ranges need not be forwarded)
long chunk_size = 1) {
// check the sizes of the input and output ranges
if (c.rank() == root) {
EXPECTS_WITH_MESSAGE(in_size == std::ranges::size(in_rg), "Input range size not equal to provided size in mpi::scatter_range");
Expand Down Expand Up @@ -405,7 +409,8 @@ namespace mpi {
* @param all Should all processes receive the result of the reduction.
*/
template <contiguous_sized_range R1, contiguous_sized_range R2>
void gather_range(R1 &&in_rg, R2 &&out_rg, long out_size, communicator c = {}, int root = 0, bool all = false) {
void gather_range(R1 &&in_rg, R2 &&out_rg, long out_size, communicator c = {}, int root = 0, // NOLINT (ranges need not be forwarded)
bool all = false) {
// check the sizes of the input and output ranges
auto const in_size = std::ranges::size(in_rg);
EXPECTS_WITH_MESSAGE(out_size = all_reduce(in_size, c), "Input range sizes don't add up to output range size in mpi::gather_range");
Expand Down
Loading