Skip to content

Commit 90ce7cc

Browse files
committed
Make mxcc kernel dump naming defensive
1 parent 84b860b commit 90ce7cc

2 files changed

Lines changed: 22 additions & 54 deletions

File tree

python/tvm/contrib/mxcc.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,13 @@
3434

3535
def _kernel_file_name(code):
3636
"""Return a stable kernel dump filename for the given MACA source."""
37-
digest = hashlib.sha256(code.encode("utf-8")).hexdigest()[:16]
37+
if code is None:
38+
code_bytes = b""
39+
elif isinstance(code, bytes):
40+
code_bytes = code
41+
else:
42+
code_bytes = str(code).encode("utf-8")
43+
digest = hashlib.sha256(code_bytes).hexdigest()[:16]
3844
return f"tvm_kernels_{digest}"
3945

4046

Lines changed: 15 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,25 @@
11
import hashlib
2-
import importlib.util
3-
import sys
4-
import types
5-
import unittest
6-
from pathlib import Path
72

3+
from tvm.contrib import mxcc
84

9-
REPO_ROOT = Path(__file__).resolve().parents[3]
10-
MXCC_PATH = REPO_ROOT / "python" / "tvm" / "contrib" / "mxcc.py"
115

12-
tvm_ffi = types.ModuleType("tvm_ffi")
13-
tvm_ffi.register_global_func = lambda *args, **kwargs: (
14-
(lambda func: func) if args and callable(args[0]) else (lambda func: func)
15-
)
16-
tvm_ffi.get_global_func = lambda _name: None
17-
sys.modules["tvm_ffi"] = tvm_ffi
6+
def test_kernel_file_name_is_stable_and_content_addressed():
7+
source = 'extern "C" __global__ void add(float* x) { x[0] += 1.0f; }'
8+
expected_hash = hashlib.sha256(source.encode("utf-8")).hexdigest()[:16]
189

19-
tvm = types.ModuleType("tvm")
20-
tvm.maca = lambda *_args, **_kwargs: types.SimpleNamespace(exist=False)
21-
tvm.target = types.ModuleType("tvm.target")
22-
tvm.target.Target = object
23-
sys.modules["tvm"] = tvm
24-
sys.modules["tvm.target"] = tvm.target
10+
assert mxcc._kernel_file_name(source) == f"tvm_kernels_{expected_hash}"
11+
assert mxcc._kernel_file_name(source) == mxcc._kernel_file_name(source)
2512

26-
tvm_base = types.ModuleType("tvm.base")
27-
tvm_base.py_str = lambda value: value.decode("utf-8") if isinstance(value, bytes) else str(value)
28-
sys.modules["tvm.base"] = tvm_base
2913

30-
tvm_contrib = types.ModuleType("tvm.contrib")
31-
tvm_contrib.__path__ = []
32-
sys.modules["tvm.contrib"] = tvm_contrib
14+
def test_kernel_file_name_changes_with_source():
15+
assert mxcc._kernel_file_name('extern "C" __global__ void a() {}') != mxcc._kernel_file_name(
16+
'extern "C" __global__ void b() {}'
17+
)
3318

34-
tvm_contrib_utils = types.ModuleType("tvm.contrib.utils")
35-
tvm_contrib_utils.tempdir = lambda: None
36-
sys.modules["tvm.contrib.utils"] = tvm_contrib_utils
3719

38-
spec = importlib.util.spec_from_file_location("tvm.contrib.mxcc", MXCC_PATH)
39-
mxcc = importlib.util.module_from_spec(spec)
40-
mxcc.__package__ = "tvm.contrib"
41-
sys.modules["tvm.contrib.mxcc"] = mxcc
42-
assert spec.loader is not None
43-
spec.loader.exec_module(mxcc)
20+
def test_kernel_file_name_accepts_bytes_and_none():
21+
source = b'extern "C" __global__ void add(float* x) { x[0] += 1.0f; }'
22+
expected_hash = hashlib.sha256(source).hexdigest()[:16]
4423

45-
46-
class TestMXCCKernelDumpName(unittest.TestCase):
47-
48-
def test_kernel_file_name_is_stable_and_content_addressed(self):
49-
source = "extern \"C\" __global__ void add(float* x) { x[0] += 1.0f; }"
50-
expected_hash = hashlib.sha256(source.encode("utf-8")).hexdigest()[:16]
51-
52-
self.assertEqual(mxcc._kernel_file_name(source), f"tvm_kernels_{expected_hash}")
53-
self.assertEqual(mxcc._kernel_file_name(source), mxcc._kernel_file_name(source))
54-
55-
def test_kernel_file_name_changes_with_source(self):
56-
self.assertNotEqual(
57-
mxcc._kernel_file_name("extern \"C\" __global__ void a() {}"),
58-
mxcc._kernel_file_name("extern \"C\" __global__ void b() {}"),
59-
)
60-
61-
62-
if __name__ == "__main__":
63-
unittest.main()
24+
assert mxcc._kernel_file_name(source) == f"tvm_kernels_{expected_hash}"
25+
assert mxcc._kernel_file_name(None) == f"tvm_kernels_{hashlib.sha256(b'').hexdigest()[:16]}"

0 commit comments

Comments
 (0)