File indexing completed on 2022-11-24 00:02:23
0001 #include "FWCore/Utilities/interface/EDMException.h"
0002 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDMetadata.h"
0003
0004 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0005 #ifndef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED
0006 EDMetadata::~EDMetadata() {
0007
0008
0009
0010
0011
0012
0013
0014
0015 if (event_) {
0016
0017
0018 CMS_SA_ALLOW try { alpaka::wait(*event_); } catch (...) {
0019 }
0020 }
0021 }
0022
0023 void EDMetadata::enqueueCallback(edm::WaitingTaskWithArenaHolder holder) {
0024 alpaka::enqueue(*queue_, alpaka::HostOnlyTask([holder = std::move(holder)]() {
0025
0026
0027 const_cast<edm::WaitingTaskWithArenaHolder&>(holder).doneWaiting(nullptr);
0028 }));
0029 }
0030
0031 void EDMetadata::synchronize(EDMetadata& consumer, bool tryReuseQueue) const {
0032 if (*queue_ == *consumer.queue_) {
0033 return;
0034 }
0035
0036 if (tryReuseQueue) {
0037 if (auto queue = tryReuseQueue_()) {
0038 consumer.queue_ = queue_;
0039 return;
0040 }
0041 }
0042
0043
0044 if (alpaka::getDev(*queue_) != alpaka::getDev(*consumer.queue_)) {
0045 throw edm::Exception(edm::errors::LogicError) << "Handling data from multiple devices is not yet supported";
0046 }
0047
0048 if (not alpaka::isComplete(*event_)) {
0049
0050
0051
0052
0053
0054 alpaka::wait(*consumer.queue_, *event_);
0055 }
0056 }
0057
0058 std::shared_ptr<Queue> EDMetadata::tryReuseQueue_() const {
0059 bool expected = true;
0060 if (mayReuseQueue_.compare_exchange_strong(expected, false)) {
0061
0062
0063 return queue_;
0064 }
0065 return nullptr;
0066 }
0067 #endif
0068 }