warp-lang 1.9.1__py3-none-win_amd64.whl → 1.10.0rc2__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 +301 -287
- warp/__init__.pyi +794 -305
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1075 -0
- warp/_src/build.py +618 -0
- warp/_src/build_dll.py +640 -0
- warp/{builtins.py → _src/builtins.py} +1382 -377
- warp/_src/codegen.py +4359 -0
- warp/{config.py → _src/config.py} +178 -169
- warp/_src/constants.py +57 -0
- warp/_src/context.py +8294 -0
- warp/_src/dlpack.py +462 -0
- warp/_src/fabric.py +355 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +508 -0
- warp/_src/fem/cache.py +687 -0
- warp/_src/fem/dirichlet.py +188 -0
- warp/{fem → _src/fem}/domain.py +40 -30
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +701 -0
- warp/{fem → _src/fem}/field/nodal_field.py +30 -15
- warp/{fem → _src/fem}/field/restriction.py +1 -1
- warp/{fem → _src/fem}/field/virtual.py +53 -27
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
- warp/_src/fem/geometry/closest_point.py +97 -0
- warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
- warp/{fem → _src/fem}/geometry/element.py +32 -10
- warp/{fem → _src/fem}/geometry/geometry.py +48 -20
- warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
- warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
- warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
- warp/{fem → _src/fem}/geometry/partition.py +121 -63
- warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
- warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
- warp/{fem → _src/fem}/integrate.py +164 -158
- warp/_src/fem/linalg.py +383 -0
- warp/_src/fem/operator.py +396 -0
- warp/_src/fem/polynomial.py +229 -0
- warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
- warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
- warp/_src/fem/space/__init__.py +248 -0
- warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
- warp/_src/fem/space/basis_space.py +679 -0
- warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
- warp/{fem → _src/fem}/space/function_space.py +14 -13
- warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
- warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
- warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
- warp/{fem → _src/fem}/space/partition.py +117 -60
- warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/restriction.py +66 -33
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
- warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
- warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
- warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
- warp/_src/fem/space/topology.py +459 -0
- warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
- warp/_src/fem/types.py +112 -0
- warp/_src/fem/utils.py +486 -0
- warp/_src/jax.py +186 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +387 -0
- warp/_src/jax_experimental/ffi.py +1284 -0
- warp/_src/jax_experimental/xla_ffi.py +656 -0
- warp/_src/marching_cubes.py +708 -0
- warp/_src/math.py +414 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +163 -0
- warp/_src/optim/linear.py +1606 -0
- warp/_src/optim/sgd.py +112 -0
- warp/_src/paddle.py +406 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +289 -0
- warp/_src/render/render_opengl.py +3636 -0
- warp/_src/render/render_usd.py +937 -0
- warp/_src/render/utils.py +160 -0
- warp/_src/sparse.py +2716 -0
- warp/_src/tape.py +1206 -0
- warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
- warp/_src/torch.py +391 -0
- warp/_src/types.py +5870 -0
- warp/_src/utils.py +1693 -0
- warp/autograd.py +12 -1054
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +8 -588
- warp/build_dll.py +6 -721
- warp/codegen.py +6 -4251
- warp/constants.py +6 -39
- warp/context.py +12 -8062
- warp/dlpack.py +6 -444
- warp/examples/distributed/example_jacobi_mpi.py +4 -5
- warp/examples/fem/example_adaptive_grid.py +1 -1
- warp/examples/fem/example_apic_fluid.py +1 -1
- warp/examples/fem/example_burgers.py +8 -8
- warp/examples/fem/example_diffusion.py +1 -1
- warp/examples/fem/example_distortion_energy.py +1 -1
- warp/examples/fem/example_mixed_elasticity.py +2 -2
- warp/examples/fem/example_navier_stokes.py +1 -1
- warp/examples/fem/example_nonconforming_contact.py +7 -7
- warp/examples/fem/example_stokes.py +1 -1
- warp/examples/fem/example_stokes_transfer.py +1 -1
- warp/examples/fem/utils.py +2 -2
- warp/examples/interop/example_jax_callable.py +1 -1
- warp/examples/interop/example_jax_ffi_callback.py +1 -1
- warp/examples/interop/example_jax_kernel.py +1 -1
- warp/examples/tile/example_tile_mcgp.py +191 -0
- warp/fabric.py +6 -337
- warp/fem/__init__.py +159 -97
- warp/fem/adaptivity.py +7 -489
- warp/fem/cache.py +9 -648
- warp/fem/dirichlet.py +6 -184
- warp/fem/field/__init__.py +8 -109
- warp/fem/field/field.py +7 -652
- warp/fem/geometry/__init__.py +7 -18
- warp/fem/geometry/closest_point.py +11 -77
- warp/fem/linalg.py +18 -366
- warp/fem/operator.py +11 -369
- warp/fem/polynomial.py +9 -209
- warp/fem/space/__init__.py +5 -211
- warp/fem/space/basis_space.py +6 -662
- warp/fem/space/shape/__init__.py +41 -118
- warp/fem/space/topology.py +6 -437
- warp/fem/types.py +6 -81
- warp/fem/utils.py +11 -444
- warp/jax.py +8 -165
- warp/jax_experimental/__init__.py +14 -1
- warp/jax_experimental/custom_call.py +8 -365
- warp/jax_experimental/ffi.py +17 -873
- warp/jax_experimental/xla_ffi.py +5 -605
- warp/marching_cubes.py +5 -689
- warp/math.py +16 -393
- warp/native/array.h +385 -37
- warp/native/builtin.h +314 -37
- warp/native/bvh.cpp +43 -9
- warp/native/bvh.cu +62 -27
- warp/native/bvh.h +310 -309
- warp/native/clang/clang.cpp +102 -97
- warp/native/coloring.cpp +0 -1
- warp/native/crt.h +208 -0
- warp/native/exports.h +156 -0
- warp/native/hashgrid.cu +2 -0
- warp/native/intersect.h +24 -1
- warp/native/intersect_tri.h +44 -35
- warp/native/mat.h +1456 -276
- warp/native/mesh.cpp +4 -4
- warp/native/mesh.cu +4 -2
- warp/native/mesh.h +176 -61
- warp/native/quat.h +0 -52
- warp/native/scan.cu +2 -0
- warp/native/sparse.cu +7 -3
- warp/native/spatial.h +12 -0
- warp/native/tile.h +681 -89
- warp/native/tile_radix_sort.h +1 -1
- warp/native/tile_reduce.h +394 -46
- warp/native/tile_scan.h +4 -4
- warp/native/vec.h +469 -0
- warp/native/version.h +23 -0
- warp/native/volume.cpp +1 -1
- warp/native/volume.cu +1 -0
- warp/native/volume.h +1 -1
- warp/native/volume_builder.cu +2 -0
- warp/native/warp.cpp +57 -29
- warp/native/warp.cu +253 -171
- warp/native/warp.h +11 -8
- warp/optim/__init__.py +6 -3
- warp/optim/adam.py +6 -145
- warp/optim/linear.py +14 -1585
- warp/optim/sgd.py +6 -94
- warp/paddle.py +6 -388
- warp/render/__init__.py +8 -4
- warp/render/imgui_manager.py +7 -267
- warp/render/render_opengl.py +6 -3618
- warp/render/render_usd.py +6 -919
- warp/render/utils.py +6 -142
- warp/sparse.py +37 -2563
- warp/tape.py +6 -1188
- warp/tests/__main__.py +1 -1
- warp/tests/cuda/test_async.py +4 -4
- warp/tests/cuda/test_conditional_captures.py +1 -1
- warp/tests/cuda/test_multigpu.py +1 -1
- warp/tests/cuda/test_streams.py +58 -1
- warp/tests/geometry/test_bvh.py +157 -22
- warp/tests/geometry/test_marching_cubes.py +0 -1
- warp/tests/geometry/test_mesh.py +5 -3
- warp/tests/geometry/test_mesh_query_aabb.py +5 -12
- warp/tests/geometry/test_mesh_query_point.py +5 -2
- warp/tests/geometry/test_mesh_query_ray.py +15 -3
- warp/tests/geometry/test_volume_write.py +5 -5
- warp/tests/interop/test_dlpack.py +14 -14
- warp/tests/interop/test_jax.py +772 -49
- warp/tests/interop/test_paddle.py +1 -1
- warp/tests/test_adam.py +0 -1
- warp/tests/test_arithmetic.py +9 -9
- warp/tests/test_array.py +527 -100
- warp/tests/test_array_reduce.py +3 -3
- warp/tests/test_atomic.py +12 -8
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +4 -4
- warp/tests/test_bool.py +2 -2
- warp/tests/test_builtins_resolution.py +5 -571
- warp/tests/test_codegen.py +33 -14
- warp/tests/test_conditional.py +1 -1
- warp/tests/test_context.py +6 -6
- warp/tests/test_copy.py +242 -161
- warp/tests/test_ctypes.py +3 -3
- warp/tests/test_devices.py +24 -2
- warp/tests/test_examples.py +16 -84
- warp/tests/test_fabricarray.py +35 -35
- warp/tests/test_fast_math.py +0 -2
- warp/tests/test_fem.py +56 -10
- warp/tests/test_fixedarray.py +3 -3
- warp/tests/test_func.py +8 -5
- warp/tests/test_generics.py +1 -1
- warp/tests/test_indexedarray.py +24 -24
- warp/tests/test_intersect.py +39 -9
- warp/tests/test_large.py +1 -1
- warp/tests/test_lerp.py +3 -1
- warp/tests/test_linear_solvers.py +1 -1
- warp/tests/test_map.py +35 -4
- warp/tests/test_mat.py +52 -62
- warp/tests/test_mat_constructors.py +4 -5
- warp/tests/test_mat_lite.py +1 -1
- warp/tests/test_mat_scalar_ops.py +121 -121
- warp/tests/test_math.py +34 -0
- warp/tests/test_module_aot.py +4 -4
- warp/tests/test_modules_lite.py +28 -2
- warp/tests/test_print.py +11 -11
- warp/tests/test_quat.py +93 -58
- warp/tests/test_runlength_encode.py +1 -1
- warp/tests/test_scalar_ops.py +38 -10
- warp/tests/test_smoothstep.py +1 -1
- warp/tests/test_sparse.py +126 -15
- warp/tests/test_spatial.py +105 -87
- warp/tests/test_special_values.py +6 -6
- warp/tests/test_static.py +7 -7
- warp/tests/test_struct.py +13 -2
- warp/tests/test_triangle_closest_point.py +48 -1
- warp/tests/test_types.py +27 -15
- warp/tests/test_utils.py +52 -52
- warp/tests/test_vec.py +29 -29
- warp/tests/test_vec_constructors.py +5 -5
- warp/tests/test_vec_scalar_ops.py +97 -97
- warp/tests/test_version.py +75 -0
- warp/tests/tile/test_tile.py +178 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +7 -4
- warp/tests/tile/test_tile_load.py +26 -2
- warp/tests/tile/test_tile_mathdx.py +3 -3
- warp/tests/tile/test_tile_matmul.py +1 -1
- warp/tests/tile/test_tile_mlp.py +2 -4
- warp/tests/tile/test_tile_reduce.py +214 -13
- warp/tests/unittest_suites.py +6 -14
- warp/tests/unittest_utils.py +10 -9
- warp/tests/walkthrough_debug.py +3 -1
- warp/torch.py +6 -373
- warp/types.py +29 -5764
- warp/utils.py +10 -1659
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +46 -99
- warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- warp/examples/assets/cartpole.urdf +0 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/nv_ant.xml +0 -92
- warp/examples/assets/nv_humanoid.xml +0 -183
- warp/examples/assets/quadruped.urdf +0 -268
- warp/examples/optim/example_bounce.py +0 -266
- warp/examples/optim/example_cloth_throw.py +0 -228
- warp/examples/optim/example_drone.py +0 -870
- warp/examples/optim/example_inverse_kinematics.py +0 -182
- warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
- warp/examples/optim/example_softbody_properties.py +0 -400
- warp/examples/optim/example_spring_cage.py +0 -245
- warp/examples/optim/example_trajectory.py +0 -227
- warp/examples/sim/example_cartpole.py +0 -143
- warp/examples/sim/example_cloth.py +0 -225
- warp/examples/sim/example_cloth_self_contact.py +0 -316
- warp/examples/sim/example_granular.py +0 -130
- warp/examples/sim/example_granular_collision_sdf.py +0 -202
- warp/examples/sim/example_jacobian_ik.py +0 -244
- warp/examples/sim/example_particle_chain.py +0 -124
- warp/examples/sim/example_quadruped.py +0 -203
- warp/examples/sim/example_rigid_chain.py +0 -203
- warp/examples/sim/example_rigid_contact.py +0 -195
- warp/examples/sim/example_rigid_force.py +0 -133
- warp/examples/sim/example_rigid_gyroscopic.py +0 -115
- warp/examples/sim/example_rigid_soft_contact.py +0 -140
- warp/examples/sim/example_soft_body.py +0 -196
- warp/examples/tile/example_tile_walker.py +0 -327
- warp/sim/__init__.py +0 -74
- warp/sim/articulation.py +0 -793
- warp/sim/collide.py +0 -2570
- warp/sim/graph_coloring.py +0 -307
- warp/sim/import_mjcf.py +0 -791
- warp/sim/import_snu.py +0 -227
- warp/sim/import_urdf.py +0 -579
- warp/sim/import_usd.py +0 -898
- warp/sim/inertia.py +0 -357
- warp/sim/integrator.py +0 -245
- warp/sim/integrator_euler.py +0 -2000
- warp/sim/integrator_featherstone.py +0 -2101
- warp/sim/integrator_vbd.py +0 -2487
- warp/sim/integrator_xpbd.py +0 -3295
- warp/sim/model.py +0 -4821
- warp/sim/particles.py +0 -121
- warp/sim/render.py +0 -431
- warp/sim/utils.py +0 -431
- warp/tests/sim/disabled_kinematics.py +0 -244
- warp/tests/sim/test_cloth.py +0 -863
- warp/tests/sim/test_collision.py +0 -743
- warp/tests/sim/test_coloring.py +0 -347
- warp/tests/sim/test_inertia.py +0 -161
- warp/tests/sim/test_model.py +0 -226
- warp/tests/sim/test_sim_grad.py +0 -287
- warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
- warp/tests/sim/test_sim_kinematics.py +0 -98
- warp/thirdparty/__init__.py +0 -0
- warp_lang-1.9.1.dist-info/RECORD +0 -456
- /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
- /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
warp/_src/build_dll.py
ADDED
|
@@ -0,0 +1,640 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import concurrent.futures
|
|
19
|
+
import os
|
|
20
|
+
import platform
|
|
21
|
+
import subprocess
|
|
22
|
+
import sys
|
|
23
|
+
import time
|
|
24
|
+
|
|
25
|
+
from warp._src.utils import ScopedTimer
|
|
26
|
+
|
|
27
|
+
verbose_cmd = True # print command lines before executing them
|
|
28
|
+
|
|
29
|
+
MIN_CTK_VERSION = (12, 0)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def machine_architecture() -> str:
|
|
33
|
+
"""Return a canonical machine architecture string.
|
|
34
|
+
- "x86_64" for x86-64, aka. AMD64, aka. x64
|
|
35
|
+
- "aarch64" for AArch64, aka. ARM64
|
|
36
|
+
"""
|
|
37
|
+
machine = platform.machine()
|
|
38
|
+
if machine == "x86_64" or machine == "AMD64":
|
|
39
|
+
return "x86_64"
|
|
40
|
+
if machine == "aarch64" or machine == "arm64":
|
|
41
|
+
return "aarch64"
|
|
42
|
+
raise RuntimeError(f"Unrecognized machine architecture {machine}")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def run_cmd(cmd):
|
|
46
|
+
if verbose_cmd:
|
|
47
|
+
print(cmd)
|
|
48
|
+
|
|
49
|
+
try:
|
|
50
|
+
return subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
|
|
51
|
+
except subprocess.CalledProcessError as e:
|
|
52
|
+
print("Command failed with exit code:", e.returncode)
|
|
53
|
+
print("Command output was:")
|
|
54
|
+
print(e.output.decode())
|
|
55
|
+
raise e
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# cut-down version of vcvars64.bat that allows using
|
|
59
|
+
# custom toolchain locations, returns the compiler program path
|
|
60
|
+
def set_msvc_env(msvc_path, sdk_path):
|
|
61
|
+
if "INCLUDE" not in os.environ:
|
|
62
|
+
os.environ["INCLUDE"] = ""
|
|
63
|
+
|
|
64
|
+
if "LIB" not in os.environ:
|
|
65
|
+
os.environ["LIB"] = ""
|
|
66
|
+
|
|
67
|
+
msvc_path = os.path.abspath(msvc_path)
|
|
68
|
+
sdk_path = os.path.abspath(sdk_path)
|
|
69
|
+
|
|
70
|
+
os.environ["INCLUDE"] += os.pathsep + os.path.join(msvc_path, "include")
|
|
71
|
+
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/winrt")
|
|
72
|
+
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/um")
|
|
73
|
+
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/ucrt")
|
|
74
|
+
os.environ["INCLUDE"] += os.pathsep + os.path.join(sdk_path, "include/shared")
|
|
75
|
+
|
|
76
|
+
os.environ["LIB"] += os.pathsep + os.path.join(msvc_path, "lib/x64")
|
|
77
|
+
os.environ["LIB"] += os.pathsep + os.path.join(sdk_path, "lib/ucrt/x64")
|
|
78
|
+
os.environ["LIB"] += os.pathsep + os.path.join(sdk_path, "lib/um/x64")
|
|
79
|
+
|
|
80
|
+
os.environ["PATH"] += os.pathsep + os.path.join(msvc_path, "bin/HostX64/x64")
|
|
81
|
+
os.environ["PATH"] += os.pathsep + os.path.join(sdk_path, "bin/x64")
|
|
82
|
+
|
|
83
|
+
return os.path.join(msvc_path, "bin", "HostX64", "x64", "cl.exe")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def find_host_compiler():
|
|
87
|
+
if os.name == "nt":
|
|
88
|
+
# try and find an installed host compiler (msvc)
|
|
89
|
+
# runs vcvars and copies back the build environment
|
|
90
|
+
|
|
91
|
+
vswhere_path = r"%ProgramFiles(x86)%/Microsoft Visual Studio/Installer/vswhere.exe"
|
|
92
|
+
vswhere_path = os.path.expandvars(vswhere_path)
|
|
93
|
+
if not os.path.exists(vswhere_path):
|
|
94
|
+
return ""
|
|
95
|
+
|
|
96
|
+
vs_path = run_cmd(f'"{vswhere_path}" -latest -property installationPath').decode().rstrip()
|
|
97
|
+
vsvars_path = os.path.join(vs_path, "VC\\Auxiliary\\Build\\vcvars64.bat")
|
|
98
|
+
|
|
99
|
+
output = run_cmd(f'"{vsvars_path}" && set').decode()
|
|
100
|
+
|
|
101
|
+
for line in output.splitlines():
|
|
102
|
+
pair = line.split("=", 1)
|
|
103
|
+
if len(pair) >= 2:
|
|
104
|
+
os.environ[pair[0]] = pair[1]
|
|
105
|
+
|
|
106
|
+
cl_path = run_cmd("where cl.exe").decode("utf-8").rstrip()
|
|
107
|
+
cl_version = os.environ["VCToolsVersion"].split(".")
|
|
108
|
+
|
|
109
|
+
# ensure at least VS2019 version, see list of MSVC versions here https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B
|
|
110
|
+
cl_required_major = 14
|
|
111
|
+
cl_required_minor = 29
|
|
112
|
+
|
|
113
|
+
if int(cl_version[0]) < cl_required_major or (
|
|
114
|
+
(int(cl_version[0]) == cl_required_major) and (int(cl_version[1]) < cl_required_minor)
|
|
115
|
+
):
|
|
116
|
+
print(
|
|
117
|
+
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."
|
|
118
|
+
)
|
|
119
|
+
return ""
|
|
120
|
+
|
|
121
|
+
return cl_path
|
|
122
|
+
|
|
123
|
+
else:
|
|
124
|
+
# try and find g++
|
|
125
|
+
return run_cmd("which g++").decode()
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def get_cuda_toolkit_version(cuda_home) -> tuple[int, int]:
|
|
129
|
+
try:
|
|
130
|
+
# the toolkit version can be obtained by running "nvcc --version"
|
|
131
|
+
nvcc_path = os.path.join(cuda_home, "bin", "nvcc")
|
|
132
|
+
nvcc_version_output = subprocess.check_output([nvcc_path, "--version"]).decode("utf-8")
|
|
133
|
+
# search for release substring (e.g., "release 11.5")
|
|
134
|
+
import re
|
|
135
|
+
|
|
136
|
+
m = re.search(r"release (\d+)\.(\d+)", nvcc_version_output)
|
|
137
|
+
if m is not None:
|
|
138
|
+
major, minor = map(int, m.groups())
|
|
139
|
+
return (major, minor)
|
|
140
|
+
else:
|
|
141
|
+
raise Exception("Failed to parse NVCC output")
|
|
142
|
+
|
|
143
|
+
except Exception as e:
|
|
144
|
+
print(f"Warning: Failed to determine CUDA Toolkit version: {e}")
|
|
145
|
+
return MIN_CTK_VERSION
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def quote(path):
|
|
149
|
+
return '"' + path + '"'
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def add_llvm_bin_to_path(args):
|
|
153
|
+
"""Add the LLVM bin directory to the PATH environment variable if it's set.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
args: The argument namespace containing llvm_path.
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
``True`` if the PATH was updated, ``False`` otherwise.
|
|
160
|
+
"""
|
|
161
|
+
if not hasattr(args, "llvm_path") or not args.llvm_path:
|
|
162
|
+
return False
|
|
163
|
+
|
|
164
|
+
# Construct the bin directory path
|
|
165
|
+
llvm_bin_path = os.path.join(args.llvm_path, "bin")
|
|
166
|
+
|
|
167
|
+
# Check if the directory exists
|
|
168
|
+
if not os.path.isdir(llvm_bin_path):
|
|
169
|
+
print(f"Warning: LLVM bin directory not found at {llvm_bin_path}")
|
|
170
|
+
return False
|
|
171
|
+
|
|
172
|
+
# Add to PATH environment variable
|
|
173
|
+
os.environ["PATH"] = llvm_bin_path + os.pathsep + os.environ.get("PATH", "")
|
|
174
|
+
|
|
175
|
+
print(f"Added {llvm_bin_path} to PATH")
|
|
176
|
+
return True
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def _get_architectures_cu12(
|
|
180
|
+
ctk_version: tuple[int, int], arch: str, target_platform: str, quick_build: bool = False
|
|
181
|
+
) -> tuple[list[str], list[str]]:
|
|
182
|
+
"""Get architecture flags for CUDA 12.x."""
|
|
183
|
+
gencode_opts = []
|
|
184
|
+
clang_arch_flags = []
|
|
185
|
+
|
|
186
|
+
if quick_build:
|
|
187
|
+
gencode_opts = ["-gencode=arch=compute_52,code=compute_52", "-gencode=arch=compute_75,code=compute_75"]
|
|
188
|
+
clang_arch_flags = ["--cuda-gpu-arch=sm_52", "--cuda-gpu-arch=sm_75"]
|
|
189
|
+
else:
|
|
190
|
+
if arch == "aarch64" and target_platform == "linux" and ctk_version == (12, 9):
|
|
191
|
+
# Skip certain architectures for aarch64 with CUDA 12.9 due to CCCL bug
|
|
192
|
+
print(
|
|
193
|
+
"[INFO] Skipping sm_52, sm_60, sm_61, and sm_70 targets for ARM due to a CUDA Toolkit bug. "
|
|
194
|
+
"See https://nvidia.github.io/warp/installation.html#cuda-12-9-limitation-on-linux-arm-platforms "
|
|
195
|
+
"for details."
|
|
196
|
+
)
|
|
197
|
+
else:
|
|
198
|
+
gencode_opts.extend(
|
|
199
|
+
[
|
|
200
|
+
"-gencode=arch=compute_52,code=sm_52", # Maxwell
|
|
201
|
+
"-gencode=arch=compute_60,code=sm_60", # Pascal
|
|
202
|
+
"-gencode=arch=compute_61,code=sm_61",
|
|
203
|
+
"-gencode=arch=compute_70,code=sm_70", # Volta
|
|
204
|
+
]
|
|
205
|
+
)
|
|
206
|
+
clang_arch_flags.extend(
|
|
207
|
+
[
|
|
208
|
+
"--cuda-gpu-arch=sm_52",
|
|
209
|
+
"--cuda-gpu-arch=sm_60",
|
|
210
|
+
"--cuda-gpu-arch=sm_61",
|
|
211
|
+
"--cuda-gpu-arch=sm_70",
|
|
212
|
+
]
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
# Desktop architectures
|
|
216
|
+
gencode_opts.extend(
|
|
217
|
+
[
|
|
218
|
+
"-gencode=arch=compute_75,code=sm_75", # Turing
|
|
219
|
+
"-gencode=arch=compute_75,code=compute_75", # Turing (PTX)
|
|
220
|
+
"-gencode=arch=compute_80,code=sm_80", # Ampere
|
|
221
|
+
"-gencode=arch=compute_86,code=sm_86",
|
|
222
|
+
"-gencode=arch=compute_89,code=sm_89", # Ada
|
|
223
|
+
"-gencode=arch=compute_90,code=sm_90", # Hopper
|
|
224
|
+
]
|
|
225
|
+
)
|
|
226
|
+
clang_arch_flags.extend(
|
|
227
|
+
[
|
|
228
|
+
"--cuda-gpu-arch=sm_75", # Turing
|
|
229
|
+
"--cuda-gpu-arch=sm_80", # Ampere
|
|
230
|
+
"--cuda-gpu-arch=sm_86",
|
|
231
|
+
"--cuda-gpu-arch=sm_89", # Ada
|
|
232
|
+
"--cuda-gpu-arch=sm_90", # Hopper
|
|
233
|
+
]
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
if ctk_version >= (12, 8):
|
|
237
|
+
gencode_opts.extend(["-gencode=arch=compute_100,code=sm_100", "-gencode=arch=compute_120,code=sm_120"])
|
|
238
|
+
clang_arch_flags.extend(["--cuda-gpu-arch=sm_100", "--cuda-gpu-arch=sm_120"])
|
|
239
|
+
|
|
240
|
+
# Mobile architectures for aarch64 Linux
|
|
241
|
+
if arch == "aarch64" and target_platform == "linux":
|
|
242
|
+
gencode_opts.extend(
|
|
243
|
+
[
|
|
244
|
+
"-gencode=arch=compute_87,code=sm_87", # Orin
|
|
245
|
+
"-gencode=arch=compute_53,code=sm_53", # X1
|
|
246
|
+
"-gencode=arch=compute_62,code=sm_62", # X2
|
|
247
|
+
"-gencode=arch=compute_72,code=sm_72", # Xavier
|
|
248
|
+
]
|
|
249
|
+
)
|
|
250
|
+
clang_arch_flags.extend(
|
|
251
|
+
[
|
|
252
|
+
"--cuda-gpu-arch=sm_87",
|
|
253
|
+
"--cuda-gpu-arch=sm_53",
|
|
254
|
+
"--cuda-gpu-arch=sm_62",
|
|
255
|
+
"--cuda-gpu-arch=sm_72",
|
|
256
|
+
]
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
# Thor support in CUDA 12.8+
|
|
260
|
+
if ctk_version >= (12, 8):
|
|
261
|
+
gencode_opts.append("-gencode=arch=compute_101,code=sm_101") # Thor (CUDA 12 numbering)
|
|
262
|
+
clang_arch_flags.append("--cuda-gpu-arch=sm_101")
|
|
263
|
+
|
|
264
|
+
if ctk_version >= (12, 9):
|
|
265
|
+
gencode_opts.append("-gencode=arch=compute_121,code=sm_121")
|
|
266
|
+
clang_arch_flags.append("--cuda-gpu-arch=sm_121")
|
|
267
|
+
|
|
268
|
+
# PTX for future hardware (use highest available compute capability)
|
|
269
|
+
if ctk_version >= (12, 9):
|
|
270
|
+
gencode_opts.extend(["-gencode=arch=compute_121,code=compute_121"])
|
|
271
|
+
elif ctk_version >= (12, 8):
|
|
272
|
+
gencode_opts.extend(["-gencode=arch=compute_120,code=compute_120"])
|
|
273
|
+
else:
|
|
274
|
+
gencode_opts.append("-gencode=arch=compute_90,code=compute_90")
|
|
275
|
+
|
|
276
|
+
return gencode_opts, clang_arch_flags
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def _get_architectures_cu13(
|
|
280
|
+
ctk_version: tuple[int, int], arch: str, target_platform: str, quick_build: bool = False
|
|
281
|
+
) -> tuple[list[str], list[str]]:
|
|
282
|
+
"""Get architecture flags for CUDA 13.x."""
|
|
283
|
+
gencode_opts = []
|
|
284
|
+
clang_arch_flags = []
|
|
285
|
+
|
|
286
|
+
if quick_build:
|
|
287
|
+
gencode_opts = ["-gencode=arch=compute_75,code=compute_75"]
|
|
288
|
+
clang_arch_flags = ["--cuda-gpu-arch=sm_75"]
|
|
289
|
+
else:
|
|
290
|
+
# Desktop architectures
|
|
291
|
+
gencode_opts.extend(
|
|
292
|
+
[
|
|
293
|
+
"-gencode=arch=compute_75,code=sm_75", # Turing
|
|
294
|
+
"-gencode=arch=compute_75,code=compute_75", # Turing (PTX)
|
|
295
|
+
"-gencode=arch=compute_80,code=sm_80", # Ampere
|
|
296
|
+
"-gencode=arch=compute_86,code=sm_86",
|
|
297
|
+
"-gencode=arch=compute_89,code=sm_89", # Ada
|
|
298
|
+
"-gencode=arch=compute_90,code=sm_90", # Hopper
|
|
299
|
+
"-gencode=arch=compute_100,code=sm_100", # Blackwell
|
|
300
|
+
"-gencode=arch=compute_120,code=sm_120", # Blackwell
|
|
301
|
+
]
|
|
302
|
+
)
|
|
303
|
+
clang_arch_flags.extend(
|
|
304
|
+
[
|
|
305
|
+
"--cuda-gpu-arch=sm_75", # Turing
|
|
306
|
+
"--cuda-gpu-arch=sm_80", # Ampere
|
|
307
|
+
"--cuda-gpu-arch=sm_86",
|
|
308
|
+
"--cuda-gpu-arch=sm_89", # Ada
|
|
309
|
+
"--cuda-gpu-arch=sm_90", # Hopper
|
|
310
|
+
"--cuda-gpu-arch=sm_100", # Blackwell
|
|
311
|
+
"--cuda-gpu-arch=sm_120", # Blackwell
|
|
312
|
+
]
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
# Mobile architectures for aarch64 Linux
|
|
316
|
+
if arch == "aarch64" and target_platform == "linux":
|
|
317
|
+
gencode_opts.extend(
|
|
318
|
+
[
|
|
319
|
+
"-gencode=arch=compute_87,code=sm_87", # Orin
|
|
320
|
+
"-gencode=arch=compute_110,code=sm_110", # Thor
|
|
321
|
+
"-gencode=arch=compute_121,code=sm_121", # Spark
|
|
322
|
+
]
|
|
323
|
+
)
|
|
324
|
+
clang_arch_flags.extend(
|
|
325
|
+
[
|
|
326
|
+
"--cuda-gpu-arch=sm_87",
|
|
327
|
+
"--cuda-gpu-arch=sm_110",
|
|
328
|
+
"--cuda-gpu-arch=sm_121",
|
|
329
|
+
]
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
# PTX for future hardware (use highest available compute capability)
|
|
333
|
+
gencode_opts.extend(["-gencode=arch=compute_121,code=compute_121"])
|
|
334
|
+
|
|
335
|
+
return gencode_opts, clang_arch_flags
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def build_dll_for_arch(args, dll_path, cpp_paths, cu_paths, arch, libs: list[str] | None = None, mode=None):
|
|
339
|
+
mode = args.mode if (mode is None) else mode
|
|
340
|
+
cuda_home = args.cuda_path
|
|
341
|
+
cuda_cmd = None
|
|
342
|
+
|
|
343
|
+
# Add LLVM bin directory to PATH
|
|
344
|
+
add_llvm_bin_to_path(args)
|
|
345
|
+
|
|
346
|
+
if args.quick or cu_paths is None:
|
|
347
|
+
cuda_compat_enabled = "WP_ENABLE_CUDA_COMPATIBILITY=0"
|
|
348
|
+
else:
|
|
349
|
+
cuda_compat_enabled = "WP_ENABLE_CUDA_COMPATIBILITY=1"
|
|
350
|
+
|
|
351
|
+
if libs is None:
|
|
352
|
+
libs = []
|
|
353
|
+
|
|
354
|
+
import pathlib
|
|
355
|
+
|
|
356
|
+
warp_home_path = pathlib.Path(__file__).parent.parent
|
|
357
|
+
warp_home = warp_home_path.resolve()
|
|
358
|
+
|
|
359
|
+
if args.verbose:
|
|
360
|
+
print(f"Building {dll_path}")
|
|
361
|
+
|
|
362
|
+
native_dir = os.path.join(warp_home, "native")
|
|
363
|
+
|
|
364
|
+
if cu_paths:
|
|
365
|
+
# check CUDA Toolkit version
|
|
366
|
+
ctk_version = get_cuda_toolkit_version(cuda_home)
|
|
367
|
+
if ctk_version < MIN_CTK_VERSION:
|
|
368
|
+
raise Exception(
|
|
369
|
+
f"CUDA Toolkit version {MIN_CTK_VERSION[0]}.{MIN_CTK_VERSION[1]}+ is required (found {ctk_version[0]}.{ctk_version[1]} in {cuda_home})"
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
# Get architecture flags based on CUDA version
|
|
373
|
+
if ctk_version >= (13, 0):
|
|
374
|
+
gencode_opts, clang_arch_flags = _get_architectures_cu13(ctk_version, arch, sys.platform, args.quick)
|
|
375
|
+
else:
|
|
376
|
+
gencode_opts, clang_arch_flags = _get_architectures_cu12(ctk_version, arch, sys.platform, args.quick)
|
|
377
|
+
|
|
378
|
+
nvcc_opts = [
|
|
379
|
+
*gencode_opts,
|
|
380
|
+
"-t0", # multithreaded compilation
|
|
381
|
+
"--extended-lambda",
|
|
382
|
+
]
|
|
383
|
+
|
|
384
|
+
# Clang options
|
|
385
|
+
clang_opts = [
|
|
386
|
+
*clang_arch_flags,
|
|
387
|
+
"-std=c++17",
|
|
388
|
+
"-xcuda",
|
|
389
|
+
f'--cuda-path="{cuda_home}"',
|
|
390
|
+
]
|
|
391
|
+
|
|
392
|
+
if args.compile_time_trace:
|
|
393
|
+
if ctk_version >= (12, 8):
|
|
394
|
+
nvcc_opts.append("--fdevice-time-trace=_build/build_lib_@filename@_compile-time-trace")
|
|
395
|
+
else:
|
|
396
|
+
print("Warp warning: CUDA version is less than 12.8, compile_time_trace is not supported")
|
|
397
|
+
|
|
398
|
+
if args.fast_math:
|
|
399
|
+
nvcc_opts.append("--use_fast_math")
|
|
400
|
+
|
|
401
|
+
# is the library being built with CUDA enabled?
|
|
402
|
+
cuda_enabled = "WP_ENABLE_CUDA=1" if (cu_paths is not None) else "WP_ENABLE_CUDA=0"
|
|
403
|
+
|
|
404
|
+
if args.libmathdx_path:
|
|
405
|
+
libmathdx_includes = f' -I"{args.libmathdx_path}/include"'
|
|
406
|
+
mathdx_enabled = "WP_ENABLE_MATHDX=1"
|
|
407
|
+
else:
|
|
408
|
+
libmathdx_includes = ""
|
|
409
|
+
mathdx_enabled = "WP_ENABLE_MATHDX=0"
|
|
410
|
+
|
|
411
|
+
if os.name == "nt":
|
|
412
|
+
if args.host_compiler:
|
|
413
|
+
host_linker = os.path.join(os.path.dirname(args.host_compiler), "link.exe")
|
|
414
|
+
else:
|
|
415
|
+
raise RuntimeError("Warp build error: No host compiler was found")
|
|
416
|
+
|
|
417
|
+
cpp_includes = f' /I"{warp_home_path.parent}/external/llvm-project/out/install/{mode}-{arch}/include"'
|
|
418
|
+
cpp_includes += f' /I"{warp_home_path.parent}/_build/host-deps/llvm-project/release-{arch}/include"'
|
|
419
|
+
cuda_includes = f' /I"{cuda_home}/include"' if cu_paths else ""
|
|
420
|
+
includes = cpp_includes + cuda_includes
|
|
421
|
+
|
|
422
|
+
# nvrtc_static.lib is built with /MT and _ITERATOR_DEBUG_LEVEL=0 so if we link it in we must match these options
|
|
423
|
+
if cu_paths or mode != "debug":
|
|
424
|
+
runtime = "/MT"
|
|
425
|
+
iter_dbg = "_ITERATOR_DEBUG_LEVEL=0"
|
|
426
|
+
debug = "NDEBUG"
|
|
427
|
+
else:
|
|
428
|
+
runtime = "/MTd"
|
|
429
|
+
iter_dbg = "_ITERATOR_DEBUG_LEVEL=2"
|
|
430
|
+
debug = "_DEBUG"
|
|
431
|
+
|
|
432
|
+
cpp_flags = f'/nologo /std:c++17 /GR- {runtime} /D "{debug}" /D "{cuda_enabled}" /D "{mathdx_enabled}" /D "{cuda_compat_enabled}" /D "{iter_dbg}" /I"{native_dir}" {includes} '
|
|
433
|
+
|
|
434
|
+
if args.mode == "debug":
|
|
435
|
+
cpp_flags += "/FS /Zi /Od /D WP_ENABLE_DEBUG=1"
|
|
436
|
+
linkopts = ["/DLL", "/DEBUG"]
|
|
437
|
+
elif args.mode == "release":
|
|
438
|
+
cpp_flags += "/Ox /D WP_ENABLE_DEBUG=0"
|
|
439
|
+
linkopts = ["/DLL"]
|
|
440
|
+
else:
|
|
441
|
+
raise RuntimeError(f"Unrecognized build configuration (debug, release), got: {args.mode}")
|
|
442
|
+
|
|
443
|
+
if args.verify_fp:
|
|
444
|
+
cpp_flags += ' /D "WP_VERIFY_FP"'
|
|
445
|
+
|
|
446
|
+
if args.fast_math:
|
|
447
|
+
cpp_flags += " /fp:fast"
|
|
448
|
+
|
|
449
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=args.jobs) as executor:
|
|
450
|
+
futures, wall_clock = [], time.perf_counter_ns()
|
|
451
|
+
|
|
452
|
+
cpp_cmds = []
|
|
453
|
+
for cpp_path in cpp_paths:
|
|
454
|
+
cpp_out = cpp_path + ".obj"
|
|
455
|
+
linkopts.append(quote(cpp_out))
|
|
456
|
+
cpp_cmd = f'"{args.host_compiler}" {cpp_flags} -c "{cpp_path}" /Fo"{cpp_out}"'
|
|
457
|
+
cpp_cmds.append(cpp_cmd)
|
|
458
|
+
|
|
459
|
+
if args.jobs <= 1:
|
|
460
|
+
with ScopedTimer("build", active=args.verbose):
|
|
461
|
+
for cpp_cmd in cpp_cmds:
|
|
462
|
+
run_cmd(cpp_cmd)
|
|
463
|
+
else:
|
|
464
|
+
futures = [executor.submit(run_cmd, cmd=cpp_cmd) for cpp_cmd in cpp_cmds]
|
|
465
|
+
|
|
466
|
+
cuda_cmds = []
|
|
467
|
+
if cu_paths:
|
|
468
|
+
for cu_path in cu_paths:
|
|
469
|
+
cu_out = cu_path + ".o"
|
|
470
|
+
|
|
471
|
+
_nvcc_opts = [
|
|
472
|
+
opt.replace("@filename@", os.path.basename(cu_path).replace(".", "_")) for opt in nvcc_opts
|
|
473
|
+
]
|
|
474
|
+
|
|
475
|
+
if mode == "debug":
|
|
476
|
+
cuda_cmd = f'"{cuda_home}/bin/nvcc" --std=c++17 --compiler-options=/MT,/Zi,/Od -g -G -O0 -DNDEBUG -D_ITERATOR_DEBUG_LEVEL=0 -I"{native_dir}" -line-info {" ".join(_nvcc_opts)} -DWP_ENABLE_CUDA=1 -D{mathdx_enabled} {libmathdx_includes} -o "{cu_out}" -c "{cu_path}"'
|
|
477
|
+
elif mode == "release":
|
|
478
|
+
cuda_cmd = f'"{cuda_home}/bin/nvcc" --std=c++17 -O3 {" ".join(_nvcc_opts)} -I"{native_dir}" -DNDEBUG -DWP_ENABLE_CUDA=1 -D{mathdx_enabled} {libmathdx_includes} -o "{cu_out}" -c "{cu_path}"'
|
|
479
|
+
|
|
480
|
+
cuda_cmds.append(cuda_cmd)
|
|
481
|
+
|
|
482
|
+
linkopts.append(quote(cu_out))
|
|
483
|
+
|
|
484
|
+
linkopts.append(
|
|
485
|
+
f'cudart_static.lib nvrtc_static.lib nvrtc-builtins_static.lib nvptxcompiler_static.lib ws2_32.lib user32.lib /LIBPATH:"{cuda_home}/lib/x64"'
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
if args.libmathdx_path:
|
|
489
|
+
linkopts.append(f'nvJitLink_static.lib /LIBPATH:"{args.libmathdx_path}/lib/x64" mathdx_static.lib')
|
|
490
|
+
|
|
491
|
+
if args.jobs <= 1:
|
|
492
|
+
with ScopedTimer("build_cuda", active=args.verbose):
|
|
493
|
+
for cuda_cmd in cuda_cmds:
|
|
494
|
+
run_cmd(cuda_cmd)
|
|
495
|
+
else:
|
|
496
|
+
futures.extend([executor.submit(run_cmd, cmd=cuda_cmd) for cuda_cmd in cuda_cmds])
|
|
497
|
+
|
|
498
|
+
if futures:
|
|
499
|
+
done, pending = concurrent.futures.wait(futures, return_when=concurrent.futures.FIRST_EXCEPTION)
|
|
500
|
+
for d in done:
|
|
501
|
+
if e := d.exception():
|
|
502
|
+
for f in pending:
|
|
503
|
+
f.cancel()
|
|
504
|
+
raise e
|
|
505
|
+
elapsed = (time.perf_counter_ns() - wall_clock) / 1000000.0
|
|
506
|
+
print(f"build took {elapsed:.2f} ms ({args.jobs:d} workers)")
|
|
507
|
+
|
|
508
|
+
with ScopedTimer("link", active=args.verbose):
|
|
509
|
+
link_cmd = f'"{host_linker}" {" ".join(linkopts + libs)} /out:"{dll_path}"'
|
|
510
|
+
run_cmd(link_cmd)
|
|
511
|
+
|
|
512
|
+
else:
|
|
513
|
+
# Unix compilation
|
|
514
|
+
cuda_compiler = "clang++" if getattr(args, "clang_build_toolchain", False) else "nvcc"
|
|
515
|
+
cpp_compiler = "clang++" if getattr(args, "clang_build_toolchain", False) else "g++"
|
|
516
|
+
|
|
517
|
+
cpp_includes = f' -I"{warp_home_path.parent}/external/llvm-project/out/install/{mode}-{arch}/include"'
|
|
518
|
+
cpp_includes += f' -I"{warp_home_path.parent}/_build/host-deps/llvm-project/release-{arch}/include"'
|
|
519
|
+
cuda_includes = f' -I"{cuda_home}/include"' if cu_paths else ""
|
|
520
|
+
includes = cpp_includes + cuda_includes
|
|
521
|
+
|
|
522
|
+
if sys.platform == "darwin":
|
|
523
|
+
version = f"--target={arch}-apple-macos11"
|
|
524
|
+
else:
|
|
525
|
+
if cpp_compiler == "g++":
|
|
526
|
+
version = "-fabi-version=13" # GCC 8.2+
|
|
527
|
+
else:
|
|
528
|
+
version = ""
|
|
529
|
+
|
|
530
|
+
cpp_flags = f'-Werror -Wuninitialized {version} --std=c++17 -fno-rtti -D{cuda_enabled} -D{mathdx_enabled} -D{cuda_compat_enabled} -fPIC -fvisibility=hidden -D_GLIBCXX_USE_CXX11_ABI=0 -I"{native_dir}" {includes} '
|
|
531
|
+
|
|
532
|
+
if mode == "debug":
|
|
533
|
+
cpp_flags += "-O0 -g -D_DEBUG -DWP_ENABLE_DEBUG=1 -fkeep-inline-functions"
|
|
534
|
+
|
|
535
|
+
if mode == "release":
|
|
536
|
+
cpp_flags += "-O3 -DNDEBUG -DWP_ENABLE_DEBUG=0"
|
|
537
|
+
|
|
538
|
+
if args.verify_fp:
|
|
539
|
+
cpp_flags += " -DWP_VERIFY_FP"
|
|
540
|
+
|
|
541
|
+
if args.fast_math:
|
|
542
|
+
cpp_flags += " -ffast-math"
|
|
543
|
+
|
|
544
|
+
ld_inputs = []
|
|
545
|
+
|
|
546
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=args.jobs) as executor:
|
|
547
|
+
futures, wall_clock = [], time.perf_counter_ns()
|
|
548
|
+
|
|
549
|
+
cpp_cmds = []
|
|
550
|
+
for cpp_path in cpp_paths:
|
|
551
|
+
cpp_out = cpp_path + ".o"
|
|
552
|
+
ld_inputs.append(quote(cpp_out))
|
|
553
|
+
cpp_cmd = f'{cpp_compiler} {cpp_flags} -c "{cpp_path}" -o "{cpp_out}"'
|
|
554
|
+
cpp_cmds.append(cpp_cmd)
|
|
555
|
+
|
|
556
|
+
if args.jobs <= 1:
|
|
557
|
+
with ScopedTimer("build", active=args.verbose):
|
|
558
|
+
for cpp_cmd in cpp_cmds:
|
|
559
|
+
run_cmd(cpp_cmd)
|
|
560
|
+
else:
|
|
561
|
+
futures = [executor.submit(run_cmd, cmd=cpp_cmd) for cpp_cmd in cpp_cmds]
|
|
562
|
+
|
|
563
|
+
cuda_cmds = []
|
|
564
|
+
if cu_paths:
|
|
565
|
+
for cu_path in cu_paths:
|
|
566
|
+
cu_out = cu_path + ".o"
|
|
567
|
+
|
|
568
|
+
_nvcc_opts = [
|
|
569
|
+
opt.replace("@filename@", os.path.basename(cu_path).replace(".", "_")) for opt in nvcc_opts
|
|
570
|
+
]
|
|
571
|
+
|
|
572
|
+
if cuda_compiler == "nvcc":
|
|
573
|
+
if mode == "debug":
|
|
574
|
+
cuda_cmd = f'"{cuda_home}/bin/nvcc" --std=c++17 -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{mathdx_enabled} {libmathdx_includes} -o "{cu_out}" -c "{cu_path}"'
|
|
575
|
+
elif mode == "release":
|
|
576
|
+
cuda_cmd = f'"{cuda_home}/bin/nvcc" --std=c++17 -O3 --compiler-options -fPIC,-fvisibility=hidden {" ".join(_nvcc_opts)} -DNDEBUG -DWP_ENABLE_CUDA=1 -I"{native_dir}" -D{mathdx_enabled} {libmathdx_includes} -o "{cu_out}" -c "{cu_path}"'
|
|
577
|
+
else:
|
|
578
|
+
# Use Clang compiler
|
|
579
|
+
if mode == "debug":
|
|
580
|
+
cuda_cmd = f'clang++ -Werror -Wuninitialized -Wno-unknown-cuda-version {" ".join(clang_opts)} -g -O0 -fPIC -fvisibility=hidden -D_DEBUG -D_ITERATOR_DEBUG_LEVEL=0 -DWP_ENABLE_CUDA=1 -I"{native_dir}" -D{mathdx_enabled} {libmathdx_includes} -o "{cu_out}" -c "{cu_path}"'
|
|
581
|
+
elif mode == "release":
|
|
582
|
+
cuda_cmd = f'clang++ -Werror -Wuninitialized -Wno-unknown-cuda-version {" ".join(clang_opts)} -O3 -fPIC -fvisibility=hidden -DNDEBUG -DWP_ENABLE_CUDA=1 -I"{native_dir}" -D{mathdx_enabled} {libmathdx_includes} -o "{cu_out}" -c "{cu_path}"'
|
|
583
|
+
|
|
584
|
+
cuda_cmds.append(cuda_cmd)
|
|
585
|
+
|
|
586
|
+
ld_inputs.append(quote(cu_out))
|
|
587
|
+
|
|
588
|
+
ld_inputs.append(
|
|
589
|
+
f'-L"{cuda_home}/lib64" -lcudart_static -lnvrtc_static -lnvrtc-builtins_static -lnvptxcompiler_static -lpthread -ldl -lrt'
|
|
590
|
+
)
|
|
591
|
+
|
|
592
|
+
if args.libmathdx_path:
|
|
593
|
+
ld_inputs.append(f"-lnvJitLink_static -L{args.libmathdx_path}/lib -lmathdx_static")
|
|
594
|
+
|
|
595
|
+
if args.jobs <= 1:
|
|
596
|
+
with ScopedTimer("build_cuda", active=args.verbose):
|
|
597
|
+
for cuda_cmd in cuda_cmds:
|
|
598
|
+
run_cmd(cuda_cmd)
|
|
599
|
+
else:
|
|
600
|
+
futures.extend([executor.submit(run_cmd, cmd=cuda_cmd) for cuda_cmd in cuda_cmds])
|
|
601
|
+
|
|
602
|
+
if futures:
|
|
603
|
+
done, pending = concurrent.futures.wait(futures, return_when=concurrent.futures.FIRST_EXCEPTION)
|
|
604
|
+
for d in done:
|
|
605
|
+
if e := d.exception():
|
|
606
|
+
for f in pending:
|
|
607
|
+
f.cancel()
|
|
608
|
+
raise e
|
|
609
|
+
elapsed = (time.perf_counter_ns() - wall_clock) / 1000000.0
|
|
610
|
+
print(f"build took {elapsed:.2f} ms ({args.jobs:d} workers)")
|
|
611
|
+
|
|
612
|
+
if sys.platform == "darwin":
|
|
613
|
+
opt_no_undefined = "-Wl,-undefined,error"
|
|
614
|
+
opt_exclude_libs = ""
|
|
615
|
+
else:
|
|
616
|
+
opt_no_undefined = "-Wl,--no-undefined"
|
|
617
|
+
opt_exclude_libs = "-Wl,--exclude-libs,ALL"
|
|
618
|
+
|
|
619
|
+
with ScopedTimer("link", active=args.verbose):
|
|
620
|
+
origin = "@loader_path" if (sys.platform == "darwin") else "$ORIGIN"
|
|
621
|
+
link_cmd = f"{cpp_compiler} {version} -shared -Wl,-rpath,'{origin}' {opt_no_undefined} {opt_exclude_libs} -o '{dll_path}' {' '.join(ld_inputs + libs)}"
|
|
622
|
+
run_cmd(link_cmd)
|
|
623
|
+
|
|
624
|
+
# Strip symbols to reduce the binary size
|
|
625
|
+
if mode == "release":
|
|
626
|
+
if sys.platform == "darwin":
|
|
627
|
+
run_cmd(f"strip -x {dll_path}") # Strip all local symbols
|
|
628
|
+
else: # Linux
|
|
629
|
+
# Strip all symbols except for those needed to support debugging JIT-compiled code
|
|
630
|
+
run_cmd(
|
|
631
|
+
f"strip --strip-all --keep-symbol=__jit_debug_register_code --keep-symbol=__jit_debug_descriptor {dll_path}"
|
|
632
|
+
)
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
def build_dll(args, dll_path, cpp_paths, cu_paths, libs=None):
|
|
636
|
+
if sys.platform == "darwin":
|
|
637
|
+
# build for ARM64 only (may be cross-compiled from Intel Mac)
|
|
638
|
+
build_dll_for_arch(args, dll_path, cpp_paths, cu_paths, "aarch64", libs)
|
|
639
|
+
else:
|
|
640
|
+
build_dll_for_arch(args, dll_path, cpp_paths, cu_paths, machine_architecture(), libs)
|