1 #ifndef __GEOMETRIC_STRATEGY_H__
2 #define __GEOMETRIC_STRATEGY_H__
29 boost::shared_ptr<CommTopology> topology, MPI_Comm comm)
30 : Strategy(num_masters, topology, comm)
40 for(
int dim=0; dim < topology_.getNumDimensions(); dim++) {
41 initial_region.
origin.push_back(0);
42 initial_region.
extensions.push_back(dims_[dim]);
47 while(
regions_.size() < num_masters_) {
58 bool is_worker =
false;
61 for(
int x = 0; x < region.extensions[0]; x++) {
62 iter[0] = region.origin[0] + x;
63 for(
int y = 0; y < region.extensions[1]; y++) {
64 iter[1] = region.origin[1] + y;
65 for(
int z = 0; z < region.extensions[2]; z++) {
66 iter[2] = region.origin[2] + z;
68 std::vector<int> worker_pids;
71 if(worker_pids[0] != region.master_pid)
72 region.worker_pids.push_back(worker_pids[0]);
74 region.worker_pids.push_back(worker_pids[1]);
75 region.worker_pids.push_back(worker_pids[2]);
76 region.worker_pids.push_back(worker_pids[3]);
78 if(
rank_ == worker_pids[0] ||
79 rank_ == worker_pids[1] ||
80 rank_ == worker_pids[2] ||
81 rank_ == worker_pids[3] ) {
89 if(
rank_ == region.master_pid || is_worker)
90 addCommGroup(region.master_pid, region.worker_pids);
104 int split_in_direction = 0;
108 for(
int dim = 0; dim < topology_.getNumDimensions(); dim++) {
109 if(region.extensions[dim] > max_ext_dir) {
110 split_in_direction = dim;
111 origin = region.origin[dim];
112 max_ext_dir = region.extensions[dim];
119 int split_at_coordinate = origin;
120 split_at_coordinate += (int)(max_ext_dir / 2.0);
128 bool continue_splitting =
true;
129 std::vector<region_t> new_regions;
133 if(
regions_.size() + new_regions.size() - removed == num_masters_)
134 continue_splitting =
false;
136 double origin = itr->origin[split_in_direction];
137 double extension = itr->extensions[split_in_direction];
138 if( continue_splitting &&
139 isSplittable(origin, split_at_coordinate, extension) ) {
145 second.
origin[split_in_direction] = split_at_coordinate;
146 second.
extensions[split_in_direction] = extension - (split_at_coordinate - origin);
148 itr->extensions[split_in_direction] = split_at_coordinate - origin;
150 new_regions.push_back(*itr);
151 new_regions.push_back(second);
156 new_regions.push_back(*itr);
164 bool isSplittable(
double origin,
double split_at_coordinate,
double extension) {
165 return (origin < split_at_coordinate &&
166 split_at_coordinate < origin + extension);
172 centroid.resize(3, 0);
174 for(
unsigned int pos=0; pos < region.
extensions.size(); pos++) {
175 int centroid_coordinate = (int)(region.
origin[pos]*1.0 + region.
extensions[pos]/2.0);
176 centroid[pos] = centroid_coordinate;
179 std::vector<int> pids;
188 if(coords_[0] == coordinate[0] &&
189 coords_[1] == coordinate[1] &&
190 coords_[2] == coordinate[2] ) {
191 pid[my_core_] =
rank_;
194 MPI_Allreduce(MPI_IN_PLACE, &pid[0], 4, MPI_INT, MPI_SUM,
comm_);
199 std::cout <<
"region: ";
200 std::cout <<
"[" << region.
origin[0] <<
", " << region.
origin[1] <<
", " << region.
origin[2] <<
"], ";
void computeCentroid(region_t ®ion)
std::vector< region_t > regions_
std::vector< int > worker_pids
bool isSplittable(double origin, double split_at_coordinate, double extension)
void splitRegionAt(int split_at_coordinate, int split_in_direction)
MPI_Comm comm_
communicator we are splitting
std::vector< int > coordinates_t
void printRegion(region_t region)
void coordinatesToPID(coordinates_t coordinate, std::vector< int > &pid)
GeometricStrategy(size_t num_masters, boost::shared_ptr< CommTopology > topology, MPI_Comm comm)
std::string::iterator iterator
virtual ~GeometricStrategy()
Defines an interface for splitter strategy implementations.
Inform & endl(Inform &inf)