8 #include <Teuchos_RCP.hpp>
9 #include <Teuchos_Array.hpp>
10 #include <Teuchos_ParameterList.hpp>
11 #include "Teuchos_XMLParameterListHelpers.hpp"
13 #include "Tpetra_MultiVector.hpp"
14 #include <Tpetra_CrsGraph.hpp>
15 #include <Tpetra_Map.hpp>
35 typedef Tpetra::MultiVector<test_scalar_t, test_lno_t, test_gno_t, znode_t>
mytest_tMVector_t;
38 typedef Tpetra::Map<test_lno_t, test_gno_t, mytest_znode_t>
mytest_map_t;
53 char *input_binary_graph,
54 Teuchos::RCP<
const Teuchos::Comm<int> > tcomm,
56 std::vector <int> &task_communication_xadj_,
57 std::vector <int> &task_communication_adj_,
58 std::vector <double> &task_communication_adjw_){
60 int rank = tcomm->getRank();
61 using namespace Teuchos;
68 FILE *f2 = fopen(input_binary_graph,
"rb");
71 fread(&num_vertices,
sizeof(
int),1,f2);
72 fread(&num_edges,
sizeof(
int),1,f2);
74 myTasks = num_vertices;
76 std::cout <<
"numParts:" << num_vertices <<
" ne:" << num_edges << std::endl;
78 task_communication_xadj_.resize(num_vertices+1);
79 task_communication_adj_.resize(num_edges);
80 task_communication_adjw_.resize(num_edges);
82 fread((
void *)&(task_communication_xadj_[0]),
sizeof(
int),num_vertices + 1,f2);
83 fread((
void *)&(task_communication_adj_[0]),
sizeof(
int),num_edges ,f2);
84 fread((
void *)&(task_communication_adjw_[0]),
sizeof(
double),num_edges,f2);
90 tcomm->broadcast(0,
sizeof(
test_lno_t), (
char *) &myTasks);
91 tcomm->broadcast(0,
sizeof(
test_lno_t), (
char *) &myEdges);
94 task_communication_xadj_.resize(myTasks+1);
95 task_communication_adj_.resize(myEdges);
96 task_communication_adjw_.resize(myEdges);
99 tcomm->broadcast(0,
sizeof(
test_lno_t) * (myTasks+1), (
char *) &(task_communication_xadj_[0]));
100 tcomm->broadcast(0,
sizeof(
test_lno_t)* (myEdges), (
char *) &(task_communication_adj_[0]));
101 tcomm->broadcast(0,
sizeof(
test_scalar_t)* (myEdges), (
char *) &(task_communication_adjw_[0]));
104 using namespace Teuchos;
105 Teuchos::RCP<const Teuchos::Comm<int> > serial_comm = Teuchos::createSerialComm<int>();
106 RCP<const mytest_map_t> map = rcp (
new mytest_map_t (myTasks, myTasks, 0, serial_comm));
111 std::vector<test_gno_t> tmp(myEdges);
112 for (
test_lno_t lclRow = 0; lclRow < myTasks; ++lclRow) {
113 const test_gno_t gblRow = map->getGlobalElement (lclRow);
114 test_lno_t begin = task_communication_xadj_[gblRow];
115 test_lno_t end = task_communication_xadj_[gblRow + 1];
117 tmp[m - begin] = task_communication_adj_[m];
119 const ArrayView< const test_gno_t > indices(&(tmp[0]), end-begin);
120 TpetraCrsGraph->insertGlobalIndices(gblRow, indices);
122 TpetraCrsGraph->fillComplete ();
125 return TpetraCrsGraph;
130 RCP<const mytest_map_t> map,
int coord_dim,
134 Teuchos::Array<Teuchos::ArrayView<const test_scalar_t> > coordView(coord_dim);
137 for (
int i = 0; i < coord_dim; ++i){
138 Teuchos::ArrayView<const test_scalar_t> a(partCenters[i], myTasks);
143 for (
int i = 0; i < coord_dim; ++i){
144 Teuchos::ArrayView<const test_scalar_t> a;
148 RCP<mytest_tMVector_t> coords(
new mytest_tMVector_t(map, coordView.view(0, coord_dim), coord_dim));
149 RCP<const mytest_tMVector_t> const_coords = rcp_const_cast<
const mytest_tMVector_t>(coords);
156 char *input_binary_graph,
char *input_binary_coordinate,
char *input_machine_file,
157 int machine_optimization_level,
bool divide_prime_first,
int rank_per_node,
bool visualize_mapping,
int reduce_best_mapping){
159 if (input_binary_graph == NULL || input_binary_coordinate == NULL || input_machine_file == NULL){
160 throw "Binary files is mandatory";
163 Teuchos::RCP<const Teuchos::Comm<int> > serial_comm = Teuchos::createSerialComm<int>();
167 Teuchos::ParameterList serial_problemParams;
169 serial_problemParams.set(
"mapping_algorithm",
"geometric");
170 serial_problemParams.set(
"distributed_input_adapter",
false);
171 serial_problemParams.set(
"algorithm",
"multijagged");
172 serial_problemParams.set(
"Machine_Optimization_Level", machine_optimization_level);
173 serial_problemParams.set(
"Input_RCA_Machine_Coords", input_machine_file);
174 serial_problemParams.set(
"divide_prime_first", divide_prime_first);
175 serial_problemParams.set(
"ranks_per_node", rank_per_node);
176 if (reduce_best_mapping)
177 serial_problemParams.set(
"reduce_best_mapping",
true);
179 serial_problemParams.set(
"reduce_best_mapping",
false);
184 serial_problemParams.set(
"num_global_parts", numProcs);
187 env->setTimer(timer);
190 std::vector <double> task_communication_adjw_;
192 std::vector <int> task_communication_xadj_;
193 std::vector <int> task_communication_adj_;
202 task_communication_xadj_, task_communication_adj_,
203 task_communication_adjw_);
204 RCP<const mytest_map_t> serial_map = serial_tpetra_graph->getMap();
205 global_tcomm->barrier();
209 RCP<const mytest_tcrsGraph_t> const_tpetra_graph = rcp_const_cast<
const mytest_tcrsGraph_t>(serial_tpetra_graph);
212 int rank = global_tcomm->getRank();
214 int numParts = 0;
int coordDim = 0;
218 FILE *f2 = fopen(input_binary_coordinate,
"rb");
219 fread((
void *)&numParts,
sizeof(
int),1,f2);
220 fread((
void *)&coordDim,
sizeof(
int),1,f2);
224 for(
int i = 0; i < coordDim; ++i){
226 fread((
void *) partCenters[i],
sizeof(
double),numParts, f2);
231 global_tcomm->broadcast(0,
sizeof(
test_lno_t), (
char *) &numParts);
232 global_tcomm->broadcast(0,
sizeof(
test_lno_t), (
char *) &coordDim);
234 if (numParts!= myTasks){
235 throw "myTasks is different than numParts";
239 for(
int i = 0; i < coordDim; ++i){
244 for(
int i = 0; i < coordDim; ++i){
245 global_tcomm->broadcast(0,
sizeof(
test_scalar_t)* (numParts), (
char *) partCenters[i]);
249 RCP <Zoltan2::XpetraMultiVectorAdapter<mytest_tMVector_t> > serial_adapter =
create_multi_vector_adapter(serial_map, coordDim, partCenters, myTasks);
250 ia->setCoordinateInput(serial_adapter.getRawPtr());
252 ia->setEdgeWeights(&(task_communication_adjw_[0]), 1, 0);
264 global_tcomm->barrier();
286 Teuchos::ArrayView< const test_gno_t> gids = serial_map->getNodeElementList();
288 ArrayRCP<int> initial_part_ids(myTasks);
290 initial_part_ids[i] = gids[i];
292 single_phase_mapping_solution.
setParts(initial_part_ids);
300 ia.getRawPtr(), &serial_problemParams, global_tcomm, &single_phase_mapping_solution, &transformed_machine);
305 serial_map_problem.
solve(
true);
311 timer->printAndResetToZero();
319 RCP<quality_t> metricObject_3 = rcp(
320 new quality_t(ia.getRawPtr(),&serial_problemParams,serial_comm,msoln3, serial_map_problem.getMachine().getRawPtr()));
322 if (global_tcomm->getRank() == 0){
323 std::cout <<
"METRICS FOR THE SERIAL CASE - ONE PHASE MAPPING - EACH ELEMENT IS ASSUMED TO BE IN UNIQUE PART AT THE BEGINNING" << std::endl;
324 metricObject_3->printMetrics(std::cout);
326 if (machine_optimization_level > 0){
328 Teuchos::ParameterList serial_problemParams_2;
329 serial_problemParams_2.set(
"Input_RCA_Machine_Coords", input_machine_file);
333 RCP<quality_t> metricObject_4 = rcp(
334 new quality_t(ia.getRawPtr(),&serial_problemParams_2,serial_comm,msoln3, &actual_machine));
336 if (global_tcomm->getRank() == 0){
337 std::cout <<
"METRICS FOR THE SERIAL CASE - ONE PHASE MAPPING - EACH ELEMENT IS ASSUMED TO BE IN UNIQUE PART AT THE BEGINNING" << std::endl;
338 metricObject_4->printMetrics(std::cout);
342 if (visualize_mapping && global_tcomm->getRank() == 0){
344 Teuchos::ParameterList serial_problemParams_2;
345 serial_problemParams_2.set(
"Input_RCA_Machine_Coords", input_machine_file);
349 Zoltan2::visualize_mapping<zscalar_t, int> (0, actual_machine.
getMachineDim(), actual_machine.
getNumRanks(), coords,
350 int (task_communication_xadj_.size())-1, &(task_communication_xadj_[0]), &(task_communication_adj_[0]), msoln3->getPartListView());
356 int main(
int narg,
char *arg[]){
358 Tpetra::ScopeGuard tscope(&narg, &arg);
359 Teuchos::RCP<const Teuchos::Comm<int> > global_tcomm=Tpetra::getDefaultComm();
361 char *input_binary_graph = NULL;
362 char *input_binary_coordinate = NULL;
363 char *input_machine_file = NULL;
364 int machine_optimization_level = 10;
365 bool divide_prime_first =
false;
366 int rank_per_node = 1;
367 int reduce_best_mapping = 1;
369 for (
int i = 1 ; i < narg ; ++i ) {
370 if ( 0 == strcasecmp( arg[i] ,
"BG" ) ) {
372 input_binary_graph = arg[++i];
374 else if ( 0 == strcasecmp( arg[i] ,
"BC" ) ) {
375 input_binary_coordinate = arg[++i];
377 else if ( 0 == strcasecmp( arg[i] ,
"MF" ) ) {
379 input_machine_file = arg[++i];
381 else if ( 0 == strcasecmp( arg[i] ,
"OL" ) ) {
382 machine_optimization_level = atoi( arg[++i] );
384 else if ( 0 == strcasecmp( arg[i] ,
"DP" ) ) {
385 if (atoi( arg[++i] )){
386 divide_prime_first =
true;
389 else if ( 0 == strcasecmp( arg[i] ,
"RPN" ) ) {
390 rank_per_node = atoi( arg[++i] );
392 else if ( 0 == strcasecmp( arg[i] ,
"VM" ) ) {
393 visualize_mapping =
true;
395 else if ( 0 == strcasecmp( arg[i] ,
"RBM" ) ) {
396 reduce_best_mapping = atoi( arg[++i] );
399 std::cerr <<
"Unrecognized command line argument #" << i <<
": " << arg[i] << std::endl ;
408 machine_optimization_level, divide_prime_first, rank_per_node, visualize_mapping, reduce_best_mapping);
412 part_t my_parts = 0, *my_result_parts;
415 std::cout <<
"me:" << global_tcomm->getRank() <<
" my_parts:" << my_parts <<
" myTasks:" << myTasks << std::endl;
416 if (global_tcomm->getRank() == 0) {
420 FILE *f2 = fopen(
"plot.gnuplot",
"w");
421 for (
int i = 0; i< global_tcomm->getSize(); ++i){
423 sprintf(str,
"coords%d.txt", i);
425 fprintf(f2,
"splot \"%s\"\n", str);
428 fprintf(f2,
"replot \"%s\"\n", str);
431 fprintf(f2,
"pause-1\n");
435 int myrank = global_tcomm->getRank();
436 sprintf(str,
"coords%d.txt", myrank);
437 FILE *coord_files = fopen(str,
"w");
440 for (
int j = 0; j < my_parts; ++j){
441 int findex = my_result_parts[j];
442 std::cout <<
"findex " << findex << std::endl;
443 fprintf(coord_files,
"%lf %lf %lf\n", partCenters[0][findex], partCenters[1][findex], partCenters[2][findex]);
449 if (global_tcomm->getRank() == 0){
450 std::cout <<
"PASS" << std::endl;
453 catch(std::string &s){
454 std::cerr << s << std::endl;
458 std::cerr << s << std::endl;
RCP< Zoltan2::XpetraMultiVectorAdapter< mytest_tMVector_t > > create_multi_vector_adapter(RCP< const mytest_map_t > map, zscalar_t **partCenters, zgno_t myTasks)
Time an algorithm (or other entity) as a whole.
Zoltan2::XpetraCrsGraphAdapter< mytest_tcrsGraph_t, mytest_tMVector_t > mytest_adapter_t
MappingInputDistributution
Tpetra::CrsGraph< zlno_t, zgno_t, znode_t > mytest_tcrsGraph_t
void visualize_mapping(int myRank, const int machine_coord_dim, const int num_ranks, proc_coord_t **machine_coords, const v_lno_t num_tasks, const v_lno_t *task_communication_xadj, const v_lno_t *task_communication_adj, const int *task_to_rank)
PartitionMapping maps a solution or an input distribution to ranks.
int main(int narg, char *arg[])
void solve(bool updateInputData=true)
Direct the problem to create a solution.
mytest_adapter_t::part_t mytest_part_t
Provides access for Zoltan2 to Xpetra::CrsGraph data.
common code used by tests
Tpetra::Map::node_type mytest_znode_t
Tpetra::Map< zlno_t, zgno_t, mytest_znode_t > mytest_map_t
Defines the XpetraMultiVectorAdapter.
Defines XpetraCrsGraphAdapter class.
SparseMatrixAdapter_t::part_t part_t
int getMachineDim() const
returns the dimension (number of coords per node) in the machine
bool getAllMachineCoordinatesView(pcoord_t **&allCoords) const
getProcDim function set the coordinates of all ranks allCoords[i][j], i=0,...,getMachineDim(), j=0,...,getNumRanks(), is the i-th dimensional coordinate for rank j. return true if coordinates are available for all ranks
void test_serial_input_adapter(int nx, int ny, int nz, Teuchos::RCP< const Teuchos::Comm< int > > global_tcomm)
A PartitioningSolution is a solution to a partitioning problem.
Defines the EvaluatePartition class.
int getNumRanks() const
return the number of ranks.
InputTraits< User >::part_t part_t
The user parameters, debug, timing and memory profiling output objects, and error checking methods...
An adapter for Xpetra::MultiVector.
MachineRepresentation Class Base class for representing machine coordinates, networks, etc.
void setParts(ArrayRCP< part_t > &partList)
The algorithm uses setParts to set the solution.
Tpetra::MultiVector< zscalar_t, zlno_t, zgno_t, znode_t > mytest_tMVector_t
Defines the MappingSolution class.
RCP< mytest_tcrsGraph_t > create_tpetra_input_matrix(int nx, int ny, int nz, int numProcs, Teuchos::RCP< const Teuchos::Comm< int > > tcomm, RCP< Zoltan2::Environment > env, zscalar_t **&partCenters, zgno_t &myTasks)
Defines the PartitioningProblem class.
MappingProblem enables mapping of a partition (either computed or input) to MPI ranks.
A class that computes and returns quality metrics.
Declarations for TimerManager.
Defines the MappingProblem class.