All notable changes to GLASS will be documented here. The format follows Keep a Changelog, and releases use Semantic Versioning.
glass::warp::transform_pointsapplies a column-major 4×4 homogeneous transform (floatordouble) to packedfloatpoints, lanes striding the points, in two forms: one transform for all points, or one transform index per point. The per-component expression order is fixed so results are bit-identical to the inlined sphere-placement loop it replaces.glass::warp::any/glass::warp::allwrap__any_sync/__all_syncunder the full mask, for symmetry withwarp::reduce/warp::argmin_pair.glass::nvidia::thread::provides one-problem-per-thread cuSOLVERDx implementations for the supported LAPACK subset. The measured sm_120 and sm_87 ladders select it only where it clears the native implementation by the tuning margin.
-
Pin pytest-gpu-proof 0.5.0 for Python 3.10 support and signed CUDA compiler metadata in fresh GPU receipts.
-
Breaking: NVIDIA operations now require an explicit execution scope (
glass::nvidia::block::op,glass::nvidia::warp::op, orglass::nvidia::thread::op); the ambiguous bareglass::nvidia::opre-export is removed. -
Breaking: the flat
backendandsuggested_*advisor family is replaced byglass::recommend<op,T,dims...>(), which returns oneexecution_plancontaining implementation family, execution scope, and launch packing. Measured architectures carry paired MathDx and native-only tables. -
Breaking: advisor operation names use
op::potrfandop::ldlt_solve, and rectangular GEMM shape arguments use conventional(M,N,K)order. -
GLASS_TARGET_SMis the single architecture selector for native dispatch, execution plans, and MathDx descriptors; legacySMSremains an input alias. -
glass::block::riccati_gainreuses the symmetricP·Bintermediate (BᵀPA = (PB)ᵀA), shrinking its shared-scratch requirement fromNU²+NX²toNU²+NX·NUscalars and speeding up the fused gain solve. Results can shift at ULP level relative to earlier releases;riccati_scratch_bytes<T,NX,NU>()reflects the smaller footprint. -
glass::block::pcgelides trailing barriers that were immediately followed by an explicit__syncthreads()between composed sub-operations (numerically identical, fewer barriers per iteration). -
Compile-time
geruses a flat one-thread-per-output work mapping (bit-identical results by construction). -
Documented-overload coverage is measured per overload contract — 669 contracts extracted from Doxygen XML with call-shape evidence (
test/api-contracts.json) — instead of per public name, plus 22 declared behavioral correctness obligations checked against the signed receipt. -
The signed GPU receipt is split into eight dependency-scoped shards with lazy test-binary compilation; development reruns only affected shards, and releases still require a fresh all-shard receipt (now enforced by a no-carry verify policy in
release.sh). -
Layout compatibility of
pcg/bdsv(bit-identical[L|D|R]strips + padded vectors) is now DECLARED obligation #20 with a receipt-gated same-system-both-solvers test, and the tuning docs gain a solver-level cutoff calibration recipe (probe → fit → persist). -
pcg— and the whole block-scope_fastreduction family — is now legal at ANY thread count: the warp shuffle folds bound their sync mask to the active lanes of a ragged last warp (previously a latent full-mask UB that passed by hardware behavior). Multiple-of-32 launches are unchanged bit-for-bit and remain the fast path;test/test_pcg.pysweeps ragged counts again.
-
Restricted optimized callers now reload cross-thread handoffs in triangular solves, softmax/logsumexp, LU pivot selection/permutation, pivoted inverse, pivoted LDLT and symmetric eigendecomposition. This fixes wrong results, invalid accesses and divergent control flow seen despite existing barriers (including issue #44). Thread-only solves retain ordinary loads.
-
Optimized regression coverage now retains the minimal failing caller context alongside independent-oracle checks for shared/global memory, runtime sizes, launch geometry, pivoting and trailing synchronization.
-
glass-dispatch.cuhis included in the CMake install file list (previously a CMake-installed GLASS could not compile the bare measured-default face). -
CMake propagates the cuBLASDx CUTLASS include path when
GLASS_ENABLE_MATHDXis on. -
pcgdocumentation states the scratch size in BYTES and the dynamic shared-memory launch requirement explicitly (the old wording said "elements", understating the allocation).