Skip to content

Commit fd3ad60

Browse files
authored
test(pathfinder): handle cuTENSORMg removal in cuTENSOR 2.8 (#2809)
1 parent 3ae71ca commit fd3ad60

2 files changed

Lines changed: 34 additions & 2 deletions

File tree

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1+
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
22
# SPDX-License-Identifier: Apache-2.0
33

44
import functools
55
import importlib.metadata
66
import re
77

8+
from packaging.version import Version
9+
810

911
@functools.cache
10-
def have_distribution(name_pattern: str) -> bool:
12+
def have_distribution(name_pattern: str, *, minimum_version: str | None = None) -> bool:
1113
re_name_pattern = re.compile(name_pattern)
14+
parsed_minimum_version = Version(minimum_version) if minimum_version is not None else None
1215
return any(
1316
re_name_pattern.match(dist.metadata["Name"])
17+
and (parsed_minimum_version is None or Version(dist.version) >= parsed_minimum_version)
1418
for dist in importlib.metadata.distributions()
1519
if "Name" in dist.metadata
1620
)

‎cuda_pathfinder/tests/test_load_nvidia_dynamic_lib.py‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import os
55
import platform
66
from pathlib import Path
7+
from types import SimpleNamespace
78

89
import pytest
910
from child_load_nvidia_dynamic_lib_helper import (
@@ -123,12 +124,39 @@ def test_known_but_platform_unavailable_libname_raises_dynamic_lib_not_available
123124
def _is_expected_load_nvidia_dynamic_lib_failure(libname):
124125
if libname == "nvpl_fftw" and platform.machine().lower() != "aarch64":
125126
return True
127+
if libname == "cutensorMg":
128+
# cuTENSOR 2.8 removed cuTENSORMg in favor of cuTENSORMp.
129+
return have_distribution(r"^cutensor-cu(?:12|13)$", minimum_version="2.8")
126130
dist_name_pattern = IMPORTLIB_METADATA_DISTRIBUTIONS_NAMES.get(libname)
127131
if dist_name_pattern is not None:
128132
return not have_distribution(dist_name_pattern)
129133
return False
130134

131135

136+
@pytest.mark.parametrize(
137+
("installed_distributions", "expected"),
138+
[
139+
([], False),
140+
([SimpleNamespace(metadata={"Name": "cutensor-cu13"}, version="2.7.0")], False),
141+
([SimpleNamespace(metadata={"Name": "cutensor-cu12"}, version="2.8.0")], True),
142+
([SimpleNamespace(metadata={"Name": "cutensor-cu13"}, version="2.9.0")], True),
143+
([SimpleNamespace(metadata={"Name": "unrelated-package"}, version="2.8.0")], False),
144+
],
145+
)
146+
@pytest.mark.agent_authored(model="gpt-5.6-sol")
147+
def test_cutensor_mg_expected_failure_follows_installed_cutensor_version(
148+
mocker,
149+
installed_distributions,
150+
expected,
151+
):
152+
mocker.patch("local_helpers.importlib.metadata.distributions", return_value=installed_distributions)
153+
have_distribution.cache_clear()
154+
try:
155+
assert _is_expected_load_nvidia_dynamic_lib_failure("cutensorMg") is expected
156+
finally:
157+
have_distribution.cache_clear()
158+
159+
132160
@pytest.mark.parametrize(
133161
"libname",
134162
supported_nvidia_libs.SUPPORTED_WINDOWS_DLLS if IS_WINDOWS else supported_nvidia_libs.SUPPORTED_LINUX_SONAMES,

0 commit comments

Comments
 (0)