Coverage for cuda/bindings/utils/_ptx_utils.py: 78.57%
14 statements
« prev ^ index » next coverage.py v7.17.2, created at 2026-11-05 01:11 +0000
« prev ^ index » next coverage.py v7.17.2, created at 2026-11-05 01:11 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2# SPDX-License-Identifier: Apache-2.0
4import re
6# Mapping based on the official PTX ISA <-> CUDA Release table
7# https://docs.nvidia.com/cuda/parallel-thread-execution/#release-notes-ptx-release-history
8_ptx_to_cuda = {
9 "1.0": (1, 0),
10 "1.1": (1, 1),
11 "1.2": (2, 0),
12 "1.3": (2, 1),
13 "1.4": (2, 2),
14 "2.0": (3, 0),
15 "2.1": (3, 1),
16 "2.2": (3, 2),
17 "2.3": (4, 0),
18 "3.0": (4, 1),
19 "3.1": (5, 0),
20 "3.2": (5, 5),
21 "4.0": (6, 0),
22 "4.1": (6, 5),
23 "4.2": (7, 0),
24 "4.3": (7, 5),
25 "5.0": (8, 0),
26 "6.0": (9, 0),
27 "6.1": (9, 1),
28 "6.2": (9, 2),
29 "6.3": (10, 0),
30 "6.4": (10, 1),
31 "6.5": (10, 2),
32 "7.0": (11, 0),
33 "7.1": (11, 1),
34 "7.2": (11, 2),
35 "7.3": (11, 3),
36 "7.4": (11, 4),
37 "7.5": (11, 5),
38 "7.6": (11, 6),
39 "7.7": (11, 7),
40 "7.8": (11, 8),
41 "8.0": (12, 0),
42 "8.1": (12, 1),
43 "8.2": (12, 2),
44 "8.3": (12, 3),
45 "8.4": (12, 4),
46 "8.5": (12, 5),
47 "8.6": (12, 7),
48 "8.7": (12, 8),
49 "8.8": (12, 9),
50 "9.0": (13, 0),
51 "9.1": (13, 1),
52 "9.2": (13, 2),
53 "9.3": (13, 3),
54 "9.4": (13, 4),
55}
58def get_minimal_required_cuda_ver_from_ptx_ver(ptx_version: str) -> int:
59 """
60 Maps the PTX ISA version to the minimal CUDA driver, nvPTXCompiler, or nvJitLink version
61 that is needed to load a PTX of the given ISA version.
63 Parameters
64 ----------
65 ptx_version : str
66 PTX ISA version as a string, e.g. "8.8" for PTX ISA 8.8. This is the ``.version``
67 directive in the PTX header.
69 Returns
70 -------
71 int
72 Minimal CUDA version as 1000 * major + 10 * minor, e.g. 12090 for CUDA 12.9.
74 Raises
75 ------
76 ValueError
77 If the PTX version is unknown.
79 Examples
80 --------
81 >>> get_minimal_required_driver_ver_from_ptx_ver("8.8")
82 12090
83 >>> get_minimal_required_driver_ver_from_ptx_ver("7.0")
84 11000
85 """
86 try: 1ab
87 major, minor = _ptx_to_cuda[ptx_version] 1ab
88 return 1000 * major + 10 * minor 1ab
89 except KeyError:
90 raise ValueError(f"Unknown or unsupported PTX ISA version: {ptx_version}") from None
93# Regex pattern to match .version directive and capture the version number
94# TODO: if import speed is a concern, consider lazy-initializing it.
95_ptx_ver_pattern = re.compile(r"\.version\s+([0-9]+\.[0-9]+)")
98def get_ptx_ver(ptx: str) -> str:
99 """
100 Extract the PTX ISA version string from PTX source code.
102 Parameters
103 ----------
104 ptx : str
105 The PTX assembly source code as a string.
107 Returns
108 -------
109 str
110 The PTX ISA version string, e.g., "8.8".
112 Raises
113 ------
114 ValueError
115 If the .version directive is not found in the PTX source.
117 Examples
118 --------
119 >>> ptx = r'''
120 ... .version 8.8
121 ... .target sm_86
122 ... .address_size 64
123 ...
124 ... .visible .entry test_kernel()
125 ... {
126 ... ret;
127 ... }
128 ... '''
129 >>> get_ptx_ver(ptx)
130 '8.8'
131 """
132 m = _ptx_ver_pattern.search(ptx) 1ab
133 if m: 1ab
134 return m.group(1) 1ab
135 else:
136 raise ValueError("No .version directive found in PTX source. Is it a valid PTX?")