2081 {
2082 using namespace asg::msgUserCode;
2083
2085 {
2086 auto *sysTool =
dynamic_cast<CP::ISystematicsTool*
>(&
tool);
2087 if (!sysTool)
2088 throw std::runtime_error ("tool does not support systematics");
2089 std::cout <<
"applying systematic variation: " <<
sysName << std::endl;
2090 if (sysTool->applySystematicVariation (CP::SystematicSet (sysName)).isFailure())
2091 throw std::runtime_error ("failed to apply systematic variation: " + sysName);
2092 }
2094 {
2095 auto *myTool =
dynamic_cast<ColumnarTool<ColumnarModeArray>*
>(&
tool);
2096 if (!containerRenames.empty())
2098 ColumnVectorHeader columnHeader;
2099 ToolColumnVectorMap toolWrapper (columnHeader, *myTool);
2100
2103
2104 Benchmark benchmark (name, batchSize);
2105 Benchmark benchmarkCheck (name + "(column check)", batchSize);
2106 Benchmark benchmarkEmpty ("empty");
2107
2108 const auto numberOfEvents =
tree->GetEntries();
2110 const auto startTime = std::chrono::high_resolution_clock::now();
2111 bool endLoop = false;
2112 for (; !endLoop; ++
entry)
2113 {
2114
2115
2116 benchmarkEmpty.startTimer ();
2117 benchmarkEmpty.stopTimer ();
2118
2119 ColumnVectorData columnData (&columnHeader);
2120 TestUtils::ToolWrapperData toolColumnData (&columnData, &toolWrapper);
2122 column->getEntry (entry % numberOfEvents);
2123 if ((entry + 1) % batchSize == 0)
2124 {
2125 if (entry < numberOfEvents)
2126 {
2128 column->collectColumnData ();
2129 }
2131 column->setData (toolColumnData);
2132 benchmarkCheck.startTimer ();
2133 columnData.checkData ();
2134 benchmarkCheck.stopTimer ();
2135 benchmark.startTimer ();
2136 columnData.callNoCheck (*myTool);
2137 benchmark.stopTimer ();
2140 if ((std::chrono::high_resolution_clock::now() - startTime) > targetTime)
2141 endLoop = true;
2142 } else if (entry + 1 == numberOfEvents)
2143 {
2145 column->collectColumnData ();
2146 }
2147 }
2148 std::cout << "Entries in file: " << numberOfEvents << std::endl;
2149 std::cout <<
"Total entries read: " <<
entry << std::endl;
2150 const float emptyTime = benchmarkEmpty.getEntryTime(0).value();
2151 std::cout << "Empty benchmark time: " << emptyTime << "ns" << std::endl;
2152 benchmarkEmpty.setSilence();
2153 {
2154 std::vector<TestUtils::BranchPerfData> branchPerfData;
2155 TestUtils::BranchPerfData
summary {.name =
"total", .timeRead = 0, .timeUnpack = 0, .entrySize = 0, .uncompressedSize = 0, .numBaskets = 0, .entries = std::nullopt, .nullEntries = std::nullopt};
2157 {
2158 branchPerfData.push_back (
column->getPerfData (emptyTime));
2159 summary.timeRead.value() += branchPerfData.back().timeRead.value_or(0);
2160 summary.timeUnpack.value() += branchPerfData.back().timeUnpack.value_or(0);
2161 summary.entrySize.value() += branchPerfData.back().entrySize.value_or(0);
2162 summary.uncompressedSize.value() += branchPerfData.back().uncompressedSize.value_or(0);
2163 summary.numBaskets.value() += branchPerfData.back().numBaskets.value_or(0);
2164 }
2165 std::sort (branchPerfData.begin(), branchPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name < b.name;});
2166 branchPerfData.insert (branchPerfData.end(), summary);
2167 const std::size_t nameWidth = std::max_element (branchPerfData.begin(), branchPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name.size() < b.name.size();})->name.size();
2168 std::string
header = std::format (
"{:{}} | read(ns) | unpack(ns) | size(B) | rate(MB/s) | compression | baskets | entries | null",
"branch name", nameWidth);
2169 std::cout <<
"\n" <<
header << std::endl;
2170 std::cout << std::string (
header.size(),
'-') << std::endl;
2171 for (
auto&
data : branchPerfData)
2172 {
2173 if (
data.name ==
"total")
2174 std::cout << std::string (
header.size(),
'-') << std::endl;
2175 std::cout << std::format (
"{:{}} |",
data.name, nameWidth);
2177 std::cout << std::format (
"{:>9.0f} |",
data.timeRead.value());
2178 else
2179 std::cout << " |";
2180 if (
data.timeUnpack)
2181 std::cout << std::format (
"{:>11.1f} |",
data.timeUnpack.value());
2182 else
2183 std::cout << " |";
2185 std::cout << std::format (
"{:>8.1f} |",
data.entrySize.value());
2186 else
2187 std::cout << " |";
2188 if (
data.timeRead &&
data.entrySize)
2189 std::cout << std::format (
"{:>11.1f} |", (
data.entrySize.value() / (
data.timeRead.value() * 1e-3 * 1.024 * 1.024)));
2190 else
2191 std::cout << " |";
2192 if (
data.entrySize &&
data.uncompressedSize)
2193 std::cout << std::format (
"{:>12.2f} |",
float (
data.uncompressedSize.value()) /
data.entrySize.value());
2194 else
2195 std::cout << " |";
2196 if (
data.numBaskets)
2197 std::cout << std::format (
"{:>8} |",
data.numBaskets.value());
2198 else
2199 std::cout << " |";
2201 std::cout << std::format (
"{:>8.2f} |",
static_cast<float>(
data.entries.value())/numberOfEvents);
2202 else
2203 std::cout << " |";
2204 if (
data.nullEntries &&
data.entries)
2205 std::cout << std::format (
"{:>4.0f}%",
static_cast<float>(
data.nullEntries.value()) /
data.entries.value() * 100.0f);
2206 std::cout << std::endl;
2207 }
2208 }
2209 {
2210 std::vector<TestUtils::ToolPerfData> toolPerfData;
2211 toolPerfData.emplace_back ();
2212 toolPerfData.back().name =
name;
2213 toolPerfData.back().timeCall = benchmark.getEntryTime(emptyTime);
2214 toolPerfData.back().timeCheck = benchmarkCheck.getEntryTime(emptyTime);
2215 benchmark.setSilence();
2216 benchmarkCheck.setSilence();
2217 const std::size_t nameWidth = std::max_element (toolPerfData.begin(), toolPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name.size() < b.name.size();})->name.size();
2218 std::string
header = std::format (
"{:{}} | call(ns) | check(ns)",
"tool name", nameWidth);
2219 std::cout <<
"\n" <<
header << std::endl;
2220 std::cout << std::string (
header.size(),
'-') << std::endl;
2221 for (
auto&
data : toolPerfData)
2222 {
2223 std::cout << std::format (
"{:{}} |",
data.name, nameWidth);
2225 std::cout << std::format (
"{:>9.0f} |",
data.timeCall.value());
2226 else
2227 std::cout << " |";
2229 std::cout << std::format (
"{:>10.1f}",
data.timeCheck.value());
2230 std::cout << std::endl;
2231 }
2232 }
2234 {
2235
2236#ifdef XAOD_STANDALONE
2239#else
2241#endif
2243
2244#ifdef XAOD_STANDALONE
2245 Benchmark benchmarkEmptyClear (name + " empty clear");
2246 Benchmark benchmarkCallClear (name + " call clear");
2247 Benchmark benchmarkPrepClear (name + " prep clear");
2248#endif
2249 Benchmark benchmarkCall (name + " call");
2250 Benchmark benchmarkCallCopyRecord (name + " call copy-record");
2251 Benchmark benchmarkCallRetrieve (name + " call retrieve");
2252 Benchmark benchmarkPrep (name + " prep");
2253 Benchmark benchmarkPrepCopyRecord (name + " prep copy-record");
2254 Benchmark benchmarkPrepRetrieve (name + " prep retrieve");
2255 Benchmark benchmarkGetEntry (name + " getEntry");
2256
2257 const auto numberOfEvents = event.getEntries();
2258#ifdef XAOD_STANDALONE
2259 std::cout << "known container keys:" << std::endl;
2261 {
2262 std::cout << std::format (
" {} -> 0x{:x}, 0x{:x} -> {}", container,
event.getHash (container), key,
event.getName (key)) << std::endl;
2263 }
2264#endif
2265 if (numberOfEvents == 0){
2266 throw std::runtime_error ("ColumnarPhysLiteTest: numberOfEvents == 0");
2267 }
2269
2270
2271
2272
2273
2274
2275 const auto startTime = std::chrono::high_resolution_clock::now();
2276 for (; (std::chrono::high_resolution_clock::now() -
startTime) < targetTime; ++
entry)
2277 {
2278 benchmarkGetEntry.startTimer ();
2279 event.getEntry (entry % numberOfEvents);
2280 benchmarkGetEntry.stopTimer ();
2281 benchmarkPrepRetrieve.startTimer ();
2283 benchmarkPrepRetrieve.stopTimer ();
2284 benchmarkPrepCopyRecord.startTimer ();
2285 static const std::string prepPostfix = "Prep";
2287 benchmarkPrepCopyRecord.stopTimer ();
2288 benchmarkPrep.startTimer ();
2290 benchmarkPrep.stopTimer ();
2291#ifdef XAOD_STANDALONE
2292 benchmarkPrepClear.startTimer ();
2294 benchmarkPrepClear.stopTimer ();
2295#endif
2296 benchmarkCallRetrieve.startTimer ();
2298 benchmarkCallRetrieve.stopTimer ();
2299 benchmarkCallCopyRecord.startTimer ();
2300 static const std::string callPostfix = "Call";
2302 benchmarkCallCopyRecord.stopTimer ();
2303 benchmarkCall.startTimer ();
2305 benchmarkCall.stopTimer ();
2306#ifdef XAOD_STANDALONE
2307 benchmarkCallClear.startTimer ();
2309 benchmarkCallClear.stopTimer ();
2310 benchmarkEmptyClear.startTimer ();
2312 benchmarkEmptyClear.stopTimer ();
2313#endif
2314 }
2315 std::cout <<
"Total entries read: " <<
entry << std::endl;
2316 }
2317 }
char data[hepevt_bytes_allocation_ATLAS]
static const std::unordered_map< std::string, SG::sgkey_t > knownKeys
constexpr unsigned columnarAccessMode
void renameContainers(IColumnarTool &tool, const std::vector< std::pair< std::string, std::string > > &renames)
rename containers in the columnar tool
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
std::vector< std::shared_ptr< TestUtils::IColumnData > > usedColumns
void setupColumns(ToolColumnVectorMap &toolWrapper)