numba-cuda 0.19.0__py3-none-any.whl → 0.20.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.

Potentially problematic release.


This version of numba-cuda might be problematic. Click here for more details.

Files changed (353) hide show
  1. _numba_cuda_redirector.pth +3 -0
  2. _numba_cuda_redirector.py +3 -0
  3. numba_cuda/VERSION +1 -1
  4. numba_cuda/__init__.py +2 -1
  5. numba_cuda/_version.py +2 -13
  6. numba_cuda/numba/cuda/__init__.py +4 -1
  7. numba_cuda/numba/cuda/_internal/cuda_bf16.py +12708 -1469
  8. numba_cuda/numba/cuda/_internal/cuda_fp16.py +2656 -8769
  9. numba_cuda/numba/cuda/api.py +9 -1
  10. numba_cuda/numba/cuda/api_util.py +3 -0
  11. numba_cuda/numba/cuda/args.py +3 -0
  12. numba_cuda/numba/cuda/bf16.py +288 -2
  13. numba_cuda/numba/cuda/cg.py +3 -0
  14. numba_cuda/numba/cuda/cgutils.py +5 -2
  15. numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
  16. numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
  17. numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
  18. numba_cuda/numba/cuda/codegen.py +4 -1
  19. numba_cuda/numba/cuda/compiler.py +376 -30
  20. numba_cuda/numba/cuda/core/analysis.py +319 -0
  21. numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
  22. numba_cuda/numba/cuda/core/annotations/type_annotations.py +304 -0
  23. numba_cuda/numba/cuda/core/base.py +1289 -0
  24. numba_cuda/numba/cuda/core/bytecode.py +727 -0
  25. numba_cuda/numba/cuda/core/caching.py +5 -2
  26. numba_cuda/numba/cuda/core/callconv.py +3 -0
  27. numba_cuda/numba/cuda/core/codegen.py +3 -0
  28. numba_cuda/numba/cuda/core/compiler.py +9 -14
  29. numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
  30. numba_cuda/numba/cuda/core/config.py +747 -0
  31. numba_cuda/numba/cuda/core/consts.py +124 -0
  32. numba_cuda/numba/cuda/core/cpu.py +370 -0
  33. numba_cuda/numba/cuda/core/environment.py +68 -0
  34. numba_cuda/numba/cuda/core/event.py +511 -0
  35. numba_cuda/numba/cuda/core/funcdesc.py +330 -0
  36. numba_cuda/numba/cuda/core/inline_closurecall.py +1889 -0
  37. numba_cuda/numba/cuda/core/interpreter.py +52 -27
  38. numba_cuda/numba/cuda/core/ir_utils.py +17 -29
  39. numba_cuda/numba/cuda/core/options.py +262 -0
  40. numba_cuda/numba/cuda/core/postproc.py +249 -0
  41. numba_cuda/numba/cuda/core/pythonapi.py +1868 -0
  42. numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
  43. numba_cuda/numba/cuda/core/rewrites/ir_print.py +90 -0
  44. numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
  45. numba_cuda/numba/cuda/core/rewrites/static_binop.py +40 -0
  46. numba_cuda/numba/cuda/core/rewrites/static_getitem.py +187 -0
  47. numba_cuda/numba/cuda/core/rewrites/static_raise.py +98 -0
  48. numba_cuda/numba/cuda/core/sigutils.py +3 -0
  49. numba_cuda/numba/cuda/core/ssa.py +496 -0
  50. numba_cuda/numba/cuda/core/targetconfig.py +329 -0
  51. numba_cuda/numba/cuda/core/tracing.py +231 -0
  52. numba_cuda/numba/cuda/core/transforms.py +952 -0
  53. numba_cuda/numba/cuda/core/typed_passes.py +741 -7
  54. numba_cuda/numba/cuda/core/typeinfer.py +1948 -0
  55. numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
  56. numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
  57. numba_cuda/numba/cuda/core/unsafe/eh.py +66 -0
  58. numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
  59. numba_cuda/numba/cuda/core/untyped_passes.py +1983 -0
  60. numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
  61. numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
  62. numba_cuda/numba/cuda/cpython/numbers.py +1474 -0
  63. numba_cuda/numba/cuda/cuda_paths.py +425 -246
  64. numba_cuda/numba/cuda/cudadecl.py +4 -1
  65. numba_cuda/numba/cuda/cudadrv/__init__.py +4 -1
  66. numba_cuda/numba/cuda/cudadrv/devicearray.py +5 -1
  67. numba_cuda/numba/cuda/cudadrv/devices.py +3 -0
  68. numba_cuda/numba/cuda/cudadrv/driver.py +14 -140
  69. numba_cuda/numba/cuda/cudadrv/drvapi.py +3 -0
  70. numba_cuda/numba/cuda/cudadrv/dummyarray.py +114 -24
  71. numba_cuda/numba/cuda/cudadrv/enums.py +3 -0
  72. numba_cuda/numba/cuda/cudadrv/error.py +4 -0
  73. numba_cuda/numba/cuda/cudadrv/libs.py +8 -5
  74. numba_cuda/numba/cuda/cudadrv/linkable_code.py +3 -0
  75. numba_cuda/numba/cuda/cudadrv/mappings.py +4 -1
  76. numba_cuda/numba/cuda/cudadrv/ndarray.py +3 -0
  77. numba_cuda/numba/cuda/cudadrv/nvrtc.py +22 -8
  78. numba_cuda/numba/cuda/cudadrv/nvvm.py +4 -4
  79. numba_cuda/numba/cuda/cudadrv/rtapi.py +3 -0
  80. numba_cuda/numba/cuda/cudadrv/runtime.py +4 -1
  81. numba_cuda/numba/cuda/cudaimpl.py +8 -1
  82. numba_cuda/numba/cuda/cudamath.py +3 -0
  83. numba_cuda/numba/cuda/debuginfo.py +88 -2
  84. numba_cuda/numba/cuda/decorators.py +6 -3
  85. numba_cuda/numba/cuda/descriptor.py +6 -4
  86. numba_cuda/numba/cuda/device_init.py +3 -0
  87. numba_cuda/numba/cuda/deviceufunc.py +69 -2
  88. numba_cuda/numba/cuda/dispatcher.py +21 -39
  89. numba_cuda/numba/cuda/errors.py +10 -0
  90. numba_cuda/numba/cuda/extending.py +3 -0
  91. numba_cuda/numba/cuda/flags.py +143 -1
  92. numba_cuda/numba/cuda/fp16.py +3 -2
  93. numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
  94. numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
  95. numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
  96. numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
  97. numba_cuda/numba/cuda/initialize.py +4 -0
  98. numba_cuda/numba/cuda/intrinsic_wrapper.py +3 -0
  99. numba_cuda/numba/cuda/intrinsics.py +3 -0
  100. numba_cuda/numba/cuda/itanium_mangler.py +3 -0
  101. numba_cuda/numba/cuda/kernels/__init__.py +2 -0
  102. numba_cuda/numba/cuda/kernels/reduction.py +3 -0
  103. numba_cuda/numba/cuda/kernels/transpose.py +3 -0
  104. numba_cuda/numba/cuda/libdevice.py +4 -0
  105. numba_cuda/numba/cuda/libdevicedecl.py +3 -0
  106. numba_cuda/numba/cuda/libdevicefuncs.py +3 -0
  107. numba_cuda/numba/cuda/libdeviceimpl.py +3 -0
  108. numba_cuda/numba/cuda/locks.py +3 -0
  109. numba_cuda/numba/cuda/lowering.py +59 -159
  110. numba_cuda/numba/cuda/mathimpl.py +5 -1
  111. numba_cuda/numba/cuda/memory_management/__init__.py +3 -0
  112. numba_cuda/numba/cuda/memory_management/memsys.cu +5 -0
  113. numba_cuda/numba/cuda/memory_management/memsys.cuh +5 -0
  114. numba_cuda/numba/cuda/memory_management/nrt.cu +5 -0
  115. numba_cuda/numba/cuda/memory_management/nrt.cuh +5 -0
  116. numba_cuda/numba/cuda/memory_management/nrt.py +48 -18
  117. numba_cuda/numba/cuda/misc/findlib.py +75 -0
  118. numba_cuda/numba/cuda/models.py +12 -1
  119. numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
  120. numba_cuda/numba/cuda/np/npyfuncs.py +1807 -0
  121. numba_cuda/numba/cuda/np/numpy_support.py +553 -0
  122. numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +59 -0
  123. numba_cuda/numba/cuda/nvvmutils.py +4 -1
  124. numba_cuda/numba/cuda/printimpl.py +15 -1
  125. numba_cuda/numba/cuda/random.py +4 -1
  126. numba_cuda/numba/cuda/reshape_funcs.cu +5 -0
  127. numba_cuda/numba/cuda/serialize.py +4 -1
  128. numba_cuda/numba/cuda/simulator/__init__.py +4 -1
  129. numba_cuda/numba/cuda/simulator/_internal/__init__.py +3 -0
  130. numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
  131. numba_cuda/numba/cuda/simulator/api.py +4 -1
  132. numba_cuda/numba/cuda/simulator/bf16.py +3 -0
  133. numba_cuda/numba/cuda/simulator/compiler.py +7 -0
  134. numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +3 -0
  135. numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +4 -1
  136. numba_cuda/numba/cuda/simulator/cudadrv/devices.py +3 -0
  137. numba_cuda/numba/cuda/simulator/cudadrv/driver.py +3 -0
  138. numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +3 -0
  139. numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +3 -0
  140. numba_cuda/numba/cuda/simulator/cudadrv/error.py +4 -0
  141. numba_cuda/numba/cuda/simulator/cudadrv/libs.py +4 -0
  142. numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +4 -0
  143. numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +3 -0
  144. numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +3 -0
  145. numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +3 -0
  146. numba_cuda/numba/cuda/simulator/dispatcher.py +4 -0
  147. numba_cuda/numba/cuda/simulator/kernel.py +3 -0
  148. numba_cuda/numba/cuda/simulator/kernelapi.py +4 -1
  149. numba_cuda/numba/cuda/simulator/memory_management/__init__.py +3 -0
  150. numba_cuda/numba/cuda/simulator/memory_management/nrt.py +17 -2
  151. numba_cuda/numba/cuda/simulator/reduction.py +3 -0
  152. numba_cuda/numba/cuda/simulator/vector_types.py +3 -0
  153. numba_cuda/numba/cuda/simulator_init.py +3 -0
  154. numba_cuda/numba/cuda/stubs.py +3 -0
  155. numba_cuda/numba/cuda/target.py +38 -17
  156. numba_cuda/numba/cuda/testing.py +7 -19
  157. numba_cuda/numba/cuda/tests/__init__.py +4 -1
  158. numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
  159. numba_cuda/numba/cuda/tests/complex_usecases.py +3 -0
  160. numba_cuda/numba/cuda/tests/core/serialize_usecases.py +3 -0
  161. numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +3 -0
  162. numba_cuda/numba/cuda/tests/core/test_serialize.py +7 -4
  163. numba_cuda/numba/cuda/tests/cudadrv/__init__.py +3 -0
  164. numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +3 -0
  165. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +3 -0
  166. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +3 -0
  167. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +3 -0
  168. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +4 -1
  169. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +3 -0
  170. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_libraries.py +4 -1
  171. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +3 -0
  172. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +3 -0
  173. numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +4 -1
  174. numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +9 -3
  175. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +4 -1
  176. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +3 -0
  177. numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +3 -0
  178. numba_cuda/numba/cuda/tests/cudadrv/test_init.py +3 -0
  179. numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +3 -0
  180. numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +3 -0
  181. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +21 -2
  182. numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +3 -0
  183. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +5 -1
  184. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +4 -1
  185. numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +3 -0
  186. numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +3 -0
  187. numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +3 -0
  188. numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +3 -0
  189. numba_cuda/numba/cuda/tests/cudadrv/test_ptds.py +4 -1
  190. numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +3 -0
  191. numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +3 -0
  192. numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +3 -0
  193. numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +3 -0
  194. numba_cuda/numba/cuda/tests/cudapy/__init__.py +3 -0
  195. numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +3 -0
  196. numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +3 -0
  197. numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +3 -0
  198. numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +4 -1
  199. numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +3 -0
  200. numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +3 -0
  201. numba_cuda/numba/cuda/tests/cudapy/test_array.py +5 -1
  202. numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +3 -0
  203. numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +3 -0
  204. numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +3 -0
  205. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +4 -1
  206. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +542 -2
  207. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +84 -1
  208. numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +3 -0
  209. numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +3 -0
  210. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +4 -3
  211. numba_cuda/numba/cuda/tests/cudapy/test_casting.py +3 -0
  212. numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +3 -0
  213. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +3 -0
  214. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +4 -1
  215. numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +3 -0
  216. numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +3 -0
  217. numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +4 -1
  218. numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +5 -3
  219. numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +130 -0
  220. numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +3 -0
  221. numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +3 -0
  222. numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +4 -1
  223. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +4 -1
  224. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +314 -3
  225. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +4 -1
  226. numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +3 -0
  227. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +4 -1
  228. numba_cuda/numba/cuda/tests/cudapy/test_enums.py +3 -0
  229. numba_cuda/numba/cuda/tests/cudapy/test_errors.py +4 -1
  230. numba_cuda/numba/cuda/tests/cudapy/test_exception.py +4 -1
  231. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +5 -1
  232. numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +3 -0
  233. numba_cuda/numba/cuda/tests/cudapy/test_forall.py +3 -0
  234. numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +3 -0
  235. numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +3 -0
  236. numba_cuda/numba/cuda/tests/cudapy/test_globals.py +3 -0
  237. numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +3 -0
  238. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +3 -0
  239. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +3 -0
  240. numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +3 -0
  241. numba_cuda/numba/cuda/tests/cudapy/test_inline.py +21 -8
  242. numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +3 -0
  243. numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +3 -0
  244. numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +3 -0
  245. numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +13 -37
  246. numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +3 -0
  247. numba_cuda/numba/cuda/tests/cudapy/test_lang.py +3 -0
  248. numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +4 -1
  249. numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +3 -0
  250. numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +3 -0
  251. numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +3 -0
  252. numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +3 -0
  253. numba_cuda/numba/cuda/tests/cudapy/test_math.py +4 -1
  254. numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +4 -1
  255. numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +3 -0
  256. numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +3 -0
  257. numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +3 -0
  258. numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +3 -0
  259. numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +3 -0
  260. numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +3 -0
  261. numba_cuda/numba/cuda/tests/cudapy/test_operator.py +4 -1
  262. numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +3 -0
  263. numba_cuda/numba/cuda/tests/cudapy/test_overload.py +3 -0
  264. numba_cuda/numba/cuda/tests/cudapy/test_powi.py +3 -0
  265. numba_cuda/numba/cuda/tests/cudapy/test_print.py +23 -0
  266. numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +3 -0
  267. numba_cuda/numba/cuda/tests/cudapy/test_random.py +3 -0
  268. numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +4 -1
  269. numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +3 -0
  270. numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +4 -1
  271. numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +3 -0
  272. numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +4 -1
  273. numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +3 -0
  274. numba_cuda/numba/cuda/tests/cudapy/test_sm.py +4 -1
  275. numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +3 -0
  276. numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +453 -0
  277. numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +3 -0
  278. numba_cuda/numba/cuda/tests/cudapy/test_sync.py +4 -1
  279. numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +3 -0
  280. numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
  281. numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +266 -2
  282. numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +4 -1
  283. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +4 -1
  284. numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +3 -0
  285. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +3 -0
  286. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +115 -6
  287. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +3 -0
  288. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +3 -0
  289. numba_cuda/numba/cuda/tests/cudapy/test_warning.py +4 -1
  290. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +4 -1
  291. numba_cuda/numba/cuda/tests/cudasim/__init__.py +3 -0
  292. numba_cuda/numba/cuda/tests/cudasim/support.py +3 -0
  293. numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +3 -0
  294. numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
  295. numba_cuda/numba/cuda/tests/data/cta_barrier.cu +5 -0
  296. numba_cuda/numba/cuda/tests/data/cuda_include.cu +5 -0
  297. numba_cuda/numba/cuda/tests/data/error.cu +5 -0
  298. numba_cuda/numba/cuda/tests/data/include/add.cuh +5 -0
  299. numba_cuda/numba/cuda/tests/data/jitlink.cu +5 -0
  300. numba_cuda/numba/cuda/tests/data/warn.cu +5 -0
  301. numba_cuda/numba/cuda/tests/doc_examples/__init__.py +3 -0
  302. numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
  303. numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +5 -0
  304. numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +5 -0
  305. numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +5 -0
  306. numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +3 -2
  307. numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +3 -0
  308. numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +3 -0
  309. numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +6 -2
  310. numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +3 -2
  311. numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +3 -0
  312. numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +3 -0
  313. numba_cuda/numba/cuda/tests/doc_examples/test_random.py +3 -0
  314. numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +3 -0
  315. numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +3 -2
  316. numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +3 -0
  317. numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +3 -0
  318. numba_cuda/numba/cuda/tests/enum_usecases.py +3 -0
  319. numba_cuda/numba/cuda/tests/nocuda/__init__.py +3 -0
  320. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +3 -0
  321. numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +3 -0
  322. numba_cuda/numba/cuda/tests/nocuda/test_import.py +6 -1
  323. numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +27 -12
  324. numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +3 -0
  325. numba_cuda/numba/cuda/tests/nrt/__init__.py +3 -0
  326. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +5 -1
  327. numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +3 -0
  328. numba_cuda/numba/cuda/tests/support.py +58 -15
  329. numba_cuda/numba/cuda/tests/test_binary_generation/Makefile +3 -0
  330. numba_cuda/numba/cuda/tests/test_binary_generation/generate_raw_ltoir.py +2 -1
  331. numba_cuda/numba/cuda/tests/test_binary_generation/nrt_extern.cu +5 -0
  332. numba_cuda/numba/cuda/tests/test_binary_generation/test_device_functions.cu +5 -0
  333. numba_cuda/numba/cuda/tests/test_binary_generation/undefined_extern.cu +5 -0
  334. numba_cuda/numba/cuda/tests/test_tracing.py +200 -0
  335. numba_cuda/numba/cuda/types.py +59 -0
  336. numba_cuda/numba/cuda/typing/__init__.py +12 -1
  337. numba_cuda/numba/cuda/typing/cffi_utils.py +55 -0
  338. numba_cuda/numba/cuda/typing/context.py +751 -0
  339. numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
  340. numba_cuda/numba/cuda/typing/npydecl.py +658 -0
  341. numba_cuda/numba/cuda/typing/templates.py +10 -14
  342. numba_cuda/numba/cuda/ufuncs.py +6 -3
  343. numba_cuda/numba/cuda/utils.py +9 -112
  344. numba_cuda/numba/cuda/vector_types.py +3 -0
  345. numba_cuda/numba/cuda/vectorizers.py +3 -0
  346. {numba_cuda-0.19.0.dist-info → numba_cuda-0.20.0.dist-info}/METADATA +6 -2
  347. numba_cuda-0.20.0.dist-info/RECORD +357 -0
  348. {numba_cuda-0.19.0.dist-info → numba_cuda-0.20.0.dist-info}/licenses/LICENSE +1 -0
  349. numba_cuda-0.20.0.dist-info/licenses/LICENSE.numba +24 -0
  350. numba_cuda/numba/cuda/tests/cudadrv/test_mvc.py +0 -57
  351. numba_cuda-0.19.0.dist-info/RECORD +0 -301
  352. {numba_cuda-0.19.0.dist-info → numba_cuda-0.20.0.dist-info}/WHEEL +0 -0
  353. {numba_cuda-0.19.0.dist-info → numba_cuda-0.20.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,124 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+ from types import ModuleType
4
+
5
+ import weakref
6
+
7
+ from numba.core.errors import ConstantInferenceError, NumbaError
8
+ from numba.core import ir
9
+
10
+
11
+ class ConstantInference(object):
12
+ """
13
+ A constant inference engine for a given interpreter.
14
+ Inference inspects the IR to try and compute a compile-time constant for
15
+ a variable.
16
+
17
+ This shouldn't be used directly, instead call Interpreter.infer_constant().
18
+ """
19
+
20
+ def __init__(self, func_ir):
21
+ # Avoid cyclic references as some user-visible objects may be
22
+ # held alive in the cache
23
+ self._func_ir = weakref.proxy(func_ir)
24
+ self._cache = {}
25
+
26
+ def infer_constant(self, name, loc=None):
27
+ """
28
+ Infer a constant value for the given variable *name*.
29
+ If no value can be inferred, numba.errors.ConstantInferenceError
30
+ is raised.
31
+ """
32
+ if name not in self._cache:
33
+ try:
34
+ self._cache[name] = (True, self._do_infer(name))
35
+ except ConstantInferenceError as exc:
36
+ # Store the exception args only, to avoid keeping
37
+ # a whole traceback alive.
38
+ self._cache[name] = (False, (exc.__class__, exc.args))
39
+ success, val = self._cache[name]
40
+ if success:
41
+ return val
42
+ else:
43
+ exc, args = val
44
+ if issubclass(exc, NumbaError):
45
+ raise exc(*args, loc=loc)
46
+ else:
47
+ raise exc(*args)
48
+
49
+ def _fail(self, val):
50
+ # The location here is set to None because `val` is the ir.Var name
51
+ # and not the actual offending use of the var. When this is raised it is
52
+ # caught in the flow control of `infer_constant` and the class and args
53
+ # (the message) are captured and then raised again but with the location
54
+ # set to the expression that caused the constant inference error.
55
+ raise ConstantInferenceError(
56
+ "Constant inference not possible for: %s" % (val,), loc=None
57
+ )
58
+
59
+ def _do_infer(self, name):
60
+ if not isinstance(name, str):
61
+ raise TypeError("infer_constant() called with non-str %r" % (name,))
62
+ try:
63
+ defn = self._func_ir.get_definition(name)
64
+ except KeyError:
65
+ raise ConstantInferenceError(
66
+ "no single definition for %r" % (name,)
67
+ )
68
+ try:
69
+ const = defn.infer_constant()
70
+ except ConstantInferenceError:
71
+ if isinstance(defn, ir.Expr):
72
+ return self._infer_expr(defn)
73
+ self._fail(defn)
74
+ return const
75
+
76
+ def _infer_expr(self, expr):
77
+ # Infer an expression: handle supported cases
78
+ if expr.op == "call":
79
+ func = self.infer_constant(expr.func.name, loc=expr.loc)
80
+ return self._infer_call(func, expr)
81
+ elif expr.op == "getattr":
82
+ value = self.infer_constant(expr.value.name, loc=expr.loc)
83
+ return self._infer_getattr(value, expr)
84
+ elif expr.op == "build_list":
85
+ return [
86
+ self.infer_constant(i.name, loc=expr.loc) for i in expr.items
87
+ ]
88
+ elif expr.op == "build_tuple":
89
+ return tuple(
90
+ self.infer_constant(i.name, loc=expr.loc) for i in expr.items
91
+ )
92
+ self._fail(expr)
93
+
94
+ def _infer_call(self, func, expr):
95
+ if expr.kws or expr.vararg:
96
+ self._fail(expr)
97
+ # Check supported callables
98
+ _slice = func in (slice,)
99
+ _exc = isinstance(func, type) and issubclass(func, BaseException)
100
+ if _slice or _exc:
101
+ args = [
102
+ self.infer_constant(a.name, loc=expr.loc) for a in expr.args
103
+ ]
104
+ if _slice:
105
+ return func(*args)
106
+ elif _exc:
107
+ # If the exception class is user defined it may implement a ctor
108
+ # that does not pass the args to the super. Therefore return the
109
+ # raw class and the args so this can be instantiated at the call
110
+ # site in the way the user source expects it to be.
111
+ return func, args
112
+ else:
113
+ assert 0, "Unreachable"
114
+
115
+ self._fail(expr)
116
+
117
+ def _infer_getattr(self, value, expr):
118
+ if isinstance(value, (ModuleType, type)):
119
+ # Allow looking up a constant on a class or module
120
+ try:
121
+ return getattr(value, expr.attr)
122
+ except AttributeError:
123
+ pass
124
+ self._fail(expr)
@@ -0,0 +1,370 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ import platform
5
+
6
+ import llvmlite.binding as ll
7
+ from llvmlite import ir
8
+
9
+ from numba import _dynfunc
10
+ from numba.core.callwrapper import PyCallWrapper
11
+ from numba.core.base import BaseContext
12
+ from numba.core import (
13
+ utils,
14
+ types,
15
+ config,
16
+ cgutils,
17
+ callconv,
18
+ codegen,
19
+ externals,
20
+ fastmathpass,
21
+ intrinsics,
22
+ )
23
+ from numba.core.options import TargetOptions, include_default_options
24
+ from numba.core.runtime import rtsys
25
+ from numba.core.compiler_lock import global_compiler_lock
26
+ import numba.core.entrypoints
27
+
28
+ # Re-export these options, they are used from the cpu module throughout the code
29
+ # base.
30
+ from numba.cuda.core.options import (
31
+ ParallelOptions, # noqa F401
32
+ FastMathOptions, # noqa F401
33
+ InlineOptions, # noqa F401
34
+ ) # noqa F401
35
+ from numba.np import ufunc_db
36
+
37
+ # Keep those structures in sync with _dynfunc.c.
38
+
39
+
40
+ class ClosureBody(cgutils.Structure):
41
+ _fields = [("env", types.pyobject)]
42
+
43
+
44
+ class EnvBody(cgutils.Structure):
45
+ _fields = [
46
+ ("globals", types.pyobject),
47
+ ("consts", types.pyobject),
48
+ ]
49
+
50
+
51
+ class CPUContext(BaseContext):
52
+ """
53
+ Changes BaseContext calling convention
54
+ """
55
+
56
+ allow_dynamic_globals = True
57
+
58
+ def __init__(self, typingctx, target="cpu"):
59
+ super().__init__(typingctx, target)
60
+
61
+ # Overrides
62
+ def create_module(self, name):
63
+ return self._internal_codegen._create_empty_module(name)
64
+
65
+ @global_compiler_lock
66
+ def init(self):
67
+ self.is32bit = utils.MACHINE_BITS == 32
68
+ self._internal_codegen = codegen.JITCPUCodegen("numba.exec")
69
+
70
+ # Add ARM ABI functions from libgcc_s
71
+ if platform.machine() == "armv7l":
72
+ ll.load_library_permanently("libgcc_s.so.1")
73
+
74
+ # Map external C functions.
75
+ externals.c_math_functions.install(self)
76
+
77
+ def load_additional_registries(self):
78
+ # Only initialize the NRT once something is about to be compiled. The
79
+ # "initialized" state doesn't need to be threadsafe, there's a lock
80
+ # around the internal compilation and the rtsys.initialize call can be
81
+ # made multiple times, worse case init just gets called a bit more often
82
+ # than optimal.
83
+ rtsys.initialize(self)
84
+
85
+ # Add implementations that work via import
86
+ from numba.cpython import (
87
+ enumimpl, # noqa F401
88
+ iterators, # noqa F401
89
+ rangeobj, # noqa F401
90
+ tupleobj, # noqa F401
91
+ ) # noqa F401
92
+ from numba.core import optional, inline_closurecall # noqa F401
93
+ from numba.misc import gdb_hook, literal # noqa F401
94
+ from numba.np import linalg, arraymath, arrayobj # noqa F401
95
+ from numba.np.random import generator_core, generator_methods # noqa F401
96
+ from numba.np.polynomial import polynomial_core, polynomial_functions # noqa F401
97
+ from numba.typed import typeddict, dictimpl # noqa F401
98
+ from numba.typed import typedlist, listobject # noqa F401
99
+ from numba.experimental import jitclass, function_type # noqa F401
100
+ from numba.np import npdatetime # noqa F401
101
+
102
+ # Add target specific implementations
103
+ from numba.np import npyimpl
104
+ from numba.cpython import cmathimpl, mathimpl, printimpl, randomimpl
105
+ from numba.misc import cffiimpl
106
+ from numba.experimental.jitclass.base import (
107
+ ClassBuilder as jitclassimpl,
108
+ )
109
+
110
+ self.install_registry(cmathimpl.registry)
111
+ self.install_registry(cffiimpl.registry)
112
+ self.install_registry(mathimpl.registry)
113
+ self.install_registry(npyimpl.registry)
114
+ self.install_registry(printimpl.registry)
115
+ self.install_registry(randomimpl.registry)
116
+ self.install_registry(jitclassimpl.class_impl_registry)
117
+
118
+ # load 3rd party extensions
119
+ numba.core.entrypoints.init_all()
120
+
121
+ # fix for #8940
122
+ from numba.np.unsafe import ndarray # noqa F401
123
+
124
+ @property
125
+ def target_data(self):
126
+ return self._internal_codegen.target_data
127
+
128
+ def with_aot_codegen(self, name, **aot_options):
129
+ aot_codegen = codegen.AOTCPUCodegen(name, **aot_options)
130
+ return self.subtarget(_internal_codegen=aot_codegen, aot_mode=True)
131
+
132
+ def codegen(self):
133
+ return self._internal_codegen
134
+
135
+ @property
136
+ def call_conv(self):
137
+ return callconv.CPUCallConv(self)
138
+
139
+ def get_env_body(self, builder, envptr):
140
+ """
141
+ From the given *envptr* (a pointer to a _dynfunc.Environment object),
142
+ get a EnvBody allowing structured access to environment fields.
143
+ """
144
+ body_ptr = cgutils.pointer_add(
145
+ builder, envptr, _dynfunc._impl_info["offsetof_env_body"]
146
+ )
147
+ return EnvBody(self, builder, ref=body_ptr, cast_ref=True)
148
+
149
+ def get_env_manager(self, builder, return_pyobject=False):
150
+ envgv = self.declare_env_global(
151
+ builder.module, self.get_env_name(self.fndesc)
152
+ )
153
+ envarg = builder.load(envgv)
154
+ pyapi = self.get_python_api(builder)
155
+ pyapi.emit_environment_sentry(
156
+ envarg,
157
+ return_pyobject=return_pyobject,
158
+ debug_msg=self.fndesc.env_name,
159
+ )
160
+ env_body = self.get_env_body(builder, envarg)
161
+ return pyapi.get_env_manager(self.environment, env_body, envarg)
162
+
163
+ def get_generator_state(self, builder, genptr, return_type):
164
+ """
165
+ From the given *genptr* (a pointer to a _dynfunc.Generator object),
166
+ get a pointer to its state area.
167
+ """
168
+ return cgutils.pointer_add(
169
+ builder,
170
+ genptr,
171
+ _dynfunc._impl_info["offsetof_generator_state"],
172
+ return_type=return_type,
173
+ )
174
+
175
+ def build_list(self, builder, list_type, items):
176
+ """
177
+ Build a list from the Numba *list_type* and its initial *items*.
178
+ """
179
+ from numba.cpython import listobj
180
+
181
+ return listobj.build_list(self, builder, list_type, items)
182
+
183
+ def build_set(self, builder, set_type, items):
184
+ """
185
+ Build a set from the Numba *set_type* and its initial *items*.
186
+ """
187
+ from numba.cpython import setobj
188
+
189
+ return setobj.build_set(self, builder, set_type, items)
190
+
191
+ def build_map(self, builder, dict_type, item_types, items):
192
+ from numba.typed import dictobject
193
+
194
+ return dictobject.build_map(self, builder, dict_type, item_types, items)
195
+
196
+ def post_lowering(self, mod, library):
197
+ if self.fastmath:
198
+ fastmathpass.rewrite_module(mod, self.fastmath)
199
+
200
+ if self.is32bit:
201
+ # 32-bit machine needs to replace all 64-bit div/rem to avoid
202
+ # calls to compiler-rt
203
+ intrinsics.fix_divmod(mod)
204
+
205
+ library.add_linking_library(rtsys.library)
206
+
207
+ def create_cpython_wrapper(
208
+ self, library, fndesc, env, call_helper, release_gil=False
209
+ ):
210
+ wrapper_module = self.create_module("wrapper")
211
+ fnty = self.call_conv.get_function_type(fndesc.restype, fndesc.argtypes)
212
+ wrapper_callee = ir.Function(
213
+ wrapper_module, fnty, fndesc.llvm_func_name
214
+ )
215
+ builder = PyCallWrapper(
216
+ self,
217
+ wrapper_module,
218
+ wrapper_callee,
219
+ fndesc,
220
+ env,
221
+ call_helper=call_helper,
222
+ release_gil=release_gil,
223
+ )
224
+ builder.build()
225
+ library.add_ir_module(wrapper_module)
226
+
227
+ def create_cfunc_wrapper(self, library, fndesc, env, call_helper):
228
+ wrapper_module = self.create_module("cfunc_wrapper")
229
+ fnty = self.call_conv.get_function_type(fndesc.restype, fndesc.argtypes)
230
+ wrapper_callee = ir.Function(
231
+ wrapper_module, fnty, fndesc.llvm_func_name
232
+ )
233
+
234
+ ll_argtypes = [self.get_value_type(ty) for ty in fndesc.argtypes]
235
+ ll_return_type = self.get_value_type(fndesc.restype)
236
+ wrapty = ir.FunctionType(ll_return_type, ll_argtypes)
237
+ wrapfn = ir.Function(
238
+ wrapper_module, wrapty, fndesc.llvm_cfunc_wrapper_name
239
+ )
240
+ builder = ir.IRBuilder(wrapfn.append_basic_block("entry"))
241
+
242
+ status, out = self.call_conv.call_function(
243
+ builder,
244
+ wrapper_callee,
245
+ fndesc.restype,
246
+ fndesc.argtypes,
247
+ wrapfn.args,
248
+ attrs=("noinline",),
249
+ )
250
+
251
+ with builder.if_then(status.is_error, likely=False):
252
+ # If (and only if) an error occurred, acquire the GIL
253
+ # and use the interpreter to write out the exception.
254
+ pyapi = self.get_python_api(builder)
255
+ gil_state = pyapi.gil_ensure()
256
+ self.call_conv.raise_error(builder, pyapi, status)
257
+ cstr = self.insert_const_string(builder.module, repr(self))
258
+ strobj = pyapi.string_from_string(cstr)
259
+ pyapi.err_write_unraisable(strobj)
260
+ pyapi.decref(strobj)
261
+ pyapi.gil_release(gil_state)
262
+
263
+ builder.ret(out)
264
+ library.add_ir_module(wrapper_module)
265
+
266
+ def get_executable(self, library, fndesc, env):
267
+ """
268
+ Returns
269
+ -------
270
+ (cfunc, fnptr)
271
+
272
+ - cfunc
273
+ callable function (Can be None)
274
+ - fnptr
275
+ callable function address
276
+ - env
277
+ an execution environment (from _dynfunc)
278
+ """
279
+ # Code generation
280
+ fnptr = library.get_pointer_to_function(
281
+ fndesc.llvm_cpython_wrapper_name
282
+ )
283
+
284
+ # Note: we avoid reusing the original docstring to avoid encoding
285
+ # issues on Python 2, see issue #1908
286
+ doc = "compiled wrapper for %r" % (fndesc.qualname,)
287
+ cfunc = _dynfunc.make_function(
288
+ fndesc.lookup_module(),
289
+ fndesc.qualname.split(".")[-1],
290
+ doc,
291
+ fnptr,
292
+ env,
293
+ # objects to keepalive with the function
294
+ (library,),
295
+ )
296
+ library.codegen.set_env(self.get_env_name(fndesc), env)
297
+ return cfunc
298
+
299
+ def calc_array_sizeof(self, ndim):
300
+ """
301
+ Calculate the size of an array struct on the CPU target
302
+ """
303
+ aryty = types.Array(types.int32, ndim, "A")
304
+ return self.get_abi_sizeof(self.get_value_type(aryty))
305
+
306
+ # Overrides
307
+ def get_ufunc_info(self, ufunc_key):
308
+ return ufunc_db.get_ufunc_info(ufunc_key)
309
+
310
+
311
+ # ----------------------------------------------------------------------------
312
+ # TargetOptions
313
+
314
+ _options_mixin = include_default_options(
315
+ "nopython",
316
+ "forceobj",
317
+ "looplift",
318
+ "_nrt",
319
+ "debug",
320
+ "boundscheck",
321
+ "nogil",
322
+ "no_rewrites",
323
+ "no_cpython_wrapper",
324
+ "no_cfunc_wrapper",
325
+ "parallel",
326
+ "fastmath",
327
+ "error_model",
328
+ "inline",
329
+ "forceinline",
330
+ "_dbg_extend_lifetimes",
331
+ "_dbg_optnone",
332
+ )
333
+
334
+
335
+ class CPUTargetOptions(_options_mixin, TargetOptions):
336
+ def finalize(self, flags, options):
337
+ if not flags.is_set("enable_pyobject"):
338
+ flags.enable_pyobject = True
339
+
340
+ if not flags.is_set("enable_looplift"):
341
+ flags.enable_looplift = True
342
+
343
+ flags.inherit_if_not_set("nrt", default=True)
344
+
345
+ if not flags.is_set("debuginfo"):
346
+ flags.debuginfo = config.DEBUGINFO_DEFAULT
347
+
348
+ if not flags.is_set("dbg_extend_lifetimes"):
349
+ if flags.debuginfo:
350
+ # auto turn on extend-lifetimes if debuginfo is on and
351
+ # dbg_extend_lifetimes is not set
352
+ flags.dbg_extend_lifetimes = True
353
+ else:
354
+ # set flag using env-var config
355
+ flags.dbg_extend_lifetimes = config.EXTEND_VARIABLE_LIFETIMES
356
+
357
+ if not flags.is_set("boundscheck"):
358
+ flags.boundscheck = flags.debuginfo
359
+
360
+ flags.enable_pyobject_looplift = True
361
+
362
+ flags.inherit_if_not_set("fastmath")
363
+
364
+ flags.inherit_if_not_set("error_model", default="python")
365
+
366
+ flags.inherit_if_not_set("forceinline")
367
+
368
+ if flags.forceinline:
369
+ # forceinline turns off optnone, just like clang.
370
+ flags.dbg_optnone = False
@@ -0,0 +1,68 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ import weakref
5
+ import importlib
6
+
7
+ from numba import _dynfunc
8
+
9
+
10
+ class Environment(_dynfunc.Environment):
11
+ """Stores globals and constant pyobjects for runtime.
12
+
13
+ It is often needed to convert b/w nopython objects and pyobjects.
14
+ """
15
+
16
+ __slots__ = ("env_name", "__weakref__")
17
+ # A weak-value dictionary to store live environment with env_name as the
18
+ # key.
19
+ _memo = weakref.WeakValueDictionary()
20
+
21
+ @classmethod
22
+ def from_fndesc(cls, fndesc):
23
+ try:
24
+ # Avoid creating new Env
25
+ return cls._memo[fndesc.env_name]
26
+ except KeyError:
27
+ inst = cls(fndesc.lookup_globals())
28
+ inst.env_name = fndesc.env_name
29
+ cls._memo[fndesc.env_name] = inst
30
+ return inst
31
+
32
+ def can_cache(self):
33
+ is_dyn = "__name__" not in self.globals
34
+ return not is_dyn
35
+
36
+ def __reduce__(self):
37
+ return _rebuild_env, (
38
+ self.globals.get("__name__"),
39
+ self.consts,
40
+ self.env_name,
41
+ )
42
+
43
+ def __del__(self):
44
+ return
45
+
46
+ def __repr__(self):
47
+ return f"<Environment {self.env_name!r} >"
48
+
49
+
50
+ def _rebuild_env(modname, consts, env_name):
51
+ env = lookup_environment(env_name)
52
+ if env is not None:
53
+ return env
54
+
55
+ mod = importlib.import_module(modname)
56
+ env = Environment(mod.__dict__)
57
+ env.consts[:] = consts
58
+ env.env_name = env_name
59
+ # Cache loaded object
60
+ Environment._memo[env_name] = env
61
+ return env
62
+
63
+
64
+ def lookup_environment(env_name):
65
+ """Returns the Environment object for the given name;
66
+ or None if not found
67
+ """
68
+ return Environment._memo.get(env_name)