File indexing completed on 2024-06-07 02:29:41
0001 #include "FWCore/Utilities/interface/thread_safety_macros.h"
0002 #include "HeterogeneousCore/CUDAUtilities/interface/EventCache.h"
0003 #include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h"
0004 #include "HeterogeneousCore/CUDAUtilities/interface/currentDevice.h"
0005 #include "HeterogeneousCore/CUDAUtilities/interface/deviceCount.h"
0006 #include "HeterogeneousCore/CUDAUtilities/interface/eventWorkHasCompleted.h"
0007 #include "HeterogeneousCore/CUDAUtilities/interface/ScopedSetDevice.h"
0008
0009 namespace cms::cuda {
0010 void EventCache::Deleter::operator()(cudaEvent_t event) const {
0011 if (device_ != -1) {
0012 ScopedSetDevice deviceGuard{device_};
0013 cudaCheck(cudaEventDestroy(event));
0014 }
0015 }
0016
0017
0018
0019 EventCache::EventCache() : cache_(deviceCount()) {}
0020
0021 SharedEventPtr EventCache::get() {
0022 const auto dev = currentDevice();
0023 auto event = makeOrGet(dev);
0024
0025 if (eventWorkHasCompleted(event.get())) {
0026 return event;
0027 }
0028
0029
0030
0031
0032
0033 std::vector<SharedEventPtr> ptrs{std::move(event)};
0034 bool completed;
0035 do {
0036 event = makeOrGet(dev);
0037 completed = eventWorkHasCompleted(event.get());
0038 if (not completed) {
0039 ptrs.emplace_back(std::move(event));
0040 }
0041 } while (not completed);
0042 return event;
0043 }
0044
0045 SharedEventPtr EventCache::makeOrGet(int dev) {
0046 return cache_[dev].makeOrGet([dev]() {
0047 cudaEvent_t event;
0048
0049
0050
0051 cudaCheck(cudaEventCreateWithFlags(&event, cudaEventDisableTiming | cudaEventBlockingSync));
0052 return std::unique_ptr<BareEvent, Deleter>(event, Deleter{dev});
0053 });
0054 }
0055
0056 void EventCache::clear() {
0057
0058
0059
0060
0061
0062 cache_.clear();
0063 cache_.resize(deviceCount());
0064 }
0065
0066 EventCache& getEventCache() {
0067
0068 CMS_THREAD_SAFE static EventCache cache;
0069 return cache;
0070 }
0071 }