Dr.Jit: A Just-In-Time Compiler for Differentiable Rendering

raw JSON →
1.3.1 verified Fri May 01 auth: no python

Dr.Jit is a just-in-time compiler for numerical computation in differentiable rendering, supporting CUDA, LLVM, and scalar backends. It provides automatic differentiation, vectorized operations, and dynamic control flow. Version 1.3.1 is current; releases are active every few months. Requires Python >=3.8.

pip install drjit
error ImportError: cannot import name 'if_stmt' from 'drjit'
cause Attempting to import if_stmt from drjit (it is available in drjit but the import path may be incorrect if using old code).
fix
Use 'from drjit import if_stmt' (top-level, no submodule).
error RuntimeError: Array types from different backends cannot be mixed
cause Using a CUDA array in an LLVM context, or vice versa.
fix
Ensure all arrays in a single operation originate from the same backend (e.g., all drjit.cuda.* or all drjit.llvm.*).
error AttributeError: module 'drjit' has no attribute 'plot'
cause The plot function was removed in v1.0.0.
fix
Use matplotlib: import numpy as np; np_arr = dr.numpy(array); plt.plot(np_arr).
breaking v1.0.0 introduced a new nanobind-based API, breaking backward compatibility with v0.x. The 'drjit.dynamic' module is removed; use top-level functions like dr.if_stmt, dr.while_loop, dr.cond.
fix Update imports: replace 'from drjit.dynamic import if_stmt' with 'from drjit import if_stmt'.
deprecated dr.JitFlag.VCallRecord is deprecated; its use is discouraged and may be removed in future versions.
fix Set dr.set_flag(dr.JitFlag.VCallRecord, False) to avoid warnings, or omit if not needed.
gotcha Mixing backends (e.g., CUDA arrays with LLVM operations) causes runtime errors. Dr.Jit arrays are backend-specific and non-interoperable.
fix Always use types from a single backend: e.g., drjit.cuda.Float3 or drjit.llvm.Float3, not both.
deprecated drjit.plot function has been removed in v1.0.0. Use matplotlib or other plotting libraries for visualization.
fix Export array to numpy with dr.numpy() and plot with matplotlib.

Compile a simple loop with Dr.Jit's syntax transform.

import drjit as dr

dr.set_flag(dr.JitFlag.VCallRecord, False)  # disable for simple loops

@dr.syntax
def f(x):
    y = dr.zeros(dr.int32, 4)
    for i in range(4):
        y[i] = x[i] + 1
    return y

x = dr.arange(dr.int32, 4)
result = f(x)
print(result)