Program Listing for File do_successively.hpp

Return to documentation for file (include/uitsl/distributed/do_successively.hpp)

#pragma once
#ifndef UITSL_DISTRIBUTED_DO_SUCCESSIVELY_HPP_INCLUDE
#define UITSL_DISTRIBUTED_DO_SUCCESSIVELY_HPP_INCLUDE

#include <functional>
#include <iostream>

#include <mpi.h>

#include "../mpi/mpi_utils.hpp"

namespace uitsl {

void print_separator(const proc_id_t rank) {
  std::cout << "======================" << std::endl;
  std::cout << "\\/ \\/ Rank " << rank << " \\/ \\/" << std::endl;
  std::cout << "======================" << std::endl;
}

//TODO add a thread do successively and a combined do successively
template<
  typename TaskFunction,
  typename BeforeTaskFunction=std::function<void(const proc_id_t)>
>
void do_successively(
  TaskFunction&& task,
  BeforeTaskFunction&& before_task=[](const proc_id_t rank){},
  MPI_Comm comm=MPI_COMM_WORLD
) {
  for (proc_id_t rank = 0; rank < uitsl::get_nprocs(comm); ++rank) {
    if (rank == uitsl::get_rank(comm)) {
      before_task(rank);
      task();
    }
    UITSL_Barrier(comm);
  }
}

} // namespace uitsl

#endif // #ifndef UITSL_DISTRIBUTED_DO_SUCCESSIVELY_HPP_INCLUDE