warp-lang 0.10.1__py3-none-win_amd64.whl → 0.11.0__py3-none-win_amd64.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 warp-lang might be problematic. Click here for more details.

Files changed (300) hide show
  1. warp/__init__.py +10 -4
  2. warp/__init__.pyi +1 -0
  3. warp/bin/warp-clang.dll +0 -0
  4. warp/bin/warp.dll +0 -0
  5. warp/build.py +5 -3
  6. warp/build_dll.py +29 -9
  7. warp/builtins.py +868 -507
  8. warp/codegen.py +1074 -638
  9. warp/config.py +3 -3
  10. warp/constants.py +6 -0
  11. warp/context.py +715 -222
  12. warp/fabric.py +326 -0
  13. warp/fem/__init__.py +27 -0
  14. warp/fem/cache.py +389 -0
  15. warp/fem/dirichlet.py +181 -0
  16. warp/fem/domain.py +263 -0
  17. warp/fem/field/__init__.py +101 -0
  18. warp/fem/field/field.py +149 -0
  19. warp/fem/field/nodal_field.py +299 -0
  20. warp/fem/field/restriction.py +21 -0
  21. warp/fem/field/test.py +181 -0
  22. warp/fem/field/trial.py +183 -0
  23. warp/fem/geometry/__init__.py +19 -0
  24. warp/fem/geometry/closest_point.py +70 -0
  25. warp/fem/geometry/deformed_geometry.py +271 -0
  26. warp/fem/geometry/element.py +744 -0
  27. warp/fem/geometry/geometry.py +186 -0
  28. warp/fem/geometry/grid_2d.py +373 -0
  29. warp/fem/geometry/grid_3d.py +435 -0
  30. warp/fem/geometry/hexmesh.py +953 -0
  31. warp/fem/geometry/partition.py +376 -0
  32. warp/fem/geometry/quadmesh_2d.py +532 -0
  33. warp/fem/geometry/tetmesh.py +840 -0
  34. warp/fem/geometry/trimesh_2d.py +577 -0
  35. warp/fem/integrate.py +1616 -0
  36. warp/fem/operator.py +191 -0
  37. warp/fem/polynomial.py +213 -0
  38. warp/fem/quadrature/__init__.py +2 -0
  39. warp/fem/quadrature/pic_quadrature.py +245 -0
  40. warp/fem/quadrature/quadrature.py +294 -0
  41. warp/fem/space/__init__.py +292 -0
  42. warp/fem/space/basis_space.py +489 -0
  43. warp/fem/space/collocated_function_space.py +105 -0
  44. warp/fem/space/dof_mapper.py +236 -0
  45. warp/fem/space/function_space.py +145 -0
  46. warp/fem/space/grid_2d_function_space.py +267 -0
  47. warp/fem/space/grid_3d_function_space.py +306 -0
  48. warp/fem/space/hexmesh_function_space.py +352 -0
  49. warp/fem/space/partition.py +350 -0
  50. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  51. warp/fem/space/restriction.py +160 -0
  52. warp/fem/space/shape/__init__.py +15 -0
  53. warp/fem/space/shape/cube_shape_function.py +738 -0
  54. warp/fem/space/shape/shape_function.py +103 -0
  55. warp/fem/space/shape/square_shape_function.py +611 -0
  56. warp/fem/space/shape/tet_shape_function.py +567 -0
  57. warp/fem/space/shape/triangle_shape_function.py +429 -0
  58. warp/fem/space/tetmesh_function_space.py +292 -0
  59. warp/fem/space/topology.py +295 -0
  60. warp/fem/space/trimesh_2d_function_space.py +221 -0
  61. warp/fem/types.py +77 -0
  62. warp/fem/utils.py +495 -0
  63. warp/native/array.h +147 -44
  64. warp/native/builtin.h +122 -149
  65. warp/native/bvh.cpp +73 -325
  66. warp/native/bvh.cu +406 -23
  67. warp/native/bvh.h +34 -43
  68. warp/native/clang/clang.cpp +13 -8
  69. warp/native/crt.h +2 -0
  70. warp/native/cuda_crt.h +5 -0
  71. warp/native/cuda_util.cpp +15 -3
  72. warp/native/cuda_util.h +3 -1
  73. warp/native/cutlass/tools/library/scripts/conv2d_operation.py +463 -0
  74. warp/native/cutlass/tools/library/scripts/conv3d_operation.py +321 -0
  75. warp/native/cutlass/tools/library/scripts/gemm_operation.py +988 -0
  76. warp/native/cutlass/tools/library/scripts/generator.py +4625 -0
  77. warp/native/cutlass/tools/library/scripts/library.py +799 -0
  78. warp/native/cutlass/tools/library/scripts/manifest.py +402 -0
  79. warp/native/cutlass/tools/library/scripts/pycutlass/docs/source/conf.py +96 -0
  80. warp/native/cutlass/tools/library/scripts/pycutlass/profile/conv/conv2d_f16_sm80.py +106 -0
  81. warp/native/cutlass/tools/library/scripts/pycutlass/profile/gemm/gemm_f32_sm80.py +91 -0
  82. warp/native/cutlass/tools/library/scripts/pycutlass/setup.py +80 -0
  83. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/__init__.py +48 -0
  84. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/arguments.py +118 -0
  85. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/c_types.py +241 -0
  86. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/compiler.py +432 -0
  87. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/conv2d_operation.py +631 -0
  88. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/epilogue.py +1026 -0
  89. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/frontend.py +104 -0
  90. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/gemm_operation.py +1276 -0
  91. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/library.py +744 -0
  92. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/memory_manager.py +74 -0
  93. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/operation.py +110 -0
  94. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/parser.py +619 -0
  95. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/reduction_operation.py +398 -0
  96. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/tensor_ref.py +70 -0
  97. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/__init__.py +4 -0
  98. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/conv2d_testbed.py +646 -0
  99. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_grouped_testbed.py +235 -0
  100. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_testbed.py +557 -0
  101. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/profiler.py +70 -0
  102. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/type_hint.py +39 -0
  103. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/__init__.py +1 -0
  104. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/device.py +76 -0
  105. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/reference_model.py +255 -0
  106. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/__init__.py +0 -0
  107. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +201 -0
  108. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +177 -0
  109. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +98 -0
  110. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +95 -0
  111. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_few_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +163 -0
  112. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_fixed_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +187 -0
  113. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +309 -0
  114. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +54 -0
  115. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  116. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  117. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_strided_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +253 -0
  118. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +97 -0
  119. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +242 -0
  120. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  121. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  122. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/run_all_tests.py +10 -0
  123. warp/native/cutlass/tools/library/scripts/pycutlass/test/frontend/test_frontend.py +146 -0
  124. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/__init__.py +0 -0
  125. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_bf16_sm80.py +96 -0
  126. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f16_sm80.py +447 -0
  127. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f32_sm80.py +146 -0
  128. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f64_sm80.py +102 -0
  129. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_grouped_sm80.py +203 -0
  130. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_s8_sm80.py +229 -0
  131. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/run_all_tests.py +9 -0
  132. warp/native/cutlass/tools/library/scripts/pycutlass/test/unit/test_sm80.py +453 -0
  133. warp/native/cutlass/tools/library/scripts/rank_2k_operation.py +398 -0
  134. warp/native/cutlass/tools/library/scripts/rank_k_operation.py +387 -0
  135. warp/native/cutlass/tools/library/scripts/rt.py +796 -0
  136. warp/native/cutlass/tools/library/scripts/symm_operation.py +400 -0
  137. warp/native/cutlass/tools/library/scripts/trmm_operation.py +407 -0
  138. warp/native/cutlass_gemm.cu +5 -3
  139. warp/native/exports.h +1240 -952
  140. warp/native/fabric.h +228 -0
  141. warp/native/hashgrid.cpp +4 -4
  142. warp/native/hashgrid.h +22 -2
  143. warp/native/intersect.h +22 -7
  144. warp/native/intersect_adj.h +8 -8
  145. warp/native/intersect_tri.h +1 -1
  146. warp/native/marching.cu +157 -161
  147. warp/native/mat.h +80 -19
  148. warp/native/matnn.h +2 -2
  149. warp/native/mesh.cpp +33 -108
  150. warp/native/mesh.cu +114 -23
  151. warp/native/mesh.h +446 -46
  152. warp/native/noise.h +272 -329
  153. warp/native/quat.h +51 -8
  154. warp/native/rand.h +45 -35
  155. warp/native/range.h +6 -2
  156. warp/native/reduce.cpp +1 -1
  157. warp/native/reduce.cu +10 -12
  158. warp/native/runlength_encode.cu +6 -10
  159. warp/native/scan.cu +8 -11
  160. warp/native/sparse.cpp +4 -4
  161. warp/native/sparse.cu +164 -154
  162. warp/native/spatial.h +2 -2
  163. warp/native/temp_buffer.h +14 -30
  164. warp/native/vec.h +107 -23
  165. warp/native/volume.h +120 -0
  166. warp/native/warp.cpp +560 -30
  167. warp/native/warp.cu +431 -44
  168. warp/native/warp.h +13 -4
  169. warp/optim/__init__.py +1 -0
  170. warp/optim/linear.py +922 -0
  171. warp/optim/sgd.py +92 -0
  172. warp/render/render_opengl.py +335 -119
  173. warp/render/render_usd.py +11 -11
  174. warp/sim/__init__.py +2 -2
  175. warp/sim/articulation.py +385 -185
  176. warp/sim/collide.py +8 -0
  177. warp/sim/import_mjcf.py +297 -106
  178. warp/sim/import_urdf.py +389 -210
  179. warp/sim/import_usd.py +198 -97
  180. warp/sim/inertia.py +17 -18
  181. warp/sim/integrator_euler.py +14 -8
  182. warp/sim/integrator_xpbd.py +158 -16
  183. warp/sim/model.py +795 -291
  184. warp/sim/render.py +3 -3
  185. warp/sim/utils.py +3 -0
  186. warp/sparse.py +640 -150
  187. warp/stubs.py +606 -267
  188. warp/tape.py +61 -10
  189. warp/tests/__main__.py +3 -6
  190. warp/tests/assets/curlnoise_golden.npy +0 -0
  191. warp/tests/assets/pnoise_golden.npy +0 -0
  192. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  193. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  194. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  195. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  196. warp/tests/aux_test_unresolved_func.py +14 -0
  197. warp/tests/aux_test_unresolved_symbol.py +14 -0
  198. warp/tests/disabled_kinematics.py +239 -0
  199. warp/tests/run_coverage_serial.py +31 -0
  200. warp/tests/test_adam.py +103 -106
  201. warp/tests/test_arithmetic.py +128 -74
  202. warp/tests/test_array.py +212 -97
  203. warp/tests/test_array_reduce.py +57 -23
  204. warp/tests/test_atomic.py +64 -28
  205. warp/tests/test_bool.py +99 -0
  206. warp/tests/test_builtins_resolution.py +1292 -0
  207. warp/tests/test_bvh.py +42 -18
  208. warp/tests/test_closest_point_edge_edge.py +54 -57
  209. warp/tests/test_codegen.py +208 -130
  210. warp/tests/test_compile_consts.py +28 -20
  211. warp/tests/test_conditional.py +108 -24
  212. warp/tests/test_copy.py +10 -12
  213. warp/tests/test_ctypes.py +112 -88
  214. warp/tests/test_dense.py +21 -14
  215. warp/tests/test_devices.py +98 -0
  216. warp/tests/test_dlpack.py +75 -75
  217. warp/tests/test_examples.py +277 -0
  218. warp/tests/test_fabricarray.py +955 -0
  219. warp/tests/test_fast_math.py +15 -11
  220. warp/tests/test_fem.py +1271 -0
  221. warp/tests/test_fp16.py +53 -19
  222. warp/tests/test_func.py +187 -86
  223. warp/tests/test_generics.py +194 -49
  224. warp/tests/test_grad.py +178 -109
  225. warp/tests/test_grad_customs.py +176 -0
  226. warp/tests/test_hash_grid.py +52 -37
  227. warp/tests/test_import.py +10 -23
  228. warp/tests/test_indexedarray.py +32 -31
  229. warp/tests/test_intersect.py +18 -9
  230. warp/tests/test_large.py +141 -0
  231. warp/tests/test_launch.py +14 -41
  232. warp/tests/test_lerp.py +64 -65
  233. warp/tests/test_linear_solvers.py +154 -0
  234. warp/tests/test_lvalue.py +493 -0
  235. warp/tests/test_marching_cubes.py +12 -13
  236. warp/tests/test_mat.py +517 -2898
  237. warp/tests/test_mat_lite.py +115 -0
  238. warp/tests/test_mat_scalar_ops.py +2889 -0
  239. warp/tests/test_math.py +103 -9
  240. warp/tests/test_matmul.py +305 -69
  241. warp/tests/test_matmul_lite.py +410 -0
  242. warp/tests/test_mesh.py +71 -14
  243. warp/tests/test_mesh_query_aabb.py +41 -25
  244. warp/tests/test_mesh_query_point.py +140 -22
  245. warp/tests/test_mesh_query_ray.py +39 -22
  246. warp/tests/test_mlp.py +30 -22
  247. warp/tests/test_model.py +92 -89
  248. warp/tests/test_modules_lite.py +39 -0
  249. warp/tests/test_multigpu.py +88 -114
  250. warp/tests/test_noise.py +12 -11
  251. warp/tests/test_operators.py +16 -20
  252. warp/tests/test_options.py +11 -11
  253. warp/tests/test_pinned.py +17 -18
  254. warp/tests/test_print.py +32 -11
  255. warp/tests/test_quat.py +275 -129
  256. warp/tests/test_rand.py +18 -16
  257. warp/tests/test_reload.py +38 -34
  258. warp/tests/test_rounding.py +50 -43
  259. warp/tests/test_runlength_encode.py +168 -20
  260. warp/tests/test_smoothstep.py +9 -11
  261. warp/tests/test_snippet.py +143 -0
  262. warp/tests/test_sparse.py +261 -63
  263. warp/tests/test_spatial.py +276 -243
  264. warp/tests/test_streams.py +110 -85
  265. warp/tests/test_struct.py +268 -63
  266. warp/tests/test_tape.py +39 -21
  267. warp/tests/test_torch.py +118 -89
  268. warp/tests/test_transient_module.py +12 -13
  269. warp/tests/test_types.py +614 -0
  270. warp/tests/test_utils.py +494 -0
  271. warp/tests/test_vec.py +354 -2050
  272. warp/tests/test_vec_lite.py +73 -0
  273. warp/tests/test_vec_scalar_ops.py +2099 -0
  274. warp/tests/test_volume.py +457 -293
  275. warp/tests/test_volume_write.py +124 -134
  276. warp/tests/unittest_serial.py +35 -0
  277. warp/tests/unittest_suites.py +341 -0
  278. warp/tests/unittest_utils.py +568 -0
  279. warp/tests/unused_test_misc.py +71 -0
  280. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  281. warp/thirdparty/appdirs.py +36 -45
  282. warp/thirdparty/unittest_parallel.py +549 -0
  283. warp/torch.py +9 -6
  284. warp/types.py +1089 -366
  285. warp/utils.py +93 -387
  286. warp_lang-0.11.0.dist-info/METADATA +238 -0
  287. warp_lang-0.11.0.dist-info/RECORD +332 -0
  288. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/WHEEL +1 -1
  289. warp/tests/test_all.py +0 -219
  290. warp/tests/test_array_scan.py +0 -60
  291. warp/tests/test_base.py +0 -208
  292. warp/tests/test_unresolved_func.py +0 -7
  293. warp/tests/test_unresolved_symbol.py +0 -7
  294. warp_lang-0.10.1.dist-info/METADATA +0 -21
  295. warp_lang-0.10.1.dist-info/RECORD +0 -188
  296. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  297. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  298. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  299. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/LICENSE.md +0 -0
  300. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/top_level.txt +0 -0
@@ -5,12 +5,12 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
+ import unittest
9
+
8
10
  import numpy as np
9
11
 
10
12
  import warp as wp
11
- from warp.tests.test_base import *
12
-
13
- np.random.seed(532)
13
+ from warp.tests.unittest_utils import *
14
14
 
15
15
  wp.init()
16
16
 
@@ -41,9 +41,7 @@ def count_neighbors(grid: wp.uint64, radius: float, points: wp.array(dtype=wp.ve
41
41
  count = int(0)
42
42
 
43
43
  # construct query around point p
44
- neighbors = wp.hash_grid_query(grid, p, radius)
45
-
46
- for index in neighbors:
44
+ for index in wp.hash_grid_query(grid, p, radius):
47
45
  # compute distance to point
48
46
  d = wp.length(p - points[index])
49
47
 
@@ -74,6 +72,9 @@ def count_neighbors_reference(
74
72
 
75
73
 
76
74
  def test_hashgrid_query(test, device):
75
+ wp.load_module(device=device)
76
+ rng = np.random.default_rng(123)
77
+
77
78
  grid = wp.HashGrid(dim_x, dim_y, dim_z, device)
78
79
 
79
80
  for i in range(num_runs):
@@ -81,15 +82,14 @@ def test_hashgrid_query(test, device):
81
82
  print(f"Run: {i+1}")
82
83
  print("---------")
83
84
 
84
- np.random.seed(532)
85
- points = np.random.rand(num_points, 3) * scale - np.array((scale, scale, scale)) * 0.5
85
+ points = rng.random(size=(num_points, 3)) * scale - np.array((scale, scale, scale)) * 0.5
86
86
 
87
87
  def particle_grid(dim_x, dim_y, dim_z, lower, radius, jitter):
88
88
  points = np.meshgrid(
89
89
  np.linspace(0, dim_x, dim_x), np.linspace(0, dim_y, dim_y), np.linspace(0, dim_z, dim_z)
90
90
  )
91
91
  points_t = np.array((points[0], points[1], points[2])).T * radius * 2.0 + np.array(lower)
92
- points_t = points_t + np.random.rand(*points_t.shape) * radius * jitter
92
+ points_t = points_t + rng.random(size=points_t.shape) * radius * jitter
93
93
 
94
94
  return points_t.reshape((-1, 3))
95
95
 
@@ -99,27 +99,28 @@ def test_hashgrid_query(test, device):
99
99
  counts_arr = wp.zeros(len(points), dtype=int, device=device)
100
100
  counts_arr_ref = wp.zeros(len(points), dtype=int, device=device)
101
101
 
102
- with wp.ScopedTimer("brute", active=print_enabled):
103
- wp.launch(
104
- kernel=count_neighbors_reference,
105
- dim=len(points) * len(points),
106
- inputs=[query_radius, points_arr, counts_arr_ref, len(points)],
107
- device=device,
108
- )
109
- wp.synchronize()
110
-
111
- with wp.ScopedTimer("grid build", active=print_enabled):
112
- grid.build(points_arr, cell_radius)
113
- wp.synchronize()
114
-
115
- with wp.ScopedTimer("grid query", active=print_enabled):
116
- wp.launch(
117
- kernel=count_neighbors,
118
- dim=len(points),
119
- inputs=[grid.id, query_radius, points_arr, counts_arr],
120
- device=device,
121
- )
122
- wp.synchronize()
102
+ profiler = {}
103
+
104
+ with wp.ScopedTimer("grid operations", print=print_enabled, dict=profiler, synchronize=True):
105
+ with wp.ScopedTimer("brute", print=print_enabled, dict=profiler, synchronize=True):
106
+ wp.launch(
107
+ kernel=count_neighbors_reference,
108
+ dim=len(points) * len(points),
109
+ inputs=[query_radius, points_arr, counts_arr_ref, len(points)],
110
+ device=device,
111
+ )
112
+ wp.synchronize()
113
+
114
+ with wp.ScopedTimer("grid build", print=print_enabled, dict=profiler, synchronize=True):
115
+ grid.build(points_arr, cell_radius)
116
+
117
+ with wp.ScopedTimer("grid query", print=print_enabled, dict=profiler, synchronize=True):
118
+ wp.launch(
119
+ kernel=count_neighbors,
120
+ dim=len(points),
121
+ inputs=[grid.id, query_radius, points_arr, counts_arr],
122
+ device=device,
123
+ )
123
124
 
124
125
  counts = counts_arr.numpy()
125
126
  counts_ref = counts_arr_ref.numpy()
@@ -133,17 +134,31 @@ def test_hashgrid_query(test, device):
133
134
  test.assertTrue(np.array_equal(counts, counts_ref))
134
135
 
135
136
 
136
- def register(parent):
137
- devices = get_test_devices()
137
+ def test_hashgrid_codegen_adjoints_with_select(test, device):
138
+ def kernel_fn(
139
+ grid: wp.uint64,
140
+ ):
141
+ v = wp.vec3(0.0, 0.0, 0.0)
142
+
143
+ if True:
144
+ query = wp.hash_grid_query(grid, v, 0.0)
145
+ else:
146
+ query = wp.hash_grid_query(grid, v, 0.0)
147
+
148
+ wp.Kernel(func=kernel_fn)
149
+
150
+
151
+ devices = get_test_devices()
152
+
138
153
 
139
- class TestHashGrid(parent):
140
- pass
154
+ class TestHashGrid(unittest.TestCase):
155
+ pass
141
156
 
142
- add_function_test(TestHashGrid, "test_hashgrid_query", test_hashgrid_query, devices=devices)
143
157
 
144
- return TestHashGrid
158
+ add_function_test(TestHashGrid, "test_hashgrid_query", test_hashgrid_query, devices=devices)
159
+ add_function_test(TestHashGrid, "test_hashgrid_codegen_adjoints_with_select", test_hashgrid_codegen_adjoints_with_select, devices=devices)
145
160
 
146
161
 
147
162
  if __name__ == "__main__":
148
- c = register(unittest.TestCase)
163
+ wp.build.clear_kernel_cache()
149
164
  unittest.main(verbosity=2, failfast=False)
warp/tests/test_import.py CHANGED
@@ -5,20 +5,14 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- # include parent path
9
- import numpy as np
10
- import math
8
+ import unittest
11
9
 
12
10
  import warp as wp
13
- from warp.tests.test_base import *
14
-
15
- import unittest
11
+ import warp.tests.test_func as test_func
12
+ from warp.tests.unittest_utils import *
16
13
 
17
14
  wp.init()
18
15
 
19
- # from test_func import sqr
20
- import warp.tests.test_func as test_func
21
-
22
16
 
23
17
  @wp.kernel
24
18
  def test_import_func():
@@ -30,23 +24,16 @@ def test_import_func():
30
24
  wp.expect_eq(y, 8.0)
31
25
 
32
26
 
33
- def register(parent):
34
- devices = get_test_devices()
35
-
36
- class TestImport(parent):
37
- pass
27
+ devices = get_test_devices()
38
28
 
39
- add_kernel_test(TestImport, kernel=test_import_func, name="test_import_func", dim=1, devices=devices)
40
29
 
41
- return TestImport
30
+ class TestImport(unittest.TestCase):
31
+ pass
42
32
 
43
33
 
44
- if __name__ == "__main__":
45
- c = register(unittest.TestCase)
46
- # unittest.main(verbosity=2)
34
+ add_kernel_test(TestImport, kernel=test_import_func, name="test_import_func", dim=1, devices=devices)
47
35
 
48
- wp.force_load()
49
36
 
50
- loader = unittest.defaultTestLoader
51
- testSuite = loader.loadTestsFromTestCase(c)
52
- testSuite.debug()
37
+ if __name__ == "__main__":
38
+ wp.build.clear_kernel_cache()
39
+ unittest.main(verbosity=2)
@@ -5,15 +5,14 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- # include parent path
9
- import numpy as np
8
+ import unittest
10
9
  from typing import Any
11
10
 
12
- import warp as wp
13
- from warp.tests.test_base import *
14
- from .test_array import FillStruct
11
+ import numpy as np
15
12
 
16
- import unittest
13
+ import warp as wp
14
+ from warp.tests.test_array import FillStruct
15
+ from warp.tests.unittest_utils import *
17
16
 
18
17
  wp.init()
19
18
 
@@ -37,7 +36,7 @@ def test_indexedarray_1d(test, device):
37
36
 
38
37
  indices = wp.array([1, 3, 5, 7, 9], dtype=int, device=device)
39
38
 
40
- iarr = wp.indexedarray(arr, [indices])
39
+ iarr = wp.indexedarray1d(arr, [indices])
41
40
 
42
41
  test.assertEqual(iarr.dtype, arr.dtype)
43
42
  test.assertEqual(iarr.ndim, 1)
@@ -73,7 +72,7 @@ def test_indexedarray_2d(test, device):
73
72
  indices0 = wp.array([1, 3], dtype=int, device=device)
74
73
  indices1 = wp.array([2, 4, 8], dtype=int, device=device)
75
74
 
76
- iarr = wp.indexedarray(arr, [indices0, indices1])
75
+ iarr = wp.indexedarray2d(arr, [indices0, indices1])
77
76
 
78
77
  test.assertEqual(iarr.dtype, arr.dtype)
79
78
  test.assertEqual(iarr.ndim, 2)
@@ -113,7 +112,7 @@ def test_indexedarray_3d(test, device):
113
112
  indices1 = wp.array([2, 4, 8], dtype=int, device=device)
114
113
  indices2 = wp.array([0, 5], dtype=int, device=device)
115
114
 
116
- iarr = wp.indexedarray(arr, [indices0, indices1, indices2])
115
+ iarr = wp.indexedarray3d(arr, [indices0, indices1, indices2])
117
116
 
118
117
  test.assertEqual(iarr.dtype, arr.dtype)
119
118
  test.assertEqual(iarr.ndim, 3)
@@ -158,7 +157,7 @@ def test_indexedarray_4d(test, device):
158
157
  indices2 = wp.array([0, 5], dtype=int, device=device)
159
158
  indices3 = wp.array([6, 7, 9], dtype=int, device=device)
160
159
 
161
- iarr = wp.indexedarray(arr, [indices0, indices1, indices2, indices3])
160
+ iarr = wp.indexedarray4d(arr, [indices0, indices1, indices2, indices3])
162
161
 
163
162
  test.assertEqual(iarr.dtype, arr.dtype)
164
163
  test.assertEqual(iarr.ndim, 4)
@@ -919,7 +918,10 @@ def test_indexedarray_fill_matrix(test, device):
919
918
  assert_np_equal(a4.numpy(), np.zeros((*a4.shape, *mat_shape), dtype=nptype))
920
919
 
921
920
  # matrix values can be passed as a 1d numpy array, 2d numpy array, flat list, nested list, or Warp matrix instance
922
- fill_arr1 = np.arange(mat_len, dtype=nptype)
921
+ if wptype != wp.bool:
922
+ fill_arr1 = np.arange(mat_len, dtype=nptype)
923
+ else:
924
+ fill_arr1 = np.ones(mat_len, dtype=nptype)
923
925
  fill_arr2 = fill_arr1.reshape(mat_shape)
924
926
  fill_list1 = list(fill_arr1)
925
927
  fill_list2 = [list(row) for row in fill_arr2]
@@ -1104,30 +1106,29 @@ def test_indexedarray_fill_struct(test, device):
1104
1106
  assert_np_equal(a4.numpy(), np.zeros(a4.shape, dtype=nptype))
1105
1107
 
1106
1108
 
1107
- def register(parent):
1108
- devices = get_test_devices()
1109
+ devices = get_test_devices()
1110
+
1109
1111
 
1110
- class TestIndexedArray(parent):
1111
- pass
1112
+ class TestIndexedArray(unittest.TestCase):
1113
+ pass
1112
1114
 
1113
- add_function_test(TestIndexedArray, "test_indexedarray_1d", test_indexedarray_1d, devices=devices)
1114
- add_function_test(TestIndexedArray, "test_indexedarray_2d", test_indexedarray_2d, devices=devices)
1115
- add_function_test(TestIndexedArray, "test_indexedarray_3d", test_indexedarray_3d, devices=devices)
1116
- add_function_test(TestIndexedArray, "test_indexedarray_4d", test_indexedarray_4d, devices=devices)
1117
- add_function_test(TestIndexedArray, "test_indexedarray_mixed", test_indexedarray_mixed, devices=devices)
1118
- add_function_test(TestIndexedArray, "test_indexedarray_shape", test_indexedarray_shape, devices=devices)
1119
- add_function_test(TestIndexedArray, "test_indexedarray_getitem", test_indexedarray_getitem, devices=devices)
1120
- add_function_test(TestIndexedArray, "test_indexedarray_slicing", test_indexedarray_slicing, devices=devices)
1121
- add_function_test(TestIndexedArray, "test_indexedarray_generics", test_indexedarray_generics, devices=devices)
1122
- add_function_test(TestIndexedArray, "test_indexedarray_empty", test_indexedarray_empty, devices=devices)
1123
- add_function_test(TestIndexedArray, "test_indexedarray_fill_scalar", test_indexedarray_fill_scalar, devices=devices)
1124
- add_function_test(TestIndexedArray, "test_indexedarray_fill_vector", test_indexedarray_fill_vector, devices=devices)
1125
- add_function_test(TestIndexedArray, "test_indexedarray_fill_matrix", test_indexedarray_fill_matrix, devices=devices)
1126
- add_function_test(TestIndexedArray, "test_indexedarray_fill_struct", test_indexedarray_fill_struct, devices=devices)
1127
1115
 
1128
- return TestIndexedArray
1116
+ add_function_test(TestIndexedArray, "test_indexedarray_1d", test_indexedarray_1d, devices=devices)
1117
+ add_function_test(TestIndexedArray, "test_indexedarray_2d", test_indexedarray_2d, devices=devices)
1118
+ add_function_test(TestIndexedArray, "test_indexedarray_3d", test_indexedarray_3d, devices=devices)
1119
+ add_function_test(TestIndexedArray, "test_indexedarray_4d", test_indexedarray_4d, devices=devices)
1120
+ add_function_test(TestIndexedArray, "test_indexedarray_mixed", test_indexedarray_mixed, devices=devices)
1121
+ add_function_test(TestIndexedArray, "test_indexedarray_shape", test_indexedarray_shape, devices=devices)
1122
+ add_function_test(TestIndexedArray, "test_indexedarray_getitem", test_indexedarray_getitem, devices=devices)
1123
+ add_function_test(TestIndexedArray, "test_indexedarray_slicing", test_indexedarray_slicing, devices=devices)
1124
+ add_function_test(TestIndexedArray, "test_indexedarray_generics", test_indexedarray_generics, devices=devices)
1125
+ add_function_test(TestIndexedArray, "test_indexedarray_empty", test_indexedarray_empty, devices=devices)
1126
+ add_function_test(TestIndexedArray, "test_indexedarray_fill_scalar", test_indexedarray_fill_scalar, devices=devices)
1127
+ add_function_test(TestIndexedArray, "test_indexedarray_fill_vector", test_indexedarray_fill_vector, devices=devices)
1128
+ add_function_test(TestIndexedArray, "test_indexedarray_fill_matrix", test_indexedarray_fill_matrix, devices=devices)
1129
+ add_function_test(TestIndexedArray, "test_indexedarray_fill_struct", test_indexedarray_fill_struct, devices=devices)
1129
1130
 
1130
1131
 
1131
1132
  if __name__ == "__main__":
1132
- c = register(unittest.TestCase)
1133
+ wp.build.clear_kernel_cache()
1133
1134
  unittest.main(verbosity=2)
@@ -1,6 +1,16 @@
1
- import warp as wp
1
+ # Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
2
+ # NVIDIA CORPORATION and its licensors retain all intellectual property
3
+ # and proprietary rights in and to this software, related documentation
4
+ # and any modifications thereto. Any use, reproduction, disclosure or
5
+ # distribution of this software and related documentation without an express
6
+ # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
+
8
+ import unittest
9
+
2
10
  import numpy as np
3
- from warp.tests.test_base import *
11
+
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
4
14
 
5
15
  wp.init()
6
16
 
@@ -42,17 +52,16 @@ def test_intersect_tri(test, device):
42
52
  assert_np_equal(result.numpy(), np.array([0]))
43
53
 
44
54
 
45
- def register(parent):
46
- devices = get_test_devices()
55
+ devices = get_test_devices()
56
+
47
57
 
48
- class TestIntersect(parent):
49
- pass
58
+ class TestIntersect(unittest.TestCase):
59
+ pass
50
60
 
51
- add_function_test(TestIntersect, "test_intersect_tri", test_intersect_tri, devices=devices)
52
61
 
53
- return TestIntersect
62
+ add_function_test(TestIntersect, "test_intersect_tri", test_intersect_tri, devices=devices)
54
63
 
55
64
 
56
65
  if __name__ == "__main__":
57
- c = register(unittest.TestCase)
66
+ wp.build.clear_kernel_cache()
58
67
  unittest.main(verbosity=2, failfast=False)
@@ -0,0 +1,141 @@
1
+ # Copyright (c) 2023 NVIDIA CORPORATION. All rights reserved.
2
+ # NVIDIA CORPORATION and its licensors retain all intellectual property
3
+ # and proprietary rights in and to this software, related documentation
4
+ # and any modifications thereto. Any use, reproduction, disclosure or
5
+ # distribution of this software and related documentation without an express
6
+ # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
+
8
+ import math
9
+ import unittest
10
+
11
+ import warp as wp
12
+ from warp.tests.unittest_utils import *
13
+
14
+ wp.init()
15
+
16
+
17
+ @wp.kernel
18
+ def conditional_sum(result: wp.array(dtype=wp.uint64)):
19
+ i, j, k = wp.tid()
20
+
21
+ if i == 0:
22
+ wp.atomic_add(result, 0, wp.uint64(1))
23
+
24
+
25
+ def test_large_launch_large_kernel(test, device):
26
+ """Test tid() on kernel launch of 2**33 threads.
27
+
28
+ The function conditional sum will add 1 to result for every thread that has an i index of 0.
29
+ Due to the size of the grid, this test is not run on CPUs
30
+ """
31
+ test_result = wp.zeros(shape=(1,), dtype=wp.uint64, device=device)
32
+
33
+ large_dim_length = 2**16
34
+ half_result = large_dim_length * large_dim_length
35
+
36
+ wp.launch(kernel=conditional_sum, dim=[2, large_dim_length, large_dim_length], inputs=[test_result], device=device)
37
+ test.assertEqual(test_result.numpy()[0], half_result)
38
+
39
+
40
+ @wp.kernel
41
+ def count_elements(result: wp.array(dtype=wp.uint64)):
42
+ wp.atomic_add(result, 0, wp.uint64(1))
43
+
44
+
45
+ def test_large_launch_max_blocks(test, device):
46
+ # Loop over 1000x1x1 elements using a grid of 256 threads
47
+ test_result = wp.zeros(shape=(1,), dtype=wp.uint64, device=device)
48
+ wp.launch(count_elements, (1000,), inputs=[test_result], max_blocks=1, device=device)
49
+ test.assertEqual(test_result.numpy()[0], 1000)
50
+
51
+ # Loop over 2x10x10 elements using a grid of 256 threads, using the tid() index to count half the elements
52
+ test_result.zero_()
53
+ wp.launch(
54
+ conditional_sum,
55
+ (
56
+ 2,
57
+ 50,
58
+ 10,
59
+ ),
60
+ inputs=[test_result],
61
+ max_blocks=1,
62
+ device=device,
63
+ )
64
+ test.assertEqual(test_result.numpy()[0], 500)
65
+
66
+
67
+ def test_large_launch_very_large_kernel(test, device):
68
+ """Due to the size of the grid, this test is not run on CPUs"""
69
+
70
+ # Dim is chosen to be larger than the maximum CUDA one-dimensional grid size (total threads)
71
+ dim = (2**31 - 1) * 256 + 1
72
+ test_result = wp.zeros(shape=(1,), dtype=wp.uint64, device=device)
73
+ wp.launch(count_elements, (dim,), inputs=[test_result], device=device)
74
+ test.assertEqual(test_result.numpy()[0], dim)
75
+
76
+
77
+ def test_large_arrays_slow(test, device):
78
+ # The goal of this test is to use arrays just large enough to know
79
+ # if there's a flaw in handling arrays with more than 2**31-1 elements
80
+ # Unfortunately, it takes a long time to run so it won't be run automatically
81
+ # without changes to support how frequently a test may be run
82
+ total_elements = 2**31 + 8
83
+
84
+ # 1-D to 4-D arrays: test zero_, fill_, then zero_ for scalar data types:
85
+ for total_dims in range(1, 5):
86
+ dim_x = math.ceil(total_elements ** (1 / total_dims))
87
+ shape_tuple = tuple([dim_x] * total_dims)
88
+
89
+ for nptype, wptype in wp.types.np_dtype_to_warp_type.items():
90
+ a1 = wp.zeros(shape_tuple, dtype=wptype, device=device)
91
+ assert_np_equal(a1.numpy(), np.zeros_like(a1.numpy()))
92
+
93
+ a1.fill_(127)
94
+ assert_np_equal(a1.numpy(), 127 * np.ones_like(a1.numpy()))
95
+
96
+ a1.zero_()
97
+ assert_np_equal(a1.numpy(), np.zeros_like(a1.numpy()))
98
+
99
+
100
+ def test_large_arrays_fast(test, device):
101
+ # A truncated version of test_large_arrays_slow meant to catch basic errors
102
+ total_elements = 2**31 + 8
103
+
104
+ nptype = np.dtype(np.int8)
105
+ wptype = wp.types.np_dtype_to_warp_type[nptype]
106
+
107
+ a1 = wp.zeros((total_elements,), dtype=wptype, device=device)
108
+ assert_np_equal(a1.numpy(), np.zeros_like(a1.numpy()))
109
+
110
+ a1.fill_(127)
111
+ assert_np_equal(a1.numpy(), 127 * np.ones_like(a1.numpy()))
112
+
113
+ a1.zero_()
114
+ assert_np_equal(a1.numpy(), np.zeros_like(a1.numpy()))
115
+
116
+
117
+ devices = get_test_devices()
118
+
119
+
120
+ class TestLarge(unittest.TestCase):
121
+ pass
122
+
123
+
124
+ add_function_test(
125
+ TestLarge, "test_large_launch_large_kernel", test_large_launch_large_kernel, devices=get_unique_cuda_test_devices()
126
+ )
127
+
128
+ add_function_test(TestLarge, "test_large_launch_max_blocks", test_large_launch_max_blocks, devices=devices)
129
+ add_function_test(
130
+ TestLarge,
131
+ "test_large_launch_very_large_kernel",
132
+ test_large_launch_very_large_kernel,
133
+ devices=get_unique_cuda_test_devices(),
134
+ )
135
+
136
+ add_function_test(TestLarge, "test_large_arrays_fast", test_large_arrays_fast, devices=devices)
137
+
138
+
139
+ if __name__ == "__main__":
140
+ wp.build.clear_kernel_cache()
141
+ unittest.main(verbosity=2)
warp/tests/test_launch.py CHANGED
@@ -7,11 +7,10 @@
7
7
 
8
8
  import unittest
9
9
 
10
- # include parent path
11
10
  import numpy as np
12
11
 
13
12
  import warp as wp
14
- from warp.tests.test_base import *
13
+ from warp.tests.unittest_utils import *
15
14
 
16
15
  wp.init()
17
16
 
@@ -306,51 +305,25 @@ def test_launch_tuple_args(test, device):
306
305
  assert_np_equal(out.numpy(), np.array((0, 3, 6, 9)))
307
306
 
308
307
 
309
- @wp.kernel
310
- def conditional_sum(result: wp.array(dtype=wp.uint64)):
311
- i, j, k = wp.tid()
312
-
313
- if i == 0:
314
- wp.atomic_add(result, 0, wp.uint64(1))
315
-
316
-
317
- def test_launch_large_kernel(test, device):
318
- """Test tid() on kernel launch of 2**33 threads.
319
-
320
- The function conditional sum will add 1 to result for every thread that has an i index of 0.
321
- Due to the size of the grid, this test is not run on CPUs
322
- """
323
- test_result = wp.zeros(shape=(1,), dtype=wp.uint64, device=device)
324
-
325
- large_dim_length = 2**16
326
- half_result = large_dim_length * large_dim_length
327
-
328
- wp.launch(kernel=conditional_sum, dim=[2, large_dim_length, large_dim_length], inputs=[test_result], device=device)
329
- test.assertEqual(test_result.numpy()[0], half_result)
330
-
331
-
332
- def register(parent):
333
- devices = get_test_devices()
308
+ devices = get_test_devices()
334
309
 
335
- class TestLaunch(parent):
336
- pass
337
310
 
338
- add_function_test(TestLaunch, "test_launch_1d", test1d, devices=devices)
339
- add_function_test(TestLaunch, "test_launch_2d", test2d, devices=devices)
340
- add_function_test(TestLaunch, "test_launch_3d", test3d, devices=devices)
341
- add_function_test(TestLaunch, "test_launch_4d", test4d, devices=devices)
311
+ class TestLaunch(unittest.TestCase):
312
+ pass
342
313
 
343
- add_function_test(TestLaunch, "test_launch_cmd", test_launch_cmd, devices=devices)
344
- add_function_test(TestLaunch, "test_launch_cmd_set_param", test_launch_cmd_set_param, devices=devices)
345
- add_function_test(TestLaunch, "test_launch_cmd_set_ctype", test_launch_cmd_set_ctype, devices=devices)
346
- add_function_test(TestLaunch, "test_launch_cmd_set_dim", test_launch_cmd_set_dim, devices=devices)
347
- add_function_test(TestLaunch, "test_launch_cmd_empty", test_launch_cmd_empty, devices=devices)
348
314
 
349
- add_function_test(TestLaunch, "test_launch_large_kernel", test_launch_large_kernel, devices=wp.get_cuda_devices())
315
+ add_function_test(TestLaunch, "test_launch_1d", test1d, devices=devices)
316
+ add_function_test(TestLaunch, "test_launch_2d", test2d, devices=devices)
317
+ add_function_test(TestLaunch, "test_launch_3d", test3d, devices=devices)
318
+ add_function_test(TestLaunch, "test_launch_4d", test4d, devices=devices)
350
319
 
351
- return TestLaunch
320
+ add_function_test(TestLaunch, "test_launch_cmd", test_launch_cmd, devices=devices)
321
+ add_function_test(TestLaunch, "test_launch_cmd_set_param", test_launch_cmd_set_param, devices=devices)
322
+ add_function_test(TestLaunch, "test_launch_cmd_set_ctype", test_launch_cmd_set_ctype, devices=devices)
323
+ add_function_test(TestLaunch, "test_launch_cmd_set_dim", test_launch_cmd_set_dim, devices=devices)
324
+ add_function_test(TestLaunch, "test_launch_cmd_empty", test_launch_cmd_empty, devices=devices)
352
325
 
353
326
 
354
327
  if __name__ == "__main__":
355
- c = register(unittest.TestCase)
328
+ wp.build.clear_kernel_cache()
356
329
  unittest.main(verbosity=2)