Skip to main content

FP64-accurate matrix multiplication from BF16 hardware via Ozaki Extract in JAX

Project description

ozaki-jax

FP64-accurate matrix multiplication built from BF16 GEMMs using Ozaki Extract in JAX.

For square test matrices, the default implementation uses 36 BF16 GEMMs and reaches about 1e-16 relative error against FP64 reference results.

Usage

import numpy as np
from ozaki_jax import matmul

A = np.random.randn(256, 256)
B = np.random.randn(256, 256)
C = matmul(A, B)

Without JAX runtime dependency:

from ozaki_jax import matmul_numpy
C = matmul_numpy(A, B)

Method summary

Given C = A @ B:

  1. Split A and B into n_slices magnitude-controlled slices with Extract.
  2. Compute BF16-derived GEMM pairs where i + j <= n_slices - 1.
  3. Rescale and accumulate products in FP64.

With n_slices = 8, this keeps 8 * 9 / 2 = 36 slice-pair GEMMs.

Exactness condition

For BF16 slice values bounded by 2^p - 1, exact FP32 accumulation requires:

K * (2^p - 1)^2 < 2^24

In the default BF16 setting (p = 7), this gives K <= 1040.

Notes on rho for BF16

For FP64 source values (m1=53) and BF16 storage (m2=8), storage exactness requires:

rho >= m1 + 1 - m2 = 46

The accumulation constraint is also at least 46 for typical K values in this project, so the implementation uses rho=46 as the lower bound.

Limitations

  • K <= 1040 for the default unblocked exactness condition.
  • JAX on CPU does not represent TPU BF16 execution behavior.
  • Blocking for larger K is not implemented.

Benchmarks

python benchmarks/precision.py
python benchmarks/tpu_validate.py

References

  • Mukunoki, D., Ogita, T., & Imamura, T. (2020). "DGEMM using Tensor Cores, and Its Accurate and Reproducible Versions." ISC High Performance 2020.
  • Mukunoki, D. (2025). "Ozaki Scheme-Based Accurate Matrix Multiplication on FP8 Tensor Cores." arXiv:2508.00441
  • Ozaki, K., Ogita, T., Oishi, S., & Rump, S.M. (2012). "Error-Free Transformations of Matrix Multiplication by Using Fast Routines of Matrix Multiplication and Its Applications." Numerical Algorithms, 59(1).

License

Apache 2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ozaki_jax-0.1.1.tar.gz (12.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ozaki_jax-0.1.1-py3-none-any.whl (9.0 kB view details)

Uploaded Python 3

File details

Details for the file ozaki_jax-0.1.1.tar.gz.

File metadata

  • Download URL: ozaki_jax-0.1.1.tar.gz
  • Upload date:
  • Size: 12.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for ozaki_jax-0.1.1.tar.gz
Algorithm Hash digest
SHA256 e6f1411fca99b04ac80b5c6227c860b78d35d71669466331ade1a44945f049ed
MD5 a86b6b059d8ab252e5d197c8cccf565e
BLAKE2b-256 4ba55813a44ca927caa2358496e85ad458f88f8e230fc380b4bec25d1f665105

See more details on using hashes here.

File details

Details for the file ozaki_jax-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: ozaki_jax-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 9.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for ozaki_jax-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 754f9efac202d8b12c54210c24ee0a3cf5c3f637c9b6b47e68694c5b3dec094d
MD5 e38f90fe3aa988be94aae67de9dc9a6f
BLAKE2b-256 06af6e92c3ae6bfb4de2f6ce903b951c40bee480994ce914088550bca26c81cd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page