Template Struct ProcWorld

Struct Documentation

template<typename Spec>
struct dish2::ProcWorld

Public Types

using topology_factory_t = typename Spec::topology_factory_t
using genome_mesh_spec_t = typename Spec::genome_mesh_spec_t
using message_mesh_spec_t = typename Spec::message_mesh_spec_t
using push_mesh_spec_t = typename Spec::push_mesh_spec_t
using quorum_mesh_spec_t = typename Spec::quorum_mesh_spec_t
using resource_mesh_spec_t = typename Spec::resource_mesh_spec_t
using state_mesh_spec_t = typename Spec::state_mesh_spec_t

Public Functions

ProcWorld()
dish2::ThreadWorld<Spec> MakeThreadWorld()

Public Members

const double dim_width{std::pow(dish2::num_cells_global(), 1.0 / dish2::cfg.N_DIMS())}
const emp::vector<size_t> dims = emp::vector<size_t>(dish2::cfg.N_DIMS(), dim_width)
const netuit::Topology topology = {topology_factory_t{}(dims)}
const size_t total_threads = uitsl::get_nprocs() * dish2::cfg.N_THREADS()
const bool use_metis = !((dish2::num_cells_global() % uitsl::get_nprocs() == 0) && (dish2::num_cells_global() % total_threads == 0) && uitsl::is_perfect_hypercube(dish2::num_cells_global(), dish2::cfg.N_DIMS()) && uitsl::is_perfect_hypercube(uitsl::get_nprocs(), dish2::cfg.N_DIMS()) && uitsl::is_perfect_hypercube(total_threads, dish2::cfg.N_DIMS()))
const std::pair< std::function< uitsl::proc_id_t(size_t)>, std::function< uitsl::thread_id_t(size_t)> > assignments = use_metis ? netuit::GenerateMetisAssignmentFunctors( uitsl::safe_cast<size_t>( uitsl::get_nprocs() ), dish2::cfg.N_THREADS(), topology ) : std::pair{ netuit::AssignPerfectHypercube<uitsl::proc_id_t>( dish2::cfg.N_DIMS(), dish2::num_cells_global(), uitsl::get_nprocs() ), uitsl::ThreadUidNormalizer( netuit::AssignPerfectHypercube<uitsl::proc_id_t>( dish2::cfg.N_DIMS(), dish2::num_cells_global(), uitsl::get_nprocs() ), netuit::AssignPerfectHypercube<uitsl::thread_id_t>( dish2::cfg.N_DIMS(), dish2::num_cells_global(), total_threads ) ) }
netuit::Mesh<genome_mesh_spec_t> genome_mesh{topology, assignments.second, assignments.first}
netuit::Mesh<message_mesh_spec_t> message_mesh{topology, assignments.second, assignments.first}
netuit::Mesh<push_mesh_spec_t> push_mesh{topology, assignments.second, assignments.first}
netuit::Mesh<quorum_mesh_spec_t> quorum_mesh{topology, assignments.second, assignments.first}
netuit::Mesh<resource_mesh_spec_t> resource_mesh{topology, assignments.second, assignments.first}
netuit::Mesh<state_mesh_spec_t> state_mesh{topology, assignments.second, assignments.first}