File indexing completed on 2026-10-20 08:45:51
0001 #pragma once
0002
0003 #include <vector>
0004
0005 #include "EventTiming.hh"
0006 #include "NP.hh"
0007
0008 namespace EventTimingProfileReport
0009 {
0010 inline constexpr const char* JUNCTURE =
0011 "EventTimingProfile__Configure,SEvt__BeginOfRun,SEvt__EndOfRun,EventTimingProfile__Configure";
0012
0013 inline constexpr const char* RANGES = R"(
0014 EventTimingProfile__Configure:CSGFoundry__Load_HEAD ## init
0015 CSGFoundry__Load_HEAD:CSGFoundry__Load_TAIL ## load_geom
0016 CSGOptiX__Create_HEAD:CSGOptiX__Create_TAIL ## upload_geom
0017 A%0.3d_QSim__simulate_HEAD:A%0.3d_QSim__simulate_LBEG ## slice_genstep
0018 A%0.3d_QSim__simulate_PRUP:A%0.3d_QSim__simulate_PREL ## upload genstep slice
0019 A%0.3d_QSim__simulate_PREL:A%0.3d_QSim__simulate_POST ## simulate slice
0020 A%0.3d_QSim__simulate_POST:A%0.3d_QSim__simulate_DOWN ## download slice
0021 A%0.3d_QSim__simulate_LEND:A%0.3d_QSim__simulate_PCAT ## concat slices
0022 A%0.3d_QSim__simulate_BRES:A%0.3d_QSim__simulate_TAIL ## save arrays
0023 )";
0024
0025 inline NP* MakeEventTimingProfileArray(
0026 const std::vector<EventTimingProfileRecord>& records)
0027 {
0028 NP* profile = NP::Make<std::int64_t>(records.size(), 4);
0029 profile->labels = new std::vector<std::string>{
0030 "wall_time_us", "steady_time_ns", "vm_kb", "rss_kb"};
0031 std::int64_t* values = profile->values<std::int64_t>();
0032 for (std::size_t index = 0; index < records.size(); ++index)
0033 {
0034 const EventTimingProfileRecord& record = records[index];
0035 values[4 * index + 0] = record.sample.wall_time_us;
0036 values[4 * index + 1] = record.sample.steady_time_ns;
0037 values[4 * index + 2] = record.sample.vm_kb;
0038 values[4 * index + 3] = record.sample.rss_kb;
0039 profile->names.push_back(record.name);
0040 }
0041 return profile;
0042 }
0043
0044 inline NP* MakeEventTimingRanges(
0045 const std::vector<EventTimingProfileRecord>& records)
0046 {
0047 std::vector<std::string> keys;
0048 std::vector<std::int64_t> steady_time_us;
0049 keys.reserve(records.size());
0050 steady_time_us.reserve(records.size());
0051 for (const EventTimingProfileRecord& record : records)
0052 {
0053 keys.push_back(record.name);
0054 steady_time_us.push_back(record.sample.steady_time_ns / 1000);
0055 }
0056 return NP::MakeMetaKVS_ranges2(keys, steady_time_us, RANGES);
0057 }
0058 }