void PlanCompare::MPI_Processing (void) { #ifdef MPI_EXE int i, lvalue [7], rank; if (Master ()) { Write (1); for (i=1; i < MPI_Size (); i++) { rank = Show_MPI_Message (); //---- retrieve the data buffer ---- Get_MPI_Buffer (rank); if (mpi_buffer.Size () == 0) continue; //---- retrieve the plan statistics mpi_buffer.Get_Data (lvalue, sizeof (lvalue)); plan_file->Add_Files (lvalue [0]); plan_file->Add_Records (lvalue [1]); plan_file->Add_Households (lvalue [2]); plan_file->Add_Persons (lvalue [3]); plan_file->Add_Tours (lvalue [4]); plan_file->Add_Trips (lvalue [5]); num_trips += lvalue [6]; //---- retrieve the compare statistics mpi_buffer.Get_Data (lvalue, sizeof (lvalue)); compare_file.Add_Files (lvalue [0]); compare_file.Add_Records (lvalue [1]); compare_file.Add_Households (lvalue [2]); compare_file.Add_Persons (lvalue [3]); compare_file.Add_Tours (lvalue [4]); compare_file.Add_Trips (lvalue [5]); num_compare += lvalue [6]; //---- selection map data ---- selected.UnPack (mpi_buffer); //---- time difference data ---- if (time_diff.Active_Flag ()) { Difference_Data temp; temp.Replicate (time_diff); temp.UnPack (mpi_buffer); time_diff.Merge_Data (temp); } //---- cost difference data ---- if (cost_diff.Active_Flag ()) { Difference_Data temp; temp.Replicate (cost_diff); temp.UnPack (mpi_buffer); cost_diff.Merge_Data (temp); } //---- time gap data ---- if (time_gap.Active_Flag ()) { Trip_Gap_Data temp; temp.Replicate (time_gap); temp.UnPack (mpi_buffer); time_gap.Merge_Data (temp); } //---- cost gap data ---- if (cost_gap.Active_Flag ()) { Trip_Gap_Data temp; temp.Replicate (cost_gap); temp.UnPack (mpi_buffer); cost_gap.Merge_Data (temp); } } Show_Message (1); plan_file->Close (); compare_file.Close (); } else { //---- slave ---- if (Partition_Range ()) { Send_MPI_Message (String ("Slave %d Read %ss %d..%d") % MPI_Rank () % plan_file->File_Type () % First_Partition () % Last_Partition ()); } else { Send_MPI_Message (String ("Slave %d Read %s %d") % MPI_Rank () % plan_file->File_Type () % First_Partition ()); } //---- send plan statistics ---- lvalue [0] = plan_file->Num_Files (); lvalue [1] = plan_file->Num_Records (); lvalue [2] = plan_file->Num_Households (); lvalue [3] = plan_file->Num_Persons (); lvalue [4] = plan_file->Num_Tours (); lvalue [5] = plan_file->Num_Trips (); lvalue [6] = num_trips; plan_file->Close (); mpi_buffer.Data (lvalue, sizeof (lvalue)); //---- send compare statistics ---- lvalue [0] = compare_file.Num_Files (); lvalue [1] = compare_file.Num_Records (); lvalue [2] = compare_file.Num_Households (); lvalue [3] = compare_file.Num_Persons (); lvalue [4] = compare_file.Num_Tours (); lvalue [5] = compare_file.Num_Trips (); lvalue [6] = num_compare; compare_file.Close (); mpi_buffer.Add_Data (lvalue, sizeof (lvalue)); //---- selection map data ---- selected.Pack (mpi_buffer); //---- time difference data ---- if (time_diff.Active_Flag ()) { time_diff.Pack (mpi_buffer); } //---- cost difference data ---- if (cost_diff.Active_Flag ()) { cost_diff.Pack (mpi_buffer); } //---- time gap data ---- if (time_gap.Active_Flag ()) { time_gap.Pack (mpi_buffer); } //---- cost gap data ---- if (cost_gap.Active_Flag ()) { cost_gap.Pack (mpi_buffer); } //---- send the data buffer ---- Send_MPI_Buffer (); if (!new_plan_flag && !select_parts) Exit_Stat (DONE); } #endif }
void TripPrep::MPI_Setup (void) { #ifdef MPI_EXE if (MPI_Size () == 1) return; int range [2]; if (Master ()) { int num_parts, rank; Db_File temp_file; String key, dir; Integers count; Int_Itr itr; Int_RItr ritr; dir = Get_Control_String (PROJECT_DIRECTORY); if (!dir.empty ()) { Fix_Directory (dir); } key = Get_Control_String (System_File_ID (TRIP)); temp_file.Filename (dir + key); num_parts = temp_file.Num_Parts (); if (num_parts < 2) return; Write (1, "Number of MPI Processors = ") << MPI_Size (); Write (1, "Number of Trip Partitions = ") << num_parts; Write (1); count.assign (MPI_Size (), 0); for (itr = count.begin (); itr != count.end (); itr++) { (*itr)++; if (--num_parts == 0) break; } while (num_parts > 0) { for (ritr = count.rbegin (); ritr != count.rend (); ritr++) { (*ritr)++; if (--num_parts == 0) break; } } num_parts = 0; for (rank=0, itr = count.begin (); itr != count.end (); itr++, rank++) { range [0] = num_parts; num_parts += *itr; range [1] = num_parts - 1; if (rank == 0) { First_Partition (range [0]); Last_Partition (range [1]); } else { Send_MPI_Array (range, 2, rank); } } } else { //---- slave ---- Get_MPI_Array (range, 2, 0); First_Partition (range [0]); Last_Partition (range [1]); } #endif }
void PlanCompare::MPI_Close (void) { #ifdef MPI_EXE int i, lvalue [6], rank; if (Master ()) { if (new_plan_flag) { Show_Message (1); for (i=1; i < MPI_Size (); i++) { rank = Show_MPI_Message (); //---- retrieve the new plan statistics Get_MPI_Array (lvalue, 6, rank); new_plan_file->Add_Files (lvalue [0]); new_plan_file->Add_Records (lvalue [1]); new_plan_file->Add_Households (lvalue [2]); new_plan_file->Add_Persons (lvalue [3]); new_plan_file->Add_Tours (lvalue [4]); new_plan_file->Add_Trips (lvalue [5]); } new_plan_file->Close (); } //---- write the new selection file ---- if (select_parts) { Show_Message (1); select_map.swap (selected); Write_Selections (); for (i=1; i < MPI_Size (); i++) { Show_MPI_Message (); } } Show_Message (1); } else { //---- slave ---- if (new_plan_flag) { if (Partition_Range ()) { Send_MPI_Message (String ("Slave %d Wrote %ss %d..%d") % MPI_Rank () % new_plan_file->File_Type () % First_Partition () % Last_Partition ()); } else { Send_MPI_Message (String ("Slave %d Wrote %s %d") % MPI_Rank () % new_plan_file->File_Type () % First_Partition ()); } //---- send new plan statistics ---- lvalue [0] = new_plan_file->Num_Files (); lvalue [1] = new_plan_file->Num_Records (); lvalue [2] = new_plan_file->Num_Households (); lvalue [3] = new_plan_file->Num_Persons (); lvalue [4] = new_plan_file->Num_Tours (); lvalue [5] = new_plan_file->Num_Trips (); new_plan_file->Close (); Send_MPI_Array (lvalue, 6); } //---- write the new selection file ---- if (select_parts) { select_map.swap (selected); Write_Selections (); Selection_File *file = System_Selection_File (true); if (Partition_Range ()) { Send_MPI_Message (String ("Slave %d Wrote %ss %d..%d") % MPI_Rank () % file->File_Type () % First_Partition () % Last_Partition ()); } else { Send_MPI_Message (String ("Slave %d Wrote %s %d") % MPI_Rank () % file->File_Type () % First_Partition ()); } } Exit_Stat (DONE); } #endif }