92b7326910
* Adding json support minor bugs Fixing tests Fixing formatting issues Fixing test test fix Misc testing fixes Use rocprofiler/cxx/name_info in rocprofiler-sdk-tool fixes to reduce the Json file size Update source/lib/rocprofiler-sdk-tool/generateJSON.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/generateJSON.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/tool.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/tool.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/helper.hpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/helper.hpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/generateJSON.hpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/generateJSON.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/generateJSON.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/tool.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/tool.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/helper.hpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/tool.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/generateJSON.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Update source/lib/rocprofiler-sdk-tool/generateJSON.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> misc fixes Removing int cast for JSON tests formatting removing a condition test on Navi3 adding debug info Misc fix * CSV updates - fix stats - numerical formatter support for customizing write_csv_entry - misc formatting - get_marker_stats_file * Misc tests/rocprofv3/counter-collection/input2 fixes - rocprofiler_configure_pytest_files in rocprofv3/counter-collection/input2 - removed state code from merge in rocprofv3/counter-collection/input2 * Tool: "Agent-id" -> "Agent_Id" - consistency * Tool update - remove rocprofiler_tool_marker_record_t - add marker_tracing_kind_conversion - fix memory leak in write_json - minor update to get_output_stream - rework handling of marker records * Update tests/pytest-packages/pytest_utils/__init__.py - add collapse_dict_list function for converting a dictionary value that is a list of length one into a directly mapped value * Update tests/rocprofv3/**/conftest.py - use collapse_dict_list when reading in JSONs * Update tests/rocprofv3/counter-collection/input1/validate.py - relax testing requirements gfx1102 (AQLProfile bugs) - in addition to relaxed testing requirements for gfx1101 * Update tests/rocprofv3/tracing/validate.py - fix removal of PID in every marker record * Update tests/rocprofv3/tracing-plus-cc - remove test design that relies on iterating subdirectories * Wrapper around __libc_start_main - Ensures finalization happens before main returns - Update tests/rocprofv3/tracing/validate.py - wrapper around __libc_start_main changed roctx calls * Combine include/rocprofiler-sdk/cxx/serialization.hpp and include/rocprofiler-sdk/external/serialization.hpp - tests/common/serialization.hpp simply includes include/rocprofiler-sdk/cxx/serialization.hpp now * Update lib/rocprofiler-sdk/hip/hip.cpp - tracing function immediately returns when fini_status is non-zero * Update lib/rocprofiler-sdk/hsa/hsa.cpp - remove logging of tracing function when fini_status is non-zero * Update lib/rocprofiler-sdk-tool/CMakeLists.txt - remove rocprofv3_trigger_list_metrics.cpp from TOOL_SOURCES * Update tests/rocprofv3/tracing-plus-cc/CMakeLists.txt - fix depends * Domain statistics * Update tests/rocprofv3/tracing-plus-cc/CMakeLists.txt - do not set ROCP_LOG_LEVEL in env * Remove erroneous <bits/utility.h> include * Restructure tool source + reduce tool table + support multiple formats - buffered_output struct for handling output - support multiple output formats, e.g. --output-format csv,json - rename buffer_type_t -> domain_type - simplified generation of CSV output files - removed rocprofiler_tool_marker_record_t * Update lib/common/container/ring_buffer.hpp - value_type alias in ring_buffer<Tp> * Remove all but one json-execute tests - generate CSV and JSON in same run * Fix include for domain_type.cpp * Update tests/rocprofv3/tracing-plus-cc/input.txt - only specify counters which can be found on gfx8, gfx9, gfx10, gfx11, etc. - use :device= syntax * Update lib/rocprofiler-sdk-tool/config.cpp - support :device=N syntax for counters file - improve stripping comments in PMC files - only read after pmc: * Rework tool library counter collection - fatal error if all requested counters for device are not found - support :device= syntax * Update tests/rocprofv3/tracing-plus-cc/input.txt - removed L2CacheHit (not supported on mi300) * Disable JSON tests in tests/rocprofv3 * Update include/rocprofiler-sdk/cxx/serialization.hpp - support rocprofiler_record_dimension_info_t * Update tool JSON schema - remove domain_type::CODE_OBJECT - rocprofiler_tool_agent_v0_t - rocprofiler_agent_v0_t + counters - rocprofiler_tool_counter_info_t - get_code_object_data() * Update JSON schema for tool * Update lib/rocprofiler-sdk-tool/tool.cpp - fix ROCP_WARNING_IF * rocprofv3 -> rocprofv3.sh - install rocprofv3.sh into sbin - configure_file <source-tree>/rocprofv3.sh -> <binary-tree>/bin/rocprofv3 * Update tool counter collection - rocprofiler_tool_record_counter_t - rocprofiler_tool_counter_collection_record_t * Update tests/rocprofv3/counter-collection/input1/CMakeLists.txt - use rocprofiler_configure_pytest_files for validate.py, conftest.py, and input.txt * Update tests/rocprofv3/counter-collection/input1/validate.py - re-enable test_validate_counter_collection_pmc1_json * Update tests/rocprofv3/counter-collection/input2/validate.py - remove unused code * Update tests/rocprofv3/counter-collection/input2/validate.py - remove unused code * Update tests/rocprofv3/hsa-queue-dependency/validate.py - re-enable JSON tests * Misc tests/rocprofv3 CMake updates * Update tests/rocprofv3/tracing/validate.py - re-enable JSON tests * Update tests/rocprofv3/tracing-hip-in-libraries/validate.py - re-enable JSON tests * Update tests/rocprofv3/tracing/validate.py - remove unused node_exists function * Update tests/rocprofv3/tracing/validate.py - fix test_marker_api_trace_json --------- Co-authored-by: Sriraksha Nagaraj <Sriraksha.Nagaraj@amd.com>
112 líneas
3.7 KiB
Python
112 líneas
3.7 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
import pytest
|
|
import numpy as np
|
|
import pandas as pd
|
|
import re
|
|
|
|
kernel_list = sorted(
|
|
["addition_kernel", "subtract_kernel", "multiply_kernel", "divide_kernel"]
|
|
)
|
|
|
|
|
|
def unique(lst):
|
|
return list(set(lst))
|
|
|
|
|
|
def test_validate_counter_collection_pmc1(input_data: pd.DataFrame):
|
|
df = input_data
|
|
|
|
assert not df.empty
|
|
assert (df["Agent_Id"].astype(int).values > 0).all()
|
|
assert (df["Queue_Id"].astype(int).values > 0).all()
|
|
assert (df["Process_Id"].astype(int).values > 0).all()
|
|
assert len(df["Kernel_Name"]) > 0
|
|
|
|
counter_collection_pmc1_kernel_list = [
|
|
x
|
|
for x in sorted(df["Kernel_Name"].unique().tolist())
|
|
if not re.search(r"__amd_rocclr_.*", x)
|
|
]
|
|
|
|
assert kernel_list == counter_collection_pmc1_kernel_list
|
|
|
|
kernel_count = dict([[itr, 0] for itr in kernel_list])
|
|
assert len(kernel_count) == len(kernel_list)
|
|
for itr in df["Kernel_Name"]:
|
|
if re.search(r"__amd_rocclr_.*", itr):
|
|
continue
|
|
kernel_count[itr] += 1
|
|
kn_cnt = [itr for _, itr in kernel_count.items()]
|
|
assert min(kn_cnt) == max(kn_cnt) and len(unique(kn_cnt)) == 1
|
|
|
|
assert len(df["Counter_Value"]) > 0
|
|
assert df["Counter_Name"].str.contains("SQ_WAVES").all()
|
|
assert (df["Counter_Value"].astype(int).values > 0).all()
|
|
|
|
di_list = df["Dispatch_Id"].astype(int).values.tolist()
|
|
di_uniq = sorted(df["Dispatch_Id"].unique().tolist())
|
|
# make sure the dispatch ids are unique and ordered
|
|
di_expect = [idx + 1 for idx in range(len(di_list))]
|
|
assert di_expect == di_uniq
|
|
|
|
|
|
def test_validate_counter_collection_pmc1_json(json_data):
|
|
data = json_data["rocprofiler-sdk-tool"]
|
|
counter_collection_data = data["callback_records"]["counter_collection"]
|
|
dispatch_ids = []
|
|
# at present, AQLProfile has bugs when reporting the counters for below architectures
|
|
skip_gfx = ("gfx1101", "gfx1102")
|
|
|
|
def get_kernel_name(kernel_id):
|
|
return data["kernel_symbols"][kernel_id]["formatted_kernel_name"]
|
|
|
|
def get_agent(agent_id):
|
|
for agent in data["agents"]:
|
|
if agent["id"]["handle"] == agent_id["handle"]:
|
|
return agent
|
|
return None
|
|
|
|
def get_counter(counter_id):
|
|
for counter in data["counters"]:
|
|
if counter["id"]["handle"] == counter_id["handle"]:
|
|
return counter
|
|
return None
|
|
|
|
for counter in counter_collection_data:
|
|
dispatch_data = counter["dispatch_data"]["dispatch_info"]
|
|
|
|
assert dispatch_data["dispatch_id"] > 0
|
|
assert dispatch_data["agent_id"]["handle"] > 0
|
|
assert dispatch_data["queue_id"]["handle"] > 0
|
|
|
|
agent = get_agent(dispatch_data["agent_id"])
|
|
kernel_name = get_kernel_name(dispatch_data["kernel_id"])
|
|
|
|
assert agent is not None
|
|
assert len(kernel_name) > 0
|
|
|
|
dispatch_ids.append(dispatch_data["dispatch_id"])
|
|
if not re.search(r"__amd_rocclr_.*", kernel_name):
|
|
for record in counter["records"]:
|
|
counter = get_counter(record["counter_id"])
|
|
assert counter is not None, f"record:\n\t{record}"
|
|
assert (
|
|
counter["name"] == "SQ_WAVES"
|
|
), f"record:\n\t{record}\ncounter:\n\t{counter}"
|
|
if agent["name"] not in skip_gfx:
|
|
assert (
|
|
record["value"] > 0
|
|
), f"record: {record}\ncounter: {counter}\nagent: {agent}"
|
|
|
|
di_uniq = list(set(sorted(dispatch_ids)))
|
|
# make sure the dispatch ids are unique and ordered
|
|
di_expect = [idx + 1 for idx in range(len(dispatch_ids))]
|
|
assert di_expect == di_uniq
|
|
|
|
|
|
if __name__ == "__main__":
|
|
exit_code = pytest.main(["-x", __file__] + sys.argv[1:])
|
|
sys.exit(exit_code)
|