Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-10-23 22:48:06

0001 // -*- C++ -*-
0002 //
0003 // Package:     PerfTools/AllocMonitor
0004 // Class  :     HistogrammingAllocMonitor
0005 //
0006 // Implementation:
0007 //     [Notes on implementation]
0008 //
0009 // Original Author:  Christopher Jones
0010 //         Created:  Mon, 21 Aug 2023 20:31:57 GMT
0011 //
0012 
0013 // system include files
0014 #include <atomic>
0015 
0016 // user include files
0017 #include "PerfTools/AllocMonitor/interface/AllocMonitorBase.h"
0018 #include "PerfTools/AllocMonitor/interface/AllocMonitorRegistry.h"
0019 #include "FWCore/ServiceRegistry/interface/ServiceRegistry.h"
0020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0021 #include "FWCore/ServiceRegistry/interface/ServiceMaker.h"
0022 
0023 namespace {
0024   class MonitorAdaptor : public cms::perftools::AllocMonitorBase {
0025   public:
0026     void allocCalled(size_t iRequested, size_t iActual, void const*) final {
0027       auto& a = allocRequested_[bin(iRequested)];
0028       a.fetch_add(1, std::memory_order_acq_rel);
0029 
0030       auto& u = allocUsed_[bin(iActual)];
0031       u.fetch_add(1, std::memory_order_acq_rel);
0032     }
0033     void deallocCalled(size_t iActual, void const*) final {
0034       auto& u = deallocUsed_[bin(iActual)];
0035       u.fetch_add(1, std::memory_order_acq_rel);
0036     }
0037 
0038     void performanceReport() const {
0039       auto log = edm::LogSystem("HistogrammingAllocMonitor");
0040       log << "Memory Histogram"
0041           << "\n   size     |           allocated     |     deallocated"
0042           << "\n            |     requested      used |        used";
0043       size_t size = 0;
0044       for (unsigned int i = 0; i < allocRequested_.size(); ++i) {
0045         log << "\n"
0046             << std::setw(12) << size << " " << std::setw(12) << allocRequested_[i] << " " << std::setw(12)
0047             << allocUsed_[i] << " " << std::setw(12) << deallocUsed_[i];
0048         if (size == 0) {
0049           size = 1;
0050         } else {
0051           size *= 2;
0052         }
0053       }
0054     }
0055 
0056   private:
0057     static size_t bin(size_t iValue) {
0058       size_t i = 0;
0059 
0060       while (iValue != 0) {
0061         ++i;
0062         iValue /= 2;
0063       }
0064       return i;
0065     };
0066 
0067     std::array<std::atomic<size_t>, 40> allocRequested_;
0068     std::array<std::atomic<size_t>, 40> allocUsed_;
0069     std::array<std::atomic<size_t>, 40> deallocUsed_;
0070   };
0071 
0072 }  // namespace
0073 
0074 class HistogrammingAllocMonitor {
0075 public:
0076   HistogrammingAllocMonitor()
0077       : adaptor_(cms::perftools::AllocMonitorRegistry::instance().createAndRegisterMonitor<MonitorAdaptor>()) {}
0078 
0079   ~HistogrammingAllocMonitor() {
0080     adaptor_->performanceReport();
0081     cms::perftools::AllocMonitorRegistry::instance().deregisterMonitor(adaptor_);
0082   }
0083 
0084   MonitorAdaptor* adaptor_;
0085 };
0086 
0087 DEFINE_FWK_SERVICE_MAKER(HistogrammingAllocMonitor, edm::serviceregistry::NoArgsMaker<HistogrammingAllocMonitor>);