Architecture Design
A Straightforward Method
Remote Objects with P2P Communication
class Distributed {
static constexpr int root_rank{0};
static auto assign_process(const int obj_tag) { return obj_tag % comm_size; }
const int tag, process_rank;
public:
const bool is_local;
explicit Distributed(const int obj_tag)
: tag(obj_tag)
, process_rank(assign_process(tag))
, is_local(comm_rank == process_rank) {}
template<mpl_data_t DT> std::optional<mpl::irequest> gather(const Mat<DT>& object) {
if(root_rank == comm_rank) {
if(!is_local) return comm_world.irecv(const_cast<DT*>(object.memptr()), mpl::contiguous_layout<DT>{object.n_elem}, process_rank, mpl::tag_t{tag});
}
else if(is_local) return comm_world.isend(object.memptr(), mpl::contiguous_layout<DT>{object.n_elem}, root_rank, mpl::tag_t{tag});
return std::nullopt;
}
};Collective Communication
Last updated