@@ -669,28 +669,46 @@ bool SstReader::VariableMinMax(const VariableBase &Var, const size_t Step, MinMa
669
669
return m_BP5Deserializer->VariableMinMax (Var, Step, MinMax);
670
670
}
671
671
672
+ void *SstReader::performDeferredReadRemoteMemory (DeferredReadRemoteMemory const ¶ms)
673
+ {
674
+ return SstReadRemoteMemory (m_Input, params.rank , CurrentStep (), params.payloadStart ,
675
+ params.payloadSize , params.buffer , params.dp_info );
676
+ }
677
+
678
+ constexpr static size_t BATCH_SIZE = 10 ;
679
+
672
680
void SstReader::BP5PerformGets ()
673
681
{
674
682
size_t maxReadSize;
675
683
auto ReadRequests = m_BP5Deserializer->GenerateReadRequests (true , &maxReadSize);
676
684
std::vector<void *> sstReadHandlers;
677
- for (const auto &Req : ReadRequests)
685
+
686
+ auto iterator = ReadRequests.cbegin ();
687
+ auto end = ReadRequests.cend ();
688
+ while (iterator != end)
678
689
{
679
- void *dp_info = NULL ;
680
- if (m_CurrentStepMetaData->DP_TimestepInfo )
690
+ sstReadHandlers.clear ();
691
+ size_t counter = 0 ;
692
+ for (; counter < BATCH_SIZE && iterator != end; ++iterator, ++counter)
681
693
{
682
- dp_info = m_CurrentStepMetaData->DP_TimestepInfo [Req.WriterRank ];
694
+ auto const &Req = *iterator;
695
+
696
+ void *dp_info = NULL ;
697
+ if (m_CurrentStepMetaData->DP_TimestepInfo )
698
+ {
699
+ dp_info = m_CurrentStepMetaData->DP_TimestepInfo [Req.WriterRank ];
700
+ }
701
+ auto ret = SstReadRemoteMemory (m_Input, Req.WriterRank , Req.Timestep , Req.StartOffset ,
702
+ Req.ReadLength , Req.DestinationAddr , dp_info);
703
+ sstReadHandlers.push_back (ret);
683
704
}
684
- auto ret = SstReadRemoteMemory (m_Input, Req.WriterRank , Req.Timestep , Req.StartOffset ,
685
- Req.ReadLength , Req.DestinationAddr , dp_info);
686
- sstReadHandlers.push_back (ret);
687
- }
688
- for (const auto &i : sstReadHandlers)
689
- {
690
- if (SstWaitForCompletion (m_Input, i) != SstSuccess)
705
+ for (const auto &i : sstReadHandlers)
691
706
{
692
- helper::Throw<std::runtime_error>(" Engine" , " SstReader" , " BP5PerformGets" ,
693
- " Writer failed before returning data" );
707
+ if (SstWaitForCompletion (m_Input, i) != SstSuccess)
708
+ {
709
+ helper::Throw<std::runtime_error>(" Engine" , " SstReader" , " BP5PerformGets" ,
710
+ " Writer failed before returning data" );
711
+ }
694
712
}
695
713
}
696
714
@@ -709,7 +727,7 @@ void SstReader::PerformGets()
709
727
}
710
728
else if (m_WriterMarshalMethod == SstMarshalBP)
711
729
{
712
- std::vector<void * > sstReadHandlers;
730
+ std::vector<DeferredReadRemoteMemory > sstReadHandlers;
713
731
std::vector<std::vector<char >> buffers;
714
732
size_t iter = 0 ;
715
733
@@ -738,13 +756,26 @@ void SstReader::PerformGets()
738
756
ADIOS2_FOREACH_STDTYPE_1ARG (declare_type)
739
757
#undef declare_type
740
758
}
741
- // wait for all SstRead requests to finish
742
- for (const auto &i : sstReadHandlers)
759
+ // run read requests in batches and wait for them to finish
760
+ auto iterator = sstReadHandlers.cbegin ();
761
+ auto end = sstReadHandlers.cend ();
762
+ std::vector<void *> enqueuedHandlers;
763
+ enqueuedHandlers.reserve (BATCH_SIZE);
764
+ while (iterator != end)
743
765
{
744
- if (SstWaitForCompletion (m_Input, i) != SstSuccess)
766
+ size_t counter = 0 ;
767
+ enqueuedHandlers.clear ();
768
+ for (; counter < BATCH_SIZE && iterator != end; ++iterator, ++counter)
745
769
{
746
- helper::Throw<std::runtime_error>(" Engine" , " SstReader" , " PerformGets" ,
747
- " Writer failed before returning data" );
770
+ enqueuedHandlers.push_back (performDeferredReadRemoteMemory (*iterator));
771
+ }
772
+ for (const auto &i : enqueuedHandlers)
773
+ {
774
+ if (SstWaitForCompletion (m_Input, i) != SstSuccess)
775
+ {
776
+ helper::Throw<std::runtime_error>(" Engine" , " SstReader" , " PerformGets" ,
777
+ " Writer failed before returning data" );
778
+ }
748
779
}
749
780
}
750
781
0 commit comments