warp-lang 1.0.1__py3-none-macosx_10_13_universal2.whl → 1.1.0__py3-none-macosx_10_13_universal2.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 +108 -97
- warp/__init__.pyi +1 -1
- warp/bin/libwarp-clang.dylib +0 -0
- warp/bin/libwarp.dylib +0 -0
- warp/build.py +115 -113
- warp/build_dll.py +383 -375
- warp/builtins.py +3425 -3354
- warp/codegen.py +2878 -2792
- warp/config.py +40 -36
- warp/constants.py +45 -45
- warp/context.py +5194 -5102
- warp/dlpack.py +442 -442
- warp/examples/__init__.py +16 -16
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -92
- warp/examples/assets/nv_humanoid.xml +183 -183
- warp/examples/assets/quadruped.urdf +267 -267
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +383 -383
- warp/examples/benchmarks/benchmark_cloth.py +278 -279
- warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
- warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
- warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
- warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
- warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
- warp/examples/benchmarks/benchmark_cloth_warp.py +146 -146
- warp/examples/benchmarks/benchmark_launches.py +295 -295
- warp/examples/browse.py +29 -28
- warp/examples/core/example_dem.py +234 -221
- warp/examples/core/example_fluid.py +293 -267
- warp/examples/core/example_graph_capture.py +144 -129
- warp/examples/core/example_marching_cubes.py +188 -176
- warp/examples/core/example_mesh.py +174 -154
- warp/examples/core/example_mesh_intersect.py +205 -193
- warp/examples/core/example_nvdb.py +176 -169
- warp/examples/core/example_raycast.py +105 -89
- warp/examples/core/example_raymarch.py +199 -178
- warp/examples/core/example_render_opengl.py +185 -141
- warp/examples/core/example_sph.py +405 -389
- warp/examples/core/example_torch.py +222 -181
- warp/examples/core/example_wave.py +263 -249
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +407 -391
- warp/examples/fem/example_convection_diffusion.py +182 -168
- warp/examples/fem/example_convection_diffusion_dg.py +219 -209
- warp/examples/fem/example_convection_diffusion_dg0.py +204 -194
- warp/examples/fem/example_deformed_geometry.py +177 -159
- warp/examples/fem/example_diffusion.py +201 -173
- warp/examples/fem/example_diffusion_3d.py +177 -152
- warp/examples/fem/example_diffusion_mgpu.py +221 -214
- warp/examples/fem/example_mixed_elasticity.py +244 -222
- warp/examples/fem/example_navier_stokes.py +259 -243
- warp/examples/fem/example_stokes.py +220 -192
- warp/examples/fem/example_stokes_transfer.py +265 -249
- warp/examples/fem/mesh_utils.py +133 -109
- warp/examples/fem/plot_utils.py +292 -287
- warp/examples/optim/example_bounce.py +260 -248
- warp/examples/optim/example_cloth_throw.py +222 -210
- warp/examples/optim/example_diffray.py +566 -535
- warp/examples/optim/example_drone.py +864 -835
- warp/examples/optim/example_inverse_kinematics.py +176 -169
- warp/examples/optim/example_inverse_kinematics_torch.py +185 -170
- warp/examples/optim/example_spring_cage.py +239 -234
- warp/examples/optim/example_trajectory.py +223 -201
- warp/examples/optim/example_walker.py +306 -292
- warp/examples/sim/example_cartpole.py +139 -128
- warp/examples/sim/example_cloth.py +196 -184
- warp/examples/sim/example_granular.py +124 -113
- warp/examples/sim/example_granular_collision_sdf.py +197 -185
- warp/examples/sim/example_jacobian_ik.py +236 -213
- warp/examples/sim/example_particle_chain.py +118 -106
- warp/examples/sim/example_quadruped.py +193 -179
- warp/examples/sim/example_rigid_chain.py +197 -189
- warp/examples/sim/example_rigid_contact.py +189 -176
- warp/examples/sim/example_rigid_force.py +127 -126
- warp/examples/sim/example_rigid_gyroscopic.py +109 -97
- warp/examples/sim/example_rigid_soft_contact.py +134 -124
- warp/examples/sim/example_soft_body.py +190 -178
- warp/fabric.py +337 -335
- warp/fem/__init__.py +60 -27
- warp/fem/cache.py +401 -388
- warp/fem/dirichlet.py +178 -179
- warp/fem/domain.py +262 -263
- warp/fem/field/__init__.py +100 -101
- warp/fem/field/field.py +148 -149
- warp/fem/field/nodal_field.py +298 -299
- warp/fem/field/restriction.py +22 -21
- warp/fem/field/test.py +180 -181
- warp/fem/field/trial.py +183 -183
- warp/fem/geometry/__init__.py +15 -19
- warp/fem/geometry/closest_point.py +69 -70
- warp/fem/geometry/deformed_geometry.py +270 -271
- warp/fem/geometry/element.py +744 -744
- warp/fem/geometry/geometry.py +184 -186
- warp/fem/geometry/grid_2d.py +380 -373
- warp/fem/geometry/grid_3d.py +441 -435
- warp/fem/geometry/hexmesh.py +953 -953
- warp/fem/geometry/partition.py +374 -376
- warp/fem/geometry/quadmesh_2d.py +532 -532
- warp/fem/geometry/tetmesh.py +840 -840
- warp/fem/geometry/trimesh_2d.py +577 -577
- warp/fem/integrate.py +1630 -1615
- warp/fem/operator.py +190 -191
- warp/fem/polynomial.py +214 -213
- warp/fem/quadrature/__init__.py +2 -2
- warp/fem/quadrature/pic_quadrature.py +243 -245
- warp/fem/quadrature/quadrature.py +295 -294
- warp/fem/space/__init__.py +294 -292
- warp/fem/space/basis_space.py +488 -489
- warp/fem/space/collocated_function_space.py +100 -105
- warp/fem/space/dof_mapper.py +236 -236
- warp/fem/space/function_space.py +148 -145
- warp/fem/space/grid_2d_function_space.py +267 -267
- warp/fem/space/grid_3d_function_space.py +305 -306
- warp/fem/space/hexmesh_function_space.py +350 -352
- warp/fem/space/partition.py +350 -350
- warp/fem/space/quadmesh_2d_function_space.py +368 -369
- warp/fem/space/restriction.py +158 -160
- warp/fem/space/shape/__init__.py +13 -15
- warp/fem/space/shape/cube_shape_function.py +738 -738
- warp/fem/space/shape/shape_function.py +102 -103
- warp/fem/space/shape/square_shape_function.py +611 -611
- warp/fem/space/shape/tet_shape_function.py +565 -567
- warp/fem/space/shape/triangle_shape_function.py +429 -429
- warp/fem/space/tetmesh_function_space.py +294 -292
- warp/fem/space/topology.py +297 -295
- warp/fem/space/trimesh_2d_function_space.py +223 -221
- warp/fem/types.py +77 -77
- warp/fem/utils.py +495 -495
- warp/jax.py +166 -141
- warp/jax_experimental.py +341 -339
- warp/native/array.h +1072 -1025
- warp/native/builtin.h +1560 -1560
- warp/native/bvh.cpp +398 -398
- warp/native/bvh.cu +525 -525
- warp/native/bvh.h +429 -429
- warp/native/clang/clang.cpp +495 -464
- warp/native/crt.cpp +31 -31
- warp/native/crt.h +334 -334
- warp/native/cuda_crt.h +1049 -1049
- warp/native/cuda_util.cpp +549 -540
- warp/native/cuda_util.h +288 -203
- warp/native/cutlass_gemm.cpp +34 -34
- warp/native/cutlass_gemm.cu +372 -372
- warp/native/error.cpp +66 -66
- warp/native/error.h +27 -27
- warp/native/fabric.h +228 -228
- warp/native/hashgrid.cpp +301 -278
- warp/native/hashgrid.cu +78 -77
- warp/native/hashgrid.h +227 -227
- warp/native/initializer_array.h +32 -32
- warp/native/intersect.h +1204 -1204
- warp/native/intersect_adj.h +365 -365
- warp/native/intersect_tri.h +322 -322
- warp/native/marching.cpp +2 -2
- warp/native/marching.cu +497 -497
- warp/native/marching.h +2 -2
- warp/native/mat.h +1498 -1498
- warp/native/matnn.h +333 -333
- warp/native/mesh.cpp +203 -203
- warp/native/mesh.cu +293 -293
- warp/native/mesh.h +1887 -1887
- warp/native/nanovdb/NanoVDB.h +4782 -4782
- warp/native/nanovdb/PNanoVDB.h +2553 -2553
- warp/native/nanovdb/PNanoVDBWrite.h +294 -294
- warp/native/noise.h +850 -850
- warp/native/quat.h +1084 -1084
- warp/native/rand.h +299 -299
- warp/native/range.h +108 -108
- warp/native/reduce.cpp +156 -156
- warp/native/reduce.cu +348 -348
- warp/native/runlength_encode.cpp +61 -61
- warp/native/runlength_encode.cu +46 -46
- warp/native/scan.cpp +30 -30
- warp/native/scan.cu +36 -36
- warp/native/scan.h +7 -7
- warp/native/solid_angle.h +442 -442
- warp/native/sort.cpp +94 -94
- warp/native/sort.cu +97 -97
- warp/native/sort.h +14 -14
- warp/native/sparse.cpp +337 -337
- warp/native/sparse.cu +544 -544
- warp/native/spatial.h +630 -630
- warp/native/svd.h +562 -562
- warp/native/temp_buffer.h +30 -30
- warp/native/vec.h +1132 -1132
- warp/native/volume.cpp +297 -297
- warp/native/volume.cu +32 -32
- warp/native/volume.h +538 -538
- warp/native/volume_builder.cu +425 -425
- warp/native/volume_builder.h +19 -19
- warp/native/warp.cpp +1057 -1052
- warp/native/warp.cu +2943 -2828
- warp/native/warp.h +313 -305
- warp/optim/__init__.py +9 -9
- warp/optim/adam.py +120 -120
- warp/optim/linear.py +1104 -939
- warp/optim/sgd.py +104 -92
- warp/render/__init__.py +10 -10
- warp/render/render_opengl.py +3217 -3204
- warp/render/render_usd.py +768 -749
- warp/render/utils.py +152 -150
- warp/sim/__init__.py +52 -59
- warp/sim/articulation.py +685 -685
- warp/sim/collide.py +1594 -1590
- warp/sim/import_mjcf.py +489 -481
- warp/sim/import_snu.py +220 -221
- warp/sim/import_urdf.py +536 -516
- warp/sim/import_usd.py +887 -881
- warp/sim/inertia.py +316 -317
- warp/sim/integrator.py +234 -233
- warp/sim/integrator_euler.py +1956 -1956
- warp/sim/integrator_featherstone.py +1910 -1991
- warp/sim/integrator_xpbd.py +3294 -3312
- warp/sim/model.py +4473 -4314
- warp/sim/particles.py +113 -112
- warp/sim/render.py +417 -403
- warp/sim/utils.py +413 -410
- warp/sparse.py +1227 -1227
- warp/stubs.py +2109 -2469
- warp/tape.py +1162 -225
- warp/tests/__init__.py +1 -1
- warp/tests/__main__.py +4 -4
- warp/tests/assets/torus.usda +105 -105
- warp/tests/aux_test_class_kernel.py +26 -26
- warp/tests/aux_test_compile_consts_dummy.py +10 -10
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -21
- warp/tests/aux_test_dependent.py +22 -22
- warp/tests/aux_test_grad_customs.py +23 -23
- warp/tests/aux_test_reference.py +11 -11
- warp/tests/aux_test_reference_reference.py +10 -10
- warp/tests/aux_test_square.py +17 -17
- warp/tests/aux_test_unresolved_func.py +14 -14
- warp/tests/aux_test_unresolved_symbol.py +14 -14
- warp/tests/disabled_kinematics.py +239 -239
- warp/tests/run_coverage_serial.py +31 -31
- warp/tests/test_adam.py +157 -157
- warp/tests/test_arithmetic.py +1124 -1124
- warp/tests/test_array.py +2417 -2326
- warp/tests/test_array_reduce.py +150 -150
- warp/tests/test_async.py +668 -656
- warp/tests/test_atomic.py +141 -141
- warp/tests/test_bool.py +204 -149
- warp/tests/test_builtins_resolution.py +1292 -1292
- warp/tests/test_bvh.py +164 -171
- warp/tests/test_closest_point_edge_edge.py +228 -228
- warp/tests/test_codegen.py +566 -553
- warp/tests/test_compile_consts.py +97 -101
- warp/tests/test_conditional.py +246 -246
- warp/tests/test_copy.py +232 -215
- warp/tests/test_ctypes.py +632 -632
- warp/tests/test_dense.py +67 -67
- warp/tests/test_devices.py +91 -98
- warp/tests/test_dlpack.py +530 -529
- warp/tests/test_examples.py +400 -378
- warp/tests/test_fabricarray.py +955 -955
- warp/tests/test_fast_math.py +62 -54
- warp/tests/test_fem.py +1277 -1278
- warp/tests/test_fp16.py +130 -130
- warp/tests/test_func.py +338 -337
- warp/tests/test_generics.py +571 -571
- warp/tests/test_grad.py +746 -640
- warp/tests/test_grad_customs.py +333 -336
- warp/tests/test_hash_grid.py +210 -164
- warp/tests/test_import.py +39 -39
- warp/tests/test_indexedarray.py +1134 -1134
- warp/tests/test_intersect.py +67 -67
- warp/tests/test_jax.py +307 -307
- warp/tests/test_large.py +167 -164
- warp/tests/test_launch.py +354 -354
- warp/tests/test_lerp.py +261 -261
- warp/tests/test_linear_solvers.py +191 -171
- warp/tests/test_lvalue.py +421 -493
- warp/tests/test_marching_cubes.py +65 -65
- warp/tests/test_mat.py +1801 -1827
- warp/tests/test_mat_lite.py +115 -115
- warp/tests/test_mat_scalar_ops.py +2907 -2889
- warp/tests/test_math.py +126 -193
- warp/tests/test_matmul.py +500 -499
- warp/tests/test_matmul_lite.py +410 -410
- warp/tests/test_mempool.py +188 -190
- warp/tests/test_mesh.py +284 -324
- warp/tests/test_mesh_query_aabb.py +228 -241
- warp/tests/test_mesh_query_point.py +692 -702
- warp/tests/test_mesh_query_ray.py +292 -303
- warp/tests/test_mlp.py +276 -276
- warp/tests/test_model.py +110 -110
- warp/tests/test_modules_lite.py +39 -39
- warp/tests/test_multigpu.py +163 -163
- warp/tests/test_noise.py +248 -248
- warp/tests/test_operators.py +250 -250
- warp/tests/test_options.py +123 -125
- warp/tests/test_peer.py +133 -137
- warp/tests/test_pinned.py +78 -78
- warp/tests/test_print.py +54 -54
- warp/tests/test_quat.py +2086 -2086
- warp/tests/test_rand.py +288 -288
- warp/tests/test_reload.py +217 -217
- warp/tests/test_rounding.py +179 -179
- warp/tests/test_runlength_encode.py +190 -190
- warp/tests/test_sim_grad.py +243 -0
- warp/tests/test_sim_kinematics.py +91 -97
- warp/tests/test_smoothstep.py +168 -168
- warp/tests/test_snippet.py +305 -266
- warp/tests/test_sparse.py +468 -460
- warp/tests/test_spatial.py +2148 -2148
- warp/tests/test_streams.py +486 -473
- warp/tests/test_struct.py +710 -675
- warp/tests/test_tape.py +173 -148
- warp/tests/test_torch.py +743 -743
- warp/tests/test_transient_module.py +87 -87
- warp/tests/test_types.py +556 -659
- warp/tests/test_utils.py +490 -499
- warp/tests/test_vec.py +1264 -1268
- warp/tests/test_vec_lite.py +73 -73
- warp/tests/test_vec_scalar_ops.py +2099 -2099
- warp/tests/test_verify_fp.py +94 -94
- warp/tests/test_volume.py +737 -736
- warp/tests/test_volume_write.py +255 -265
- warp/tests/unittest_serial.py +37 -37
- warp/tests/unittest_suites.py +363 -359
- warp/tests/unittest_utils.py +603 -578
- warp/tests/unused_test_misc.py +71 -71
- warp/tests/walkthrough_debug.py +85 -85
- warp/thirdparty/appdirs.py +598 -598
- warp/thirdparty/dlpack.py +143 -143
- warp/thirdparty/unittest_parallel.py +566 -561
- warp/torch.py +321 -295
- warp/types.py +4504 -4450
- warp/utils.py +1008 -821
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/METADATA +338 -400
- warp_lang-1.1.0.dist-info/RECORD +352 -0
- warp/examples/assets/cube.usda +0 -42
- warp/examples/assets/sphere.usda +0 -56
- warp/examples/assets/torus.usda +0 -105
- warp_lang-1.0.1.dist-info/RECORD +0 -352
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
warp/native/error.cpp
CHANGED
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
/** Copyright (c) 2024 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
|
-
|
|
9
|
-
#include <stdarg.h>
|
|
10
|
-
#include <stdio.h>
|
|
11
|
-
#include <string.h>
|
|
12
|
-
|
|
13
|
-
namespace wp
|
|
14
|
-
{
|
|
15
|
-
static char g_error_buffer[4096] = "";
|
|
16
|
-
static bool g_error_output_enabled = true;
|
|
17
|
-
static FILE* g_error_stream = stderr;
|
|
18
|
-
|
|
19
|
-
const char* get_error_string()
|
|
20
|
-
{
|
|
21
|
-
return g_error_buffer;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
void set_error_string(const char* fmt, ...)
|
|
25
|
-
{
|
|
26
|
-
va_list args;
|
|
27
|
-
va_start(args, fmt);
|
|
28
|
-
vsnprintf(g_error_buffer, sizeof(g_error_buffer), fmt, args);
|
|
29
|
-
if (g_error_output_enabled)
|
|
30
|
-
{
|
|
31
|
-
vfprintf(g_error_stream, fmt, args);
|
|
32
|
-
fputc('\n', g_error_stream);
|
|
33
|
-
fflush(g_error_stream);
|
|
34
|
-
}
|
|
35
|
-
va_end(args);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
void append_error_string(const char* fmt, ...)
|
|
39
|
-
{
|
|
40
|
-
size_t offset = strlen(g_error_buffer);
|
|
41
|
-
if (offset + 2 > sizeof(g_error_buffer))
|
|
42
|
-
return;
|
|
43
|
-
g_error_buffer[offset++] = '\n';
|
|
44
|
-
va_list args;
|
|
45
|
-
va_start(args, fmt);
|
|
46
|
-
vsnprintf(g_error_buffer + offset, sizeof(g_error_buffer) - offset, fmt, args);
|
|
47
|
-
if (g_error_output_enabled)
|
|
48
|
-
{
|
|
49
|
-
vfprintf(g_error_stream, fmt, args);
|
|
50
|
-
fputc('\n', g_error_stream);
|
|
51
|
-
fflush(g_error_stream);
|
|
52
|
-
}
|
|
53
|
-
va_end(args);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
void set_error_output_enabled(bool enable)
|
|
57
|
-
{
|
|
58
|
-
g_error_output_enabled = enable;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
bool is_error_output_enabled()
|
|
62
|
-
{
|
|
63
|
-
return g_error_output_enabled;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
} // end of namespace wp
|
|
1
|
+
/** Copyright (c) 2024 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
|
+
|
|
9
|
+
#include <stdarg.h>
|
|
10
|
+
#include <stdio.h>
|
|
11
|
+
#include <string.h>
|
|
12
|
+
|
|
13
|
+
namespace wp
|
|
14
|
+
{
|
|
15
|
+
static char g_error_buffer[4096] = "";
|
|
16
|
+
static bool g_error_output_enabled = true;
|
|
17
|
+
static FILE* g_error_stream = stderr;
|
|
18
|
+
|
|
19
|
+
const char* get_error_string()
|
|
20
|
+
{
|
|
21
|
+
return g_error_buffer;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
void set_error_string(const char* fmt, ...)
|
|
25
|
+
{
|
|
26
|
+
va_list args;
|
|
27
|
+
va_start(args, fmt);
|
|
28
|
+
vsnprintf(g_error_buffer, sizeof(g_error_buffer), fmt, args);
|
|
29
|
+
if (g_error_output_enabled)
|
|
30
|
+
{
|
|
31
|
+
vfprintf(g_error_stream, fmt, args);
|
|
32
|
+
fputc('\n', g_error_stream);
|
|
33
|
+
fflush(g_error_stream);
|
|
34
|
+
}
|
|
35
|
+
va_end(args);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
void append_error_string(const char* fmt, ...)
|
|
39
|
+
{
|
|
40
|
+
size_t offset = strlen(g_error_buffer);
|
|
41
|
+
if (offset + 2 > sizeof(g_error_buffer))
|
|
42
|
+
return;
|
|
43
|
+
g_error_buffer[offset++] = '\n';
|
|
44
|
+
va_list args;
|
|
45
|
+
va_start(args, fmt);
|
|
46
|
+
vsnprintf(g_error_buffer + offset, sizeof(g_error_buffer) - offset, fmt, args);
|
|
47
|
+
if (g_error_output_enabled)
|
|
48
|
+
{
|
|
49
|
+
vfprintf(g_error_stream, fmt, args);
|
|
50
|
+
fputc('\n', g_error_stream);
|
|
51
|
+
fflush(g_error_stream);
|
|
52
|
+
}
|
|
53
|
+
va_end(args);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void set_error_output_enabled(bool enable)
|
|
57
|
+
{
|
|
58
|
+
g_error_output_enabled = enable;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
bool is_error_output_enabled()
|
|
62
|
+
{
|
|
63
|
+
return g_error_output_enabled;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
} // end of namespace wp
|
warp/native/error.h
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
/** Copyright (c) 2024 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
|
-
|
|
9
|
-
#pragma once
|
|
10
|
-
|
|
11
|
-
namespace wp
|
|
12
|
-
{
|
|
13
|
-
// functions related to error reporting
|
|
14
|
-
|
|
15
|
-
// get error string from Python
|
|
16
|
-
const char* get_error_string();
|
|
17
|
-
|
|
18
|
-
// set error message for Python
|
|
19
|
-
// these functions also print the error message if error output is enabled
|
|
20
|
-
void set_error_string(const char* fmt, ...);
|
|
21
|
-
void append_error_string(const char* fmt, ...);
|
|
22
|
-
|
|
23
|
-
// allow disabling printing errors, which is handy during tests that expect failure
|
|
24
|
-
void set_error_output_enabled(bool enable);
|
|
25
|
-
bool is_error_output_enabled();
|
|
26
|
-
|
|
27
|
-
}
|
|
1
|
+
/** Copyright (c) 2024 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
|
+
|
|
9
|
+
#pragma once
|
|
10
|
+
|
|
11
|
+
namespace wp
|
|
12
|
+
{
|
|
13
|
+
// functions related to error reporting
|
|
14
|
+
|
|
15
|
+
// get error string from Python
|
|
16
|
+
const char* get_error_string();
|
|
17
|
+
|
|
18
|
+
// set error message for Python
|
|
19
|
+
// these functions also print the error message if error output is enabled
|
|
20
|
+
void set_error_string(const char* fmt, ...);
|
|
21
|
+
void append_error_string(const char* fmt, ...);
|
|
22
|
+
|
|
23
|
+
// allow disabling printing errors, which is handy during tests that expect failure
|
|
24
|
+
void set_error_output_enabled(bool enable);
|
|
25
|
+
bool is_error_output_enabled();
|
|
26
|
+
|
|
27
|
+
}
|
warp/native/fabric.h
CHANGED
|
@@ -1,228 +1,228 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include "builtin.h"
|
|
4
|
-
|
|
5
|
-
namespace wp
|
|
6
|
-
{
|
|
7
|
-
|
|
8
|
-
struct fabricbucket_t
|
|
9
|
-
{
|
|
10
|
-
size_t index_start;
|
|
11
|
-
size_t index_end;
|
|
12
|
-
void* ptr;
|
|
13
|
-
size_t* lengths;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
template <typename T>
|
|
18
|
-
struct fabricarray_t
|
|
19
|
-
{
|
|
20
|
-
CUDA_CALLABLE inline fabricarray_t()
|
|
21
|
-
: nbuckets(0),
|
|
22
|
-
size(0)
|
|
23
|
-
{}
|
|
24
|
-
|
|
25
|
-
CUDA_CALLABLE inline bool empty() const { return !size; }
|
|
26
|
-
|
|
27
|
-
fabricbucket_t* buckets; // array of fabricbucket_t on the correct device
|
|
28
|
-
|
|
29
|
-
size_t nbuckets;
|
|
30
|
-
size_t size;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
template <typename T>
|
|
35
|
-
struct indexedfabricarray_t
|
|
36
|
-
{
|
|
37
|
-
CUDA_CALLABLE inline indexedfabricarray_t()
|
|
38
|
-
: indices(),
|
|
39
|
-
size(0)
|
|
40
|
-
{}
|
|
41
|
-
|
|
42
|
-
CUDA_CALLABLE inline bool empty() const { return !size; }
|
|
43
|
-
|
|
44
|
-
fabricarray_t<T> fa;
|
|
45
|
-
|
|
46
|
-
// TODO: we use 32-bit indices for consistency with other Warp indexed arrays,
|
|
47
|
-
// but Fabric uses 64-bit indexing.
|
|
48
|
-
int* indices;
|
|
49
|
-
size_t size;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
#ifndef FABRICARRAY_USE_BINARY_SEARCH
|
|
54
|
-
#define FABRICARRAY_USE_BINARY_SEARCH 1
|
|
55
|
-
#endif
|
|
56
|
-
|
|
57
|
-
template <typename T>
|
|
58
|
-
CUDA_CALLABLE inline const fabricbucket_t* fabricarray_find_bucket(const fabricarray_t<T>& fa, size_t i)
|
|
59
|
-
{
|
|
60
|
-
#if FABRICARRAY_USE_BINARY_SEARCH
|
|
61
|
-
// use binary search to find the right bucket
|
|
62
|
-
const fabricbucket_t* bucket = nullptr;
|
|
63
|
-
size_t lo = 0;
|
|
64
|
-
size_t hi = fa.nbuckets - 1;
|
|
65
|
-
while (hi >= lo)
|
|
66
|
-
{
|
|
67
|
-
size_t mid = (lo + hi) >> 1;
|
|
68
|
-
bucket = fa.buckets + mid;
|
|
69
|
-
if (i >= bucket->index_end)
|
|
70
|
-
lo = mid + 1;
|
|
71
|
-
else if (i < bucket->index_start)
|
|
72
|
-
hi = mid - 1;
|
|
73
|
-
else
|
|
74
|
-
return bucket;
|
|
75
|
-
}
|
|
76
|
-
return nullptr;
|
|
77
|
-
#else
|
|
78
|
-
// use linear search to find the right bucket
|
|
79
|
-
const fabricbucket_t* bucket = fa.buckets;
|
|
80
|
-
const fabricbucket_t* bucket_end = bucket + fa.nbuckets;
|
|
81
|
-
for (; bucket < bucket_end; ++bucket)
|
|
82
|
-
{
|
|
83
|
-
if (i < bucket->index_end)
|
|
84
|
-
return bucket;
|
|
85
|
-
}
|
|
86
|
-
return nullptr;
|
|
87
|
-
#endif
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
// Compute the pointer to a fabricarray element at index i.
|
|
92
|
-
// This function is similar to wp::index(), but the array data type doesn't need to be known at compile time.
|
|
93
|
-
CUDA_CALLABLE inline void* fabricarray_element_ptr(const fabricarray_t<void>& fa, size_t i, size_t elem_size)
|
|
94
|
-
{
|
|
95
|
-
const fabricbucket_t* bucket = fabricarray_find_bucket(fa, i);
|
|
96
|
-
|
|
97
|
-
size_t index_in_bucket = i - bucket->index_start;
|
|
98
|
-
|
|
99
|
-
return (char*)bucket->ptr + index_in_bucket * elem_size;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
template <typename T>
|
|
104
|
-
CUDA_CALLABLE inline T& index(const fabricarray_t<T>& fa, size_t i)
|
|
105
|
-
{
|
|
106
|
-
const fabricbucket_t* bucket = fabricarray_find_bucket(fa, i);
|
|
107
|
-
assert(bucket && "Fabric array index out of range");
|
|
108
|
-
|
|
109
|
-
size_t index_in_bucket = i - bucket->index_start;
|
|
110
|
-
|
|
111
|
-
T& result = *((T*)bucket->ptr + index_in_bucket);
|
|
112
|
-
|
|
113
|
-
FP_VERIFY_FWD_1(result)
|
|
114
|
-
|
|
115
|
-
return result;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
// indexing for fabric array of arrays
|
|
120
|
-
template <typename T>
|
|
121
|
-
CUDA_CALLABLE inline T& index(const fabricarray_t<T>& fa, size_t i, size_t j)
|
|
122
|
-
{
|
|
123
|
-
const fabricbucket_t* bucket = fabricarray_find_bucket(fa, i);
|
|
124
|
-
assert(bucket && "Fabric array index out of range");
|
|
125
|
-
|
|
126
|
-
assert(bucket->lengths && "Missing inner array lengths");
|
|
127
|
-
|
|
128
|
-
size_t index_in_bucket = i - bucket->index_start;
|
|
129
|
-
|
|
130
|
-
void* ptr = *((void**)bucket->ptr + index_in_bucket);
|
|
131
|
-
size_t length = *((size_t*)bucket->lengths + index_in_bucket);
|
|
132
|
-
|
|
133
|
-
assert(j < length && "Fabric array inner index out of range");
|
|
134
|
-
|
|
135
|
-
T& result = *((T*)ptr + j);
|
|
136
|
-
|
|
137
|
-
FP_VERIFY_FWD_1(result)
|
|
138
|
-
|
|
139
|
-
return result;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
template <typename T>
|
|
144
|
-
CUDA_CALLABLE inline array_t<T> view(fabricarray_t<T>& fa, size_t i)
|
|
145
|
-
{
|
|
146
|
-
const fabricbucket_t* bucket = fabricarray_find_bucket(fa, i);
|
|
147
|
-
assert(bucket && "Fabric array index out of range");
|
|
148
|
-
|
|
149
|
-
assert(bucket->lengths && "Missing inner array lengths");
|
|
150
|
-
|
|
151
|
-
size_t index_in_bucket = i - bucket->index_start;
|
|
152
|
-
|
|
153
|
-
void* ptr = *((void**)bucket->ptr + index_in_bucket);
|
|
154
|
-
size_t length = *((size_t*)bucket->lengths + index_in_bucket);
|
|
155
|
-
|
|
156
|
-
return array_t<T>((T*)ptr, int(length));
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
template <typename T>
|
|
161
|
-
CUDA_CALLABLE inline T& index(const indexedfabricarray_t<T>& ifa, size_t i)
|
|
162
|
-
{
|
|
163
|
-
// index lookup
|
|
164
|
-
assert(i < ifa.size);
|
|
165
|
-
i = size_t(ifa.indices[i]);
|
|
166
|
-
|
|
167
|
-
const fabricbucket_t* bucket = fabricarray_find_bucket(ifa.fa, i);
|
|
168
|
-
assert(bucket && "Fabric array index out of range");
|
|
169
|
-
|
|
170
|
-
size_t index_in_bucket = i - bucket->index_start;
|
|
171
|
-
|
|
172
|
-
T& result = *((T*)bucket->ptr + index_in_bucket);
|
|
173
|
-
|
|
174
|
-
FP_VERIFY_FWD_1(result)
|
|
175
|
-
|
|
176
|
-
return result;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
// indexing for fabric array of arrays
|
|
181
|
-
template <typename T>
|
|
182
|
-
CUDA_CALLABLE inline T& index(const indexedfabricarray_t<T>& ifa, size_t i, size_t j)
|
|
183
|
-
{
|
|
184
|
-
// index lookup
|
|
185
|
-
assert(i < ifa.size);
|
|
186
|
-
i = size_t(ifa.indices[i]);
|
|
187
|
-
|
|
188
|
-
const fabricbucket_t* bucket = fabricarray_find_bucket(ifa.fa, i);
|
|
189
|
-
assert(bucket && "Fabric array index out of range");
|
|
190
|
-
|
|
191
|
-
assert(bucket->lengths && "Missing inner array lengths");
|
|
192
|
-
|
|
193
|
-
size_t index_in_bucket = i - bucket->index_start;
|
|
194
|
-
|
|
195
|
-
void* ptr = *((void**)bucket->ptr + index_in_bucket);
|
|
196
|
-
size_t length = *((size_t*)bucket->lengths + index_in_bucket);
|
|
197
|
-
|
|
198
|
-
assert(j < length && "Fabric array inner index out of range");
|
|
199
|
-
|
|
200
|
-
T& result = *((T*)ptr + j);
|
|
201
|
-
|
|
202
|
-
FP_VERIFY_FWD_1(result)
|
|
203
|
-
|
|
204
|
-
return result;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
template <typename T>
|
|
209
|
-
CUDA_CALLABLE inline array_t<T> view(indexedfabricarray_t<T>& ifa, size_t i)
|
|
210
|
-
{
|
|
211
|
-
// index lookup
|
|
212
|
-
assert(i < ifa.size);
|
|
213
|
-
i = size_t(ifa.indices[i]);
|
|
214
|
-
|
|
215
|
-
const fabricbucket_t* bucket = fabricarray_find_bucket(ifa.fa, i);
|
|
216
|
-
assert(bucket && "Fabric array index out of range");
|
|
217
|
-
|
|
218
|
-
assert(bucket->lengths && "Missing inner array lengths");
|
|
219
|
-
|
|
220
|
-
size_t index_in_bucket = i - bucket->index_start;
|
|
221
|
-
|
|
222
|
-
void* ptr = *((void**)bucket->ptr + index_in_bucket);
|
|
223
|
-
size_t length = *((size_t*)bucket->lengths + index_in_bucket);
|
|
224
|
-
|
|
225
|
-
return array_t<T>((T*)ptr, int(length));
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
} // namespace wp
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "builtin.h"
|
|
4
|
+
|
|
5
|
+
namespace wp
|
|
6
|
+
{
|
|
7
|
+
|
|
8
|
+
struct fabricbucket_t
|
|
9
|
+
{
|
|
10
|
+
size_t index_start;
|
|
11
|
+
size_t index_end;
|
|
12
|
+
void* ptr;
|
|
13
|
+
size_t* lengths;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
template <typename T>
|
|
18
|
+
struct fabricarray_t
|
|
19
|
+
{
|
|
20
|
+
CUDA_CALLABLE inline fabricarray_t()
|
|
21
|
+
: nbuckets(0),
|
|
22
|
+
size(0)
|
|
23
|
+
{}
|
|
24
|
+
|
|
25
|
+
CUDA_CALLABLE inline bool empty() const { return !size; }
|
|
26
|
+
|
|
27
|
+
fabricbucket_t* buckets; // array of fabricbucket_t on the correct device
|
|
28
|
+
|
|
29
|
+
size_t nbuckets;
|
|
30
|
+
size_t size;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
template <typename T>
|
|
35
|
+
struct indexedfabricarray_t
|
|
36
|
+
{
|
|
37
|
+
CUDA_CALLABLE inline indexedfabricarray_t()
|
|
38
|
+
: indices(),
|
|
39
|
+
size(0)
|
|
40
|
+
{}
|
|
41
|
+
|
|
42
|
+
CUDA_CALLABLE inline bool empty() const { return !size; }
|
|
43
|
+
|
|
44
|
+
fabricarray_t<T> fa;
|
|
45
|
+
|
|
46
|
+
// TODO: we use 32-bit indices for consistency with other Warp indexed arrays,
|
|
47
|
+
// but Fabric uses 64-bit indexing.
|
|
48
|
+
int* indices;
|
|
49
|
+
size_t size;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
#ifndef FABRICARRAY_USE_BINARY_SEARCH
|
|
54
|
+
#define FABRICARRAY_USE_BINARY_SEARCH 1
|
|
55
|
+
#endif
|
|
56
|
+
|
|
57
|
+
template <typename T>
|
|
58
|
+
CUDA_CALLABLE inline const fabricbucket_t* fabricarray_find_bucket(const fabricarray_t<T>& fa, size_t i)
|
|
59
|
+
{
|
|
60
|
+
#if FABRICARRAY_USE_BINARY_SEARCH
|
|
61
|
+
// use binary search to find the right bucket
|
|
62
|
+
const fabricbucket_t* bucket = nullptr;
|
|
63
|
+
size_t lo = 0;
|
|
64
|
+
size_t hi = fa.nbuckets - 1;
|
|
65
|
+
while (hi >= lo)
|
|
66
|
+
{
|
|
67
|
+
size_t mid = (lo + hi) >> 1;
|
|
68
|
+
bucket = fa.buckets + mid;
|
|
69
|
+
if (i >= bucket->index_end)
|
|
70
|
+
lo = mid + 1;
|
|
71
|
+
else if (i < bucket->index_start)
|
|
72
|
+
hi = mid - 1;
|
|
73
|
+
else
|
|
74
|
+
return bucket;
|
|
75
|
+
}
|
|
76
|
+
return nullptr;
|
|
77
|
+
#else
|
|
78
|
+
// use linear search to find the right bucket
|
|
79
|
+
const fabricbucket_t* bucket = fa.buckets;
|
|
80
|
+
const fabricbucket_t* bucket_end = bucket + fa.nbuckets;
|
|
81
|
+
for (; bucket < bucket_end; ++bucket)
|
|
82
|
+
{
|
|
83
|
+
if (i < bucket->index_end)
|
|
84
|
+
return bucket;
|
|
85
|
+
}
|
|
86
|
+
return nullptr;
|
|
87
|
+
#endif
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
// Compute the pointer to a fabricarray element at index i.
|
|
92
|
+
// This function is similar to wp::index(), but the array data type doesn't need to be known at compile time.
|
|
93
|
+
CUDA_CALLABLE inline void* fabricarray_element_ptr(const fabricarray_t<void>& fa, size_t i, size_t elem_size)
|
|
94
|
+
{
|
|
95
|
+
const fabricbucket_t* bucket = fabricarray_find_bucket(fa, i);
|
|
96
|
+
|
|
97
|
+
size_t index_in_bucket = i - bucket->index_start;
|
|
98
|
+
|
|
99
|
+
return (char*)bucket->ptr + index_in_bucket * elem_size;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
template <typename T>
|
|
104
|
+
CUDA_CALLABLE inline T& index(const fabricarray_t<T>& fa, size_t i)
|
|
105
|
+
{
|
|
106
|
+
const fabricbucket_t* bucket = fabricarray_find_bucket(fa, i);
|
|
107
|
+
assert(bucket && "Fabric array index out of range");
|
|
108
|
+
|
|
109
|
+
size_t index_in_bucket = i - bucket->index_start;
|
|
110
|
+
|
|
111
|
+
T& result = *((T*)bucket->ptr + index_in_bucket);
|
|
112
|
+
|
|
113
|
+
FP_VERIFY_FWD_1(result)
|
|
114
|
+
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
// indexing for fabric array of arrays
|
|
120
|
+
template <typename T>
|
|
121
|
+
CUDA_CALLABLE inline T& index(const fabricarray_t<T>& fa, size_t i, size_t j)
|
|
122
|
+
{
|
|
123
|
+
const fabricbucket_t* bucket = fabricarray_find_bucket(fa, i);
|
|
124
|
+
assert(bucket && "Fabric array index out of range");
|
|
125
|
+
|
|
126
|
+
assert(bucket->lengths && "Missing inner array lengths");
|
|
127
|
+
|
|
128
|
+
size_t index_in_bucket = i - bucket->index_start;
|
|
129
|
+
|
|
130
|
+
void* ptr = *((void**)bucket->ptr + index_in_bucket);
|
|
131
|
+
size_t length = *((size_t*)bucket->lengths + index_in_bucket);
|
|
132
|
+
|
|
133
|
+
assert(j < length && "Fabric array inner index out of range");
|
|
134
|
+
|
|
135
|
+
T& result = *((T*)ptr + j);
|
|
136
|
+
|
|
137
|
+
FP_VERIFY_FWD_1(result)
|
|
138
|
+
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
template <typename T>
|
|
144
|
+
CUDA_CALLABLE inline array_t<T> view(fabricarray_t<T>& fa, size_t i)
|
|
145
|
+
{
|
|
146
|
+
const fabricbucket_t* bucket = fabricarray_find_bucket(fa, i);
|
|
147
|
+
assert(bucket && "Fabric array index out of range");
|
|
148
|
+
|
|
149
|
+
assert(bucket->lengths && "Missing inner array lengths");
|
|
150
|
+
|
|
151
|
+
size_t index_in_bucket = i - bucket->index_start;
|
|
152
|
+
|
|
153
|
+
void* ptr = *((void**)bucket->ptr + index_in_bucket);
|
|
154
|
+
size_t length = *((size_t*)bucket->lengths + index_in_bucket);
|
|
155
|
+
|
|
156
|
+
return array_t<T>((T*)ptr, int(length));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
template <typename T>
|
|
161
|
+
CUDA_CALLABLE inline T& index(const indexedfabricarray_t<T>& ifa, size_t i)
|
|
162
|
+
{
|
|
163
|
+
// index lookup
|
|
164
|
+
assert(i < ifa.size);
|
|
165
|
+
i = size_t(ifa.indices[i]);
|
|
166
|
+
|
|
167
|
+
const fabricbucket_t* bucket = fabricarray_find_bucket(ifa.fa, i);
|
|
168
|
+
assert(bucket && "Fabric array index out of range");
|
|
169
|
+
|
|
170
|
+
size_t index_in_bucket = i - bucket->index_start;
|
|
171
|
+
|
|
172
|
+
T& result = *((T*)bucket->ptr + index_in_bucket);
|
|
173
|
+
|
|
174
|
+
FP_VERIFY_FWD_1(result)
|
|
175
|
+
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
// indexing for fabric array of arrays
|
|
181
|
+
template <typename T>
|
|
182
|
+
CUDA_CALLABLE inline T& index(const indexedfabricarray_t<T>& ifa, size_t i, size_t j)
|
|
183
|
+
{
|
|
184
|
+
// index lookup
|
|
185
|
+
assert(i < ifa.size);
|
|
186
|
+
i = size_t(ifa.indices[i]);
|
|
187
|
+
|
|
188
|
+
const fabricbucket_t* bucket = fabricarray_find_bucket(ifa.fa, i);
|
|
189
|
+
assert(bucket && "Fabric array index out of range");
|
|
190
|
+
|
|
191
|
+
assert(bucket->lengths && "Missing inner array lengths");
|
|
192
|
+
|
|
193
|
+
size_t index_in_bucket = i - bucket->index_start;
|
|
194
|
+
|
|
195
|
+
void* ptr = *((void**)bucket->ptr + index_in_bucket);
|
|
196
|
+
size_t length = *((size_t*)bucket->lengths + index_in_bucket);
|
|
197
|
+
|
|
198
|
+
assert(j < length && "Fabric array inner index out of range");
|
|
199
|
+
|
|
200
|
+
T& result = *((T*)ptr + j);
|
|
201
|
+
|
|
202
|
+
FP_VERIFY_FWD_1(result)
|
|
203
|
+
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
template <typename T>
|
|
209
|
+
CUDA_CALLABLE inline array_t<T> view(indexedfabricarray_t<T>& ifa, size_t i)
|
|
210
|
+
{
|
|
211
|
+
// index lookup
|
|
212
|
+
assert(i < ifa.size);
|
|
213
|
+
i = size_t(ifa.indices[i]);
|
|
214
|
+
|
|
215
|
+
const fabricbucket_t* bucket = fabricarray_find_bucket(ifa.fa, i);
|
|
216
|
+
assert(bucket && "Fabric array index out of range");
|
|
217
|
+
|
|
218
|
+
assert(bucket->lengths && "Missing inner array lengths");
|
|
219
|
+
|
|
220
|
+
size_t index_in_bucket = i - bucket->index_start;
|
|
221
|
+
|
|
222
|
+
void* ptr = *((void**)bucket->ptr + index_in_bucket);
|
|
223
|
+
size_t length = *((size_t*)bucket->lengths + index_in_bucket);
|
|
224
|
+
|
|
225
|
+
return array_t<T>((T*)ptr, int(length));
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
} // namespace wp
|