Files
TheRock/rocm-systems/projects/rocprofiler-compute/therock_test_runner.py
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

208 lines
6.2 KiB
Python

#!/usr/bin/env python3
# Copyright (c) Advanced Micro Devices, Inc.
# SPDX-License-Identifier: MIT
"""Run the rocprofiler-compute project's installed CTest suite.
This runner is installed with the rocprofiler-compute test payload and executes
the CTest suite generated by that project. It is intended for CI and
super-repo test orchestration that installs the project's test component.
For custom install layouts, pass both the ROCm prefix and CTest payload path
explicitly.
"""
import argparse
import logging
import os
import shlex
import subprocess
from pathlib import Path
from typing import Dict, List, Optional
PROJECT_NAME = "rocprofiler-compute"
EXCLUDED_TESTS = [
"test_profile_live_attach_detach",
]
QUICK_TESTS = [
"test_utils",
"test_num_xcds_cli_output",
"test_num_xcds_spec_class",
"test_L1_cache_counters",
"test_analyze_workloads",
"test_analyze_commands",
"test_metric_validation",
"test_profile_iteration_multiplexing_1",
]
logging.basicConfig(level=logging.INFO)
HELP_EPILOG = f"""\
This script runs the {PROJECT_NAME} project test suite from an installed CTest
payload. In the CI/super-repo install layout, it discovers:
<rocm-prefix>/<libexecdir>/{PROJECT_NAME}/CTestTestfile.cmake
For custom install layouts, pass --ctest-dir for the top-level CTest payload
directory and --rocm-path for the ROCm install prefix used by the tests.
"""
def format_command(cmd: List[str]) -> str:
return " ".join(shlex.quote(str(arg)) for arg in cmd)
def path_from_env(name: str) -> Optional[Path]:
value = os.getenv(name)
if not value:
return None
return Path(value)
def installed_ctest_dir(script_path: Path) -> Optional[Path]:
if script_path.parent.name == PROJECT_NAME:
return script_path.parent.resolve()
return None
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description=(
f"Run the {PROJECT_NAME} project test suite from its installed "
"CTest payload."
),
epilog=HELP_EPILOG,
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument(
"--rocm-path",
type=Path,
default=path_from_env("ROCM_PATH"),
help=(
"ROCm install prefix used by the rocprofiler-compute tests. "
"Defaults to ROCM_PATH or the installed runner/payload location."
),
)
parser.add_argument(
"--ctest-dir",
"--test-dir",
dest="ctest_dir",
type=Path,
default=path_from_env("ROCPROFILER_COMPUTE_TEST_DIR"),
help=(
"Top-level installed rocprofiler-compute CTest payload directory "
"containing CTestTestfile.cmake. Defaults to "
"ROCPROFILER_COMPUTE_TEST_DIR or this runner's installed location."
),
)
return parser.parse_args()
def get_rocm_path(
script_path: Path, rocm_path: Optional[Path], ctest_dir: Optional[Path]
) -> Path:
if rocm_path is not None:
return rocm_path.resolve()
# Installed at <prefix>/<libexecdir>/rocprofiler-compute.
installed_dir = installed_ctest_dir(script_path)
if installed_dir is not None:
return installed_dir.parents[1].resolve()
if ctest_dir is not None:
resolved_ctest_dir = ctest_dir.resolve()
if resolved_ctest_dir.name == PROJECT_NAME:
return resolved_ctest_dir.parents[1].resolve()
raise RuntimeError("ROCM_PATH is required when the runner is not installed.")
def prepend_env_path(env: Dict[str, str], key: str, paths: List[Path]) -> None:
existing = env.get(key)
values = [str(path) for path in paths]
if existing:
values.append(existing)
env[key] = os.pathsep.join(values)
def rocm_lib_dirs(rocm_path: Path) -> List[Path]:
candidates = [rocm_path / "lib", rocm_path / "lib64"]
lib_dirs = [path for path in candidates if path.is_dir()]
if not lib_dirs:
raise FileNotFoundError(
f"Could not find ROCm library directory under {rocm_path}"
)
sysdeps_dirs = [
lib_dir / "rocm_sysdeps" / "lib"
for lib_dir in lib_dirs
if (lib_dir / "rocm_sysdeps" / "lib").is_dir()
]
return lib_dirs + sysdeps_dirs
def setup_env(rocm_path: Path) -> Dict[str, str]:
env = os.environ.copy()
env["ROCM_PATH"] = str(rocm_path)
# Multi-GPU CI runners inject a GPU_DEVICE_ORDINAL alongside
# HIP_VISIBLE_DEVICES via their GPU-isolation env-file. Newer HIP treats the
# mismatch as a fatal agent-visibility conflict and exposes zero GPU agents,
# so profiling collects no kernel data. HIP_VISIBLE_DEVICES supersedes it, so
# drop the ordinal. Mirrors the fix in TheRock's test_rocprofiler_sdk.py.
if env.get("HIP_VISIBLE_DEVICES"):
env.pop("GPU_DEVICE_ORDINAL", None)
prepend_env_path(env, "PATH", [rocm_path / "bin"])
prepend_env_path(
env,
"LD_LIBRARY_PATH",
rocm_lib_dirs(rocm_path),
)
return env
def build_ctest_command() -> List[str]:
shard_index = int(os.getenv("SHARD_INDEX", "1")) - 1
total_shards = int(os.getenv("TOTAL_SHARDS", "1"))
cmd = [
"ctest",
"--output-on-failure",
"--verbose",
"--exclude-regex",
"|".join(EXCLUDED_TESTS),
"--tests-information",
f"{shard_index},,{total_shards}",
]
if os.getenv("TEST_TYPE", "full") == "quick":
cmd.extend(["--tests-regex", "|".join(QUICK_TESTS)])
return cmd
def main() -> None:
args = parse_args()
script_path = Path(__file__).resolve()
rocm_path = get_rocm_path(script_path, args.rocm_path, args.ctest_dir)
ctest_dir = (
args.ctest_dir.resolve()
if args.ctest_dir is not None
else installed_ctest_dir(script_path) or rocm_path / "libexec" / PROJECT_NAME
)
ctest_file = ctest_dir / "CTestTestfile.cmake"
if not ctest_file.is_file():
raise FileNotFoundError(
f"Could not find rocprofiler-compute CTest payload: {ctest_file}"
)
env = setup_env(rocm_path)
cmd = build_ctest_command()
logging.info("++ Exec [%s]$ %s", ctest_dir, format_command(cmd))
subprocess.run(cmd, cwd=ctest_dir, check=True, env=env)
if __name__ == "__main__":
main()