Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-12-30 23:27:57

0001 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/chooseDevice.h"
0002 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDMetadataSentry.h"
0003 #include "HeterogeneousCore/AlpakaCore/interface/EventCache.h"
0004 #include "HeterogeneousCore/AlpakaCore/interface/QueueCache.h"
0005 
0006 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0007   namespace detail {
0008     EDMetadataSentry::EDMetadataSentry(edm::StreamID streamID, bool synchronize) : synchronize_(synchronize) {
0009       auto const& device = detail::chooseDevice(streamID);
0010 #ifdef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED
0011       metadata_ = std::make_shared<EDMetadata>(cms::alpakatools::getQueueCache<Queue>().get(device));
0012 #else
0013       metadata_ = std::make_shared<EDMetadata>(cms::alpakatools::getQueueCache<Queue>().get(device),
0014                                                cms::alpakatools::getEventCache<Event>().get(device));
0015 #endif
0016     }
0017 
0018     void EDMetadataSentry::finish(bool launchedAsyncWork) {
0019       if constexpr (not std::is_same_v<Queue, alpaka::Queue<Device, alpaka::Blocking>>) {
0020         if (launchedAsyncWork and synchronize_) {
0021           alpaka::wait(metadata_->queue());
0022         }
0023       }
0024 
0025       if (launchedAsyncWork and not synchronize_) {
0026         metadata_->recordEvent();
0027       } else {
0028         // If we are certain no asynchronous work was launched (i.e.
0029         // the Queue was not used in any way), or a blocking
0030         // synchronization was explicitly requested, there is no need
0031         // to synchronize later, and the Event can be discarded.
0032         metadata_->discardEvent();
0033       }
0034     }
0035   }  // namespace detail
0036 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE