diff --git a/build/ag_gen b/build/ag_gen index 1051e4d..700b988 100755 Binary files a/build/ag_gen and b/build/ag_gen differ diff --git a/src/ag_gen/ag_gen.cpp b/src/ag_gen/ag_gen.cpp index 461df32..5f4bcab 100755 --- a/src/ag_gen/ag_gen.cpp +++ b/src/ag_gen/ag_gen.cpp @@ -398,15 +398,18 @@ AGGenInstance &AGGen::generate(bool batch_process, int batch_size, int numThrd, ttwo_comm = world.split(world.rank() >= send_check(world, alloc) && world.rank() <= (alloc+two_alloc)); //std::cout << "TCOMM SIZE: " << tcomm.size() << std::endl; //std::cout << "TTWO_COMM SIZE: " << ttwo_comm.size() << std::endl; - while (!localFrontier.empty() || !unex_empty() || world.iprobe(mpi::any_source, 5) || world.rank() > 0 || (world.rank() ==0 && zero_queue > 0)){//while starts + while (!localFrontier.empty() || !unex_empty() || world.rank() > 0){//while starts - if (world.rank() != 0) { + if (world.rank() == 0){ + int dummy = 1; + for (int w = 1; w < world.size(); w++){ + mpi::request dum_req = world.isend(w, 14, dummy); + dum_req.wait(); + } + } + else { //If we don't have the go-ahead, check for the Finalize message. //std::cout << "Node " << world.rank() << " is waiting for the go-ahead or finalize message." << std::endl; - if(!world.iprobe(0, 14)){ - //Let Node 0 we're waiting - world.isend(0, 12, 1); - } while(!world.iprobe(0, 14)){ if(world.iprobe(0, 15)){ mpi_exit = 1; @@ -423,7 +426,7 @@ AGGenInstance &AGGen::generate(bool batch_process, int batch_size, int numThrd, //We need to refill the localFrontier with states from the database if it's empty //TODO: Investigate if it's faster to read from DB directly into Node 0 //Or if faster to have worker node read from DB, then comm to Node 0 - if(localFrontier.empty() && world.rank() == 0 && !world.iprobe(mpi::any_source, 5) && zero_queue == 0) { + if(localFrontier.empty() && world.rank() == 0) { struct timeval t01,t02; gettimeofday(&t01,NULL); task_zero(instance, localFrontier, mem_threshold); @@ -435,23 +438,12 @@ AGGenInstance &AGGen::generate(bool batch_process, int batch_size, int numThrd, //Task 0 to Task 1 Communication if(world.rank() == 0) { - //Send at most 50 states at one time to Task 1, assuming we don't have more state data to add - //if (!world.iprobe(mpi::any_source, 5)){ - for (int f = 0; f < std::min(50, (int)localFrontier.size()); f++){ - auto current_state = localFrontier.back(); - localFrontier.pop_back(); - for(int l=0; l < alloc; l++){ - mpi::request cs_req = world.isend(send_check(world, l), 20, current_state); - cs_req.wait(); - } - //Node 0 needs to tell other nodes to continue the same number of times - int dummy = 1; - for (int w = 1; w < world.size(); w++){ - mpi::request dum_req = world.isend(w, 14, dummy); - dum_req.wait(); - } - zero_queue++; - } + auto current_state = localFrontier.back(); + localFrontier.pop_back(); + for(int l=0; l < alloc; l++){ + mpi::request cs_req = world.isend(send_check(world, l), 20, current_state); + cs_req.wait(); + } } //Execute Task 1 @@ -641,9 +633,6 @@ AGGenInstance &AGGen::generate(bool batch_process, int batch_size, int numThrd, } } - if(world.rank() == 0) - zero_queue--; - //std::cout << "Node " << world.rank() << " moving to next iter" << std::endl; } //while ends @@ -1114,13 +1103,13 @@ AGGenInstance &AGGen::single_generate(bool batch_process, int batch_num, int num f_alpha = 0.0; if (f_alpha >= (mem_threshold/2)) { - std::cout << "Frontier Alpha prior to database storing: " << f_alpha << std::endl; + //std::cout << "Frontier Alpha prior to database storing: " << f_alpha << std::endl; save_unexplored_to_db(new_state); if (!localFrontier.empty()) f_alpha = (static_cast(localFrontier.size()) * (localFrontier.back().get_size()))/tot_sys_mem; else f_alpha = 0; - std::cout << "Frontier Alpha after database storing: " << f_alpha << std::endl; + //std::cout << "Frontier Alpha after database storing: " << f_alpha << std::endl; } //Store new state in database to ensure proper ordering of the FIFO queue @@ -1134,7 +1123,7 @@ AGGenInstance &AGGen::single_generate(bool batch_process, int batch_num, int num } if (i_alpha >= mem_threshold/2){ - std::cout << "Instance Alpha prior to database storing: " << i_alpha << std::endl; + //std::cout << "Instance Alpha prior to database storing: " << i_alpha << std::endl; save_ag_to_db(instance, true); //Clear vectors and free memory @@ -1146,7 +1135,7 @@ AGGenInstance &AGGen::single_generate(bool batch_process, int batch_num, int num sizeof(instance.factbase_items) + (sizeof(instance.factbase_items[0]) * instance.factbase_items.size()) +\ sizeof(instance.edges) + (sizeof(instance.edges[0]) * instance.edges.size())); i_alpha = i_usage/tot_sys_mem; - std::cout << "Instance Alpha after database storing: " << i_alpha << std::endl; + //std::cout << "Instance Alpha after database storing: " << i_alpha << std::endl; }