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.
- warp/__init__.py +10 -4
- warp/__init__.pyi +1 -0
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +5 -3
- warp/build_dll.py +29 -9
- warp/builtins.py +868 -507
- warp/codegen.py +1074 -638
- warp/config.py +3 -3
- warp/constants.py +6 -0
- warp/context.py +715 -222
- warp/fabric.py +326 -0
- warp/fem/__init__.py +27 -0
- warp/fem/cache.py +389 -0
- warp/fem/dirichlet.py +181 -0
- warp/fem/domain.py +263 -0
- warp/fem/field/__init__.py +101 -0
- warp/fem/field/field.py +149 -0
- warp/fem/field/nodal_field.py +299 -0
- warp/fem/field/restriction.py +21 -0
- warp/fem/field/test.py +181 -0
- warp/fem/field/trial.py +183 -0
- warp/fem/geometry/__init__.py +19 -0
- warp/fem/geometry/closest_point.py +70 -0
- warp/fem/geometry/deformed_geometry.py +271 -0
- warp/fem/geometry/element.py +744 -0
- warp/fem/geometry/geometry.py +186 -0
- warp/fem/geometry/grid_2d.py +373 -0
- warp/fem/geometry/grid_3d.py +435 -0
- warp/fem/geometry/hexmesh.py +953 -0
- warp/fem/geometry/partition.py +376 -0
- warp/fem/geometry/quadmesh_2d.py +532 -0
- warp/fem/geometry/tetmesh.py +840 -0
- warp/fem/geometry/trimesh_2d.py +577 -0
- warp/fem/integrate.py +1616 -0
- warp/fem/operator.py +191 -0
- warp/fem/polynomial.py +213 -0
- warp/fem/quadrature/__init__.py +2 -0
- warp/fem/quadrature/pic_quadrature.py +245 -0
- warp/fem/quadrature/quadrature.py +294 -0
- warp/fem/space/__init__.py +292 -0
- warp/fem/space/basis_space.py +489 -0
- warp/fem/space/collocated_function_space.py +105 -0
- warp/fem/space/dof_mapper.py +236 -0
- warp/fem/space/function_space.py +145 -0
- warp/fem/space/grid_2d_function_space.py +267 -0
- warp/fem/space/grid_3d_function_space.py +306 -0
- warp/fem/space/hexmesh_function_space.py +352 -0
- warp/fem/space/partition.py +350 -0
- warp/fem/space/quadmesh_2d_function_space.py +369 -0
- warp/fem/space/restriction.py +160 -0
- warp/fem/space/shape/__init__.py +15 -0
- warp/fem/space/shape/cube_shape_function.py +738 -0
- warp/fem/space/shape/shape_function.py +103 -0
- warp/fem/space/shape/square_shape_function.py +611 -0
- warp/fem/space/shape/tet_shape_function.py +567 -0
- warp/fem/space/shape/triangle_shape_function.py +429 -0
- warp/fem/space/tetmesh_function_space.py +292 -0
- warp/fem/space/topology.py +295 -0
- warp/fem/space/trimesh_2d_function_space.py +221 -0
- warp/fem/types.py +77 -0
- warp/fem/utils.py +495 -0
- warp/native/array.h +147 -44
- warp/native/builtin.h +122 -149
- warp/native/bvh.cpp +73 -325
- warp/native/bvh.cu +406 -23
- warp/native/bvh.h +34 -43
- warp/native/clang/clang.cpp +13 -8
- warp/native/crt.h +2 -0
- warp/native/cuda_crt.h +5 -0
- warp/native/cuda_util.cpp +15 -3
- warp/native/cuda_util.h +3 -1
- warp/native/cutlass/tools/library/scripts/conv2d_operation.py +463 -0
- warp/native/cutlass/tools/library/scripts/conv3d_operation.py +321 -0
- warp/native/cutlass/tools/library/scripts/gemm_operation.py +988 -0
- warp/native/cutlass/tools/library/scripts/generator.py +4625 -0
- warp/native/cutlass/tools/library/scripts/library.py +799 -0
- warp/native/cutlass/tools/library/scripts/manifest.py +402 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/docs/source/conf.py +96 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/profile/conv/conv2d_f16_sm80.py +106 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/profile/gemm/gemm_f32_sm80.py +91 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/setup.py +80 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/__init__.py +48 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/arguments.py +118 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/c_types.py +241 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/compiler.py +432 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/conv2d_operation.py +631 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/epilogue.py +1026 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/frontend.py +104 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/gemm_operation.py +1276 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/library.py +744 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/memory_manager.py +74 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/operation.py +110 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/parser.py +619 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/reduction_operation.py +398 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/tensor_ref.py +70 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/__init__.py +4 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/conv2d_testbed.py +646 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_grouped_testbed.py +235 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_testbed.py +557 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/profiler.py +70 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/type_hint.py +39 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/__init__.py +1 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/device.py +76 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/reference_model.py +255 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/__init__.py +0 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +201 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +177 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +98 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +95 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_few_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +163 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_fixed_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +187 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +309 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +54 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_strided_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +253 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +97 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +242 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/run_all_tests.py +10 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/frontend/test_frontend.py +146 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/__init__.py +0 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_bf16_sm80.py +96 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f16_sm80.py +447 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f32_sm80.py +146 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f64_sm80.py +102 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_grouped_sm80.py +203 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_s8_sm80.py +229 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/run_all_tests.py +9 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/unit/test_sm80.py +453 -0
- warp/native/cutlass/tools/library/scripts/rank_2k_operation.py +398 -0
- warp/native/cutlass/tools/library/scripts/rank_k_operation.py +387 -0
- warp/native/cutlass/tools/library/scripts/rt.py +796 -0
- warp/native/cutlass/tools/library/scripts/symm_operation.py +400 -0
- warp/native/cutlass/tools/library/scripts/trmm_operation.py +407 -0
- warp/native/cutlass_gemm.cu +5 -3
- warp/native/exports.h +1240 -952
- warp/native/fabric.h +228 -0
- warp/native/hashgrid.cpp +4 -4
- warp/native/hashgrid.h +22 -2
- warp/native/intersect.h +22 -7
- warp/native/intersect_adj.h +8 -8
- warp/native/intersect_tri.h +1 -1
- warp/native/marching.cu +157 -161
- warp/native/mat.h +80 -19
- warp/native/matnn.h +2 -2
- warp/native/mesh.cpp +33 -108
- warp/native/mesh.cu +114 -23
- warp/native/mesh.h +446 -46
- warp/native/noise.h +272 -329
- warp/native/quat.h +51 -8
- warp/native/rand.h +45 -35
- warp/native/range.h +6 -2
- warp/native/reduce.cpp +1 -1
- warp/native/reduce.cu +10 -12
- warp/native/runlength_encode.cu +6 -10
- warp/native/scan.cu +8 -11
- warp/native/sparse.cpp +4 -4
- warp/native/sparse.cu +164 -154
- warp/native/spatial.h +2 -2
- warp/native/temp_buffer.h +14 -30
- warp/native/vec.h +107 -23
- warp/native/volume.h +120 -0
- warp/native/warp.cpp +560 -30
- warp/native/warp.cu +431 -44
- warp/native/warp.h +13 -4
- warp/optim/__init__.py +1 -0
- warp/optim/linear.py +922 -0
- warp/optim/sgd.py +92 -0
- warp/render/render_opengl.py +335 -119
- warp/render/render_usd.py +11 -11
- warp/sim/__init__.py +2 -2
- warp/sim/articulation.py +385 -185
- warp/sim/collide.py +8 -0
- warp/sim/import_mjcf.py +297 -106
- warp/sim/import_urdf.py +389 -210
- warp/sim/import_usd.py +198 -97
- warp/sim/inertia.py +17 -18
- warp/sim/integrator_euler.py +14 -8
- warp/sim/integrator_xpbd.py +158 -16
- warp/sim/model.py +795 -291
- warp/sim/render.py +3 -3
- warp/sim/utils.py +3 -0
- warp/sparse.py +640 -150
- warp/stubs.py +606 -267
- warp/tape.py +61 -10
- warp/tests/__main__.py +3 -6
- warp/tests/assets/curlnoise_golden.npy +0 -0
- warp/tests/assets/pnoise_golden.npy +0 -0
- warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
- warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
- warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
- warp/tests/aux_test_unresolved_func.py +14 -0
- warp/tests/aux_test_unresolved_symbol.py +14 -0
- warp/tests/disabled_kinematics.py +239 -0
- warp/tests/run_coverage_serial.py +31 -0
- warp/tests/test_adam.py +103 -106
- warp/tests/test_arithmetic.py +128 -74
- warp/tests/test_array.py +212 -97
- warp/tests/test_array_reduce.py +57 -23
- warp/tests/test_atomic.py +64 -28
- warp/tests/test_bool.py +99 -0
- warp/tests/test_builtins_resolution.py +1292 -0
- warp/tests/test_bvh.py +42 -18
- warp/tests/test_closest_point_edge_edge.py +54 -57
- warp/tests/test_codegen.py +208 -130
- warp/tests/test_compile_consts.py +28 -20
- warp/tests/test_conditional.py +108 -24
- warp/tests/test_copy.py +10 -12
- warp/tests/test_ctypes.py +112 -88
- warp/tests/test_dense.py +21 -14
- warp/tests/test_devices.py +98 -0
- warp/tests/test_dlpack.py +75 -75
- warp/tests/test_examples.py +277 -0
- warp/tests/test_fabricarray.py +955 -0
- warp/tests/test_fast_math.py +15 -11
- warp/tests/test_fem.py +1271 -0
- warp/tests/test_fp16.py +53 -19
- warp/tests/test_func.py +187 -86
- warp/tests/test_generics.py +194 -49
- warp/tests/test_grad.py +178 -109
- warp/tests/test_grad_customs.py +176 -0
- warp/tests/test_hash_grid.py +52 -37
- warp/tests/test_import.py +10 -23
- warp/tests/test_indexedarray.py +32 -31
- warp/tests/test_intersect.py +18 -9
- warp/tests/test_large.py +141 -0
- warp/tests/test_launch.py +14 -41
- warp/tests/test_lerp.py +64 -65
- warp/tests/test_linear_solvers.py +154 -0
- warp/tests/test_lvalue.py +493 -0
- warp/tests/test_marching_cubes.py +12 -13
- warp/tests/test_mat.py +517 -2898
- warp/tests/test_mat_lite.py +115 -0
- warp/tests/test_mat_scalar_ops.py +2889 -0
- warp/tests/test_math.py +103 -9
- warp/tests/test_matmul.py +305 -69
- warp/tests/test_matmul_lite.py +410 -0
- warp/tests/test_mesh.py +71 -14
- warp/tests/test_mesh_query_aabb.py +41 -25
- warp/tests/test_mesh_query_point.py +140 -22
- warp/tests/test_mesh_query_ray.py +39 -22
- warp/tests/test_mlp.py +30 -22
- warp/tests/test_model.py +92 -89
- warp/tests/test_modules_lite.py +39 -0
- warp/tests/test_multigpu.py +88 -114
- warp/tests/test_noise.py +12 -11
- warp/tests/test_operators.py +16 -20
- warp/tests/test_options.py +11 -11
- warp/tests/test_pinned.py +17 -18
- warp/tests/test_print.py +32 -11
- warp/tests/test_quat.py +275 -129
- warp/tests/test_rand.py +18 -16
- warp/tests/test_reload.py +38 -34
- warp/tests/test_rounding.py +50 -43
- warp/tests/test_runlength_encode.py +168 -20
- warp/tests/test_smoothstep.py +9 -11
- warp/tests/test_snippet.py +143 -0
- warp/tests/test_sparse.py +261 -63
- warp/tests/test_spatial.py +276 -243
- warp/tests/test_streams.py +110 -85
- warp/tests/test_struct.py +268 -63
- warp/tests/test_tape.py +39 -21
- warp/tests/test_torch.py +118 -89
- warp/tests/test_transient_module.py +12 -13
- warp/tests/test_types.py +614 -0
- warp/tests/test_utils.py +494 -0
- warp/tests/test_vec.py +354 -2050
- warp/tests/test_vec_lite.py +73 -0
- warp/tests/test_vec_scalar_ops.py +2099 -0
- warp/tests/test_volume.py +457 -293
- warp/tests/test_volume_write.py +124 -134
- warp/tests/unittest_serial.py +35 -0
- warp/tests/unittest_suites.py +341 -0
- warp/tests/unittest_utils.py +568 -0
- warp/tests/unused_test_misc.py +71 -0
- warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
- warp/thirdparty/appdirs.py +36 -45
- warp/thirdparty/unittest_parallel.py +549 -0
- warp/torch.py +9 -6
- warp/types.py +1089 -366
- warp/utils.py +93 -387
- warp_lang-0.11.0.dist-info/METADATA +238 -0
- warp_lang-0.11.0.dist-info/RECORD +332 -0
- {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/WHEEL +1 -1
- warp/tests/test_all.py +0 -219
- warp/tests/test_array_scan.py +0 -60
- warp/tests/test_base.py +0 -208
- warp/tests/test_unresolved_func.py +0 -7
- warp/tests/test_unresolved_symbol.py +0 -7
- warp_lang-0.10.1.dist-info/METADATA +0 -21
- warp_lang-0.10.1.dist-info/RECORD +0 -188
- /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
- /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
- /warp/tests/{test_square.py → aux_test_square.py} +0 -0
- {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/LICENSE.md +0 -0
- {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
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 unittest
|
|
9
|
+
|
|
10
|
+
import warp as wp
|
|
11
|
+
from warp.tests.unittest_utils import *
|
|
12
|
+
|
|
13
|
+
wp.init()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
devices = get_test_devices()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TestModuleLite(unittest.TestCase):
|
|
20
|
+
def test_module_lite_load(self):
|
|
21
|
+
# Load current module
|
|
22
|
+
wp.load_module()
|
|
23
|
+
|
|
24
|
+
# Load named module
|
|
25
|
+
wp.load_module(wp.config)
|
|
26
|
+
|
|
27
|
+
# Load named module (string)
|
|
28
|
+
wp.load_module(wp.config, recursive=True)
|
|
29
|
+
|
|
30
|
+
def test_module_lite_options(self):
|
|
31
|
+
wp.set_module_options({"max_unroll": 8})
|
|
32
|
+
module_options = wp.get_module_options()
|
|
33
|
+
self.assertIsInstance(module_options, dict)
|
|
34
|
+
self.assertEqual(module_options["max_unroll"], 8)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if __name__ == "__main__":
|
|
38
|
+
wp.build.clear_kernel_cache()
|
|
39
|
+
unittest.main(verbosity=2)
|
warp/tests/test_multigpu.py
CHANGED
|
@@ -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
|
|
9
|
-
import warp as wp
|
|
8
|
+
import unittest
|
|
10
9
|
|
|
11
|
-
import
|
|
10
|
+
import numpy as np
|
|
12
11
|
|
|
13
12
|
import warp as wp
|
|
14
|
-
from warp.tests.
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
54
|
-
assert a1.device == "cuda:1"
|
|
36
|
+
n = 32
|
|
55
37
|
|
|
56
|
-
|
|
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
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
expected = np.arange(n, dtype=int)
|
|
46
|
+
# restore default device
|
|
47
|
+
wp.set_device(saved_device)
|
|
79
48
|
|
|
80
|
-
|
|
81
|
-
|
|
49
|
+
assert a0.device == "cuda:0"
|
|
50
|
+
assert a1.device == "cuda:1"
|
|
82
51
|
|
|
52
|
+
expected = np.arange(n, dtype=int)
|
|
83
53
|
|
|
84
|
-
|
|
85
|
-
|
|
54
|
+
assert_np_equal(a0.numpy(), expected)
|
|
55
|
+
assert_np_equal(a1.numpy(), expected)
|
|
86
56
|
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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
|
-
|
|
105
|
-
|
|
69
|
+
assert a0.device == "cuda:0"
|
|
70
|
+
assert a1.device == "cuda:1"
|
|
106
71
|
|
|
107
|
-
|
|
108
|
-
assert wp.get_cuda_device() == "cuda:0"
|
|
72
|
+
expected = np.arange(n, dtype=int)
|
|
109
73
|
|
|
110
|
-
|
|
111
|
-
|
|
74
|
+
assert_np_equal(a0.numpy(), expected)
|
|
75
|
+
assert_np_equal(a1.numpy(), expected)
|
|
112
76
|
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
118
|
-
|
|
86
|
+
with wp.ScopedDevice("cuda:0"):
|
|
87
|
+
assert wp.get_device() == "cuda:0"
|
|
88
|
+
assert wp.get_cuda_device() == "cuda:0"
|
|
119
89
|
|
|
120
|
-
|
|
90
|
+
with wp.ScopedDevice("cpu"):
|
|
91
|
+
assert wp.get_device() == "cpu"
|
|
92
|
+
assert wp.get_cuda_device() == "cuda:0"
|
|
121
93
|
|
|
122
|
-
|
|
123
|
-
a1 = wp.zeros(n, dtype=float, device="cuda:1")
|
|
94
|
+
wp.set_device("cuda:1")
|
|
124
95
|
|
|
125
|
-
|
|
96
|
+
assert wp.get_device() == "cuda:1"
|
|
97
|
+
assert wp.get_cuda_device() == "cuda:1"
|
|
126
98
|
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
wp.copy(a0, a1)
|
|
102
|
+
assert wp.get_device() == "cuda:1"
|
|
103
|
+
assert wp.get_cuda_device() == "cuda:1"
|
|
135
104
|
|
|
136
|
-
|
|
105
|
+
assert wp.get_device() == initial_device
|
|
106
|
+
assert wp.get_cuda_device() == initial_cuda_device
|
|
137
107
|
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
143
|
-
assert len(wp.get_cuda_devices()) > 1, "At least two CUDA devices are required"
|
|
115
|
+
iters = 10
|
|
144
116
|
|
|
145
|
-
|
|
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
|
-
|
|
148
|
-
|
|
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
|
-
|
|
151
|
-
stream1 = wp.get_stream("cuda:1")
|
|
126
|
+
expected = np.full(n, iters * 2, dtype=np.float32)
|
|
152
127
|
|
|
153
|
-
|
|
128
|
+
assert_np_equal(a0.numpy(), expected)
|
|
129
|
+
assert_np_equal(a1.numpy(), expected)
|
|
154
130
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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.
|
|
161
|
-
|
|
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
|
-
|
|
138
|
+
stream0 = wp.get_stream("cuda:0")
|
|
139
|
+
stream1 = wp.get_stream("cuda:1")
|
|
165
140
|
|
|
166
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
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
|
-
|
|
154
|
+
assert_np_equal(a0.numpy(), expected)
|
|
155
|
+
assert_np_equal(a1.numpy(), expected)
|
|
182
156
|
|
|
183
157
|
|
|
184
158
|
if __name__ == "__main__":
|
|
185
|
-
|
|
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
|
|
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
|
-
|
|
233
|
-
|
|
234
|
+
devices = get_test_devices()
|
|
235
|
+
|
|
234
236
|
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
|
|
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
|
-
|
|
247
|
+
wp.build.clear_kernel_cache()
|
|
247
248
|
unittest.main(verbosity=2)
|
warp/tests/test_operators.py
CHANGED
|
@@ -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
|
|
9
|
-
import math
|
|
8
|
+
import unittest
|
|
10
9
|
|
|
11
10
|
import warp as wp
|
|
12
|
-
from warp.tests.
|
|
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
|
-
|
|
231
|
-
devices = get_test_devices()
|
|
229
|
+
devices = get_test_devices()
|
|
232
230
|
|
|
233
|
-
class TestOperators(parent):
|
|
234
|
-
pass
|
|
235
231
|
|
|
236
|
-
|
|
237
|
-
|
|
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
|
-
|
|
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
|
-
|
|
248
|
+
if __name__ == "__main__":
|
|
249
|
+
wp.build.clear_kernel_cache()
|
|
254
250
|
unittest.main(verbosity=2)
|
warp/tests/test_options.py
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import unittest
|
|
9
9
|
|
|
10
10
|
import warp as wp
|
|
11
|
-
from warp.tests.
|
|
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
|
-
|
|
97
|
-
devices = get_test_devices()
|
|
96
|
+
devices = get_test_devices()
|
|
98
97
|
|
|
99
|
-
class TestOptions(parent):
|
|
100
|
-
pass
|
|
101
98
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
29
|
-
|
|
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
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
69
|
-
|
|
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
|
-
|
|
73
|
+
add_function_test(TestPinned, "test_pinned", test_pinned, devices=devices)
|
|
75
74
|
|
|
76
75
|
|
|
77
76
|
if __name__ == "__main__":
|
|
78
|
-
|
|
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
|
-
|
|
9
|
-
import numpy as np
|
|
10
|
-
import math
|
|
8
|
+
import unittest
|
|
11
9
|
|
|
12
10
|
import warp as wp
|
|
13
|
-
from warp.tests.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
32
|
-
|
|
51
|
+
if __name__ == "__main__":
|
|
52
|
+
wp.build.clear_kernel_cache()
|
|
53
|
+
unittest.main(verbosity=2)
|