File indexing completed on 2024-10-23 22:48:06
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <atomic>
0015
0016
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 }
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>);