Setup rocprofsys_root environment variable (#1561)

* Setup `rocprofsys_root` environment variable

* Update `CHANGELOGS`

* Fixed formatting

* Add rocpd output and validation to python tests

* Refactoring environment setup
This commit is contained in:
David Galiffi
2025-10-28 13:06:07 -04:00
zatwierdzone przez GitHub
rodzic c5bd693478
commit 3d7a5eec0e
6 zmienionych plików z 234 dodań i 4 usunięć
@@ -15,6 +15,10 @@ Full documentation for ROCm Systems Profiler is available at [https://rocm.docs.
- Improved Fortran main function detection to ensure `rocprof-sys-instrument` uses the Fortran program main function instead of the C wrapper.
### Resolved issues
- Fixed a crash when running `rocprof-sys-python` with ROCPROFSYS_USE_ROCPD enabled.
## ROCm Systems Profiler 1.2.0 for ROCm 7.1.0
### Added
@@ -24,7 +24,7 @@
from __future__ import absolute_import
__author__ = "AMD ROCm"
__copyright__ = "Copyright 2024, Advanced Micro Devices, Inc."
__copyright__ = "Copyright 2025, Advanced Micro Devices, Inc."
__license__ = "MIT"
__version__ = "@PROJECT_VERSION@"
__maintainer__ = "AMD ROCm"
@@ -36,9 +36,18 @@ This submodule imports the timemory Python function profiler
try:
import os
from pathlib import Path
os.environ["ROCPROFSYS_PATH"] = os.path.abspath(
os.path.join(os.path.dirname(__file__), "../../..")
# Set up ROCPROFSYS environment variables
rocprofsys_root = Path(__file__).resolve().parents[4]
os.environ.update(
{
"ROCPROFSYS_ROOT": str(rocprofsys_root),
"ROCPROFSYS_PATH": str(rocprofsys_root / "lib"),
"ROCPROFSYS_SCRIPT_PATH": str(
rocprofsys_root / "libexec/rocprofiler-systems"
),
}
)
from .libpyrocprofsys import coverage
@@ -0,0 +1,77 @@
{
"required_tables": [
{
"commit": "Validation rules for python-builtin tests",
"name": "top",
"required_columns": [
"total_calls",
"total_duration",
"average",
"percentage"
],
"validation_queries": [
{
"comparison": "equals",
"description": "Verify that '[run][builtin.py:31]' has a total of 5 calls.",
"error_message": "'[run][builtin.py:31]' does not have 5 total calls, as expected.",
"expected_result": 5,
"query": "SELECT total_calls FROM top WHERE name = '[run][builtin.py:31]';"
},
{
"comparison": "equals",
"description": "Verify that '[inefficient][builtin.py:17]' has a total of 5 calls.",
"error_message": "'[inefficient][builtin.py:17]' does not have 5 total calls, as expected.",
"expected_result": 5,
"query": "SELECT total_calls FROM top WHERE name = '[inefficient][builtin.py:17]';"
},
{
"comparison": "equals",
"description": "Verify that '[fib][builtin.py:13]' has a total of 445 calls.",
"error_message": "'[fib][builtin.py:13]' does not have 445 total calls, as expected.",
"expected_result": 445,
"query": "SELECT total_calls FROM top WHERE name = '[fib][builtin.py:13]';"
},
{
"comparison": "equals",
"description": "Verify that percentages sum to 100.",
"error_message": "Percentages do not sum to 100.",
"expected_result": 100,
"query": "SELECT SUM(percentage) FROM top;"
}
]
},
{
"commit": "",
"name": "regions",
"required_columns": [
"id",
"guid",
"category",
"name"
],
"validation_queries": [
{
"comparison": "equals",
"description": "Verify that '[run][builtin.py:31]' has a total of 5 calls.",
"error_message": "'[run][builtin.py:31]' does not have 5 total calls, as expected.",
"expected_result": 5,
"query": "SELECT COUNT(*) FROM regions WHERE name = '[run][builtin.py:31]';"
},
{
"comparison": "equals",
"description": "Verify that '[inefficient][builtin.py:17]' has a total of 5 calls.",
"error_message": "'[inefficient][builtin.py:17]' does not have 5 total calls, as expected.",
"expected_result": 5,
"query": "SELECT COUNT(*) FROM regions WHERE name = '[inefficient][builtin.py:17]';"
},
{
"comparison": "equals",
"description": "Verify that '[fib][builtin.py:13]' has a total of 445 calls.",
"error_message": "'[fib][builtin.py:13] does not have 445 total calls, as expected.",
"expected_result": 445,
"query": "SELECT COUNT(*) FROM regions WHERE name = '[fib][builtin.py:13]';"
}
]
}
]
}
@@ -0,0 +1,105 @@
{
"required_tables": [
{
"commit": "Validation rules for python-builtin tests",
"name": "top",
"required_columns": [
"total_calls",
"total_duration",
"average",
"percentage"
],
"validation_queries": [
{
"comparison": "equals",
"description": "Verify that 'main_loop' has a total of 5 calls.",
"error_message": "'main_loop' does not have 5 total calls, as expected.",
"expected_result": 5,
"query": "SELECT total_calls FROM top WHERE name = 'main_loop';"
},
{
"comparison": "equals",
"description": "Verify that 'run' has a total of 3 calls.",
"error_message": "'run' does not have 3 total calls, as expected.",
"expected_result": 3,
"query": "SELECT total_calls FROM top WHERE name = 'run';"
},
{
"comparison": "equals",
"description": "Verify that 'inefficient' has a total of 3 calls.",
"error_message": "'inefficient' does not have 3 total calls, as expected.",
"expected_result": 3,
"query": "SELECT total_calls FROM top WHERE name = 'inefficient';"
},
{
"comparison": "equals",
"description": "Verify that '_sum' has a total of 3 calls.",
"error_message": "'_sum' does not have 3 total calls, as expected.",
"expected_result": 3,
"query": "SELECT total_calls FROM top WHERE name = '_sum';"
},
{
"comparison": "equals",
"description": "Verify that 'fib' has a total of 3 calls.",
"error_message": "'fib' does not have 24 total calls, as expected.",
"expected_result": 24,
"query": "SELECT total_calls FROM top WHERE name = 'fib';"
},
{
"comparison": "equals",
"description": "Verify that percentages sum to 100.",
"error_message": "Percentages do not sum to 100.",
"expected_result": 100,
"query": "SELECT SUM(percentage) FROM top;"
}
]
},
{
"commit": "",
"name": "regions",
"required_columns": [
"id",
"guid",
"category",
"name"
],
"validation_queries": [
{
"comparison": "equals",
"description": "Verify that 'main_loop' has a total of 5 calls.",
"error_message": "'main_loop' does not have 5 total calls, as expected.",
"expected_result": 5,
"query": "SELECT COUNT(*) FROM regions WHERE name = 'main_loop';"
},
{
"comparison": "equals",
"description": "Verify that 'run' has a total of 3 calls.",
"error_message": "'run' does not have 3 total calls, as expected.",
"expected_result": 3,
"query": "SELECT COUNT(*) FROM regions WHERE name = 'run';"
},
{
"comparison": "equals",
"description": "Verify that 'inefficient' has a total of 3 calls.",
"error_message": "'inefficient' does not have 3 total calls, as expected.",
"expected_result": 3,
"query": "SELECT COUNT(*) FROM regions WHERE name = 'inefficient';"
},
{
"comparison": "equals",
"description": "Verify that '_sum' has a total of 3 calls.",
"error_message": "'_sum' does not have 3 total calls, as expected.",
"expected_result": 3,
"query": "SELECT COUNT(*) FROM regions WHERE name = '_sum';"
},
{
"comparison": "equals",
"description": "Verify that 'fib' has a total of 24 calls.",
"error_message": "'fib' does not have 24 total calls, as expected.",
"expected_result": 24,
"query": "SELECT COUNT(*) FROM regions WHERE name = 'fib';"
}
]
}
]
}
@@ -161,7 +161,7 @@ foreach(_VERSION ${ROCPROFSYS_PYTHON_VERSIONS})
TEST
""
"NAME;TIMEMORY_METRIC;TIMEMORY_FILE;PERFETTO_FILE"
"ARGS;PERFETTO_METRIC"
"ARGS;PERFETTO_METRIC;ROCPD_FILE;ROCPD_RULES"
${ARGN}
)
@@ -191,6 +191,27 @@ foreach(_VERSION ${ROCPROFSYS_PYTHON_VERSIONS})
"rocprof-sys-tests-output/${TEST_NAME}/${_VERSION}/${TEST_PERFETTO_FILE} validated"
ENVIRONMENT "${_python_environment}"
)
if(
${ENABLE_ROCPD_TEST}
AND ${_VALID_GPU}
AND TEST_ROCPD_FILE
AND TEST_ROCPD_RULES
)
rocprofiler_systems_add_python_test(
NAME ${TEST_NAME}-validate-rocpd
COMMAND
${_PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/validate-rocpd.py
-r ${TEST_ROCPD_RULES} -db
PYTHON_VERSION ${_VERSION}
FILE rocprof-sys-tests-output/${TEST_NAME}/${_VERSION}/${TEST_ROCPD_FILE}
DEPENDS ${TEST_NAME}-${_VERSION}
PASS_REGEX
"rocprof-sys-tests-output/${TEST_NAME}/${_VERSION}/${TEST_ROCPD_FILE} validated"
ENVIRONMENT "${_python_environment}"
LABELS "rocpd"
)
endif()
endfunction()
set(python_source_labels
@@ -237,6 +258,9 @@ foreach(_VERSION ${ROCPROFSYS_PYTHON_VERSIONS})
PERFETTO_METRIC ${python_source_categories}
ARGS -l ${python_source_labels} -c ${python_source_count} -d
${python_source_depth}
ROCPD_FILE "rocpd.db"
ROCPD_RULES
"${CMAKE_CURRENT_LIST_DIR}/rocpd-validation-rules/python/python-source-rules.json"
)
set(python_builtin_labels
@@ -290,6 +314,10 @@ foreach(_VERSION ${ROCPROFSYS_PYTHON_VERSIONS})
PERFETTO_FILE "perfetto-trace.proto"
ARGS -l ${python_builtin_labels} -c ${python_builtin_count} -d
${python_builtin_depth}
ROCPD_FILE "rocpd.db"
ROCPD_RULES
"${CMAKE_CURRENT_LIST_DIR}/rocpd-validation-rules/python/python-builtin-rules.json"
)
math(EXPR _INDEX "${_INDEX} + 1")
endforeach()
@@ -1024,7 +1024,14 @@ function(ROCPROFILER_SYSTEMS_ADD_PYTHON_TEST)
set(_TEST_FILE
${PROJECT_BINARY_DIR}/python/tests/${TEST_PYTHON_VERSION}/${_TEST_FILE}
)
if(${ENABLE_ROCPD_TEST} AND ${_VALID_GPU})
list(APPEND TEST_LABELS "rocpd")
list(APPEND TEST_ENVIRONMENT "ROCPROFSYS_USE_ROCPD=ON")
endif()
configure_file(${TEST_FILE} ${_TEST_FILE} @ONLY)
if(TEST_STANDALONE)
add_test(
NAME ${TEST_NAME}-${TEST_PYTHON_VERSION}