Enable single pass counter collection (#833)

This commit is contained in:
xuchen-amd
2025-08-06 10:35:05 -04:00
committed by GitHub
parent e867524344
commit 6a77d241ed
18 changed files with 778 additions and 56 deletions
+114 -4
View File
@@ -27,13 +27,9 @@
import inspect
import os
import re
import shutil
import subprocess
import sys
import tempfile
from importlib.machinery import SourceFileLoader
from pathlib import Path
from unittest.mock import patch
import pandas as pd
import pytest
@@ -1649,3 +1645,117 @@ def test_comprehensive_error_paths():
assert False, "Should raise exception for None coll_level"
except Exception as e:
assert "coll_level can not be None" in str(e)
@pytest.mark.sets_func
class TestSetsIntegration:
def test_memory_throughput_set(self, binary_handler_profile_rocprof_compute):
options = ["--set", "mem_thruput"]
workload_dir = test_utils.get_output_dir()
binary_handler_profile_rocprof_compute(
config,
workload_dir,
options,
check_success=True,
roof=False,
)
assert test_utils.get_num_pmc_file(workload_dir) == 1
memory_metrics = ["16.1.2", "17.1.0"]
for metric_id in memory_metrics:
assert (
metric_id in open(Path(workload_dir) / "log.txt", "r").read()
), f"Expected memory metric {metric_id} not found"
test_utils.clean_output_dir(config["cleanup"], workload_dir)
def test_launch_stats_set(self, binary_handler_profile_rocprof_compute):
options = ["--set", "launch_stats"]
workload_dir = test_utils.get_output_dir()
binary_handler_profile_rocprof_compute(
config,
workload_dir,
options,
check_success=True,
roof=False,
)
assert test_utils.get_num_pmc_file(workload_dir) == 1
test_utils.clean_output_dir(config["cleanup"], workload_dir)
def test_compute_thruput_util_set(self, binary_handler_profile_rocprof_compute):
options = ["--set", "compute_thruput_util"]
workload_dir = test_utils.get_output_dir()
binary_handler_profile_rocprof_compute(
config,
workload_dir,
options,
check_success=True,
roof=False,
)
assert test_utils.get_num_pmc_file(workload_dir) == 1
test_utils.clean_output_dir(config["cleanup"], workload_dir)
def test_compute_thruput_flops_set(self, binary_handler_profile_rocprof_compute):
options = ["--set", "compute_thruput_flops"]
workload_dir = test_utils.get_output_dir()
binary_handler_profile_rocprof_compute(
config,
workload_dir,
options,
check_success=True,
roof=False,
)
assert test_utils.get_num_pmc_file(workload_dir) == 1
test_utils.clean_output_dir(config["cleanup"], workload_dir)
def test_invalid_set_error_handling(self, binary_handler_profile_rocprof_compute):
options = ["--set", "nonexistent_set"]
workload_dir = test_utils.get_output_dir()
returncode = binary_handler_profile_rocprof_compute(
config,
workload_dir,
options,
check_success=False,
roof=False,
)
assert returncode == 1
test_utils.clean_output_dir(config["cleanup"], workload_dir)
def test_set_and_block_mutual_exclusion(self, binary_handler_profile_rocprof_compute):
options = ["--set", "compute_thruput_util", "--block", "12"]
workload_dir = test_utils.get_output_dir()
returncode = binary_handler_profile_rocprof_compute(
config, workload_dir, options, check_success=False, roof=False
)
assert returncode == 1
test_utils.clean_output_dir(config["cleanup"], workload_dir)
def test_list_sets_functionality(self, binary_handler_profile_rocprof_compute):
options = ["--list-sets"]
workload_dir = test_utils.get_output_dir()
binary_handler_profile_rocprof_compute(
config,
workload_dir,
options,
check_success=False,
roof=False,
)
# workload dir should be empty
assert not os.listdir(workload_dir)
test_utils.clean_output_dir(config["cleanup"], workload_dir)
+23 -7
View File
@@ -29,7 +29,6 @@ import logging
logging.trace = lambda *args, **kwargs: None
import builtins
import glob
import inspect
import io
import json
@@ -38,16 +37,15 @@ import logging
import os
import pathlib
import re
import selectors
import shutil
import subprocess
import tempfile
from pathlib import Path
from types import SimpleNamespace
from unittest import mock
import pandas as pd
import pytest
import yaml
import utils.utils as utils
@@ -163,6 +161,16 @@ def check_csv_files(output_dir, num_devices, num_kernels):
return file_dict
def get_num_pmc_file(output_dir):
"""
Returns:
int: number of pmc perf text files in perfmon dir
"""
perfmon_path = Path(output_dir) / "perfmon"
return len([f for f in perfmon_path.iterdir() if f.is_file() and f.suffix == ".txt"])
# =============================================================================
# VERSION UTILITIES TESTS
# =============================================================================
@@ -5975,11 +5983,10 @@ def test_get_submodules_basic_functionality():
Returns:
None: Asserts function correctly lists submodules from a real package.
"""
from unittest.mock import MagicMock, patch
import utils.utils as utils_mod
mock_package = MagicMock()
mock_package = mock.MagicMock()
mock_package.__path__ = ["/fake/path"]
mock_submodules = [
@@ -5988,8 +5995,8 @@ def test_get_submodules_basic_functionality():
(None, "module_error", False),
]
with patch("importlib.import_module", return_value=mock_package):
with patch("pkgutil.walk_packages", return_value=mock_submodules):
with mock.patch("importlib.import_module", return_value=mock_package):
with mock.patch("pkgutil.walk_packages", return_value=mock_submodules):
result = utils_mod.get_submodules("test_package")
assert isinstance(result, list)
@@ -9490,3 +9497,12 @@ def test_replace_timestamps_no_other_csvs_to_update(
df_sysinfo_original = pd.read_csv(sysinfo_csv_path_str)
assert list(df_sysinfo_original["Start_Timestamp"]) == [5]
assert list(df_sysinfo_original["End_Timestamp"]) == [7]
def test_set_parser():
from utils.utils import parse_sets_yaml
result = parse_sets_yaml("gfx90a")
assert "compute_thruput_util" in result
assert result["compute_thruput_util"]["title"] == "Compute Throughput Utilization"