warp-lang 1.0.2__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 -277
- 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 -29
- warp/examples/core/example_dem.py +234 -219
- warp/examples/core/example_fluid.py +293 -267
- warp/examples/core/example_graph_capture.py +144 -126
- warp/examples/core/example_marching_cubes.py +188 -174
- warp/examples/core/example_mesh.py +174 -155
- warp/examples/core/example_mesh_intersect.py +205 -193
- warp/examples/core/example_nvdb.py +176 -170
- warp/examples/core/example_raycast.py +105 -90
- warp/examples/core/example_raymarch.py +199 -178
- warp/examples/core/example_render_opengl.py +185 -141
- warp/examples/core/example_sph.py +405 -387
- warp/examples/core/example_torch.py +222 -181
- warp/examples/core/example_wave.py +263 -248
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +407 -389
- 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 -246
- warp/examples/optim/example_cloth_throw.py +222 -209
- warp/examples/optim/example_diffray.py +566 -536
- warp/examples/optim/example_drone.py +864 -835
- warp/examples/optim/example_inverse_kinematics.py +176 -168
- warp/examples/optim/example_inverse_kinematics_torch.py +185 -169
- warp/examples/optim/example_spring_cage.py +239 -231
- warp/examples/optim/example_trajectory.py +223 -199
- warp/examples/optim/example_walker.py +306 -293
- warp/examples/sim/example_cartpole.py +139 -129
- warp/examples/sim/example_cloth.py +196 -186
- warp/examples/sim/example_granular.py +124 -111
- warp/examples/sim/example_granular_collision_sdf.py +197 -186
- warp/examples/sim/example_jacobian_ik.py +236 -214
- warp/examples/sim/example_particle_chain.py +118 -105
- warp/examples/sim/example_quadruped.py +193 -180
- warp/examples/sim/example_rigid_chain.py +197 -187
- warp/examples/sim/example_rigid_contact.py +189 -177
- warp/examples/sim/example_rigid_force.py +127 -125
- warp/examples/sim/example_rigid_gyroscopic.py +109 -95
- warp/examples/sim/example_rigid_soft_contact.py +134 -122
- warp/examples/sim/example_soft_body.py +190 -177
- 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.2.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.2.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.2.dist-info/RECORD +0 -352
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
warp/build_dll.py
CHANGED
|
@@ -1,375 +1,383 @@
|
|
|
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
|
|
9
|
-
import
|
|
10
|
-
import subprocess
|
|
11
|
-
import
|
|
12
|
-
|
|
13
|
-
from warp.utils import ScopedTimer
|
|
14
|
-
|
|
15
|
-
verbose_cmd = True # print command lines before executing them
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# returns a canonical machine architecture string
|
|
19
|
-
# - "x86_64" for x86-64, aka. AMD64, aka. x64
|
|
20
|
-
# - "aarch64" for AArch64, aka. ARM64
|
|
21
|
-
def machine_architecture() -> str:
|
|
22
|
-
machine = platform.machine()
|
|
23
|
-
if machine == "x86_64" or machine == "AMD64":
|
|
24
|
-
return "x86_64"
|
|
25
|
-
if machine == "aarch64" or machine == "arm64":
|
|
26
|
-
return "aarch64"
|
|
27
|
-
raise RuntimeError(f"Unrecognized machine architecture {machine}")
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def run_cmd(cmd):
|
|
31
|
-
if verbose_cmd:
|
|
32
|
-
print(cmd)
|
|
33
|
-
|
|
34
|
-
try:
|
|
35
|
-
return subprocess.check_output(cmd, shell=True)
|
|
36
|
-
except subprocess.CalledProcessError as e:
|
|
37
|
-
if e.stdout:
|
|
38
|
-
print(e.stdout.decode())
|
|
39
|
-
if e.stderr:
|
|
40
|
-
print(e.stderr.decode())
|
|
41
|
-
raise (e)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
# cut-down version of vcvars64.bat that allows using
|
|
45
|
-
# custom toolchain locations, returns the compiler program path
|
|
46
|
-
def set_msvc_env(msvc_path, sdk_path):
|
|
47
|
-
if "INCLUDE" not in os.environ:
|
|
48
|
-
os.environ["INCLUDE"] = ""
|
|
49
|
-
|
|
50
|
-
if "LIB" not in os.environ:
|
|
51
|
-
os.environ["LIB"] = ""
|
|
52
|
-
|
|
53
|
-
msvc_path = os.path.abspath(msvc_path)
|
|
54
|
-
sdk_path = os.path.abspath(sdk_path)
|
|
55
|
-
|
|
56
|
-
os.environ["INCLUDE"] += os.pathsep + os.path.join(msvc_path, "include")
|
|
57
|
-
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/winrt")
|
|
58
|
-
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/um")
|
|
59
|
-
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/ucrt")
|
|
60
|
-
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/shared")
|
|
61
|
-
|
|
62
|
-
os.environ["LIB"] += os.pathsep + os.path.join(msvc_path, "lib/x64")
|
|
63
|
-
os.environ["LIB"] += os.pathsep + os.path.join(sdk_path, "lib/ucrt/x64")
|
|
64
|
-
os.environ["LIB"] += os.pathsep + os.path.join(sdk_path, "lib/um/x64")
|
|
65
|
-
|
|
66
|
-
os.environ["PATH"] += os.pathsep + os.path.join(msvc_path, "bin/HostX64/x64")
|
|
67
|
-
os.environ["PATH"] += os.pathsep + os.path.join(sdk_path, "bin/x64")
|
|
68
|
-
|
|
69
|
-
return os.path.join(msvc_path, "bin", "HostX64", "x64", "cl.exe")
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def find_host_compiler():
|
|
73
|
-
if os.name == "nt":
|
|
74
|
-
# try and find an installed host compiler (msvc)
|
|
75
|
-
# runs vcvars and copies back the build environment
|
|
76
|
-
|
|
77
|
-
vswhere_path = r"%ProgramFiles(x86)%/Microsoft Visual Studio/Installer/vswhere.exe"
|
|
78
|
-
vswhere_path = os.path.expandvars(vswhere_path)
|
|
79
|
-
if not os.path.exists(vswhere_path):
|
|
80
|
-
return ""
|
|
81
|
-
|
|
82
|
-
vs_path = run_cmd(f'"{vswhere_path}" -latest -property installationPath').decode().rstrip()
|
|
83
|
-
vsvars_path = os.path.join(vs_path, "VC\\Auxiliary\\Build\\vcvars64.bat")
|
|
84
|
-
|
|
85
|
-
output = run_cmd(f'"{vsvars_path}" && set').decode()
|
|
86
|
-
|
|
87
|
-
for line in output.splitlines():
|
|
88
|
-
pair = line.split("=", 1)
|
|
89
|
-
if len(pair) >= 2:
|
|
90
|
-
os.environ[pair[0]] = pair[1]
|
|
91
|
-
|
|
92
|
-
cl_path = run_cmd("where cl.exe").decode("utf-8").rstrip()
|
|
93
|
-
cl_version = os.environ["VCToolsVersion"].split(".")
|
|
94
|
-
|
|
95
|
-
# ensure at least VS2019 version, see list of MSVC versions here https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B
|
|
96
|
-
cl_required_major = 14
|
|
97
|
-
cl_required_minor = 29
|
|
98
|
-
|
|
99
|
-
if (
|
|
100
|
-
(int(cl_version[0]) < cl_required_major)
|
|
101
|
-
or (int(cl_version[0]) == cl_required_major)
|
|
102
|
-
and int(cl_version[1]) < cl_required_minor
|
|
103
|
-
):
|
|
104
|
-
print(
|
|
105
|
-
f"Warp: MSVC found but compiler version too old, found {cl_version[0]}.{cl_version[1]}, but must be {cl_required_major}.{cl_required_minor} or higher, kernel host compilation will be disabled."
|
|
106
|
-
)
|
|
107
|
-
return ""
|
|
108
|
-
|
|
109
|
-
return cl_path
|
|
110
|
-
|
|
111
|
-
else:
|
|
112
|
-
# try and find g++
|
|
113
|
-
return run_cmd("which g++").decode()
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
def get_cuda_toolkit_version(cuda_home):
|
|
117
|
-
try:
|
|
118
|
-
# the toolkit version can be obtained by running "nvcc --version"
|
|
119
|
-
nvcc_path = os.path.join(cuda_home, "bin", "nvcc")
|
|
120
|
-
nvcc_version_output = subprocess.check_output([nvcc_path, "--version"]).decode("utf-8")
|
|
121
|
-
# search for release substring (e.g., "release 11.5")
|
|
122
|
-
import re
|
|
123
|
-
|
|
124
|
-
m = re.search(r"(?<=release )\d+\.\d+", nvcc_version_output)
|
|
125
|
-
if m is not None:
|
|
126
|
-
return tuple(int(x) for x in m.group(0).split("."))
|
|
127
|
-
else:
|
|
128
|
-
raise Exception("Failed to parse NVCC output")
|
|
129
|
-
|
|
130
|
-
except Exception as e:
|
|
131
|
-
print(f"Failed to determine CUDA Toolkit version: {e}")
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def quote(path):
|
|
135
|
-
return '"' + path + '"'
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def build_dll_for_arch(args, dll_path, cpp_paths, cu_path, libs, arch, mode=None):
|
|
139
|
-
mode = args.mode if (mode is None) else mode
|
|
140
|
-
cuda_home = args.cuda_path
|
|
141
|
-
cuda_cmd = None
|
|
142
|
-
|
|
143
|
-
if args.quick:
|
|
144
|
-
cutlass_includes = ""
|
|
145
|
-
cutlass_enabled = "WP_ENABLE_CUTLASS=0"
|
|
146
|
-
else:
|
|
147
|
-
cutlass_home = "warp/native/cutlass"
|
|
148
|
-
cutlass_includes = f'-I"{cutlass_home}/include" -I"{cutlass_home}/tools/util/include"'
|
|
149
|
-
cutlass_enabled = "WP_ENABLE_CUTLASS=1"
|
|
150
|
-
|
|
151
|
-
if args.quick or cu_path is None:
|
|
152
|
-
cuda_compat_enabled = "WP_ENABLE_CUDA_COMPATIBILITY=0"
|
|
153
|
-
else:
|
|
154
|
-
cuda_compat_enabled = "WP_ENABLE_CUDA_COMPATIBILITY=1"
|
|
155
|
-
|
|
156
|
-
import pathlib
|
|
157
|
-
|
|
158
|
-
warp_home_path = pathlib.Path(__file__).parent
|
|
159
|
-
warp_home = warp_home_path.resolve()
|
|
160
|
-
nanovdb_home = warp_home_path.parent / "_build/host-deps/nanovdb/include"
|
|
161
|
-
|
|
162
|
-
# output stale, rebuild
|
|
163
|
-
if args.verbose:
|
|
164
|
-
print(f"Building {dll_path}")
|
|
165
|
-
|
|
166
|
-
native_dir = os.path.join(warp_home, "native")
|
|
167
|
-
|
|
168
|
-
if cu_path:
|
|
169
|
-
# check CUDA Toolkit version
|
|
170
|
-
min_ctk_version = (11, 5)
|
|
171
|
-
ctk_version = get_cuda_toolkit_version(cuda_home) or min_ctk_version
|
|
172
|
-
if ctk_version < min_ctk_version:
|
|
173
|
-
raise Exception(
|
|
174
|
-
f"CUDA Toolkit version {min_ctk_version[0]}.{min_ctk_version[1]}+ is required (found {ctk_version[0]}.{ctk_version[1]} in {cuda_home})"
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
gencode_opts = []
|
|
178
|
-
|
|
179
|
-
if args.quick:
|
|
180
|
-
# minimum supported architectures (PTX)
|
|
181
|
-
gencode_opts += ["-gencode=arch=compute_52,code=compute_52", "-gencode=arch=compute_75,code=compute_75"]
|
|
182
|
-
else:
|
|
183
|
-
# generate code for all supported architectures
|
|
184
|
-
gencode_opts += [
|
|
185
|
-
# SASS for supported desktop/datacenter architectures
|
|
186
|
-
"-gencode=arch=compute_52,code=sm_52", # Maxwell
|
|
187
|
-
"-gencode=arch=compute_60,code=sm_60", # Pascal
|
|
188
|
-
"-gencode=arch=compute_61,code=sm_61",
|
|
189
|
-
"-gencode=arch=compute_70,code=sm_70", # Volta
|
|
190
|
-
"-gencode=arch=compute_75,code=sm_75", # Turing
|
|
191
|
-
"-gencode=arch=compute_80,code=sm_80", # Ampere
|
|
192
|
-
"-gencode=arch=compute_86,code=sm_86",
|
|
193
|
-
]
|
|
194
|
-
if arch == "aarch64" and sys.platform == "linux":
|
|
195
|
-
gencode_opts += [
|
|
196
|
-
# SASS for supported mobile architectures (e.g. Tegra/Jetson)
|
|
197
|
-
"-gencode=arch=compute_53,code=sm_53", # X1
|
|
198
|
-
"-gencode=arch=compute_62,code=sm_62", # X2
|
|
199
|
-
"-gencode=arch=compute_72,code=sm_72", # Xavier
|
|
200
|
-
"-gencode=arch=compute_87,code=sm_87", # Orin
|
|
201
|
-
]
|
|
202
|
-
|
|
203
|
-
# support for Ada and Hopper is available with CUDA Toolkit 11.8+
|
|
204
|
-
if ctk_version >= (11, 8):
|
|
205
|
-
gencode_opts += [
|
|
206
|
-
"-gencode=arch=compute_89,code=sm_89", # Ada
|
|
207
|
-
"-gencode=arch=compute_90,code=sm_90", # Hopper
|
|
208
|
-
# PTX for future hardware
|
|
209
|
-
"-gencode=arch=compute_90,code=compute_90",
|
|
210
|
-
]
|
|
211
|
-
else:
|
|
212
|
-
gencode_opts += [
|
|
213
|
-
# PTX for future hardware
|
|
214
|
-
"-gencode=arch=compute_86,code=compute_86",
|
|
215
|
-
]
|
|
216
|
-
|
|
217
|
-
nvcc_opts = gencode_opts + [
|
|
218
|
-
"-t0", # multithreaded compilation
|
|
219
|
-
"--extended-lambda",
|
|
220
|
-
]
|
|
221
|
-
|
|
222
|
-
if args.fast_math:
|
|
223
|
-
nvcc_opts.append("--use_fast_math")
|
|
224
|
-
|
|
225
|
-
# is the library being built with CUDA enabled?
|
|
226
|
-
cuda_enabled = "WP_ENABLE_CUDA=1" if (cu_path is not None) else "WP_ENABLE_CUDA=0"
|
|
227
|
-
|
|
228
|
-
if os.name == "nt":
|
|
229
|
-
if args.host_compiler:
|
|
230
|
-
host_linker = os.path.join(os.path.dirname(args.host_compiler), "link.exe")
|
|
231
|
-
else:
|
|
232
|
-
raise RuntimeError("Warp build error: No host compiler was found")
|
|
233
|
-
|
|
234
|
-
cpp_includes = f' /I"{warp_home_path.parent}/external/llvm-project/out/install/{mode}-{arch}/include"'
|
|
235
|
-
cpp_includes += f' /I"{warp_home_path.parent}/_build/host-deps/llvm-project/release-{arch}/include"'
|
|
236
|
-
cuda_includes = f' /I"{cuda_home}/include"' if cu_path else ""
|
|
237
|
-
includes = cpp_includes + cuda_includes
|
|
238
|
-
|
|
239
|
-
# nvrtc_static.lib is built with /MT and _ITERATOR_DEBUG_LEVEL=0 so if we link it in we must match these options
|
|
240
|
-
if cu_path or mode != "debug":
|
|
241
|
-
runtime = "/MT"
|
|
242
|
-
iter_dbg = "_ITERATOR_DEBUG_LEVEL=0"
|
|
243
|
-
debug = "NDEBUG"
|
|
244
|
-
else:
|
|
245
|
-
runtime = "/MTd"
|
|
246
|
-
iter_dbg = "_ITERATOR_DEBUG_LEVEL=2"
|
|
247
|
-
debug = "_DEBUG"
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
build_dll_for_arch(args, dll_path, cpp_paths, cu_path, libs,
|
|
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 os
|
|
9
|
+
import platform
|
|
10
|
+
import subprocess
|
|
11
|
+
import sys
|
|
12
|
+
|
|
13
|
+
from warp.utils import ScopedTimer
|
|
14
|
+
|
|
15
|
+
verbose_cmd = True # print command lines before executing them
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# returns a canonical machine architecture string
|
|
19
|
+
# - "x86_64" for x86-64, aka. AMD64, aka. x64
|
|
20
|
+
# - "aarch64" for AArch64, aka. ARM64
|
|
21
|
+
def machine_architecture() -> str:
|
|
22
|
+
machine = platform.machine()
|
|
23
|
+
if machine == "x86_64" or machine == "AMD64":
|
|
24
|
+
return "x86_64"
|
|
25
|
+
if machine == "aarch64" or machine == "arm64":
|
|
26
|
+
return "aarch64"
|
|
27
|
+
raise RuntimeError(f"Unrecognized machine architecture {machine}")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def run_cmd(cmd):
|
|
31
|
+
if verbose_cmd:
|
|
32
|
+
print(cmd)
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
return subprocess.check_output(cmd, shell=True)
|
|
36
|
+
except subprocess.CalledProcessError as e:
|
|
37
|
+
if e.stdout:
|
|
38
|
+
print(e.stdout.decode())
|
|
39
|
+
if e.stderr:
|
|
40
|
+
print(e.stderr.decode())
|
|
41
|
+
raise (e)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# cut-down version of vcvars64.bat that allows using
|
|
45
|
+
# custom toolchain locations, returns the compiler program path
|
|
46
|
+
def set_msvc_env(msvc_path, sdk_path):
|
|
47
|
+
if "INCLUDE" not in os.environ:
|
|
48
|
+
os.environ["INCLUDE"] = ""
|
|
49
|
+
|
|
50
|
+
if "LIB" not in os.environ:
|
|
51
|
+
os.environ["LIB"] = ""
|
|
52
|
+
|
|
53
|
+
msvc_path = os.path.abspath(msvc_path)
|
|
54
|
+
sdk_path = os.path.abspath(sdk_path)
|
|
55
|
+
|
|
56
|
+
os.environ["INCLUDE"] += os.pathsep + os.path.join(msvc_path, "include")
|
|
57
|
+
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/winrt")
|
|
58
|
+
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/um")
|
|
59
|
+
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/ucrt")
|
|
60
|
+
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/shared")
|
|
61
|
+
|
|
62
|
+
os.environ["LIB"] += os.pathsep + os.path.join(msvc_path, "lib/x64")
|
|
63
|
+
os.environ["LIB"] += os.pathsep + os.path.join(sdk_path, "lib/ucrt/x64")
|
|
64
|
+
os.environ["LIB"] += os.pathsep + os.path.join(sdk_path, "lib/um/x64")
|
|
65
|
+
|
|
66
|
+
os.environ["PATH"] += os.pathsep + os.path.join(msvc_path, "bin/HostX64/x64")
|
|
67
|
+
os.environ["PATH"] += os.pathsep + os.path.join(sdk_path, "bin/x64")
|
|
68
|
+
|
|
69
|
+
return os.path.join(msvc_path, "bin", "HostX64", "x64", "cl.exe")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def find_host_compiler():
|
|
73
|
+
if os.name == "nt":
|
|
74
|
+
# try and find an installed host compiler (msvc)
|
|
75
|
+
# runs vcvars and copies back the build environment
|
|
76
|
+
|
|
77
|
+
vswhere_path = r"%ProgramFiles(x86)%/Microsoft Visual Studio/Installer/vswhere.exe"
|
|
78
|
+
vswhere_path = os.path.expandvars(vswhere_path)
|
|
79
|
+
if not os.path.exists(vswhere_path):
|
|
80
|
+
return ""
|
|
81
|
+
|
|
82
|
+
vs_path = run_cmd(f'"{vswhere_path}" -latest -property installationPath').decode().rstrip()
|
|
83
|
+
vsvars_path = os.path.join(vs_path, "VC\\Auxiliary\\Build\\vcvars64.bat")
|
|
84
|
+
|
|
85
|
+
output = run_cmd(f'"{vsvars_path}" && set').decode()
|
|
86
|
+
|
|
87
|
+
for line in output.splitlines():
|
|
88
|
+
pair = line.split("=", 1)
|
|
89
|
+
if len(pair) >= 2:
|
|
90
|
+
os.environ[pair[0]] = pair[1]
|
|
91
|
+
|
|
92
|
+
cl_path = run_cmd("where cl.exe").decode("utf-8").rstrip()
|
|
93
|
+
cl_version = os.environ["VCToolsVersion"].split(".")
|
|
94
|
+
|
|
95
|
+
# ensure at least VS2019 version, see list of MSVC versions here https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B
|
|
96
|
+
cl_required_major = 14
|
|
97
|
+
cl_required_minor = 29
|
|
98
|
+
|
|
99
|
+
if (
|
|
100
|
+
(int(cl_version[0]) < cl_required_major)
|
|
101
|
+
or (int(cl_version[0]) == cl_required_major)
|
|
102
|
+
and int(cl_version[1]) < cl_required_minor
|
|
103
|
+
):
|
|
104
|
+
print(
|
|
105
|
+
f"Warp: MSVC found but compiler version too old, found {cl_version[0]}.{cl_version[1]}, but must be {cl_required_major}.{cl_required_minor} or higher, kernel host compilation will be disabled."
|
|
106
|
+
)
|
|
107
|
+
return ""
|
|
108
|
+
|
|
109
|
+
return cl_path
|
|
110
|
+
|
|
111
|
+
else:
|
|
112
|
+
# try and find g++
|
|
113
|
+
return run_cmd("which g++").decode()
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def get_cuda_toolkit_version(cuda_home):
|
|
117
|
+
try:
|
|
118
|
+
# the toolkit version can be obtained by running "nvcc --version"
|
|
119
|
+
nvcc_path = os.path.join(cuda_home, "bin", "nvcc")
|
|
120
|
+
nvcc_version_output = subprocess.check_output([nvcc_path, "--version"]).decode("utf-8")
|
|
121
|
+
# search for release substring (e.g., "release 11.5")
|
|
122
|
+
import re
|
|
123
|
+
|
|
124
|
+
m = re.search(r"(?<=release )\d+\.\d+", nvcc_version_output)
|
|
125
|
+
if m is not None:
|
|
126
|
+
return tuple(int(x) for x in m.group(0).split("."))
|
|
127
|
+
else:
|
|
128
|
+
raise Exception("Failed to parse NVCC output")
|
|
129
|
+
|
|
130
|
+
except Exception as e:
|
|
131
|
+
print(f"Failed to determine CUDA Toolkit version: {e}")
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def quote(path):
|
|
135
|
+
return '"' + path + '"'
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def build_dll_for_arch(args, dll_path, cpp_paths, cu_path, libs, arch, mode=None):
|
|
139
|
+
mode = args.mode if (mode is None) else mode
|
|
140
|
+
cuda_home = args.cuda_path
|
|
141
|
+
cuda_cmd = None
|
|
142
|
+
|
|
143
|
+
if args.quick:
|
|
144
|
+
cutlass_includes = ""
|
|
145
|
+
cutlass_enabled = "WP_ENABLE_CUTLASS=0"
|
|
146
|
+
else:
|
|
147
|
+
cutlass_home = "warp/native/cutlass"
|
|
148
|
+
cutlass_includes = f'-I"{cutlass_home}/include" -I"{cutlass_home}/tools/util/include"'
|
|
149
|
+
cutlass_enabled = "WP_ENABLE_CUTLASS=1"
|
|
150
|
+
|
|
151
|
+
if args.quick or cu_path is None:
|
|
152
|
+
cuda_compat_enabled = "WP_ENABLE_CUDA_COMPATIBILITY=0"
|
|
153
|
+
else:
|
|
154
|
+
cuda_compat_enabled = "WP_ENABLE_CUDA_COMPATIBILITY=1"
|
|
155
|
+
|
|
156
|
+
import pathlib
|
|
157
|
+
|
|
158
|
+
warp_home_path = pathlib.Path(__file__).parent
|
|
159
|
+
warp_home = warp_home_path.resolve()
|
|
160
|
+
nanovdb_home = warp_home_path.parent / "_build/host-deps/nanovdb/include"
|
|
161
|
+
|
|
162
|
+
# output stale, rebuild
|
|
163
|
+
if args.verbose:
|
|
164
|
+
print(f"Building {dll_path}")
|
|
165
|
+
|
|
166
|
+
native_dir = os.path.join(warp_home, "native")
|
|
167
|
+
|
|
168
|
+
if cu_path:
|
|
169
|
+
# check CUDA Toolkit version
|
|
170
|
+
min_ctk_version = (11, 5)
|
|
171
|
+
ctk_version = get_cuda_toolkit_version(cuda_home) or min_ctk_version
|
|
172
|
+
if ctk_version < min_ctk_version:
|
|
173
|
+
raise Exception(
|
|
174
|
+
f"CUDA Toolkit version {min_ctk_version[0]}.{min_ctk_version[1]}+ is required (found {ctk_version[0]}.{ctk_version[1]} in {cuda_home})"
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
gencode_opts = []
|
|
178
|
+
|
|
179
|
+
if args.quick:
|
|
180
|
+
# minimum supported architectures (PTX)
|
|
181
|
+
gencode_opts += ["-gencode=arch=compute_52,code=compute_52", "-gencode=arch=compute_75,code=compute_75"]
|
|
182
|
+
else:
|
|
183
|
+
# generate code for all supported architectures
|
|
184
|
+
gencode_opts += [
|
|
185
|
+
# SASS for supported desktop/datacenter architectures
|
|
186
|
+
"-gencode=arch=compute_52,code=sm_52", # Maxwell
|
|
187
|
+
"-gencode=arch=compute_60,code=sm_60", # Pascal
|
|
188
|
+
"-gencode=arch=compute_61,code=sm_61",
|
|
189
|
+
"-gencode=arch=compute_70,code=sm_70", # Volta
|
|
190
|
+
"-gencode=arch=compute_75,code=sm_75", # Turing
|
|
191
|
+
"-gencode=arch=compute_80,code=sm_80", # Ampere
|
|
192
|
+
"-gencode=arch=compute_86,code=sm_86",
|
|
193
|
+
]
|
|
194
|
+
if arch == "aarch64" and sys.platform == "linux":
|
|
195
|
+
gencode_opts += [
|
|
196
|
+
# SASS for supported mobile architectures (e.g. Tegra/Jetson)
|
|
197
|
+
"-gencode=arch=compute_53,code=sm_53", # X1
|
|
198
|
+
"-gencode=arch=compute_62,code=sm_62", # X2
|
|
199
|
+
"-gencode=arch=compute_72,code=sm_72", # Xavier
|
|
200
|
+
"-gencode=arch=compute_87,code=sm_87", # Orin
|
|
201
|
+
]
|
|
202
|
+
|
|
203
|
+
# support for Ada and Hopper is available with CUDA Toolkit 11.8+
|
|
204
|
+
if ctk_version >= (11, 8):
|
|
205
|
+
gencode_opts += [
|
|
206
|
+
"-gencode=arch=compute_89,code=sm_89", # Ada
|
|
207
|
+
"-gencode=arch=compute_90,code=sm_90", # Hopper
|
|
208
|
+
# PTX for future hardware
|
|
209
|
+
"-gencode=arch=compute_90,code=compute_90",
|
|
210
|
+
]
|
|
211
|
+
else:
|
|
212
|
+
gencode_opts += [
|
|
213
|
+
# PTX for future hardware
|
|
214
|
+
"-gencode=arch=compute_86,code=compute_86",
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
nvcc_opts = gencode_opts + [
|
|
218
|
+
"-t0", # multithreaded compilation
|
|
219
|
+
"--extended-lambda",
|
|
220
|
+
]
|
|
221
|
+
|
|
222
|
+
if args.fast_math:
|
|
223
|
+
nvcc_opts.append("--use_fast_math")
|
|
224
|
+
|
|
225
|
+
# is the library being built with CUDA enabled?
|
|
226
|
+
cuda_enabled = "WP_ENABLE_CUDA=1" if (cu_path is not None) else "WP_ENABLE_CUDA=0"
|
|
227
|
+
|
|
228
|
+
if os.name == "nt":
|
|
229
|
+
if args.host_compiler:
|
|
230
|
+
host_linker = os.path.join(os.path.dirname(args.host_compiler), "link.exe")
|
|
231
|
+
else:
|
|
232
|
+
raise RuntimeError("Warp build error: No host compiler was found")
|
|
233
|
+
|
|
234
|
+
cpp_includes = f' /I"{warp_home_path.parent}/external/llvm-project/out/install/{mode}-{arch}/include"'
|
|
235
|
+
cpp_includes += f' /I"{warp_home_path.parent}/_build/host-deps/llvm-project/release-{arch}/include"'
|
|
236
|
+
cuda_includes = f' /I"{cuda_home}/include"' if cu_path else ""
|
|
237
|
+
includes = cpp_includes + cuda_includes
|
|
238
|
+
|
|
239
|
+
# nvrtc_static.lib is built with /MT and _ITERATOR_DEBUG_LEVEL=0 so if we link it in we must match these options
|
|
240
|
+
if cu_path or mode != "debug":
|
|
241
|
+
runtime = "/MT"
|
|
242
|
+
iter_dbg = "_ITERATOR_DEBUG_LEVEL=0"
|
|
243
|
+
debug = "NDEBUG"
|
|
244
|
+
else:
|
|
245
|
+
runtime = "/MTd"
|
|
246
|
+
iter_dbg = "_ITERATOR_DEBUG_LEVEL=2"
|
|
247
|
+
debug = "_DEBUG"
|
|
248
|
+
|
|
249
|
+
cpp_flags = f'/nologo /std:c++17 /GR- {runtime} /D "{debug}" /D "{cuda_enabled}" /D "{cutlass_enabled}" /D "{cuda_compat_enabled}" /D "{iter_dbg}" /I"{native_dir}" /I"{nanovdb_home}" {includes} '
|
|
250
|
+
|
|
251
|
+
if args.mode == "debug":
|
|
252
|
+
cpp_flags += "/Zi /Od /D WP_ENABLE_DEBUG=1"
|
|
253
|
+
linkopts = ["/DLL", "/DEBUG"]
|
|
254
|
+
elif args.mode == "release":
|
|
255
|
+
cpp_flags += "/Ox /D WP_ENABLE_DEBUG=0"
|
|
256
|
+
linkopts = ["/DLL"]
|
|
257
|
+
else:
|
|
258
|
+
raise RuntimeError(f"Unrecognized build configuration (debug, release), got: {args.mode}")
|
|
259
|
+
|
|
260
|
+
if args.verify_fp:
|
|
261
|
+
cpp_flags += ' /D "WP_VERIFY_FP"'
|
|
262
|
+
|
|
263
|
+
if args.fast_math:
|
|
264
|
+
cpp_flags += " /fp:fast"
|
|
265
|
+
|
|
266
|
+
with ScopedTimer("build", active=args.verbose):
|
|
267
|
+
for cpp_path in cpp_paths:
|
|
268
|
+
cpp_out = cpp_path + ".obj"
|
|
269
|
+
linkopts.append(quote(cpp_out))
|
|
270
|
+
|
|
271
|
+
cpp_cmd = f'"{args.host_compiler}" {cpp_flags} -c "{cpp_path}" /Fo"{cpp_out}"'
|
|
272
|
+
run_cmd(cpp_cmd)
|
|
273
|
+
|
|
274
|
+
if cu_path:
|
|
275
|
+
cu_out = cu_path + ".o"
|
|
276
|
+
|
|
277
|
+
if mode == "debug":
|
|
278
|
+
cuda_cmd = f'"{cuda_home}/bin/nvcc" --compiler-options=/MT,/Zi,/Od -g -G -O0 -DNDEBUG -D_ITERATOR_DEBUG_LEVEL=0 -I"{native_dir}" -I"{nanovdb_home}" -line-info {" ".join(nvcc_opts)} -DWP_ENABLE_CUDA=1 -D{cutlass_enabled} {cutlass_includes} -o "{cu_out}" -c "{cu_path}"'
|
|
279
|
+
|
|
280
|
+
elif mode == "release":
|
|
281
|
+
cuda_cmd = f'"{cuda_home}/bin/nvcc" -O3 {" ".join(nvcc_opts)} -I"{native_dir}" -I"{nanovdb_home}" -DNDEBUG -DWP_ENABLE_CUDA=1 -D{cutlass_enabled} {cutlass_includes} -o "{cu_out}" -c "{cu_path}"'
|
|
282
|
+
|
|
283
|
+
with ScopedTimer("build_cuda", active=args.verbose):
|
|
284
|
+
run_cmd(cuda_cmd)
|
|
285
|
+
linkopts.append(quote(cu_out))
|
|
286
|
+
linkopts.append(
|
|
287
|
+
f'cudart_static.lib nvrtc_static.lib nvrtc-builtins_static.lib nvptxcompiler_static.lib ws2_32.lib user32.lib /LIBPATH:"{cuda_home}/lib/x64"'
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
with ScopedTimer("link", active=args.verbose):
|
|
291
|
+
link_cmd = f'"{host_linker}" {" ".join(linkopts + libs)} /out:"{dll_path}"'
|
|
292
|
+
run_cmd(link_cmd)
|
|
293
|
+
|
|
294
|
+
else:
|
|
295
|
+
cpp_includes = f' -I"{warp_home_path.parent}/external/llvm-project/out/install/{mode}-{arch}/include"'
|
|
296
|
+
cpp_includes += f' -I"{warp_home_path.parent}/_build/host-deps/llvm-project/release-{arch}/include"'
|
|
297
|
+
cuda_includes = f' -I"{cuda_home}/include"' if cu_path else ""
|
|
298
|
+
includes = cpp_includes + cuda_includes
|
|
299
|
+
|
|
300
|
+
if sys.platform == "darwin":
|
|
301
|
+
version = f"--target={arch}-apple-macos11"
|
|
302
|
+
else:
|
|
303
|
+
version = "-fabi-version=13" # GCC 8.2+
|
|
304
|
+
|
|
305
|
+
cpp_flags = f'{version} --std=c++17 -fno-rtti -D{cuda_enabled} -D{cutlass_enabled} -D{cuda_compat_enabled} -fPIC -fvisibility=hidden -D_GLIBCXX_USE_CXX11_ABI=0 -I"{native_dir}" {includes} '
|
|
306
|
+
|
|
307
|
+
if mode == "debug":
|
|
308
|
+
cpp_flags += "-O0 -g -D_DEBUG -DWP_ENABLE_DEBUG=1 -fkeep-inline-functions"
|
|
309
|
+
|
|
310
|
+
if mode == "release":
|
|
311
|
+
cpp_flags += "-O3 -DNDEBUG -DWP_ENABLE_DEBUG=0"
|
|
312
|
+
|
|
313
|
+
if args.verify_fp:
|
|
314
|
+
cpp_flags += " -DWP_VERIFY_FP"
|
|
315
|
+
|
|
316
|
+
if args.fast_math:
|
|
317
|
+
cpp_flags += " -ffast-math"
|
|
318
|
+
|
|
319
|
+
ld_inputs = []
|
|
320
|
+
|
|
321
|
+
with ScopedTimer("build", active=args.verbose):
|
|
322
|
+
for cpp_path in cpp_paths:
|
|
323
|
+
cpp_out = cpp_path + ".o"
|
|
324
|
+
ld_inputs.append(quote(cpp_out))
|
|
325
|
+
|
|
326
|
+
build_cmd = f'g++ {cpp_flags} -c "{cpp_path}" -o "{cpp_out}"'
|
|
327
|
+
run_cmd(build_cmd)
|
|
328
|
+
|
|
329
|
+
if cu_path:
|
|
330
|
+
cu_out = cu_path + ".o"
|
|
331
|
+
|
|
332
|
+
if mode == "debug":
|
|
333
|
+
cuda_cmd = f'"{cuda_home}/bin/nvcc" -g -G -O0 --compiler-options -fPIC,-fvisibility=hidden -D_DEBUG -D_ITERATOR_DEBUG_LEVEL=0 -line-info {" ".join(nvcc_opts)} -DWP_ENABLE_CUDA=1 -I"{native_dir}" -D{cutlass_enabled} {cutlass_includes} -o "{cu_out}" -c "{cu_path}"'
|
|
334
|
+
|
|
335
|
+
elif mode == "release":
|
|
336
|
+
cuda_cmd = f'"{cuda_home}/bin/nvcc" -O3 --compiler-options -fPIC,-fvisibility=hidden {" ".join(nvcc_opts)} -DNDEBUG -DWP_ENABLE_CUDA=1 -I"{native_dir}" -D{cutlass_enabled} {cutlass_includes} -o "{cu_out}" -c "{cu_path}"'
|
|
337
|
+
|
|
338
|
+
with ScopedTimer("build_cuda", active=args.verbose):
|
|
339
|
+
run_cmd(cuda_cmd)
|
|
340
|
+
|
|
341
|
+
ld_inputs.append(quote(cu_out))
|
|
342
|
+
ld_inputs.append(
|
|
343
|
+
f'-L"{cuda_home}/lib64" -lcudart_static -lnvrtc_static -lnvrtc-builtins_static -lnvptxcompiler_static -lpthread -ldl -lrt'
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
if sys.platform == "darwin":
|
|
347
|
+
opt_no_undefined = "-Wl,-undefined,error"
|
|
348
|
+
opt_exclude_libs = ""
|
|
349
|
+
else:
|
|
350
|
+
opt_no_undefined = "-Wl,--no-undefined"
|
|
351
|
+
opt_exclude_libs = "-Wl,--exclude-libs,ALL"
|
|
352
|
+
|
|
353
|
+
with ScopedTimer("link", active=args.verbose):
|
|
354
|
+
origin = "@loader_path" if (sys.platform == "darwin") else "$ORIGIN"
|
|
355
|
+
link_cmd = f"g++ {version} -shared -Wl,-rpath,'{origin}' {opt_no_undefined} {opt_exclude_libs} -o '{dll_path}' {' '.join(ld_inputs + libs)}"
|
|
356
|
+
run_cmd(link_cmd)
|
|
357
|
+
|
|
358
|
+
# Strip symbols to reduce the binary size
|
|
359
|
+
if mode == "release":
|
|
360
|
+
if sys.platform == "darwin":
|
|
361
|
+
run_cmd(f"strip -x {dll_path}") # Strip all local symbols
|
|
362
|
+
else: # Linux
|
|
363
|
+
# Strip all symbols except for those needed to support debugging JIT-compiled code
|
|
364
|
+
run_cmd(
|
|
365
|
+
f"strip --strip-all --keep-symbol=__jit_debug_register_code --keep-symbol=__jit_debug_descriptor {dll_path}"
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def build_dll(args, dll_path, cpp_paths, cu_path, libs=None):
|
|
370
|
+
if libs is None:
|
|
371
|
+
libs = []
|
|
372
|
+
|
|
373
|
+
if sys.platform == "darwin":
|
|
374
|
+
# create a universal binary by combining x86-64 and AArch64 builds
|
|
375
|
+
build_dll_for_arch(args, dll_path + "-x86_64", cpp_paths, cu_path, libs, "x86_64")
|
|
376
|
+
build_dll_for_arch(args, dll_path + "-aarch64", cpp_paths, cu_path, libs, "aarch64")
|
|
377
|
+
|
|
378
|
+
run_cmd(f"lipo -create -output {dll_path} {dll_path}-x86_64 {dll_path}-aarch64")
|
|
379
|
+
os.remove(f"{dll_path}-x86_64")
|
|
380
|
+
os.remove(f"{dll_path}-aarch64")
|
|
381
|
+
|
|
382
|
+
else:
|
|
383
|
+
build_dll_for_arch(args, dll_path, cpp_paths, cu_path, libs, machine_architecture())
|