Skip to content

Commit 8b55a6c

Browse files
authored
cuda.core: complete the naming audit from #1945 (#1986)
* cuda.core: address naming-audit items from #1945 Apply the in-scope renames from the issue checklist. Each change is described in the 1.0.0 release notes' Breaking changes section. Property conversions (no-arg deterministic getters): Buffer.get_ipc_descriptor() -> Buffer.ipc_descriptor Event.get_ipc_descriptor() -> Event.ipc_descriptor DeviceMemoryResource.get_allocation_handle() -> .allocation_handle PinnedMemoryResource.get_allocation_handle() -> .allocation_handle Boolean / non-noun properties (renamed for clarity, polarity fixed): LaunchConfig.cooperative_launch -> .is_cooperative Event.is_timing_disabled -> .is_timing_enabled Event.is_sync_busy_waited -> .uses_blocking_sync EventOptions.busy_waited_sync -> .use_blocking_sync The Event boolean rename also corrects a long-standing inversion in the underlying handle module: the C++ field/accessor pair stored "BLOCKING_SYNC is set" but was named "busy_waited", which is the opposite of what the flag actually does. The new name (and the public property) match CUDA's terminology directly. Graph allocation method consistency (matches MemoryResource): GraphDefinition.alloc() -> .allocate() GraphDefinition.free() -> .deallocate() GraphNode.alloc() -> .allocate() GraphNode.free() -> .deallocate() Cross-API consistency for graph builders: GraphBuilder.add_child() -> .embed() GraphDefinition.record_event() / .wait_event() -> .record() / .wait() GraphNode.record_event() / .wait_event() -> .record() / .wait() Also updates the underlying handle layer to match the renamed public properties: C++ EventBox.timing_disabled -> .timing_enabled (polarity flipped) C++ EventBox.busy_waited -> .uses_blocking_sync C++ get_event_timing_disabled -> get_event_timing_enabled C++ get_event_busy_waited -> get_event_uses_blocking_sync Cython mirrors in _resource_handles.{pxd,pyx} IPCEventDescriptor._busy_waited -> ._uses_blocking_sync Historical references to renamed/removed names in 0.3.0 and 0.4.0 release notes are converted to inline literals so latest-only Sphinx builds do not break. Out of scope (deferred): - KernelAttributes redesign (separate design PR) - Conditional API rework (create_condition unification, if_then, GraphCondition.__int__) -- separate work in progress on this branch - DeviceProperties.cooperative_launch (pending team discussion) - All system/* and fan items (Mike) Made-with: Cursor * cuda.core: unify conditional graph API (#1945) GraphBuilder, GraphDefinition, and GraphNode now share one conditional vocabulary. The factory returns a GraphCondition (no raw handle on the public surface), the conditional-node verbs are consistent, and a GraphCondition can be passed straight to launch(). Public API changes: GraphBuilder.create_conditional_handle() -> .create_condition() Returns GraphCondition (matches GraphDefinition.create_condition). The four conditional builder methods (if_then, if_else, while_loop, switch) on GraphBuilder now accept GraphCondition instead of a raw CUgraphConditionalHandle, and they validate the argument type. GraphBuilder.if_cond() -> .if_then() GraphDefinition.if_cond() -> .if_then() GraphNode.if_cond() -> .if_then() The new name parallels if_else / while_loop / switch (verb describing the construct) and matches Python's if/then/else. GraphCondition.__int__ (new) Returns the underlying CUgraphConditionalHandle value, so a GraphCondition can be passed directly as a kernel argument. _kernel_arg_handler grew an explicit GraphCondition fast path that packs it as CUgraphConditionalHandle, mirroring the existing driver.CUgraphConditionalHandle case. Internals: GraphCondition._from_handle (static cdef factory) keeps the GraphBuilder and GraphDefinition implementations of create_condition on the same construction path. Tests updated to use the new flow throughout, including passing GraphCondition directly to set_handle / countdown kernels rather than extracting .handle. Made-with: Cursor * cuda.core: KernelAttributes are properties; per-device via indexing (#1945) Replace the 16 (device_id) accessor methods on KernelAttributes with properties, and expose per-device queries via __getitem__: Old: kernel.attributes.num_regs() kernel.attributes.num_regs(dev) New: kernel.attributes.num_regs # current device kernel.attributes[dev].num_regs # specific device The default view returned by Kernel.attributes is bound to the current device (resolved at attribute-access time, so it follows context changes). Indexing returns a sibling view bound to the given Device or device ordinal; the underlying cache (keyed by (device_id, attr_enum)) is shared across views of the same kernel, so a value queried through one view is visible through the others. Internals: _device_id == -1 sentinel marks the "current device" view. _effective_device_id() resolves it via Device().device_id per access. _view_for_device() builds a sibling view that aliases _cache. _resolve_device_id() is removed (no longer needed). The 6 in-tree call sites (5 in test_module.py, 3 in test_graph_definition_lifetime.py) just drop the (); two new tests exercise the per-device view shape and reject invalid device arguments. Made-with: Cursor * fix: update test_read_only_kernel_attributes for property API (#1945) The parametrized test in test_module.py exercised the previous KernelAttributes(method, optional device_id) shape via getattr() + call. Rewrite it to use property access on the default view and on the per-device views returned by kernel.attributes[device], for both Device-object and ordinal-int forms. Type-check the value at every access path rather than just the last one. Made-with: Cursor * cuda.core: remove GraphCondition.__int__ (#1945) Address review feedback on #1986: drop the implicit int() conversion on GraphCondition. Passing a GraphCondition directly to launch() is still supported; the kernel-arg handler now reaches into _c_handle directly instead of going through __int__. Made-with: Cursor * cuda.core: rename EventOptions to bare-adjective form (#1945) Address review feedback on #1986: align EventOptions field names with the convention used elsewhere in the API (option name = bare adjective, property name = is_/uses_ prefix). - EventOptions.enable_timing -> EventOptions.timing_enabled (matches Event.is_timing_enabled) - EventOptions.use_blocking_sync -> EventOptions.blocking_sync (matches Event.uses_blocking_sync) Same pattern as ipc_enabled / Event.is_ipc_enabled and StreamOptions.nonblocking / Stream.is_nonblocking. Made-with: Cursor * cuda.core: rename Event.uses_blocking_sync to is_blocking_sync (#1945) Adopt the is_-prefix convention used everywhere else (is_ipc_enabled, is_timing_enabled, is_nonblocking) and eliminate the lone uses_- form. Keep the _sync suffix so the name disambiguates from Stream's separate "blocking" concept and stays close to the underlying CU_EVENT_BLOCKING_SYNC driver flag. EventOptions.blocking_sync is unchanged. Made-with: Cursor * cuda.core: fix int(condition) call sites missed when removing GraphCondition.__int__ (#1945) The conditional builder methods (if_then, if_else, switch, while_loop) were still calling int(condition) on the GraphCondition object after __int__ was removed in the prior commit. Use the public .handle property instead, which mirrors the kernel argument handler fix. This was caught by CI: 26 conditional graph tests failed with TypeError in cuda/core/graph/_graph_builder.pyx:549. Made-with: Cursor
1 parent 7f32b39 commit 8b55a6c

43 files changed

Lines changed: 680 additions & 469 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cuda_core/cuda/core/_cpp/resource_handles.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -353,8 +353,8 @@ StreamHandle get_per_thread_stream() {
353353
namespace {
354354
struct EventBox {
355355
CUevent resource;
356-
bool timing_disabled;
357-
bool busy_waited;
356+
bool timing_enabled;
357+
bool is_blocking_sync;
358358
bool ipc_enabled;
359359
int device_id;
360360
ContextHandle h_context;
@@ -368,12 +368,12 @@ static const EventBox* get_box(const EventHandle& h) {
368368
);
369369
}
370370

371-
bool get_event_timing_disabled(const EventHandle& h) noexcept {
372-
return h ? get_box(h)->timing_disabled : true;
371+
bool get_event_timing_enabled(const EventHandle& h) noexcept {
372+
return h ? get_box(h)->timing_enabled : false;
373373
}
374374

375-
bool get_event_busy_waited(const EventHandle& h) noexcept {
376-
return h ? get_box(h)->busy_waited : false;
375+
bool get_event_is_blocking_sync(const EventHandle& h) noexcept {
376+
return h ? get_box(h)->is_blocking_sync : false;
377377
}
378378

379379
bool get_event_ipc_enabled(const EventHandle& h) noexcept {
@@ -392,7 +392,7 @@ ContextHandle get_event_context(const EventHandle& h) noexcept {
392392
static HandleRegistry<CUevent, EventHandle> event_registry;
393393

394394
EventHandle create_event_handle(const ContextHandle& h_ctx, unsigned int flags,
395-
bool timing_disabled, bool busy_waited,
395+
bool timing_enabled, bool is_blocking_sync,
396396
bool ipc_enabled, int device_id) {
397397
GILReleaseGuard gil;
398398
CUevent event;
@@ -401,7 +401,7 @@ EventHandle create_event_handle(const ContextHandle& h_ctx, unsigned int flags,
401401
}
402402

403403
auto box = std::shared_ptr<const EventBox>(
404-
new EventBox{event, timing_disabled, busy_waited, ipc_enabled, device_id, h_ctx},
404+
new EventBox{event, timing_enabled, is_blocking_sync, ipc_enabled, device_id, h_ctx},
405405
[h_ctx](const EventBox* b) {
406406
event_registry.unregister_handle(b->resource);
407407
GILReleaseGuard gil;
@@ -415,27 +415,27 @@ EventHandle create_event_handle(const ContextHandle& h_ctx, unsigned int flags,
415415
}
416416

417417
EventHandle create_event_handle_noctx(unsigned int flags) {
418-
return create_event_handle(ContextHandle{}, flags, true, false, false, -1);
418+
return create_event_handle(ContextHandle{}, flags, false, false, false, -1);
419419
}
420420

421421
EventHandle create_event_handle_ref(CUevent event) {
422422
if (auto h = event_registry.lookup(event)) {
423423
return h;
424424
}
425-
auto box = std::make_shared<const EventBox>(EventBox{event, true, false, false, -1, {}});
425+
auto box = std::make_shared<const EventBox>(EventBox{event, false, false, false, -1, {}});
426426
return EventHandle(box, &box->resource);
427427
}
428428

429429
EventHandle create_event_handle_ipc(const CUipcEventHandle& ipc_handle,
430-
bool busy_waited) {
430+
bool is_blocking_sync) {
431431
GILReleaseGuard gil;
432432
CUevent event;
433433
if (CUDA_SUCCESS != (err = p_cuIpcOpenEventHandle(&event, ipc_handle))) {
434434
return {};
435435
}
436436

437437
auto box = std::shared_ptr<const EventBox>(
438-
new EventBox{event, true, busy_waited, true, -1, {}},
438+
new EventBox{event, false, is_blocking_sync, true, -1, {}},
439439
[](const EventBox* b) {
440440
event_registry.unregister_handle(b->resource);
441441
GILReleaseGuard gil;

cuda_core/cuda/core/_cpp/resource_handles.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ StreamHandle get_per_thread_stream();
211211
// When the last reference is released, cuEventDestroy is called automatically.
212212
// Returns empty handle on error (caller must check).
213213
EventHandle create_event_handle(const ContextHandle& h_ctx, unsigned int flags,
214-
bool timing_disabled, bool busy_waited,
214+
bool timing_enabled, bool is_blocking_sync,
215215
bool ipc_enabled, int device_id);
216216

217217
// Create an owning event handle without context dependency.
@@ -225,17 +225,17 @@ EventHandle create_event_handle_noctx(unsigned int flags);
225225
// When the last reference is released, cuEventDestroy is called automatically.
226226
// Returns empty handle on error (caller must check).
227227
EventHandle create_event_handle_ipc(const CUipcEventHandle& ipc_handle,
228-
bool busy_waited);
228+
bool is_blocking_sync);
229229

230230
// Create a non-owning event handle (references existing event).
231231
// Use for events that are managed by the CUDA graph or another owner.
232232
// The event will NOT be destroyed when the handle is released.
233-
// Metadata defaults to unknown (timing_disabled=true, device_id=-1).
233+
// Metadata defaults to unknown (timing_enabled=false, device_id=-1).
234234
EventHandle create_event_handle_ref(CUevent event);
235235

236236
// Event metadata accessors (read from EventBox via pointer arithmetic)
237-
bool get_event_timing_disabled(const EventHandle& h) noexcept;
238-
bool get_event_busy_waited(const EventHandle& h) noexcept;
237+
bool get_event_timing_enabled(const EventHandle& h) noexcept;
238+
bool get_event_is_blocking_sync(const EventHandle& h) noexcept;
239239
bool get_event_ipc_enabled(const EventHandle& h) noexcept;
240240
int get_event_device_id(const EventHandle& h) noexcept;
241241
ContextHandle get_event_context(const EventHandle& h) noexcept;

cuda_core/cuda/core/_event.pyx

Lines changed: 51 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ from cuda.core._resource_handles cimport (
1313
EventHandle,
1414
create_event_handle,
1515
create_event_handle_ipc,
16-
get_event_timing_disabled,
17-
get_event_busy_waited,
16+
get_event_timing_enabled,
17+
get_event_is_blocking_sync,
1818
get_event_ipc_enabled,
1919
get_event_device_id,
2020
get_event_context,
@@ -44,22 +44,22 @@ cdef class EventOptions:
4444
4545
Attributes
4646
----------
47-
enable_timing : bool, optional
47+
timing_enabled : bool, optional
4848
Event will record timing data. (Default to False)
49-
busy_waited_sync : bool, optional
50-
If True, event will use blocking synchronization. When a CPU
51-
thread calls synchronize, the call will block until the event
52-
has actually been completed.
53-
Otherwise, the CPU thread will busy-wait until the event has
54-
been completed. (Default to False)
49+
blocking_sync : bool, optional
50+
If True, the event uses blocking synchronization: a CPU
51+
thread that calls :meth:`Event.sync` blocks (yields) until
52+
the event has completed. Otherwise (the default), the CPU
53+
thread busy-waits until the event has completed.
54+
(Default to False)
5555
ipc_enabled : bool, optional
5656
Event will be suitable for interprocess use.
57-
Note that enable_timing must be False. (Default to False)
57+
Note that timing_enabled must be False. (Default to False)
5858
5959
"""
6060

61-
enable_timing: bool | None = False
62-
busy_waited_sync: bool | None = False
61+
timing_enabled: bool | None = False
62+
blocking_sync: bool | None = False
6363
ipc_enabled: bool | None = False
6464

6565

@@ -79,8 +79,8 @@ cdef class Event:
7979
8080
# To create events and record the timing:
8181
s = Device().create_stream()
82-
e1 = Device().create_event({"enable_timing": True})
83-
e2 = Device().create_event({"enable_timing": True})
82+
e1 = Device().create_event({"timing_enabled": True})
83+
e2 = Device().create_event({"timing_enabled": True})
8484
s.record(e1)
8585
# ... run some GPU works ...
8686
s.record(e2)
@@ -100,40 +100,41 @@ cdef class Event:
100100
cdef Event self = cls.__new__(cls)
101101
cdef EventOptions opts = check_or_create_options(EventOptions, options, "Event options")
102102
cdef unsigned int flags = 0x0
103-
cdef bint timing_disabled = False
104-
cdef bint busy_waited = False
103+
cdef bint timing_enabled = True
104+
cdef bint is_blocking_sync = False
105105
cdef bint ipc_enabled = False
106106
self._ipc_descriptor = None
107-
if not opts.enable_timing:
107+
if not opts.timing_enabled:
108108
flags |= cydriver.CUevent_flags.CU_EVENT_DISABLE_TIMING
109-
timing_disabled = True
110-
if opts.busy_waited_sync:
109+
timing_enabled = False
110+
if opts.blocking_sync:
111111
flags |= cydriver.CUevent_flags.CU_EVENT_BLOCKING_SYNC
112-
busy_waited = True
112+
is_blocking_sync = True
113113
if opts.ipc_enabled:
114114
if is_free:
115115
raise TypeError(
116116
"IPC-enabled events must be bound; use Stream.record for creation."
117117
)
118118
flags |= cydriver.CUevent_flags.CU_EVENT_INTERPROCESS
119119
ipc_enabled = True
120-
if not timing_disabled:
120+
if timing_enabled:
121121
raise TypeError("IPC-enabled events cannot use timing.")
122122
cdef EventHandle h_event = create_event_handle(
123-
h_context, flags, timing_disabled, busy_waited, ipc_enabled, device_id)
123+
h_context, flags, timing_enabled, is_blocking_sync, ipc_enabled, device_id)
124124
if not h_event:
125125
raise RuntimeError("Failed to create CUDA event")
126126
self._h_event = h_event
127127
if ipc_enabled:
128-
self.get_ipc_descriptor()
128+
_ = self.ipc_descriptor # eagerly populate the descriptor cache
129129
return self
130130

131131
@staticmethod
132132
cdef Event _from_handle(EventHandle h_event):
133133
"""Create an Event wrapping an existing EventHandle.
134134
135-
Metadata (timing, busy_waited, ipc, device_id) is read from the
136-
EventBox via pointer arithmetic — no fields are cached on Event.
135+
Metadata (timing, blocking_sync, ipc, device_id) is read from
136+
the EventBox via pointer arithmetic — no fields are cached on
137+
Event.
137138
"""
138139
cdef Event self = Event.__new__(Event)
139140
self._h_event = h_event
@@ -163,10 +164,10 @@ cdef class Event:
163164
return timing
164165
else:
165166
if err == cydriver.CUresult.CUDA_ERROR_INVALID_HANDLE:
166-
if self.is_timing_disabled or other.is_timing_disabled:
167+
if not self.is_timing_enabled or not other.is_timing_enabled:
167168
explanation = (
168169
"Both Events must be created with timing enabled in order to subtract them; "
169-
"use EventOptions(enable_timing=True) when creating both events."
170+
"use EventOptions(timing_enabled=True) when creating both events."
170171
)
171172
else:
172173
explanation = (
@@ -196,8 +197,9 @@ cdef class Event:
196197
def __repr__(self) -> str:
197198
return f"<Event handle={as_intptr(self._h_event):#x}>"
198199

199-
def get_ipc_descriptor(self) -> IPCEventDescriptor:
200-
"""Export an event allocated for sharing between processes."""
200+
@property
201+
def ipc_descriptor(self) -> IPCEventDescriptor:
202+
"""Descriptor for sharing this event with other processes."""
201203
if self._ipc_descriptor is not None:
202204
return self._ipc_descriptor
203205
if not self.is_ipc_enabled:
@@ -206,7 +208,7 @@ cdef class Event:
206208
with nogil:
207209
HANDLE_RETURN(cydriver.cuIpcGetEventHandle(&data, as_cu(self._h_event)))
208210
cdef bytes data_b = cpython.PyBytes_FromStringAndSize(<char*>(data.reserved), sizeof(data.reserved))
209-
self._ipc_descriptor = IPCEventDescriptor._init(data_b, get_event_busy_waited(self._h_event))
211+
self._ipc_descriptor = IPCEventDescriptor._init(data_b, get_event_is_blocking_sync(self._h_event))
210212
return self._ipc_descriptor
211213

212214
@classmethod
@@ -215,7 +217,7 @@ cdef class Event:
215217
cdef cydriver.CUipcEventHandle data
216218
memcpy(data.reserved, <const void*><const char*>(ipc_descriptor._reserved), sizeof(data.reserved))
217219
cdef Event self = Event.__new__(cls)
218-
cdef EventHandle h_event = create_event_handle_ipc(data, ipc_descriptor._busy_waited)
220+
cdef EventHandle h_event = create_event_handle_ipc(data, ipc_descriptor._is_blocking_sync)
219221
if not h_event:
220222
raise RuntimeError("Failed to open IPC event handle")
221223
self._h_event = h_event
@@ -228,23 +230,24 @@ cdef class Event:
228230
return get_event_ipc_enabled(self._h_event)
229231

230232
@property
231-
def is_timing_disabled(self) -> bool:
232-
"""Return True if the event does not record timing data, otherwise False."""
233-
return get_event_timing_disabled(self._h_event)
233+
def is_timing_enabled(self) -> bool:
234+
"""Return True if the event records timing data, otherwise False."""
235+
return get_event_timing_enabled(self._h_event)
234236

235237
@property
236-
def is_sync_busy_waited(self) -> bool:
237-
"""Return True if the event synchronization would keep the CPU busy-waiting, otherwise False."""
238-
return get_event_busy_waited(self._h_event)
238+
def is_blocking_sync(self) -> bool:
239+
"""Return True if the event uses blocking synchronization (the CPU
240+
thread blocks on :meth:`sync` instead of busy-waiting), otherwise False.
241+
"""
242+
return get_event_is_blocking_sync(self._h_event)
239243

240244
def sync(self):
241245
"""Synchronize until the event completes.
242246
243-
If the event was created with busy_waited_sync, then the
244-
calling CPU thread will block until the event has been
245-
completed by the device.
246-
Otherwise the CPU thread will busy-wait until the event
247-
has been completed.
247+
If the event was created with ``blocking_sync=True``, the
248+
calling CPU thread blocks (yields) until the event has been
249+
completed by the device. Otherwise (the default) the CPU
250+
thread busy-waits until the event has completed.
248251
249252
"""
250253
with nogil:
@@ -302,28 +305,28 @@ cdef class IPCEventDescriptor:
302305

303306
cdef:
304307
bytes _reserved
305-
bint _busy_waited
308+
bint _is_blocking_sync
306309

307310
def __init__(self, *arg, **kwargs):
308311
raise RuntimeError("IPCEventDescriptor objects cannot be instantiated directly. Please use Event APIs.")
309312

310313
@staticmethod
311-
def _init(reserved: bytes, busy_waited: cython.bint):
314+
def _init(reserved: bytes, is_blocking_sync: cython.bint):
312315
cdef IPCEventDescriptor self = IPCEventDescriptor.__new__(IPCEventDescriptor)
313316
self._reserved = reserved
314-
self._busy_waited = busy_waited
317+
self._is_blocking_sync = is_blocking_sync
315318
return self
316319

317320
def __eq__(self, IPCEventDescriptor rhs):
318-
# No need to check self._busy_waited.
321+
# No need to check self._is_blocking_sync.
319322
return self._reserved == rhs._reserved
320323

321324
def __reduce__(self):
322-
return IPCEventDescriptor._init, (self._reserved, self._busy_waited)
325+
return IPCEventDescriptor._init, (self._reserved, self._is_blocking_sync)
323326

324327

325328
def _reduce_event(event):
326329
check_multiprocessing_start_method()
327-
return event.from_ipc_descriptor, (event.get_ipc_descriptor(),)
330+
return event.from_ipc_descriptor, (event.ipc_descriptor,)
328331

329332
multiprocessing.reduction.register(Event, _reduce_event)

cuda_core/cuda/core/_kernel_arg_handler.pyx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import numpy
1818
from cuda.core._memory import Buffer
1919
from cuda.core._tensor_map import TensorMapDescriptor as _TensorMapDescriptor_py
2020
from cuda.core._tensor_map cimport TensorMapDescriptor
21+
from cuda.core.graph._graph_definition cimport GraphCondition
2122
from cuda.core._utils.cuda_utils import driver
2223
from cuda.bindings cimport cydriver
2324

@@ -318,6 +319,11 @@ cdef class ParamHolder:
318319
if arg_type is driver.CUgraphConditionalHandle:
319320
prepare_arg[cydriver.CUgraphConditionalHandle](self.data, self.data_addresses, <intptr_t>int(arg), i)
320321
continue
322+
elif arg_type is GraphCondition:
323+
prepare_arg[cydriver.CUgraphConditionalHandle](
324+
self.data, self.data_addresses,
325+
<intptr_t><unsigned long long>(<GraphCondition>arg)._c_handle, i)
326+
continue
321327
# If no exact types are found, fallback to slower `isinstance` check
322328
elif isinstance(arg, Buffer):
323329
if isinstance(arg.handle, int):
@@ -341,6 +347,11 @@ cdef class ParamHolder:
341347
elif isinstance(arg, driver.CUgraphConditionalHandle):
342348
prepare_arg[cydriver.CUgraphConditionalHandle](self.data, self.data_addresses, arg, i)
343349
continue
350+
elif isinstance(arg, GraphCondition):
351+
prepare_arg[cydriver.CUgraphConditionalHandle](
352+
self.data, self.data_addresses,
353+
<intptr_t><unsigned long long>(<GraphCondition>arg)._c_handle, i)
354+
continue
344355
# TODO: support ctypes/numpy struct
345356
raise TypeError("the argument is of unsupported type: " + str(type(arg)))
346357

cuda_core/cuda/core/_launch_config.pxd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ cdef class LaunchConfig:
1414
public tuple cluster
1515
public tuple block
1616
public int shmem_size
17-
public bint cooperative_launch
17+
public bint is_cooperative
1818

1919
vector[cydriver.CUlaunchAttribute] _attrs
2020
object __weakref__

0 commit comments

Comments
 (0)