55import importlib .metadata
66
77from cuda import cuda
8- from cuda .core .experimental ._utils import handle_return
8+ from cuda .core .experimental ._utils import handle_return , precondition
99
1010_backend = {
1111 "old" : {
@@ -127,31 +127,10 @@ def __init__(self, module, code_type, jit_options=None, *, symbol_mapping=None):
127127 self ._sym_map = {} if symbol_mapping is None else symbol_mapping
128128
129129 # TODO: do we want to unload in a finalizer? Probably not..
130-
131- def get_kernel (self , name ):
132- """Return the :obj:`Kernel` of a specified name from this object code.
133-
134- Parameters
135- ----------
136- name : Any
137- Name of the kernel to retrieve.
138-
139- Returns
140- -------
141- :obj:`Kernel`
142- Newly created kernel object.
143-
144- """
145- try :
146- name = self ._sym_map [name ]
147- except KeyError :
148- name = name .encode ()
149-
150- self ._lazy_load_module ()
151- data = handle_return (self ._loader ["kernel" ](self ._handle , name ))
152- return Kernel ._from_obj (data , self )
153-
154- def _lazy_load_module (self ):
130+
131+ def _lazy_load_module (self , * args , ** kwargs ):
132+ if self ._handle is not None :
133+ return
155134 if isinstance (self ._module , str ):
156135 # TODO: this option is only taken by the new library APIs, but we have
157136 # a bug that we can't easily support it just yet (NVIDIA/cuda-python#73).
@@ -178,4 +157,28 @@ def _lazy_load_module(self):
178157 args = (self ._module , len (self ._jit_options ), list (self ._jit_options .keys ()), list (self ._jit_options .values ()))
179158 self ._handle = handle_return (self ._loader ["data" ](* args ))
180159
160+ @precondition (_lazy_load_module )
161+ def get_kernel (self , name ):
162+ """Return the :obj:`Kernel` of a specified name from this object code.
163+
164+ Parameters
165+ ----------
166+ name : Any
167+ Name of the kernel to retrieve.
168+
169+ Returns
170+ -------
171+ :obj:`Kernel`
172+ Newly created kernel object.
173+
174+ """
175+ try :
176+ name = self ._sym_map [name ]
177+ except KeyError :
178+ name = name .encode ()
179+
180+ data = handle_return (self ._loader ["kernel" ](self ._handle , name ))
181+ return Kernel ._from_obj (data , self )
182+
183+
181184 # TODO: implement from_handle()
0 commit comments