pyopencl 2025.2.1__cp311-cp311-macosx_11_0_arm64.whl → 2025.2.2__cp311-cp311-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyopencl might be problematic. Click here for more details.
- pyopencl/__init__.py +16 -2
- pyopencl/array.py +276 -234
- pyopencl/compyte/.basedpyright/baseline.json +1272 -0
- pyopencl/compyte/array.py +33 -6
- pyopencl/compyte/dtypes.py +39 -13
- pyopencl/compyte/pyproject.toml +15 -0
- pyopencl/reduction.py +55 -28
- pyopencl/typing.py +7 -2
- {pyopencl-2025.2.1.dist-info → pyopencl-2025.2.2.dist-info}/METADATA +1 -1
- {pyopencl-2025.2.1.dist-info → pyopencl-2025.2.2.dist-info}/RECORD +12 -11
- {pyopencl-2025.2.1.dist-info → pyopencl-2025.2.2.dist-info}/WHEEL +0 -0
- {pyopencl-2025.2.1.dist-info → pyopencl-2025.2.2.dist-info}/licenses/LICENSE +0 -0
pyopencl/compyte/array.py
CHANGED
|
@@ -20,10 +20,13 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
20
20
|
THE SOFTWARE.
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
+
from typing import Any, Protocol
|
|
24
|
+
|
|
23
25
|
import numpy as np
|
|
26
|
+
from typing_extensions import override
|
|
24
27
|
|
|
25
28
|
|
|
26
|
-
def f_contiguous_strides(itemsize, shape):
|
|
29
|
+
def f_contiguous_strides(itemsize: int, shape: tuple[int, ...]) -> tuple[int, ...]:
|
|
27
30
|
if shape:
|
|
28
31
|
strides = [itemsize]
|
|
29
32
|
for s in shape[:-1]:
|
|
@@ -36,7 +39,7 @@ def f_contiguous_strides(itemsize, shape):
|
|
|
36
39
|
return ()
|
|
37
40
|
|
|
38
41
|
|
|
39
|
-
def c_contiguous_strides(itemsize, shape):
|
|
42
|
+
def c_contiguous_strides(itemsize: int, shape: tuple[int, ...]) -> tuple[int, ...]:
|
|
40
43
|
if shape:
|
|
41
44
|
strides = [itemsize]
|
|
42
45
|
for s in shape[:0:-1]:
|
|
@@ -49,7 +52,11 @@ def c_contiguous_strides(itemsize, shape):
|
|
|
49
52
|
return ()
|
|
50
53
|
|
|
51
54
|
|
|
52
|
-
def equal_strides(
|
|
55
|
+
def equal_strides(
|
|
56
|
+
strides1: tuple[int, ...],
|
|
57
|
+
strides2: tuple[int, ...],
|
|
58
|
+
shape: tuple[int, ...]
|
|
59
|
+
) -> bool:
|
|
53
60
|
if strides1 == strides2:
|
|
54
61
|
return True
|
|
55
62
|
|
|
@@ -63,33 +70,53 @@ def equal_strides(strides1, strides2, shape):
|
|
|
63
70
|
return True
|
|
64
71
|
|
|
65
72
|
|
|
66
|
-
def is_f_contiguous_strides(
|
|
73
|
+
def is_f_contiguous_strides(
|
|
74
|
+
strides: tuple[int, ...],
|
|
75
|
+
itemsize: int,
|
|
76
|
+
shape: tuple[int, ...]
|
|
77
|
+
) -> bool:
|
|
67
78
|
from pytools import product
|
|
68
79
|
return (
|
|
69
80
|
equal_strides(strides, f_contiguous_strides(itemsize, shape), shape)
|
|
70
81
|
or product(shape) == 0)
|
|
71
82
|
|
|
72
83
|
|
|
73
|
-
def is_c_contiguous_strides(
|
|
84
|
+
def is_c_contiguous_strides(
|
|
85
|
+
strides: tuple[int, ...],
|
|
86
|
+
itemsize: int,
|
|
87
|
+
shape: tuple[int, ...]
|
|
88
|
+
) -> bool:
|
|
74
89
|
from pytools import product
|
|
75
90
|
return (equal_strides(strides, c_contiguous_strides(itemsize, shape), shape)
|
|
76
91
|
or product(shape) == 0)
|
|
77
92
|
|
|
78
93
|
|
|
94
|
+
class ArrayIsh(Protocol):
|
|
95
|
+
shape: tuple[int, ...]
|
|
96
|
+
strides: tuple[int, ...]
|
|
97
|
+
dtype: np.dtype[Any]
|
|
98
|
+
|
|
99
|
+
|
|
79
100
|
class ArrayFlags:
|
|
80
|
-
|
|
101
|
+
f_contiguous: bool
|
|
102
|
+
c_contiguous: bool
|
|
103
|
+
forc: bool
|
|
104
|
+
|
|
105
|
+
def __init__(self, ary: ArrayIsh):
|
|
81
106
|
self.f_contiguous = is_f_contiguous_strides(
|
|
82
107
|
ary.strides, ary.dtype.itemsize, ary.shape)
|
|
83
108
|
self.c_contiguous = is_c_contiguous_strides(
|
|
84
109
|
ary.strides, ary.dtype.itemsize, ary.shape)
|
|
85
110
|
self.forc = self.f_contiguous or self.c_contiguous
|
|
86
111
|
|
|
112
|
+
@override
|
|
87
113
|
def __repr__(self):
|
|
88
114
|
return (
|
|
89
115
|
f" C_CONTIGUOUS : {self.c_contiguous}\n"
|
|
90
116
|
f" F_CONTIGUOUS : {self.f_contiguous}"
|
|
91
117
|
)
|
|
92
118
|
|
|
119
|
+
@override
|
|
93
120
|
def __str__(self):
|
|
94
121
|
return repr(self)
|
|
95
122
|
|
pyopencl/compyte/dtypes.py
CHANGED
|
@@ -26,7 +26,11 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
|
26
26
|
OTHER DEALINGS IN THE SOFTWARE.
|
|
27
27
|
"""
|
|
28
28
|
|
|
29
|
+
from collections.abc import Sequence
|
|
30
|
+
from typing import Any, Callable, TypeVar
|
|
31
|
+
|
|
29
32
|
import numpy as np
|
|
33
|
+
from numpy.typing import DTypeLike
|
|
30
34
|
|
|
31
35
|
|
|
32
36
|
class TypeNameNotKnown(RuntimeError): # noqa: N818
|
|
@@ -36,11 +40,16 @@ class TypeNameNotKnown(RuntimeError): # noqa: N818
|
|
|
36
40
|
# {{{ registry
|
|
37
41
|
|
|
38
42
|
class DTypeRegistry:
|
|
43
|
+
dtype_to_name: dict[np.dtype[Any] | str, str]
|
|
44
|
+
name_to_dtype: dict[str, np.dtype[Any]]
|
|
45
|
+
|
|
39
46
|
def __init__(self):
|
|
40
47
|
self.dtype_to_name = {}
|
|
41
48
|
self.name_to_dtype = {}
|
|
42
49
|
|
|
43
|
-
def get_or_register_dtype(self,
|
|
50
|
+
def get_or_register_dtype(self,
|
|
51
|
+
c_names: str | Sequence[str],
|
|
52
|
+
dtype: DTypeLike | None = None):
|
|
44
53
|
"""Get or register a :class:`numpy.dtype` associated with the C type names
|
|
45
54
|
in the string list *c_names*. If *dtype* is `None`, no registration is
|
|
46
55
|
performed, and the :class:`numpy.dtype` must already have been registered.
|
|
@@ -94,8 +103,8 @@ class DTypeRegistry:
|
|
|
94
103
|
|
|
95
104
|
return dtype
|
|
96
105
|
|
|
97
|
-
def dtype_to_ctype(self, dtype):
|
|
98
|
-
if dtype is None:
|
|
106
|
+
def dtype_to_ctype(self, dtype: np.dtype[Any]) -> str:
|
|
107
|
+
if dtype is None: # pyright: ignore[reportUnnecessaryComparison]
|
|
99
108
|
raise ValueError("dtype may not be None")
|
|
100
109
|
|
|
101
110
|
dtype = np.dtype(dtype)
|
|
@@ -110,7 +119,11 @@ class DTypeRegistry:
|
|
|
110
119
|
|
|
111
120
|
# {{{ C types
|
|
112
121
|
|
|
113
|
-
def fill_registry_with_c_types(
|
|
122
|
+
def fill_registry_with_c_types(
|
|
123
|
+
reg: DTypeRegistry,
|
|
124
|
+
respect_windows: bool,
|
|
125
|
+
include_bool: bool = True
|
|
126
|
+
) -> None:
|
|
114
127
|
import struct
|
|
115
128
|
from sys import platform
|
|
116
129
|
|
|
@@ -157,7 +170,7 @@ def fill_registry_with_c_types(reg, respect_windows, include_bool=True):
|
|
|
157
170
|
reg.get_or_register_dtype("double", np.float64)
|
|
158
171
|
|
|
159
172
|
|
|
160
|
-
def fill_registry_with_opencl_c_types(reg):
|
|
173
|
+
def fill_registry_with_opencl_c_types(reg: DTypeRegistry) -> None:
|
|
161
174
|
reg.get_or_register_dtype(["char", "signed char"], np.int8)
|
|
162
175
|
reg.get_or_register_dtype(["uchar", "unsigned char"], np.uint8)
|
|
163
176
|
reg.get_or_register_dtype(["short", "signed short",
|
|
@@ -183,7 +196,7 @@ def fill_registry_with_opencl_c_types(reg):
|
|
|
183
196
|
reg.get_or_register_dtype("double", np.float64)
|
|
184
197
|
|
|
185
198
|
|
|
186
|
-
def fill_registry_with_c99_stdint_types(reg):
|
|
199
|
+
def fill_registry_with_c99_stdint_types(reg: DTypeRegistry) -> None:
|
|
187
200
|
reg.get_or_register_dtype("bool", np.bool_)
|
|
188
201
|
|
|
189
202
|
reg.get_or_register_dtype("int8_t", np.int8)
|
|
@@ -200,7 +213,7 @@ def fill_registry_with_c99_stdint_types(reg):
|
|
|
200
213
|
reg.get_or_register_dtype("double", np.float64)
|
|
201
214
|
|
|
202
215
|
|
|
203
|
-
def fill_registry_with_c99_complex_types(reg):
|
|
216
|
+
def fill_registry_with_c99_complex_types(reg: DTypeRegistry) -> None:
|
|
204
217
|
reg.get_or_register_dtype("float complex", np.complex64)
|
|
205
218
|
reg.get_or_register_dtype("double complex", np.complex128)
|
|
206
219
|
reg.get_or_register_dtype("long double complex", np.clongdouble)
|
|
@@ -229,12 +242,21 @@ def _fill_dtype_registry(respect_windows, include_bool=True):
|
|
|
229
242
|
|
|
230
243
|
# {{{ c declarator parsing
|
|
231
244
|
|
|
232
|
-
|
|
233
|
-
|
|
245
|
+
ArgTypeT = TypeVar("ArgTypeT")
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def parse_c_arg_backend(
|
|
249
|
+
c_arg: str,
|
|
250
|
+
scalar_arg_factory: Callable[[np.dtype[Any], str], ArgTypeT],
|
|
251
|
+
vec_arg_factory: Callable[[np.dtype[Any], str], ArgTypeT],
|
|
252
|
+
name_to_dtype: Callable[[str], np.dtype[Any]] | DTypeRegistry | None = None,
|
|
253
|
+
):
|
|
234
254
|
if isinstance(name_to_dtype, DTypeRegistry):
|
|
235
|
-
|
|
255
|
+
name_to_dtype_clbl = name_to_dtype.name_to_dtype.__getitem__
|
|
236
256
|
elif name_to_dtype is None:
|
|
237
|
-
|
|
257
|
+
name_to_dtype_clbl = NAME_TO_DTYPE.__getitem__
|
|
258
|
+
else:
|
|
259
|
+
name_to_dtype_clbl = name_to_dtype
|
|
238
260
|
|
|
239
261
|
c_arg = (c_arg
|
|
240
262
|
.replace("const", "")
|
|
@@ -261,7 +283,7 @@ def parse_c_arg_backend(c_arg, scalar_arg_factory, vec_arg_factory,
|
|
|
261
283
|
tp = " ".join(tp.split())
|
|
262
284
|
|
|
263
285
|
try:
|
|
264
|
-
dtype =
|
|
286
|
+
dtype = name_to_dtype_clbl(tp)
|
|
265
287
|
except KeyError:
|
|
266
288
|
raise ValueError(f"unknown type '{tp}'") from None
|
|
267
289
|
|
|
@@ -270,7 +292,11 @@ def parse_c_arg_backend(c_arg, scalar_arg_factory, vec_arg_factory,
|
|
|
270
292
|
# }}}
|
|
271
293
|
|
|
272
294
|
|
|
273
|
-
def register_dtype(
|
|
295
|
+
def register_dtype(
|
|
296
|
+
dtype: DTypeLike,
|
|
297
|
+
c_names: Sequence[str] | str,
|
|
298
|
+
alias_ok: bool = False
|
|
299
|
+
) -> None:
|
|
274
300
|
from warnings import warn
|
|
275
301
|
warn("register_dtype is deprecated. Use get_or_register_dtype instead.",
|
|
276
302
|
DeprecationWarning, stacklevel=2)
|
pyopencl/compyte/pyproject.toml
CHANGED
|
@@ -32,3 +32,18 @@ known-first-party = [
|
|
|
32
32
|
"pytools",
|
|
33
33
|
]
|
|
34
34
|
lines-after-imports = 2
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
[tool.basedpyright]
|
|
38
|
+
reportImplicitStringConcatenation = "none"
|
|
39
|
+
reportUnnecessaryIsInstance = "none"
|
|
40
|
+
reportUnusedCallResult = "none"
|
|
41
|
+
reportExplicitAny = "none"
|
|
42
|
+
reportUnreachable = "hint"
|
|
43
|
+
|
|
44
|
+
# This reports even cycles that are qualified by 'if TYPE_CHECKING'. Not what
|
|
45
|
+
# we care about at this moment.
|
|
46
|
+
# https://github.com/microsoft/pyright/issues/746
|
|
47
|
+
reportImportCycles = "none"
|
|
48
|
+
pythonVersion = "3.10"
|
|
49
|
+
pythonPlatform = "All"
|
pyopencl/reduction.py
CHANGED
|
@@ -30,12 +30,14 @@ Based on code/ideas by Mark Harris <mharris@nvidia.com>.
|
|
|
30
30
|
None of the original source code remains.
|
|
31
31
|
"""
|
|
32
32
|
|
|
33
|
+
import builtins
|
|
33
34
|
from dataclasses import dataclass
|
|
34
|
-
from typing import Any
|
|
35
|
+
from typing import TYPE_CHECKING, Any, Literal, cast, overload
|
|
35
36
|
|
|
36
37
|
import numpy as np
|
|
37
38
|
|
|
38
39
|
import pyopencl as cl
|
|
40
|
+
import pyopencl.array as cl_array
|
|
39
41
|
from pyopencl.tools import (
|
|
40
42
|
DtypedArgument,
|
|
41
43
|
KernelTemplateBase,
|
|
@@ -45,6 +47,10 @@ from pyopencl.tools import (
|
|
|
45
47
|
)
|
|
46
48
|
|
|
47
49
|
|
|
50
|
+
if TYPE_CHECKING:
|
|
51
|
+
from pyopencl.typing import Allocator
|
|
52
|
+
|
|
53
|
+
|
|
48
54
|
# {{{ kernel source
|
|
49
55
|
|
|
50
56
|
KERNEL = r"""//CL//
|
|
@@ -351,7 +357,40 @@ class ReductionKernel:
|
|
|
351
357
|
name=f"{name}_stage2", options=options, preamble=preamble,
|
|
352
358
|
max_group_size=max_group_size)
|
|
353
359
|
|
|
354
|
-
|
|
360
|
+
@overload
|
|
361
|
+
def __call__(self,
|
|
362
|
+
*args: object,
|
|
363
|
+
return_event: Literal[True],
|
|
364
|
+
queue: cl.CommandQueue | None = None,
|
|
365
|
+
allocator: Allocator | None = None,
|
|
366
|
+
wait_for: cl.WaitList = None,
|
|
367
|
+
out: cl_array.Array | None = None,
|
|
368
|
+
range: slice | None = None,
|
|
369
|
+
slice: slice | None = None
|
|
370
|
+
) -> tuple[cl_array.Array, cl.Event]: ...
|
|
371
|
+
|
|
372
|
+
@overload
|
|
373
|
+
def __call__(self,
|
|
374
|
+
*args: object,
|
|
375
|
+
return_event: Literal[False],
|
|
376
|
+
queue: cl.CommandQueue | None = None,
|
|
377
|
+
allocator: Allocator | None = None,
|
|
378
|
+
wait_for: cl.WaitList = None,
|
|
379
|
+
out: cl_array.Array | None = None,
|
|
380
|
+
range: slice | None = None,
|
|
381
|
+
slice: slice | None = None
|
|
382
|
+
) -> cl_array.Array: ...
|
|
383
|
+
|
|
384
|
+
def __call__(self,
|
|
385
|
+
*args: object,
|
|
386
|
+
return_event: bool = False,
|
|
387
|
+
queue: cl.CommandQueue | None = None,
|
|
388
|
+
allocator: Allocator | None = None,
|
|
389
|
+
wait_for: cl.WaitList = None,
|
|
390
|
+
out: cl_array.Array | None = None,
|
|
391
|
+
range: slice | None = None,
|
|
392
|
+
slice: slice | None = None
|
|
393
|
+
) -> cl_array.Array | tuple[cl_array.Array, cl.Event]:
|
|
355
394
|
"""Invoke the generated kernel.
|
|
356
395
|
|
|
357
396
|
|explain-waitfor|
|
|
@@ -390,18 +429,6 @@ class ReductionKernel:
|
|
|
390
429
|
``(scalar_array, event)``.
|
|
391
430
|
"""
|
|
392
431
|
|
|
393
|
-
queue = kwargs.pop("queue", None)
|
|
394
|
-
allocator = kwargs.pop("allocator", None)
|
|
395
|
-
wait_for = kwargs.pop("wait_for", None)
|
|
396
|
-
return_event = kwargs.pop("return_event", False)
|
|
397
|
-
out = kwargs.pop("out", None)
|
|
398
|
-
|
|
399
|
-
range_ = kwargs.pop("range", None)
|
|
400
|
-
slice_ = kwargs.pop("slice", None)
|
|
401
|
-
|
|
402
|
-
if kwargs:
|
|
403
|
-
raise TypeError("invalid keyword argument to reduction kernel")
|
|
404
|
-
|
|
405
432
|
if wait_for is None:
|
|
406
433
|
wait_for = []
|
|
407
434
|
else:
|
|
@@ -415,13 +442,14 @@ class ReductionKernel:
|
|
|
415
442
|
|
|
416
443
|
while True:
|
|
417
444
|
invocation_args = []
|
|
418
|
-
vectors = []
|
|
445
|
+
vectors: list[cl_array.Array] = []
|
|
419
446
|
|
|
420
447
|
array_empty = empty
|
|
421
448
|
|
|
422
449
|
from pyopencl.tools import VectorArg
|
|
423
450
|
for arg, arg_tp in zip(args, stage_inf.arg_types, strict=True):
|
|
424
451
|
if isinstance(arg_tp, VectorArg):
|
|
452
|
+
assert isinstance(arg, cl_array.Array)
|
|
425
453
|
array_empty = arg.__class__
|
|
426
454
|
if not arg.flags.forc:
|
|
427
455
|
raise RuntimeError(
|
|
@@ -443,31 +471,30 @@ class ReductionKernel:
|
|
|
443
471
|
|
|
444
472
|
# {{{ range/slice processing
|
|
445
473
|
|
|
446
|
-
if
|
|
447
|
-
if
|
|
474
|
+
if range is not None:
|
|
475
|
+
if slice is not None:
|
|
448
476
|
raise TypeError("may not specify both range and slice "
|
|
449
477
|
"keyword arguments")
|
|
450
478
|
|
|
451
479
|
else:
|
|
452
|
-
if
|
|
453
|
-
|
|
480
|
+
if slice is None:
|
|
481
|
+
slice = builtins.slice(None)
|
|
454
482
|
|
|
455
483
|
if repr_vec is None:
|
|
456
484
|
raise TypeError(
|
|
457
485
|
"must have vector argument when range is not specified")
|
|
458
486
|
|
|
459
|
-
|
|
487
|
+
range = builtins.slice(*slice.indices(repr_vec.size))
|
|
460
488
|
|
|
461
|
-
assert
|
|
489
|
+
assert range is not None
|
|
462
490
|
|
|
463
|
-
start =
|
|
491
|
+
start = cast("int | None", range.start)
|
|
464
492
|
if start is None:
|
|
465
493
|
start = 0
|
|
466
|
-
|
|
494
|
+
step = cast("int | None", range.step)
|
|
495
|
+
if step is None:
|
|
467
496
|
step = 1
|
|
468
|
-
|
|
469
|
-
step = range_.step
|
|
470
|
-
sz = abs(range_.stop - start)//step
|
|
497
|
+
sz = abs(cast("int", range.stop) - start) //step
|
|
471
498
|
|
|
472
499
|
# }}}
|
|
473
500
|
|
|
@@ -504,7 +531,7 @@ class ReductionKernel:
|
|
|
504
531
|
macrogroup_size = group_count*stage_inf.group_size
|
|
505
532
|
seq_count = (sz + macrogroup_size - 1) // macrogroup_size
|
|
506
533
|
|
|
507
|
-
size_args = [start, step,
|
|
534
|
+
size_args = [start, step, range.stop, seq_count, sz]
|
|
508
535
|
|
|
509
536
|
if group_count == 1 and out is not None:
|
|
510
537
|
result = out
|
|
@@ -536,7 +563,7 @@ class ReductionKernel:
|
|
|
536
563
|
stage_inf = self.stage_2_inf
|
|
537
564
|
args = (result, *stage1_args)
|
|
538
565
|
|
|
539
|
-
|
|
566
|
+
range = slice = None
|
|
540
567
|
|
|
541
568
|
# }}}
|
|
542
569
|
|
pyopencl/typing.py
CHANGED
|
@@ -23,7 +23,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
23
23
|
THE SOFTWARE.
|
|
24
24
|
"""
|
|
25
25
|
|
|
26
|
-
from collections.abc import Sequence
|
|
26
|
+
from collections.abc import Callable, Sequence
|
|
27
27
|
from typing import TYPE_CHECKING, Any, TypeAlias, TypeVar
|
|
28
28
|
|
|
29
29
|
import numpy as np
|
|
@@ -33,6 +33,7 @@ from typing_extensions import Buffer as abc_Buffer
|
|
|
33
33
|
|
|
34
34
|
if TYPE_CHECKING:
|
|
35
35
|
import pyopencl as _cl
|
|
36
|
+
import pyopencl.array as _cl_array
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
DTypeT = TypeVar("DTypeT", bound=np.dtype[Any])
|
|
@@ -49,4 +50,8 @@ KernelArg: TypeAlias = """
|
|
|
49
50
|
| _cl.Buffer
|
|
50
51
|
| _cl.Image
|
|
51
52
|
| _cl.Sampler
|
|
52
|
-
| _cl.SVMPointer
|
|
53
|
+
| _cl.SVMPointer
|
|
54
|
+
| _cl_array.Array
|
|
55
|
+
| None"""
|
|
56
|
+
|
|
57
|
+
Allocator: TypeAlias = "Callable[[int], _cl.MemoryObjectHolder | _cl.SVMPointer]"
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
pyopencl-2025.2.1.dist-info/RECORD,,
|
|
2
|
-
pyopencl-2025.2.1.dist-info/WHEEL,sha256=7CikrUOKtiy-2ivl-sZ5UBq05y8ywDmf9_HO2E_GAYY,141
|
|
3
|
-
pyopencl-2025.2.1.dist-info/METADATA,sha256=ZWuBJXxGy78MiQ68EB8rPStHxAZ7PNgk5LJqDH2OFbg,4756
|
|
4
|
-
pyopencl-2025.2.1.dist-info/licenses/LICENSE,sha256=wiBvs-UC54bB5DswWuvB66B96b4hkYw_VLt8IR0cBPI,15284
|
|
5
1
|
pyopencl/algorithm.py,sha256=NuBpzVlfY8V6nKcGcQe5uXGnVka7LV1hHCi-uBCAxVc,51370
|
|
6
2
|
pyopencl/clmath.py,sha256=d5aHPy0WQMb01anNAX2nk7t-yRBIEif7sW3aTXEiEUo,8258
|
|
7
3
|
pyopencl/version.py,sha256=53bqHNFDyobSVMAdQ47kiOx1UdhKXDLkTtzNwfLEvY4,304
|
|
8
4
|
pyopencl/capture_call.py,sha256=c1X3HKwtikqgkSuMSvMNKezYCrAtCc8Wt60cvGfFJTQ,6479
|
|
9
|
-
pyopencl/reduction.py,sha256=
|
|
5
|
+
pyopencl/reduction.py,sha256=2Gf91Rw0mUu61SVSqhYWhReV5Ru28Qw60CXmXLhSDO8,26644
|
|
10
6
|
pyopencl/tools.py,sha256=bKX4ND-DcKXr7dCFJoJ6C3SWPNFNKA490oDofTaRuCI,46596
|
|
11
7
|
pyopencl/elementwise.py,sha256=uc8aXWv60yUtlwwKhCOVVeo5o7ylPoQPTRLsnRF6gTY,38678
|
|
12
8
|
pyopencl/cache.py,sha256=RiSW4K8FynlV8ibwyDngzSFOa3k-Zi16GSSK05yrdZk,16017
|
|
13
|
-
pyopencl/__init__.py,sha256=
|
|
9
|
+
pyopencl/__init__.py,sha256=70i8Bo6qCxXT61loiSs4MfHBk_MDzgDN9eVMnR8Kab4,63178
|
|
14
10
|
pyopencl/_cl.pyi,sha256=VmAi42KFEFL5UdCMuX7I45j16mve3RBGXFfkbSwBICw,56235
|
|
15
11
|
pyopencl/cltypes.py,sha256=hDpwt24YFtng0Z4qNJB5D0NxkOIGwnLRUQKoaWcMcnE,6045
|
|
16
12
|
pyopencl/invoker.py,sha256=ws1kdpzIkc7vc7s4jxtJ7IcdCa5qOT5DiYW6rMxjVVg,13706
|
|
@@ -21,16 +17,17 @@ pyopencl/_cluda.py,sha256=kjI6pW9M-zGCVDsautsKsYMs1U9v73_W5riUjdzmKA0,2111
|
|
|
21
17
|
pyopencl/_cl.cpython-311-darwin.so,sha256=QoKLIpHEtXulXf1-d_lE37FBk1lWnpzSVt0UGcFfFHg,539736
|
|
22
18
|
pyopencl/_mymako.py,sha256=1xp0pWcE57hpIDKw915CvOGQpC-Jral02Inykx_k198,657
|
|
23
19
|
pyopencl/_monkeypatch.py,sha256=bBJjQYW6XdiurbG_jgTzJg5BtDteuNVqRQ3Fuzx-Gbk,34845
|
|
24
|
-
pyopencl/typing.py,sha256=
|
|
25
|
-
pyopencl/array.py,sha256=
|
|
20
|
+
pyopencl/typing.py,sha256=DbU4i2J3fMXRqK49rbsaOpMz7xsaeTMY66iMsc6ZOmo,1970
|
|
21
|
+
pyopencl/array.py,sha256=_6HR45dN7bH9uiTDPXqbco8ZDKlddkOIzLMV14j_LWg,111551
|
|
26
22
|
pyopencl/bitonic_sort.py,sha256=FpTfCf_s22O-SgPWBoXZjCG_k1afm7uUwnO9N7jubgg,8052
|
|
27
23
|
pyopencl/bitonic_sort_templates.py,sha256=316nsWdr7jpg9g8SmZk8KCoHmHKabjvOdBaufxQPw8Y,16188
|
|
28
24
|
pyopencl/clrandom.py,sha256=Ox_Eebq5fcjsBXpa68C1kt8Ca6CPi5tXwXhEhLY_yP8,13081
|
|
29
|
-
pyopencl/compyte/pyproject.toml,sha256=
|
|
25
|
+
pyopencl/compyte/pyproject.toml,sha256=yISxFxhotloFnx_Adffvnr0w2samJwGonr64Eq2YDQo,1145
|
|
30
26
|
pyopencl/compyte/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
-
pyopencl/compyte/dtypes.py,sha256=
|
|
27
|
+
pyopencl/compyte/dtypes.py,sha256=NIv-oOc-DO6YLvX34grMUdefqWVl6QbxztWsGcvnuvA,10803
|
|
32
28
|
pyopencl/compyte/.gitignore,sha256=HVYtbKRtOCPWZavrgYqO2u7UKFiE7g7ympmuQzKbBBw,168
|
|
33
|
-
pyopencl/compyte/array.py,sha256=
|
|
29
|
+
pyopencl/compyte/array.py,sha256=t1XORyCQ4zRe_KUnoo4LH1W5XOcGXaf5xvGtgOPDzyg,8035
|
|
30
|
+
pyopencl/compyte/.basedpyright/baseline.json,sha256=3HQHk-43Nuqf3UVXVCQli6nXbrqnrQvQtsZPjuLR61g,37643
|
|
34
31
|
pyopencl/characterize/__init__.py,sha256=AaDNS1p2RtXqGf6tA--GB9FRp-fzavbpgulrAW_BE2Y,14565
|
|
35
32
|
pyopencl/characterize/performance.py,sha256=i8X1jWlyL1bUD7wuDoSlk1CckJkT6zAVPefziQwmNXU,6903
|
|
36
33
|
pyopencl/cl/pyopencl-bessel-y.cl,sha256=VDy8l4lVxO8VcJR_maeGu_Qjnw27j28zBwhaTKDhBBg,12297
|
|
@@ -44,3 +41,7 @@ pyopencl/cl/pyopencl-random123/threefry.cl,sha256=2WmQGxx5gPSv22UL9_MlXv0eMug91k
|
|
|
44
41
|
pyopencl/cl/pyopencl-random123/philox.cl,sha256=vYcQH7Vw13Q3qkW5Nhy1HTUDbWLGKoloE1YP0VWk6vU,21740
|
|
45
42
|
pyopencl/cl/pyopencl-random123/array.h,sha256=nIV0zDWYuybldNgtsh79icNtDXHYdDsSpFaWIvDTyw4,17088
|
|
46
43
|
pyopencl/cl/pyopencl-random123/openclfeatures.h,sha256=pAPbl7JkQgJxulSuGGevpaI43P7PwiH2mYxtNfHq59M,2881
|
|
44
|
+
pyopencl-2025.2.2.dist-info/RECORD,,
|
|
45
|
+
pyopencl-2025.2.2.dist-info/WHEEL,sha256=7CikrUOKtiy-2ivl-sZ5UBq05y8ywDmf9_HO2E_GAYY,141
|
|
46
|
+
pyopencl-2025.2.2.dist-info/METADATA,sha256=PtweID2xOHA7p_vJBtyUejmEOn9Mw0_s1mlTWubMAH8,4756
|
|
47
|
+
pyopencl-2025.2.2.dist-info/licenses/LICENSE,sha256=wiBvs-UC54bB5DswWuvB66B96b4hkYw_VLt8IR0cBPI,15284
|
|
File without changes
|
|
File without changes
|