mask_type decode_mapping(hwloc_topology const& t, mapping_type& m, std::vector<mask_type>& affinities, std::size_t thread_index, error_code& ec) { std::size_t size = affinities.size(); mask_type mask; switch (m[0].type_) { case spec_type::socket: // requested top level is a socket mask = decode_mapping_socket(t, m, size, thread_index, ec); break; case spec_type::numanode: // requested top level is a NUMA node mask = decode_mapping_numanode(t, m, size, thread_index, ec); break; case spec_type::unknown: // no top level is requested mask = decode_mapping0_unknown(t, m, size, t.get_machine_affinity_mask(), 0, thread_index, ec); break; default: HPX_THROWS_IF(ec, bad_parameter, "decode_mapping", boost::str(boost::format("unexpected specification type at " "index zero: %x (%s)") % static_cast<unsigned>(m[0].type_) % spec_type::type_name(m[0].type_))); return mask_type(); } return mask; }
mask_type decode_mapping_numanode(hwloc_topology const& t, mapping_type& m, std::size_t size, std::size_t thread_index, error_code& ec) { bounds_type b = extract_bounds(m[0], size, ec); if (ec) return 0; std::size_t index = std::size_t(-1); if (m[1].type_ == spec_type::unknown && m[2].type_ == spec_type::unknown && b.size() > 1) { index = thread_index; } mask_type mask = 0; std::size_t node_index = 0; for (bounds_type::const_iterator it = b.begin(); it != b.end(); ++it, ++node_index) { if (index == std::size_t(-1) || node_index == index) mask |= t.init_numa_node_affinity_mask_from_numa_node(*it); } std::size_t node_base_index = *b.begin(); if (thread_index != std::size_t(-1) && b.size() > 1) node_base_index += thread_index; std::size_t base_index = 0; for (std::size_t i = 0; i != node_base_index; ++i) base_index += t.get_number_of_numa_node_cores(i); return decode_mapping0_unknown(t, m, size, mask, base_index, thread_index, ec); }