@@ -134,11 +134,12 @@ class EmptyRankSync : public RankSync
134134 void setShutdownFlags (bool UNUSED (enter_shutdown),
135135 Simulation_impl::ShutdownMode_t UNUSED(shutdown_mode)) override {}
136136
137+ void setCkptFlag (bool UNUSED (generate_ckpt)) override {}
137138 void setFlags (bool UNUSED (enter_interactive), bool UNUSED(enter_shutdown),
138139 Simulation_impl::ShutdownMode_t UNUSED(shutdown_mode)) override {}
139140
140141 void getShutdownFlags ( bool & UNUSED (enter_shutdown), Simulation_impl::ShutdownMode_t& UNUSED(shutdown_mode)) override {}
141-
142+ void getCkptFlag ( bool & UNUSED (generate_ckpt)) override {}
142143 void getFlags ( bool & UNUSED (enter_interactive), bool& UNUSED(enter_shutdown), Simulation_impl::ShutdownMode_t& UNUSED(shutdown_mode)) override {}
143144
144145 /* * Clear interactive flags before next run */
@@ -410,13 +411,14 @@ SyncManager::exchangeLinkInfo()
410411 shutdown_mode = sim_->shutdown_mode_ ;
411412 }
412413
413- // sim_->getSimFlags(enter_interactive, enter_shutdown, shutdown_mode) checkpoint?
414+ // sim_->getSimFlags(enter_interactive, enter_shutdown, shutdown_mode, checkpoint)
414415 void
415- SyncManager::getSimFlags (bool & enter_interactive, bool & enter_shutdown, Simulation_impl::ShutdownMode_t& shutdown_mode) {
416+ SyncManager::getSimFlags (bool & enter_interactive, bool & enter_shutdown, Simulation_impl::ShutdownMode_t& shutdown_mode, bool & generate_ckpt ) {
416417
417418 // Get sim flags to exchange in threadSync
418419 enter_interactive = sim_->enter_interactive_ ;
419420 getSimShutdownFlags (enter_shutdown, shutdown_mode);
421+ generate_ckpt = checkpoint_->getCheckpoint ();
420422 }
421423
422424 void
@@ -768,6 +770,7 @@ SyncManager::execute()
768770 bool enter_interactive;
769771 bool enter_shutdown;
770772 Simulation_impl::ShutdownMode_t shutdown_mode;
773+ bool generate_ckpt;
771774
772775
773776 SimTime_t next_checkpoint_time = MAX_SIMTIME_T;
@@ -795,12 +798,13 @@ SyncManager::execute()
795798 rankSync_->setSignals (sig_end, sig_usr, sig_alrm);
796799 }
797800#if 1
798- // Get interactive and shutdown flags
801+ // Get interactive, shutdown, and checkpoint flags
799802 printf (" 0: Rank%d, Thread%d: sim_- Flags: enter_interactive %d, enter_shutdown %d, shutdown_mode %d\n " ,
800803 rank_.rank , rank_.thread , sim_->enter_interactive_ , sim_->enter_shutdown_ , sim_->shutdown_mode_ );
801- getSimFlags (enter_interactive, enter_shutdown, shutdown_mode);
804+ getSimFlags (enter_interactive, enter_shutdown, shutdown_mode, generate_ckpt );
802805 #if 1
803806 rankSync_->setFlags (enter_interactive, enter_shutdown, shutdown_mode);
807+ rankSync_->setCkptFlag (generate_ckpt);
804808 printf (" 1: Rank%d, Thread%d: Flags: enter_interactive %d, enter_shutdown %d, shutdown_mode %d\n " ,
805809 rank_.rank , rank_.thread , enter_interactive, enter_shutdown, shutdown_mode);
806810
@@ -836,7 +840,29 @@ SyncManager::execute()
836840 }
837841
838842 // Generate checkpoint if needed
843+ #if 1
844+ rankSync_->getCkptFlag (generate_ckpt);
845+ if ( generate_ckpt ) {
846+ checkpoint_->setCheckpoint ();
847+ }
839848 next_checkpoint_time = checkpoint_->check (getDeliveryTime ());
849+ #else
850+ // Check local checkpoint generate flag and set shared generate if needed.
851+ if ( checkpoint_->getCheckpoint() == true ) {
852+ ckpt_generate_.store(1);
853+ }
854+ // Ensure everyone has written the mask before updating local generate_
855+ ic_barrier_.wait();
856+ printf("2.5: Rank%d, Thread%d: ckpt_generate_ %d\n",
857+ rank_.rank, rank_.thread, ckpt_generate_.load());
858+ if ( ckpt_generate_.load() ) {
859+ checkpoint_->setCheckpoint();
860+ }
861+ next_checkpoint_time = checkpoint_->check(getDeliveryTime());
862+ ckpt_generate_.store(0);
863+
864+ //next_checkpoint_time = checkpoint_->check(getDeliveryTime());
865+ #endif
840866
841867#if 1
842868 rankSync_->getFlags (enter_interactive, enter_shutdown, shutdown_mode);
@@ -915,7 +941,7 @@ SyncManager::execute()
915941
916942 if (num_ranks_.rank == 1 ) {
917943 // Get local sim flags
918- getSimFlags (enter_interactive, enter_shutdown, shutdown_mode);
944+ getSimFlags (enter_interactive, enter_shutdown, shutdown_mode, generate_ckpt );
919945 // Each thread atomically sets shared flags in threadSync
920946 threadSync_->setFlags (enter_interactive, enter_shutdown, shutdown_mode);
921947 }
0 commit comments