blob: 59d5998ec809723ed8cd54a652b72786258b5ca6 [file]
// Copyright 2026 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef IREE_HAL_DRIVERS_AMDGPU_PROFILE_EVENTS_H_
#define IREE_HAL_DRIVERS_AMDGPU_PROFILE_EVENTS_H_
#include "iree/base/api.h"
#include "iree/base/threading/mutex.h"
#include "iree/hal/api.h"
#include "iree/hal/profile_sink.h"
#include "iree/hal/utils/profile_event_ring.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
//===----------------------------------------------------------------------===//
// iree_hal_amdgpu_profile_event_streams_t
//===----------------------------------------------------------------------===//
// Lossy fixed-capacity host-side profiling event stream.
//
// Producers append records until the stream reaches capacity. Once full, new
// records are dropped and accounted until a flush writes retained records to
// the sink and advances the read position. The stream writes a metadata-only
// TRUNCATED chunk if only dropped records are available.
typedef struct iree_hal_amdgpu_profile_event_stream_t {
// Mutex protecting positions, dropped counts, and event id allocation.
iree_slim_mutex_t mutex;
// Lossy fixed-capacity host-side event ring.
iree_hal_profile_event_ring_t ring;
} iree_hal_amdgpu_profile_event_stream_t;
// Host-side profiling event streams owned by an AMDGPU logical device.
typedef struct iree_hal_amdgpu_profile_event_streams_t {
// Memory lifecycle event stream and allocation id state.
struct {
// Lossy ring for iree_hal_profile_memory_event_t records.
iree_hal_amdgpu_profile_event_stream_t stream;
// Next nonzero allocation id assigned to profiled memory objects.
uint64_t next_allocation_id;
} memory;
// Queue operation event stream.
struct {
// Lossy ring for iree_hal_profile_queue_event_t records.
iree_hal_amdgpu_profile_event_stream_t stream;
} queue;
} iree_hal_amdgpu_profile_event_streams_t;
// Initializes stream mutexes in caller-owned zeroed storage.
void iree_hal_amdgpu_profile_event_streams_initialize(
iree_hal_amdgpu_profile_event_streams_t* streams);
// Deinitializes streams and releases all event storage.
void iree_hal_amdgpu_profile_event_streams_deinitialize(
iree_hal_amdgpu_profile_event_streams_t* streams,
iree_allocator_t host_allocator);
// Returns true when memory event storage is allocated.
bool iree_hal_amdgpu_profile_event_streams_has_memory_storage(
const iree_hal_amdgpu_profile_event_streams_t* streams);
// Returns true when queue event storage is allocated.
bool iree_hal_amdgpu_profile_event_streams_has_queue_storage(
const iree_hal_amdgpu_profile_event_streams_t* streams);
// Allocates memory event storage if not already allocated.
iree_status_t iree_hal_amdgpu_profile_event_streams_ensure_memory_storage(
iree_hal_amdgpu_profile_event_streams_t* streams,
iree_host_size_t event_capacity, iree_allocator_t host_allocator);
// Allocates queue event storage if not already allocated.
iree_status_t iree_hal_amdgpu_profile_event_streams_ensure_queue_storage(
iree_hal_amdgpu_profile_event_streams_t* streams,
iree_host_size_t event_capacity, iree_allocator_t host_allocator);
// Clears the memory event stream and resets memory event/allocation ids.
void iree_hal_amdgpu_profile_event_streams_clear_memory(
iree_hal_amdgpu_profile_event_streams_t* streams);
// Clears the queue event stream and resets queue event ids.
void iree_hal_amdgpu_profile_event_streams_clear_queue(
iree_hal_amdgpu_profile_event_streams_t* streams);
// Allocates a memory allocation id for |active_session_id|.
uint64_t iree_hal_amdgpu_profile_event_streams_allocate_memory_allocation_id(
iree_hal_amdgpu_profile_event_streams_t* streams,
uint64_t active_session_id, uint64_t* out_session_id);
// Records one memory event if |session_id| matches |active_session_id|.
bool iree_hal_amdgpu_profile_event_streams_record_memory_event(
iree_hal_amdgpu_profile_event_streams_t* streams,
uint64_t active_session_id, uint64_t session_id,
const iree_hal_profile_memory_event_t* event);
// Records one queue event.
void iree_hal_amdgpu_profile_event_streams_record_queue_event(
iree_hal_amdgpu_profile_event_streams_t* streams,
const iree_hal_profile_queue_event_t* event);
// Writes pending memory events to |sink|.
iree_status_t iree_hal_amdgpu_profile_event_streams_write_memory(
iree_hal_amdgpu_profile_event_streams_t* streams,
iree_hal_profile_sink_t* sink, uint64_t session_id,
iree_allocator_t host_allocator);
// Writes pending queue events to |sink|.
iree_status_t iree_hal_amdgpu_profile_event_streams_write_queue(
iree_hal_amdgpu_profile_event_streams_t* streams,
iree_hal_profile_sink_t* sink, uint64_t session_id,
iree_allocator_t host_allocator);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // IREE_HAL_DRIVERS_AMDGPU_PROFILE_EVENTS_H_