9 #include <initializer_list>
18 #include <string_view>
22 #include <rapidsmpf/config.hpp>
23 #include <rapidsmpf/memory/memory_type.hpp>
24 #include <rapidsmpf/memory/pinned_memory_resource.hpp>
25 #include <rapidsmpf/memory/resource_types.hpp>
26 #include <rapidsmpf/rmm_resource_adaptor.hpp>
27 #include <rapidsmpf/utils/misc.hpp>
31 class StreamOrderedTiming;
151 return enabled_.load(std::memory_order_acquire);
158 enabled_.store(
true, std::memory_order_release);
165 enabled_.store(
false, std::memory_order_release);
181 std::optional<any_device_resource>
mr = std::nullopt;
184 std::optional<any_host_device_resource>
pinned_mr = std::nullopt;
237 void write_json(std::filesystem::path
const& filepath)
const;
246 [[nodiscard]] std::shared_ptr<Statistics>
copy()
const;
255 [[nodiscard]] std::vector<std::uint8_t>
serialize()
const;
267 std::span<std::uint8_t const> data
291 [[nodiscard]]
static std::shared_ptr<Statistics>
merge(
292 std::span<std::shared_ptr<Statistics>
const> stats
338 [[nodiscard]] std::size_t
count() const noexcept;
345 [[nodiscard]]
double value() const noexcept;
353 [[nodiscard]]
double max() const noexcept;
364 return sizeof(std::uint64_t) +
sizeof(
double) +
sizeof(double);
385 [[nodiscard]]
static std::pair<Stat, std::span<std::uint8_t const>>
deserialize(
386 std::span<std::uint8_t const> data
400 std::size_t count_{0};
402 double max_{-std::numeric_limits<double>::infinity()};
423 void add_stat(std::string
const& name,
double value);
442 std::string
const& report_entry_name,
443 std::initializer_list<std::string_view> stat_names,
455 std::string
const& report_entry_name,
456 std::vector<std::string> stat_names,
592 std::optional<RmmResourceAdaptor>
608 std::optional<any_device_resource> mr, std::string name
623 std::vector<std::string> stat_names;
627 mutable std::mutex mutex_;
628 std::atomic<bool> enabled_;
629 std::map<std::string, Stat> stats_;
630 std::map<std::string, ReportEntry> report_entries_;
631 std::unordered_map<std::string, MemoryRecord> memory_records_;
660 #define RAPIDSMPF_MEMORY_PROFILE_PICK_(_1, _2, _3, NAME, ...) NAME
661 #define RAPIDSMPF_MEMORY_PROFILE(...) \
662 RAPIDSMPF_MEMORY_PROFILE_PICK_( \
663 __VA_ARGS__, RAPIDSMPF_MEMORY_PROFILE_3, RAPIDSMPF_MEMORY_PROFILE_2, ~ \
668 #define RAPIDSMPF_MEMORY_PROFILE_2(stats, mr) \
669 RAPIDSMPF_MEMORY_PROFILE_3(stats, mr, __func__)
672 #define RAPIDSMPF_MEMORY_PROFILE_3(stats, mr, funcname) \
673 auto&& RAPIDSMPF_CONCAT(_rapidsmpf_stats_, __LINE__) = (stats); \
674 auto const RAPIDSMPF_CONCAT(_rapidsmpf_memory_recorder_, __LINE__) = \
675 (rapidsmpf::detail::to_pointer(RAPIDSMPF_CONCAT(_rapidsmpf_stats_, __LINE__))) \
676 ? rapidsmpf::detail::to_pointer( \
677 RAPIDSMPF_CONCAT(_rapidsmpf_stats_, __LINE__) \
679 -> create_memory_recorder( \
681 std::string(__FILE__) + ":" + RAPIDSMPF_STRINGIFY(__LINE__) + "(" \
682 + std::string(funcname) + ")" \
684 : rapidsmpf::Statistics::MemoryRecorder {}
A RMM memory resource adaptor tailored to RapidsMPF.
RAII-style object for scoped memory usage tracking.
MemoryRecorder(MemoryRecorder const &)=delete
Deleted copy and move constructors/assignments.
~MemoryRecorder()
Destructor.
MemoryRecorder()=default
Constructs a no-op MemoryRecorder (disabled state).
MemoryRecorder(Statistics *stats, RmmResourceAdaptor mr, std::string name)
Constructs an active MemoryRecorder.
Represents a single tracked statistic.
void add(double value)
Adds a value to this statistic.
std::size_t count() const noexcept
Returns the number of updates applied to this statistic.
double max() const noexcept
Returns the maximum value seen across all add() calls.
std::uint8_t * serialize(std::uint8_t *out) const
Serializes this Stat to a byte buffer.
Stat merge(Stat const &other) const
Merges another Stat into this one, returning the combined result.
Stat(std::size_t count, double value, double max)
Constructs a Stat with explicit field values.
double value() const noexcept
Returns the total accumulated value.
auto operator<=>(Stat const &) const noexcept=default
Three-way comparison operator.
static std::pair< Stat, std::span< std::uint8_t const > > deserialize(std::span< std::uint8_t const > data)
Deserializes a Stat from a byte buffer.
Stat()=default
Default-constructs a Stat.
static constexpr std::size_t serialized_size() noexcept
Returns the serialized size of this Stat in bytes.
Tracks statistics across rapidsmpf operations.
static std::shared_ptr< Statistics > from_options(config::Options options)
Construct from configuration options.
Formatter
Identifies a predefined formatter used by report().
@ _Count
Sentinel; must remain last.
Stat get_stat(std::string const &name) const
Retrieves a statistic by name.
void clear()
Clears all statistics.
static std::shared_ptr< Statistics > disabled()
Returns a shared pointer to a disabled (no-op) Statistics instance.
void write_json(std::ostream &os) const
Writes a JSON representation of all collected statistics to a stream.
std::shared_ptr< Statistics > copy() const
Creates a deep copy of this Statistics object.
void add_bytes_stat(std::string const &name, std::size_t nbytes)
Adds a byte count to the named statistic.
std::string report() const
Overload with all-default options. Equivalent to report(ReportArgs{}).
void enable() noexcept
Enable statistics tracking for this instance.
void record_alloc(MemoryType mem_type, std::size_t nbytes, StreamOrderedTiming &&timing)
Record size and wall-clock duration for a buffer allocation.
void add_duration_stat(std::string const &name, Duration seconds)
Adds a duration to the named statistic.
MemoryRecorder create_memory_recorder(std::optional< any_device_resource > mr, std::string name)
Creates a scoped memory recorder for the given name.
void add_report_entry(std::string const &report_entry_name, std::vector< std::string > stat_names, Formatter formatter)
Associate a formatter with one or more named statistics for report rendering.
std::vector< std::string > list_stat_names() const
Get the names of all statistics.
Statistics(bool enabled=true)
Constructs a Statistics object without memory profiling.
void add_stat(std::string const &name, double value)
Adds a numeric value to the named statistic.
static std::shared_ptr< Statistics > merge(std::span< std::shared_ptr< Statistics > const > stats)
Merge a set of Statistics into a new instance.
std::vector< std::uint8_t > serialize() const
Serializes the stats and report entries to a binary byte vector.
void record_copy(MemoryType src, MemoryType dst, std::size_t nbytes, StreamOrderedTiming &&timing)
Record byte count and wall-clock duration for a memory copy operation.
bool enabled() const noexcept
Checks if statistics tracking is enabled.
std::string report(ReportArgs report_args) const
Generates a formatted report of all collected statistics.
void write_json(std::filesystem::path const &filepath) const
Writes a JSON report of all collected statistics to a file.
static std::shared_ptr< Statistics > deserialize(std::span< std::uint8_t const > data)
Deserializes a Statistics object from a binary byte vector.
void disable() noexcept
Disable statistics tracking for this instance.
void add_report_entry(std::string const &report_entry_name, std::initializer_list< std::string_view > stat_names, Formatter formatter)
Associate a formatter with one or more named statistics for report rendering.
std::unordered_map< std::string, MemoryRecord > const & get_memory_records() const
Retrieves all memory profiling records stored by this instance.
Stream-ordered wall-clock timer that records its result into Statistics.
Manages configuration options for RapidsMPF operations.
RAPIDS Multi-Processor interfaces.
std::chrono::duration< double > Duration
Alias for a duration type representing time in seconds as a double.
MemoryType
Enum representing the type of memory sorted in decreasing order of preference.
Memory statistics for a specific scope.
Holds memory profiling information for a named scope.
std::int64_t global_peak
Peak global memory usage during the scope.
ScopedMemoryRecord scoped
Scoped memory stats.
std::uint64_t num_calls
Number of times the scope was invoked.
Named-argument struct for report().
std::optional< any_device_resource > mr
std::string_view header
Header line prepended to the report.
std::optional< any_host_device_resource > pinned_mr