1 #ifndef _ZOLTAN2_MACHINE_TORUS_TOPOMANAGERTEST_HPP_
2 #define _ZOLTAN2_MACHINE_TORUS_TOPOMANAGERTEST_HPP_
4 #include <Teuchos_Comm.hpp>
5 #include <Teuchos_CommHelpers.hpp>
15 template <
typename pcoord_t,
typename part_t>
26 procCoords(NULL),machine_extent(NULL),
27 delete_transformed_coords(false),
28 transformed_network_dim(0),
29 transformed_coordinates (NULL), pl(NULL)
31 transformed_network_dim = networkDim - 1;
32 transformed_coordinates = procCoords;
34 machine_extent =
new int[networkDim];
36 machine_extent[5] = 1;
39 procCoords =
new pcoord_t *[networkDim];
40 for (
int i = 0; i < networkDim; ++i) {
41 procCoords[i] =
new pcoord_t[this->
numRanks];
42 memset(procCoords[i], 0,
sizeof(pcoord_t) * this->
numRanks);
46 pcoord_t *xyz =
new pcoord_t[networkDim];
48 for (
int i = 0; i < networkDim; i++)
49 procCoords[i][this->
myRank] = xyz[i];
53 gatherMachineCoordinates(comm);
58 const Teuchos::ParameterList &pl_):
61 procCoords(NULL),machine_extent(NULL),
62 delete_transformed_coords(false),
63 transformed_network_dim(0),
64 transformed_coordinates (NULL),
67 transformed_network_dim = networkDim - 1;
68 transformed_coordinates = procCoords;
69 machine_extent =
new int[networkDim];
72 machine_extent[5] = 1;
75 procCoords =
new pcoord_t *[networkDim];
76 for (
int i = 0; i < networkDim; ++i) {
77 procCoords[i] =
new pcoord_t[this->
numRanks];
78 memset(procCoords[i], 0,
sizeof(pcoord_t) * this->
numRanks);
82 pcoord_t *xyz =
new pcoord_t[networkDim];
84 for (
int i = 0; i < networkDim; i++)
85 procCoords[i][this->
myRank] = xyz[i];
89 gatherMachineCoordinates(comm);
91 const Teuchos::ParameterEntry *pe =
92 this->pl->getEntryPtr(
"Machine_Optimization_Level");
95 int optimization_level = 0;
97 optimization_level = pe->getValue<
int>(&optimization_level);
99 if (optimization_level == 0) {
100 transformed_network_dim = networkDim - 1;
101 transformed_coordinates = procCoords;
103 else if (optimization_level >= 1) {
104 transformed_network_dim = networkDim - 2;
105 transformed_coordinates = procCoords;
112 for (
int i = 0; i < networkDim; i++) {
113 delete [] procCoords[i];
115 delete [] procCoords;
117 delete [] machine_extent;
118 if (delete_transformed_coords) {
119 for (
int i = 0; i < transformed_network_dim; i++) {
120 delete [] transformed_coordinates[i];
122 delete [] transformed_coordinates;
132 if (dim < transformed_network_dim)
133 wrap_around[dim++] =
true;
135 if (dim < transformed_network_dim)
136 wrap_around[dim++] =
true;
138 if (dim < transformed_network_dim)
139 wrap_around[dim++] =
true;
141 if (dim < transformed_network_dim)
142 wrap_around[dim++] =
true;
144 if (dim < transformed_network_dim)
145 wrap_around[dim++] =
true;
147 if (dim < transformed_network_dim)
148 wrap_around[dim++] =
true;
155 if (dim < transformed_network_dim)
156 wrap_around[dim++] =
true;
158 if (dim < transformed_network_dim)
159 wrap_around[dim++] =
true;
161 if (dim < transformed_network_dim)
162 wrap_around[dim++] =
true;
164 if (dim < transformed_network_dim)
165 wrap_around[dim++] =
true;
167 if (dim < transformed_network_dim)
168 wrap_around[dim++] =
true;
170 if (dim < transformed_network_dim)
171 wrap_around[dim++] =
true;
184 const int rank_per_node = 1;
185 const int num_nodes = this->
numRanks / rank_per_node;
187 if (num_nodes <= 1) {
188 nxyz[0] = nxyz[1] = nxyz[2] = nxyz[3] = 1;
192 else if (num_nodes <= 2) {
193 nxyz[0] = nxyz[1] = nxyz[2] = nxyz[3] = 1;
197 else if (num_nodes <= 4) {
198 nxyz[0] = nxyz[1] = nxyz[2] = 1;
203 else if (num_nodes <= 8) {
204 nxyz[0] = nxyz[1] = 1;
210 else if (num_nodes <= 16) {
218 else if (num_nodes <= 32) {
226 else if (num_nodes <= 64) {
234 else if (num_nodes <= 128) {
242 else if (num_nodes <= 256) {
250 else if (num_nodes <= 512) {
258 else if (num_nodes <= 1024) {
266 else if (num_nodes <= 2048) {
274 else if (num_nodes <= 4096) {
283 std::cerr <<
"Too many ranks to test" << std::endl;
285 nxyz[5] = rank_per_node;
288 if (dim < transformed_network_dim)
289 extent[dim] = nxyz[dim];
291 if (dim < transformed_network_dim)
292 extent[dim] = nxyz[dim];
294 if (dim < transformed_network_dim)
295 extent[dim] = nxyz[dim];
297 if (dim < transformed_network_dim)
298 extent[dim] = nxyz[dim];
300 if (dim < transformed_network_dim)
301 extent[dim] = nxyz[dim];
303 if (dim < transformed_network_dim)
304 extent[dim] = nxyz[dim];
311 for (
int i = 0; i < this->transformed_network_dim; ++i) {
312 xyz[i] = transformed_coordinates[i][this->
myRank];
321 t = me % machine_extent[5];
323 me = me / machine_extent[5];
324 e = me % machine_extent[4];
326 me = me / machine_extent[4];
327 d = me % machine_extent[3];
329 me = me / machine_extent[3];
330 c = me % machine_extent[2];
332 me = me / machine_extent[2];
333 b = me % machine_extent[1];
335 me = me / machine_extent[1];
336 a = me % machine_extent[0];
338 xyz[0] = a; xyz[1] = b; xyz[2] = c; xyz[3] = d; xyz[4] = e; xyz[5] = t;
347 pcoord_t *xyz)
const {
355 allCoords = procCoords;
362 for (
int i = 0; i < networkDim - 1; ++i) {
363 pcoord_t distance = procCoords[i][rank1] - procCoords[i][rank2];
365 distance = -distance;
366 if (machine_extent[i] - distance < distance)
367 distance = machine_extent[i] - distance;
385 pcoord_t **procCoords;
388 bool delete_transformed_coords;
389 int transformed_network_dim;
390 pcoord_t **transformed_coordinates;
391 const Teuchos::ParameterList *pl;
393 void gatherMachineCoordinates(
const Teuchos::Comm<int> &comm) {
395 pcoord_t *tmpVect =
new pcoord_t [this->
numRanks];
397 for (
int i = 0; i < networkDim; i++) {
398 Teuchos::reduceAll<int, pcoord_t>(comm, Teuchos::REDUCE_SUM,
400 procCoords[i], tmpVect);
401 pcoord_t *tmp = tmpVect;
402 tmpVect = procCoords[i];
bool getMachineExtent(part_t *extent) const
MachineTorusBGQTest(const Teuchos::Comm< int > &comm)
Constructor: A BlueGeneQ network machine description;.
A TopoManager Machine Class (Torus Networks) for testing only A more realistic machine should be used...
int getMachineDim() const
bool getMyActualMachineCoordinate(pcoord_t *xyz)
MachineClass Base class for representing machine coordinates, networks, etc.
bool getMachineExtentWrapArounds(bool *wrap_around) const
bool getMachineCoordinate(const char *nodename, pcoord_t *xyz)
SparseMatrixAdapter_t::part_t part_t
bool getMachineExtentWrapArounds(part_t *wrap_around) const
bool getAllMachineCoordinatesView(pcoord_t **&allCoords) const
MachineTorusBGQTest(const Teuchos::Comm< int > &comm, const Teuchos::ParameterList &pl_)
virtual bool getHopCount(int rank1, int rank2, pcoord_t &hops)
getHopCount function set hops between rank1 and rank2 return true if coordinates are available ...
bool hasMachineCoordinates() const
bool getMyMachineCoordinate(pcoord_t *xyz)
virtual ~MachineTorusBGQTest()
bool getMachineCoordinate(const int rank, pcoord_t *xyz) const