Enable queue interception with scratch reporting (#1069)

* Enable queue interception with scratch reporting

Scratch reporting reports agent ID in buffer and callback records, but
HSA runtime provides only queue ID in the scratch callback.

This change enables queue interception when scratch reporting is requested

* Validation test for rocprofv3 + scratch-memory-trace

* Simplify checks for whether context is tracing a domain

* Update changelog

---------

Co-authored-by: Jonathan R. Madsen <jonathanrmadsen@gmail.com>
This commit is contained in:
Mythreya
2024-09-12 16:26:34 -07:00
committed by GitHub
parent 6098d52335
commit efbe4ea0a2
9 changed files with 181 additions and 6 deletions
+1
View File
@@ -32,3 +32,4 @@ add_subdirectory(kernel-rename)
add_subdirectory(aborted-app)
add_subdirectory(summary)
add_subdirectory(roctracer-roctx)
add_subdirectory(scratch-memory)
@@ -0,0 +1,41 @@
#
#
#
cmake_minimum_required(VERSION 3.21.0 FATAL_ERROR)
project(
rocprofiler-tests-rocprofv3-scratch-memory-tracing
LANGUAGES CXX
VERSION 0.0.0)
find_package(rocprofiler-sdk REQUIRED)
rocprofiler_configure_pytest_files(CONFIG pytest.ini COPY validate.py conftest.py)
string(REPLACE "LD_PRELOAD=" "ROCPROF_PRELOAD=" PRELOAD_ENV
"${ROCPROFILER_MEMCHECK_PRELOAD_ENV}")
set(scratch-memory-tracing-env "${PRELOAD_ENV}")
add_test(
NAME rocprofv3-test-scratch-memory-tracing-execute
COMMAND
$<TARGET_FILE:rocprofiler-sdk::rocprofv3> --scratch-memory-trace -d
${CMAKE_CURRENT_BINARY_DIR}/%tag%-trace -o out --output-format json --log-level
env -- $<TARGET_FILE:scratch-memory>)
set_tests_properties(
rocprofv3-test-scratch-memory-tracing-execute
PROPERTIES TIMEOUT 45 LABELS "integration-tests" ENVIRONMENT
"${scratch-memory-tracing-env}" FAIL_REGULAR_EXPRESSION
"threw an exception")
add_test(NAME rocprofv3-test-scratch-memory-tracing-validate
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/validate.py --input
${CMAKE_CURRENT_BINARY_DIR}/scratch-memory-trace/out_results.json)
set_tests_properties(
rocprofv3-test-scratch-memory-tracing-validate
PROPERTIES TIMEOUT 45 LABELS "integration-tests" DEPENDS
rocprofv3-test-scratch-memory-tracing-execute FAIL_REGULAR_EXPRESSION
"AssertionError")
@@ -0,0 +1,23 @@
#!/usr/bin/env python3
import json
import pytest
from rocprofiler_sdk.pytest_utils.dotdict import dotdict
from rocprofiler_sdk.pytest_utils import collapse_dict_list
def pytest_addoption(parser):
parser.addoption(
"--input",
action="store",
default="scratch-memory-tracing/out_results.json",
help="Input JSON",
)
@pytest.fixture
def input_data(request):
filename = request.config.getoption("--input")
with open(filename, "r") as inp:
return dotdict(collapse_dict_list(json.load(inp)))
@@ -0,0 +1,5 @@
[pytest]
addopts = --durations=20 -rA -s -vv
testpaths = validate.py
pythonpath = @ROCPROFILER_SDK_TESTS_BINARY_DIR@/pytest-packages
+80
View File
@@ -0,0 +1,80 @@
#!/usr/bin/env python3
import sys
import pytest
import json
from collections import defaultdict
# helper function
def node_exists(name, data, min_len=1):
assert name in data
assert data[name] is not None
if isinstance(data[name], (list, tuple, dict, set)):
assert len(data[name]) >= min_len
def get_operation(record, kind_name, op_name=None):
for idx, itr in enumerate(record["strings"]["buffer_records"]):
if kind_name == itr["kind"]:
if op_name is None:
return idx, itr["operations"]
else:
for oidx, oname in enumerate(itr["operations"]):
if op_name == oname:
return oidx
return None
def test_scratch_memory(input_data):
data = input_data["rocprofiler-sdk-tool"]
buffer_records = data["buffer_records"]
scratch_memory_data = buffer_records["scratch_memory"]
_, bf_op_names = get_operation(data, "SCRATCH_MEMORY")
assert len(bf_op_names) == 4
scratch_reported_agent_ids = set()
detected_agents_ids = set(
agent["id"]["handle"] for agent in data["agents"] if agent["type"] == 2
)
# check buffering data
for node in scratch_memory_data:
assert "size" in node
assert "kind" in node
assert "flags" in node
assert "thread_id" in node
assert "end_timestamp" in node
assert "start_timestamp" in node
assert "queue_id" in node
assert "agent_id" in node
assert "operation" in node
assert "handle" in node["queue_id"]
assert node.size > 0
assert node.thread_id > 0
assert node.agent_id.handle > 0
assert node.queue_id.handle > 0
assert node.start_timestamp > 0
assert node.end_timestamp > 0
assert node.start_timestamp < node.end_timestamp
assert data.strings.buffer_records[node.kind].kind == "SCRATCH_MEMORY"
assert (
data.strings.buffer_records[node.kind].operations[node.operation]
in bf_op_names
)
scratch_reported_agent_ids.add(node["agent_id"]["handle"])
assert 2**64 - 1 not in scratch_reported_agent_ids
assert scratch_reported_agent_ids == detected_agents_ids
if __name__ == "__main__":
exit_code = pytest.main(["-x", __file__] + sys.argv[1:])
sys.exit(exit_code)