Files
TheRock/tests/test_rocm_sanity.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

161 lines
5.7 KiB
Python

# Copyright Advanced Micro Devices, Inc.
# SPDX-License-Identifier: MIT
from pathlib import Path
from pytest_check import check
import logging
import os
import platform
import pytest
import re
import shlex
import subprocess
import sys
THIS_DIR = Path(__file__).resolve().parent
logger = logging.getLogger(__name__)
THEROCK_BIN_DIR = Path(os.getenv("THEROCK_BIN_DIR")).resolve()
AMDGPU_FAMILIES = os.getenv("AMDGPU_FAMILIES")
# Importing is_asan from amdgpu_family_matrix.py
sys.path.append(str(THIS_DIR.parent / "build_tools" / "github_actions"))
from amdgpu_family_matrix import is_asan
def is_windows():
return "windows" == platform.system().lower()
def run_command(command: list[str], cwd=None):
logger.info(f"++ Run [{cwd}]$ {shlex.join(command)}")
process = subprocess.run(
command, capture_output=True, cwd=cwd, shell=is_windows(), text=True
)
if process.returncode != 0:
logger.error(f"Command failed!")
logger.error("command stdout:")
for line in process.stdout.splitlines():
logger.error(line)
logger.error("command stderr:")
for line in process.stderr.splitlines():
logger.error(line)
raise Exception(f"Command failed: `{shlex.join(command)}`, see output above")
return process
@pytest.fixture(scope="session")
def rocm_info_output():
try:
return str(run_command([f"{THEROCK_BIN_DIR}/rocminfo"]).stdout)
except Exception as e:
logger.info(str(e))
return None
class TestROCmSanity:
@pytest.mark.skipif(is_windows(), reason="rocminfo is not supported on Windows")
# TODO(#3312): Re-enable once rocminfo test is fixed for ASAN builds
@pytest.mark.skipif(
is_asan(), reason="rocminfo test fails with ASAN build, see TheRock#3312"
)
@pytest.mark.parametrize(
"to_search",
[
(r"Device\s*Type:\s*GPU"),
(r"Name:\s*gfx"),
(r"Vendor\s*Name:\s*AMD"),
],
ids=[
"rocminfo - GPU Device Type Search",
"rocminfo - GFX Name Search",
"rocminfo - AMD Vendor Name Search",
],
)
def test_rocm_output(self, rocm_info_output, to_search):
if not rocm_info_output:
pytest.fail("Command rocminfo failed to run")
check.is_not_none(
re.search(to_search, rocm_info_output),
f"Failed to search for {to_search} in rocminfo output",
)
# TODO(#3313): Re-enable once hipcc test is fixed for ASAN builds
@pytest.mark.skipif(
is_asan(), reason="hipcc test fails with ASAN build, see TheRock#3313"
)
def test_hip_printf(self):
platform_executable_suffix = ".exe" if is_windows() else ""
# Look up offload arch, e.g. gfx1100, for explicit `--offload-arch`.
# See https://github.com/ROCm/llvm-project/issues/302:
# * If this is omitted on Linux, hipcc uses rocm_agent_enumerator.
# * If this is omitted on Windows, hipcc uses a default (e.g. gfx906).
# We include it on both platforms for consistency.
offload_arch_executable_file = f"offload-arch{platform_executable_suffix}"
offload_arch_path = (
THEROCK_BIN_DIR
/ ".."
/ "lib"
/ "llvm"
/ "bin"
/ offload_arch_executable_file
).resolve()
process = run_command([str(offload_arch_path)])
# Extract the arch from the command output, working around
# https://github.com/ROCm/TheRock/issues/1118. We only expect the output
# to contain 'gfx####` text but some ROCm releases contained stray
# "HIP Library Path" logging first.
# **Note**: this partly defaults the purpose of the sanity check, since
# that should really be a test failure. However, per discussion on
# https://github.com/ROCm/TheRock/pull/3257 we found that system
# installs of ROCm (DLLs in system32) take precedence over user
# installs (PATH env var) under certain conditions. Hopefully a
# different unit test elsewhere in ROCm catches that more directly.
offload_arch = None
for line in process.stdout.splitlines():
if "gfx" in line:
offload_arch = line
break
assert (
offload_arch is not None
), f"Expected offload-arch to return gfx####, got:\n{process.stdout}"
# Compiling .cpp file using hipcc
hipcc_check_executable_file = f"hipcc_check{platform_executable_suffix}"
run_command(
[
f"{THEROCK_BIN_DIR}/hipcc",
str(THIS_DIR / "hipcc_check.cpp"),
"-Xlinker",
f"-rpath={THEROCK_BIN_DIR}/../lib/",
f"--offload-arch={offload_arch}",
"-o",
hipcc_check_executable_file,
],
cwd=str(THEROCK_BIN_DIR),
)
# Running and checking the executable
platform_executable_prefix = "./" if not is_windows() else ""
hipcc_check_executable = f"{platform_executable_prefix}hipcc_check"
process = run_command([hipcc_check_executable], cwd=str(THEROCK_BIN_DIR))
check.equal(process.returncode, 0)
check.greater(
os.path.getsize(str(THEROCK_BIN_DIR / hipcc_check_executable_file)), 0
)
@pytest.mark.skipif(
is_windows(),
reason="rocm_agent_enumerator is not supported on Windows",
)
def test_rocm_agent_enumerator(self):
process = run_command([f"{THEROCK_BIN_DIR}/rocm_agent_enumerator"])
output = process.stdout
return_code = process.returncode
check.equal(return_code, 0)
check.is_true(output)