Contents

Changelog

No release is tagged yet; the version in the build files is 0.1.0. The entries dated before 2026-09-07 were reshaped to one line each on 2026-10-05, and their original text is frozen in docs/archive/CHANGELOG.md.

Unreleased

  • 2026-10-07 — cli: Pinned with tests that sb docs bundle writes the archive of the checkout and reads the XML folder of the Doxyfile (cli/tests/test_cli.py).
  • 2026-10-07 — ci: Fixed the release job to pass the sibling token to the called CI, and ignored the generated API XML (.github/workflows/release.yml, .gitignore).
  • 2026-10-07 — ci: Added the release job that builds the documentation bundle after CI and attaches it to the tag’s release (.github/workflows/release.yml, ci.yml).
  • 2026-10-07 — cli: Added sb docs bundle, made docs a command group registered from SushiCore, and added the publish list (cli/sushiblas/cli.py, docs/publish.toml, Doxyfile).
  • 2026-10-07 — docs: Added the frequently asked questions page (docs/guides/FAQ.md).
  • 2026-10-07 — tools: Added a checker that holds every copy of the version to project() and set the Doxyfile to 0.1.0 (tools/versioning/check_version.py).
  • 2026-10-07 — licence: Listed the third-party works that ship and where each licence text lives (NOTICE.md).
  • 2026-10-07 — build: Made the library follow the device targets SushiRuntime resolved, so a CUDA build of the runtime carries SushiBLAS kernels for the same card (cmake/SyclTarget.cmake).
  • 2026-10-07 — random: Made the dtype arm of execute_random a named class, which fixed the undefined HostKernel symbols that stopped the test executable from linking (engine/math/random/dispatch.hpp).
  • 2026-10-07 — logic: Made all and any of an empty tensor write their identity instead of dividing by zero in the SYCL reduction (src/engine/logic/all.cpp, any.cpp).
  • 2026-10-06 — random: Rejected invalid distribution parameters at record time, clamped truncated_normal bounds to 40 and made RngStream hand out the seed with the offset under one lock (engine/rng_stream.hpp).
  • 2026-10-06 — random: Rejected poisson on a device without fp64 and orthogonal on a tensor without storage (src/engine/math/random/poisson.cpp, orthogonal.cpp).
  • 2026-10-06 — math: Made elementwise max and min propagate NaN, made clamp reject an inverted range and fixed complex sqrt and log at the edges (max.cpp, clamp.cpp, safe_math.hpp).
  • 2026-10-06 — math: Fixed max and min returning the lowest finite value for an infinite input and the HALF level 1 reference kernels summing in HALF (max.cpp, kernels/reference/blas/level1/).
  • 2026-10-06 — io: Copied through the tensor’s own device queue, rejected malformed .npy headers and refused column-major rank 3 the same way on save and load (src/io.cpp).
  • 2026-10-06 — blas: Ran the five level 1 reductions on many work-items through one shared reduction and a ScratchBuffer (support/reduce_1d.hpp, engine/scratch.hpp).
  • 2026-10-06 — blas: Accumulated HALF in FLOAT32 in GEMM, SYRK, TRMV, GER, SYR, SYR2 and the reductions through one trait (support/accumulator.hpp).
  • 2026-10-06 — blas: Gave GEMV and SYMV a work-group per row for long rows (kernels/sycl/blas/level2/row_reduction.hpp).
  • 2026-10-06 — engine: Moved the execution mode and a host-pointer guard for FORCE_REFERENCE into the dispatch seam (engine/task.hpp).
  • 2026-10-06 — engine: Moved the RNG stream out of Engine into its own class (engine/rng_stream.hpp, engine.hpp).
  • 2026-10-06 — layout: Moved the helper headers shared by kernels and engine into a support layer (include/SushiBLAS/support/).
  • 2026-10-06 — math: Made empty tensors no-ops, added INT32 and INT64 arithmetic and took scalar parameters as double (engine/math/elementwise/).
  • 2026-10-06 — math: Made max and min propagate NaN and rewrote the complex math of the kernels without std::complex functions (max.cpp, safe_math.hpp).
  • 2026-10-06 — random: Added PTRS Poisson up to lambda 1e7, a parallel orthogonal and four values per Philox block, which changes every stream (kernels/sycl/random/).
  • 2026-10-06 — api: Added vector shapes, host transfer through IO, a full .npy header check and const-correct tensor accessors (io.hpp, tensor.hpp).
  • 2026-10-06 — api: Removed the global namespace alias sb (include/SushiBLAS/core/common.hpp).
  • 2026-10-06 — cli: Validated -D before deleting the build tree, verified clean and rejected unknown run options (cli/sushiblas/services/).
  • 2026-10-06 — bench: Added four benchmark programs, built with sb build --benchmarks (benchmarks/, cli/sushiblas/cli.py).
  • 2026-10-06 — tests: Strengthened the shared helpers and the normal, uniform, symv, trmv, trsv and elementary-function tests (tests/common/test_utils.hpp).
  • 2026-10-06 — licence: Restored the three-section license box and named both holders in the copyright line of every source file (tools/licensing/write_license_block.py, tools/documentation/check_source_comments.py).
  • 2026-10-05 — storage: Ported Storage and create_tensor to RuntimeContext allocation and Residency, and rejected negative and overflowing sizes (storage.hpp, src/engine.cpp).
  • 2026-10-05 — engine: Made set_mode throw std::logic_error for VERIFY, which applied in-place operations twice (src/engine.cpp, engine/task.hpp).
  • 2026-10-05 — engine: Added operand checks that reject missing storage, shape or layout mismatch and non-contiguous views at record time (engine/operand_check.hpp).
  • 2026-10-05 — tensor: Rejected negative dimensions, overflowing sizes and bad transpose indices, and checked the rank before writing strides (include/SushiBLAS/tensor.hpp).
  • 2026-10-05 — blas: Checked GEMM, SYRK and TRSM shapes, batch axes and layouts through one matrix operand, and rejected level 2 matrices above rank 2 (engine/blas/matrix_operand.hpp, dispatch.hpp).
  • 2026-10-05 — blas: Validated the result tensor of dot, asum, nrm2 and iamax and rejected vectors with stride 0 (engine/blas/utils.hpp, src/engine/blas/level1/).
  • 2026-10-05 — math: Made the elementwise, logic, nonlinear and reduction executors reject mismatched or strided operands, and limited six nonlinear operations to real dtypes (engine/math/*/dispatch.hpp).
  • 2026-10-05 — math: Fixed softplus overflow, CompensatedSum turning infinity into NaN, and the missing result of var, std, logsumexp, argmax and argmin on an empty tensor (softplus.cpp, reduce_1d.hpp).
  • 2026-10-05 — spatial: Validated ConvGeometry, rejected all-padding pool windows and made pool_max propagate NaN and require contiguous indices (engine/spatial/window.hpp, pool_max.cpp).
  • 2026-10-05 — random: Built uniform01 from 24 or 53 bits so it never returns 1, which changes every seeded stream, and rejected a poisson lambda above 700 (kernels/sycl/random/philox.hpp, poisson.cpp).
  • 2026-10-05 — io: Zeroed the .sushi header, checked writes, removed partial files and read strided views by stride in to_string (src/io.cpp).
  • 2026-10-05 — tools: Made check_layering.py check this repository’s kernel, engine and operation layers, with 62 known violations in one table (tools/layering/check_layering.py).
  • 2026-10-05 — tests: Added reference tests for BLAS levels 1 and 2 and TRSM, SYRK and TRSM parity tests, validation tests, and real assertions in both integration tests (tests/functional/).
  • 2026-10-05 — docs: Moved design reasoning out of source comments into folder READMEs and gave every source file its file block (include/SushiBLAS/, src/, kernels/, tests/, cli/).
  • 2026-10-05 — random: Made truncated_normal draw inside its bounds by inverting the normal distribution, and reject unordered or zero-mass bounds and complex dtypes at record time (src/engine/math/random/truncated_normal.cpp).
  • 2026-10-05 — core: Made SB_ASSERT flush the asynchronous logger before it aborts (include/SushiBLAS/core/logger.hpp, tests/functional/regression/test_logger.cpp).
  • 2026-10-05 — core: Set the asynchronous logger’s stop flag under its mutex and wrote every queued line before the worker exits (include/SushiBLAS/core/logger.hpp).
  • 2026-10-05 — io: Checked every read for short input and the version, dtype and layout of a .sushi header, and copied device storage through the queue in save_bin and load_bin (src/io.cpp).
  • 2026-10-05 — docs: Built the documentation tree, moved the loose pages into it, reshaped the changelog and added the checkers (README.md, docs/README.md, docs/reference/CHANGELOG.md, tools/).
  • 2026-10-05 — licence: Relicensed from Apache-2.0 to PolyForm Noncommercial 1.0.0 and removed docs/LICENSE (LICENSE, COMMERCIAL.md, NOTICE.md, third_party/licenses/Apache-2.0.txt).
  • 2026-10-05 — cli: Renamed the doxygen command to docs and kept sb doxygen as a hidden alias until 2027-03-25 (cli/sushiblas/cli.py, cli/sushiblas/aliases.py).
  • 2026-10-05 — cli: Added --version and --describe (cli/sushiblas/cli.py).
  • 2026-10-05 — cli: Took config and env from sushicore, which adds env -a (cli/sushiblas/cli.py, cli/sushiblas/services/diag.py).
  • 2026-10-05 — cli: Added a main() entry point that reports a malformed config file or an unknown theme as one line and exit code 1 (cli/sushiblas/cli.py, cli/sushiblas/__main__.py).
  • 2026-10-05 — cli: Returned 130 on Ctrl+C and announced the build tree that a change of sb build --type removes (cli/sushiblas/services/project.py).
  • 2026-10-05 — docs: Removed the pipx install ./cli path and corrected the toolchain lookup and --suite all descriptions (docs/CLI_GUIDE.md, docs/README.md).
  • 2026-10-04 — cli: Added setup, doctor, link and unlink from sushicore (cli/sushiblas/cli.py, cli/sushiblas/config.py).
  • 2026-10-04 — cli: Raised the sushicore lower bound to 0.7.0 (cli/pyproject.toml).
  • 2026-09-22 — build: Described this module in its own sushi-module.toml, so hub knows it from the checkout (sushi-module.toml).
  • 2026-09-22 — build: Raised the sushicore lower bound to 0.4.0 for the help page (cli/pyproject.toml).
  • 2026-09-22 — build: Took sushicore from PyPI instead of a sibling checkout (cli/pyproject.toml).
  • 2026-09-22 — cli: Drew sb --help and each command’s help through sushicore’s help page, in three groups with examples (cli/sushiblas/cli.py, cli/sushiblas/console.py).
  • 2026-09-22 — cli: Replaced the raw [dim] markup with the theme’s [muted] (cli/sushiblas/services/project.py).
  • 2026-09-07 — docs: Renamed the hub’s command from ss to hub in the manual (docs/).
  • 2026-08-09 — spatial: Added the spatial engine domain with im2col, col2im, pooling, upsampling, channel and layout operations (Engine::spatial(), SpatialOps, Spatial::WindowSpan).
  • 2026-08-09 — spatial: Wrote every spatial backward as a gather and pinned bit-reproducibility with five overlapping-window cases (tests/functional/regression/test_spatial_determinism.cpp).
  • 2026-08-09 — reductions: Added a second segment axis to Reduce::AxisSpan and its first caller (segments2, segment_stride2, ReductionOps::mean_spatial).
  • 2026-08-09 — gemm: Added Kernels::ChannelBiasEpilogue, a per-channel bias for the GEMM epilogue seam with a stride pair set on the host.
  • 2026-08-09 — cli: Added sb test --suite package, which installs the package and builds and runs tests/package/ against it, outside --suite all.
  • 2026-08-09 — engine: Moved Internal::execute_typed_task and Internal::dispatch_with_mode to engine/task.hpp and kept Internal::execute_blas_task as a forwarder.
  • 2026-08-09 — docs: Documented that ExecutionMode::VERIFY runs the reference kernel over the SYCL kernel’s output and does not compare the two.
  • 2026-08-04 — cli: Committed the root Doxyfile and docs/api/mainpage.md and stopped .gitignore from ignoring the Doxyfile, which made sb doxygen run.
  • 2026-08-03 — reductions: Added reductions().count_nonfinite, which counts the infinite and NaN elements of a tensor into an INT64 scalar (src/engine/math/reductions/count_nonfinite.cpp).
  • 2026-08-03 — reductions: Added Dispatch::execute_counting_reduction, the Reduce::ExactSum accumulator and an accumulation type parameter on Reduce::reduce.
  • 2026-08-03 — elementwise: Added elementwise().convert, a dtype-converting copy over the nine real dtype pairs that throws on any other pair (src/engine/math/elementwise/convert.cpp).
  • 2026-08-03 — blas: Named both dtypes in the mismatch message of Level1::copy.
  • 2026-08-03 — gemm: Let a GEMM epilogue declare the tensors it reads and writes (Dispatch::GemmEpilogue, Dispatch::gemm_epilogue, include/SushiBLAS/engine/blas/dispatch.hpp).
  • 2026-08-03 — reductions: Added the axis reductions reductions().max_along and sum_along over a segmented launch shape (include/SushiBLAS/engine/reduce_axis.hpp).
  • 2026-08-03 — reductions: Added Dispatch::axis_span_for, Reduce::RunningMax and the public Dispatch::execute_folding_axis_reduction, with 26 tests (tests/functional/unit/test_axis_reductions.cpp).
  • 2026-08-03 — core: Made SushiBLAS::Core::format public and added fill, alignment and the integer presentation types to its grammar (include/SushiBLAS/core/format.hpp).
  • 2026-08-03 — gemm: Added the Detail::gemm_no_local kernel beside Detail::gemm_local_tiled and chose between them from the device profile (include/SushiBLAS/kernels/sycl/blas/level3/gemm.hpp).
  • 2026-08-03 — gemm: Added an Epilogue template parameter to Kernels::SYCL::gemm, defaulting to GemmIdentityEpilogue and applied to each element before the store.
  • 2026-08-03 — engine: Added SushiBLAS::Device::Profile with has_dedicated_local_memory, plan_1d and vector_width, probed once per device (include/SushiBLAS/engine/device_policy.hpp).
  • 2026-08-03 — build: Added the SB_SYCL_TARGETS and SB_SYCL_DEVICE_FLAGS options for ahead-of-time device targets and printed the active targets at configure.
  • 2026-08-03 — cli: Added the repeatable sb build -D VAR=VALUE, appended after the defaults the CLI sets.
  • 2026-08-03 — dispatch: Made the op-dispatch seam public as namespace SushiBLAS::Dispatch and installed the five dispatch.hpp helpers with engine/dispatch.hpp and engine/math/safe_math.hpp.
  • 2026-08-03 — tests: Called Dispatch::execute_binary from the package consumer against an installed package (tests/package/main.cpp).
  • 2026-08-03 — random: Implemented RandomOps::shuffle as a Fisher-Yates permutation over the Philox stream (Kernels::SYCL::Random::draw_index).
  • 2026-08-03 — random: Implemented RandomOps::orthogonal by modified Gram-Schmidt for FLOAT32 and FLOAT64 rank-2 tensors (kernels/sycl/random/orthonormalize.hpp).
  • 2026-08-03 — elementwise: Computed add, sub, mul, div, neg, exp, log, sqrt, square, reciprocal and abs on COMPLEX32 and COMPLEX64.
  • 2026-08-03 — logic: Computed equal, not_equal, and, or, xor, not and where on COMPLEX32 and COMPLEX64.
  • 2026-08-03 — core: Added Core::to_string(DataType) and Core::is_complex_dtype(DataType) (core/common.hpp).
  • 2026-08-03 — build: Built the library at C++17 in place of C++20 with no API change and kept tests/package/ at C++20.
  • 2026-08-03 — core: Replaced std::format with SushiBLAS::Core::format and std::source_location with Core::Detail::SourceLocation (include/SushiBLAS/core/format.hpp).
  • 2026-08-03 — core: Replaced __VA_OPT__, templated lambdas and std::bit_cast with C++17 forms and accepted Dispatch::ElementTag<T> arms in Dispatch::with_element_type.
  • 2026-08-03 — tests: Added SB_TYPED_TEST_SUITE, which names the default type-name generator (tests/common/test_utils.hpp).
  • 2026-08-03 — gemm: Resolved GEMM’s layout and transpose handling into two strides on the host (Detail::strides_for).
  • 2026-08-03 — gemm: Derived GEMM’s register block from the element size, 8x8 for 4-byte and narrower types and 4x4 for wider ones (Detail::register_block_dim).
  • 2026-08-03 — gemm: Padded GEMM’s A tile to a leading dimension of tile_k + 1 and gave each work-item a strided lattice of the tile.
  • 2026-08-03 — gemm: Used 32-bit integers for GEMM’s tile-local indices and kept 64-bit for global coordinates, strides and batch offsets.
  • 2026-08-03 — gemm: Qualified only GEMM’s output pointer with __restrict__.
  • 2026-08-03 — syrk: Gave SYRK its own tile geometry (Detail::SyrkTileConfig).
  • 2026-08-03 — gemm: Recorded in the kernel that the tiled GEMM omits double buffering.
  • 2026-08-03 — gemm: Fixed column-major GEMM and SYRK, which read A and B with row-major indexing and past the end of A when m exceeded k (Regression_Sentinel.GemmColumnMajorOperandsUseColumnStrides).
  • 2026-08-03 — dispatch: Replaced seven silent default: break; dtype arms in the elementwise, nonlinear and logic helpers with throws that name the operation and the dtype.
  • 2026-08-03 — logic: Removed the lexicographic complex overloads of less, less_equal, greater and greater_equal and declared the ordering operations Domain::REAL.
  • 2026-08-03 — elementwise: Rejected complex operands of max, min, clamp, floor, ceil, round, fmod and remainder at record time.
  • 2026-08-03 — core: Collapsed three declarations of is_complex into SushiBLAS::Core::is_complex (include/SushiBLAS/core/traits.hpp).
  • 2026-08-03 — random: Stored the RNG seed and offset in task-metadata slots 6 and 7 as raw uint64_t (Dispatch::K_RNG_SEED_PARAM, K_RNG_OFFSET_PARAM, Dispatch::set_task_params).
  • 2026-08-03 — dispatch: Removed using namespace SushiRuntime::Graph::Literals; from the public dispatch headers.
  • 2026-08-03 — docs: Closed the release-mode test compile failure reported on 2026-08-02 as not reproducible.
  • 2026-08-02 — docs: Added ARCHITECTURE.md, CLI_GUIDE.md, INTEGRATION.md, CODE_OF_CONDUCT.md and SECURITY.md and rewrote the README and the contributing guide.
  • 2026-08-02 — docs: Folded LAYOUT.md, STYLE_GUIDE.md and TODO.md into ARCHITECTURE.md and CONTRIBUTING.md.
  • 2026-08-02 — cli: Resolved the SushiRuntime sibling and the bundled clang++ the way the CMake build does and pointed CMAKE_C_COMPILER at the sibling clang (cli/sushiblas/services/project.py).
  • 2026-08-01 — blas: Moved every BLAS level, TRSM and TRSV included, onto SushiBLAS’s own SYCL kernels and removed the oneMKL dependency.
  • 2026-08-01 — blas: Implemented HALF, FLOAT32, FLOAT64, COMPLEX32 and COMPLEX64 across all 17 BLAS operations.
  • 2026-08-01 — build: Added install(EXPORT SushiBLASTargets) and a generated SushiBLASConfig.cmake, which made find_package(SushiBLAS) work out of tree (tests/package/).
  • 2026-08-01 — core: Added include/SushiBLAS/version.hpp with the SUSHIBLAS_VERSION_* macros, checked against the CMake project version at configure.
  • 2026-08-01 — random: Added a Philox4x32-10 counter-based SYCL generator in place of oneMKL’s VSL backend for the 11 distribution operations (kernels/sycl/random/philox.hpp).
  • 2026-08-01 — blas: Added Internal::execute_blas_task and Internal::dispatch_with_mode, the shared dispatch helpers of every BLAS operation (engine/blas/utils.hpp).
  • 2026-08-01 — tests: Restructured tests/ into tests/common/ and tests/functional/{unit,integration,regression}/ and prefixed every GoogleTest suite name with its kind.
  • 2026-08-01 — cli: Added the --suite option of sb test, which selects a CTest label group.
  • 2026-08-01 — licence: Added NOTICE.md with the Apache-2.0 attribution of the portBLAS-derived GEMM tiling.
  • 2026-08-01 — licence: Relicensed from MIT to Apache-2.0 (LICENSE).
  • 2026-08-01 — build: Resolved SushiRuntime through a superproject target, find_package(SushiRuntime) or a sibling checkout and removed the vendored snapshot (cmake/Runtime.cmake, include/SushiRuntime/, lib/).
  • 2026-08-01 — build: Dropped the Intel oneAPI DPC++ requirement and defaulted to the bundled intel-llvm clang++ (cmake/Vcpkg.cmake, cmake/Toolchain.cmake, cmake/SyclTarget.cmake).
  • 2026-08-01 — engine: Followed SushiRuntime’s API to the IAllocatorStrategy singletons and to TaskGraph::compile() with IExecutionEngine::execute().
  • 2026-08-01 — build: Moved the directory-scope compile options into the policy targets sushiblas_warnings, sushiblas_perf and sushiblas_sanitizers, applied privately by sushiblas_apply_build_policy().
  • 2026-08-01 — engine: Moved LinalgOps and TransformsOps to include/SushiBLAS/experimental/ and removed them from the Engine facade.
  • 2026-08-01 — gemm: Fixed NaN propagation in GEMM and SYRK when beta is zero with an explicit branch in all four kernels (kernels/{reference,sycl}/blas/level3/{gemm,syrk}.hpp).
  • 2026-08-01 — tests: Fixed fill_random and assert_tensor_near, which computed a zero element count for every tensor below rank 6 (Tensor::num_elements).
  • 2026-08-01 — blas: Moved Internal::is_complex_v into engine/blas/utils.hpp after level1_internal.hpp was removed (dot.cpp).
  • 2026-08-01 — blas: Fixed the silent HALF gaps of gemv and IO::to_string().
  • 2026-08-01 — cmake: Renamed the build policy, warning, optimisation and sanitizer modules to SushiBLAS-prefixed file names and added an EXISTS check to the SUSHISTACK_HOME default (cmake/Runtime.cmake).
  • 2026-08-01 — cmake: Fixed find_dependency(IntelSYCL) and the exported alias case in SushiRuntime’s SushiRuntimeConfig.cmake.in.
  • 2026-08-01 — build: Removed the scripts/win/ and scripts/linux/ build scripts.