warp-lang 1.0.0b2__py3-none-win_amd64.whl → 1.0.0b6__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 (271) hide show
  1. docs/conf.py +17 -5
  2. examples/env/env_ant.py +1 -1
  3. examples/env/env_cartpole.py +1 -1
  4. examples/env/env_humanoid.py +1 -1
  5. examples/env/env_usd.py +4 -1
  6. examples/env/environment.py +8 -9
  7. examples/example_dem.py +34 -33
  8. examples/example_diffray.py +364 -337
  9. examples/example_fluid.py +32 -23
  10. examples/example_jacobian_ik.py +97 -93
  11. examples/example_marching_cubes.py +6 -16
  12. examples/example_mesh.py +6 -16
  13. examples/example_mesh_intersect.py +16 -14
  14. examples/example_nvdb.py +14 -16
  15. examples/example_raycast.py +14 -13
  16. examples/example_raymarch.py +16 -23
  17. examples/example_render_opengl.py +19 -10
  18. examples/example_sim_cartpole.py +82 -78
  19. examples/example_sim_cloth.py +45 -48
  20. examples/example_sim_fk_grad.py +51 -44
  21. examples/example_sim_fk_grad_torch.py +47 -40
  22. examples/example_sim_grad_bounce.py +108 -133
  23. examples/example_sim_grad_cloth.py +99 -113
  24. examples/example_sim_granular.py +5 -6
  25. examples/{example_sim_sdf_shape.py → example_sim_granular_collision_sdf.py} +37 -26
  26. examples/example_sim_neo_hookean.py +51 -55
  27. examples/example_sim_particle_chain.py +4 -4
  28. examples/example_sim_quadruped.py +126 -81
  29. examples/example_sim_rigid_chain.py +54 -61
  30. examples/example_sim_rigid_contact.py +66 -70
  31. examples/example_sim_rigid_fem.py +3 -3
  32. examples/example_sim_rigid_force.py +1 -1
  33. examples/example_sim_rigid_gyroscopic.py +3 -4
  34. examples/example_sim_rigid_kinematics.py +28 -39
  35. examples/example_sim_trajopt.py +112 -110
  36. examples/example_sph.py +9 -8
  37. examples/example_wave.py +7 -7
  38. examples/fem/bsr_utils.py +30 -17
  39. examples/fem/example_apic_fluid.py +85 -69
  40. examples/fem/example_convection_diffusion.py +97 -93
  41. examples/fem/example_convection_diffusion_dg.py +142 -149
  42. examples/fem/example_convection_diffusion_dg0.py +141 -136
  43. examples/fem/example_deformed_geometry.py +146 -0
  44. examples/fem/example_diffusion.py +115 -84
  45. examples/fem/example_diffusion_3d.py +116 -86
  46. examples/fem/example_diffusion_mgpu.py +102 -79
  47. examples/fem/example_mixed_elasticity.py +139 -100
  48. examples/fem/example_navier_stokes.py +175 -162
  49. examples/fem/example_stokes.py +143 -111
  50. examples/fem/example_stokes_transfer.py +186 -157
  51. examples/fem/mesh_utils.py +59 -97
  52. examples/fem/plot_utils.py +138 -17
  53. tools/ci/publishing/build_nodes_info.py +54 -0
  54. warp/__init__.py +4 -3
  55. warp/__init__.pyi +1 -0
  56. warp/bin/warp-clang.dll +0 -0
  57. warp/bin/warp.dll +0 -0
  58. warp/build.py +5 -3
  59. warp/build_dll.py +29 -9
  60. warp/builtins.py +836 -492
  61. warp/codegen.py +864 -553
  62. warp/config.py +3 -1
  63. warp/context.py +389 -172
  64. warp/fem/__init__.py +24 -6
  65. warp/fem/cache.py +318 -25
  66. warp/fem/dirichlet.py +7 -3
  67. warp/fem/domain.py +14 -0
  68. warp/fem/field/__init__.py +30 -38
  69. warp/fem/field/field.py +149 -0
  70. warp/fem/field/nodal_field.py +244 -138
  71. warp/fem/field/restriction.py +8 -6
  72. warp/fem/field/test.py +127 -59
  73. warp/fem/field/trial.py +117 -60
  74. warp/fem/geometry/__init__.py +5 -1
  75. warp/fem/geometry/deformed_geometry.py +271 -0
  76. warp/fem/geometry/element.py +24 -1
  77. warp/fem/geometry/geometry.py +86 -14
  78. warp/fem/geometry/grid_2d.py +112 -54
  79. warp/fem/geometry/grid_3d.py +134 -65
  80. warp/fem/geometry/hexmesh.py +953 -0
  81. warp/fem/geometry/partition.py +85 -33
  82. warp/fem/geometry/quadmesh_2d.py +532 -0
  83. warp/fem/geometry/tetmesh.py +451 -115
  84. warp/fem/geometry/trimesh_2d.py +197 -92
  85. warp/fem/integrate.py +534 -268
  86. warp/fem/operator.py +58 -31
  87. warp/fem/polynomial.py +11 -0
  88. warp/fem/quadrature/__init__.py +1 -1
  89. warp/fem/quadrature/pic_quadrature.py +150 -58
  90. warp/fem/quadrature/quadrature.py +209 -57
  91. warp/fem/space/__init__.py +230 -53
  92. warp/fem/space/basis_space.py +489 -0
  93. warp/fem/space/collocated_function_space.py +105 -0
  94. warp/fem/space/dof_mapper.py +49 -2
  95. warp/fem/space/function_space.py +90 -39
  96. warp/fem/space/grid_2d_function_space.py +149 -496
  97. warp/fem/space/grid_3d_function_space.py +173 -538
  98. warp/fem/space/hexmesh_function_space.py +352 -0
  99. warp/fem/space/partition.py +129 -76
  100. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  101. warp/fem/space/restriction.py +46 -34
  102. warp/fem/space/shape/__init__.py +15 -0
  103. warp/fem/space/shape/cube_shape_function.py +738 -0
  104. warp/fem/space/shape/shape_function.py +103 -0
  105. warp/fem/space/shape/square_shape_function.py +611 -0
  106. warp/fem/space/shape/tet_shape_function.py +567 -0
  107. warp/fem/space/shape/triangle_shape_function.py +429 -0
  108. warp/fem/space/tetmesh_function_space.py +132 -1039
  109. warp/fem/space/topology.py +295 -0
  110. warp/fem/space/trimesh_2d_function_space.py +104 -742
  111. warp/fem/types.py +13 -11
  112. warp/fem/utils.py +335 -60
  113. warp/native/array.h +120 -34
  114. warp/native/builtin.h +101 -72
  115. warp/native/bvh.cpp +73 -325
  116. warp/native/bvh.cu +406 -23
  117. warp/native/bvh.h +22 -40
  118. warp/native/clang/clang.cpp +1 -0
  119. warp/native/crt.h +2 -0
  120. warp/native/cuda_util.cpp +8 -3
  121. warp/native/cuda_util.h +1 -0
  122. warp/native/exports.h +1522 -1243
  123. warp/native/intersect.h +19 -4
  124. warp/native/intersect_adj.h +8 -8
  125. warp/native/mat.h +76 -17
  126. warp/native/mesh.cpp +33 -108
  127. warp/native/mesh.cu +114 -18
  128. warp/native/mesh.h +395 -40
  129. warp/native/noise.h +272 -329
  130. warp/native/quat.h +51 -8
  131. warp/native/rand.h +44 -34
  132. warp/native/reduce.cpp +1 -1
  133. warp/native/sparse.cpp +4 -4
  134. warp/native/sparse.cu +163 -155
  135. warp/native/spatial.h +2 -2
  136. warp/native/temp_buffer.h +18 -14
  137. warp/native/vec.h +103 -21
  138. warp/native/warp.cpp +2 -1
  139. warp/native/warp.cu +28 -3
  140. warp/native/warp.h +4 -3
  141. warp/render/render_opengl.py +261 -109
  142. warp/sim/__init__.py +1 -2
  143. warp/sim/articulation.py +385 -185
  144. warp/sim/import_mjcf.py +59 -48
  145. warp/sim/import_urdf.py +15 -15
  146. warp/sim/import_usd.py +174 -102
  147. warp/sim/inertia.py +17 -18
  148. warp/sim/integrator_xpbd.py +4 -3
  149. warp/sim/model.py +330 -250
  150. warp/sim/render.py +1 -1
  151. warp/sparse.py +625 -152
  152. warp/stubs.py +341 -309
  153. warp/tape.py +9 -6
  154. warp/tests/__main__.py +3 -6
  155. warp/tests/assets/curlnoise_golden.npy +0 -0
  156. warp/tests/assets/pnoise_golden.npy +0 -0
  157. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  158. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  159. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  160. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  161. warp/tests/aux_test_unresolved_func.py +14 -0
  162. warp/tests/aux_test_unresolved_symbol.py +14 -0
  163. warp/tests/disabled_kinematics.py +239 -0
  164. warp/tests/run_coverage_serial.py +31 -0
  165. warp/tests/test_adam.py +103 -106
  166. warp/tests/test_arithmetic.py +94 -74
  167. warp/tests/test_array.py +82 -101
  168. warp/tests/test_array_reduce.py +57 -23
  169. warp/tests/test_atomic.py +64 -28
  170. warp/tests/test_bool.py +22 -12
  171. warp/tests/test_builtins_resolution.py +1292 -0
  172. warp/tests/test_bvh.py +18 -18
  173. warp/tests/test_closest_point_edge_edge.py +54 -57
  174. warp/tests/test_codegen.py +165 -134
  175. warp/tests/test_compile_consts.py +28 -20
  176. warp/tests/test_conditional.py +108 -24
  177. warp/tests/test_copy.py +10 -12
  178. warp/tests/test_ctypes.py +112 -88
  179. warp/tests/test_dense.py +21 -14
  180. warp/tests/test_devices.py +98 -0
  181. warp/tests/test_dlpack.py +75 -75
  182. warp/tests/test_examples.py +237 -0
  183. warp/tests/test_fabricarray.py +22 -24
  184. warp/tests/test_fast_math.py +15 -11
  185. warp/tests/test_fem.py +1034 -124
  186. warp/tests/test_fp16.py +23 -16
  187. warp/tests/test_func.py +187 -86
  188. warp/tests/test_generics.py +194 -49
  189. warp/tests/test_grad.py +123 -181
  190. warp/tests/test_grad_customs.py +176 -0
  191. warp/tests/test_hash_grid.py +35 -34
  192. warp/tests/test_import.py +10 -23
  193. warp/tests/test_indexedarray.py +24 -25
  194. warp/tests/test_intersect.py +18 -9
  195. warp/tests/test_large.py +141 -0
  196. warp/tests/test_launch.py +14 -41
  197. warp/tests/test_lerp.py +64 -65
  198. warp/tests/test_lvalue.py +493 -0
  199. warp/tests/test_marching_cubes.py +12 -13
  200. warp/tests/test_mat.py +517 -2898
  201. warp/tests/test_mat_lite.py +115 -0
  202. warp/tests/test_mat_scalar_ops.py +2889 -0
  203. warp/tests/test_math.py +103 -9
  204. warp/tests/test_matmul.py +304 -69
  205. warp/tests/test_matmul_lite.py +410 -0
  206. warp/tests/test_mesh.py +60 -22
  207. warp/tests/test_mesh_query_aabb.py +21 -25
  208. warp/tests/test_mesh_query_point.py +111 -22
  209. warp/tests/test_mesh_query_ray.py +12 -24
  210. warp/tests/test_mlp.py +30 -22
  211. warp/tests/test_model.py +92 -89
  212. warp/tests/test_modules_lite.py +39 -0
  213. warp/tests/test_multigpu.py +88 -114
  214. warp/tests/test_noise.py +12 -11
  215. warp/tests/test_operators.py +16 -20
  216. warp/tests/test_options.py +11 -11
  217. warp/tests/test_pinned.py +17 -18
  218. warp/tests/test_print.py +32 -11
  219. warp/tests/test_quat.py +275 -129
  220. warp/tests/test_rand.py +18 -16
  221. warp/tests/test_reload.py +38 -34
  222. warp/tests/test_rounding.py +50 -43
  223. warp/tests/test_runlength_encode.py +168 -20
  224. warp/tests/test_smoothstep.py +9 -11
  225. warp/tests/test_snippet.py +143 -0
  226. warp/tests/test_sparse.py +261 -63
  227. warp/tests/test_spatial.py +276 -243
  228. warp/tests/test_streams.py +110 -85
  229. warp/tests/test_struct.py +268 -63
  230. warp/tests/test_tape.py +39 -21
  231. warp/tests/test_torch.py +90 -86
  232. warp/tests/test_transient_module.py +10 -12
  233. warp/tests/test_types.py +363 -0
  234. warp/tests/test_utils.py +451 -0
  235. warp/tests/test_vec.py +354 -2050
  236. warp/tests/test_vec_lite.py +73 -0
  237. warp/tests/test_vec_scalar_ops.py +2099 -0
  238. warp/tests/test_volume.py +418 -376
  239. warp/tests/test_volume_write.py +124 -134
  240. warp/tests/unittest_serial.py +35 -0
  241. warp/tests/unittest_suites.py +291 -0
  242. warp/tests/unittest_utils.py +342 -0
  243. warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
  244. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  245. warp/thirdparty/appdirs.py +36 -45
  246. warp/thirdparty/unittest_parallel.py +589 -0
  247. warp/types.py +622 -211
  248. warp/utils.py +54 -393
  249. warp_lang-1.0.0b6.dist-info/METADATA +238 -0
  250. warp_lang-1.0.0b6.dist-info/RECORD +409 -0
  251. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
  252. examples/example_cache_management.py +0 -40
  253. examples/example_multigpu.py +0 -54
  254. examples/example_struct.py +0 -65
  255. examples/fem/example_stokes_transfer_3d.py +0 -210
  256. warp/bin/warp-clang.so +0 -0
  257. warp/bin/warp.so +0 -0
  258. warp/fem/field/discrete_field.py +0 -80
  259. warp/fem/space/nodal_function_space.py +0 -233
  260. warp/tests/test_all.py +0 -223
  261. warp/tests/test_array_scan.py +0 -60
  262. warp/tests/test_base.py +0 -208
  263. warp/tests/test_unresolved_func.py +0 -7
  264. warp/tests/test_unresolved_symbol.py +0 -7
  265. warp_lang-1.0.0b2.dist-info/METADATA +0 -26
  266. warp_lang-1.0.0b2.dist-info/RECORD +0 -380
  267. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  268. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  269. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  270. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
  271. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/top_level.txt +0 -0
@@ -5,16 +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 numpy as np
9
- import warp as wp
8
+ import unittest
10
9
 
11
- import math
10
+ import numpy as np
12
11
 
13
12
  import warp as wp
14
- from warp.tests.test_base import *
15
-
16
- import unittest
17
-
13
+ from warp.tests.unittest_utils import *
18
14
 
19
15
  wp.init()
20
16
 
@@ -31,156 +27,134 @@ def arange(start: int, step: int, a: wp.array(dtype=int)):
31
27
  a[tid] = start + step * tid
32
28
 
33
29
 
34
- def test_multigpu_set_device(test, device):
35
- assert len(wp.get_cuda_devices()) > 1, "At least two CUDA devices are required"
36
-
37
- # save default device
38
- saved_device = wp.get_device()
39
-
40
- n = 32
41
-
42
- wp.set_device("cuda:0")
43
- a0 = wp.empty(n, dtype=int)
44
- wp.launch(arange, dim=a0.size, inputs=[0, 1, a0])
45
-
46
- wp.set_device("cuda:1")
47
- a1 = wp.empty(n, dtype=int)
48
- wp.launch(arange, dim=a1.size, inputs=[0, 1, a1])
49
-
50
- # restore default device
51
- wp.set_device(saved_device)
30
+ class TestMultiGPU(unittest.TestCase):
31
+ @unittest.skipUnless(len(wp.get_cuda_devices()) > 1, "Requires at least two CUDA devices")
32
+ def test_multigpu_set_device(self):
33
+ # save default device
34
+ saved_device = wp.get_device()
52
35
 
53
- assert a0.device == "cuda:0"
54
- assert a1.device == "cuda:1"
36
+ n = 32
55
37
 
56
- expected = np.arange(n, dtype=int)
57
-
58
- assert_np_equal(a0.numpy(), expected)
59
- assert_np_equal(a1.numpy(), expected)
60
-
61
-
62
- def test_multigpu_scoped_device(test, device):
63
- assert len(wp.get_cuda_devices()) > 1, "At least two CUDA devices are required"
64
-
65
- n = 32
66
-
67
- with wp.ScopedDevice("cuda:0"):
38
+ wp.set_device("cuda:0")
68
39
  a0 = wp.empty(n, dtype=int)
69
40
  wp.launch(arange, dim=a0.size, inputs=[0, 1, a0])
70
41
 
71
- with wp.ScopedDevice("cuda:1"):
42
+ wp.set_device("cuda:1")
72
43
  a1 = wp.empty(n, dtype=int)
73
44
  wp.launch(arange, dim=a1.size, inputs=[0, 1, a1])
74
45
 
75
- assert a0.device == "cuda:0"
76
- assert a1.device == "cuda:1"
77
-
78
- expected = np.arange(n, dtype=int)
46
+ # restore default device
47
+ wp.set_device(saved_device)
79
48
 
80
- assert_np_equal(a0.numpy(), expected)
81
- assert_np_equal(a1.numpy(), expected)
49
+ assert a0.device == "cuda:0"
50
+ assert a1.device == "cuda:1"
82
51
 
52
+ expected = np.arange(n, dtype=int)
83
53
 
84
- def test_multigpu_nesting(test, device):
85
- assert len(wp.get_cuda_devices()) > 1, "At least two CUDA devices are required"
54
+ assert_np_equal(a0.numpy(), expected)
55
+ assert_np_equal(a1.numpy(), expected)
86
56
 
87
- initial_device = wp.get_device()
88
- initial_cuda_device = wp.get_cuda_device()
89
-
90
- with wp.ScopedDevice("cuda:1"):
91
- assert wp.get_device() == "cuda:1"
92
- assert wp.get_cuda_device() == "cuda:1"
57
+ @unittest.skipUnless(len(wp.get_cuda_devices()) > 1, "Requires at least two CUDA devices")
58
+ def test_multigpu_scoped_device(self):
59
+ n = 32
93
60
 
94
61
  with wp.ScopedDevice("cuda:0"):
95
- assert wp.get_device() == "cuda:0"
96
- assert wp.get_cuda_device() == "cuda:0"
97
-
98
- with wp.ScopedDevice("cpu"):
99
- assert wp.get_device() == "cpu"
100
- assert wp.get_cuda_device() == "cuda:0"
62
+ a0 = wp.empty(n, dtype=int)
63
+ wp.launch(arange, dim=a0.size, inputs=[0, 1, a0])
101
64
 
102
- wp.set_device("cuda:1")
65
+ with wp.ScopedDevice("cuda:1"):
66
+ a1 = wp.empty(n, dtype=int)
67
+ wp.launch(arange, dim=a1.size, inputs=[0, 1, a1])
103
68
 
104
- assert wp.get_device() == "cuda:1"
105
- assert wp.get_cuda_device() == "cuda:1"
69
+ assert a0.device == "cuda:0"
70
+ assert a1.device == "cuda:1"
106
71
 
107
- assert wp.get_device() == "cuda:0"
108
- assert wp.get_cuda_device() == "cuda:0"
72
+ expected = np.arange(n, dtype=int)
109
73
 
110
- assert wp.get_device() == "cuda:1"
111
- assert wp.get_cuda_device() == "cuda:1"
74
+ assert_np_equal(a0.numpy(), expected)
75
+ assert_np_equal(a1.numpy(), expected)
112
76
 
113
- assert wp.get_device() == initial_device
114
- assert wp.get_cuda_device() == initial_cuda_device
77
+ @unittest.skipUnless(len(wp.get_cuda_devices()) > 1, "Requires at least two CUDA devices")
78
+ def test_multigpu_nesting(self):
79
+ initial_device = wp.get_device()
80
+ initial_cuda_device = wp.get_cuda_device()
115
81
 
82
+ with wp.ScopedDevice("cuda:1"):
83
+ assert wp.get_device() == "cuda:1"
84
+ assert wp.get_cuda_device() == "cuda:1"
116
85
 
117
- def test_multigpu_pingpong(test, device):
118
- assert len(wp.get_cuda_devices()) > 1, "At least two CUDA devices are required"
86
+ with wp.ScopedDevice("cuda:0"):
87
+ assert wp.get_device() == "cuda:0"
88
+ assert wp.get_cuda_device() == "cuda:0"
119
89
 
120
- n = 1024 * 1024
90
+ with wp.ScopedDevice("cpu"):
91
+ assert wp.get_device() == "cpu"
92
+ assert wp.get_cuda_device() == "cuda:0"
121
93
 
122
- a0 = wp.zeros(n, dtype=float, device="cuda:0")
123
- a1 = wp.zeros(n, dtype=float, device="cuda:1")
94
+ wp.set_device("cuda:1")
124
95
 
125
- iters = 10
96
+ assert wp.get_device() == "cuda:1"
97
+ assert wp.get_cuda_device() == "cuda:1"
126
98
 
127
- for _ in range(iters):
128
- wp.launch(inc, dim=a0.size, inputs=[a0], device=a0.device)
129
- wp.synchronize_device(a0.device)
130
- wp.copy(a1, a0)
99
+ assert wp.get_device() == "cuda:0"
100
+ assert wp.get_cuda_device() == "cuda:0"
131
101
 
132
- wp.launch(inc, dim=a1.size, inputs=[a1], device=a1.device)
133
- wp.synchronize_device(a1.device)
134
- wp.copy(a0, a1)
102
+ assert wp.get_device() == "cuda:1"
103
+ assert wp.get_cuda_device() == "cuda:1"
135
104
 
136
- expected = np.full(n, iters * 2, dtype=np.float32)
105
+ assert wp.get_device() == initial_device
106
+ assert wp.get_cuda_device() == initial_cuda_device
137
107
 
138
- assert_np_equal(a0.numpy(), expected)
139
- assert_np_equal(a1.numpy(), expected)
108
+ @unittest.skipUnless(len(wp.get_cuda_devices()) > 1, "Requires at least two CUDA devices")
109
+ def test_multigpu_pingpong(self):
110
+ n = 1024 * 1024
140
111
 
112
+ a0 = wp.zeros(n, dtype=float, device="cuda:0")
113
+ a1 = wp.zeros(n, dtype=float, device="cuda:1")
141
114
 
142
- def test_multigpu_pingpong_streams(test, device):
143
- assert len(wp.get_cuda_devices()) > 1, "At least two CUDA devices are required"
115
+ iters = 10
144
116
 
145
- n = 1024 * 1024
117
+ for _ in range(iters):
118
+ wp.launch(inc, dim=a0.size, inputs=[a0], device=a0.device)
119
+ wp.synchronize_device(a0.device)
120
+ wp.copy(a1, a0)
146
121
 
147
- a0 = wp.zeros(n, dtype=float, device="cuda:0")
148
- a1 = wp.zeros(n, dtype=float, device="cuda:1")
122
+ wp.launch(inc, dim=a1.size, inputs=[a1], device=a1.device)
123
+ wp.synchronize_device(a1.device)
124
+ wp.copy(a0, a1)
149
125
 
150
- stream0 = wp.get_stream("cuda:0")
151
- stream1 = wp.get_stream("cuda:1")
126
+ expected = np.full(n, iters * 2, dtype=np.float32)
152
127
 
153
- iters = 10
128
+ assert_np_equal(a0.numpy(), expected)
129
+ assert_np_equal(a1.numpy(), expected)
154
130
 
155
- for _ in range(iters):
156
- wp.launch(inc, dim=a0.size, inputs=[a0], stream=stream0)
157
- stream1.wait_stream(stream0)
158
- wp.copy(a1, a0, stream=stream1)
131
+ @unittest.skipUnless(len(wp.get_cuda_devices()) > 1, "Requires at least two CUDA devices")
132
+ def test_multigpu_pingpong_streams(self):
133
+ n = 1024 * 1024
159
134
 
160
- wp.launch(inc, dim=a1.size, inputs=[a1], stream=stream1)
161
- stream0.wait_stream(stream1)
162
- wp.copy(a0, a1, stream=stream0)
135
+ a0 = wp.zeros(n, dtype=float, device="cuda:0")
136
+ a1 = wp.zeros(n, dtype=float, device="cuda:1")
163
137
 
164
- expected = np.full(n, iters * 2, dtype=np.float32)
138
+ stream0 = wp.get_stream("cuda:0")
139
+ stream1 = wp.get_stream("cuda:1")
165
140
 
166
- assert_np_equal(a0.numpy(), expected)
167
- assert_np_equal(a1.numpy(), expected)
141
+ iters = 10
168
142
 
143
+ for _ in range(iters):
144
+ wp.launch(inc, dim=a0.size, inputs=[a0], stream=stream0)
145
+ stream1.wait_stream(stream0)
146
+ wp.copy(a1, a0, stream=stream1)
169
147
 
170
- def register(parent):
171
- class TestMultigpu(parent):
172
- pass
148
+ wp.launch(inc, dim=a1.size, inputs=[a1], stream=stream1)
149
+ stream0.wait_stream(stream1)
150
+ wp.copy(a0, a1, stream=stream0)
173
151
 
174
- if wp.get_cuda_device_count() > 1:
175
- add_function_test(TestMultigpu, "test_multigpu_set_device", test_multigpu_set_device)
176
- add_function_test(TestMultigpu, "test_multigpu_scoped_device", test_multigpu_scoped_device)
177
- add_function_test(TestMultigpu, "test_multigpu_nesting", test_multigpu_nesting)
178
- add_function_test(TestMultigpu, "test_multigpu_pingpong", test_multigpu_pingpong)
179
- add_function_test(TestMultigpu, "test_multigpu_pingpong_streams", test_multigpu_pingpong_streams)
152
+ expected = np.full(n, iters * 2, dtype=np.float32)
180
153
 
181
- return TestMultigpu
154
+ assert_np_equal(a0.numpy(), expected)
155
+ assert_np_equal(a1.numpy(), expected)
182
156
 
183
157
 
184
158
  if __name__ == "__main__":
185
- c = register(unittest.TestCase)
159
+ wp.build.clear_kernel_cache()
186
160
  unittest.main(verbosity=2, failfast=False)
warp/tests/test_noise.py CHANGED
@@ -5,11 +5,13 @@
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 warp as wp
9
- from warp.tests.test_base import *
8
+ import unittest
10
9
 
11
10
  import numpy as np
12
11
 
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
14
+
13
15
  # import matplotlib.pyplot as plt
14
16
 
15
17
  wp.init()
@@ -229,19 +231,18 @@ def test_adj_noise(test, device):
229
231
  test.assertTrue(err < 1.0e-8)
230
232
 
231
233
 
232
- def register(parent):
233
- devices = get_test_devices()
234
+ devices = get_test_devices()
235
+
234
236
 
235
- class TestNoise(parent):
236
- pass
237
+ class TestNoise(unittest.TestCase):
238
+ pass
237
239
 
238
- add_function_test(TestNoise, "test_pnoise", test_pnoise, devices=devices)
239
- add_function_test(TestNoise, "test_curlnoise", test_curlnoise, devices=devices)
240
- add_function_test(TestNoise, "test_adj_noise", test_adj_noise, devices=devices)
241
240
 
242
- return TestNoise
241
+ add_function_test(TestNoise, "test_pnoise", test_pnoise, devices=devices)
242
+ add_function_test(TestNoise, "test_curlnoise", test_curlnoise, devices=devices)
243
+ add_function_test(TestNoise, "test_adj_noise", test_adj_noise, devices=devices)
243
244
 
244
245
 
245
246
  if __name__ == "__main__":
246
- c = register(unittest.TestCase)
247
+ wp.build.clear_kernel_cache()
247
248
  unittest.main(verbosity=2)
@@ -5,11 +5,10 @@
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 numpy as np
9
- import math
8
+ import unittest
10
9
 
11
10
  import warp as wp
12
- from warp.tests.test_base import *
11
+ from warp.tests.unittest_utils import *
13
12
 
14
13
  wp.init()
15
14
 
@@ -227,28 +226,25 @@ def test_operators_mat44():
227
226
  expect_eq(r0[3], wp.vec4(39.0, 42.0, 45.0, 48.0))
228
227
 
229
228
 
230
- def register(parent):
231
- devices = get_test_devices()
229
+ devices = get_test_devices()
232
230
 
233
- class TestOperators(parent):
234
- pass
235
231
 
236
- add_kernel_test(TestOperators, test_operators_scalar_float, dim=1, devices=devices)
237
- add_kernel_test(TestOperators, test_operators_scalar_int, dim=1, devices=devices)
238
- add_kernel_test(TestOperators, test_operators_matrix_index, dim=1, devices=devices)
239
- add_kernel_test(TestOperators, test_operators_vector_index, dim=1, devices=devices)
240
- add_kernel_test(TestOperators, test_operators_vec3, dim=1, devices=devices)
241
- add_kernel_test(TestOperators, test_operators_vec4, dim=1, devices=devices)
232
+ class TestOperators(unittest.TestCase):
233
+ pass
242
234
 
243
- add_kernel_test(TestOperators, test_operators_mat22, dim=1, devices=devices)
244
- add_kernel_test(TestOperators, test_operators_mat33, dim=1, devices=devices)
245
- add_kernel_test(TestOperators, test_operators_mat44, dim=1, devices=devices)
246
235
 
247
- return TestOperators
236
+ add_kernel_test(TestOperators, test_operators_scalar_float, dim=1, devices=devices)
237
+ add_kernel_test(TestOperators, test_operators_scalar_int, dim=1, devices=devices)
238
+ add_kernel_test(TestOperators, test_operators_matrix_index, dim=1, devices=devices)
239
+ add_kernel_test(TestOperators, test_operators_vector_index, dim=1, devices=devices)
240
+ add_kernel_test(TestOperators, test_operators_vec3, dim=1, devices=devices)
241
+ add_kernel_test(TestOperators, test_operators_vec4, dim=1, devices=devices)
248
242
 
243
+ add_kernel_test(TestOperators, test_operators_mat22, dim=1, devices=devices)
244
+ add_kernel_test(TestOperators, test_operators_mat33, dim=1, devices=devices)
245
+ add_kernel_test(TestOperators, test_operators_mat44, dim=1, devices=devices)
249
246
 
250
- if __name__ == "__main__":
251
- wp.force_load()
252
247
 
253
- c = register(unittest.TestCase)
248
+ if __name__ == "__main__":
249
+ wp.build.clear_kernel_cache()
254
250
  unittest.main(verbosity=2)
@@ -8,7 +8,7 @@
8
8
  import unittest
9
9
 
10
10
  import warp as wp
11
- from warp.tests.test_base import *
11
+ from warp.tests.unittest_utils import *
12
12
 
13
13
  wp.init()
14
14
 
@@ -93,19 +93,19 @@ def test_options_4(test, device):
93
93
  assert_np_equal(tape.gradients[x].numpy(), np.array(0.0))
94
94
 
95
95
 
96
- def register(parent):
97
- devices = get_test_devices()
96
+ devices = get_test_devices()
98
97
 
99
- class TestOptions(parent):
100
- pass
101
98
 
102
- add_function_test(TestOptions, "test_options_1", test_options_1, devices=devices)
103
- add_function_test(TestOptions, "test_options_2", test_options_2, devices=devices)
104
- add_function_test(TestOptions, "test_options_3", test_options_3, devices=devices)
105
- add_function_test(TestOptions, "test_options_4", test_options_4, devices=devices)
106
- return TestOptions
99
+ class TestOptions(unittest.TestCase):
100
+ pass
101
+
102
+
103
+ add_function_test(TestOptions, "test_options_1", test_options_1, devices=devices)
104
+ add_function_test(TestOptions, "test_options_2", test_options_2, devices=devices)
105
+ add_function_test(TestOptions, "test_options_3", test_options_3, devices=devices)
106
+ add_function_test(TestOptions, "test_options_4", test_options_4, devices=devices)
107
107
 
108
108
 
109
109
  if __name__ == "__main__":
110
- _ = register(unittest.TestCase)
110
+ wp.build.clear_kernel_cache()
111
111
  unittest.main(verbosity=2)
warp/tests/test_pinned.py CHANGED
@@ -5,16 +5,17 @@
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
- import warp as wp
10
- from warp.tests.test_base import *
11
11
 
12
- import unittest
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
13
14
 
14
15
  wp.init()
15
16
 
16
17
 
17
- def test_pinned(test, device):
18
+ def test_pinned(test: unittest.TestCase, device):
18
19
  assert wp.get_device(device).is_cuda, "Test device must be a CUDA device"
19
20
 
20
21
  n = 1024 * 1024
@@ -25,20 +26,20 @@ def test_pinned(test, device):
25
26
  a_pageable1 = wp.array(ones, dtype=float, device="cpu")
26
27
  a_pageable2 = wp.zeros_like(a_pageable1)
27
28
 
28
- assert a_pageable1.pinned == False
29
- assert a_pageable2.pinned == False
29
+ test.assertFalse(a_pageable1.pinned)
30
+ test.assertFalse(a_pageable2.pinned)
30
31
 
31
32
  # pinned host arrays for asynchronous transfers
32
33
  a_pinned1 = wp.array(ones, dtype=float, device="cpu", pinned=True)
33
34
  a_pinned2 = wp.zeros_like(a_pinned1)
34
35
 
35
- assert a_pinned1.pinned == True
36
- assert a_pinned2.pinned == True
36
+ test.assertTrue(a_pinned1.pinned)
37
+ test.assertTrue(a_pinned2.pinned)
37
38
 
38
39
  # device array
39
40
  a_device = wp.zeros(n, dtype=float, device=device)
40
41
 
41
- assert a_device.pinned == False
42
+ test.assertFalse(a_device.pinned)
42
43
 
43
44
  wp.synchronize_device(device)
44
45
 
@@ -59,21 +60,19 @@ def test_pinned(test, device):
59
60
  assert_np_equal(a_pinned2.numpy(), ones)
60
61
 
61
62
  # ensure that launching asynchronous transfers took less CPU time
62
- assert pinned_timer.elapsed < pageable_timer.elapsed, "Pinned transfers did not take less CPU time"
63
+ test.assertTrue(pinned_timer.elapsed < pageable_timer.elapsed, "Pinned transfers did not take less CPU time")
64
+
63
65
 
66
+ devices = get_unique_cuda_test_devices()
64
67
 
65
- def register(parent):
66
- cuda_devices = wp.get_cuda_devices()
67
68
 
68
- class TestPinned(parent):
69
- pass
69
+ class TestPinned(unittest.TestCase):
70
+ pass
70
71
 
71
- if cuda_devices:
72
- add_function_test(TestPinned, "test_pinned", test_pinned, devices=cuda_devices)
73
72
 
74
- return TestPinned
73
+ add_function_test(TestPinned, "test_pinned", test_pinned, devices=devices)
75
74
 
76
75
 
77
76
  if __name__ == "__main__":
78
- c = register(unittest.TestCase)
77
+ wp.build.clear_kernel_cache()
79
78
  unittest.main(verbosity=2)
warp/tests/test_print.py CHANGED
@@ -5,28 +5,49 @@
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
- np.random.seed(42)
11
+ from warp.tests.unittest_utils import *
16
12
 
17
13
  wp.init()
18
- wp.verify_cuda = True
19
14
 
20
15
 
21
16
  @wp.kernel
22
- def test_print():
17
+ def test_print_kernel():
23
18
  wp.print(1.0)
24
19
  wp.print("this is a string")
25
20
  wp.printf("this is a float %f\n", 457.5)
26
21
  wp.printf("this is an int %d\n", 123)
27
22
 
28
23
 
29
- wp.launch(kernel=test_print, dim=1, inputs=[], outputs=[], device="cuda")
24
+ def test_print(test, device):
25
+ wp.load_module(device=device)
26
+ capture = StdOutCapture()
27
+ capture.begin()
28
+ wp.launch(kernel=test_print_kernel, dim=1, inputs=[], device=device)
29
+ wp.synchronize_device(device)
30
+ s = capture.end()
31
+
32
+ # The CPU kernel printouts don't get captured by StdOutCapture()
33
+ if device.is_cuda:
34
+ test.assertRegex(
35
+ s,
36
+ rf"1{os.linesep}"
37
+ rf"this is a string{os.linesep}"
38
+ rf"this is a float 457\.500000{os.linesep}"
39
+ rf"this is an int 123",
40
+ )
41
+
42
+
43
+ class TestPrint(unittest.TestCase):
44
+ pass
45
+
46
+
47
+ devices = get_test_devices()
48
+ add_function_test(TestPrint, "test_print", test_print, devices=devices, check_output=False)
49
+
30
50
 
31
- wp.synchronize()
32
- print("finished")
51
+ if __name__ == "__main__":
52
+ wp.build.clear_kernel_cache()
53
+ unittest.main(verbosity=2)