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();
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]));
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;
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);
181 Zoltan2::MachineRepresentation <test_scalar_t, mytest_part_t> transformed_machine(*global_tcomm, serial_problemParams);
182 int numProcs = transformed_machine.getNumRanks();
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->getLocalElementList();
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);
331 Zoltan2::MachineRepresentation <test_scalar_t, mytest_part_t> actual_machine(*global_tcomm, serial_problemParams_2);
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);
346 Zoltan2::MachineRepresentation <test_scalar_t, mytest_part_t> actual_machine(*global_tcomm, serial_problemParams_2);
348 actual_machine.getAllMachineCoordinatesView(coords);
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());
356int 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;
368 bool visualize_mapping =
false;
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;