pygpgpu 0.1.0__py3-none-any.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.
Files changed (283) hide show
  1. pygpgpu/__init__.py +113 -0
  2. pygpgpu/constants.py +107 -0
  3. pygpgpu/cparser/ShaderBuiltins.py +16874 -0
  4. pygpgpu/cparser/__init__.py +4 -0
  5. pygpgpu/cparser/cparser.py +1200 -0
  6. pygpgpu/cparser/cpreprocessor.py +135 -0
  7. pygpgpu/cparser/csyntaxtree.py +88 -0
  8. pygpgpu/cparser/ctokens.py +319 -0
  9. pygpgpu/cparser/generate_code.py +481 -0
  10. pygpgpu/cparser/minifyc.py +311 -0
  11. pygpgpu/cparser/pcpp/__init__.py +6 -0
  12. pygpgpu/cparser/pcpp/evaluator.py +897 -0
  13. pygpgpu/cparser/pcpp/lextab.py +169 -0
  14. pygpgpu/cparser/pcpp/parser.py +491 -0
  15. pygpgpu/cparser/pcpp/parsetab.py +2757 -0
  16. pygpgpu/cparser/pcpp/pcmd.py +465 -0
  17. pygpgpu/cparser/pcpp/ply/__init__.py +5 -0
  18. pygpgpu/cparser/pcpp/ply/cpp.py +1050 -0
  19. pygpgpu/cparser/pcpp/ply/ctokens.py +159 -0
  20. pygpgpu/cparser/pcpp/ply/lex.py +1237 -0
  21. pygpgpu/cparser/pcpp/ply/yacc.py +3751 -0
  22. pygpgpu/cparser/pcpp/ply/ygen.py +75 -0
  23. pygpgpu/cparser/pcpp/preprocessor.py +1698 -0
  24. pygpgpu/cparser/ts_parser.py +691 -0
  25. pygpgpu/cuda/__init__.py +7 -0
  26. pygpgpu/cuda/cuimport.py +201 -0
  27. pygpgpu/cuda/driver/__init__.py +48 -0
  28. pygpgpu/cuda/driver/cuda.py +187 -0
  29. pygpgpu/cuda/driver/cuda.pyi +184 -0
  30. pygpgpu/cuda/driver/cuinfo.py +725 -0
  31. pygpgpu/cuda/driver/cutypes.py +364 -0
  32. pygpgpu/cuda/driver/nvrtc.py +200 -0
  33. pygpgpu/cuda/driver/nvrtc.pyi +54 -0
  34. pygpgpu/cuda/driver/nvrtcinfo.py +125 -0
  35. pygpgpu/cuda/driver/nvrtctypes.py +63 -0
  36. pygpgpu/cuda/driver/vec_types/__init__.py +25 -0
  37. pygpgpu/cuda/driver/vec_types/char3.py +15 -0
  38. pygpgpu/cuda/driver/vec_types/char3.pyi +1230 -0
  39. pygpgpu/cuda/driver/vec_types/double3.py +15 -0
  40. pygpgpu/cuda/driver/vec_types/double3.pyi +1230 -0
  41. pygpgpu/cuda/driver/vec_types/float3.py +15 -0
  42. pygpgpu/cuda/driver/vec_types/float3.pyi +1230 -0
  43. pygpgpu/cuda/driver/vec_types/int3.py +15 -0
  44. pygpgpu/cuda/driver/vec_types/int3.pyi +1230 -0
  45. pygpgpu/cuda/driver/vec_types/long2.py +14 -0
  46. pygpgpu/cuda/driver/vec_types/long2.pyi +320 -0
  47. pygpgpu/cuda/driver/vec_types/long3.py +15 -0
  48. pygpgpu/cuda/driver/vec_types/long3.pyi +1229 -0
  49. pygpgpu/cuda/driver/vec_types/long4.py +16 -0
  50. pygpgpu/cuda/driver/vec_types/long4.pyi +3650 -0
  51. pygpgpu/cuda/driver/vec_types/short3.py +15 -0
  52. pygpgpu/cuda/driver/vec_types/short3.pyi +1230 -0
  53. pygpgpu/cuda/driver/vec_types/uchar3.py +15 -0
  54. pygpgpu/cuda/driver/vec_types/uchar3.pyi +1230 -0
  55. pygpgpu/cuda/driver/vec_types/uint3.py +15 -0
  56. pygpgpu/cuda/driver/vec_types/uint3.pyi +1230 -0
  57. pygpgpu/cuda/driver/vec_types/ulong2.py +14 -0
  58. pygpgpu/cuda/driver/vec_types/ulong2.pyi +320 -0
  59. pygpgpu/cuda/driver/vec_types/ulong3.py +15 -0
  60. pygpgpu/cuda/driver/vec_types/ulong3.pyi +1229 -0
  61. pygpgpu/cuda/driver/vec_types/ulong4.py +16 -0
  62. pygpgpu/cuda/driver/vec_types/ulong4.pyi +3650 -0
  63. pygpgpu/cuda/driver/vec_types/ushort3.py +15 -0
  64. pygpgpu/cuda/driver/vec_types/ushort3.pyi +1227 -0
  65. pygpgpu/cuda/oop/__init__.py +2 -0
  66. pygpgpu/cuda/oop/buffer.py +73 -0
  67. pygpgpu/cuda/oop/build_options.py +198 -0
  68. pygpgpu/cuda/oop/context.py +210 -0
  69. pygpgpu/cuda/oop/cuobject.py +137 -0
  70. pygpgpu/cuda/oop/device.py +88 -0
  71. pygpgpu/cuda/oop/device.pyi +733 -0
  72. pygpgpu/cuda/oop/devices.py +92 -0
  73. pygpgpu/cuda/oop/event.py +55 -0
  74. pygpgpu/cuda/oop/kernel.py +423 -0
  75. pygpgpu/cuda/oop/mem_object.py +151 -0
  76. pygpgpu/cuda/oop/nvrtc_program.py +228 -0
  77. pygpgpu/cuda/oop/program.py +135 -0
  78. pygpgpu/cuda/oop/program_info.py +147 -0
  79. pygpgpu/cuda/oop/program_parser.py +482 -0
  80. pygpgpu/cuda/oop/stream.py +97 -0
  81. pygpgpu/exceptions.py +5 -0
  82. pygpgpu/hip/__init__.py +6 -0
  83. pygpgpu/hip/driver/__init__.py +15 -0
  84. pygpgpu/hip/driver/hip.py +129 -0
  85. pygpgpu/hip/driver/hipinfo.py +138 -0
  86. pygpgpu/hip/driver/hiptypes.py +28 -0
  87. pygpgpu/hip/hipimport.py +179 -0
  88. pygpgpu/hip/oop/__init__.py +8 -0
  89. pygpgpu/hip/oop/buffer.py +73 -0
  90. pygpgpu/hip/oop/build_options.py +21 -0
  91. pygpgpu/hip/oop/context.py +57 -0
  92. pygpgpu/hip/oop/device.py +82 -0
  93. pygpgpu/hip/oop/devices.py +93 -0
  94. pygpgpu/hip/oop/event.py +60 -0
  95. pygpgpu/hip/oop/hip_compiler.py +209 -0
  96. pygpgpu/hip/oop/hipobject.py +137 -0
  97. pygpgpu/hip/oop/kernel.py +423 -0
  98. pygpgpu/hip/oop/mem_object.py +148 -0
  99. pygpgpu/hip/oop/program.py +142 -0
  100. pygpgpu/hip/oop/program_info.py +147 -0
  101. pygpgpu/hip/oop/program_parser.py +485 -0
  102. pygpgpu/hip/oop/stream.py +98 -0
  103. pygpgpu/kernel/__init__.py +14 -0
  104. pygpgpu/kernel/builtins.py +125 -0
  105. pygpgpu/kernel/decorator.py +594 -0
  106. pygpgpu/kernel/translator.py +1846 -0
  107. pygpgpu/numpy/__init__.py +9 -0
  108. pygpgpu/numpy/array_creation.py +83 -0
  109. pygpgpu/numpy/ndarray.py +287 -0
  110. pygpgpu/opencl/__init__.py +27 -0
  111. pygpgpu/opencl/climport.py +130 -0
  112. pygpgpu/opencl/common.py +76 -0
  113. pygpgpu/opencl/driver/__init__.py +120 -0
  114. pygpgpu/opencl/driver/cl.py +196 -0
  115. pygpgpu/opencl/driver/cl.pyi +197 -0
  116. pygpgpu/opencl/driver/clinfo.py +1913 -0
  117. pygpgpu/opencl/driver/cltypes.py +964 -0
  118. pygpgpu/opencl/driver/image_types/__init__.py +7 -0
  119. pygpgpu/opencl/driver/image_types/image1d_array_t.py +25 -0
  120. pygpgpu/opencl/driver/image_types/image1d_t.py +25 -0
  121. pygpgpu/opencl/driver/image_types/image2d_array_t.py +25 -0
  122. pygpgpu/opencl/driver/image_types/image2d_t.py +25 -0
  123. pygpgpu/opencl/driver/image_types/image3d_t.py +25 -0
  124. pygpgpu/opencl/driver/image_types/imagend_t.py +178 -0
  125. pygpgpu/opencl/driver/image_types/sampler_t.py +42 -0
  126. pygpgpu/opencl/driver/vec_types/__init__.py +29 -0
  127. pygpgpu/opencl/driver/vec_types/char3.py +16 -0
  128. pygpgpu/opencl/driver/vec_types/char3.pyi +1230 -0
  129. pygpgpu/opencl/driver/vec_types/double3.py +16 -0
  130. pygpgpu/opencl/driver/vec_types/double3.pyi +1230 -0
  131. pygpgpu/opencl/driver/vec_types/float3.py +16 -0
  132. pygpgpu/opencl/driver/vec_types/float3.pyi +1230 -0
  133. pygpgpu/opencl/driver/vec_types/int3.py +16 -0
  134. pygpgpu/opencl/driver/vec_types/int3.pyi +1230 -0
  135. pygpgpu/opencl/driver/vec_types/long16.py +28 -0
  136. pygpgpu/opencl/driver/vec_types/long16.pyi +192 -0
  137. pygpgpu/opencl/driver/vec_types/long2.py +14 -0
  138. pygpgpu/opencl/driver/vec_types/long2.pyi +320 -0
  139. pygpgpu/opencl/driver/vec_types/long3.py +16 -0
  140. pygpgpu/opencl/driver/vec_types/long3.pyi +1229 -0
  141. pygpgpu/opencl/driver/vec_types/long4.py +16 -0
  142. pygpgpu/opencl/driver/vec_types/long4.pyi +3650 -0
  143. pygpgpu/opencl/driver/vec_types/long8.py +20 -0
  144. pygpgpu/opencl/driver/vec_types/long8.pyi +108 -0
  145. pygpgpu/opencl/driver/vec_types/short3.py +16 -0
  146. pygpgpu/opencl/driver/vec_types/short3.pyi +1230 -0
  147. pygpgpu/opencl/driver/vec_types/uchar3.py +16 -0
  148. pygpgpu/opencl/driver/vec_types/uchar3.pyi +1230 -0
  149. pygpgpu/opencl/driver/vec_types/uint3.py +16 -0
  150. pygpgpu/opencl/driver/vec_types/uint3.pyi +1230 -0
  151. pygpgpu/opencl/driver/vec_types/ulong16.py +28 -0
  152. pygpgpu/opencl/driver/vec_types/ulong16.pyi +192 -0
  153. pygpgpu/opencl/driver/vec_types/ulong2.py +14 -0
  154. pygpgpu/opencl/driver/vec_types/ulong2.pyi +320 -0
  155. pygpgpu/opencl/driver/vec_types/ulong3.py +16 -0
  156. pygpgpu/opencl/driver/vec_types/ulong3.pyi +1229 -0
  157. pygpgpu/opencl/driver/vec_types/ulong4.py +16 -0
  158. pygpgpu/opencl/driver/vec_types/ulong4.pyi +3650 -0
  159. pygpgpu/opencl/driver/vec_types/ulong8.py +20 -0
  160. pygpgpu/opencl/driver/vec_types/ulong8.pyi +108 -0
  161. pygpgpu/opencl/driver/vec_types/ushort3.py +16 -0
  162. pygpgpu/opencl/driver/vec_types/ushort3.pyi +1227 -0
  163. pygpgpu/opencl/oop/__init__.py +18 -0
  164. pygpgpu/opencl/oop/buffer.py +127 -0
  165. pygpgpu/opencl/oop/build_options.py +117 -0
  166. pygpgpu/opencl/oop/clobject.py +151 -0
  167. pygpgpu/opencl/oop/command_queue.py +82 -0
  168. pygpgpu/opencl/oop/command_queue.pyi +42 -0
  169. pygpgpu/opencl/oop/context.py +312 -0
  170. pygpgpu/opencl/oop/context.pyi +122 -0
  171. pygpgpu/opencl/oop/device.py +63 -0
  172. pygpgpu/opencl/oop/device.pyi +481 -0
  173. pygpgpu/opencl/oop/event.py +213 -0
  174. pygpgpu/opencl/oop/event.pyi +68 -0
  175. pygpgpu/opencl/oop/image1d.py +100 -0
  176. pygpgpu/opencl/oop/image1d_array.py +100 -0
  177. pygpgpu/opencl/oop/image2d.py +101 -0
  178. pygpgpu/opencl/oop/image2d_array.py +100 -0
  179. pygpgpu/opencl/oop/image3d.py +100 -0
  180. pygpgpu/opencl/oop/imagend.py +55 -0
  181. pygpgpu/opencl/oop/kernel.py +495 -0
  182. pygpgpu/opencl/oop/kernel.pyi +70 -0
  183. pygpgpu/opencl/oop/kernel_wrapper.py +90 -0
  184. pygpgpu/opencl/oop/kernel_wrapper.pyi +45 -0
  185. pygpgpu/opencl/oop/mem_object.py +147 -0
  186. pygpgpu/opencl/oop/mem_object.pyi +104 -0
  187. pygpgpu/opencl/oop/pipe.py +85 -0
  188. pygpgpu/opencl/oop/platform.py +157 -0
  189. pygpgpu/opencl/oop/platform.pyi +121 -0
  190. pygpgpu/opencl/oop/platforms.py +88 -0
  191. pygpgpu/opencl/oop/program.py +369 -0
  192. pygpgpu/opencl/oop/program.pyi +111 -0
  193. pygpgpu/opencl/oop/program_info.py +192 -0
  194. pygpgpu/opencl/oop/program_parser.py +534 -0
  195. pygpgpu/opencl/oop/program_wrapper.py +109 -0
  196. pygpgpu/opencl/oop/sampler.py +83 -0
  197. pygpgpu/opencl/oop/sampler.pyi +34 -0
  198. pygpgpu/opencl/oop/svm_buffer.py +121 -0
  199. pygpgpu/py.typed +0 -0
  200. pygpgpu/utils.py +362 -0
  201. pygpgpu/vec_types/__init__.py +51 -0
  202. pygpgpu/vec_types/char16.py +28 -0
  203. pygpgpu/vec_types/char16.pyi +192 -0
  204. pygpgpu/vec_types/char2.py +14 -0
  205. pygpgpu/vec_types/char2.pyi +320 -0
  206. pygpgpu/vec_types/char4.py +16 -0
  207. pygpgpu/vec_types/char4.pyi +3652 -0
  208. pygpgpu/vec_types/char8.py +20 -0
  209. pygpgpu/vec_types/char8.pyi +108 -0
  210. pygpgpu/vec_types/double16.py +28 -0
  211. pygpgpu/vec_types/double16.pyi +192 -0
  212. pygpgpu/vec_types/double2.py +14 -0
  213. pygpgpu/vec_types/double2.pyi +320 -0
  214. pygpgpu/vec_types/double4.py +16 -0
  215. pygpgpu/vec_types/double4.pyi +3652 -0
  216. pygpgpu/vec_types/double8.py +20 -0
  217. pygpgpu/vec_types/double8.pyi +108 -0
  218. pygpgpu/vec_types/float16.py +28 -0
  219. pygpgpu/vec_types/float16.pyi +192 -0
  220. pygpgpu/vec_types/float2.py +15 -0
  221. pygpgpu/vec_types/float2.pyi +320 -0
  222. pygpgpu/vec_types/float4.py +16 -0
  223. pygpgpu/vec_types/float4.pyi +3652 -0
  224. pygpgpu/vec_types/float8.py +20 -0
  225. pygpgpu/vec_types/float8.pyi +108 -0
  226. pygpgpu/vec_types/funcs.py +316 -0
  227. pygpgpu/vec_types/genVec.py +387 -0
  228. pygpgpu/vec_types/genVec16.py +18 -0
  229. pygpgpu/vec_types/genVec16.pyi.in +13 -0
  230. pygpgpu/vec_types/genVec2.py +13 -0
  231. pygpgpu/vec_types/genVec2.pyi.in +15 -0
  232. pygpgpu/vec_types/genVec3.py +13 -0
  233. pygpgpu/vec_types/genVec3.pyi.in +16 -0
  234. pygpgpu/vec_types/genVec4.py +13 -0
  235. pygpgpu/vec_types/genVec4.pyi.in +17 -0
  236. pygpgpu/vec_types/genVec8.py +14 -0
  237. pygpgpu/vec_types/genVec8.pyi.in +13 -0
  238. pygpgpu/vec_types/helper.py +167 -0
  239. pygpgpu/vec_types/int16.py +28 -0
  240. pygpgpu/vec_types/int16.pyi +192 -0
  241. pygpgpu/vec_types/int2.py +14 -0
  242. pygpgpu/vec_types/int2.pyi +320 -0
  243. pygpgpu/vec_types/int4.py +16 -0
  244. pygpgpu/vec_types/int4.pyi +3652 -0
  245. pygpgpu/vec_types/int8.py +20 -0
  246. pygpgpu/vec_types/int8.pyi +108 -0
  247. pygpgpu/vec_types/short16.py +28 -0
  248. pygpgpu/vec_types/short16.pyi +192 -0
  249. pygpgpu/vec_types/short2.py +14 -0
  250. pygpgpu/vec_types/short2.pyi +320 -0
  251. pygpgpu/vec_types/short4.py +16 -0
  252. pygpgpu/vec_types/short4.pyi +3652 -0
  253. pygpgpu/vec_types/short8.py +20 -0
  254. pygpgpu/vec_types/short8.pyi +108 -0
  255. pygpgpu/vec_types/uchar16.py +28 -0
  256. pygpgpu/vec_types/uchar16.pyi +192 -0
  257. pygpgpu/vec_types/uchar2.py +14 -0
  258. pygpgpu/vec_types/uchar2.pyi +320 -0
  259. pygpgpu/vec_types/uchar4.py +16 -0
  260. pygpgpu/vec_types/uchar4.pyi +3652 -0
  261. pygpgpu/vec_types/uchar8.py +20 -0
  262. pygpgpu/vec_types/uchar8.pyi +108 -0
  263. pygpgpu/vec_types/uint16.py +28 -0
  264. pygpgpu/vec_types/uint16.pyi +192 -0
  265. pygpgpu/vec_types/uint2.py +14 -0
  266. pygpgpu/vec_types/uint2.pyi +320 -0
  267. pygpgpu/vec_types/uint4.py +16 -0
  268. pygpgpu/vec_types/uint4.pyi +3652 -0
  269. pygpgpu/vec_types/uint8.py +20 -0
  270. pygpgpu/vec_types/uint8.pyi +108 -0
  271. pygpgpu/vec_types/ushort16.py +28 -0
  272. pygpgpu/vec_types/ushort16.pyi +192 -0
  273. pygpgpu/vec_types/ushort2.py +14 -0
  274. pygpgpu/vec_types/ushort2.pyi +320 -0
  275. pygpgpu/vec_types/ushort4.py +16 -0
  276. pygpgpu/vec_types/ushort4.pyi +3652 -0
  277. pygpgpu/vec_types/ushort8.py +20 -0
  278. pygpgpu/vec_types/ushort8.pyi +108 -0
  279. pygpgpu-0.1.0.dist-info/METADATA +425 -0
  280. pygpgpu-0.1.0.dist-info/RECORD +283 -0
  281. pygpgpu-0.1.0.dist-info/WHEEL +5 -0
  282. pygpgpu-0.1.0.dist-info/licenses/LICENSE +21 -0
  283. pygpgpu-0.1.0.dist-info/top_level.txt +1 -0
pygpgpu/__init__.py ADDED
@@ -0,0 +1,113 @@
1
+ """PyGPGPU: decorate a Python function and it runs on the GPU (OpenCL / CUDA / HIP).
2
+
3
+ The top level aggregates the commonly used public API so you do not have to
4
+ remember subpackage names::
5
+
6
+ from pygpgpu import kernel, gpu, float4 # @kernel / device builtins / vector types
7
+ from pygpgpu import available_devices, get_device
8
+ from pygpgpu import climport, cuimport, hipimport # import hooks for handwritten .cl/.cu/.hip files
9
+
10
+ Subpackage paths (pygpgpu.kernel / pygpgpu.vec_types / pygpgpu.opencl / ...)
11
+ still work. Note that top-level `pygpgpu.kernel` refers to the @kernel
12
+ decorator (same name as the subpackage; the top level exports the decorator),
13
+ so to use things from the submodules write `from pygpgpu.kernel import ...`.
14
+ """
15
+ import importlib
16
+ from typing import Any, List
17
+
18
+ # pygf owns the single process-wide numpy.array monkey-patch. Importing it
19
+ # applies that patch (patch_nparray), which teaches numpy.array to read a
20
+ # host vector container as its components -- including the structured dtype
21
+ # path the vector-typed buffers below depend on. PyGPGPU no longer ships its
22
+ # own copy of the patch; this is a deliberate unification.
23
+ import pygf # noqa: F401 (applies the numpy.array patch on import)
24
+
25
+
26
+ # ---------- Top-level exports: public API of kernel ----------
27
+ # kernel subpackage's __all__ copied as-is (top-level kernel is the @kernel decorator)
28
+
29
+ from .kernel import (
30
+ DEFAULT_BACKEND_ORDER,
31
+ PyKernel,
32
+ PyKernelSyntaxError,
33
+ available_devices,
34
+ get_device,
35
+ gpu,
36
+ kernel,
37
+ )
38
+
39
+ # ---------- Top-level exports: public API of vec_types ----------
40
+
41
+ from .vec_types import (
42
+ char2, char4, char8, char16,
43
+ uchar2, uchar4, uchar8, uchar16,
44
+ short2, short4, short8, short16,
45
+ ushort2, ushort4, ushort8, ushort16,
46
+ int2, int4, int8, int16,
47
+ uint2, uint4, uint8, uint16,
48
+ float2, float4, float8, float16,
49
+ double2, double4, double8, double16,
50
+ genVec, genVec2, genVec3, genVec4, genVec8, genVec16,
51
+ )
52
+ from .vec_types import funcs # dual-purpose function library: runs on the host, translates to device builtins inside @kernel
53
+
54
+
55
+ # ---------- Top-level exports: import hooks for handwritten kernel files ----------
56
+
57
+ class _LazyBackendHook:
58
+ """Lazy proxy for a backend import hook.
59
+
60
+ Backend packages initialize their runtime at import time (nvcuda/amdhip64/
61
+ OpenCL) and raise immediately when the runtime is missing; this defers
62
+ loading the backend package until a hook method is actually called, so
63
+ `from pygpgpu import climport, cuimport, hipimport` works on any machine
64
+ and only the backend you use requires its runtime.
65
+ """
66
+
67
+ def __init__(self, module_name:str, attr_name:str):
68
+ self._module_name:str = module_name
69
+ self._attr_name:str = attr_name
70
+ self._target:Any = None
71
+
72
+ def _resolve(self)->Any:
73
+ if self._target is None:
74
+ module = importlib.import_module(self._module_name, __name__)
75
+ self._target = getattr(module, self._attr_name)
76
+ return self._target
77
+
78
+ def __getattr__(self, name:str):
79
+ if name.startswith("__") and name.endswith("__"):
80
+ raise AttributeError(name)
81
+ return getattr(self._resolve(), name)
82
+
83
+ def __repr__(self)->str:
84
+ return f"<lazy hook {self._module_name}.{self._attr_name}>"
85
+
86
+
87
+ climport = _LazyBackendHook(".opencl.climport", "climport")
88
+ cuimport = _LazyBackendHook(".cuda.cuimport", "cuimport")
89
+ hipimport = _LazyBackendHook(".hip.hipimport", "hipimport")
90
+
91
+
92
+ __all__ = [
93
+ # kernel
94
+ "kernel", "gpu", "PyKernel", "PyKernelSyntaxError", "DEFAULT_BACKEND_ORDER",
95
+ "available_devices", "get_device",
96
+ # vec_types
97
+ "funcs",
98
+ "char2", "char4", "char8", "char16",
99
+ "uchar2", "uchar4", "uchar8", "uchar16",
100
+ "short2", "short4", "short8", "short16",
101
+ "ushort2", "ushort4", "ushort8", "ushort16",
102
+ "int2", "int4", "int8", "int16",
103
+ "uint2", "uint4", "uint8", "uint16",
104
+ "float2", "float4", "float8", "float16",
105
+ "double2", "double4", "double8", "double16",
106
+ "genVec", "genVec2", "genVec3", "genVec4", "genVec8", "genVec16",
107
+ # import hooks for handwritten kernel files
108
+ "climport", "cuimport", "hipimport",
109
+ ]
110
+
111
+
112
+ def __dir__()->List[str]:
113
+ return sorted(set(globals()) | set(__all__))
pygpgpu/constants.py ADDED
@@ -0,0 +1,107 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Dict, Union, Any
3
+ from ctypes import c_uint, sizeof
4
+ import enum
5
+
6
+ if TYPE_CHECKING:
7
+ from ctypes import Array, _Pointer, c_void_p
8
+
9
+ # A host-side pointer as the ctypes layers use it: an explicit c_void_p, a raw address, a
10
+ # bytes-like buffer, or a ctypes Array/_Pointer. Declared once so the three backend stacks
11
+ # agree (Buffers construct such values in several places).
12
+ # The names after "from __future__ import annotations" are strings, so nothing here is
13
+ # evaluated at runtime -- ctypes.Array/_Pointer are not subscriptable.
14
+ HostPointer = Union["c_void_p", int, bytes, bytearray, "Array[Any]", "_Pointer[Any]", None]
15
+
16
+
17
+ class Constant:
18
+
19
+ __instances:Dict[Union[str, int], Constant] = {}
20
+
21
+ def __init__(self, name:str, value:Any):
22
+ self.__name:str = name
23
+ Constant.__instances[name] = self
24
+
25
+ @property
26
+ def name(self)->str:
27
+ return self.__name
28
+
29
+ @staticmethod
30
+ def get(key:int)->Constant:
31
+ return Constant.__instances[key]
32
+
33
+
34
+ class IntConstant(int, Constant):
35
+
36
+ def __new__(cls, name:str, value:int):
37
+ instance = int.__new__(cls, value)
38
+ return instance
39
+
40
+ @property
41
+ def value(self)->int:
42
+ return int(self)
43
+
44
+ def __str__(self)->str:
45
+ return f"{self.name}({int.__str__(self)})"
46
+
47
+ def __repr__(self)->str:
48
+ return str(self)
49
+
50
+
51
+ class FloatConstant(float, Constant):
52
+
53
+ def __new__(cls, name:str, value:float):
54
+ instance = float.__new__(cls, value)
55
+ return instance
56
+
57
+ @property
58
+ def value(self)->float:
59
+ return float(self)
60
+
61
+ def __str__(self)->str:
62
+ return f"{self.name}({float.__str__(self)})"
63
+
64
+ def __repr__(self)->str:
65
+ return str(self)
66
+
67
+
68
+ class IntEnum(enum.IntEnum):
69
+
70
+ def __str__(self)->str:
71
+ return f"{self.name}({self.value})"
72
+
73
+ def __repr__(self)->str:
74
+ return str(self)
75
+
76
+ @classmethod
77
+ def dtype(cls):
78
+ return c_uint
79
+
80
+ @classmethod
81
+ def size(cls):
82
+ return sizeof(cls.dtype())
83
+
84
+
85
+ class IntFlag(enum.IntFlag):
86
+
87
+ def __str__(self)->str:
88
+ if len(list(self)) < 2:
89
+ return f"{self.name}({self.value})"
90
+ else:
91
+ return enum.Flag.__str__(self)
92
+
93
+ def __repr__(self)->str:
94
+ return str(self)
95
+
96
+ @classmethod
97
+ def dtype(cls):
98
+ return c_uint
99
+
100
+ @classmethod
101
+ def size(cls):
102
+ return sizeof(cls.dtype())
103
+
104
+
105
+ class KernelFlags(IntFlag):
106
+ Readed = (1 << 0)
107
+ Writed = (1 << 1)