[SDK] Release 1.0 Public API Modifications (#277)

* Make sure all structs/enums can be forward declared

* Updates to counter collection

- consistency updates and cleanup

* Conversion of dimension information to info struct

* Added deprecated folder

* Testing changes

* merge changes

* Fix shadowed variable

* Source code formatting

* Fix shadowed variable

* Update rocprofiler_counter_info_v1_t member names

* Split version.h into version.h and ext_version.h

- ext_version.h contains external version info, e.g. ROCPROFILER_HSA_API_TABLE_MAJOR_VERSION, ROCPROFILER_HSA_RUNTIME_VERSION
- this reduces amount of recompilation after a commit since version.h gets updated with the git revision

* profile_config -> counter_config

* EOF new line

* [Samples] Reduce header includes + reorg counter collection samples

* Misc compilation fixes

- shadowed variables
- use of [[deprecated("...")]] in C code
- unused variables

* Minor misc modifications

- use common:: instead of rocprofiler::common:: when inside rocprofiler namespace
- counters.cpp
  - move local anon namespace functions into rocprofiler::counters:: anon namespace
  - use std::string_view for get_static_string
  - const ref for get_static_ptr
  - misc namespace shortening

* [Public API] rocprofiler_get_version_triplet + rocprofiler_version_triplet_t

- struct rocprofiler_version_triplet_t containing fields for the major, minor, and patch version
- public API function: rocprofiler_get_version_triplet
- define C++ operators for rocprofiler_version_triplet_t
- C++ function compute_version_triplet

* [Tests] Improve async-copy-testing test

- relax constraints
- improve logging

* Update counter_config.h doxygen docs

* ROCPROFILER_SDK_BETA_COMPAT

- ppdef which helps with renaming when set to 1

* Remove spurious include

* Fix includes for cxx/version.hpp

* Doxygen fixes for rocprofiler_get_version and rocprofiler_get_version_triplet

* Public API Experimental Designation

- ROCPROFILER_SDK_EXPERIMENTAL added to experimental function
- "(experimental)" added to doxygen @brief entries

* Fix use of assert instead of static_assert in hip/stream.cpp

* Use typedef instead of define for rocprofiler_profile_config_id_t

* Use inline rocprofiler_{create,destroy}_profile_config instead of ppdef

- added <rocprofiler-sdk/deprecated/profile_config.h>

* Doxygen for rocprofiler_{create,destroy}_profile_config

* ROCPROFILER_SDK_DEPRECATED_WARNINGS

* Temporarily comment out ROCPROFILER_SDK_DEPRECATED_WARNINGS=1

* cmake formatting

* Misc variable renaming in samples and tests

* Fix declarations of types

* Fix hip stream tracing service struct name

- rocprofiler_callback_tracing_stream_handle_data_t renamed to rocprofiler_callback_tracing_hip_stream_api_data_t

* Rename "HIP_STREAM_API" to "HIP_STREAM"

---------

Co-authored-by: Jonathan R. Madsen <jonathanrmadsen@gmail.com>
Co-authored-by: Benjamin Welton <bewelton@amd.com>
Этот коммит содержится в:
authored and GitHub committed 2025-03-24 12:07:33 +05:30
1 родитель cd4676ae6f
Коммит 4cd121e27b
127 files changed
+1629 -988

No files matched your search

+58 -13
Просмотреть файл
@@ -47,6 +47,14 @@ def get_operation(record, kind_name, op_name=None):
return None
def get_operation_name(record, kind_idx, op_idx):
for idx, itr in enumerate(record["names"]):
if idx == kind_idx:
return itr["operations"][op_idx]
return None
def test_data_structure(input_data):
"""verify minimum amount of expected data is present"""
data = input_data
@@ -418,12 +426,6 @@ def test_ancestor_ids(input_data):
len(memcopies) == num_hsa_memcopies
), "Expected number of memcopies to be same as number of async HSA (hsa_amd_memory_async_copy_on_engine) calls"
print(" > hip_memcopy_id : ", hip_memcopy_id)
print(" > has_async_memcopy_id : ", has_async_memcopy_id)
print(
" > len(hip_memcopies) : ", num_hsa_memcopies, len(hip_memcopies), len(memcopies)
)
for tid in hip_memcopies:
# We expect only 1 record with this internal id, per thread
for corr_id, records in hip_memcopies[tid].items():
@@ -469,6 +471,8 @@ def test_ancestor_ids(input_data):
def test_retired_correlation_ids(input_data):
data = input_data
sdk_data = data["rocprofiler-sdk-json-tool"]
buffer_records = sdk_data["buffer_records"]
api_name_info = {}
def _sort_dict(inp):
return dict(sorted(inp.items()))
@@ -477,8 +481,13 @@ def test_retired_correlation_ids(input_data):
for titr in ["hsa_api_traces", "marker_api_traces", "hip_api_traces"]:
for itr in sdk_data["buffer_records"][titr]:
corr_id = itr["correlation_id"]["internal"]
name = get_operation_name(buffer_records, itr["kind"], itr["operation"])
assert corr_id not in api_corr_ids.keys()
assert name is not None, f"{itr}"
api_corr_ids[corr_id] = itr
api_name_info[corr_id] = name
async_corr_ids = {}
for titr in ["kernel_dispatch", "memory_copies"]:
@@ -497,19 +506,55 @@ def test_retired_correlation_ids(input_data):
async_corr_ids = _sort_dict(async_corr_ids)
retired_corr_ids = _sort_dict(retired_corr_ids)
for cid, itr in async_corr_ids.items():
assert cid in retired_corr_ids.keys()
retired_ts = retired_corr_ids[cid]["timestamp"]
end_ts = itr["end_timestamp"]
assert (retired_ts - end_ts) > 0, f"correlation-id: {cid}, data: {itr}"
#
# verify all the correlation ids were retired
#
num_api_corr_ids = len(api_corr_ids.keys())
num_retired_corr_ids = len(retired_corr_ids.keys())
missing_retired_corr_ids = [
itr for itr in api_corr_ids.keys() if itr not in retired_corr_ids.keys()
]
# log in case of failure
sys.stderr.flush()
for itr in missing_retired_corr_ids:
name = api_name_info[itr]
info = api_corr_ids[itr]
sys.stderr.write(f"- unretired corr id: {itr} :: {name} :: {info}\n")
sys.stderr.flush()
assert (
num_api_corr_ids == num_retired_corr_ids
), f"correlation ids not retired:\n\t{missing_retired_corr_ids}"
#
# verify the retirement timestamp is >= the end timestamp of the records
#
for cid, itr in api_corr_ids.items():
assert cid in retired_corr_ids.keys()
retired_ts = retired_corr_ids[cid]["timestamp"]
end_ts = itr["end_timestamp"]
assert (retired_ts - end_ts) > 0, f"correlation-id: {cid}, data: {itr}"
name = api_name_info[cid]
assert (
retired_ts - end_ts
) >= 0, f"\n\tcorr: {cid}\n\tname: {name}\n\tdata: {itr}"
assert len(api_corr_ids.keys()) == (len(retired_corr_ids.keys()))
# allow the retired timestamp to be 10 usec earlier than async end timestamp
# since the async timestamps undergo conversion from the GPU clock domain to
# the CPU clock domain. 10 microseconds was arbitrarily chosen to be an
# acceptable amount of inaccuracy -- in an ideal world, retired_ts should
# always be >= end_ts
usec = 1000
supported_fuzzing = 10 * usec
for cid, itr in async_corr_ids.items():
assert cid in retired_corr_ids.keys()
retired_ts = retired_corr_ids[cid]["timestamp"]
end_ts = itr["end_timestamp"]
name = api_name_info[cid]
assert (
retired_ts - end_ts
) >= -supported_fuzzing, f"\n\tcorr: {cid}\n\tname: {name}\n\tdata: {itr}"
if __name__ == "__main__":
+5 -5
Просмотреть файл
@@ -610,12 +610,12 @@ set_external_correlation_id(rocprofiler_thread_id_t t
void
dispatch_callback(rocprofiler_dispatch_counting_service_data_t dispatch_data,
rocprofiler_profile_config_id_t* config,
rocprofiler_counter_config_id_t* config,
rocprofiler_user_data_t* /*user_data*/,
void* /*callback_data_args*/)
{
static std::shared_mutex m_mutex = {};
static std::unordered_map<uint64_t, rocprofiler_profile_config_id_t> profile_cache = {};
static std::unordered_map<uint64_t, rocprofiler_counter_config_id_t> profile_cache = {};
auto search_cache = [&]() {
if(auto pos = profile_cache.find(dispatch_data.dispatch_info.agent_id.handle);
@@ -692,8 +692,8 @@ dispatch_callback(rocprofiler_dispatch_counting_service_data_t dispatch_data,
}
// Create a colleciton profile for the counters
rocprofiler_profile_config_id_t profile = {.handle = 0};
ROCPROFILER_CALL(rocprofiler_create_profile_config(dispatch_data.dispatch_info.agent_id,
rocprofiler_counter_config_id_t profile = {.handle = 0};
ROCPROFILER_CALL(rocprofiler_create_counter_config(dispatch_data.dispatch_info.agent_id,
collect_counters.data(),
collect_counters.size(),
&profile),
@@ -1682,7 +1682,7 @@ tool_init(rocprofiler_client_finalize_t fini_func, void* tool_data)
"buffer tracing service for ompt configure");
ROCPROFILER_CALL(
rocprofiler_configure_buffered_dispatch_counting_service(
rocprofiler_configure_buffer_dispatch_counting_service(
counter_collection_ctx, counter_collection_buffer, dispatch_callback, nullptr),
"setup buffered service");