Anuvani-Diarization / src /tests /test_npblas_par.py
StephennFernandes's picture
Anuvani-Diarization 1.0.0
63dd946
Raw History Blame Contribute Delete
1.47 kB
# Copyright (c) 2026 The Anuvani-Diarization authors
# SPDX-License-Identifier: MIT OR Apache-2.0
"""The row-parallel dgemm used by VBx (diar_exact::npblas::dot_gemm_f64_rows_par) must equal the one-call
OpenBLAS product bit for bit, for both VBx call sites' layouts, over the shapes long files produce: rows of C split
across threads leave every element's kernel arithmetic unchanged."""
import numpy as np
import pytest
SHAPES = [(n, k) for n in (37, 640, 5000, 20774) for k in (2, 3, 7, 40, 70, 513, 1178, 1981)]
@pytest.mark.parametrize("n,k", SHAPES)
@pytest.mark.parametrize("rows", [16, 64, 256])
def test_vbx_gemm_sites(core, n, k, rows):
rng = np.random.default_rng(n * 7919 + k)
d = 128
# softmax-like rows
gamma = rng.random((n, k)) * rng.random((n, 1))
rho = rng.standard_normal((n, d)) * 3.0
alpha = rng.standard_normal((k, d)) * 0.1
# gamma.T.dot(rho): gemm(RowMajor, Trans, NoTrans, k, d, n, gamma, k, rho, d)
one, par = core.gemm_pair(True, False, k, d, n, gamma.ravel(), k, rho.ravel(), d, rows)
assert one.tobytes() == par.tobytes()
# and both equal numpy's own call
assert one.tobytes() == gamma.T.dot(rho).ravel().tobytes()
# rho.dot(alpha.T): gemm(RowMajor, NoTrans, Trans, n, k, d, rho, d, alpha, d)
one, par = core.gemm_pair(False, True, n, k, d, rho.ravel(), d, alpha.ravel(), d, rows)
assert one.tobytes() == par.tobytes()
assert one.tobytes() == rho.dot(alpha.T).ravel().tobytes()