Skip to content

Commit 19563d5

Browse files
authored
Merge pull request #436 from ksimpson-work/update-linker-options-sequence-handling
Update linker options sequence handling
2 parents af5a64e + 1ff0fa1 commit 19563d5

File tree

2 files changed

+32
-20
lines changed

2 files changed

+32
-20
lines changed

cuda_core/cuda/core/experimental/_linker.py

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
import weakref
77
from contextlib import contextmanager
88
from dataclasses import dataclass
9-
from typing import List, Optional
9+
from typing import List, Optional, Tuple, Union
1010
from warnings import warn
1111

1212
from cuda.core.experimental._device import Device
1313
from cuda.core.experimental._module import ObjectCode
14-
from cuda.core.experimental._utils import check_or_create_options, driver, handle_return
14+
from cuda.core.experimental._utils import check_or_create_options, driver, handle_return, is_sequence
1515

1616
# TODO: revisit this treatment for py313t builds
1717
_driver = None # populated if nvJitLink cannot be used
@@ -130,15 +130,14 @@ class LinkerOptions:
130130
fma : bool, optional
131131
Use fast multiply-add.
132132
Default: True.
133-
kernels_used : List[str], optional
134-
Pass list of kernels that are used; any not in the list can be removed. This option can be specified multiple
135-
times.
136-
variables_used : List[str], optional
137-
Pass a list of variables that are used; any not in the list can be removed.
133+
kernels_used : [Union[str, Tuple[str], List[str]]], optional
134+
Pass a kernel or sequence of kernels that are used; any not in the list can be removed.
135+
variables_used : [Union[str, Tuple[str], List[str]]], optional
136+
Pass a variable or sequence of variables that are used; any not in the list can be removed.
138137
optimize_unused_variables : bool, optional
139138
Assume that if a variable is not referenced in device code, it can be removed.
140139
Default: False.
141-
ptxas_options : List[str], optional
140+
ptxas_options : [Union[str, Tuple[str], List[str]]], optional
142141
Pass options to PTXAS.
143142
split_compile : int, optional
144143
Split compilation maximum thread count. Use 0 to use all available processors. Value of 1 disables split
@@ -167,10 +166,10 @@ class LinkerOptions:
167166
prec_div: Optional[bool] = None
168167
prec_sqrt: Optional[bool] = None
169168
fma: Optional[bool] = None
170-
kernels_used: Optional[List[str]] = None
171-
variables_used: Optional[List[str]] = None
169+
kernels_used: Optional[Union[str, Tuple[str], List[str]]] = None
170+
variables_used: Optional[Union[str, Tuple[str], List[str]]] = None
172171
optimize_unused_variables: Optional[bool] = None
173-
ptxas_options: Optional[List[str]] = None
172+
ptxas_options: Optional[Union[str, Tuple[str], List[str]]] = None
174173
split_compile: Optional[int] = None
175174
split_compile_extended: Optional[int] = None
176175
no_cache: Optional[bool] = None
@@ -213,16 +212,25 @@ def _init_nvjitlink(self):
213212
if self.fma is not None:
214213
self.formatted_options.append(f"-fma={'true' if self.fma else 'false'}")
215214
if self.kernels_used is not None:
216-
for kernel in self.kernels_used:
217-
self.formatted_options.append(f"-kernels-used={kernel}")
215+
if isinstance(self.kernels_used, str):
216+
self.formatted_options.append(f"-kernels-used={self.kernels_used}")
217+
elif isinstance(self.kernels_used, list):
218+
for kernel in self.kernels_used:
219+
self.formatted_options.append(f"-kernels-used={kernel}")
218220
if self.variables_used is not None:
219-
for variable in self.variables_used:
220-
self.formatted_options.append(f"-variables-used={variable}")
221+
if isinstance(self.variables_used, str):
222+
self.formatted_options.append(f"-variables-used={self.variables_used}")
223+
elif isinstance(self.variables_used, list):
224+
for variable in self.variables_used:
225+
self.formatted_options.append(f"-variables-used={variable}")
221226
if self.optimize_unused_variables is not None:
222227
self.formatted_options.append("-optimize-unused-variables")
223228
if self.ptxas_options is not None:
224-
for opt in self.ptxas_options:
225-
self.formatted_options.append(f"-Xptxas={opt}")
229+
if isinstance(self.ptxas_options, str):
230+
self.formatted_options.append(f"-Xptxas={self.ptxas_options}")
231+
elif is_sequence(self.ptxas_options):
232+
for opt in self.ptxas_options:
233+
self.formatted_options.append(f"-Xptxas={opt}")
226234
if self.split_compile is not None:
227235
self.formatted_options.append(f"-split-compile={self.split_compile}")
228236
if self.split_compile_extended is not None:

cuda_core/tests/test_linker.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,22 @@ def compile_ltoir_functions(init_cuda):
5858
options += [
5959
LinkerOptions(arch=ARCH, time=True),
6060
LinkerOptions(arch=ARCH, optimize_unused_variables=True),
61-
LinkerOptions(arch=ARCH, ptxas_options=["-v"]),
61+
LinkerOptions(arch=ARCH, ptxas_options="-v"),
62+
LinkerOptions(arch=ARCH, ptxas_options=["-v", "--verbose"]),
63+
LinkerOptions(arch=ARCH, ptxas_options=("-v", "--verbose")),
6264
LinkerOptions(arch=ARCH, split_compile=0),
6365
LinkerOptions(arch=ARCH, split_compile_extended=1),
6466
# The following options are supported by nvjitlink and deprecated by culink
6567
LinkerOptions(arch=ARCH, ftz=True),
6668
LinkerOptions(arch=ARCH, prec_div=True),
6769
LinkerOptions(arch=ARCH, prec_sqrt=True),
6870
LinkerOptions(arch=ARCH, fma=True),
69-
LinkerOptions(arch=ARCH, kernels_used=["A"]),
71+
LinkerOptions(arch=ARCH, kernels_used="A"),
7072
LinkerOptions(arch=ARCH, kernels_used=["C", "B"]),
71-
LinkerOptions(arch=ARCH, variables_used=["var1"]),
73+
LinkerOptions(arch=ARCH, kernels_used=("C", "B")),
74+
LinkerOptions(arch=ARCH, variables_used="var1"),
7275
LinkerOptions(arch=ARCH, variables_used=["var1", "var2"]),
76+
LinkerOptions(arch=ARCH, variables_used=("var1", "var2")),
7377
]
7478
version = nvjitlink.version()
7579
if version >= (12, 5):

0 commit comments

Comments
 (0)