54#ifndef OPENSWMM_ENGINE_2D_GPU_KOKKOS_PERF_COUNTERS_HPP
55#define OPENSWMM_ENGINE_2D_GPU_KOKKOS_PERF_COUNTERS_HPP
57#include <Kokkos_Core.hpp>
94using clock = std::chrono::steady_clock;
103 std::uint64_t* kID) {
104 const auto it =
g.label_id.find(name);
106 if (it ==
g.label_id.end()) {
107 id =
g.kernels.size();
108 g.label_id.emplace(name,
id);
109 g.kernels.push_back({name, 0, 0.0});
120 const double dt = std::chrono::duration<double>(
123 if (kID <
g.kernels.size()) {
125 g.kernels[kID].sec += dt;
130 std::uint64_t* handle) {
137 g.sec_fence += std::chrono::duration<double>(
138 clock::now() -
fence_t0.back()).count();
145 Kokkos_Profiling_SpaceHandle src,
const char*,
146 const void*, std::uint64_t size) {
148 const bool dst_host = std::strncmp(dst.name,
"Host", 4) == 0;
149 const bool src_host = std::strncmp(src.name,
"Host", 4) == 0;
150 if (src_host && !dst_host)
g.bytes_h2d += size;
151 else if (dst_host && !src_host)
g.bytes_d2h += size;
152 else g.bytes_same += size;
160 static const bool done = [] {
162 if (std::getenv(
"KOKKOS_TOOLS_LIBS") ||
163 std::getenv(
"KOKKOS_PROFILE_LIBRARY")) {
165 "[PERF-2D-KOKKOS] external Kokkos tool loaded; in-process "
166 "counters disabled for this run.\n");
169 namespace KTE = Kokkos::Tools::Experimental;
197 const double adv =
static_cast<double>(
g.n_advance);
199 "[PERF-2D-KOKKOS] advances=%ld launches=%ld launches_per_advance=%.1f "
200 "fences=%ld fence_s=%.4f deep_copies=%ld "
201 "h2d_bytes=%llu d2h_bytes=%llu samespace_bytes=%llu "
202 "h2d_bytes_per_advance=%.0f d2h_bytes_per_advance=%.0f\n",
203 g.n_advance,
g.n_launch,
g.n_launch / adv,
204 g.n_fence,
g.sec_fence,
g.n_deep_copy,
205 g.bytes_h2d,
g.bytes_d2h,
g.bytes_same,
206 g.bytes_h2d / adv,
g.bytes_d2h / adv);
207 std::vector<const KernelEntry*> order;
208 order.reserve(
g.kernels.size());
209 for (
const auto& k :
g.kernels) order.push_back(&k);
210 std::sort(order.begin(), order.end(),
212 return a->sec > b->sec;
216 "[PERF-2D-KOKKOS-KERNEL] name=%s n=%ld s=%.4f per_advance=%.1f\n",
217 k->label.c_str(), k->n, k->sec, k->n / adv);
bool enabled() noexcept
True when OPENSWMM_PERF is set. Cached — getenv is not free.
Definition PerfTimers.hpp:178
Definition KokkosPerfCounters.hpp:92
std::chrono::steady_clock clock
Definition KokkosPerfCounters.hpp:94
std::vector< clock::time_point > dispatch_t0
Definition KokkosPerfCounters.hpp:99
void end_dispatch(std::uint64_t kID)
Definition KokkosPerfCounters.hpp:118
void end_fence(std::uint64_t)
Definition KokkosPerfCounters.hpp:135
void begin_deep_copy(Kokkos_Profiling_SpaceHandle dst, const char *, const void *, Kokkos_Profiling_SpaceHandle src, const char *, const void *, std::uint64_t size)
Definition KokkosPerfCounters.hpp:143
std::vector< clock::time_point > fence_t0
Definition KokkosPerfCounters.hpp:100
void begin_dispatch(const char *name, std::uint32_t, std::uint64_t *kID)
Definition KokkosPerfCounters.hpp:102
void begin_fence(const char *, std::uint32_t, std::uint64_t *handle)
Definition KokkosPerfCounters.hpp:129
Definition KokkosPerfCounters.hpp:71
Counters g
Definition KokkosPerfCounters.hpp:90
void dump()
Definition KokkosPerfCounters.hpp:195
void reset()
Definition KokkosPerfCounters.hpp:184
void install()
Definition KokkosPerfCounters.hpp:159
void count_advance()
Definition KokkosPerfCounters.hpp:188
Definition KokkosPerfCounters.hpp:79
std::map< std::string, std::uint64_t > label_id
Definition KokkosPerfCounters.hpp:87
long n_advance
Definition KokkosPerfCounters.hpp:80
unsigned long long bytes_same
Definition KokkosPerfCounters.hpp:85
long n_deep_copy
Definition KokkosPerfCounters.hpp:84
long n_launch
parallel_for + reduce + scan
Definition KokkosPerfCounters.hpp:81
unsigned long long bytes_d2h
Definition KokkosPerfCounters.hpp:85
std::vector< KernelEntry > kernels
indexed by kernel id
Definition KokkosPerfCounters.hpp:86
double sec_fence
Definition KokkosPerfCounters.hpp:83
long n_fence
Definition KokkosPerfCounters.hpp:82
unsigned long long bytes_h2d
Definition KokkosPerfCounters.hpp:85
Definition KokkosPerfCounters.hpp:73
std::string label
Definition KokkosPerfCounters.hpp:74
double sec
host-side dispatch wall (== execution on OMP)
Definition KokkosPerfCounters.hpp:76
long n
launches
Definition KokkosPerfCounters.hpp:75