|
1 | 1 | import hashlib |
2 | | -import importlib.util |
3 | | -import sys |
4 | | -import types |
5 | | -import unittest |
6 | | -from pathlib import Path |
7 | 2 |
|
| 3 | +from tvm.contrib import mxcc |
8 | 4 |
|
9 | | -REPO_ROOT = Path(__file__).resolve().parents[3] |
10 | | -MXCC_PATH = REPO_ROOT / "python" / "tvm" / "contrib" / "mxcc.py" |
11 | 5 |
|
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] |
18 | 9 |
|
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) |
25 | 12 |
|
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 |
29 | 13 |
|
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 | + ) |
33 | 18 |
|
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 |
37 | 19 |
|
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] |
44 | 23 |
|
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