astra-sim-alibabacloud/astra-sim/system/topology/GeneralComplexTopology.cc (86 lines of code) (raw):
/******************************************************************************
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
*******************************************************************************/
#include "GeneralComplexTopology.hh"
#include "DoubleBinaryTreeTopology.hh"
#include "RingTopology.hh"
namespace AstraSim {
BasicLogicalTopology* GeneralComplexTopology::get_basic_topology_at_dimension(
int dimension,
ComType type) {
return dimension_topology[dimension]->get_basic_topology_at_dimension(
0, type);
}
int GeneralComplexTopology::get_num_of_nodes_in_dimension(int dimension) {
if (dimension >= dimension_topology.size()) {
std::cout << "dim: " << dimension
<< " requested! but max dim is: " << dimension_topology.size() - 1
<< std::endl;
}
assert(dimension < dimension_topology.size());
return dimension_topology[dimension]->get_num_of_nodes_in_dimension(0);
}
int GeneralComplexTopology::get_num_of_dimensions() {
return dimension_topology.size();
}
GeneralComplexTopology::~GeneralComplexTopology() {
for (int i = 0; i < dimension_topology.size(); i++) {
delete dimension_topology[i];
}
}
GeneralComplexTopology::GeneralComplexTopology(
int id,
std::vector<int> dimension_size,
std::vector<CollectiveImplementation*> collective_implementation) {
int offset = 1;
int last_dim = collective_implementation.size() - 1;
for (int dim = 0; dim < collective_implementation.size(); dim++) {
if (collective_implementation[dim]->type ==
CollectiveImplementationType::Ring ||
collective_implementation[dim]->type ==
CollectiveImplementationType::Direct ||
collective_implementation[dim]->type ==
CollectiveImplementationType::HalvingDoubling ||
collective_implementation[dim]->type ==
CollectiveImplementationType::NcclFlowModel ||
collective_implementation[dim]->type ==
CollectiveImplementationType::NcclTreeFlowModel) {
RingTopology* ring = new RingTopology(
RingTopology::Dimension::NA,
id,
dimension_size[dim],
(id % (offset * dimension_size[dim])) / offset,
offset);
dimension_topology.push_back(ring);
} else if (
collective_implementation[dim]->type ==
CollectiveImplementationType::OneRing ||
collective_implementation[dim]->type ==
CollectiveImplementationType::OneDirect ||
collective_implementation[dim]->type ==
CollectiveImplementationType::OneHalvingDoubling) {
int total_npus = 1;
for (int d : dimension_size) {
total_npus *= d;
}
RingTopology* ring = new RingTopology(
RingTopology::Dimension::NA, id, total_npus, id % total_npus, 1);
dimension_topology.push_back(ring);
return;
} else if (
collective_implementation[dim]->type ==
CollectiveImplementationType::DoubleBinaryTree) {
if (dim == last_dim) {
DoubleBinaryTreeTopology* DBT = new DoubleBinaryTreeTopology(
id, dimension_size[dim], id % offset, offset);
dimension_topology.push_back(DBT);
} else {
DoubleBinaryTreeTopology* DBT = new DoubleBinaryTreeTopology(
id,
dimension_size[dim],
(id - (id % (offset * dimension_size[dim]))) + (id % offset),
offset);
dimension_topology.push_back(DBT);
}
}
offset *= dimension_size[dim];
}
}
} // namespace AstraSim