pyopencl 2024.2.2__cp310-cp310-macosx_11_0_arm64.whl → 2024.2.5__cp310-cp310-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.

Files changed (99) hide show
  1. pyopencl/__init__.py +16 -4
  2. pyopencl/_cl.cpython-310-darwin.so +0 -0
  3. pyopencl/algorithm.py +3 -1
  4. pyopencl/bitonic_sort.py +2 -0
  5. pyopencl/characterize/__init__.py +23 -0
  6. pyopencl/compyte/.git +1 -0
  7. pyopencl/compyte/.gitignore +21 -0
  8. pyopencl/compyte/ndarray/Makefile +31 -0
  9. pyopencl/compyte/ndarray/gpu_ndarray.h +35 -0
  10. pyopencl/compyte/ndarray/pygpu_language.h +207 -0
  11. pyopencl/compyte/ndarray/pygpu_language_cuda.cu +622 -0
  12. pyopencl/compyte/ndarray/pygpu_language_opencl.cpp +317 -0
  13. pyopencl/compyte/ndarray/pygpu_ndarray.cpp +1546 -0
  14. pyopencl/compyte/ndarray/pygpu_ndarray.h +71 -0
  15. pyopencl/compyte/ndarray/pygpu_ndarray_object.h +232 -0
  16. pyopencl/tools.py +60 -56
  17. pyopencl/version.py +9 -3
  18. {pyopencl-2024.2.2.dist-info → pyopencl-2024.2.5.dist-info}/METADATA +14 -14
  19. pyopencl-2024.2.5.dist-info/RECORD +56 -0
  20. {pyopencl-2024.2.2.dist-info → pyopencl-2024.2.5.dist-info}/WHEEL +1 -1
  21. pyopencl-2024.2.2.data/data/CITATION.cff +0 -74
  22. pyopencl-2024.2.2.data/data/CMakeLists.txt +0 -83
  23. pyopencl-2024.2.2.data/data/Makefile.in +0 -21
  24. pyopencl-2024.2.2.data/data/README.rst +0 -70
  25. pyopencl-2024.2.2.data/data/README_SETUP.txt +0 -34
  26. pyopencl-2024.2.2.data/data/aksetup_helper.py +0 -1013
  27. pyopencl-2024.2.2.data/data/configure.py +0 -6
  28. pyopencl-2024.2.2.data/data/contrib/cldis.py +0 -91
  29. pyopencl-2024.2.2.data/data/contrib/fortran-to-opencl/README +0 -29
  30. pyopencl-2024.2.2.data/data/contrib/fortran-to-opencl/translate.py +0 -1441
  31. pyopencl-2024.2.2.data/data/contrib/pyopencl.vim +0 -84
  32. pyopencl-2024.2.2.data/data/doc/Makefile +0 -23
  33. pyopencl-2024.2.2.data/data/doc/algorithm.rst +0 -214
  34. pyopencl-2024.2.2.data/data/doc/array.rst +0 -305
  35. pyopencl-2024.2.2.data/data/doc/conf.py +0 -26
  36. pyopencl-2024.2.2.data/data/doc/howto.rst +0 -105
  37. pyopencl-2024.2.2.data/data/doc/index.rst +0 -137
  38. pyopencl-2024.2.2.data/data/doc/make_constants.py +0 -561
  39. pyopencl-2024.2.2.data/data/doc/misc.rst +0 -885
  40. pyopencl-2024.2.2.data/data/doc/runtime.rst +0 -51
  41. pyopencl-2024.2.2.data/data/doc/runtime_const.rst +0 -30
  42. pyopencl-2024.2.2.data/data/doc/runtime_gl.rst +0 -78
  43. pyopencl-2024.2.2.data/data/doc/runtime_memory.rst +0 -527
  44. pyopencl-2024.2.2.data/data/doc/runtime_platform.rst +0 -184
  45. pyopencl-2024.2.2.data/data/doc/runtime_program.rst +0 -364
  46. pyopencl-2024.2.2.data/data/doc/runtime_queue.rst +0 -182
  47. pyopencl-2024.2.2.data/data/doc/subst.rst +0 -36
  48. pyopencl-2024.2.2.data/data/doc/tools.rst +0 -4
  49. pyopencl-2024.2.2.data/data/doc/types.rst +0 -42
  50. pyopencl-2024.2.2.data/data/examples/black-hole-accretion.py +0 -2227
  51. pyopencl-2024.2.2.data/data/examples/demo-struct-reduce.py +0 -75
  52. pyopencl-2024.2.2.data/data/examples/demo.py +0 -39
  53. pyopencl-2024.2.2.data/data/examples/demo_array.py +0 -32
  54. pyopencl-2024.2.2.data/data/examples/demo_array_svm.py +0 -37
  55. pyopencl-2024.2.2.data/data/examples/demo_elementwise.py +0 -34
  56. pyopencl-2024.2.2.data/data/examples/demo_elementwise_complex.py +0 -53
  57. pyopencl-2024.2.2.data/data/examples/demo_mandelbrot.py +0 -183
  58. pyopencl-2024.2.2.data/data/examples/demo_meta_codepy.py +0 -56
  59. pyopencl-2024.2.2.data/data/examples/demo_meta_template.py +0 -55
  60. pyopencl-2024.2.2.data/data/examples/dump-performance.py +0 -38
  61. pyopencl-2024.2.2.data/data/examples/dump-properties.py +0 -86
  62. pyopencl-2024.2.2.data/data/examples/gl_interop_demo.py +0 -84
  63. pyopencl-2024.2.2.data/data/examples/gl_particle_animation.py +0 -218
  64. pyopencl-2024.2.2.data/data/examples/ipython-demo.ipynb +0 -203
  65. pyopencl-2024.2.2.data/data/examples/median-filter.py +0 -99
  66. pyopencl-2024.2.2.data/data/examples/n-body.py +0 -1070
  67. pyopencl-2024.2.2.data/data/examples/narray.py +0 -37
  68. pyopencl-2024.2.2.data/data/examples/noisyImage.jpg +0 -0
  69. pyopencl-2024.2.2.data/data/examples/pi-monte-carlo.py +0 -1166
  70. pyopencl-2024.2.2.data/data/examples/svm.py +0 -82
  71. pyopencl-2024.2.2.data/data/examples/transpose.py +0 -229
  72. pyopencl-2024.2.2.data/data/pytest.ini +0 -3
  73. pyopencl-2024.2.2.data/data/src/bitlog.cpp +0 -51
  74. pyopencl-2024.2.2.data/data/src/bitlog.hpp +0 -83
  75. pyopencl-2024.2.2.data/data/src/clinfo_ext.h +0 -134
  76. pyopencl-2024.2.2.data/data/src/mempool.hpp +0 -444
  77. pyopencl-2024.2.2.data/data/src/pyopencl_ext.h +0 -77
  78. pyopencl-2024.2.2.data/data/src/tools.hpp +0 -90
  79. pyopencl-2024.2.2.data/data/src/wrap_cl.cpp +0 -61
  80. pyopencl-2024.2.2.data/data/src/wrap_cl.hpp +0 -5853
  81. pyopencl-2024.2.2.data/data/src/wrap_cl_part_1.cpp +0 -369
  82. pyopencl-2024.2.2.data/data/src/wrap_cl_part_2.cpp +0 -702
  83. pyopencl-2024.2.2.data/data/src/wrap_constants.cpp +0 -1274
  84. pyopencl-2024.2.2.data/data/src/wrap_helpers.hpp +0 -213
  85. pyopencl-2024.2.2.data/data/src/wrap_mempool.cpp +0 -738
  86. pyopencl-2024.2.2.data/data/test/add-vectors-32.spv +0 -0
  87. pyopencl-2024.2.2.data/data/test/add-vectors-64.spv +0 -0
  88. pyopencl-2024.2.2.data/data/test/empty-header.h +0 -1
  89. pyopencl-2024.2.2.data/data/test/test_algorithm.py +0 -1180
  90. pyopencl-2024.2.2.data/data/test/test_array.py +0 -2392
  91. pyopencl-2024.2.2.data/data/test/test_arrays_in_structs.py +0 -100
  92. pyopencl-2024.2.2.data/data/test/test_clmath.py +0 -529
  93. pyopencl-2024.2.2.data/data/test/test_clrandom.py +0 -75
  94. pyopencl-2024.2.2.data/data/test/test_enqueue_copy.py +0 -271
  95. pyopencl-2024.2.2.data/data/test/test_wrapper.py +0 -1565
  96. pyopencl-2024.2.2.dist-info/LICENSE +0 -282
  97. pyopencl-2024.2.2.dist-info/RECORD +0 -123
  98. pyopencl-2024.2.2.dist-info/top_level.txt +0 -1
  99. {pyopencl-2024.2.2.data/data → pyopencl-2024.2.5.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,71 @@
1
+ #ifndef _PYGPU_NDARRAY_H
2
+ #define _PYGPU_NDARRAY_H
3
+ #ifndef OFFSET
4
+ #define OFFSET 0
5
+ #endif
6
+
7
+ //#include <Python.h>
8
+ //#include <structmember.h>
9
+ #include <stdio.h>
10
+ #include <numpy/arrayobject.h>
11
+
12
+ #include "pygpu_ndarray_object.h"
13
+ #include "gpu_ndarray.h"
14
+ #include "pygpu_language.h"
15
+
16
+ /*
17
+ * Return a PyGpuNdArray whose 'nd' dimensions are all 0.
18
+ * if nd==-1, it is not initialized.
19
+ */
20
+ PyObject * PyGpuNdArray_New(int nd=-1);
21
+
22
+ /**
23
+ * Return 1 for a PyGpuNdArrayObject otw 0
24
+ */
25
+ int
26
+ PyGpuNdArray_Check(const PyObject * ob);
27
+
28
+ /**
29
+ * Return 1 for a PyGpuNdArrayObject otw 0
30
+ */
31
+ int
32
+ PyGpuNdArray_CheckExact(const PyObject * ob);
33
+
34
+ /**
35
+ * Transfer the contents of numpy array `obj` to `self`.
36
+ *
37
+ * self is reallocated to have the correct dimensions if necessary.
38
+ */
39
+ int PyGpuNdArray_CopyFromArray(PyGpuNdArrayObject * self, PyArrayObject*obj);
40
+
41
+ static int
42
+ PyGpuNdArray_add_offset(PyGpuNdArrayObject * self, int offset);
43
+
44
+ static int
45
+ PyGpuNdArray_set_data(PyGpuNdArrayObject * self, char * data, PyObject * base, int offset=0);
46
+
47
+ static PyObject *
48
+ PyGpuNdArray_Subscript(PyObject * py_self, PyObject * key);
49
+
50
+ static PyObject *
51
+ PyGpuNdArray_Copy(PyGpuNdArrayObject * self, NPY_ORDER order=NPY_CORDER);
52
+
53
+ static PyObject *
54
+ PyGpuNdArray_Zeros(int nd, npy_intp* dims, PyArray_Descr* dtype, int fortran);
55
+
56
+ static PyObject *
57
+ PyGpuNdArray_Empty(int nd, npy_intp* dims, PyArray_Descr* dtype, int fortran);
58
+
59
+ #endif
60
+
61
+ /*
62
+ Local Variables:
63
+ mode:c++
64
+ c-basic-offset:4
65
+ c-file-style:"stroustrup"
66
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
67
+ indent-tabs-mode:nil
68
+ fill-column:79
69
+ End:
70
+ */
71
+ // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=79 :
@@ -0,0 +1,232 @@
1
+ /**
2
+ * struct PyGPUArrayObject
3
+ *
4
+ * This is a Python type.
5
+ *
6
+ */
7
+ #ifndef _PYGPU_NDARRAY_OBJECT_H
8
+ #define _PYGPU_NDARRAY_OBJECT_H
9
+
10
+ #include <Python.h>
11
+ #include <numpy/arrayobject.h>
12
+ #include "gpu_ndarray.h"
13
+
14
+ typedef struct PyGpuNdArrayObject{
15
+ PyObject_HEAD
16
+
17
+ GpuNdArray gpu_ndarray; //no pointer, just inlined.
18
+ PyObject * base;
19
+ PyArray_Descr * descr; // for numpy-like desc
20
+ int data_allocated; //the number of bytes allocated for devdata
21
+ } PyGpuNdArrayObject;
22
+
23
+ #define PyGpuNdArray_NDIM(obj) (((PyGpuNdArrayObject *)obj)->gpu_ndarray.nd)
24
+ #define PyGpuNdArray_DATA(obj) (((PyGpuNdArrayObject *)obj)->gpu_ndarray.data)
25
+ #define PyGpuNdArray_BYTES(obj) (((PyGpuNdArrayObject *)obj)->gpu_ndarray.data)
26
+ #define PyGpuNdArray_OFFSET(obj) (((PyGpuNdArrayObject *)(obj))->gpu_ndarray.offset)
27
+ #define PyGpuNdArray_DIMS(obj) (((PyGpuNdArrayObject *)obj)->gpu_ndarray.dimensions)
28
+ #define PyGpuNdArray_STRIDES(obj) (((PyGpuNdArrayObject *)obj)->gpu_ndarray.strides)
29
+ #define PyGpuNdArray_DIM(obj,n) (PyGpuNdArray_DIMS(obj)[n])
30
+ #define PyGpuNdArray_STRIDE(obj,n) (PyGpuNdArray_STRIDES(obj)[n])
31
+ #define PyGpuNdArray_BASE(obj) (((PyGpuNdArrayObject *)obj)->base)
32
+ #define PyGpuNdArray_DESCR(obj) (((PyGpuNdArrayObject *)obj)->descr)
33
+ #define PyGpuNdArray_FLAGS(obj) (((PyGpuNdArrayObject *)obj)->gpu_ndarray.flags)
34
+ #define PyGpuNdArray_ITEMSIZE(obj) (((PyGpuNdArrayObject *)obj)->descr->elsize)
35
+ #define PyGpuNdArray_TYPE(obj) (((PyGpuNdArrayObject *)(obj))->descr->type_num)
36
+
37
+ #define PyGpuNdArray_SIZE(obj) PyArray_MultiplyList(PyGpuNdArray_DIMS(obj),PyGpuNdArray_NDIM(obj))
38
+ //npy_intp PyGpuNdArray_Size(PyObject* obj);
39
+ //npy_intp PyGpuNdArray_NBYTES(PyObject* arr);
40
+
41
+ /*
42
+ Flags accessor
43
+ */
44
+ #define PyGpuNdArray_CHKFLAGS(m, FLAGS) \
45
+ ((((PyGpuNdArrayObject *)(m))->gpu_ndarray.flags & (FLAGS)) == (FLAGS))
46
+
47
+ #define PyGpuNdArray_ISCONTIGUOUS(m) PyGpuNdArray_CHKFLAGS(m, NPY_CONTIGUOUS)
48
+ #define PyGpuNdArray_ISFORTRAN(m) (PyGpuNdArray_CHKFLAGS(m, NPY_F_CONTIGUOUS) && \
49
+ PyGpuNdArray_NDIM(m) > 1)
50
+ #define PyGpuNdArray_FORTRAN_IF(m) (PyGpuNdArray_CHKFLAGS(m, NPY_F_CONTIGUOUS)? \
51
+ NPY_F_CONTIGUOUS : 0)
52
+ #define PyGpuNdArray_ISONESEGMENT(m) (PyGpuNdArray_NDIM(m) == 0 || \
53
+ PyGpuNdArray_ISCONTIGUOUS(m) || \
54
+ PyGpuNdArray_ISFORTRAN(m))
55
+ #define PyGpuNdArray_ISWRITEABLE(m) PyGpuNdArray_CHKFLAGS(m, NPY_WRITEABLE)
56
+ #define PyGpuNdArray_ISALIGNED(m) PyGpuNdArray_CHKFLAGS(m, NPY_ALIGNED)
57
+
58
+ #define PyGpuNdArray_ISNBO(arg) ((arg) != NPY_OPPBYTE)
59
+ // THE NEXT ONE SEEM BAD...
60
+ #define PyGpuNdArray_IsNativeByteOrder PyArray_ISNBO
61
+ #define PyGpuNdArray_ISNOTSWAPPED(m) PyArray_ISNBO(PyArray_DESCR(m)->byteorder)
62
+ #define PyGpuNdArray_FLAGSWAP(m, flags) (PyGpuNdArray_CHKFLAGS(m, flags) && PyGpuNdArray_ISNOTSWAPPED(m))
63
+
64
+ #define PyGpuNdArray_ISCARRAY(m) PyGpuNdArray_FLAGSWAP(m, NPY_CARRAY)
65
+ #define PyGpuNdArray_ISCARRAY_RO(m) PyGpuNdArray_FLAGSWAP(m, NPY_CARRAY_RO)
66
+ #define PyGpuNdArray_ISFARRAY(m) PyGpuNdArray_FLAGSWAP(m, NPY_FARRAY)
67
+ #define PyGpuNdArray_ISFARRAY_RO(m) PyGpuNdArray_FLAGSWAP(m, NPY_FARRAY_RO)
68
+ #define PyGpuNdArray_ISBEHAVED(m) PyGpuNdArray_FLAGSWAP(m, NPY_BEHAVED)
69
+ #define PyGpuNdArray_ISBEHAVED_RO(m) PyGpuNdArray_FLAGSWAP(m, NPY_ALIGNED)
70
+
71
+ static
72
+ void PyGpuNdArray_fprint(FILE * fd, const PyGpuNdArrayObject *self)
73
+ {
74
+ fprintf(fd, "PyGpuNdArrayObject <%p, %p> nd=%i data_allocated=%d\n",
75
+ self, PyGpuNdArray_DATA(self), PyGpuNdArray_NDIM(self), self->data_allocated);
76
+ fprintf(fd, "\tITEMSIZE: %d\n", PyGpuNdArray_ITEMSIZE(self));
77
+ fprintf(fd, "\tTYPENUM: %d\n", PyGpuNdArray_TYPE(self));
78
+ fprintf(fd, "\tRefcount: %ld\n", (long int)self->ob_refcnt);
79
+ fprintf(fd, "\tBASE: %p\n", PyGpuNdArray_BASE(self));
80
+ fprintf(fd, "\tHOST_DIMS: ");
81
+ for (int i = 0; i < PyGpuNdArray_NDIM(self); ++i)
82
+ {
83
+ fprintf(fd, "%ld\t", PyGpuNdArray_DIMS(self)[i]);
84
+ }
85
+ fprintf(fd, "\n\tHOST_STRIDES: ");
86
+ for (int i = 0; i < PyGpuNdArray_NDIM(self); ++i)
87
+ {
88
+ fprintf(fd, "%ld\t", PyGpuNdArray_STRIDES(self)[i]);
89
+ }
90
+ fprintf(fd, "\n\tFLAGS: ");
91
+ fprintf(fd, "\n\t\tC_CONTIGUOUS: %d", PyGpuNdArray_ISCONTIGUOUS(self));
92
+ fprintf(fd, "\n\t\tPyGpuNdArray_ISFORTRAN: %d PyGpuNdArray_FORTRAN_IF:%d F_CONTIGUOUS: %d",
93
+ PyGpuNdArray_ISFORTRAN(self), PyGpuNdArray_FORTRAN_IF(self), PyGpuNdArray_CHKFLAGS(self, NPY_FORTRAN));
94
+ fprintf(fd, "\n\t\tOWNDATA: %d", PyGpuNdArray_CHKFLAGS(self, NPY_OWNDATA));
95
+ fprintf(fd, "\n\t\tWRITEABLE: %d", PyGpuNdArray_ISWRITEABLE(self));
96
+ fprintf(fd, "\n\t\tALIGNED: %d", PyGpuNdArray_ISALIGNED(self));
97
+ fprintf(fd, "\n\t\tUPDATEIFCOPY: %d", PyGpuNdArray_CHKFLAGS(self, NPY_UPDATEIFCOPY));
98
+ fprintf(fd, "\n");
99
+
100
+ }
101
+ static
102
+ void PyArray_fprint(FILE * fd, const PyArrayObject *self)
103
+ {
104
+ fprintf(fd, "PyArrayObject <%p, %p> nd=%i\n",
105
+ self, PyArray_DATA(self), PyArray_NDIM(self));
106
+ fprintf(fd, "\tITEMSIZE: %d\n", PyArray_ITEMSIZE(self));
107
+ fprintf(fd, "\tTYPENUM: %d\n", PyArray_TYPE(self));
108
+ fprintf(fd, "\tHOST_DIMS: ");
109
+ for (int i = 0; i < PyArray_NDIM(self); ++i)
110
+ {
111
+ fprintf(fd, "%ld\t", PyArray_DIMS(self)[i]);
112
+ }
113
+ fprintf(fd, "\n\tHOST_STRIDES: ");
114
+ for (int i = 0; i < PyArray_NDIM(self); ++i)
115
+ {
116
+ fprintf(fd, "%ld\t", PyArray_STRIDES(self)[i]);
117
+ }
118
+ fprintf(fd, "\n\tFLAGS: ");
119
+ fprintf(fd, "\n\t\tC_CONTIGUOUS: %d", PyArray_ISCONTIGUOUS(self));
120
+ fprintf(fd, "\n\t\tPyArray_ISFORTRAN: %d PyArray_FORTRAN_IF:%d F_CONTIGUOUS: %d",
121
+ PyArray_ISFORTRAN(self), PyArray_FORTRAN_IF(self), PyArray_CHKFLAGS(self, NPY_FORTRAN));
122
+ fprintf(fd, "\n\t\tOWNDATA: %d", PyArray_CHKFLAGS(self, NPY_OWNDATA));
123
+ fprintf(fd, "\n\t\tWRITEABLE: %d", PyArray_ISWRITEABLE(self));
124
+ fprintf(fd, "\n\t\tALIGNED: %d", PyArray_ISALIGNED(self));
125
+ fprintf(fd, "\n\t\tUPDATEIFCOPY: %d", PyArray_CHKFLAGS(self, NPY_UPDATEIFCOPY));
126
+ fprintf(fd, "\n");
127
+
128
+ }
129
+
130
+ template <typename T>
131
+ static T ceil_intdiv(T a, T b)
132
+ {
133
+ return (a/b) + ((a % b) ? 1: 0);
134
+ }
135
+
136
+
137
+ //Compute if the resulting array is c contiguous
138
+ static bool
139
+ PyGpuNdArray_is_c_contiguous(const PyGpuNdArrayObject * self)
140
+ {
141
+ bool c_contiguous = true;
142
+ int size = PyGpuNdArray_ITEMSIZE(self);
143
+ for (int i = PyGpuNdArray_NDIM(self)-1; (i >= 0) && c_contiguous; --i) {
144
+ if (PyGpuNdArray_STRIDE(self, i) != size) {
145
+ c_contiguous = false;
146
+ }
147
+ size = size * PyGpuNdArray_DIM(self, i);
148
+ }
149
+ return c_contiguous;
150
+ }
151
+
152
+ //Compute if the resulting array is f contiguous
153
+ static bool
154
+ PyGpuNdArray_is_f_contiguous(const PyGpuNdArrayObject * self)
155
+ {
156
+ bool f_contiguous = true;
157
+ int size = PyGpuNdArray_ITEMSIZE(self);
158
+ for (int i = 0; i < PyGpuNdArray_NDIM(self) && f_contiguous; ++i) {
159
+ if (PyGpuNdArray_STRIDE(self, i) != size) {
160
+ f_contiguous = false;
161
+ }
162
+ size = size * PyGpuNdArray_DIM(self, i);
163
+ }
164
+ return f_contiguous;
165
+ }
166
+
167
+ static PyObject *
168
+ PyGpuNdArray_as_c_contiguous(PyObject* dummy, PyObject* args, PyObject *kargs);
169
+ static PyObject *
170
+ PyGpuNdArray_as_f_contiguous(PyObject* dummy, PyObject* args, PyObject *kargs);
171
+
172
+ /**
173
+ * [Re]allocate a PyGpuNdArrayObject with access to 'nd' dimensions.
174
+ *
175
+ * Note: This does not allocate storage for data.
176
+ */
177
+ static
178
+ int PyGpuNdArray_set_nd(PyGpuNdArrayObject * self, const int nd)
179
+ {
180
+ if (nd != PyGpuNdArray_NDIM(self))
181
+ {
182
+ if(0) fprintf(stderr, "PyGpuNdArray_set_nd: modif nd=%i to nd=%i\n", PyGpuNdArray_NDIM(self), nd);
183
+
184
+ if (PyGpuNdArray_DIMS(self)){
185
+ free(PyGpuNdArray_DIMS(self));
186
+ PyGpuNdArray_DIMS(self) = NULL;
187
+ PyGpuNdArray_NDIM(self) = -1;
188
+ }
189
+ if (PyGpuNdArray_STRIDES(self)){
190
+ free(PyGpuNdArray_STRIDES(self));
191
+ PyGpuNdArray_STRIDES(self) = NULL;
192
+ PyGpuNdArray_NDIM(self) = -1;
193
+ }
194
+ if (nd == -1) return 0;
195
+
196
+ PyGpuNdArray_DIMS(self) = (npy_intp*)malloc(nd*sizeof(npy_intp));
197
+ if (NULL == PyGpuNdArray_DIMS(self))
198
+ {
199
+ PyErr_SetString(PyExc_MemoryError, "PyGpuNdArray_set_nd: Failed to allocate dimensions");
200
+ return -1;
201
+ }
202
+ PyGpuNdArray_STRIDES(self) = (npy_intp*)malloc(nd*sizeof(npy_intp));
203
+ if (NULL == PyGpuNdArray_STRIDES(self))
204
+ {
205
+ PyErr_SetString(PyExc_MemoryError, "PyGpuNdArray_set_nd: Failed to allocate str");
206
+ return -1;
207
+ }
208
+ //initialize all dimensions and strides to 0
209
+ for (int i = 0; i < nd; ++i)
210
+ {
211
+ PyGpuNdArray_DIM(self, i) = 0;
212
+ PyGpuNdArray_STRIDES(self)[i] = 0;
213
+ }
214
+
215
+ PyGpuNdArray_NDIM(self) = nd;
216
+ if(0) fprintf(stderr, "PyGpuNdArray_set_nd: end\n");
217
+ }
218
+ return 0;
219
+ }
220
+
221
+ #endif
222
+ /*
223
+ Local Variables:
224
+ mode:c++
225
+ c-basic-offset:4
226
+ c-file-style:"stroustrup"
227
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
228
+ indent-tabs-mode:nil
229
+ fill-column:79
230
+ End:
231
+ */
232
+ // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=79 :
pyopencl/tools.py CHANGED
@@ -348,96 +348,98 @@ def _monkeypatch_svm_docstrings():
348
348
 
349
349
  # {{{ PooledSVM
350
350
 
351
- PooledSVM.__doc__ = """
352
- An object representing a :class:`SVMPool`-based allocation of
353
- :ref:`svm`. Analogous to :class:`~pyopencl.SVMAllocation`, however once
354
- this object is deleted, its associated device memory is returned to the
355
- pool from which it came.
351
+ PooledSVM.__doc__ = ( # pylint: disable=possibly-used-before-assignment
352
+ """An object representing a :class:`SVMPool`-based allocation of
353
+ :ref:`svm`. Analogous to :class:`~pyopencl.SVMAllocation`, however once
354
+ this object is deleted, its associated device memory is returned to the
355
+ pool from which it came.
356
356
 
357
- .. versionadded:: 2022.2
357
+ .. versionadded:: 2022.2
358
358
 
359
- .. note::
359
+ .. note::
360
360
 
361
- If the :class:`SVMAllocator` for the :class:`SVMPool` that allocated an
362
- object of this type is associated with an (in-order)
363
- :class:`~pyopencl.CommandQueue`, sufficient synchronization is provided
364
- to ensure operations enqueued before deallocation complete before
365
- operations from a different use (possibly in a different queue) are
366
- permitted to start. This applies when :class:`release` is called and
367
- also when the object is freed automatically by the garbage collector.
361
+ If the :class:`SVMAllocator` for the :class:`SVMPool` that allocated an
362
+ object of this type is associated with an (in-order)
363
+ :class:`~pyopencl.CommandQueue`, sufficient synchronization is provided
364
+ to ensure operations enqueued before deallocation complete before
365
+ operations from a different use (possibly in a different queue) are
366
+ permitted to start. This applies when :class:`release` is called and
367
+ also when the object is freed automatically by the garbage collector.
368
368
 
369
- Is a :class:`pyopencl.SVMPointer`.
369
+ Is a :class:`pyopencl.SVMPointer`.
370
370
 
371
- Supports structural equality and hashing.
371
+ Supports structural equality and hashing.
372
372
 
373
- .. automethod:: release
373
+ .. automethod:: release
374
374
 
375
- Return the held memory to the pool. See the note about synchronization
376
- behavior during deallocation above.
375
+ Return the held memory to the pool. See the note about synchronization
376
+ behavior during deallocation above.
377
377
 
378
- .. automethod:: enqueue_release
378
+ .. automethod:: enqueue_release
379
379
 
380
- Synonymous to :meth:`release`, for consistency with
381
- :class:`~pyopencl.SVMAllocation`. Note that, unlike
382
- :meth:`pyopencl.SVMAllocation.enqueue_release`, specifying a queue
383
- or events to be waited for is not supported.
380
+ Synonymous to :meth:`release`, for consistency with
381
+ :class:`~pyopencl.SVMAllocation`. Note that, unlike
382
+ :meth:`pyopencl.SVMAllocation.enqueue_release`, specifying a queue
383
+ or events to be waited for is not supported.
384
384
 
385
- .. automethod:: bind_to_queue
385
+ .. automethod:: bind_to_queue
386
386
 
387
- Analogous to :meth:`pyopencl.SVMAllocation.bind_to_queue`.
387
+ Analogous to :meth:`pyopencl.SVMAllocation.bind_to_queue`.
388
388
 
389
- .. automethod:: unbind_from_queue
389
+ .. automethod:: unbind_from_queue
390
390
 
391
- Analogous to :meth:`pyopencl.SVMAllocation.unbind_from_queue`.
392
- """
391
+ Analogous to :meth:`pyopencl.SVMAllocation.unbind_from_queue`.
392
+ """)
393
393
 
394
394
  # }}}
395
395
 
396
396
  # {{{ SVMAllocator
397
397
 
398
- SVMAllocator.__doc__ = """
399
- .. versionadded:: 2022.2
398
+ SVMAllocator.__doc__ = ( # pylint: disable=possibly-used-before-assignment
399
+ """
400
+ .. versionadded:: 2022.2
400
401
 
401
- .. automethod:: __init__
402
+ .. automethod:: __init__
402
403
 
403
- :arg flags: See :class:`~pyopencl.svm_mem_flags`.
404
- :arg queue: If not specified, allocations will be freed
405
- eagerly, irrespective of whether pending/enqueued operations
406
- are still using the memory.
404
+ :arg flags: See :class:`~pyopencl.svm_mem_flags`.
405
+ :arg queue: If not specified, allocations will be freed
406
+ eagerly, irrespective of whether pending/enqueued operations
407
+ are still using the memory.
407
408
 
408
- If specified, deallocation of memory will be enqueued
409
- with the given queue, and will only be performed
410
- after previously-enqueue operations in the queue have
411
- completed.
409
+ If specified, deallocation of memory will be enqueued
410
+ with the given queue, and will only be performed
411
+ after previously-enqueue operations in the queue have
412
+ completed.
412
413
 
413
- It is an error to specify an out-of-order queue.
414
+ It is an error to specify an out-of-order queue.
414
415
 
415
- .. warning::
416
+ .. warning::
416
417
 
417
- Not specifying a queue will typically lead to undesired
418
- behavior, including crashes and memory corruption.
419
- See the warning in :ref:`svm`.
418
+ Not specifying a queue will typically lead to undesired
419
+ behavior, including crashes and memory corruption.
420
+ See the warning in :ref:`svm`.
420
421
 
421
- .. automethod:: __call__
422
+ .. automethod:: __call__
422
423
 
423
- Return a :class:`~pyopencl.SVMAllocation` of the given *size*.
424
- """
424
+ Return a :class:`~pyopencl.SVMAllocation` of the given *size*.
425
+ """)
425
426
 
426
427
  # }}}
427
428
 
428
429
  # {{{ SVMPool
429
430
 
430
- SVMPool.__doc__ = remove_common_indentation("""
431
- A memory pool for OpenCL device memory in :ref:`SVM <svm>` form.
432
- *allocator* must be an instance of :class:`SVMAllocator`.
431
+ SVMPool.__doc__ = ( # pylint: disable=possibly-used-before-assignment
432
+ remove_common_indentation("""
433
+ A memory pool for OpenCL device memory in :ref:`SVM <svm>` form.
434
+ *allocator* must be an instance of :class:`SVMAllocator`.
433
435
 
434
- .. versionadded:: 2022.2
436
+ .. versionadded:: 2022.2
435
437
 
436
- .. automethod:: __init__
437
- .. automethod:: __call__
438
+ .. automethod:: __init__
439
+ .. automethod:: __call__
438
440
 
439
- Return a :class:`PooledSVM` of the given *size*.
440
- """) + _MEMPOOL_IFACE_DOCS
441
+ Return a :class:`PooledSVM` of the given *size*.
442
+ """) + _MEMPOOL_IFACE_DOCS)
441
443
 
442
444
  # }}}
443
445
 
@@ -1363,6 +1365,8 @@ class _TemplateRenderer:
1363
1365
  parsed_arg = arg
1364
1366
  elif isinstance(arg, tuple):
1365
1367
  parsed_arg = ScalarArg(self.parse_type(arg[0]), arg[1])
1368
+ else:
1369
+ raise TypeError("unexpected argument type: %s" % type(arg))
1366
1370
 
1367
1371
  parsed_args.append(parsed_arg)
1368
1372
 
pyopencl/version.py CHANGED
@@ -1,3 +1,9 @@
1
- VERSION = (2024, 2, 2)
2
- VERSION_STATUS = ""
3
- VERSION_TEXT = ".".join(str(x) for x in VERSION) + VERSION_STATUS
1
+ import re
2
+ from importlib import metadata
3
+
4
+
5
+ VERSION_TEXT = metadata.version("pyopencl")
6
+ _match = re.match("^([0-9.]+)([a-z0-9]*?)$", VERSION_TEXT)
7
+ assert _match is not None
8
+ VERSION_STATUS = _match.group(2)
9
+ VERSION = tuple(int(nr) for nr in _match.group(1).split("."))
@@ -1,13 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyopencl
3
- Version: 2024.2.2
3
+ Version: 2024.2.5
4
4
  Summary: Python wrapper for OpenCL
5
- Home-page: http://mathema.tician.de/software/pyopencl
6
- Author: Andreas Kloeckner
7
- Author-email: inform@tiker.net
8
- License: MIT
9
- Classifier: Environment :: Console
5
+ Author-Email: Andreas Kloeckner <inform@tiker.net>
10
6
  Classifier: Development Status :: 5 - Production/Stable
7
+ Classifier: Environment :: Console
11
8
  Classifier: Intended Audience :: Developers
12
9
  Classifier: Intended Audience :: Other Audience
13
10
  Classifier: Intended Audience :: Science/Research
@@ -19,19 +16,22 @@ Classifier: Programming Language :: Python :: 3
19
16
  Classifier: Topic :: Scientific/Engineering
20
17
  Classifier: Topic :: Scientific/Engineering :: Mathematics
21
18
  Classifier: Topic :: Scientific/Engineering :: Physics
19
+ Project-URL: Homepage, https://mathema.tician.de/software/pyopencl
20
+ Project-URL: Documentation, https://documen.tician.de/pyopencl
21
+ Project-URL: Repository, https://github.com/inducer/pyopencl
22
22
  Requires-Python: ~=3.8
23
- License-File: LICENSE
23
+ Requires-Dist: importlib-resources; python_version < "3.9"
24
24
  Requires-Dist: numpy
25
- Requires-Dist: pytools >=2022.1.13
26
- Requires-Dist: platformdirs >=2.2.0
27
- Requires-Dist: importlib-resources ; python_version < "3.9"
25
+ Requires-Dist: platformdirs>=2.2.0
26
+ Requires-Dist: pytools>=2022.1.13
27
+ Requires-Dist: oclgrind_binary_distribution>=18.3; extra == "oclgrind"
28
+ Requires-Dist: pocl_binary_distribution>=1.2; extra == "pocl"
29
+ Requires-Dist: Mako; extra == "test"
30
+ Requires-Dist: pytest>=7.0.0; extra == "test"
28
31
  Provides-Extra: oclgrind
29
- Requires-Dist: oclgrind-binary-distribution >=18.3 ; extra == 'oclgrind'
30
32
  Provides-Extra: pocl
31
- Requires-Dist: pocl-binary-distribution >=1.2 ; extra == 'pocl'
32
33
  Provides-Extra: test
33
- Requires-Dist: pytest >=7.0.0 ; extra == 'test'
34
- Requires-Dist: Mako ; extra == 'test'
34
+ Description-Content-Type: text/x-rst
35
35
 
36
36
  PyOpenCL: Pythonic Access to OpenCL, with Arrays and Algorithms
37
37
  ===============================================================
@@ -0,0 +1,56 @@
1
+ pyopencl/algorithm.py,sha256=y3wnm2l-0mzIy1dwcZmKR2iLGPVMIlwbgAAsM3elJVg,51265
2
+ pyopencl/clmath.py,sha256=lOxQzE6BEp5-nVRuGu0hgxzk_gcx7aTiy_hRFxAPmcI,8222
3
+ pyopencl/version.py,sha256=PhHAIjtUGVQ2wTVlqgoOrcC_2rkvNMmqvy1rRDqWOhg,267
4
+ pyopencl/capture_call.py,sha256=MJDOVqU6s8rJ5nmd5zOcqNe7GLXad2NwGeTpG60Kau0,5661
5
+ pyopencl/reduction.py,sha256=OZMkLGt5KUp3HG2k0mkXBgF04IGWXzdhuZHy_IAwL1g,25524
6
+ pyopencl/tools.py,sha256=3L0FggJ_nhw4M0KG1yG1VgMPdfA6NttY0nG7Yk6Glts,45993
7
+ pyopencl/elementwise.py,sha256=VMw6A6wGaaBOsxdofjBq9Hyv6l0m9cGKVh2HwsfMuu4,38602
8
+ pyopencl/cache.py,sha256=PltNiHqrAmX7Tgg9BfFdheAHU6qwkg0tjbtCPKKryls,15959
9
+ pyopencl/__init__.py,sha256=-3X3PY8QfGO_DRGrFcRh9iZqG9S6_2P68vx66ItOM0E,81108
10
+ pyopencl/cltypes.py,sha256=DdBVPBU2bRuIbT8ImhWFIQosrefMOkAa4mY4yoSnurc,4818
11
+ pyopencl/invoker.py,sha256=7pjVh0CDkRTNHc1PVQV9Lxhi-0FXvJHtq-jDzLJUypk,13994
12
+ pyopencl/_cl.cpython-310-darwin.so,sha256=j2MYmvCOoZlVaPNhlo0LUuRQAjSjwRD95XzN5qcja_I,473672
13
+ pyopencl/ipython_ext.py,sha256=bN-5I06Nb53_2qE0KfKXxK27Gn4tG3EDj11Az8iTb28,1914
14
+ pyopencl/scan.py,sha256=NbhwamNMcoJaCfeQX2eciQdWEhlAfVxIOTRy5oaUAx8,65500
15
+ pyopencl/_cluda.py,sha256=KKUxizD1iQEuZ_TmmFZNJ8IdXa8x8uT9HgB0nmAlYLw,2074
16
+ pyopencl/_mymako.py,sha256=VnxoyODc-_wVcWhKgQqUYVh_Iun5498Yg4W0WmGhTwk,610
17
+ pyopencl/array.py,sha256=yazv6DHRsKzlMuR0OFMn465RihWpIe_OUAWlAS8oQHE,111717
18
+ pyopencl/bitonic_sort.py,sha256=-gTe-1CfMwxkKKdvlB7x5vIyCeS3NxZRD7GVrYeXfuo,7960
19
+ pyopencl/bitonic_sort_templates.py,sha256=Y1de5klU8GRo2pKlh1cZyYf_NBSIPDbhO83VLLnUgmk,16172
20
+ pyopencl/clrandom.py,sha256=wAzoB6U4cNCipy5xbeYrrvDbqx_QFLmp_FeqIAu3K7I,13043
21
+ pyopencl/compyte/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ pyopencl/compyte/dtypes.py,sha256=FQ1KrstfEIV_ikNNvbC1JODX9rLQ-Yo8-QhAwD-4v9I,9809
23
+ pyopencl/compyte/.gitignore,sha256=HVYtbKRtOCPWZavrgYqO2u7UKFiE7g7ympmuQzKbBBw,168
24
+ pyopencl/compyte/.git,sha256=hqjyvpQvk3kzLjhnlN4Ht1Pgj7gEz1d0hTK9YSPe5T8,44
25
+ pyopencl/compyte/array.py,sha256=9dUSCSb475naOADXWhgpQb72Yx1FjKWMEaU6jRwdq90,7422
26
+ pyopencl/compyte/ndarray/pygpu_language_opencl.cpp,sha256=kyY6wV_h_-uAj8IOO6c9gYHoxJ5Bir83M7XptAUx3u8,7946
27
+ pyopencl/compyte/ndarray/pygpu_ndarray.h,sha256=eEn0lxqjyD_M21ALlD7YHy3_SkUpQQj58up0q7GsKoE,1665
28
+ pyopencl/compyte/ndarray/gen_reduction.py,sha256=JrhJ40Q-8PNphso3jliZSVGWzLnA5-pKkDNZTJNRtbA,56315
29
+ pyopencl/compyte/ndarray/pygpu_ndarray_object.h,sha256=mX8vcy4lgNIgX6xkB5T6U1XkD_Ysk-dW_EChrTYaJWE,9059
30
+ pyopencl/compyte/ndarray/Makefile,sha256=fArNjiMX22zYkdTa3SMdEa0POCv5sSmR5X5cQnR-7t0,1236
31
+ pyopencl/compyte/ndarray/test_gpu_elemwise.py,sha256=sZn24yDa3WgK_AoIs6HCL6-UslZf0aYiPByo__PbtJw,18438
32
+ pyopencl/compyte/ndarray/setup_opencl.py,sha256=Xvmj3iaRjBXI2sEzTTYKxgFCoEyDaiP9ZGJ989RLSqc,3809
33
+ pyopencl/compyte/ndarray/gen_elemwise.py,sha256=KZdZZ6higOqGuxpp9aLDECWuL3jT9zuSy8I7cLCAdKY,76820
34
+ pyopencl/compyte/ndarray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ pyopencl/compyte/ndarray/pygpu_ndarray.cpp,sha256=z8Foyjr9F6HH9EDzmdkTCcqO7Echf7KRifCNfvSvHZ8,51525
36
+ pyopencl/compyte/ndarray/test_gpu_ndarray.py,sha256=a0PV3JVH7TG9-jZdBcrJwuqqnWD5LTsOQGr_bftghVA,17781
37
+ pyopencl/compyte/ndarray/gpu_ndarray.h,sha256=3elPl8SzlpZHTAa-nlOeD7M5YOqVN-7whd5tMWx9zHY,1005
38
+ pyopencl/compyte/ndarray/pygpu_language_cuda.cu,sha256=YO2xyBAtWwXx8RMvn-C2HHSjvjU-oEOpMzrF-CwGVDI,29323
39
+ pyopencl/compyte/ndarray/pygpu_language.h,sha256=HSAfiG0W87aBoT6UAQl1ODQpdWr7GtSMtMtDpEjQkAI,7049
40
+ pyopencl/characterize/__init__.py,sha256=MM56Q4P2IH-piykKeenHgsXYnAcB2HiTj0ftnYVYNVc,14346
41
+ pyopencl/characterize/performance.py,sha256=TD8-cNnGnn46sQwfR5xNF2nr8yQcrmhuzJaYB13pSqk,6866
42
+ pyopencl/cl/pyopencl-bessel-y.cl,sha256=VDy8l4lVxO8VcJR_maeGu_Qjnw27j28zBwhaTKDhBBg,12297
43
+ pyopencl/cl/pyopencl-hankel-complex.cl,sha256=JSm38L6cOdnDssVqzKCNgjMrILT5ExkYAxz7i8rQBtA,31561
44
+ pyopencl/cl/pyopencl-bessel-j.cl,sha256=69d5WoqajYSubLgA6OVwYw0yOHGt64zY97J8isnsQgU,23274
45
+ pyopencl/cl/pyopencl-bessel-j-complex.cl,sha256=o-17yK_wBFqRiGgTYHg9waooTEKt1SCoguMUbg2LOB0,6026
46
+ pyopencl/cl/pyopencl-airy.cl,sha256=S6S84BX6v6E9ZuGB7mdbFygUY99BaManrWMf47Ms7NA,8122
47
+ pyopencl/cl/pyopencl-eval-tbl.cl,sha256=YNi_hyeE4GtDwzx3mLOMRIHh9jOOzMwSv-F2F1lMevg,2616
48
+ pyopencl/cl/pyopencl-complex.h,sha256=gy7Ge9tuDeLYdpM8KIvKK347AxK5XPFhlVjJfgPtIlI,8544
49
+ pyopencl/cl/pyopencl-random123/threefry.cl,sha256=2WmQGxx5gPSv22UL9_MlXv0eMug91k3bC-5_yQ4wlnI,54699
50
+ pyopencl/cl/pyopencl-random123/philox.cl,sha256=vYcQH7Vw13Q3qkW5Nhy1HTUDbWLGKoloE1YP0VWk6vU,21740
51
+ pyopencl/cl/pyopencl-random123/array.h,sha256=nIV0zDWYuybldNgtsh79icNtDXHYdDsSpFaWIvDTyw4,17088
52
+ pyopencl/cl/pyopencl-random123/openclfeatures.h,sha256=pAPbl7JkQgJxulSuGGevpaI43P7PwiH2mYxtNfHq59M,2881
53
+ pyopencl-2024.2.5.dist-info/RECORD,,
54
+ pyopencl-2024.2.5.dist-info/WHEEL,sha256=Tkl0AM11OgIVI8mC-sanPd5i7v9tiS1lP91mPhYZ8Sg,113
55
+ pyopencl-2024.2.5.dist-info/METADATA,sha256=8a7shvaPQtnTN1WLHY1h9N2Ix-RaTV-rDwEKuBz3qhc,4671
56
+ pyopencl-2024.2.5.dist-info/licenses/LICENSE,sha256=wiBvs-UC54bB5DswWuvB66B96b4hkYw_VLt8IR0cBPI,15284
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: skbuild 0.17.6
2
+ Generator: scikit-build-core 0.9.5
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp310-cp310-macosx_11_0_arm64
5
5
 
@@ -1,74 +0,0 @@
1
- cff-version: 1.2.0
2
- message: "If you use this software, please cite it as below."
3
- authors:
4
- - family-names: "Kloeckner"
5
- given-names: "Andreas"
6
- orcid: "https://orcid.org/0000-0003-1228-519X"
7
- - family-names: "Yu"
8
- given-names: "Yichao"
9
- - family-names: "Wala"
10
- given-names: "Matt"
11
- - family-names: "Fernando"
12
- given-names: "Isuru"
13
- - family-names: "Bencun"
14
- given-names: "Marko"
15
- - family-names: "Kulkarni"
16
- given-names: "Kaushik"
17
- - family-names: "Diener"
18
- given-names: "Matthias"
19
- - family-names: "Gao"
20
- given-names: "Hao"
21
- - family-names: "Fikl"
22
- given-names: "Alex"
23
- - family-names: "Weiner"
24
- given-names: "Zach"
25
- - family-names: "Weigert"
26
- given-names: "Martin"
27
- - family-names: "Palmer"
28
- given-names: "Rebecca"
29
- - family-names: "Latham"
30
- given-names: "Shane"
31
- - family-names: "Magno"
32
- given-names: "Gonçalo"
33
- - family-names: "Fuller"
34
- given-names: "Henry"
35
- - family-names: "Mackenzie"
36
- given-names: "Jonathan"
37
- - family-names: "Niarchos"
38
- given-names: "Sotiris"
39
- - family-names: "Gill"
40
- given-names: "Shahzaib"
41
- - family-names: "Gohlke"
42
- given-names: "Christoph"
43
- - family-names: "Bhosale"
44
- given-names: "Aditya"
45
- - family-names: "Rothberg"
46
- given-names: "Alex"
47
- - family-names: "Ey"
48
- given-names: "Emanuel"
49
- - family-names: "Rapp"
50
- given-names: "Holger"
51
- - family-names: "van der Walt"
52
- given-names: "Stefan"
53
- # Removed pending resolution of https://github.com/zenodo/zenodo/issues/2343
54
- # - alias: "gw0"
55
- - family-names: "Thalhammer"
56
- given-names: "Gregor"
57
- - family-names: "Kieffer"
58
- given-names: "Jerome"
59
- - family-names: "Poliarnyi"
60
- given-names: "Nikolai"
61
- - family-names: "Bollinger"
62
- given-names: "Drew"
63
- - family-names: "Nitz"
64
- given-names: "Alex"
65
- - family-names: "Bokota"
66
- given-names: "Grzegorz"
67
- orcid: 'https://orcid.org/0000-0002-5470-1676'
68
-
69
- title: "PyOpenCL"
70
- version: 2022.1.3
71
- doi: 10.5281/zenodo.6533956
72
- date-released: 2022-03-10
73
- url: "https://github.com/inducer/pyopencl"
74
- license: MIT