Compare commits

...
887 Commits
Author SHA1 Message Date
Martin Kroeker 632ef87437 Merge pull request #5990 from jjerphan/wasm128-gemv
Add WASM SIMD128 SGEMV/DGEMV kernels
2026-08-22 12:10:59 +02:00
Julien Jerphanion b47183a713 Add WASM SIMD128 SGEMV/DGEMV kernels
kernel/wasm/KERNEL is included after KERNEL.WASM128_GENERIC and
unconditionally pointed S/D GEMV at RISC-V scalar gemv_{n,t}.c, so a
target-file SIMD kernel would never run.

Add kernel/wasm/gemv_{n,t}.c for both precisions. GEMV_T keeps 8
(float) / 4 (double) independent column accumulators with IEEE mul+add
and delays the horizontal add until after the inner loop. GEMV_N
streams four columns into y with a four-lane v128 unroll. Non-unit
stride stays scalar (no WASM gather/scatter).

Guard SGEMV{N,T}KERNEL/DGEMV{N,T}KERNEL with ifndef in KERNEL so the
target file wins. CGEMV/ZGEMV stay RISC-V scalar.

Signed-off-by: Julien Jerphanion <git@jjerphan.xyz>
2026-08-21 16:18:59 +02:00
Martin Kroeker 4919204154 Merge pull request #5989 from OpenMathLib/revert-5936-fixup-5883
Revert "Use QR for bidiagonal SVD with vectors in ?BDSDC (Reference-LAPACK PR 1300)"
2026-08-21 06:25:29 +02:00
Martin Kroeker ed0bb8903c Merge pull request #5988 from martin-frbg/issue5981
Ensure a safe distance between work arrays in the buffer of single-threaded POTRF
2026-08-21 01:09:35 +02:00
Martin Kroeker 77affe1f15 Revert "Use QR for bidiagonal SVD with vectors in ?BDSDC (Reference-LAPACK PR 1300)"
apple m / build-windows (cmake, gfortran, 0, 0) (push) Canceled after 0s
apple m / build-windows (cmake, gfortran, 0, 1) (push) Canceled after 0s
apple m / build-windows (cmake, gfortran, 1, 0) (push) Canceled after 0s
apple m / build-windows (cmake, gfortran, 1, 1) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 0, 0) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 0, 1) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 1, 0) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 1, 1) (push) Canceled after 0s
apple m / xbuild-x86_64 (push) Canceled after 0s
apple m / xbuild-ios (push) Canceled after 0s
apple m / xbuild-ios32 (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=C910V, C910V, riscv64-unknown-linux-gnu) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=RISCV64_GENERIC, RISCV64_GENERIC, riscv64-linux-gnu) (push) Canceled after 0s
Run codspeed benchmarks / benchmarks (make, gfortran, ubuntu-22.04, 3.12) (push) Canceled after 0s
continuous build / build (cmake, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / msys2 (None, mingw-w64-ucrt-x86_64-fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, <nil>, int32, MINGW32, mingw-w64-i686) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-clang-x86_64-fc, int32, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-clang-x86_64-fc, int64, -DBINARY=64 -DINTERFACE64=1, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-ucrt-x86_64-fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-ucrt-x86_64-fc, int64, -DBINARY=64 -DINTERFACE64=1, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / linux_thread_stress (openmp) (push) Canceled after 0s
continuous build / linux_thread_stress (pthread) (push) Canceled after 0s
continuous build / linux_thread_sanitizer (push) Canceled after 0s
continuous build / linux_thread_sanitizer_openmp (push) Canceled after 0s
continuous build / msys2_thread_stress (push) Canceled after 0s
continuous build / cross_build (DYNAMIC_ARCH=1 TARGET=GENERIC, mips64el, mips64el-linux-gnuabi64) (push) Canceled after 0s
continuous build / cross_build (TARGET=EV4, alpha, alpha-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=MIPS1004K, mipsel, mipsel-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=RISCV64_GENERIC, riscv64, riscv64-linux-gnu) (push) Canceled after 0s
continuous build / neoverse_build (push) Canceled after 0s
continuous build / neoverse_n1_build (push) Canceled after 0s
continuous build / neoverse_n1_omp_build (push) Canceled after 0s
continuous build / neoverse_n1_ilp64_build (push) Canceled after 0s
harmonyos / build (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6400, I6400, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6500, I6500, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=MIPS64_GENERIC, MIPS64_GENERIC, mips64el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=P6600, P6600, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=SICORTEX, SICORTEX, mips64el-linux-gnuabi64) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_GENERIC BINARY=64 ARCH=riscv64 DYNAMIC_ARCH=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64, DYNAMIC_ARCH=1) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL128B BINARY=64 ARCH=riscv64, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=128,elen=64, RISCV64_ZVL128B) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL256B BINARY=64 ARCH=riscv64 BUILD_BFLOAT16=1 BUILD_HFLOAT16=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64,zfh=true,zvfh=true,zvfbfwma=true, RISCV64_ZVL256B) (push) Canceled after 0s
2026-08-21 00:57:38 +02:00
Martin Kroeker 0944e9e7c1 Ensure a safe margin between work arrays in the buffer even when GEMM_PQR is small 2026-08-20 22:32:08 +02:00
Martin Kroeker 146beeda59 Ensure a safe margin between work arrays in the buffer even with small GEMM_R 2026-08-20 22:30:45 +02:00
Martin Kroeker 6d36cf6b9b Merge pull request #5984 from jjerphan/wasm128-axpy
Add a WASM SIMD128 SAXPY/DAXPY kernel
2026-08-20 20:22:42 +02:00
Martin Kroeker 0f74330773 Merge pull request #5985 from jjerphan/wasm128-cgemm
Add a WASM SIMD128 2x2 CGEMM microkernel
2026-08-20 20:21:13 +02:00
Martin Kroeker 4e2ab1f3f3 Merge pull request #5986 from jjerphan/wasm128-dtrmm
Add a WASM SIMD128 4x4 DTRMM microkernel
2026-08-20 20:20:12 +02:00
Julien Jerphanion 778224cee2 Add a WASM SIMD128 2x2 CGEMM microkernel
Vectorize the packed 2x2 CGEMM/ZGEMM inner loop with f32x4/f64x2
complex mul. Do not let kernel/wasm/KERNEL override the target
kernel the way 4x4 real GEMM already guards TRMM.

Signed-off-by: Julien Jerphanion <git@jjerphan.xyz>
2026-08-20 15:13:10 +02:00
Julien Jerphanion 459624cec2 Add a WASM SIMD128 4x4 DTRMM microkernel
Generic scalar DTRMM was the remaining Level-3 gap (~15 GFLOPS vs
~23 DGEMM). Keep SIMD for double only; single-precision TRMM already
auto-vectorized and a shared S+D kernel slowed SGEMM.

Signed-off-by: Julien Jerphanion <git@jjerphan.xyz>
2026-08-20 14:57:36 +02:00
Julien Jerphanion 12e3e23654 Add a WASM SIMD128 SAXPY/DAXPY kernel
kernel/wasm/KERNEL is included after KERNEL.WASM128_GENERIC and
unconditionally pointed S/D AXPY at RISC-V scalar axpy.c, so the
x86_64 V_SIMD sources listed in the target file never ran.

Add kernel/wasm/axpy.c for both precisions. Unit-stride y += da * x
uses eight independent v128 lanes (32 floats / 16 doubles) with IEEE
mul+add; remainder is one vector then scalar. Skip relaxed madd:
AXPY is checked to machine epsilon, and putting it in the generic
V_SIMD path previously slowed Level 1. Non-unit stride stays scalar
(no WASM gather); inc==0 uses that path so y[0] += n * da * x[0].

Guard SAXPYKERNEL/DAXPYKERNEL with ifndef in KERNEL so the target
file wins. CAXPY/ZAXPY stay RISC-V scalar.

On n=512..8192 vs the RISC-V champion, SAXPY is about 1.4–3.0x and
DAXPY about 1.4–2.2x. test.sh is green.

Signed-off-by: Julien Jerphanion <git@jjerphan.xyz>
2026-08-20 09:17:30 +02:00
Martin Kroeker 6d59c0de34 Merge pull request #5983 from jjerphan/wasm128-4x4-gemm
Add a 4x4 WASM SIMD128 GEMM microkernel
2026-08-19 19:15:43 +02:00
Julien Jerphanion 2ed3ca3940 wasm: add a 4x4 SIMD128 GEMM microkernel for SGEMM/DGEMM
Switch WASM128_GENERIC to unroll 4 with matching ncopy/tcopy and TRMM
4x4 so packing width stays consistent. Use relaxed SIMD madd in the
inner loop when compiled with -mrelaxed-simd.

Signed-off-by: Julien Jerphanion <git@jjerphan.xyz>
2026-08-19 14:17:22 +02:00
Julien Jerphanion 0fb0441220 wasm: gate TRSM call counters behind OPENBLAS_WASM_TRSM_PROFILE
Keep production STRSM/DTRSM free of always-on increments; enable the
counters only when counting invocations.

Signed-off-by: Julien Jerphanion <git@jjerphan.xyz>
2026-08-19 14:16:28 +02:00
Martin Kroeker cc3fc1e319 Merge pull request #5982 from Orcina-Ltd/clapack-dlamch-float-format
C_LAPACK: take the float format from <float.h> in dlamch/slamch
2026-08-18 16:05:14 +02:00
David Heffernan ffe8b242c7 C_LAPACK: take the float format from <float.h> in dlamch/slamch
INSTALL/dlamch.c and INSTALL/slamch.c are f2c translations of the deprecated
dlamchf77.f and slamchf77.f, which determine the floating point format at run
time by probing in dlamc1/dlamc2 rather than reading it from the environment.
The current dlamch.f and slamch.f use the Fortran 90 inquiry intrinsics
(EPSILON, TINY, HUGE, DIGITS, MINEXPONENT, MAXEXPONENT, RADIX) instead, but f2c
cannot translate those, so the C LAPACK selected by NOFORTRAN=1 has been left
with the older probing implementation.

The probe is only correct if double intermediates are genuinely rounded to
double. That does not hold on x87. Building 32 bit for a target without SSE2,
so with -mfpmath=387, and with gcc 16, the intermediates stay in registers and
the probe measures the 80 bit register format: it reports emin/emax as
-16381/16384, and a mantissa width that follows the caller's x87 precision
control bits (64 at extended precision, 53 at double). Written back as doubles,
rmin underflows to 0 and rmax overflows to +Inf, so dlamch('S') and dlamch('U')
return 0 and dlamch('O') returns +Inf.

Everything that scales by those values is then wrong, mostly silently. The
first symptom to surface was a floating point exception rather than a wrong
answer: dsbevx computes

    safmin = dlamch('S')
    eps    = dlamch('P')
    smlnum = safmin / eps
    bignum = 1 / smlnum

so a zero safe minimum makes smlnum zero and the next line divides by zero.
Callers that unmask the divide by zero exception get a hard failure there;
callers that do not get whatever the wrong scaling produces.

Replace the probe with the <float.h> constants, mirroring the values the
current dlamch.f and slamch.f return. This fixes two lesser problems at the
same time: rmach was left uninitialised when cmach matched nothing, where
dlamch.f returns zero; and the cached static results made both routines
unsafe to call concurrently on first use.

dlamc1-dlamc5 and slamc1-slamc5 are left in place. They become unreachable
from dlamch/slamch, but dlamc3 and slamc3 have callers of their own in dlaed3,
dlaed9, dlals0, dlasd3, dlasd8 and their complex equivalents, where they serve
as optimiser barriers.
2026-08-17 10:55:05 +01:00
Martin Kroeker d9f362aae8 Merge pull request #5830 from Felix-Gong/feature/rvv-trsm-zvl128b
Enable RVV-optimized TRSM kernels for RISCV64_ZVL128B
2026-08-16 22:51:51 +02:00
Martin Kroeker f2ba6a2213 Merge pull request #5980 from ajz34/fix/dynarch_small_matrix_batch
Fix: Small matrix `gemm_batch` with DYNAMIC_ARCH
2026-08-16 19:01:15 +02:00
Martin Kroeker 5bd5547bc9 Merge pull request #5979 from ajz34/fix/strided_colmajor
Fix: CBLAS order handling in `gemm_batch_strided` for column-major layout
2026-08-16 18:52:22 +02:00
Martin Kroeker b08df585f6 Merge pull request #5972 from Orcina-Ltd/asum-alignment-determinism
Title: kernel/x86_64: make AVX-512 asum/sum kernels independent of buffer alignment
2026-08-16 16:42:53 +02:00
Martin Kroeker 377753094d Merge pull request #5978 from martin-frbg/issue5976
Fix CMake cross-compilation to ARMV9SME (or DYNAMIC_ARCH containing same)
2026-08-15 20:13:54 +02:00
Martin Kroeker 7779b52f99 Merge pull request #5942 from HecaiYuan/develop
loongarch64: fix segfaults in copy kernels and adjust dsyrk block size
2026-08-15 18:37:08 +02:00
Martin Kroeker d7d350317b Merge pull request #5977 from martin-frbg/issue5975
Expressly restore the ARM64 generic OMATCOPY CT/RT kernels to plain C
2026-08-15 17:49:28 +02:00
0b663a112e Fix gemm_batch small matrix kernel address retrieval for correct call with DYNAMIC_ARCH activated
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: glm-5.3 <service@zhipuai.cn>
2026-08-15 23:04:20 +08:00
86c65a5a0c Fix CBLAS order handling in gemm_batch_strided for column-major layout
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: glm-5.3 <service@zhipuai.cn>
2026-08-15 21:35:33 +08:00
Martin Kroeker 98425fe1bc Fix misspelling of ARMV9SME target 2026-08-15 14:14:57 +02:00
Martin Kroeker e7083596c9 Expressly restore OMATCOPY CT/RT kernels to plain C 2026-08-15 14:09:44 +02:00
Martin Kroeker e0cabe9b59 Merge pull request #5971 from martin-frbg/issue5841
[WIP] Add ARMv9.2 SME GEMM kernels ported from vlovero's project
2026-08-15 09:14:17 +02:00
Martin Kroeker b83ffe61f3 Increase timeout for OSX DYNAMIC_ARCH job 2026-08-14 23:33:52 +02:00
Martin Kroeker 2d4212947e Increase KC 2026-08-14 22:10:20 +02:00
Martin Kroeker 7313f3ff6e Increase KC 2026-08-14 22:09:04 +02:00
Martin Kroeker 17d99746fe Merge branch 'OpenMathLib:develop' into issue5841 2026-08-14 15:00:23 +02:00
Martin Kroeker 40fea772be Merge pull request #5974 from martin-frbg/ci-macos15
Azure CI: Move mac jobs from deprecated macOS-14 image to macOS-15
2026-08-14 14:59:57 +02:00
Martin Kroeker a79dce7976 Keep the ios-armv7 job at xcode16.2/sdk 18.2 as 16.4 appears to have dropped armv7 2026-08-14 10:22:22 +02:00
Martin Kroeker d43c87d317 Update macOS SDK versions as well 2026-08-14 01:05:25 +02:00
Martin Kroeker 0e79f73488 Move mac jobs from deprecated macOS-14 image to macOS-15 2026-08-14 00:12:42 +02:00
Martin Kroeker 29de61484d Merge pull request #5973 from moluopro/fix-loongarch64-dsdot-accumulator
LoongArch: Fix DSDOT accumulator initialization
2026-08-13 23:13:29 +02:00
Martin Kroeker 9884c480ea Add casts to pacify homebrew-llvm 2026-08-13 22:20:23 +02:00
Martin Kroeker f285f47ab1 Merge branch 'develop' into issue5841 2026-08-13 20:04:43 +02:00
Martin Kroeker 305bd67178 Add +sme-f64f64 to build flags of VortexM4 and ARMV9SME 2026-08-13 18:51:35 +02:00
Martin Kroeker f8830b66e3 Add sme-f64f64 capability to VortexM4 and ARMV9SME build flags 2026-08-13 18:48:02 +02:00
Martin Kroeker 81dd859785 Move declarations of the ARM64 SME kernels to the appropriate headers 2026-08-13 18:43:48 +02:00
Martin Kroeker 3ead57fd2b Improve clobber lists and interfaces 2026-08-13 18:41:33 +02:00
Martin Kroeker c073f087b4 Add ARM64 SME GEMM kernels 2026-08-13 18:39:56 +02:00
Martin Kroeker 9724481b59 Add declarations for ARM64 SME GEMM kernels 2026-08-13 18:38:55 +02:00
moluopro fc6f4a3b46 CI: Re-enable LoongArch DSDOT test with Clang 2026-08-13 23:01:10 +08:00
moluopro 8f2a8fe318 CI: Re-enable LoongArch DSDOT test with GCC 2026-08-13 23:00:47 +08:00
moluopro 404f288a9d LoongArch: Fix DSDOT accumulator initialization 2026-08-13 23:00:41 +08:00
David Heffernan d793be85b4 kernel/x86_64: make AVX-512 asum/sum kernels independent of buffer alignment
The skylakex/cooperlake d/s/c/z asum and c/z sum microkernels peel leading
elements until the input pointer reaches a 64-byte boundary (a scalar loop in
dasum/sasum, a masked header load in the complex variants) before entering an
aligned-load accumulator loop. The peel count depends on the buffer address
mod 64, so the grouping of the sum into accumulators - and therefore the
rounding of the result - depends on where the caller's buffer happens to sit
in memory. The same data at a different address can give a bitwise-different
sum.

That address dependence surfaced as non-reproducibility in OrcaFlex: LAPACK's
dstein scales each inverse-iteration eigenvector by 1/dasum(...) over a heap
array whose alignment varies with allocation history, so eigenvectors from
identical inputs differed run to run in the last bits, which zero-tolerance
regression comparison flags.

Fix by dropping the alignment peel and using unaligned loads throughout, so
the summation order is a function of the length alone. On AVX-512 hardware
unaligned load instructions on addresses that happen to be aligned cost the
same as aligned loads; only genuinely split cache lines pay a small penalty,
negligible for these level-1 reductions.
2026-08-13 13:57:49 +01:00
Martin Kroeker 8d73a856fb Merge pull request #5970 from hugomeiland/cortexa72-dgemm-6x8
ARM64: Cortex-A72 DGEMM 6×8 microkernel and blocking
2026-08-12 18:12:23 +02:00
Martin Kroeker 4ae369ac0a Make the compute kernel static 2026-08-12 10:54:27 +02:00
Martin Kroeker 1ed99815fa Add SME GEMM kernels 2026-08-12 10:53:07 +02:00
Hugo MeilandandCursor 4e923d1ba6 Keep CORTEXA72 out of default DYNAMIC_ARCH
Per review: A72 was dropped from the default DYNAMIC_CORE list in
#4389 to limit arm64 binary size. Restore the A57 alias for default
DYNAMIC_ARCH; TARGET=CORTEXA72 and DYNAMIC_LIST=CORTEXA72 still get
the dedicated 6x8 kernels.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-11 18:52:45 +02:00
Martin Kroeker e24e0da779 Add sme-f64f64 to ARMV9SME archflags too 2026-08-11 17:58:17 +02:00
Martin Kroeker 39b56e9a05 Add ARM64 SME GEMM kernels 2026-08-11 12:16:04 +02:00
Martin Kroeker cf1b7c1ad9 Clean up non-OpenMP build and add CBLAS GEMM benchmark 2026-08-11 12:14:58 +02:00
Martin Kroeker 78f03216de Add SME GEMM kernels ported from vlovero's ARMv9.2-GEMM project 2026-08-11 12:12:29 +02:00
Martin Kroeker f2dc74796f Integrate SME GEMM kernels 2026-08-11 12:10:47 +02:00
Martin Kroeker 2f915c5e23 Add f64f64 extension to VortexM4 options 2026-08-11 12:10:03 +02:00
Martin Kroeker 5aa2c41e8d Credit Vincent Lovero for his ARM SME kernel work 2026-08-11 12:07:46 +02:00
Hugo MeilandandCursor df6032c375 Alias gotoblas_CORTEXA72 to ARMV8 on Darwin DYNAMIC_ARCH
Darwin's DYNAMIC_CORE only builds ARMV8/NEOVERSEN1/ARMV9SME/VORTEXM4,
so an unconditional extern gotoblas_CORTEXA72 left Apple M builds with
an undefined symbol. Mirror the CORTEXA57 Darwin alias.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-09 12:47:18 +02:00
Hugo MeilandandCursor 2b69faff24 Add generic neg_tcopy_6 for DGEMM_UNROLL_M=6
DYNAMIC_ARCH builds CORTEXA72 as a separate kernel and pull
dneg_tcopy from generic/neg_tcopy_$(DGEMM_UNROLL_M).c. Width 6 was
missing (only 1/2/4/8/16 existed), which broke the arm64 Graviton
Cirun and Azure DYNAMIC_ARM64 jobs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-09 12:16:01 +02:00
Hugo MeilandandCursor 23f832c464 Wire CORTEXA72 6x8 blocking and DYNAMIC_ARCH dispatch
Give CORTEXA72 its own param.h block (UNROLL 6x8, P=120 Q=240, R=4096
shared-L2 / R=768 single-core), add it to DYNAMIC_CORE, and stop
aliasing gotoblas_CORTEXA72 to A57 so DYNAMIC_ARCH can select the new
kernels on MIDR 0xd08.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-09 10:31:35 +02:00
Hugo MeilandandCursor 560caa56e6 Add Cortex-A72 DGEMM 6x8 microkernel with MR=6 packers and TRSM
TARGET=CORTEXA72 previously reused the A57 8x4 path. Add a dedicated
6x8 NEON ukernel, contiguous MR=6 panel packers (stock gemm_*copy_6 is
4+2), and UNROLL_M=6-aware TRSM kernels so HPL/dtrsm does not corrupt
the heap. DTRMM falls back to generic 2x2 until a matching kernel exists.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-09 10:31:35 +02:00
Martin Kroeker 05518e0f11 Merge pull request #5969 from martin-frbg/lapack1346
Raise SE2,SEP test thresholds to account for xSTEINs orthogonality guarantee (Reference-LAPACK PR 1346)
2026-08-09 00:28:18 +02:00
Martin Kroeker 7fdb527565 Merge pull request #5968 from martin-frbg/lapack1342
Fix invalid reads in the single&double precision DMD tests (Reference-LAPACK PR 1342)
2026-08-09 00:27:58 +02:00
Martin Kroeker b8d6a7bef8 Merge pull request #5967 from martin-frbg/lapack1338
Fix spurious SGEBAL/DGEBAL test failure caused by wrong metric (Reference-LAPACK PR 1338)
2026-08-08 23:05:16 +02:00
Martin Kroeker 9ff46235ea Merge pull request #5966 from Ka-zam/relapack-sytrf-workspace
Fix workspace size in ReLAPACK sytrf/hetrf
2026-08-08 23:04:44 +02:00
Martin Kroeker 330063dec8 Raise threshold to account for orthogonality guarantee (Reference-LAPACK PR 1346) 2026-08-08 18:25:41 +02:00
Martin Kroeker 2f24d51c5d Raise threshold to accound for orthogonality guarantee (Reference-LAPACK PR 1346) 2026-08-08 18:24:25 +02:00
Martin Kroeker b22e3244e4 Fix read beyond the array bounds (Reference-LAPACK PR 1342) 2026-08-08 18:17:04 +02:00
Martin Kroeker 8554a7e586 Fix read beyond the array bounds (Reference-LAPACK PR 1342) 2026-08-08 18:15:49 +02:00
Martin Kroeker 4d35c91404 Add missing ABS to the error metric (Reference-LAPACK PR 1338) 2026-08-08 18:06:18 +02:00
Martin Kroeker a9a238157b Add missing ABS to the error metric (Reference-LAPACK PR 1338) 2026-08-08 18:04:28 +02:00
Magnus Lundmark 4a4cd8fbb6 Fix workspace size in ReLAPACK sytrf/hetrf
xREC_SPLIT rounds up, so n*(n/2) is smaller than the n by xREC_SPLIT(n)
workspace the top level recursion addresses whenever xREC_SPLIT(n) > n/2
(n=500 splits 252/248). The routines then write past the end of the
buffer they reported from the lWork=-1 query, silently corrupting both
the factorization and the heap.

Size the workspace with the same xREC_SPLIT the recursion uses.
2026-08-08 15:22:15 +02:00
Martin Kroeker 446c436e10 Merge pull request #5965 from martin-frbg/issue5958-2
Return a specific XERBLA error to the caller when buffer assignment fails
2026-08-07 22:34:18 +02:00
Martin Kroeker a6923005ec Merge pull request #5960 from ngoldbaum/shutdown-release-race
Fix multithreaded shutdown thread safety issues
2026-08-07 14:03:47 +02:00
Martin Kroeker 75b93b4465 Fix missing declaration of info 2026-08-07 13:56:43 +02:00
Martin Kroeker 761ebe91ab Fix return without code and buffer leak on other error path 2026-08-07 13:51:01 +02:00
Martin Kroeker ed2ba87203 Add error return on buffer assignment failure 2026-08-07 12:28:01 +02:00
Martin Kroeker cb8199dda2 Add error return on buffer assignment failure 2026-08-07 12:20:19 +02:00
Martin Kroeker ec6eb7922a Add error return on buffer assignment failure 2026-08-07 12:16:32 +02:00
Martin Kroeker ad7a417489 Merge pull request #5964 from ErnstPeng/la-small-matrix-dev
loongarch: add small matrix kernel of sgemm_lasx/lsx and dgemm_lsx
2026-08-06 14:43:06 +02:00
Martin Kroeker 1f83c8be22 Merge pull request #5962 from martin-frbg/ci-mips-qemu10
CI, MIPS64: Update qemu tag to 10.2.4 to get the fork fix
2026-08-06 08:15:32 +02:00
pengxu 284bcbae13 loongarch: add small matrix kernel of sgemm_lasx/lsx and dgemm_lsx 2026-08-06 10:14:23 +08:00
Martin Kroeker c56410d60f Update qemu tag to 10.2.4 to get the fork fix 2026-08-05 23:18:35 +02:00
Nathan Goldbaum b14b82ce17 Fix merge conflict resolution screwup 2026-08-05 15:12:14 -06:00
Martin Kroeker 721f5da709 Merge pull request #5961 from moluopro/fix-loongarch64-qemu-install
Fix issues with the LoongArch & macOS pipeline
2026-08-05 23:09:48 +02:00
Nathan Goldbaum 0041b780ed fix broken cmake 2026-08-05 09:28:41 -06:00
Nathan Goldbaum 28da957ee1 cache ntdll pointer at startup 2026-08-05 09:02:15 -06:00
Nathan Goldbaum 2bb30e03dd bump timeouts slightly 2026-08-05 09:01:58 -06:00
Nathan Goldbaum 4ea40779bd Add explanatory note about RtlDllShutdownInProgress 2026-08-05 08:37:44 -06:00
moluopro 210b6a2962 AzureCI: Increase timeouts for slow macOS jobs 2026-08-05 22:31:54 +08:00
moluopro fbe55b25c9 CI: Install QEMU 10.2.1 for LoongArch tests 2026-08-05 22:31:54 +08:00
Nathan Goldbaum 8c7c04b671 Merge branch 'develop' into shutdown-release-race 2026-08-05 08:14:52 -06:00
Nathan Goldbaum b8d83a72f4 Avoid possible hang on Windows by introspecting shutdown state 2026-08-05 08:10:43 -06:00
Nathan Goldbaum 95120da710 Centralize buffer release bookkeeping 2026-08-05 08:10:30 -06:00
Martin Kroeker 0c5fc4552b Merge pull request #5956 from moluopro/fix-openmp-exec-buffer-lifetime
Fix stale workspace pointers in reused thread queues
2026-08-05 09:39:56 +02:00
Martin Kroeker 64ad27325a Merge pull request #5959 from martin-frbg/loongarch-ci-qemu
CI: Update qemu in the loongarch64 job to version 10 with fixed fork behavior
2026-08-05 09:38:56 +02:00
Nathan Goldbaum 6e5c5255b0 add multithreaded shutdown stress test 2026-08-04 19:16:32 -06:00
Martin Kroeker 0392a36007 sudo wget to write in /usr/bin 2026-08-05 00:01:18 +02:00
Martin Kroeker e24af350c0 fix option capitalization 2026-08-04 23:36:19 +02:00
Martin Kroeker dacfb92ec3 Overwrite the outdated qemu with a binary of 10.2.4 2026-08-04 23:18:53 +02:00
Martin Kroeker b6ee68da06 Merge pull request #5955 from moluopro/fix-riscv64-gemm-gemv-forwarding
Fix RISC-V GEMM/GEMV forwarding in Make builds
2026-08-04 15:40:38 +02:00
Martin Kroeker acfe406eb7 Merge pull request #5957 from uuiitwp/develop
Fix pointer comparison in laed3.c threading threshold
2026-08-04 14:22:11 +02:00
Martin Kroeker 914f3ae6a8 Merge pull request #5949 from martin-frbg/issue5947
Prevent accidental increase of the thread count inside a parallel region
2026-08-04 14:21:05 +02:00
uuiitwp d591836293 Fix pointer comparison in laed3.c threading threshold 2026-08-04 14:36:18 +08:00
moluopro d7dc043d61 Run mixed callback test with Make 2026-08-04 12:06:17 +08:00
moluopro 880a4a596e Register mixed callback test with CMake 2026-08-04 12:06:17 +08:00
moluopro 99f7c78e79 Test mixed DGEMM with thread callbacks 2026-08-04 12:06:17 +08:00
moluopro 61f5f03311 Use worker workspace for threaded SBMV 2026-08-04 12:06:17 +08:00
moluopro dddd08507e Preserve Windows queue workspace inputs 2026-08-04 12:06:17 +08:00
moluopro a7b6ce7ae0 Preserve OpenMP queue workspace inputs 2026-08-04 12:06:17 +08:00
moluopro 21d02cf01e Preserve pthread queue workspace inputs 2026-08-04 12:06:17 +08:00
moluopro 5c57734ac6 Track worker workspace in thread queues 2026-08-04 12:06:17 +08:00
moluopro ecc04e57cf Fix RISC-V GEMM/GEMV forwarding in Make builds 2026-08-03 22:05:43 +08:00
Martin Kroeker c3db185d6c Merge pull request #5879 from amritahs-ibm/BGEMM_PPC
BGEMM Kernel implementation for Power PC Architecture
2026-07-31 00:04:15 +02:00
Martin Kroeker 80920a3242 Merge pull request #5944 from lujiaweics/fix/zrotg-missing-profile-end
Fix build error in zrotg.c with FUNCTION_PROFILE=1 from Makefile.rule
2026-07-30 23:34:06 +02:00
Martin Kroeker 2621df71d5 Merge pull request #5952 from pkubaj/patch-3
system.cmake: mirror recent Makefile.power commits
2026-07-29 19:40:30 +02:00
Martin Kroeker 2a921cfe85 Merge pull request #5951 from martin-frbg/fixup5577
Make get/set_affinity visible again and export functions in the OpenMP blas server too
2026-07-29 11:02:40 +02:00
Piotr Kubaj 76e12db33b system.cmake: mirror recent Makefile.power commits
Fixes builds with clang when using cmake.
2026-07-29 08:48:25 +00:00
Martin Kroeker 28e75a8530 Tag get/set_affinity with OPENBLAS_EXPORT 2026-07-28 20:52:15 +02:00
Martin Kroeker 4230fe472e Tag openblas_set_num_threads and get/set_affinity with OPENBLAS_EXPORT 2026-07-28 20:45:46 +02:00
Martin Kroeker e7363c16c1 Merge pull request #5948 from martin-frbg/issue5946
Copy PROLOGUE into PROLOGUE_EXPORT for other arch/os combinations that have assembly kernels
2026-07-28 20:41:25 +02:00
Martin Kroeker 842189bf3f Prevent accidental increase of the thread count inside a parallel region 2026-07-28 14:27:26 +02:00
Martin Kroeker e17e958a09 Copy PROLOGUE into PROLOGUE_EXPORT 2026-07-28 11:59:54 +02:00
Martin Kroeker e231f4bb89 Copy PROLOGUE to PROLOGUE_EXPORT 2026-07-28 11:57:24 +02:00
Martin Kroeker 876310b12c Define PROLOGUE_EXPORT (same as PROLOGUE for now) 2026-07-28 11:49:25 +02:00
Martin Kroeker c6aeca0365 Define PROLOGUE_EXPORT for AIX and OSX (same as PROLOGUE) 2026-07-28 11:46:30 +02:00
Martin Kroeker 181aadf226 Merge pull request #5945 from OpenMathLib/revert-5921-issue5905
Revert "Mark temporaries as volatile to avoid SIGBUS in multithreaded builds with gcc15+ on 32bit FreeBSD/x86"
2026-07-27 07:48:58 +02:00
Martin Kroeker b080247a21 Revert "Mark temporaries as volatile to avoid SIGBUS in multithreaded builds with gcc15+ on 32bit FreeBSD/x86"
apple m / build-windows (cmake, gfortran, 0, 0) (push) Canceled after 0s
apple m / build-windows (cmake, gfortran, 0, 1) (push) Canceled after 0s
apple m / build-windows (cmake, gfortran, 1, 0) (push) Canceled after 0s
apple m / build-windows (cmake, gfortran, 1, 1) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 0, 0) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 0, 1) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 1, 0) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 1, 1) (push) Canceled after 0s
apple m / xbuild-x86_64 (push) Canceled after 0s
apple m / xbuild-ios (push) Canceled after 0s
apple m / xbuild-ios32 (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=C910V, C910V, riscv64-unknown-linux-gnu) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=RISCV64_GENERIC, RISCV64_GENERIC, riscv64-linux-gnu) (push) Canceled after 0s
Run codspeed benchmarks / benchmarks (make, gfortran, ubuntu-22.04, 3.12) (push) Canceled after 0s
continuous build / build (cmake, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / msys2 (None, mingw-w64-ucrt-x86_64-fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, <nil>, int32, MINGW32, mingw-w64-i686) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-clang-x86_64-fc, int32, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-clang-x86_64-fc, int64, -DBINARY=64 -DINTERFACE64=1, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-ucrt-x86_64-fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-ucrt-x86_64-fc, int64, -DBINARY=64 -DINTERFACE64=1, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / linux_thread_stress (openmp) (push) Canceled after 0s
continuous build / linux_thread_stress (pthread) (push) Canceled after 0s
continuous build / linux_thread_sanitizer (push) Canceled after 0s
continuous build / linux_thread_sanitizer_openmp (push) Canceled after 0s
continuous build / msys2_thread_stress (push) Canceled after 0s
continuous build / cross_build (DYNAMIC_ARCH=1 TARGET=GENERIC, mips64el, mips64el-linux-gnuabi64) (push) Canceled after 0s
continuous build / cross_build (TARGET=EV4, alpha, alpha-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=MIPS1004K, mipsel, mipsel-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=RISCV64_GENERIC, riscv64, riscv64-linux-gnu) (push) Canceled after 0s
continuous build / neoverse_build (push) Canceled after 0s
continuous build / neoverse_n1_build (push) Canceled after 0s
continuous build / neoverse_n1_omp_build (push) Canceled after 0s
continuous build / neoverse_n1_ilp64_build (push) Canceled after 0s
harmonyos / build (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6400, I6400, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6500, I6500, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=MIPS64_GENERIC, MIPS64_GENERIC, mips64el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=P6600, P6600, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=SICORTEX, SICORTEX, mips64el-linux-gnuabi64) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_GENERIC BINARY=64 ARCH=riscv64 DYNAMIC_ARCH=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64, DYNAMIC_ARCH=1) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL128B BINARY=64 ARCH=riscv64, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=128,elen=64, RISCV64_ZVL128B) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL256B BINARY=64 ARCH=riscv64 BUILD_BFLOAT16=1 BUILD_HFLOAT16=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64,zfh=true,zvfh=true,zvfbfwma=true, RISCV64_ZVL256B) (push) Canceled after 0s
2026-07-26 22:51:58 +02:00
lujiaweics b6ad3e2079 Fix build error in zrotg.c with FUNCTION_PROFILE=1 from Makefile.rule
Add missing FUNCTION_PROFILE_END / IDEBUG_END after all return
paths to properly close the brace opened by FUNCTION_PROFILE_START.
Use a do { … } while(0) wrapper so the macros stay outside any
nested block.
2026-07-27 01:58:17 +08:00
yuanhecai d16316e942 LoongArch64: adjust dsyrk GEMM_P block size to avoid failure
On LoongArch LA464 platform, dsyrk produces incorrect results
when processing certain block sizes, which in turn causes
dcholesky and dpotrf to fail on positive-definite matrices.

The issue manifests with specific block dimension combinations
(e.g., 80x16). Adjust GEMM_P from 112 to 96 so that
dsyrk's blocking logic avoids generating the problematic size.
2026-07-24 15:15:09 +08:00
yuanhecai 1b3358b3c5 LoongArch64: fix dgemm_ncopy_4_lsx.S segfault for small columns 2026-07-24 15:14:34 +08:00
yuanhecai 4c78593874 LoongArch64: fix sgemm_ncopy_16_lasx.S segfault for small columns 2026-07-24 15:13:42 +08:00
yuanhecai 018891aa98 LoongArch64: fix sgemm_ncopy_8_lasx.S segfault for small columns 2026-07-24 15:12:51 +08:00
Martin Kroeker 8766886cfc Merge pull request #5577 from mattip/attrib-hidden
add visibility=default to exported functions, visibility=hidden to most assembler
2026-07-24 00:16:00 +02:00
Martin Kroeker 15a14842a1 Expressly add visibility=default to override the "hidden" in CFLAGS 2026-07-23 20:14:14 +02:00
Martin Kroeker 0ddb20ffea Merge pull request #5940 from martin-frbg/lapack1332
Fix memory freeing on error paths of LAPACKE C/ZGEJSV,C/ZGESVDX (Reference-LAPACK PR 1332)
2026-07-23 10:34:28 +02:00
Martin Kroeker a543bd5d07 Export openblas_cancel and openblas_xerbla_handler 2026-07-23 10:33:28 +02:00
Amrita H S 8d439717c5 power/sbgemm_kernel_power10.c: reformat to 4-space indentation
Pure cosmetic cleanup; no functional changes.

Convert all tab-indented code to 4-space indent, align macro
continuation backslashes, switch brace placement to consistent K&R
style, reformat multi-line vector initialisers, and remove trailing
whitespace on SAVE4x2_ACC1_SCALAR.

Signed-off-by: Amrita H S <amritahs@linux.vnet.ibm.com>
2026-07-23 02:14:01 -05:00
Amrita H S 0d6d459161 power/bgemm: add BFloat16-in, BFloat16-out GEMM kernel for POWER10
Add BGEMM (BF16 input → BF16 output) for POWER10 by reusing the
existing SBGEMM kernel infrastructure. A -DBGEMM compile flag switches
only the store path; the xvbf16ger2pp MMA instruction and BF16 packing
routines are shared with SBGEMM unchanged.

Changes
-------
kernel/power/KERNEL.POWER10
  - Register BGEMM kernel and copy-routine targets, reusing the
    sbgemm_ncopy/tcopy sources (packing layout is identical).

kernel/power/sbgemm_kernel_power10.c
  - Under BGEMM: force v4sf_t to float so accumulators stay in
    float32; add STORE4_BF16/STORE2_BF16 macros (read BF16 C, widen,
    apply alpha*acc, convert back via xvcvspbf16, store); add
    f32_to_bf16_scalar() for m&1/n&1 tails; add BGEMM variants of
    all SAVE_ACC macros covering the full m/n tile hierarchy.

param.h
  - Add BGEMM_DEFAULT_UNROLL_M=16, UNROLL_N=8, P/Q/R blocking
    parameters for POWER10, matching the 16x8 kernel tile.

Unit test (utest/test_extensions/test_bgemm.c)
  - Uses SBGEMM as a trusted reference. 21 test cases cover all four
    transpose combinations, all m/n remainder paths, odd-k, alpha=0,
    beta=0/1, and the m>=32 fast path. Tolerance 0.01 to account for
    the one extra BF16 rounding on the BGEMM store.

Performance (POWER10, single-threaded, Transa=N Transb=N)
----------------------------------------------------------
Step=1 (sizes 1–200):
  - Sizes 1–80:   baseline 0.1–128 MFlops (scalar fallback);
                  patch 0.1–39,656 MFlops (up to ~350x faster at M=80).
  - Sizes 81–200: patch 3x–24x faster (avg ~10x) with 16×8 MMA tile
                  engaged.

Step=8 (sizes 8–1024):
  - Baseline peaks at ~2,950 MFlops (avg ~1,746 MFlops).
  - Patch sustains 75,000–1,009,866 MFlops for sizes 384–960,
    exceeding 1 TFlops at large sizes.
  - Median speedup ~99x; average speedup ~140x across all sizes.

Signed-off-by: Amrita H S <amritahs@linux.vnet.ibm.com>
2026-07-23 02:13:31 -05:00
Martin Kroeker 2a9e09faad Merge pull request #5941 from martin-frbg/issue5937
Fix C/C++ atomics conflict in compilation of the cpp_thread_tests
2026-07-23 08:58:14 +02:00
Martin Kroeker 52f0572564 Guard use of C11 atomics against C++ compilation 2026-07-23 00:08:50 +02:00
Martin Kroeker c3de327dd5 Add CX factorization (expert) routines ?GECXX (Reference-LAPACK PR 1161) (#5938)
* Add CX factorization (expert) routines ?GECXX (Reference-LAPACK PR 1161)
2026-07-23 00:02:28 +02:00
Martin Kroeker 251169b710 Fix invalid deallocations on error paths (Reference-LAPACK PR 1332) 2026-07-22 23:59:08 +02:00
Martin Kroeker cf8a045b0e Merge pull request #5939 from martin-frbg/lapack1331
Avoid computing ONE/HUGE unless needed (Reference-LAPACK PR 1331)
2026-07-22 21:58:57 +02:00
Martin Kroeker b6df159a67 Avoid computing ONE/HUGE unless needed (Reference-LAPACK PR 1331) 2026-07-22 17:49:20 +02:00
Martin Kroeker 8c1535b8d9 Merge pull request #5936 from martin-frbg/fixup-5883
Use QR for bidiagonal SVD with vectors in ?BDSDC (Reference-LAPACK PR 1300)
2026-07-22 11:40:52 +02:00
Martin Kroeker 39cdbe6a3c expose openblas_set_xerbla 2026-07-22 00:07:43 +02:00
Martin Kroeker 63ad298a67 Merge branch 'develop' into attrib-hidden 2026-07-21 20:00:16 +02:00
Martin Kroeker 1c6f5f4efd Use QR for bidiagonal SVD with vectors in ?BDSDC (Reference-LAPACK PR 1300) 2026-07-21 18:50:28 +02:00
Martin Kroeker efab2a2fde Merge pull request #5929 from moluopro/remove-misspelled-bdsdc-sources
Fix CMake dynamic-arch fallback and remove unused BDSDC source copies
2026-07-21 18:40:25 +02:00
Martin Kroeker 0b54dd1154 Merge pull request #5933 from martin-frbg/issue5932
Fix compilation with MinGW-W64-Clang under Windows-Arm64
2026-07-20 07:50:42 +02:00
Martin Kroeker d496ab17c2 Merge pull request #5882 from KenoAIStaging/kf/cancellation
Add an asynchronous cancellation API for in-flight operations
2026-07-20 00:25:16 +02:00
Martin Kroeker 4ab4f1eae9 Fix identification of MinGW64 on WoA 2026-07-20 00:20:05 +02:00
Martin Kroeker 96d60aa6a8 Fix version check and prefix llvm backend option 2026-07-20 00:14:23 +02:00
Martin Kroeker 0d928ca275 stack-hazard-size is a llvm backend option 2026-07-20 00:09:07 +02:00
Martin Kroeker 544afb15d6 stack-hazard-size is a llvm backend option 2026-07-20 00:06:48 +02:00
Martin Kroeker f959027a06 Merge pull request #5925 from martin-frbg/fix_getarch_woa
Fix getarch build error in Windows-on-Arm
2026-07-19 17:57:39 +02:00
moluopro 1b64851291 RISCV64-CI: Backport QEMU clone_lock fix 2026-07-19 23:32:40 +08:00
moluopro 43f18d82f5 AzureCI: Parallelize macOS CMake build 2026-07-19 23:32:22 +08:00
Felix-Gong 837c5f67d3 Fix RVV TRSM packed-A traversal
Tile packed-A traversal by GEMM_UNROLL_M so the RVV TRSM solver matches the GEMM/itcopy packing contract on non-x280 RISC-V targets. This keeps the RVV solve path while avoiding VLEN-dependent corruption when VSETVL_MAX differs from the target GEMM unroll width.

Signed-off-by: Xiaofei Gong <gongxiaofei24@iscas.ac.cn>
Signed-off-by: YuanSheng <yuansheng@isrc.iscas.ac.cn>
2026-07-19 14:43:14 +00:00
moluopro 6421c17643 AzureCI: Restore SkylakeX fallback coverage
Keep SkylakeX in the dynamic list with NO_AVX512 so the CMake job verifies that it is demoted to Haswell.
2026-07-19 20:48:28 +08:00
moluopro 2f21ad9282 CMake: Use effective core for fallback kernels
Keep the logical target for dynamic dispatch names while selecting kernel sources and capabilities from the core chosen by getarch after ISA restrictions.
2026-07-19 20:48:10 +08:00
moluopro e21bffc882 AzureCI: Align dynamic list with NO_AVX512 2026-07-19 18:59:06 +08:00
moluopro c7d1f1381c AzureCI: Fix DYNAMIC_LIST in CMake jobs
Pass DYNAMIC_LIST as a semicolon-separated CMake list so each target becomes a separate preprocessor definition. Make the affected scripts fail immediately instead of masking configuration failures.
2026-07-19 14:38:03 +08:00
Keno FischerandClaude Fable 5 7a07c8e1f4 Add an asynchronous cancellation API for in-flight operations
Long-running BLAS calls (a large gemm can run for minutes) cannot
currently be interrupted: callers embedding OpenBLAS (e.g. the Julia
runtime responding to a user's ^C) can only wait for completion or kill
the process. Add a minimal cooperative cancellation protocol:

Every thread owns a pointer-sized generation slot in thread-local
storage, whose stable address is returned by openblas_cancel_token().
Instrumented compute drivers advance the slot to a fresh even
generation at operation entry on the issuing thread (forwarding the
slot and generation to worker threads through blas_arg_t) and poll it
at block granularity. openblas_cancel(token, loaded_token) - callable
from any thread - sets the cancel bit (bit 0) iff the slot still holds
loaded_token, so a canceller that loaded the value while an operation
was in flight stops exactly that operation, while stale or racing
requests either miss or dirty an already-dead generation, both
harmless. There is no object lifecycle: nothing to allocate, bind,
reset, or free.

A cancelled operation returns quickly, leaving its output buffer in an
unspecified partially-updated state that the caller must discard; every
synchronization point in the threaded driver is still executed, so
sibling threads never stall and the library remains consistent for
subsequent calls. Coverage: the level-3 gemm/symm/hemm drivers
(level3.c and level3_thread.c).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012nCkyKUguncLLJrH9K5o7m
2026-07-19 04:20:28 +00:00
moluopro 14d78d31c8 Remove unused misspelled DBDSDC source copy 2026-07-19 11:33:01 +08:00
moluopro e3b9b82636 Remove unused misspelled SBDSDC source copy 2026-07-19 11:32:53 +08:00
Martin Kroeker 3f55cbce38 Fix array/pointer argument mismatch on WoA 2026-07-17 14:31:37 +02:00
Martin Kroeker a7d62fe5de Set version to 0.3.34.dev 2026-07-16 22:06:49 +02:00
Martin Kroeker c604fcf79c Set version to 0.3.34.dev 2026-07-16 22:06:08 +02:00
Martin Kroeker 59907029f6 Merge pull request #5923 from OpenMathLib/release-0.3.0
Merge back from 0.3.34 release to copy tag
2026-07-16 22:05:10 +02:00
Martin Kroeker e0166008be Update version to 0.3.34
arm64 graviton cirun / build (cmake, gfortran) (push) Canceled after 0s
arm64 graviton cirun / build (make, gfortran) (push) Canceled after 0s
Nightly-Homebrew-Build / build-OpenBLAS-with-Homebrew (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=C910V, C910V, riscv64-unknown-linux-gnu) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=RISCV64_GENERIC, RISCV64_GENERIC, riscv64-linux-gnu) (push) Canceled after 0s
Run codspeed benchmarks / benchmarks (make, gfortran, ubuntu-22.04, 3.12) (push) Canceled after 0s
continuous build / build (cmake, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, flang, ubuntu-latest) (push) Canceled after 0s
apple m / build-windows (cmake, gfortran, 0, 0) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
apple m / build-windows (cmake, gfortran, 0, 1) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / msys2 (None, mingw-w64-ucrt-x86_64-fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
apple m / build-windows (cmake, gfortran, 1, 0) (push) Canceled after 0s
continuous build / msys2 (Release, <nil>, int32, MINGW32, mingw-w64-i686) (push) Canceled after 0s
apple m / build-windows (cmake, gfortran, 1, 1) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-clang-x86_64-fc, int32, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-clang-x86_64-fc, int64, -DBINARY=64 -DINTERFACE64=1, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 0, 0) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-ucrt-x86_64-fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, mingw-w64-ucrt-x86_64-fc, int64, -DBINARY=64 -DINTERFACE64=1, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 0, 1) (push) Canceled after 0s
continuous build / linux_thread_stress (openmp) (push) Canceled after 0s
apple m / build-windows (make, gfortran, 1, 0) (push) Canceled after 0s
continuous build / linux_thread_stress (pthread) (push) Canceled after 0s
continuous build / linux_thread_sanitizer (push) Canceled after 0s
apple m / build-windows (make, gfortran, 1, 1) (push) Canceled after 0s
continuous build / linux_thread_sanitizer_openmp (push) Canceled after 0s
apple m / xbuild-x86_64 (push) Canceled after 0s
continuous build / msys2_thread_stress (push) Canceled after 0s
apple m / xbuild-ios (push) Canceled after 0s
apple m / xbuild-ios32 (push) Canceled after 0s
continuous build / cross_build (DYNAMIC_ARCH=1 TARGET=GENERIC, mips64el, mips64el-linux-gnuabi64) (push) Canceled after 0s
continuous build / cross_build (TARGET=EV4, alpha, alpha-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=MIPS1004K, mipsel, mipsel-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=RISCV64_GENERIC, riscv64, riscv64-linux-gnu) (push) Canceled after 0s
continuous build / neoverse_build (push) Canceled after 0s
continuous build / neoverse_n1_build (push) Canceled after 0s
continuous build / neoverse_n1_omp_build (push) Canceled after 0s
continuous build / neoverse_n1_ilp64_build (push) Canceled after 0s
harmonyos / build (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6400, I6400, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6500, I6500, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=MIPS64_GENERIC, MIPS64_GENERIC, mips64el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=P6600, P6600, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=SICORTEX, SICORTEX, mips64el-linux-gnuabi64) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_GENERIC BINARY=64 ARCH=riscv64 DYNAMIC_ARCH=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64, DYNAMIC_ARCH=1) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL128B BINARY=64 ARCH=riscv64, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=128,elen=64, RISCV64_ZVL128B) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL256B BINARY=64 ARCH=riscv64 BUILD_BFLOAT16=1 BUILD_HFLOAT16=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64,zfh=true,zvfh=true,zvfbfwma=true, RISCV64_ZVL256B) (push) Canceled after 0s
2026-07-16 21:53:40 +02:00
Martin Kroeker 45e68d2240 Update version to 0.3.34 2026-07-16 21:52:30 +02:00
Martin Kroeker c13a003e40 Merge pull request #5922 from OpenMathLib/develop
Update from develop for 0.3.34 release
2026-07-16 21:51:15 +02:00
Martin Kroeker 07690084bf Update changelog for 0.3.34 (#5897)
* Update for 0.3.34
2026-07-16 21:48:07 +02:00
Martin Kroeker 55d6e6b98c Merge pull request #5921 from martin-frbg/issue5905
Mark temporaries as volatile to avoid SIGBUS in multithreaded builds with gcc15+ on 32bit FreeBSD/x86
2026-07-16 21:39:26 +02:00
Martin Kroeker bf7f06d9ac Mark temporaries as volatile to avoid SIGBUS in multithreading with gcc15+ on 32bit FreeBSD/x86 2026-07-16 18:42:23 +02:00
Martin Kroeker 739b2f084c Mark temporaries as volatile to avoid SIGBUS in multithreading with gcc15+ on 32bit FreeBSD/x86 2026-07-16 18:40:45 +02:00
Martin Kroeker 9ce1d6ff2a Mark temporaties as volatile to avoid SIGBUS in multithreading with gcc15+ on 32bit FreeBSD/x86 2026-07-16 18:39:06 +02:00
Martin Kroeker 15351019ea Mark subbuffer as volatile to fix SIGBUS in multithreading with gcc15+ on 32bit FreeBSD/x86 2026-07-16 18:35:14 +02:00
Martin Kroeker dd69b9d0ce Mark floats as volatile to fix SIGBUS in multithreading with gcc15+ on 32bit FreeBSD/x86 2026-07-16 18:33:19 +02:00
Martin Kroeker cefdaed87c translate BSD's i386 hostarch name and automatically set BINARY=32 for it 2026-07-16 18:30:17 +02:00
Martin Kroeker 43f9441317 Merge pull request #5920 from martin-frbg/lapack1245
Avoid large intermediates in (C/Z)LARTG (Reference-LAPACK PR 1245)
2026-07-16 01:12:38 +02:00
Martin Kroeker 53b14986de Avoid large intermediates in (C/Z)LARTG (Reference-LAPACK PR 1245) 2026-07-15 20:59:17 +02:00
Martin Kroeker 3e48730742 Add transpose support for C in GEADD (fixes #4646) (#5913)
* Add transpose support for C in GEADD (fixes #4646)

Extends GEADD to support independent transposition of both A and C,
matching the behavior of cuBLAS's geam and Apple's Accelerate geadd.
Previously only A could be transposed.

- Add transc parameter across cblas.h, common_interface.h,
  common_level3.h, common_param.h
- Add transc handling to interface/geadd.c and interface/zgeadd.c
- Extend kernel/generic/geadd.c and kernel/generic/zgeadd.c with
  stride logic for transposed C
- Add transpose test coverage (hand-verified 2x2 cases and randomized
  large-matrix tests) for sgeadd, dgeadd, cgeadd, zgeadd

* Add self to CONTRIBUTORS.md
2026-07-15 18:34:43 +02:00
Martin Kroeker dc3aa2cbd9 Fix non-SVE ARM64 potentially using non-zeroed register in SDOT/DDOT accumulation (#5918)
* Zero d0 register as it may not be identical with OUT, amend clobber list

* Add sdot/ddot reproducer from issue 5917 as ARM64-specific utest
2026-07-15 17:30:11 +02:00
aadityansha06 aade7ec2ff Add self to CONTRIBUTORS.md 2026-07-15 17:12:31 +05:30
aadityansha06 2c6bf39e4e Add transpose support for C in GEADD (fixes #4646)
Extends GEADD to support independent transposition of both A and C,
matching the behavior of cuBLAS's geam and Apple's Accelerate geadd.
Previously only A could be transposed.

- Add transc parameter across cblas.h, common_interface.h,
  common_level3.h, common_param.h
- Add transc handling to interface/geadd.c and interface/zgeadd.c
- Extend kernel/generic/geadd.c and kernel/generic/zgeadd.c with
  stride logic for transposed C
- Add transpose test coverage (hand-verified 2x2 cases and randomized
  large-matrix tests) for sgeadd, dgeadd, cgeadd, zgeadd
2026-07-15 17:12:31 +05:30
Martin Kroeker b338322e9a Merge pull request #5900 from mpwaser/fix/c910v-qemu-utest-timeout
Relax C910V qemu utest timeout
2026-07-15 11:27:06 +02:00
Martin Kroeker 6604a7277c Merge pull request #5916 from martin-frbg/lapack1289
Fix workspace queries for TZRZF/UNMRZ in ?GELSY (Reference-LAPACK PR1289/1325)
2026-07-15 07:56:46 +02:00
Martin Kroeker 75b8a2ce93 Fix parameter queries for TZRZF/UNMRZ in ?GELSY (Reference-LAPACK PR 1289&1325) 2026-07-14 22:14:02 +02:00
Martin Kroeker b28cdccd2d Merge pull request #5915 from martin-frbg/fixup5802
Rework the -mpwr10 option to be only applied to POWER9/10 on FreeBSD
2026-07-14 22:05:19 +02:00
Martin Kroeker 036e835019 Merge pull request #5912 from martin-frbg/lapack1288
Fix seed advancement in SLARUV/DLARUV (Reference-LAPACK PR 1288)
2026-07-14 20:30:43 +02:00
Martin Kroeker fd88cac200 Merge pull request #5911 from martin-frbg/lapack1305
Replace HUGE intrinsic in ?TGSJA for consistency (Reference-LAPACK PR 1305)
2026-07-14 17:58:23 +02:00
Martin Kroeker 87aac59e87 Rework the -mpwr10 option to be only applied to POWER9/10 on FreeBSD 2026-07-14 16:27:16 +02:00
Martin Kroeker 1e14cc90f8 Merge pull request #5910 from martin-frbg/lapack1298
Fix test failures in ?CHKLQ when NB=1 with M=N (Reference-LAPACK PR 1298)
2026-07-14 15:44:45 +02:00
Martin Kroeker 136a714687 Merge pull request #5914 from martin-frbg/u74detect
Add cpu detection for Sifive U74
2026-07-14 15:20:31 +02:00
Martin Kroeker a5dcb2a8a8 Merge pull request #5909 from hmeiland/riscv64-blas-set-parameter
RISC-V: cache-aware GEMM blocking (get_L2_size + blas_set_parameter)
2026-07-14 12:27:10 +02:00
Martin Kroeker 41aad1107a Add Sifive U74 2026-07-14 07:30:47 +02:00
Martin Kroeker 873f005957 Merge pull request #5903 from hmeiland/u74-gemm-4x4-kernel
Add SiFive U74 target with a scalar 4×4 register-tiled GEMM kernel
2026-07-14 07:27:12 +02:00
Martin Kroeker 6b1d101317 Fix seed advancement on rejected uniform deviate (Reference-LAPACK PR 1288) 2026-07-13 19:56:29 +02:00
Martin Kroeker cdde6e8c4d Replace HUGE intrinsic (Reference-LAPACK PR 1305) 2026-07-13 19:50:05 +02:00
Martin Kroeker 5e517085c5 Fix test failures when NB=1 with M=N (Reference-LAPACK PR 1298) 2026-07-13 19:40:43 +02:00
Martin Kroeker 65382d22d4 Merge pull request #5583 from vtjnash/fix-libnamesuffix-handling
build: Fix LIBNAMESUFFIX handling in CMake documentation
2026-07-13 16:59:12 +02:00
Hugo Meiland 5d7868f487 U74 target: move the U74-specific gemm kernel to kernel/riscv64
Per review, the U74-specific DGEMM micro-kernel does not belong under
kernel/generic (reserved for portable, architecture-neutral C kernels).
Move both the hybrid dispatcher and its readable assembly source into
kernel/riscv64, next to KERNEL.U74:

- git mv kernel/generic/gemmkernel_4x4_u74.c -> kernel/riscv64/
- git mv kernel/generic/kern_u74.S          -> kernel/riscv64/
- KERNEL.U74: DGEMMKERNEL ../generic/gemmkernel_4x4_u74.c
                       -> ../riscv64/gemmkernel_4x4_u74.c
- gemmkernel_4x4_u74.c: #include "conversion_macros.h"
                     -> #include "../generic/conversion_macros.h"
  (that header stays under kernel/generic; same form kernel/wasm
   already uses for it)

No functional change. The portable gemmkernel_4x4.c (SGEMMKERNEL) is
untouched and stays in kernel/generic. DGEMMKERNEL still resolves through
$(KERNELDIR), so both the Makefile ($(KERNELDIR)/$(DGEMMKERNEL)) and CMake
(GenerateNamedObjects "${KERNELDIR}/${DGEMMKERNEL}") builds pick the kernel
up from its new location.
2026-07-13 16:37:03 +02:00
Martin Kroeker 113410db3e Merge pull request #5904 from moluopro/fix/xerbla-handler
Add a portable XERBLA handler API
2026-07-13 15:15:03 +02:00
Martin Kroeker b668c9a376 Merge pull request #5808 from nh2/issue-5806-openblas_set_num_threads-openmp
Make OpenBLAS's usage of OpenMP respect `openblas_set_num_threads()`
2026-07-13 14:38:03 +02:00
Martin Kroeker 65b51b0c12 Merge pull request #5908 from moluopro/cleanup/remove-misplaced-lapacke-wrappers
Remove misplaced LAPACKE `?gesvdq_work` source files
2026-07-13 13:32:18 +02:00
Hugo Meiland 269e1cd505 RISC-V: add get_L2_size() and blas_set_parameter() for cache-aware GEMM blocking
RISC-V was the only major architecture without a get_L2_size() /
blas_set_parameter() implementation, so the GEMM cache-blocking parameters
(P/Q/R) were fixed at compile time regardless of the actual L2 cache size.

Because the blocking is now derived from the L2 cache detected at runtime
rather than a fixed compile-time constant, future RISC-V cores - which are
arriving with progressively larger and more varied L2 caches - get more
optimal blocking automatically, and the port gains the same runtime-tuning
hook x86 and LoongArch already use.

This adds, under ARCH_RISCV64:

- get_L2_size(): reads the level-2 (unified) cache size from Linux sysfs
  (/sys/devices/system/cpu/cpu0/cache/index*/{level,size}); RISC-V has no
  architectural cache-size query like x86 CPUID or LoongArch CPUCFG. Falls
  back to 512 KB when sysfs is unavailable.

- blas_set_parameter(): scales each precision's packed-A dimension P from the
  detected L2. The base blocking and the reference cache size come from the
  active core's own param.h block (*_DEFAULT_P_BASE, RISCV_L2_REFERENCE_KB),
  so the function carries no core-specific constants and is a no-op for cores
  that do not opt in. Q and R keep their param.h defaults.

- driver/others/memory.c and common_macro.h: add ARCH_RISCV64 to the existing
  architecture lists that call blas_set_parameter() and declare the runtime
  parameter variables (sgemm_p, dgemm_p, ...).

- param.h RISCV64_ZVL256B: declares the per-core base blocking + reference and
  maps SGEMM/DGEMM/CGEMM/ZGEMM DEFAULT_P to the runtime variables for static
  builds; DYNAMIC_ARCH keeps the literals, since kernel/setparam-ref.c
  init_parameter() initialises the gotoblas table from these macros and
  blas_set_parameter() is not called on the dynamic path.

Only RISCV64_ZVL256B opts in so far; its base + reference are tuned on the
SpaceMiT X60, where a 512 KB L2 reproduces the stock blocking, so this is
performance-neutral on current hardware. Verified: a static RISCV64_ZVL256B
build reproduces the stock 128/128/16384 (SGEMM) and 64/128/8192 (DGEMM)
blocking; a DYNAMIC_ARCH build compiles cleanly (per-core setparam-ref objects
build without error); and get_L2_size() reads the correct size on both a
SpaceMiT X60 (512 KB L2) and a SiFive U74 / VisionFive 2 (2 MB L2).
2026-07-13 11:00:15 +02:00
moluopro 0f68da835c Remove misplaced LAPACKE GESVDQ wrapper sources
These stale duplicate sources are not referenced by the build. The canonical implementations remain under lapack-netlib/LAPACKE/src.

Signed-off-by: moluopro <moluopro@qq.com>
2026-07-13 12:40:03 +08:00
Niklas Hambüchen f8674a7be8 Make OpenBLAS's usage of OpenMP respect openblas_set_num_threads(). Fixes #5806.
Until now, the code in `num_cpu_avail()`,

    if (blas_cpu_number != openmp_nthreads) {
      goto_set_num_threads(openmp_nthreads);
    }

would just always set the threads back to OpenMP's thread count.
2026-07-12 06:11:17 +02:00
Martin Kroeker 992a536238 Merge pull request #5902 from wxpppp/develop
LoongArch64: avoid SGEMM LA464 ncopy fallthrough from N2 to N1
2026-07-12 01:11:37 +02:00
moluopro 6720959694 docs: summarize XERBLA handler semantics 2026-07-11 20:02:43 +08:00
moluopro 477131d547 cblas: clarify XERBLA handler lifetime 2026-07-11 20:02:13 +08:00
moluopro 03cfefcdcb cmake: propagate CBLAS test failures on Windows 2026-07-11 19:53:42 +08:00
moluopro 8ac41809cf test: register XERBLA for level 3 BLAS 2026-07-11 19:52:20 +08:00
moluopro e4891bc055 test: register XERBLA for level 2 BLAS 2026-07-11 19:50:56 +08:00
moluopro 7a24cf7a6a test: harden Makefile result handling 2026-07-11 19:49:33 +08:00
moluopro b5fa89f351 cmake: harden regular BLAS error tests 2026-07-11 19:48:33 +08:00
moluopro 066e9076c3 test: add a regular BLAS XERBLA bridge 2026-07-11 19:47:54 +08:00
Martin Kroeker d9788925a9 Merge pull request #5898 from moluopro/develop
Fix ARM64 SME direct-kernel build and dispatch
2026-07-11 10:52:51 +02:00
moluopro 97abc61bfc docs: clarify XERBLA handler behavior on ELF 2026-07-10 20:40:50 +08:00
moluopro d093ab90e9 docs: clarify XERBLA handler concurrency 2026-07-10 15:54:19 +08:00
moluopro ed8f1198b2 utest: bound XERBLA routine name diagnostics 2026-07-10 15:40:02 +08:00
moluopro f07e6a3d0d exports: preserve Windows ordinals in Perl generator 2026-07-10 15:39:22 +08:00
moluopro 490721cbd9 exports: preserve Windows ordinals for new symbols 2026-07-10 15:38:26 +08:00
moluopro 5daa61827a ctest: fail level-3 error-exit mismatches 2026-07-10 15:04:13 +08:00
moluopro cd4786dd78 ctest: fail level-2 error-exit mismatches 2026-07-10 15:03:18 +08:00
moluopro 39526d88c9 ctest: add a fatal test failure helper 2026-07-10 15:02:17 +08:00
moluopro 99bb32ae59 ctest: use explicit XERBLA handlers in error tests 2026-07-10 15:00:36 +08:00
moluopro 29703e52ad utest: cover explicit XERBLA handler registration 2026-07-10 14:59:30 +08:00
moluopro d7e007e0fb docs: document XERBLA handler semantics 2026-07-10 14:58:35 +08:00
moluopro 8da645954b exports: expose the XERBLA handler setter 2026-07-10 14:56:48 +08:00
moluopro 6a04925804 xerbla: add a portable handler API 2026-07-10 14:55:52 +08:00
moluopro b2ba228de5 install: preserve callback typedefs in generated CBLAS headers 2026-07-10 14:54:02 +08:00
moluopro 992ea2dab5 cmake: preserve callback typedefs in generated CBLAS headers 2026-07-10 14:53:18 +08:00
hmeiland d6e64e8032 U74 target: add CMake build support
Mirror the RISCV64_GENERIC target blocks for U74 in cmake/prebuild.cmake
(cache defines: 32 KiB L1D / 2 MiB L2, 64 B lines, matching getarch),
cmake/system.cmake and cmake/cc.cmake
(-march=rv64imafdc_zba_zbb -mabi=lp64d -mtune=sifive-u74), so
'cmake -DTARGET=U74' builds alongside the Makefile path.

Verified on a VisionFive 2: configure recognizes the target and a full
'cmake --build' produces libopenblas.a with the U74 march/mtune flags
applied to the kernel objects (0 errors).
2026-07-10 06:36:10 +02:00
hmeiland cfdaa69b9f U74 asm kernel: note full-memory HPL result in header
Full-memory HPL N=27456 (asm hybrid + Q=256) measured at 5.99 GFLOPS
(residual PASSED, ~50% of the 12 GF peak, +10.7% over the tuned C kernel,
1.81x the stock 2x2) - the best clean figure. Doc-only header update.
2026-07-10 05:44:15 +02:00
hmeiland 4999e881a5 U74 target: hand-scheduled scalar asm DGEMM micro-kernel
Adds a hand-written RV64GC scalar 4x4 DGEMM micro-kernel (kern_u74.S) and
wires it as the U74 DGEMMKERNEL via a hybrid dispatcher
(gemmkernel_4x4_u74.c): the fast path (bm,bn multiples of 4, even bk,
non-TRMM) runs the asm; all other shapes, odd bk, and the TRMM builds fall
back to the portable C 4x4 kernel.

The asm uses a 4x4 register tile (16 accumulators), full operand double-
buffering (P/Q ping-pong) with one-iteration lookahead, and load-before-FMA
issue ordering matched to the U74's dual-issue in-order front end.  Probes
show this reaches the FP-pipe peak (~16.5 cycles / 16 fmadd.d = 2.9 GF on
L1-resident data); the streaming plateau is memory-latency-bound, not the
schedule.

Measured on a VisionFive 2 (single-core, KC=256): micro-kernel 1.88 vs 1.54
GF (+22%), full blocked DGEMM 1.77 vs 1.48 GF (+20%); the advantage holds
under 4-core contention (+17%).  End-to-end HPL N=10000 (4 cores, Q=256):
5.17 vs 4.97 GF (+4.0%), residual PASSED.  Correctness validated against the
full BLAS Level-3 test suite (DGEMM 17,496 computational calls, 0 failures).
kern_u74.S is the readable source; the .c embeds it via top-level __asm__ so
it builds as a single OpenBLAS kernel object with no build-system changes.
2026-07-10 03:31:45 +02:00
hmeiland e4228c3255 U74 target: raise DGEMM_DEFAULT_Q to 256
A same-board controlled HPL A/B (VisionFive 2, TARGET=U74, N=10000,
NB=192, 2x2 grid, both libraries clean-built, residual PASSED) measures
4.97 vs 4.86 GFLOPS (+2.25%) for DGEMM_Q=256 over the inherited 128; at
a memory-filling N=27456 the tuned build sustains 5.41 vs 5.24 GFLOPS
(+3.24%). With HPL's NB=192, KC=256>=192 lets each trailing-update K
panel run in a single KC block, halving the C read-modify-write traffic
versus KC=128 (which splits K=192 into 128+64). A single-core P/Q sweep
over the real packing + micro-kernel objects confirms the GEMM is
compute-bound (whole grid within 3%), so P and R are left unchanged;
SGEMM_Q was already 240.
2026-07-10 01:26:18 +02:00
hmeiland b8949d1663 U74 target: build for the full JH7110 ISA (add Zba/Zbb)
The StarFive JH7110's U74 cores implement rv64imafdc_..._zba_zbb, so the U74
target now compiles with -march=rv64imafdc_zba_zbb. The generic RISCV64_GENERIC
target stays at bare rv64imafdc for portability across unknown RV64GC cores.

Measured on the VisionFive 2 (GCC 13.3, -mtune=sifive-u74 held constant): GCC
emits Zba shift-add instructions in the packing routines, but DGEMM is unchanged
-- the 4x4 kernel holds 1.533 GF either way and packing 1.74 vs 1.75 GB/s. The
4x4 micro-kernel is FMA-bound (fused fmadd.d with immediate-offset loads) and
packing is LPDDR4-bandwidth-bound, so integer address generation is not on the
critical path. The flag is nonetheless the correct -march for the silicon, is
free, and can only help address-gen-bound code elsewhere in the library. The
remaining GEMM headroom on the U74 is microarchitectural scheduling (a
hand-written assembly micro-kernel), not the ISA.
2026-07-09 20:21:40 +02:00
wangweijie 2707282e8c LoongArch64: avoid SGEMM LA464 ncopy fallthrough from N2 to N1 2026-07-09 20:53:05 +08:00
mpwaser e127edeb5e Relax C910V qemu utest timeout 2026-07-09 14:10:00 +02:00
hmeiland a3620c264a Add U74 target with a 4x4 register-tiled GEMM kernel
The SiFive U74 (RV64GC; e.g. StarFive JH7110 / VisionFive 2) is a scalar,
in-order core with no RVV, so today it falls back to RISCV64_GENERIC whose
S/D GEMM uses the generic 2x2 C micro-kernel.

Per the U74 Core Complex Manual (Table 169) fmadd.d has a 7-cycle latency
at repeat rate 1 (fully pipelined). A 2x2 tile exposes only 4 independent
accumulator chains -- fewer than the FMA latency -- so the FP pipe stalls
on the accumulator dependency, and the 1:1 load:FMA ratio saturates the
single load/store pipe ("only one outstanding line fill", manual 8.2).

This adds a portable 4x4 GEMM micro-kernel and a dedicated U74 target:

- kernel/generic/gemmkernel_4x4.c: 16-accumulator 4x4 register tile. 16
  independent chains exceed the 7-cycle latency, and the load:FMA ratio
  drops to 1:2. 16 acc + 4 A + 4 B fit RV64G's 32 FP registers without
  spilling. Full 4/2/1 edge handling in both M and N.

- U74 target wiring: getarch.c (FORCE_U74, 32 KiB/64 B L1D, 2 MiB L2),
  param.h (S/D UNROLL 4/4; complex stays 2/2), kernel/riscv64/KERNEL.U74
  (S/D GEMM -> gemmkernel_4x4 + gemm_[nt]copy_4; S/D TRMM -> existing
  trmmkernel_4x4), Makefile.prebuild + Makefile.riscv64 (-mtune=sifive-u74),
  TargetList.txt, cpuid_riscv64.c.

The 4x4 kernel was verified numerically against a naive reference GEMM,
driven through the real gemm_tcopy_4 / gemm_ncopy_4 packing routines,
across 27,436 M/N/K x alpha combinations covering every 4/2/1 tail case:
worst absolute error 0.

Build with: make TARGET=U74
2026-07-09 14:00:16 +02:00
Martin Kroeker 7c991951a5 Merge pull request #5899 from mpwaser/fix/utest-ext-ctest
Fix CTest command for openblas_utest_ext
2026-07-09 11:12:58 +02:00
mpwaser 48c927bd1f Fix CTest command for openblas_utest_ext 2026-07-09 09:50:42 +02:00
moluopro 06d553d0b1 arm64: normalize SME direct source line endings 2026-07-09 13:44:29 +08:00
moluopro 6fdc8db640 arm64: tighten SME STRMM direct variants 2026-07-09 13:43:51 +08:00
moluopro 95cae64181 arm64: harden SME SGEMM direct heuristic 2026-07-09 13:42:48 +08:00
moluopro 18b41f3c4d interface: gate ARM64 STRMM direct fast path 2026-07-09 13:42:12 +08:00
moluopro a33e238b35 cmake: define ARM64 SME direct kernel variants 2026-07-09 13:41:10 +08:00
moluopro 8dcf13a87e cmake: clean up ARMV9SME Windows Clang flags 2026-07-09 13:40:22 +08:00
Martin Kroeker e7b4517435 Merge pull request #5564 from vtjnash/jn/build-exe
Add $(EXE) suffix to executables in Makefiles
2026-07-08 20:50:11 +02:00
Martin Kroeker 788d544f3a Merge pull request #5895 from moluopro/develop
RISC-V: Add TRSM RVV Kernels for ZVL Targets
2026-07-08 18:59:13 +02:00
Martin Kroeker 8af8d8f4b6 Merge branch 'develop' into jn/build-exe 2026-07-08 16:39:07 +02:00
Martin Kroeker baa253650a Merge pull request #5872 from jschueller/tcap
Add missing thread caps
2026-07-08 13:58:38 +02:00
moluopro 0e163c9db2 kernel/riscv64: enable RVV TRSM for ZVL256B 2026-07-08 19:42:26 +08:00
moluopro a8b8136114 kernel/riscv64: enable RVV TRSM for ZVL128B 2026-07-08 19:42:17 +08:00
moluopro 0723136260 kernel/riscv64: add RVV RT TRSM kernel 2026-07-08 19:42:09 +08:00
moluopro e4e3ad2430 kernel/riscv64: add RVV RN TRSM kernel 2026-07-08 19:41:58 +08:00
moluopro 945f4352d3 kernel/riscv64: add RVV LT TRSM kernel 2026-07-08 19:41:49 +08:00
moluopro 5282a38239 kernel/riscv64: add RVV LN TRSM kernel 2026-07-08 19:41:42 +08:00
Martin Kroeker 34f66e5004 Merge pull request #5894 from martin-frbg/getrf_tsan
Change atomic semantics in GETRF to acquire/release to fix tsan warnings
2026-07-08 08:44:14 +02:00
Martin Kroeker 57da6f5902 Change atomic semanrics to acquire/release to fix tsan warnings 2026-07-07 21:38:42 +02:00
Martin Kroeker 71e999bc9a Merge pull request #5891 from moluopro/fix/ci-badge-docs
Update README and CI job matrix documentation
2026-07-07 18:21:26 +02:00
Martin Kroeker 45199ce655 Merge pull request #5892 from moluopro/develop
Enable RVV ROTM for RISC-V ZVL Targets
2026-07-07 16:59:25 +02:00
Martin Kroeker 80d7922240 Merge pull request #5893 from martin-frbg/lapack1318
Fix  LAPACKE_?lacpy_work corrupting data in row-major mode  (Reference-LAPACK PR 1318)
2026-07-07 15:03:56 +02:00
Martin Kroeker 2b11a16f56 Fix row-major copy corrupting the other triangle (Reference-LAPACK PR 1318) 2026-07-07 10:55:25 +02:00
moluopro 09fd1da6fa kernel/riscv64: enable RVV ROTM for ZVL256B
Use the RVV ROTM kernel for single and double precision ROTM on the RISCV64_ZVL256B target.
2026-07-07 15:20:26 +08:00
moluopro a11b444d67 kernel/riscv64: enable RVV ROTM for ZVL128B
Use the RVV ROTM kernel for single and double precision ROTM on the RISCV64_ZVL128B target.
2026-07-07 15:20:26 +08:00
moluopro 395f8b347f fix(riscv64): keep signed strides in RVV ROTM
The general-stride ROTM path already computes kx/ky with the BLAS negative-increment starting offset. Converting negative increments to positive strides and moving dx/dy again double-adjusted the address and could access the wrong elements. Keep the signed byte strides for RVV strided loads and stores.
2026-07-07 15:20:17 +08:00
moluopro f82cf88caa fix(riscv64): handle zero-stride ROTM in RVV kernel
ROTM has loop-carried dependencies when incx or incy is zero because the same element is updated repeatedly across iterations. The RVV strided load/store path would compute lanes from the same old value and write them back in parallel, producing results that do not match BLAS ROTM semantics. Use a scalar path for zero-stride cases.
2026-07-07 15:20:06 +08:00
Martin Kroeker de54968e16 Merge pull request #5890 from martin-frbg/fixup5843
Apply the NEON S/DOMATCOPY kernels from PR 5843 to all arm64 targets
2026-07-07 00:47:11 +02:00
moluopro 27b0d441ad ci: skip Azure pipeline for docs-only changes
Add push and pull request path filters so docs-only changes do not trigger the Azure build matrix.
2026-07-07 00:15:30 +08:00
moluopro 1b538d7fd1 ci: skip FreeBSD workflow for docs-only changes
Add path filters so README and docs-only pull requests do not start the FreeBSD GitHub Actions jobs.
2026-07-07 00:15:30 +08:00
moluopro d560f6d74f docs: fix README supported OS references
Fix broken supported OS links for Windows, Android, and Cortex-M, and update the FreeBSD support note to mention its basic GitHub Actions coverage.
2026-07-06 23:50:31 +08:00
moluopro a0febbbc8d docs: update CI job matrix
Replace retired Cirrus CI entries with the corresponding GitHub Actions jobs for Apple M1, Neoverse N1, Graviton3, and FreeBSD runners.
2026-07-06 23:21:00 +08:00
moluopro 2497041827 docs: refresh README CI badges
Replace the retired Cirrus CI badge with the current GitHub Actions badge, label the Azure Pipelines badge, and remove stale public OSUOSL badges whose job pages no longer resolve.
2026-07-06 23:21:00 +08:00
Martin Kroeker 6468bcbdad Merge pull request #5889 from moluopro/develop
ARM64 SME: fix zero-scalar handling and clean up direct kernels
2026-07-06 16:50:48 +02:00
Martin Kroeker c61f95c8d3 Merge pull request #5888 from martin-frbg/lapack1297
Relax eigenvalue consistency criterion in testsuite (Reference-LAPACK PR 1297)
2026-07-06 16:34:53 +02:00
Martin Kroeker a2f9fc83df Merge pull request #5885 from martin-frbg/lapack1317
Increase deflation tolerance in ?LAED to match recent changes in ?SLASD  (Reference-LAPACK PR 1317)
2026-07-06 13:09:16 +02:00
Martin Kroeker a5d477f195 fix omatcopy filenames 2026-07-06 12:28:02 +02:00
Martin Kroeker 36365a602e Make the OMATCOPY kernels from 5843 universally available 2026-07-06 11:49:27 +02:00
moluopro 130102e661 Clean up SSYR2K SME direct warnings
Mark read-only transpose inputs const and limit sve_cntw and ldb definitions to the variants that use them.
2026-07-06 16:00:21 +08:00
moluopro 3781e2c15d Clean up SSYRK SME direct warnings
Mark the read-only B input const and limit sve_cntw and ldb definitions to the variants that use them.
2026-07-06 15:59:53 +08:00
moluopro edd8ab196d Clean up SSYMM SME preprocessing warnings
Use const source pointers in the symmetric preprocessing helpers and compile only the LU or LL helper needed by each object variant.
2026-07-06 15:59:25 +08:00
Martin Kroeker aa8b19de74 Relax eigenvalue consistency test (Reference-LAPACK PR 1297) 2026-07-06 09:43:58 +02:00
moluopro 8cde36c9b8 Use integer round-up in ARM64 SME direct kernels
The padded SME dimensions are integer quantities, so compute them with integer arithmetic and drop the now-unused math.h include.
2026-07-06 15:33:29 +08:00
moluopro d49cd021dd Handle zero alpha/beta in SSYR2K SME direct kernel
Avoid loading C when beta is zero, and skip A/B preprocessing for alpha == 0 or K == 0 by reusing the triangular direct kernel with k = 0.
2026-07-06 15:30:42 +08:00
moluopro 9925b29db5 Handle zero alpha/beta in SSYRK SME direct kernel
Avoid loading C when beta is zero, and skip A preprocessing for alpha == 0 or K == 0 by reusing the triangular direct kernel with k = 0.
2026-07-06 15:30:37 +08:00
moluopro 35a841fd49 Handle zero alpha in SSYMM SME direct kernel
When alpha is zero, avoid preprocessing the symmetric matrix and reuse the SGEMM alpha/beta direct kernel with k = 0 for the beta-only update.
2026-07-06 15:30:27 +08:00
moluopro ab27636deb Handle zero alpha/beta in SGEMM SME direct kernel
Avoid loading C when beta is zero; ZA has already been initialized to zero.

For alpha == 0 or K == 0, skip A preprocessing and reuse the direct kernel with k = 0 to perform only the beta update.
2026-07-06 15:30:22 +08:00
Martin Kroeker 882526a408 Merge pull request #5886 from martin-frbg/lapack1290
Avoid intermediate overflow in ?LARFGP (Reference-LAPACK PR 1290)
2026-07-06 08:59:14 +02:00
Martin Kroeker 170da5f679 Merge pull request #5883 from martin-frbg/lapack1300
Use QR  for bidiagonal SVD with vectors in ?BDSDC (Reference-LAPACK PR 1300)
2026-07-06 07:30:06 +02:00
Martin Kroeker ac394175e4 Merge pull request #5887 from martin-frbg/disable_cirrusci
CI: disable the remaining Cirrus jobs now that the service is gone
2026-07-06 00:39:32 +02:00
Martin Kroeker cc02866ef1 disable the remaining jobs now that Cirrus is gone 2026-07-06 00:38:31 +02:00
Martin Kroeker 022b1c6a03 Merge branch 'OpenMathLib:develop' into lapack1290 2026-07-05 22:05:59 +02:00
Martin Kroeker 6cd5516da2 Merge branch 'OpenMathLib:develop' into lapack1317 2026-07-05 22:05:40 +02:00
Martin Kroeker baa8c5d0b9 Merge branch 'OpenMathLib:develop' into lapack1300 2026-07-05 22:05:20 +02:00
Martin Kroeker 60d3fbea46 Merge pull request #5884 from martin-frbg/fixtinfo_ci
CI: update Ubuntu tinfo package version in gh workflow
2026-07-05 22:04:53 +02:00
Martin Kroeker f3f5fd9116 Avoid intermediate overflow (Reference-LAPACK PR 1290) 2026-07-05 17:43:58 +02:00
Martin Kroeker db20661747 Increase deflation tolerance to match recent ?SLASD changes (Reference-LAPACK PR 1317) 2026-07-05 17:37:17 +02:00
Martin Kroeker 78f06538c7 Merge pull request #5881 from moluopro/develop
ci, docs: fix documentation text and skip docs-only CI
2026-07-05 16:43:41 +02:00
Martin Kroeker a55df7c0c6 Update package name in the wget call too 2026-07-05 16:27:41 +02:00
Martin Kroeker a45da9e756 update Ubuntu tinfo package version 2026-07-05 15:04:43 +02:00
Martin Kroeker e70a7a735f Merge pull request #5868 from Vasudeva-bit/macTuneZEN4
Optimize Zen 4 GEMM macro block sizes (P, Q, R)
2026-07-05 00:01:20 +02:00
Martin Kroeker 5aa157c2cf Use QR instead of D&C for bidiagonal SVD with vectors (Reference-LAPACK PR 1300) 2026-07-04 23:26:22 +02:00
Martin Kroeker e97eb66c29 Merge pull request #5817 from martin-frbg/bsdqemu
[WIP] Create QEmu-based FreeBSD runner to replace deprecated Cirrus
2026-07-04 10:14:18 +02:00
Vasudeva-bit 58846317d9 fix C89 scoping, dynamic R for memory issues, robust zen4/5 check 2026-07-04 11:30:34 +05:30
Martin Kroeker 8f0b0333ba Merge pull request #5876 from kumaraditya303/openmp
fix thread safety and data races of openmp backend
2026-07-03 22:22:55 +02:00
moluopro 448622eeea ci: skip non-doc workflows for markdown-only changes 2026-07-04 02:52:02 +08:00
moluopro 45bf57426a ci: restrict docs workflow to docs inputs 2026-07-04 01:20:43 +08:00
moluopro e097d0b32c ci: skip non-doc workflows for docs-only changes 2026-07-04 01:20:37 +08:00
moluopro 1a2386b437 docs: fix miscellaneous documentation text 2026-07-04 00:32:31 +08:00
moluopro 68a988c441 docs: fix distributing guide wording 2026-07-04 00:32:24 +08:00
moluopro ac7fa5c7d3 docs: fix extensions table formatting 2026-07-04 00:32:16 +08:00
Martin Kroeker a8c41f73ed Merge pull request #5878 from moluopro/develop
docs: fix install guide typos
2026-07-03 15:28:22 +02:00
Martin Kroeker 34232eb5f4 Merge pull request #5880 from martin-frbg/issue5873-2
Fix broken conditional preventing ARM64 SME compilation with AppleClang
2026-07-03 15:24:31 +02:00
Martin Kroeker aedbcbc5a5 Fix conditional 2026-07-03 12:43:42 +02:00
Martin Kroeker e717107ba6 Merge pull request #5874 from jschueller/dev-fix
Fix ZA tile slice indices in ssyrk SME direct kernel
2026-07-03 12:40:37 +02:00
Martin Kroeker 8e6088de89 Merge pull request #5877 from hheei/fix/laed3-sqrt-nan-guard
Fix/laed3 sqrt nan guard
2026-07-02 20:52:15 +02:00
moluopro 1d7cbce8ba docs: fix install guide typos 2026-07-03 01:50:09 +08:00
hheei aea58b2b91 Add hheei to CONTRIBUTORS.md 2026-07-02 23:03:58 +08:00
hheei 71f2260186 lapack/laed3: guard sqrt(-w[i]) against spuriously positive w[i]
When eigenvalues are nearly degenerate, numerical accumulation in
the divide-and-conquer merge can push w[i] slightly above zero.
The subsequent sqrt(-w[i]) then produces NaN, which propagates
through the entire eigenvector output of DSYEVD/DSTEDC.

Use fmax(-w[i], 0.0) to safely clamp the sqrt argument, yielding
zero instead of NaN for spuriously positive w[i].  The fmax call
maps to a single vmaxsd instruction on x86_64 with zero overhead.

Add test/test_laed3_nan.c which exercises DSYEVD on a rank-1
perturbed identity matrix designed to create near-degenerate
eigenvalue clusters.
2026-07-02 23:03:38 +08:00
Kumar Aditya 2d75a67d89 setup CI 2026-07-02 15:50:18 +05:30
Kumar Aditya a2261f9e52 fix thread safety of openmp backend 2026-07-02 15:39:09 +05:30
Julien Schueller 43f0a90e1b Fix ZA tile slice indices in ssyrk SME direct kernel
The kernel_2x2 function uses 4 ZA tiles (0-3) each with svl slices.
Tiles 0/1 handle rows 0..svl-1 with slice indices 0..svl-1.
Tiles 2/3 handle rows svl..2*svl-1, so their slice indices
must start at 0, i.e. (i - svl) instead of i.

Fix all three tile 2/3 access sites:
- C load into ZA (svwrite_hor_za32_f32_m)
- C writeback for UPPER (svst1_hor_za32)
- C writeback for LOWER (svst1_hor_za32)

Fixes #5873
2026-07-02 09:29:32 +02:00
Martin Kroeker 0f51e2d22f Merge pull request #5871 from martin-frbg/lapack1163
Add non-trivial terminating case to ?LARFT (Reference-LAPACK PR 1163)
2026-07-01 00:42:11 +02:00
Martin Kroeker a782e10a22 Merge pull request #5858 from martin-frbg/lapack1286
Increase tolerance in ?LASD2 to improve ?BDSDC stability (Reference-LAPACK PR 1286)
2026-07-01 00:41:22 +02:00
Martin Kroeker 66d041d75f Merge pull request #5863 from martin-frbg/lapack1307
Change description of QMAX in ?LASQ3 to in/out (Reference-LAPACK PR 1307)
2026-06-30 22:48:36 +02:00
Martin Kroeker 6265056f19 relax tolerance in SGESDD benchmark (see discussion in Reference-LAPACK PR 1286) 2026-06-30 19:36:48 +02:00
Martin Kroeker a22ee97671 Merge branch 'OpenMathLib:develop' into lapack1286 2026-06-30 19:32:57 +02:00
Martin Kroeker 4ca72cb7a4 Add f2c conversions of ?larft_lvl2 and update ?larft (Reference-LAPACK PR 1163) 2026-06-30 19:27:11 +02:00
Martin Kroeker 0d820b8597 Add f2c-converted versions of larft_lvl2 from Reference-LAPACK 1163 2026-06-30 19:24:05 +02:00
Julien Schueller 5010c0abb8 blas: fix missing thread caps 2026-06-29 17:23:55 +02:00
Julien Schueller c0c2dadbd9 lapack: fix missing thread caps 2026-06-29 17:23:43 +02:00
Martin Kroeker 9cc2702c0f Add the LARFT_LVL2 functions from Reference-LAPACK PR 1163 2026-06-27 20:10:05 +02:00
Martin Kroeker fa597c2191 Add the ?LARFT_LVL2 functions from Reference-LAPACK PR 1163 2026-06-27 20:08:57 +02:00
Martin Kroeker fd89e78ff3 Add non-trivial terminating case for LARFT (Reference-LAPACK PR 1163) 2026-06-27 20:07:45 +02:00
Martin Kroeker dd3ba971bc Merge pull request #5845 from martin-frbg/pizlonator-filc
Add support for compiling with the Fil-C Memory Safe C toolchain
2026-06-27 15:36:25 +02:00
Martin Kroeker b997290389 Merge pull request #5862 from martin-frbg/lapack1293
Scale convergence thresholds in ?BBCSD to fix accuracy (Reference-LAPACK PR 1293)
2026-06-27 11:49:15 +02:00
Martin Kroeker 3f6241b8db Merge pull request #5865 from martin-frbg/lapack1315
Fix handling of negative increments in ?LARF/?LARF1F/?LARF1L (Reference-LAPACK PR 1315)
2026-06-26 22:50:38 +02:00
Martin Kroeker cd395c801a Merge pull request #5864 from martin-frbg/lapack1309
Fix bad scaling in ?LARFF causing slow DSYEVR/ZHEEVR (Reference-LAPACK PR 1309)
2026-06-26 22:50:15 +02:00
Martin Kroeker 7370b520d2 Merge pull request #5857 from martin-frbg/lapack1285
Fix premature return before fallback in ?BDSQR (Reference-LAPACK PR 1285)
2026-06-26 20:45:56 +02:00
Martin Kroeker 132f2a3ebd Merge pull request #5855 from martin-frbg/lapack1283
Avoid intermediate overflows in GEJSV,GESVJ,GESVDX,GEDMD (Reference-LAPACK PR 1283)
2026-06-26 20:45:23 +02:00
Martin Kroeker 71db152f80 Merge pull request #5869 from MaddyGuthridge/patch-1
mkdocs: set repo_name
2026-06-26 20:44:46 +02:00
Maddy Guthridge ac015fab8c mkdocs: set repo_name
That way the path to the GitHub repo is displayed instead of just the generic text "GitHub"
2026-06-26 03:00:45 +10:00
Martin Kroeker 100988fddd Merge branch 'OpenMathLib:develop' into lapack1286 2026-06-25 15:47:50 +02:00
Martin Kroeker 3cdf5dcf0b Merge pull request #5860 from martin-frbg/lapack1291
Handle degenerate cases in OR/UNCSD2BY1 (Reference-LAPACK PR 1291)
2026-06-25 15:40:27 +02:00
Vasudeva-bit 753604cfe2 Optimize Zen 4 GEMM macro block sizes (P, Q, R) 2026-06-25 19:06:26 +05:30
Martin Kroeker 56b08939f5 Merge pull request #5861 from martin-frbg/lapack1292
Fix workspace for tiny inputs in (ORM/UNM)(L/R)Q and Q(L/R) (Reference-LAPACK PR 1292)
2026-06-25 14:06:48 +02:00
Martin Kroeker e202bcb942 Merge pull request #5859 from martin-frbg/lapack1287
Fix row-major A dimension for SIDE=R in LAPACKE_?TPRFB_WORK (Reference-LAPACK PR 1287)
2026-06-25 14:05:24 +02:00
Martin Kroeker 72ebe7b777 Merge pull request #5856 from martin-frbg/lapack1284-2
Don't check LDU in LAPACKE_?GESVD_WORK when U is not used (from Reference-LAPACK PR 1284)
2026-06-25 12:27:19 +02:00
Martin Kroeker 68b4f228c0 Merge pull request #5854 from martin-frbg/lapack1275
Reject NB=0 in input of DLASWLQ (Reference-LAPACK PR 1275)
2026-06-25 10:20:11 +02:00
Martin Kroeker 1dd3ec9f1f Merge pull request #5853 from martin-frbg/lapack1274
Fix too small workspace queried in SGGEV3 (Reference-LAPACK PR 1274)
2026-06-25 10:19:47 +02:00
Martin Kroeker 854479839b Merge pull request #5852 from martin-frbg/lapack1273
Fix sign of error number returned by LWORK check in ?LAQZ0 (Reference-LAPACK PR 1273)
2026-06-25 10:19:14 +02:00
Martin Kroeker 4ba480e436 Merge pull request #5851 from martin-frbg/lapack1272
Fix operand number in errors of ?GGSVD3,?UN/ORBDB4, ?UN/ORCSD (Reference-LAPACK PR 1272)
2026-06-25 09:35:49 +02:00
Martin Kroeker 562aeed4a2 Fix handling of negative increments (Reference-LAPACK PR 1315) 2026-06-24 21:41:17 +02:00
Martin Kroeker faa10e60e4 Fix scaling of relative error to avoid spurious failures (Reference-LAPACK PR 1309) 2026-06-24 21:34:29 +02:00
Martin Kroeker 5cc9ff49f5 Fix description of QMAX to mark it as in/out (Reference-LAPACK PR 1307) 2026-06-24 21:27:43 +02:00
Martin Kroeker caa18db35f Scale thresholds to improve accuracy of singular vectors (Reference-LAPACK PR 1293) 2026-06-24 20:55:02 +02:00
Martin Kroeker c5cd266fff Reduce workspace demand for tiny M,N,K sizes (Reference-LAPACK PR 1292) 2026-06-24 20:44:27 +02:00
Martin Kroeker 9e9c5a541f Handle degenerate cases having R=0 (Reference-LAPACK PR 1291) 2026-06-24 20:35:34 +02:00
Martin Kroeker 2a859d5fc4 Fix row-major A dimension for SIDE=R (Reference-LAPACK PR 1287) 2026-06-24 18:33:45 +02:00
Martin Kroeker ea007b5c03 Increase deflation tolerance to match ?LASD7 (Reference-LAPACK PR 1286) 2026-06-24 16:50:13 +02:00
Martin Kroeker 788a2dfec4 Fix premature return before trying QR fallback (Reference-LAPACK PR 1285) 2026-06-24 16:16:15 +02:00
Martin Kroeker 9971940f04 Also don't check LDU when U is not used (from Reference-LAPACK PR 1284) 2026-06-24 16:06:24 +02:00
Martin Kroeker 6dd2948a2b Guard against intermediate overflows 2026-06-24 14:14:31 +02:00
Martin Kroeker 358d3676d0 Reject NB=0 in input (Reference-LAPACK PR 1275) 2026-06-24 13:31:40 +02:00
Martin Kroeker fb4e77d379 Query correct (larger) workspace for VL=N,VR=V (Reference-LAPACK PR 1274) 2026-06-24 13:27:17 +02:00
Martin Kroeker 6409343512 Fix sign of error number from LWORK check (Reference-LAPACK PR 1273) 2026-06-24 12:33:17 +02:00
Martin Kroeker aae8526e3a Fix bad operand indicator in error messages (Reference-LAPACK PR 1272) 2026-06-24 12:27:21 +02:00
Martin Kroeker a36e22cbb2 Merge pull request #5850 from martin-frbg/lapack1271
Update EXTERNAL declarations in various files (Reference-LAPACK PR 1271)
2026-06-24 10:36:37 +02:00
Martin Kroeker 1afb4c9ba1 Merge pull request #5849 from martin-frbg/lapack1270
Fix wrong workspace in DGEJSV potentially corrupting memory in DGESVJ (Reference-LAPACK PR 1270)
2026-06-24 10:36:15 +02:00
Martin Kroeker 6d648c6b4d Merge pull request #5848 from martin-frbg/lapack1269
Fix wrong JOBA type in SGESVJ call of SGEJSV (Reference-LAPACK PR 1269)
2026-06-24 10:35:54 +02:00
Martin Kroeker 648a53b5cb Merge pull request #5847 from martin-frbg/lapack1268
Fix wrong name in XERBLA call of ZLA_SYRFSX_EXTENDED (Reference-LAPACK PR 1268)
2026-06-24 10:35:34 +02:00
Martin Kroeker 7fdd58a7d6 Merge pull request #5846 from martin-frbg/lapack1265
Fix typo in ?ORBDB3/?UNBDB3 use of INCY (Reference-LAPACK PR 1265)
2026-06-24 10:35:11 +02:00
Martin Kroeker aae00921a9 Fix conditional 2026-06-24 00:19:32 +02:00
Martin Kroeker cfeb270288 Update EXTERNAL declarations in various files (Reference-LAPACK PR 1271) 2026-06-23 22:20:46 +02:00
Martin Kroeker 9f6c07c5a8 Fix workspace argument if DGESVJ call (Reference-LAPACK PR 1270) 2026-06-23 21:55:15 +02:00
Martin Kroeker 8f2b1e8c7c Fix wrong JOBA type in SGESVJ call (Reference-LAPACK PR 1269) 2026-06-23 21:51:22 +02:00
Martin Kroeker a08b1aa853 Fix wrong function name in XERBLA call (Reference-LAPACK PR 1268) 2026-06-23 21:44:14 +02:00
Martin Kroeker 5da71f5c5b Fix typo in passing leading dimension of Y to ?ROT (Reference-LAPACK PR 1265) 2026-06-23 21:25:17 +02:00
Martin Kroeker afcba13127 Use atomic_exchange builtin for spinlock with fil-c, add cc clobber to quickdivide 2026-06-23 21:14:39 +02:00
Martin Kroeker 08c8c1051f fil-c memory safety checker doesn't support syscall 237 (mbind) yet 2026-06-23 21:12:07 +02:00
Martin Kroeker 3ae1586d3f Add tool prefix to symbols when compiling with the fil-c memory checker 2026-06-23 21:08:15 +02:00
Martin Kroeker 5135d5c96c Merge pull request #5844 from kumaraditya303/develop
fix data races in blas_server and level3_thread
2026-06-23 20:56:40 +02:00
Kumar Aditya ea2a52d014 use OPENBLAS_NUM_THREADS=8 in tsan CI 2026-06-23 18:59:26 +05:30
Kumar Aditya 298d53c061 fix data races in blas_server and level3_thread 2026-06-23 18:42:25 +05:30
Martin Kroeker f986fd3322 Merge pull request #5843 from artem-dmitriev/omatcopy
AArch64: NEON omatcopy CT/RT kernels (s/d)
2026-06-21 23:09:45 +02:00
zhir 46aa158dcc AArch64: NEON omatcopy CT/RT kernels 2026-06-20 22:54:04 +03:00
Martin Kroeker 6773c85b16 Merge pull request #5842 from artem-dmitriev/patch-1
bench.h: fix getsec() double time conversion on Apple Silicon
2026-06-20 15:02:18 +02:00
artem dmitriev 2d9cbfc9e9 bench.h: fix getsec() double time conversion on Apple Silicon 2026-06-20 16:01:47 +04:00
Martin Kroeker 7ac17f4b6b Merge pull request #5819 from trg-rgb/docs/riscv-zvl-target-selection
docs: clarify RISC-V RVV target selection and GCC 14+ requirement for ZVL128B/ZVL256B
2026-06-18 10:10:28 +02:00
Martin Kroeker cf627715d9 Merge pull request #5840 from martin-frbg/issue5831
Add support for QEMU's virtual AMD cpu to avoid misdetection as  Opteron
2026-06-15 20:48:56 +02:00
Martin Kroeker 7126fcf40c fix extraneous brace 2026-06-15 15:42:16 +02:00
Martin Kroeker 18e2fe9fa4 Add support for QEMU's virtual AMD cpu to avoid misdetection as Opteron 2026-06-15 14:54:24 +02:00
Martin Kroeker 9bdf051b96 Merge pull request #5838 from ngoldbaum/fix-level3-thread-locks-2
Fix corruption due to lock sharding issues by centralizing locking
2026-06-15 12:35:35 +02:00
Martin Kroeker ef20ea1644 Merge pull request #5828 from amritahs-ibm/fix_dcbt_constraints
Fix incorrect inline assembly constraints in dcbt prefetch instructions
2026-06-15 11:22:10 +02:00
Nathan Goldbaum 7c7c65e692 fix windows build slowness and test errors 2026-06-14 17:09:44 -06:00
Nathan Goldbaum 9363452742 Fix corruption due to lock sharding issues by centralizing locking 2026-06-14 15:32:51 -06:00
Martin Kroeker 7aa79fbdff Merge pull request #5835 from changangela/fix-lapacke-nancheck-overflow
Fix 32-bit integer overflow in LAPACKE nancheck index arithmetic
2026-06-12 09:29:24 +02:00
Yue ChangandClaude Fable 5 ede136ee4e Fix 32-bit integer overflow in LAPACKE nancheck index arithmetic
The optional NaN checks performed by LAPACKE front-ends computed array
offsets and lengths in 32-bit lapack_int arithmetic, which overflows for
large matrices (e.g. LAPACKE_dpotrf with n = lda >= 46341 overflows
j*lda in LAPACKE_dtr_nancheck, leading to out-of-bounds reads and
crashes). Several nancheck helpers (ge, gb, tp, tf) already cast to
size_t; this applies the same treatment to the ones that were missed:

- ?tr_nancheck: cast a[i+j*lda] index to size_t (also covers po/sy/he
  checks, i.e. the POTRF/Cholesky path)
- ?_nancheck (vector): iterate by element count instead of n*inc, with
  size_t indexing
- ?sp/?pp/?pf/?hp/?tp/?tf_nancheck: compute n*(n+1)/2 length in size_t
- ?tz_nancheck: widen the part offsets to int64_t (keeping the -1
  sentinel) and compute them with a widening cast

Verified with UBSan: LAPACKE_str_nancheck at n = lda = 47000 previously
reported signed integer overflow and crashed with SEGV at -O0; it now
passes and still detects the NaN. Old and new code produce identical
results across 1907 enumerated small-size cases (all layouts, uplo,
diag, shapes and NaN positions for tr/tz/vector/packed variants).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 23:42:28 -04:00
Martin Kroeker a033631ee8 Merge pull request #5833 from ayappanec/fix-aix-build
Fix AIX build with OpenXL (ibm-clang)
2026-06-10 13:57:02 +02:00
Ayappan Perumal faf7ddbbea Fix AIX build with OpenXL (ibm-clang) 2026-06-10 04:22:48 -05:00
Martin Kroeker 94f85eb6b1 Merge pull request #5822 from ErnstPeng/la-dev
optimize zgemm, ic/zamin and sdot lsx kernel for 2k3000 cpu
2026-06-09 18:15:48 +02:00
amritahs-ibm 7e3877f263 Merge branch 'develop' into fix_dcbt_constraints 2026-06-09 14:45:02 +05:30
Martin Kroeker 901c214a9b Merge pull request #5827 from amritahs-ibm/use_lxvp_builtins
Power10: Replace vector pair loads with __builtin_vsx_lxvp
2026-06-09 09:41:47 +02:00
pengxu 4850f86e3d optimize sdot lsx kernel 2026-06-08 14:26:03 +08:00
pengxu d1df5928ae optimize ic/zamin lsx kernel 2026-06-08 14:25:26 +08:00
Martin Kroeker 16a5ea5b4c Merge pull request #5829 from martin-frbg/issue5825
Fix OpenMP reentrancy issues in LLVM compilations with gmake on ARM64
2026-06-06 10:55:52 +02:00
Martin Kroeker 7006a422b6 Merge pull request #5826 from ChipKerchner/fasterRVVGEMV
Faster GEMV for RVV
2026-06-05 23:56:49 +02:00
Martin Kroeker 1145c75a96 Comment out the libclang_rt.builtins kludge in preparation for removal 2026-06-05 23:06:28 +02:00
Martin Kroeker 8a767975b0 Comment out the libclang_rt kludge, for future removal 2026-06-05 20:37:28 +02:00
Martin Kroeker 7a08010406 Fix trashing of $data that breaks the check for C11 atomics 2026-06-05 19:22:10 +02:00
Amrita H S 831b822b94 Fix incorrect inline assembly constraints in dcbt prefetch instructions
Corrected the register constraints for the PowerPC dcbt (Data Cache Block
Touch) instruction in Power10 kernel implementations. The dcbt instruction
has special behavior where if the first operand (RA) is r0, it uses the
value 0 instead of the register contents. Therefore, RA must use the "b"
constraint (any GPR except r0), while RB can use "r" (any GPR including r0).

Changes:
- Changed first operand constraint from "r" to "b" to exclude r0
- Changed second operand constraint from "b" to "r" for flexibility

This ensures correct prefetch behavior and compliance with PowerPC ISA
specifications, preventing potential issues where r0 might be incorrectly
used as the base address register.

Signed-off-by: Amrita H S <amritahs@linux.vnet.ibm.com>
2026-06-04 01:49:08 -05:00
Amrita H S 3863a7778d Power10: Replace vector pair loads with __builtin_vsx_lxvp
Replace normal vector pair pointer dereferences with the optimized
__builtin_vsx_lxvp builtin across DGEMM, ZGEMM, and DGEMV kernels.

Also done some identation corrections in dgemm_kernel_power10.c.
This is done as part of POWER code cleanup and may not have any
performance impact.

Signed-off-by: Amrita H S <amritahs@linux.vnet.ibm.com>
2026-06-03 02:34:53 -05:00
Chip Kerchner 6a23c36313 Unroll inner loop - 2 rows at a time. Up to 1.5X faster. 2026-06-02 16:39:16 +00:00
Martin Kroeker 91f97c667e Merge pull request #5824 from mathomp4/bugfix/5823-fix-for-nag
Fix shared lib build with NAG Fortran on macOS
2026-05-30 20:50:42 +02:00
Matthew Thompson 7a2b8b5aa6 cmake: fix shared lib build with NAG Fortran on macOS
On Apple, the shared library link rule for Fortran used GCC-specific flags:
  -x f95-cpp-input   (GCC preprocessing flag; NAG does not support it)
  -Wl,-shared        (Linux linker flag; macOS needs -dynamiclib)

The fix is NAG-specific — other non-GNU compilers (Intel, flang, Cray,
etc.) are left alone since they may handle the existing code paths fine.

Fix in two places (both already inside if(APPLE) / if(APPLE AND BUILD_STATIC_LIBS)):

1. Before add_library() (affects the main CMake Fortran shared lib rule):
   For NAG Fortran, substitute CMAKE_C_CREATE_SHARED_LIBRARY so the
   C compiler link rule is used instead.

2. Inside the APPLE AND BUILD_STATIC_LIBS block (the static->shared
   conversion trick for long argument lists): add an elseif(NAG) branch
   that uses the C compiler with -dynamiclib and auto-detects the NAG
   Fortran runtime (libf72rts) from the compiler's directory so that
   NAGf90_* symbols resolve.

Tested with NAG 7.2.7243 on macOS/arm64.
2026-05-29 11:29:39 -04:00
pengxu 6731dac68b optimize zgemm lsx kernel for 2k3000 cpu 2026-05-29 10:05:39 +08:00
Chip Kerchner 5b22140dfc Merge branch 'develop' of https://github.com/OpenMathLib/OpenBLAS into develop 2026-05-28 15:11:22 +00:00
Tanmay GulhaneandVaibhav805 601ff0ef2a docs: clarify RISC-V RVV target selection and GCC 14+ requirement for ZVL128B/ZVL256B
Add a RISC-V subsection to docs/install.md inside 'Building from source',
between the existing MIPS and FreeBSD sections, covering:

  - Target selection table (RISCV64_GENERIC / RISCV64_ZVL128B /
    RISCV64_ZVL256B / C910V / x280) and what each is for.
  - The general property that GENERIC / ARCH_GENERIC targets across
    all architectures map to the non-vectorized plain-C reference
    path, with the Makefile.riscv64 scalar -march override noted as
    the RISC-V-specific compounding factor.
  - GCC 14+ requirement for the ZVL targets on current OpenBLAS
    releases (GCC 13 does not implement the __riscv_vsseg* intrinsics
    used by the _rvv.c kernels and falls back to scalar silently,
    detectable only by disassembly).
  - Reference objdump-based verification command and expected
    opcode-count range for a correct RISCV64_ZVL128B build.

README.md now keeps a single one-line pointer to the new install.md
section at the spot where users encounter the RISC-V build commands,
so the signposting is preserved without bloating the page that GitHub
renders by default.

v2 of this PR, addresses review feedback from @martin-frbg on
relocation and on the broader GENERIC framing.

Co-authored-by: Vaibhav805 <Vaibhav805@users.noreply.github.com>
2026-05-25 13:29:39 +00:00
Martin Kroeker 1bd74ad3d1 Merge pull request #5820 from martin-frbg/issue5818
Fix misoptimization of C/ZGETF2 by Clang on Apple M
2026-05-25 09:20:56 +02:00
Martin Kroeker 1f2ae720af Make temp1 volatile to keep Clang on AppleM from optimizing out the division guards 2026-05-25 00:35:40 +02:00
Martin Kroeker 804a77cb1a Merge pull request #5803 from Sid-MB/develop
Makefile.install: fix PKGFILE expression so it works with paths with spaces
2026-05-24 18:47:20 +02:00
Martin Kroeker cc84d9cccd add emulated arm64 2026-05-22 12:13:35 +02:00
Martin Kroeker e82de18f9f Update freebsd.yml 2026-05-22 08:09:01 +02:00
Martin Kroeker dc8fcad1ea Update freebsd.yml 2026-05-22 06:57:04 +02:00
Martin Kroeker 69668d1441 Update freebsd.yml 2026-05-21 23:17:58 +02:00
Martin Kroeker 774924e03b Create freebsd.yml 2026-05-21 21:27:52 +02:00
Martin Kroeker 70a5a53747 Fix contiguous memory check for SGEMM and DGEMM. (#5815) 2026-05-19 22:58:22 +02:00
Martin Kroeker fda55ad259 Fix gmake build of ARM64 DYNAMIC_ARCH on hosts lacking SVE (#5816)
* Add march=armv8.4-a+sve(+bf16) to non-PGI options for SVE-capable ARM64 targets
2026-05-19 22:46:13 +02:00
Chip Kerchner f3f718b228 Fix contiguous memory check for SGEMM and DGEMM. 2026-05-18 18:56:29 +00:00
Martin Kroeker 6506d703c9 Merge pull request #5814 from martin-frbg/issue5809
Replace dangerous usage of s_copy macro in C versions of LAPACK ILAENV and IPARMQ
2026-05-18 07:18:35 +02:00
Martin Kroeker 029a05fa84 Replace dangerous usage of s_copy macro with strncpy and fix various warnings 2026-05-17 22:18:58 +02:00
Martin Kroeker 55c72a934f Merge pull request #5813 from martin-frbg/issue5810
Fix TRSM on Barcelona target (and possibly others)
2026-05-15 20:16:25 +02:00
Martin Kroeker 26c4eb65d1 Restore the quick return in common code - the earlier one is CBLAS only 2026-05-15 20:10:51 +02:00
Martin Kroeker 3dc0ba50e2 Merge pull request #5812 from pkubaj/patch-4
Makefile.system: -lm is necessary on power as well
2026-05-15 17:01:02 +02:00
Chip Kerchner b528b9bbe2 Merge branch 'develop' of https://github.com/OpenMathLib/OpenBLAS into develop 2026-05-15 12:18:52 +00:00
Martin Kroeker a47b45d4eb Merge pull request #5801 from pkubaj/patch-2
Makefile.system: when Clang is used, check if gfortran is used
2026-05-14 18:43:36 +02:00
Martin Kroeker 693e22f1f8 Merge pull request #5804 from ayappanec/fix-aix-pwr10
Use -mpwr10 instead of -mpower10 to support AIX assembler
2026-05-14 16:58:45 +02:00
Martin Kroeker 125d79c02b Merge pull request #5797 from martin-frbg/issue5713-2
Fix compiler check for ARM64 SME support in CMake builds
2026-05-14 13:22:54 +02:00
Martin Kroeker 1877075414 Merge pull request #5805 from quic/fix/sgemm-direct-leading-dim-check
Fix incorrect leading dimension check for SME SGEMM direct kernel path
2026-05-14 13:22:03 +02:00
Piotr Kubaj 9cb7d3932f Makefile.system: -lm is necessary on power as well 2026-05-14 09:41:52 +00:00
Rajendra Prasad Matcha c32eefd87f Fix incorrect leading dimension check for SME SGEMM direct kernel path
For row-major matrices, the tight-packing condition should be k==lda
(A is m×k), n==ldb (B is k×n), and n==ldc (C is m×n). The old check
used m==lda and k==ldc, which prevented the SME/direct kernel from
being invoked except when m==k==n (square matrices).

Fixes https://github.com/OpenMathLib/OpenBLAS/issues/5794
2026-05-12 15:45:36 +05:30
Ayappan Perumal beed554ae5 Use -mpwr10 instead of -mpower10 to support AIX assembler 2026-05-10 22:25:03 -05:00
Siddharth M. Bhatia a4aae76382 Makefile.install: fix PKGFILE so it works with paths with spaces
Note that the second setting of PKGFILE, at line 194, is redundant because that line was treated as a shell command which only assigned the variable for that line's invocation.
2026-05-10 14:47:54 -07:00
Martin Kroeker d4d02fee71 Separate LLVM prerequisites for ARMV9SME and VORTEXM4 2026-05-06 22:59:53 +02:00
Martin Kroeker 3da0ff7bc2 Merge pull request #5802 from pkubaj/patch-3
Makefile.power: allow using power10 instructions
2026-05-06 22:19:33 +02:00
Martin Kroeker e8ad16cad1 Merge pull request #5800 from notaz/armv7_sgemm
provide a NEON version of arm/sgemm
2026-05-06 15:47:49 +02:00
Piotr Kubaj 627153fcdb Makefile.power: allow using power10 instructions
OpenBLAS uses various power9 and power10 instructions and they fail to build with errors like in https://github.com/OpenMathLib/OpenBLAS/issues/4793. Just allow the latest ISA, it will generate the same code, but actually allow the binaries to be assembled.
2026-05-06 10:42:07 +00:00
Piotr Kubaj 1dc25c14cd Makefile.system: when Clang is used, check if gfortran is used
At least on power, GCCVERSIONGT4 is checked for when gfortran is used, like at Makefile.power:59
2026-05-06 09:52:44 +00:00
Gražvydas Ignotas fc9d7c7fe3 rename arm32 sgemm_kernel to indicate neon support 2026-05-05 23:09:52 +03:00
Gražvydas Ignotas 9d58b8d64e provide a NEON version of arm/sgemm
benchmark/sgemm.goto before:
 M= 200, N= 200, K= 200 :     9262.97 MFlops   0.001727 sec
after:
 M= 200, N= 200, K= 200 :    30223.64 MFlops   0.000529 sec

Conveniently the registers are already allocated suitably for vector
operation, so the conversion from vfpv3 was rather straightforward.

Prefetching was left out because it doesn't help Cortex-A76,
only hurts it slightly.
2026-05-05 23:09:01 +03:00
Gražvydas Ignotas cd276c2c09 only save the required registers for arm/sgemm
According to ARM AAPCS (Procedure Call Standard) 5.1.2.1, only registers
s16-s31 must be preserved across subroutine calls; registers s0-s15
do not need to be preserved.
2026-05-05 22:36:08 +03:00
Gražvydas Ignotas d7aeae8933 convert labels to local labels for arm/sgemm
Non-local labels interfere with profiling. Same thing was done for arm64 in
commit a0128aa489.
2026-05-05 22:36:08 +03:00
Martin Kroeker 2fd0e2416f Merge branch 'OpenMathLib:develop' into issue5713-2 2026-05-05 19:33:43 +02:00
Martin Kroeker 45e5426e1c Merge pull request #5799 from martin-frbg/fixup5793
Fix inclusion of ARMV9SME in OSX DYNAMIC_ARCH builds with CMake and gcc
2026-05-05 19:33:19 +02:00
Martin Kroeker 373fa9da05 Fix logic for inclusion of ARMV9SME in OSX builds with gcc 2026-05-05 15:59:43 +02:00
Martin Kroeker 7b7aaac822 Merge pull request #5798 from martin-frbg/issue5713-3
Restore WoA compatibility fix in dynamic_arm64.c
2026-05-05 10:12:22 +02:00
Martin Kroeker 7324f370bf Restore use of strnicmp for strncasecmp on Windows 2026-05-05 00:00:47 +02:00
Martin Kroeker 8bc50c45ac Merge pull request #5796 from paulgessinger/fix/test-makefile
Use FEXTRALIB in test Makefile
2026-05-04 23:53:55 +02:00
Martin Kroeker 3cde598ea2 Correct file extension of assembly testcase for SME support 2026-05-04 23:33:22 +02:00
Paul Gessinger 88705a9328 Use FEXTRALIB in test Makefile
See https://github.com/OpenMathLib/OpenBLAS/issues/5795
When the compiler toolchain is not the same for C/C++ and fortran, the
linker can fail to resolve the `gfortran` library.
2026-05-04 17:13:04 +02:00
Martin Kroeker 416008431f Merge pull request #5793 from martin-frbg/issue5775
Reduce the default list of DYNAMIC_ARCH targets for ARM64-based Apple systems
2026-05-04 09:04:58 +02:00
Martin Kroeker bd3cd916a5 fix typo in redirect 2026-05-03 18:54:57 +02:00
Martin Kroeker 2f6a673980 Add target redirects for building on Apple hardware 2026-05-03 12:12:56 +02:00
Martin Kroeker 8e57c8667d Merge pull request #5791 from moluopro/develop
Fix Apple platform detection and iOS cross-build
2026-05-02 23:09:09 +02:00
Martin Kroeker 525070fdcd Reduce the default list of DYNAMIC_ARCH targets for ARM64-based Apple systems 2026-05-02 19:51:08 +02:00
Martin Kroeker 0dceb8313e Reduce the default list of DYNAMIC_ARCH targets for ARM64-based Apple systems 2026-05-02 19:50:16 +02:00
Martin Kroeker 08a67c87e4 Merge pull request #5792 from martin-frbg/issue5787
Fix 32bit builds on AMD Ryzen by mapping to NEHALEM rather than BARCELONA
2026-05-02 18:40:32 +02:00
Martin Kroeker f90b0d5bc5 expand target-prefix in fc-pkg 2026-05-02 13:50:09 +02:00
Martin Kroeker d394815eb2 rework msys2 install as mingw i686 has dropped gfortran 2026-05-02 11:54:40 +02:00
Martin Kroeker 3b23194778 Map 32bit ZEN to NEHALEM rather than old BARCELONA 2026-05-01 23:15:38 +02:00
Martin Kroeker 619c22a14a map 32bit ZEN to NEHALEM rather than BARCELONA 2026-05-01 23:14:06 +02:00
Martin Kroeker c8dbfd74e2 Merge pull request #5789 from luhenry/develop
Fix compilation with DYNAMIC_TARGET=1 and BUILD_BFLOAT16
2026-05-01 10:07:56 +02:00
moluopro 6419432e7d Update iOS documentation wording 2026-05-01 13:18:25 +08:00
moluopro a8ac7c91fc Update iOS crossbuild commands 2026-05-01 13:06:29 +08:00
moluopro e2174b31c1 Fix iOS target detection on Darwin 2026-05-01 13:06:14 +08:00
Martin Kroeker 4e5c4bf567 Merge pull request #5790 from martin-frbg/issue5627-3
Correct offsets in PowerPC SCAL assembly under FreeBSD and re-enable for PPC970
2026-04-30 23:20:04 +02:00
Martin Kroeker 33c14c66c7 spell out ifdefined 2026-04-30 17:31:01 +02:00
Martin Kroeker 703710763d Correct stack offset of FLAG on FreeBSD 2026-04-30 17:29:31 +02:00
Martin Kroeker 54efe8ae71 Correct stack offset of FLAG on FreeBSD 2026-04-30 17:28:10 +02:00
Martin Kroeker 57765364fc Return to using assembly SCAL kernels on FreeBSD 2026-04-30 17:25:25 +02:00
Ludovic Henry 43aa35c2ef Fix compilation with DYNAMIC_TARGET=1 and BUILD_BFLOAT16
coremsg isn't defined outside the BUILD_BFLOAT16 and BUILD_HFLOAT16 blocks, leading to the use of an undefined variable
2026-04-30 16:28:56 +02:00
Martin Kroeker 1ecfee24b3 Merge pull request #5788 from martin-frbg/move-cirrus-neoversen1-jobs
CI: Move NeoverseN1 jobs from deprecated Cirrus to gh workflows
2026-04-30 14:30:06 +02:00
Martin Kroeker 75791e4d0a fix typo 2026-04-30 07:51:51 +02:00
Martin Kroeker b4dececea7 Disable all tasks except the FreeBSD ones 2026-04-30 00:14:33 +02:00
Martin Kroeker fd09633cdf Add NEOVERSEN1 jobs from the deprecated Cirrus setup 2026-04-30 00:09:51 +02:00
Martin Kroeker d4824562d9 Merge pull request #5786 from martin-frbg/macos-runner-port-cirrus
GH runner macos: Add cross-compilation to x86_64 based on the Cirrus CI job
2026-04-29 22:11:09 +02:00
Martin Kroeker a8974e0f7a Add Android NDK-ARMV7 crossbuild 2026-04-29 21:16:29 +02:00
Martin Kroeker a3cd2eeaa7 Update apple_m.yml 2026-04-29 14:55:22 +02:00
Martin Kroeker 65ae31125f Update apple_m.yml 2026-04-28 11:12:56 +02:00
Martin Kroeker beb4ab7bf6 Update MacOS image for xbuild to Tahoe 2026-04-27 23:16:15 +02:00
Martin Kroeker f2c5129b40 Update apple_m.yml 2026-04-27 22:56:01 +02:00
Martin Kroeker 5fa0aec3cf Update apple_m.yml 2026-04-27 22:44:13 +02:00
Martin Kroeker 94b4c6c47c Add cross-compilation to x86_64 based on the Cirrus CI job 2026-04-27 20:14:36 +02:00
Martin Kroeker 10cf63eea4 Merge pull request #5784 from martin-frbg/issue5783
Fix printing of Loongarch LSX/LASX status to the config file
2026-04-27 14:20:56 +02:00
Martin Kroeker 0a3e061977 Update cpuid_loongarch64.c
fix conditional printing of LSX/LASX status to the configuration files
2026-04-27 08:56:38 +02:00
Martin Kroeker 2347cdd77f Merge pull request #5781 from martin-frbg/zhaoxin_cpuids
Add AVX2 capability check to generic Zhaoxin cpu autodetection
2026-04-26 10:09:01 +02:00
Martin Kroeker 7367af6649 Merge pull request #5780 from martin-frbg/lapack1225
Calculate LWORK in CUNMLQ K=0 case like ZUNMLQ  (Reference-LAPACK PR 1225)
2026-04-25 22:18:37 +02:00
Martin Kroeker feca8f994d Recognize other AVX2-capable Zhaoxin cpus 2026-04-25 19:18:28 +02:00
Martin Kroeker 9019f9b6ff Recognize other recent AVX2-capable Zhaoxin cpus 2026-04-25 19:15:57 +02:00
Martin Kroeker 0b3b486606 Calculate LWORK in K=0 case consistently with ZUNMLQ (Reference-LAPACK PR 1225) 2026-04-25 19:11:43 +02:00
Martin Kroeker 05ecfc6d47 Merge pull request #5779 from martin-frbg/issue5778
Keep getarch from generating a conflicting -j argument for gmake
2026-04-25 17:26:57 +02:00
Martin Kroeker a90ffae6b2 Automate use of MAKE_NB_JOBS=-1 to avoid adding a conflicting job count entry to MAKEFLAGS 2026-04-25 14:14:34 +02:00
Martin Kroeker a8469771b5 Merge pull request #5777 from gruenich/feature/update-github-actions
[ci] Update GitHub Actions to latest major release
2026-04-24 22:48:34 +02:00
Martin Kroeker 662d80bf37 Merge pull request #5776 from chris-se/cmake-macos-ninja
CMake: properly fix build on macOS with Ninja (cf. to response files)
2026-04-24 13:45:58 +02:00
Christoph Grüninger 91f83f00b9 [ci] Set CodSpeedHQ/action's mode to simulation
v4 requires the mode to me explicitly set.
2026-04-24 07:18:11 +02:00
Christoph Grüninger 0a74cb6dcc [ci] Update GitHub Actions to latest major release
Fixes deprecations warnings that Node20.js will stop
working in June.
2026-04-23 21:37:42 +02:00
Christian Seiler ca4d867cbb CMake: properly fix build on macOS with Ninja (related to response files)
On macOS several build-related programs (`cc`, `ar`) will not accept
the linker line if too many files have been added to it in the
DYNAMIC_ARCH case. (This now occurs on all platforms where macOS
runs / used to run, as there are enough ARM variants that are
build with DYNAMIC_ARCH that the number of files exceeds the
intrinsic limit on macOS.)

The workaround for this is to use response files that contain the
file list themselves, and pass these to the build system. For
dynamic libraries this works fine, but for static libraries it
doesn't because `ar` doesn't accept response files on macOS. For this
reason there was previously a workaround in CMakeLists.txt to handle
this, but the workaround didn't take into consideration that when
building only a shared library it is not actually necessary, and
when building static libraries the response file CMake generates for
Ninja is at a different location than the response files CMake
generates for Unix Makefiles.

This commit cleans this all up by setting the necessary options for
the response files to be properly generated, and adjusts the additional
workaround to only be applicable in the case a static library is
built. The workaround is also adjusted to handle the Ninja case.

Fixes GitHub issue #5775
2026-04-23 15:48:26 +02:00
Martin Kroeker 3c553ef705 Update version to 0.3.33.dev 2026-04-23 14:00:39 +02:00
Martin Kroeker 7aa181e819 Update version to 0.3.33.dev 2026-04-23 13:59:53 +02:00
Martin Kroeker c696bdcfa8 Merge pull request #5774 from OpenMathLib/release-0.3.0
merge back from release branch to copy tag
2026-04-23 13:59:07 +02:00
Martin Kroeker 62bcfb0dc9 Update version to 0.3.33
apple m / build (cmake, gfortran, 0, 0) (push) Canceled after 0s
apple m / build (cmake, gfortran, 0, 1) (push) Canceled after 0s
apple m / build (cmake, gfortran, 1, 0) (push) Canceled after 0s
apple m / build (cmake, gfortran, 1, 1) (push) Canceled after 0s
apple m / build (make, gfortran, 0, 0) (push) Canceled after 0s
apple m / build (make, gfortran, 0, 1) (push) Canceled after 0s
apple m / build (make, gfortran, 1, 0) (push) Canceled after 0s
apple m / build (make, gfortran, 1, 1) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=C910V, C910V, riscv64-unknown-linux-gnu) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=RISCV64_GENERIC, RISCV64_GENERIC, riscv64-linux-gnu) (push) Canceled after 0s
Run codspeed benchmarks / benchmarks (make, gfortran, ubuntu-22.04, 3.12) (push) Canceled after 0s
continuous build / build (cmake, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / msys2 (None, fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, MINGW32, mingw-w64-i686) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int64, -DBINARY=64 -DINTERFACE64=1, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int64, -DBINARY=64 -DINTERFACE64=1, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / cross_build (DYNAMIC_ARCH=1 TARGET=GENERIC, mips64el, mips64el-linux-gnuabi64) (push) Canceled after 0s
continuous build / cross_build (TARGET=EV4, alpha, alpha-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=MIPS1004K, mipsel, mipsel-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=RISCV64_GENERIC, riscv64, riscv64-linux-gnu) (push) Canceled after 0s
continuous build / neoverse_build (push) Canceled after 0s
harmonyos / build (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6400, I6400, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6500, I6500, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=MIPS64_GENERIC, MIPS64_GENERIC, mips64el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=P6600, P6600, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=SICORTEX, SICORTEX, mips64el-linux-gnuabi64) (push) Canceled after 0s
Nightly-Homebrew-Build / build-OpenBLAS-with-Homebrew (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_GENERIC BINARY=64 ARCH=riscv64 DYNAMIC_ARCH=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64, DYNAMIC_ARCH=1) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL128B BINARY=64 ARCH=riscv64, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=128,elen=64, RISCV64_ZVL128B) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL256B BINARY=64 ARCH=riscv64 BUILD_BFLOAT16=1 BUILD_HFLOAT16=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64,zfh=true,zvfh=true,zvfbfwma=true, RISCV64_ZVL256B) (push) Canceled after 0s
2026-04-23 13:50:46 +02:00
Martin Kroeker a8ffcea555 Merge pull request #5773 from OpenMathLib/develop
Merge from develop for 0.3.33 release
2026-04-23 13:49:27 +02:00
Martin Kroeker b0a0364be7 Merge branch 'release-0.3.0' into develop 2026-04-23 13:49:10 +02:00
Martin Kroeker dbad3e1e19 Update version to 0.3.33 2026-04-23 13:44:05 +02:00
Martin Kroeker 2bbd11129c Merge pull request #5772 from martin-frbg/changelog0333
Update the Changelog for 0.3.33
2026-04-23 13:41:04 +02:00
Martin Kroeker 81bf61b118 Update for 0.3.33 2026-04-23 13:02:04 +02:00
Martin Kroeker c7356182f4 Merge pull request #5771 from martin-frbg/lapack1257
Fix EXTERNAL declarations in CLARF1F and ZUPMTR  (Reference-LAPACK PR 1257)
2026-04-23 12:24:34 +02:00
Martin Kroeker 70d1c2f7b2 Fix EXTERNAL declarations (Reference-LAPACK PR 1257) 2026-04-23 09:44:16 +02:00
Martin Kroeker 07e7594ffe Merge pull request #5769 from martin-frbg/issue5768
Fix CMake builds on Apple that use the Ninja generator
2026-04-22 23:15:36 +02:00
Martin Kroeker e447f2c7ce Merge pull request #5770 from martin-frbg/undef_prefsize
Undefine GEMM_PREFERRED_SIZE before redefining to silence warning
2026-04-22 21:18:25 +02:00
Martin Kroeker ded9a96920 Merge pull request #5767 from martin-frbg/issue5763
Fix ARM64 DYNAMIC_ARCH unconditionally branching into the SME code for STRMM
2026-04-22 20:11:31 +02:00
Martin Kroeker c1bb49dc51 Omit the entire APPLE-specific block if using Ninja 2026-04-22 17:48:59 +02:00
Martin Kroeker 54b939e4e3 Undefine GEMM_PREFERRED_SIZE before redefining to silence warning 2026-04-22 16:30:12 +02:00
Martin Kroeker d270dcb123 Using response files on Mac is incompatible (and unnecessary) with Ninja 2026-04-22 15:58:04 +02:00
Martin Kroeker 59cfea0859 Move quick return out of the scope of the potential DYNAMIC_ARCH check 2026-04-22 15:38:04 +02:00
Martin Kroeker fd862d43b6 Remove redundant quick return 2026-04-22 15:36:57 +02:00
Martin Kroeker 74486799bb Move quick return out of the scope of the DYNAMIC_ARCH conditional for SME 2026-04-22 12:22:09 +02:00
Martin Kroeker 9a46ffba36 Merge pull request #5766 from martin-frbg/lapack1251
Optimize ?LACPY/?LASCL/?LANTR looping in fat matrix cases with UPLO=L (Reference-LAPACK PR 1251)
2026-04-21 23:53:10 +02:00
Martin Kroeker 775f467be6 Optimize looping over the lower triangular in fat matrix cases 2026-04-21 21:30:36 +02:00
Martin Kroeker 41dbca901e Merge pull request #5765 from martin-frbg/issue5764
Disable gcc-specific version checks for NVIDIA HPC in CMake builds
2026-04-21 14:33:11 +02:00
Martin Kroeker c87e4fca72 Disable gcc-specific version checks for NVIDIA HPC 2026-04-21 12:16:10 +02:00
Martin Kroeker 02dc625d42 Merge pull request #5762 from martin-frbg/issue5750
Guard against eventual overflow of the config string
2026-04-17 00:03:09 +02:00
Martin Kroeker 6f0dfd5276 Guard against eventual overflow of the config string 2026-04-16 18:37:08 +02:00
Martin Kroeker b8bb6d08f7 Merge pull request #5761 from martin-frbg/fixup5759
Add part code for NeoverseV3 to the build-time detection as well
2026-04-16 18:09:16 +02:00
Martin Kroeker 2a5d33a95d Add part code for NeoverseV3 2026-04-16 14:45:41 +02:00
Martin Kroeker b77cd0ae06 Merge pull request #5760 from teddygood/wasm-trsm
Add WebAssembly SIMD STRSM and DTRSM kernels
2026-04-16 14:39:26 +02:00
Martin Kroeker 4991de5f3e Merge pull request #5759 from nSircombe/feature/v3support
Add CPU ID for Neoverse V3
2026-04-16 14:38:32 +02:00
Martin Kroeker fe23eadd17 Merge pull request #5758 from martin-frbg/spack_bignuma
Automatically assume BIGNUMA if more than 256 CPUs defined/detected
2026-04-16 11:46:53 +02:00
teddygood ecca5e480d Add WASM128_GENERIC STRSM and DTRSM kernels 2026-04-16 17:52:37 +09:00
teddygood 2847354ffb Allow target-specific GEMM and TRSM overrides 2026-04-16 17:52:37 +09:00
Nathan John Sircombe 5f4a5b323d Update (c) years and contributors 2026-04-16 08:53:32 +01:00
Nathan John Sircombe 3a3903a49e Add CPU ID for Neoverse V3 2026-04-15 22:07:32 +01:00
Martin Kroeker 822b873c7c Automatically assume BIGNUMA if more than 256 CPUs 2026-04-15 22:59:12 +02:00
Martin Kroeker 330abcd5a9 Merge pull request #5707 from vtjnash/jn/makefile-rule-dynamic-2
Reapply "build: fix rule for building dynamic files"
2026-04-15 21:58:21 +02:00
Martin Kroeker 7073b680ee Merge pull request #5757 from martin-frbg/lapack1212+1228
Fix typos in EIG DMD tests and initialize cutoff (Reference-LAPACK PRs 1212&1228)
2026-04-15 19:02:47 +02:00
Martin Kroeker 1d15733ff5 Fix typos and initialize cutoff value (Reference-LAPACK PRs 1212&1228) 2026-04-15 12:16:03 +02:00
Martin Kroeker 70faa9f19d Merge pull request #5756 from OpenMathLib/issue5267
Work around miscompilation of the AVX512 ?GEMM kernels by Windows LLVM
2026-04-15 07:58:21 +02:00
Martin Kroeker c59578f314 fix conditionals
apple m / build (cmake, gfortran, 0, 0) (push) Canceled after 0s
apple m / build (cmake, gfortran, 0, 1) (push) Canceled after 0s
apple m / build (cmake, gfortran, 1, 0) (push) Canceled after 0s
apple m / build (cmake, gfortran, 1, 1) (push) Canceled after 0s
apple m / build (make, gfortran, 0, 0) (push) Canceled after 0s
apple m / build (make, gfortran, 0, 1) (push) Canceled after 0s
apple m / build (make, gfortran, 1, 0) (push) Canceled after 0s
apple m / build (make, gfortran, 1, 1) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=C910V, C910V, riscv64-unknown-linux-gnu) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=RISCV64_GENERIC, RISCV64_GENERIC, riscv64-linux-gnu) (push) Canceled after 0s
Run codspeed benchmarks / benchmarks (make, gfortran, ubuntu-22.04, 3.12) (push) Canceled after 0s
continuous build / build (cmake, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / msys2 (None, fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, MINGW32, mingw-w64-i686) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int64, -DBINARY=64 -DINTERFACE64=1, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int64, -DBINARY=64 -DINTERFACE64=1, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / cross_build (DYNAMIC_ARCH=1 TARGET=GENERIC, mips64el, mips64el-linux-gnuabi64) (push) Canceled after 0s
continuous build / cross_build (TARGET=EV4, alpha, alpha-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=MIPS1004K, mipsel, mipsel-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=RISCV64_GENERIC, riscv64, riscv64-linux-gnu) (push) Canceled after 0s
continuous build / neoverse_build (push) Canceled after 0s
harmonyos / build (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6400, I6400, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6500, I6500, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=MIPS64_GENERIC, MIPS64_GENERIC, mips64el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=P6600, P6600, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=SICORTEX, SICORTEX, mips64el-linux-gnuabi64) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_GENERIC BINARY=64 ARCH=riscv64 DYNAMIC_ARCH=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64, DYNAMIC_ARCH=1) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL128B BINARY=64 ARCH=riscv64, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=128,elen=64, RISCV64_ZVL128B) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL256B BINARY=64 ARCH=riscv64 BUILD_BFLOAT16=1 BUILD_HFLOAT16=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64,zfh=true,zvfh=true,zvfbfwma=true, RISCV64_ZVL256B) (push) Canceled after 0s
2026-04-14 21:32:36 +02:00
Martin Kroeker d9786d387c fix missing eol 2026-04-14 10:56:04 +02:00
Martin Kroeker b9da7dbd24 Quote the respective SUMM file on failure in BLAS2/3 tests 2026-04-12 23:17:36 +02:00
Martin Kroeker 172f41c818 Merge pull request #5674 from ChipKerchner/fasterRVVEdges
Improve performance on edges of GEMM for RISC-V
2026-04-11 22:04:21 +02:00
Martin Kroeker 94e053ac10 Work around miscompilation of the AVX512 ?GEMM kernels by Windows LLVM 2026-04-11 19:27:31 +02:00
Martin Kroeker 646d0c9fee Merge pull request #5751 from chenx97/mips-dedup-c-impl
Remove redundant C implemetations from MIPS directories
2026-04-09 23:51:37 +02:00
Martin Kroeker 2c80f8c974 Merge pull request #5755 from martin-frbg/fixup5702
Fix partial merge of changes from PR #5702 (applying Reference-LAPACK PR 1203)
2026-04-09 16:35:13 +02:00
Martin Kroeker 0ea23484c6 Use ROUNDUP_LWORK and remove redundant conversions (Reference-LAPACK PR1203) 2026-04-09 14:54:55 +02:00
Martin Kroeker 1aea1d6237 Merge pull request #5753 from foxtran/fix/1203
Fix DROUNDUP_LWORK: patch was not fully copied
2026-04-09 14:08:23 +02:00
Henry Chen 6a5d2142f4 Fix dsdot precision for arm/dot.c 2026-04-09 18:11:47 +08:00
Igor S. Gerasimov f9f8e94a14 Fix DROUNDUP_LWORK: patch was not fully copied 2026-04-09 02:23:58 +02:00
Martin Kroeker 9a0f76a0a1 Merge pull request #5746 from chenx97/mips-fix-implicit-declaration
MIPS: fix implicit declarations found in the cpuinfo detector
2026-04-08 15:32:20 +02:00
Martin Kroeker 75a99605af Merge pull request #5744 from nakatamaho/fix/slamc3
lapack/laed3: fix MinGW build by matching LAMC3 prototype
2026-04-08 12:18:22 +02:00
Martin Kroeker 9d9fcc1881 Merge pull request #5752 from martin-frbg/fixup5748
Fix missing endif in openblas_config.h
2026-04-08 12:17:35 +02:00
Martin Kroeker e926bb0523 fix missing endif 2026-04-08 10:38:56 +02:00
Henry Chen e875a9cdd0 Remove redundant C implemetations from MIPS directories 2026-04-08 13:59:10 +08:00
Martin Kroeker fb45e7da89 CirrusCI: Fix ranlib confusion between xcode and AndroidNDK (#5749)
* Use ar and ranlib from Android NDK rather than xcode
2026-04-08 00:34:18 +02:00
Martin Kroeker e41cb1ad7a Merge pull request #5748 from martin-frbg/issue5747
Check that _Float16 is available before using it in openblas_config.h
2026-04-07 22:52:20 +02:00
Martin Kroeker dc32a8a90f Try to find out if _Float16 is available on the target before using it 2026-04-07 18:31:40 +02:00
Henry Chen a04ea2b2c4 MIPS: fix implicit declarations found in the cpuinfo detector 2026-04-07 15:59:50 +08:00
NAKATA Maho f272216ae3 lapack/laed3: fix MinGW build for slaed3
common_interface.h declares slamc3 as returning FLOATRET when
NEED_F2CCONV is enabled, but laed3_single.c and laed3_parallel.c
redeclared LAMC3 as returning FLOAT. This causes conflicting-type
errors in MinGW builds.

Use FLOATRET for the local LAMC3 prototype so it matches the shared
declaration. Also undefine the Windows max macro before the local
max definition in laed3_parallel.c to avoid macro redefinition
warnings.
2026-04-06 13:13:21 +09:00
Chip Kerchner 0a4d6b2e11 Forgot files from previous check-in. 2026-04-02 20:15:32 +00:00
Chip Kerchner cc1b5794a0 Reduce number of vectors in use from 32 to 24 for last stage of main block - now full LMUL2. 2026-04-02 20:14:57 +00:00
Chip Kerchner 22b7950baa Use LMUL2 for calculations in main block - just break them apart before last stage. 2026-04-02 16:24:15 +00:00
Chip Kerchner 3b1aef12c7 Use LMUL2 loads in main block. 2026-04-02 13:20:16 +00:00
Martin Kroeker 9b3cc7835b Merge pull request #5741 from martin-frbg/issue5696
Add note on using an x86 OpenBLAS in Windows on Arm via Prism
2026-04-02 11:38:16 +02:00
Martin Kroeker bef5f1c6e2 Merge pull request #5740 from martin-frbg/issue5739
Fix out-of-bounds access in the converted C version of the CBLAS tests
2026-04-02 11:37:57 +02:00
Martin Kroeker 3bbd755ba7 Add note on using an x86 OpenBLAS in Windows on Arm via Prism 2026-04-02 10:36:33 +02:00
Martin Kroeker 47be0d8a52 Fix access beyond array size 2026-04-02 10:14:09 +02:00
Martin Kroeker 93515c2f7a Merge pull request #5736 from martin-frbg/lapack1221
Follow-up on ?GESVDQ updates from PR1146 (Reference-LAPACK PR 1221)
2026-04-01 22:47:39 +02:00
Martin Kroeker 7dde52d5d2 Follow-up on ?GESVDQ updates from PR 1146 (Reference-LAPACK PR 1221) 2026-04-01 16:27:56 +02:00
Martin Kroeker c6e4d17819 Follow-up on ?GESVDQ updates from PR 1146 (Reference-LAPACK PR 1221) 2026-04-01 15:34:02 +02:00
Martin Kroeker b9ba9be508 Follow-up on ?GESVDQ updates from PR1146 (Reference-LAPACK PR 1221) 2026-04-01 15:19:41 +02:00
Martin Kroeker d27e98c97a Merge pull request #5734 from martin-frbg/lapack774
Fix workspace size in ?TGSEN (Reference-LAPACK PR 774)
2026-04-01 08:52:37 +02:00
Martin Kroeker 429d23f420 Merge pull request #5730 from martin-frbg/lapack1206
Fix overwriting of LDSWORK in ?TRSYL3 (Reference-LAPACK PR 1206)
2026-03-31 23:58:04 +02:00
Martin Kroeker 3f2338ba85 Merge pull request #5732 from martin-frbg/lapack1209
Remove unused parameter in  DORBDB3/ZUNBDB3 (Reference-LAPACK PR 1209)
2026-03-31 23:57:36 +02:00
Martin Kroeker 62dcdca823 Merge pull request #5733 from martin-frbg/lapack1211
Re-enable testing of the ?BB/?GG driver routines (Reference-LAPACK PR 1211)
2026-03-31 23:57:08 +02:00
Martin Kroeker eaeaf95e23 Merge pull request #5731 from martin-frbg/lapack1207
Fix crossover of INFO variables in some EIG tests (Reference-LAPACK PR 1207)
2026-03-31 23:56:47 +02:00
Martin Kroeker f1f36c02b9 Merge pull request #5729 from martin-frbg/lapack1195
Fix truncation of large workspace values in ZHE routines (Reference-LAPACK PR 1195)
2026-03-31 21:36:54 +02:00
Martin Kroeker 9816062aaf Merge pull request #5727 from martin-frbg/lapack1187
Fix DGGES test seed to avoid bad matrix (Reference-LAPACK PR 1187)
2026-03-31 21:36:35 +02:00
Martin Kroeker 664f17655c Merge pull request #5726 from martin-frbg/lapack1149
Fix display of version number in LAPACK tests (Reference-LAPACK PR 1149)
2026-03-31 21:36:17 +02:00
Martin Kroeker aec6170a8b Merge pull request #5725 from martin-frbg/lapack1146
Fix support for jobu/v in LAPACKE_?GESVDQ_WORK (Reference-LAPACK PR 1146)
2026-03-31 19:21:10 +02:00
Chip Kerchner daa3215fb4 Remove shadow variable. 2026-03-31 14:41:38 +00:00
Martin Kroeker 66cc9f043d Merge pull request #5724 from martin-frbg/lapack1136
Add NaN checks for input matrix A in ?GEEV (Reference-LAPACK PR 1136)
2026-03-31 16:16:25 +02:00
Martin Kroeker cc74393520 Fix workspace size (Reference-LAPACK PR 774) 2026-03-31 14:06:00 +02:00
Martin Kroeker 4bbb9fefc0 Fix workspace size (Reference-LAPACK PR 774) 2026-03-31 14:02:02 +02:00
Martin Kroeker e48625414f Merge pull request #5723 from martin-frbg/lapack1094
Change WORK dimension in deprecated ?GELQS/?GEQRS (Reference-LAPACK PR 1094)
2026-03-31 12:16:09 +02:00
Martin Kroeker 844939a9fb Enable testing of the driver routines (Reference-LAPACK PR 1211) 2026-03-31 11:53:42 +02:00
Martin Kroeker f085c70784 Remove unused parameter (Reference-LAPACK PR 1209) 2026-03-31 11:47:24 +02:00
Martin Kroeker 391cbf8584 Pass IINFO instead of INFO to ??PGVX (Reference-LAPACK PR 1207) 2026-03-31 11:39:45 +02:00
Martin Kroeker 6e89813300 Fix spurious overwriting of caller variable LDSWORK (Reference-LAPACK PR 1206) 2026-03-31 11:31:38 +02:00
Martin Kroeker 37e189c85d Fix truncation of large workspace values (Reference-LAPACK PR 1195) 2026-03-31 10:59:07 +02:00
Martin Kroeker 6dad37ff8d Merge pull request #5722 from martin-frbg/lapack1023
Change loop order in ?GETC2 (Reference-LAPACK PR 1023)
2026-03-31 09:43:49 +02:00
Martin Kroeker 004cf0d3d0 Fix seed to avoid FMA-sensitive ill-conditioned matrix (Reference-LAPACK PR 1187) 2026-03-31 00:02:26 +02:00
Martin Kroeker 1243314201 Fix display of minor version number (Reference-LAPACK PR 1149) 2026-03-30 23:48:43 +02:00
Martin Kroeker edad2a8b2f Fix display of minor version number (Reference-LAPACK PR 1149) 2026-03-30 23:47:31 +02:00
Martin Kroeker 55d7dd89ae Fix support for jobu and jobv (Reference-LAPACK PR 1146) 2026-03-30 23:36:42 +02:00
Martin Kroeker e19e140619 Add NaN checks for input matrix A (Reference-LAPACK PR 1136) 2026-03-30 23:06:12 +02:00
Martin Kroeker a03cd30185 Change WORK(LWORK) to WORK(*) (Reference-LAPACK PR 1094) 2026-03-30 21:36:05 +02:00
Martin Kroeker 904f9d60b0 Merge pull request #5721 from martin-frbg/lapack1020
Implement ?LARF1F and ?ORM2R (Reference-LAPACK PRs 1019/1020/1196)
2026-03-30 21:25:56 +02:00
Chip Kerchner d69be17b6f Convert 2X LMUL1 instructions to 1X LMUL2. Improved FP64 GEMM edges - up to more than 3X faster. 2026-03-30 18:50:27 +00:00
Martin Kroeker ff5dc3ebc1 Change loop ordering to improve performance (Reference-LAPACK PR 1023) 2026-03-30 20:24:31 +02:00
Martin Kroeker a5d0f89ea4 Add C replacements for ?LARF1F/?LARF1L 2026-03-30 19:41:54 +02:00
Martin Kroeker af63f2a1aa Add C replacements for ?LARF1F/?LARF1L 2026-03-30 19:40:14 +02:00
Martin Kroeker 4342764c23 Implement ?LARF1F and ?ORM2R (Reference-LAPACK PRs 1019/1020/1196) 2026-03-30 19:15:29 +02:00
Martin Kroeker d9bb8f369f Implement ?LARF1F and ?ORM2R (Reference-LAPACK PRs 1019/1020/1196) 2026-03-30 18:45:36 +02:00
Martin Kroeker f5f789fc52 Implement ?LARF1F and ?ORM2R (Reference-LAPACK PRs 1019/1020/1196) 2026-03-30 18:41:59 +02:00
Martin Kroeker 605b1287e3 Add ?LARF1F and ?LARF1L (Reference-LAPACK PRs 1019/1020) 2026-03-30 18:34:28 +02:00
Martin Kroeker d26960a21e Merge pull request #5719 from martin-frbg/issue5713
ARM64 DYNAMIC_ARCH: add CortexA75/76  and restore VORTEX for DYNAMIC_LIST
2026-03-30 07:19:53 +02:00
Martin Kroeker 16211b7170 Add CortexA75/76 via CortexA73 and restore VORTEX for use with DYNAMIC_LIST 2026-03-29 22:10:44 +02:00
Martin Kroeker 0f9f6e4be5 Merge pull request #5710 from martin-frbg/issue5708
Work around miscompilation of the ARM64 non-SVE DDOT kernel
2026-03-27 22:09:08 +01:00
Martin Kroeker 3ebfc0ef65 Merge pull request #5718 from martin-frbg/issue5625
Fix CMake DYNAMIC_ARCH builds under Windows on Arm
2026-03-27 16:51:58 +01:00
Martin Kroeker 0315003d1f Do not build SME targets in DYNAMIC_ARCH under Windows 2026-03-27 13:42:41 +01:00
Martin Kroeker 75511cb67c POSIX strncasecmp is strnicmp in Windows on Arm 2026-03-27 13:40:39 +01:00
Martin Kroeker b8dbc4a1fc Merge pull request #5716 from yuanjia111/develop
[ARM64] Add optimized fp16 shgemm kernels for Neoverse N2
2026-03-27 13:36:25 +01:00
yuanjia e6eba9fa21 Add optimized FP16 shgemm for for NEOVERSEN2 target 2026-03-27 17:55:06 +08:00
Martin Kroeker 2671786e61 Merge pull request #5715 from martin-frbg/issue5714
typedef the unsupported fp16 as bfloat16 on Loongarch64 too
2026-03-27 10:19:44 +01:00
Martin Kroeker 3c188e4c12 Merge pull request #5712 from murste01/develop
Fix incorrect cast from BF16 to FP32 in SBGEMM
2026-03-27 07:50:00 +01:00
Martin Kroeker 7086a1b075 typedef the unsupported fp16 as bfloat16 on Loongarch64 too 2026-03-26 23:00:04 +01:00
Murray Steele f6d4fe703b Fix incorrect cast from BF16 to FP32 in SBGEMM
This change fixes a regression in SBGEMM where C is assumed to be BF16,
and so unconditionally casts the output to FP32 resulting in incorrect
outputs when beta=1.
2026-03-26 12:10:52 +00:00
Martin Kroeker 1f1fcd4927 Merge pull request #5709 from iv-m/loongarch64-fix-typo
c_check: loongarch64: Fix typo
2026-03-24 23:10:52 +01:00
Martin Kroeker e3ce4623c2 Use volatile attribute for SDOT only, to avoid creating new miscompilations 2026-03-24 23:08:02 +01:00
Ivan A. Melnikov 86971646ed c_check: loongarch64: Fix typo
Fixes: 42c7a27e6b
2026-03-24 21:25:46 +04:00
Chip Kerchner 8fc0004024 Fix another typo. 2026-03-24 13:04:54 +00:00
Jameson Nash c114ca5247 Reapply "build: fix rule for building dynamic files"
This reverts commit 7eab365219 and fixes
the pattern rule requirement "% must match a non-empty stem" to match at
least '.' in the pattern.

This whole file could actually be substantially simplified to just:

	%.$(SUFFIX): %.c
		$(CC) $(CFLAGS) -c $< -o $(@F)

	%.$(PSUFFIX): %.c
		$(CC) $(PFLAGS) -c $< -o $(@F)

if desired to entirely avoid the copy-paste duplication, but the net
effect is the same.
2026-03-23 23:09:47 -04:00
Martin Kroeker b8697b3448 Update version to 0.3.32.dev 2026-03-24 00:02:13 +01:00
Martin Kroeker d511552e64 Update version to 0.3.32.dev 2026-03-24 00:01:33 +01:00
Martin Kroeker 821242ed9d Merge pull request #5706 from OpenMathLib/release-0.3.0
Merge back from release branch to copy 0.3.32 tag
2026-03-24 00:00:52 +01:00
Martin Kroeker 8cecf899e2 Update version to 0.3.32
apple m / build (cmake, gfortran, 0, 0) (push) Canceled after 0s
apple m / build (cmake, gfortran, 0, 1) (push) Canceled after 0s
apple m / build (cmake, gfortran, 1, 0) (push) Canceled after 0s
apple m / build (cmake, gfortran, 1, 1) (push) Canceled after 0s
apple m / build (make, gfortran, 0, 0) (push) Canceled after 0s
apple m / build (make, gfortran, 0, 1) (push) Canceled after 0s
apple m / build (make, gfortran, 1, 0) (push) Canceled after 0s
apple m / build (make, gfortran, 1, 1) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=C910V, C910V, riscv64-unknown-linux-gnu) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=RISCV64_GENERIC, RISCV64_GENERIC, riscv64-linux-gnu) (push) Canceled after 0s
Run codspeed benchmarks / benchmarks (make, gfortran, ubuntu-22.04, 3.12) (push) Canceled after 0s
continuous build / build (cmake, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / msys2 (None, fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, MINGW32, mingw-w64-i686) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int64, -DBINARY=64 -DINTERFACE64=1, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int64, -DBINARY=64 -DINTERFACE64=1, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / cross_build (DYNAMIC_ARCH=1 TARGET=GENERIC, mips64el, mips64el-linux-gnuabi64) (push) Canceled after 0s
continuous build / cross_build (TARGET=EV4, alpha, alpha-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=MIPS1004K, mipsel, mipsel-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=RISCV64_GENERIC, riscv64, riscv64-linux-gnu) (push) Canceled after 0s
continuous build / neoverse_build (push) Canceled after 0s
harmonyos / build (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6400, I6400, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6500, I6500, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=MIPS64_GENERIC, MIPS64_GENERIC, mips64el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=P6600, P6600, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=SICORTEX, SICORTEX, mips64el-linux-gnuabi64) (push) Canceled after 0s
Nightly-Homebrew-Build / build-OpenBLAS-with-Homebrew (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_GENERIC BINARY=64 ARCH=riscv64 DYNAMIC_ARCH=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64, DYNAMIC_ARCH=1) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL128B BINARY=64 ARCH=riscv64, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=128,elen=64, RISCV64_ZVL128B) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL256B BINARY=64 ARCH=riscv64 BUILD_BFLOAT16=1 BUILD_HFLOAT16=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64,zfh=true,zvfh=true,zvfbfwma=true, RISCV64_ZVL256B) (push) Canceled after 0s
2026-03-23 23:53:57 +01:00
Martin Kroeker 3f1eac4ba0 Update version to 0.3.32 2026-03-23 23:53:05 +01:00
Martin Kroeker fd1c5ca01a Merge pull request #5705 from OpenMathLib/develop
Merge from develop for 0.3.32 release
2026-03-23 23:51:55 +01:00
Martin Kroeker 52178f70c7 Merge pull request #5703 from martin-frbg/changelog0332
Update Changelog for 0.3.32
2026-03-23 23:48:23 +01:00
Martin Kroeker f88aa7def7 Merge pull request #5702 from martin-frbg/lapack1203
Roundup LWORK and remove conversions in ?GVD (Reference-LAPACK PR 1203)
2026-03-23 20:05:17 +01:00
Martin Kroeker a24cca9576 Merge pull request #5704 from OpenMathLib/revert-5565-jn/makefile-rule-dynamic
Revert "build: fix rule for building dynamic files"
2026-03-23 20:04:08 +01:00
Martin Kroeker 7eab365219 Revert "build: fix rule for building dynamic files"
apple m / build (cmake, gfortran, 0, 0) (push) Canceled after 0s
apple m / build (cmake, gfortran, 0, 1) (push) Canceled after 0s
apple m / build (cmake, gfortran, 1, 0) (push) Canceled after 0s
apple m / build (cmake, gfortran, 1, 1) (push) Canceled after 0s
apple m / build (make, gfortran, 0, 0) (push) Canceled after 0s
apple m / build (make, gfortran, 0, 1) (push) Canceled after 0s
apple m / build (make, gfortran, 1, 0) (push) Canceled after 0s
apple m / build (make, gfortran, 1, 1) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=C910V, C910V, riscv64-unknown-linux-gnu) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=RISCV64_GENERIC, RISCV64_GENERIC, riscv64-linux-gnu) (push) Canceled after 0s
Run codspeed benchmarks / benchmarks (make, gfortran, ubuntu-22.04, 3.12) (push) Canceled after 0s
continuous build / build (cmake, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / msys2 (None, fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, MINGW32, mingw-w64-i686) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int64, -DBINARY=64 -DINTERFACE64=1, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int64, -DBINARY=64 -DINTERFACE64=1, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / cross_build (DYNAMIC_ARCH=1 TARGET=GENERIC, mips64el, mips64el-linux-gnuabi64) (push) Canceled after 0s
continuous build / cross_build (TARGET=EV4, alpha, alpha-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=MIPS1004K, mipsel, mipsel-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=RISCV64_GENERIC, riscv64, riscv64-linux-gnu) (push) Canceled after 0s
continuous build / neoverse_build (push) Canceled after 0s
harmonyos / build (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6400, I6400, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6500, I6500, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=MIPS64_GENERIC, MIPS64_GENERIC, mips64el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=P6600, P6600, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=SICORTEX, SICORTEX, mips64el-linux-gnuabi64) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_GENERIC BINARY=64 ARCH=riscv64 DYNAMIC_ARCH=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64, DYNAMIC_ARCH=1) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL128B BINARY=64 ARCH=riscv64, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=128,elen=64, RISCV64_ZVL128B) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL256B BINARY=64 ARCH=riscv64 BUILD_BFLOAT16=1 BUILD_HFLOAT16=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64,zfh=true,zvfh=true,zvfbfwma=true, RISCV64_ZVL256B) (push) Canceled after 0s
2026-03-23 20:03:52 +01:00
Martin Kroeker 983fca52d5 Merge branch 'develop' into jn/build-exe 2026-03-23 18:59:02 +01:00
Martin Kroeker 6137054da3 Update with 0.3.32 changes 2026-03-23 18:35:22 +01:00
Martin Kroeker b227de9429 Merge pull request #5701 from martin-frbg/lapack1204
Fix internal errors getting ignored in calculation of selected eigenvalues (Reference-LAPACK PR 1204)
2026-03-23 18:32:25 +01:00
Martin Kroeker 99c120916a Use ROUNDUP_LWORK and remove redundant conversions (Reference-LAPACK PR1203) 2026-03-23 16:28:25 +01:00
Martin Kroeker 1b6fc34f0c Fix error codes from ?STEBZ getting ignored, resulting in wrong output (Reference-LAPACK PR1204) 2026-03-23 15:56:50 +01:00
Martin Kroeker 51e904df27 Merge pull request #5699 from martin-frbg/issue5325
Add Q&A on calling convention to the FAQ, from issue 5325
2026-03-23 13:28:27 +01:00
Martin Kroeker 8b9b3f0f5e Merge pull request #5698 from martin-frbg/issue5638
Improve error message displayed when running out of buffers
2026-03-23 08:37:45 +01:00
Martin Kroeker 500e32818a Merge pull request #5697 from martin-frbg/ext_doc
Update documentation of BLAS extensions
2026-03-23 07:21:34 +01:00
Martin Kroeker f6d5eb7af9 Merge pull request #5565 from vtjnash/jn/makefile-rule-dynamic
build: fix rule for building dynamic files
2026-03-22 23:59:41 +01:00
Martin Kroeker 9d3ae22b28 Add section on calling convention, from issue 5325 2026-03-22 23:44:32 +01:00
Martin Kroeker 494a3f735f Improve error message displayed when running out of buffers 2026-03-22 22:46:17 +01:00
Martin Kroeker 496af0d8bb add gemm_batch, gemm_batch_strided, bgemm/bgemv and fp16 extensions 2026-03-22 22:34:27 +01:00
Martin Kroeker 1e48eca408 Merge pull request #5695 from martin-frbg/update_readme_wasm
README.md: Update cpu section and add WASM support
2026-03-22 20:14:53 +01:00
Chip Kerchner ebf4cd1c6e Fix typo. 2026-03-22 18:28:21 +00:00
Martin Kroeker faa06bd759 Update cpu section and add WASM support 2026-03-22 00:12:15 +01:00
Martin Kroeker 81d1029950 Merge pull request #5694 from martin-frbg/lapack1191
Update step length selection in ?LAED4  fallback (Reference-LAPACK PR 1191)
2026-03-22 00:06:11 +01:00
Martin Kroeker aa6a59a32e Update step length selection in LAED4 overshoot fallback (Reference-LAPACK PR 1191) 2026-03-21 18:40:54 +01:00
Martin Kroeker 4956446ca2 Merge pull request #5692 from teddygood/wasm-sum-followup
Enable DSUM SIMD path for WASM128_GENERIC
2026-03-21 12:39:30 +01:00
Martin Kroeker a89142fd5d Merge pull request #5688 from martin-frbg/divlimit_dyn
Make PREFERRED_SIZE, GEMM_DIVIDE_LIMIT and _RATE available to DYNAMIC_ARCH builds
2026-03-20 22:23:15 +01:00
Chip Kerchner 1bb72b223d Only initialize unused variables to prevent GCC warnings. 2026-03-20 16:00:33 +00:00
Martin Kroeker afcf70dad9 Merge pull request #5691 from martin-frbg/neov2_dotbug
Avoid potential miscompilation of the ARM64 (NeoverseV2) dot kernel
2026-03-20 16:20:43 +01:00
Martin Kroeker c9185e91ad Make GEMM_DIVIDE_RATE and GEMM_PREFERRED_SIZE available in DYNAMIC_ARCH builds 2026-03-20 15:34:04 +01:00
Martin Kroeker 0dd501d794 Add GEMM_DIVIDE_RATE and GEMM_PREFERRED_SIZE to parameters 2026-03-20 15:32:06 +01:00
Martin Kroeker 6bf687b2ef Make divide_rate and preferred_size available to DYNAMIC_ARCH too 2026-03-20 15:30:53 +01:00
Martin Kroeker 3f6e928d34 Declare result as volatile to keep compilers from optimizing it out 2026-03-20 11:32:23 +01:00
Martin Kroeker 7d4a479a29 Merge pull request #5690 from OpenMathLib/revert-5643-neov2_param
Revert "Fix SGEMM returning wrong results in multithreading on NeoverseV2"
2026-03-20 11:28:29 +01:00
Martin Kroeker 57cdef594b Revert "Fix SGEMM returning wrong results in multithreading on NeoverseV2"
apple m / build (cmake, gfortran, 0, 0) (push) Canceled after 0s
apple m / build (cmake, gfortran, 0, 1) (push) Canceled after 0s
apple m / build (cmake, gfortran, 1, 0) (push) Canceled after 0s
apple m / build (cmake, gfortran, 1, 1) (push) Canceled after 0s
apple m / build (make, gfortran, 0, 0) (push) Canceled after 0s
apple m / build (make, gfortran, 0, 1) (push) Canceled after 0s
apple m / build (make, gfortran, 1, 0) (push) Canceled after 0s
apple m / build (make, gfortran, 1, 1) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=C910V, C910V, riscv64-unknown-linux-gnu) (push) Canceled after 0s
c910v qemu test / TEST (riscv64-linux-gnu, NO_SHARED=1 TARGET=RISCV64_GENERIC, RISCV64_GENERIC, riscv64-linux-gnu) (push) Canceled after 0s
Run codspeed benchmarks / benchmarks (make, gfortran, ubuntu-22.04, 3.12) (push) Canceled after 0s
continuous build / build (cmake, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (cmake, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, macos-latest) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, clang-21, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, flang, ubuntu-latest) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-24.04-arm) (push) Canceled after 0s
continuous build / build (make, gcc, gfortran, ubuntu-latest) (push) Canceled after 0s
continuous build / msys2 (None, fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, MINGW32, mingw-w64-i686) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int32, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int64, -DBINARY=64 -DINTERFACE64=1, CLANG64, mingw-w64-clang-x86_64) (push) Canceled after 0s
continuous build / msys2 (Release, fc, int64, -DBINARY=64 -DINTERFACE64=1, UCRT64, mingw-w64-ucrt-x86_64) (push) Canceled after 0s
continuous build / cross_build (DYNAMIC_ARCH=1 TARGET=GENERIC, mips64el, mips64el-linux-gnuabi64) (push) Canceled after 0s
continuous build / cross_build (TARGET=EV4, alpha, alpha-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=MIPS1004K, mipsel, mipsel-linux-gnu) (push) Canceled after 0s
continuous build / cross_build (TARGET=RISCV64_GENERIC, riscv64, riscv64-linux-gnu) (push) Canceled after 0s
continuous build / neoverse_build (push) Canceled after 0s
harmonyos / build (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC, loongarch64-linux-gnu) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=GENERIC, DYNAMIC_ARCH) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA264, LA264) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA464, LA464) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LA64_GENERIC, LA64_GENERIC) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON2K1000, LOONGSON2K1000) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSON3R5, LOONGSON3R5) (push) Canceled after 0s
loongarch64 clang qemu test / TEST (NO_SHARED=1 DYNAMIC_ARCH=1 TARGET=LOONGSONGENERIC, LOONGSONGENERIC) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6400, I6400, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=I6500, I6500, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=MIPS64_GENERIC, MIPS64_GENERIC, mips64el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=P6600, P6600, mipsisa64r6el-linux-gnuabi64) (push) Canceled after 0s
mips64 qemu test / TEST (NO_SHARED=1 TARGET=SICORTEX, SICORTEX, mips64el-linux-gnuabi64) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_GENERIC BINARY=64 ARCH=riscv64 DYNAMIC_ARCH=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64, DYNAMIC_ARCH=1) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL128B BINARY=64 ARCH=riscv64, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=128,elen=64, RISCV64_ZVL128B) (push) Canceled after 0s
riscv64 zvl256b qemu test / TEST (TARGET=RISCV64_ZVL256B BINARY=64 ARCH=riscv64 BUILD_BFLOAT16=1 BUILD_HFLOAT16=1, rv64,g=true,c=true,v=true,vext_spec=v1.0,vlen=256,elen=64,zfh=true,zvfh=true,zvfbfwma=true, RISCV64_ZVL256B) (push) Canceled after 0s
2026-03-20 11:27:28 +01:00
teddygood f0d142c4dd Enable DSUM SIMD path for WASM128_GENERIC 2026-03-20 18:39:53 +09:00
Chip Kerchner a8a00bbf4f Avoid greater than 4 segment load and store penalties by using 2. Fix mf2 length. 2026-03-19 21:17:20 +00:00
Martin Kroeker e9aab19bbc Merge pull request #5689 from teddygood/wasm-sdot-followup
Use generic dot kernels for WASM128_GENERIC
2026-03-19 17:08:58 +01:00
Chip Kerchner 1e48686df8 Merge remote-tracking branch 'origin/develop' into fasterRVVEdges 2026-03-19 12:15:19 +00:00
Martin Kroeker b7601ea92f Retrieve cpu-specific GEMM_DIVIDE_LIMIT if DYNAMIC_ARCH 2026-03-19 08:29:15 +01:00
Martin Kroeker 8f5e49556f Add GEMM_DIVIDE_LIMIT to parameters 2026-03-19 08:26:33 +01:00
Martin Kroeker d7b13fec90 Provide a default GEMM_DIVIDE_LIMIT and add it to DYNAMIC_ARCH 2026-03-19 08:25:53 +01:00
teddygood 8c3717f69a Add WASM SIMD widening path for DSDOT 2026-03-19 14:16:18 +09:00
teddygood 6f672df537 Use generic DDOT kernel for WASM128_GENERIC 2026-03-19 14:15:32 +09:00
teddygood 6bb0dbfd3c Use generic SDOT kernel for WASM128_GENERIC 2026-03-19 13:54:58 +09:00
Martin Kroeker 8d6238f52e Merge pull request #5687 from martin-frbg/issue5686-1
Improve tests for SHGEMM and BGEMM
2026-03-19 00:01:31 +01:00
Martin Kroeker adba2c3c02 Merge pull request #5685 from teddygood/wasm-intrin-backend-exp
Add a WebAssembly SIMD backend for reusable intrinsics kernels
2026-03-18 21:49:53 +01:00
Martin Kroeker e5793d8406 Split failure count between comparison to SGEMM and naive loop 2026-03-18 21:46:48 +01:00
Martin Kroeker afbd7c2b0d Reduce expected accuracy compared to naive code and silence matrix element printout 2026-03-18 21:38:39 +01:00
Martin Kroeker c9dae4c1e0 Merge pull request #5684 from martin-frbg/asan_utest
Fix utest issues flagged by Address Sanitizer
2026-03-18 18:21:48 +01:00
Chip Kerchner d832ee5086 More global optimzation and clean up. 2026-03-18 13:43:03 +00:00
teddygood 99d05575d0 Enable SAXPY for WebAssembly SIMD backend 2026-03-18 21:27:45 +09:00
teddygood 7ff3588833 Refine WebAssembly SIMD backend scope 2026-03-18 17:24:02 +09:00
Martin Kroeker b3de37c96b Merge pull request #5683 from martin-frbg/fix_skx_smallgemm
Fix potential over-optimization of the AVX512 small SGEMM kernel by gcc15
2026-03-18 09:08:05 +01:00
Martin Kroeker 2bdfe31986 Free arrays after test 2026-03-17 23:22:20 +01:00
Martin Kroeker 5741aab90b Avoid resolving wild pointers in automatic search for tests 2026-03-17 23:20:51 +01:00
Martin Kroeker 79a50d80d3 Fix potential over-optimization by gcc15 2026-03-17 23:13:58 +01:00
Chip Kerchner 477dd40f07 Simplier loops. 2026-03-17 21:18:30 +00:00
teddygood 53d0be88f8 Add WebAssembly SIMD backend for universal intrinsics 2026-03-18 03:23:31 +09:00
Chip Kerchner 79d9fe39c2 Use mf2 instead of m1. 2026-03-17 16:06:54 +00:00
Martin Kroeker 7a95460bb1 Merge pull request #5680 from teddygood/wasm128-generic-target-exp
Add WebAssembly SIMD SGEMM and DGEMM kernels
2026-03-17 14:25:39 +01:00
Martin Kroeker a1fd7a4658 Merge pull request #5677 from CheryDan/riscv/zdrot
Optimize ZROT_RVV for the non-unit-stride case
2026-03-17 11:10:32 +01:00
Martin Kroeker 66063d123a Merge pull request #5679 from martin-frbg/issue5678
Add Jasper Lake Celeron N5105 and allow default fallback to Nehalem
2026-03-16 23:43:22 +01:00
Chip Kerchner f927b9448a Global optimizations. 2026-03-16 21:32:17 +00:00
teddygood 86d1451cbe Add WebAssembly SIMD GEMM kernels 2026-03-17 05:51:54 +09:00
Martin Kroeker 99c6a74e7b Add Jasper Lake Celeron N5105 and allow default fallback to Nehalem 2026-03-16 18:33:31 +01:00
Chip Kerchner 010f24f961 Better K. 2026-03-16 13:22:31 +00:00
Martin Kroeker ddfbc6499b Merge pull request #5676 from martin-frbg/wasm_arch
Move the WebAssembly/Emscripten support to its own architecture and target
2026-03-16 13:52:23 +01:00
Martin Kroeker f2a89889a4 make some arrays static to fix memory requirement issues 2026-03-16 09:32:56 +01:00
daichengrong aa967ef6ba Optimize ZROT_RVV for the non-unit-stride case
Optimize the RVV implementation of ZROT when inc_x and inc_y are
non-unit strides (inc_x != 1, inc_y != 1).

Reorder several operations to reduce vector register pressure and
avoid unnecessary vector register spill to the stack. This helps GCC
keep vector values in registers and reduces redundant spill/reload
instructions, improving runtime performance.

No functional change.

Signed-off-by: daichengrong <daichengrong@iscas.ac.cn>
2026-03-16 14:22:54 +08:00
Martin Kroeker 4a888bcb73 set USE_TRMM for WASM 2026-03-15 23:07:16 +01:00
Martin Kroeker 9a00d4859c Add Makefile.wasm 2026-03-15 19:51:42 +01:00
Martin Kroeker 460f5e8c0b Add the new WebAssembly target WASM128_GENERIC 2026-03-15 19:43:48 +01:00
Martin Kroeker 705a5f2523 Reuse parameters of RISCV64_GENERIC for WASM128_GENERIC 2026-03-15 19:41:33 +01:00
Martin Kroeker 6ed4cc9c86 Add WebAssembly/Emscripten as a dedicated architecute and target 2026-03-15 19:40:14 +01:00
Martin Kroeker 319343a5fd Report WebAssembly/Emscripten as a dedicated architecture 2026-03-15 19:38:49 +01:00
Martin Kroeker ea7d134aec Add wasm settings 2026-03-15 19:37:39 +01:00
Martin Kroeker 62944c9db0 Turn WebAssembly/Emscripten support into a dedicated architecture 2026-03-15 19:37:09 +01:00
Martin Kroeker 01270a94e8 Add WebAssembly as a separate architecture 2026-03-15 19:35:49 +01:00
Martin Kroeker f590468b69 Copy generic Makefile for wasm laswp 2026-03-15 19:34:25 +01:00
Martin Kroeker cd47770092 Add support for WebAssembly architecture "wasm" 2026-03-15 19:31:51 +01:00
Martin Kroeker ef3315527f Don't include the CPUID code in WebAssembly builds 2026-03-15 19:30:13 +01:00
Martin Kroeker 48f0a0f0ec Generate WASM kernel including existing intrinsics-based kernels 2026-03-15 19:28:08 +01:00
Martin Kroeker cc64ce68c3 Create generic C KERNEL as baseline for WASM 2026-03-15 19:26:42 +01:00
Martin Kroeker 450af57a68 Merge pull request #5675 from martin-frbg/fixctestc
Fix function signatures and minor compiler warnings in the CBLAS tests
2026-03-15 18:54:04 +01:00
Martin Kroeker 86ccbe8fea Fix function signatures and minor compiler warnings 2026-03-15 02:09:22 +01:00
Chip Kerchner b0ee407943 Preserve K. 2026-03-14 17:46:42 +00:00
Chip Kerchner eb9bbcc299 Common unroll code. 2026-03-14 16:38:12 +00:00
Chip Kerchner fda433f25a Unroll K for N less than or equal to 4. 2026-03-13 22:17:47 +00:00
Chip Kerchner 9c16449dfd Add K-unrolling to M = 8. Other small changes. 2026-03-13 15:59:29 +00:00
Chip Kerchner 6d6af1dee5 Add bool types for C. 2026-03-12 13:13:34 +00:00
Chip Kerchner 376d3a138f Fast performing edges for FP32 GEMM of RVV. 2026-03-12 12:33:25 +00:00
Martin Kroeker b95729f5b0 Merge pull request #5672 from martin-frbg/nvidia_nv3
Add support for NeoverseV3 derivatives as NEOVERSEV2
2026-03-12 02:31:10 +01:00
Martin Kroeker fdc04c0e34 Merge pull request #5673 from martin-frbg/fixup-5671
remove inadvertently committed printf from PR 5671
2026-03-11 22:13:21 +01:00
Martin Kroeker f881af5bdf remove inadvertently committed printf 2026-03-11 22:10:18 +01:00
Chip Kerchner 548a9f3eaa Merge remote-tracking branch 'origin/develop' into HEAD 2026-03-11 21:07:28 +00:00
Martin Kroeker bc69f86dba Merge pull request #5671 from martin-frbg/cpuid_x86_cache
Update x86 cache size decoding table from current sandpile.org data
2026-03-11 11:34:44 +01:00
Martin Kroeker 1ff3a1a13d Merge pull request #5670 from amritahs-ibm/handle_fp16_power
powerpc: Bypass FP16 as BF16 on Power
2026-03-11 09:32:31 +01:00
Martin Kroeker 5b1729eb6d Support NeoverseV3 derivatives from NVIDIA Jetson boards as NEOVERSEV2 2026-03-10 22:34:45 +01:00
Martin Kroeker ee70631c4d Add Neoverse V3AE CPUID from NVIDIA Jetson AGX Thor 2026-03-10 22:32:44 +01:00
Martin Kroeker 02f5f620de Update cache size decoding table with sandpile.org data 2026-03-10 22:25:48 +01:00
Amrita H S 1a708bac8a powerpc: Bypass FP16 as BF16 on Power
typedef FP16 as BF16 on Power as FP16 is
not yet supported
2026-03-08 23:32:42 -05:00
Martin Kroeker 55b16e5923 Merge pull request #5643 from martin-frbg/neov2_param
Fix SGEMM returning wrong results in multithreading on NeoverseV2
2026-03-06 11:51:08 +01:00
Martin Kroeker 37262654d9 Merge pull request #5667 from fadara01/accelerate_sve128_sbgemm
Accelerate SVE128 SBGEMM/BGEMM
2026-03-06 09:14:44 +01:00
Martin Kroeker 75e2f12dae Merge pull request #5668 from martin-frbg/issue5665
Fix CMake DYNAMIC_ARCH compilation with old compilers on ARM64
2026-03-05 20:40:48 +01:00
Martin Kroeker d073702cdf Merge pull request #5661 from martin-frbg/update_readme_java
Fix leftover wiki links in the README and add java insights from issue #5109
2026-03-05 18:30:33 +01:00
Martin Kroeker 78fd789da0 Add compiler test for SVE support 2026-03-05 17:35:15 +01:00
Fadi Arafeh f30202b705 Accelerate SVE128 SBGEMM/BGEMM
This accelerates SBGEMM/BGEMM by extending the existing 8x4 kernel to 8x8 (unrolling N by 8)

Not sure if it's a good idea to delete the previous 8x4 kernel?

Here are the speedups on single core Neoverse-V2 (SVE128) compared to prev state:

Per-shape speedup
  M=N=K=64: SBGEMM 1.164x (16.42%), BGEMM 1.133x (13.30%)
  M=N=K=128: SBGEMM 1.220x (22.02%), BGEMM 1.186x (18.56%)
  M=N=K=256: SBGEMM 1.241x (24.08%), BGEMM 1.235x (23.54%)
  M=N=K=512: SBGEMM 1.240x (23.95%), BGEMM 1.227x (22.75%)
  M=N=K=1024: SBGEMM 1.251x (25.11%), BGEMM 1.232x (23.23%)
  M=N=K=2048: SBGEMM 1.235x (23.47%), BGEMM 1.246x (24.64%)

Signed-off-by: Fadi Arafeh <fadi.arafeh@arm.com>
2026-03-05 13:50:07 +00:00
Martin Kroeker 22fc689fa7 Merge pull request #5666 from martin-frbg/issue5664
Improve processing of linker arguments in f_check
2026-03-05 14:19:43 +01:00
Martin Kroeker 91eb0a638c Avoid splitting linker args on dashes not preceded by a space 2026-03-05 10:09:29 +01:00
Martin Kroeker 1590d8baf0 fix install.md link for cortex-m 2026-03-04 23:12:33 +01:00
Martin Kroeker 98864c7c6f fix reintroduced typo again 2026-03-04 20:40:45 +01:00
Martin Kroeker db6bbc7150 Merge pull request #5660 from martin-frbg/issue5658
Rewrite the Haswell SROT/DROT kernel tail loop with AVX2 to get consistent FMA rounding
2026-03-04 18:15:34 +01:00
Martin Kroeker ecdabf9d74 Merge pull request #5663 from martin-frbg/issue5662
Move the early exit in ?GESV for NRHS=0 after the GETRF call
2026-03-04 16:14:06 +01:00
Martin Kroeker dc8b16c57c Move the early exit for NRHS=0 after the GETRF call 2026-03-04 12:21:27 +01:00
Martin Kroeker 754ad2ad4f Fix leftover wiki links and add java insights from issue 5109 2026-03-04 11:44:36 +01:00
Martin Kroeker 3166fffcec Merge pull request #5659 from lindsayad/handle-emerald-rapids
Handle Intel's emerald rapids and do some formatting in the cpuid_x86 file
2026-03-03 20:06:49 +01:00
Martin Kroeker df29cc0205 Use AVX2 in the tail loop too for consistent FMA rounding 2026-03-03 15:51:51 +01:00
Alex Lindsay 692023e364 Switch case ordering for exmodel 12 to be sorted 2026-03-02 16:23:38 -07:00
Alex Lindsay 5a534a63e8 clang-format and make cpuid_x86.c more readable 2026-03-02 15:51:46 -07:00
Alex Lindsay 303903e29c Handle emerald rapids model 2026-03-02 15:39:41 -07:00
Martin Kroeker 18638c70ef Merge pull request #5656 from martin-frbg/issue5653
Add pragma to limit optimization in POWER10 DGEMV kernel
2026-02-22 15:54:59 +01:00
Martin Kroeker ef27ec6bed Add pragma to limit optimization level 2026-02-22 13:42:41 +01:00
Martin Kroeker da0e066c9e Merge pull request #5655 from martin-frbg/intel-default-cpuid
Add feature-based fallbacks for unknown/future Intel CPUIDs
2026-02-20 22:19:25 +01:00
Martin Kroeker 1d0ca19457 Add feature-based fallbacks for unknown/future Intel cpus 2026-02-20 16:45:08 +01:00
Martin Kroeker 30cf14c548 Merge pull request #5640 from ChipKerchner/RVV_Narrow_Accumulate_FP16_GEMM
Added ability to accumulate in FP16.  Convert BF16 to FP32.  For FP16 and BF16 GEMM in RISC-V (BF16 now works for pre-RVA23)
2026-02-20 14:22:27 +01:00
Martin Kroeker b4db4a1713 Merge pull request #5654 from martin-frbg/issue5627-2
Use generic SCAL kernels for PPC970 running FreeBSD
2026-02-20 12:45:42 +01:00
Martin Kroeker 43728ade59 Merge pull request #5651 from martin-frbg/issue5650
Fix gmake build with only a subset of precision types
2026-02-20 08:02:50 +01:00
Martin Kroeker 46b963b9a0 Use generic C kernels for SCAL on FreeBSD 2026-02-19 22:46:03 +01:00
Martin Kroeker 822aae6cab Merge pull request #5652 from martin-frbg/issue5649
Fix passing of C/ZDOTC results in C-converted LAPACK  on non-Windows systems
2026-02-19 22:05:10 +01:00
Martin Kroeker dccbf18c1f fix storing of ZDOTC result on non-Windows 2026-02-19 19:45:20 +01:00
Martin Kroeker 0cfb587fde fix storing of ZDOTU result on non-Windows 2026-02-19 18:46:20 +01:00
Martin Kroeker 92fcffff54 fix storing of CDOTC result on non-Windows 2026-02-19 18:45:07 +01:00
Martin Kroeker 5a07c1b61c Delete misplaced lapack-netlib/chpgst.c 2026-02-19 18:42:30 +01:00
Martin Kroeker 11986454b3 fix storing of CDOTU result on non-Windows 2026-02-19 18:05:59 +01:00
Martin Kroeker 946a2cffec fix storing of CDOTC result on non-Windows 2026-02-19 16:53:18 +01:00
Martin Kroeker ef1c06f5eb fix storing of CDOTC result on non-Windows 2026-02-19 14:08:59 +01:00
Martin Kroeker b7542ffb3d fix storing of CDOTC result on non-Windows 2026-02-19 13:34:48 +01:00
Martin Kroeker 5d29f88fed fix storing of CDOTC result on non-Windows 2026-02-19 13:18:20 +01:00
Martin Kroeker 61db4e8191 fix storing of CDOTC result on non-Windows 2026-02-19 13:07:15 +01:00
Martin Kroeker bf0d7eaacc fix storing of CDOTC result on non-Windows 2026-02-19 12:59:46 +01:00
Martin Kroeker 1da181dac6 fix storing of CDOTC result on non-Windows 2026-02-19 12:05:27 +01:00
Martin Kroeker 4389e1de70 fix storing of CDOTC result on non-Windows 2026-02-19 11:49:15 +01:00
Martin Kroeker 1defad49b6 fix storing of CDOTC result on non-Windows 2026-02-19 11:29:18 +01:00
Martin Kroeker be4ddc752f fix storing of CDOTC result on non-Windows systems 2026-02-19 10:56:27 +01:00
Martin Kroeker 7fe8bd8046 build comparison functions for complex cases too 2026-02-18 19:12:35 +01:00
Martin Kroeker 7d431f3bb0 fix conditional build for double and complex too 2026-02-18 19:10:53 +01:00
Martin Kroeker 0e28b427f3 Add slaed3/dlaed3 to complex builds 2026-02-18 19:09:36 +01:00
Martin Kroeker 92b4d1b6f3 make SLAED/DLAED definitions available to COMPLEX too 2026-02-18 19:06:17 +01:00
Martin Kroeker 7d7a6c6708 Build the comparison functions as needed to avoid missing references 2026-02-18 11:43:43 +01:00
Martin Kroeker d0a6e36896 Fix rules for running the GEMM3M tests 2026-02-18 11:41:25 +01:00
Martin Kroeker 6e3fb2ce52 fix conditional build rule 2026-02-18 11:40:20 +01:00
Chip Kerchner efe63e7970 Add pre-RVA23 to BF16 GEMM. 2026-02-15 15:49:59 +00:00
Martin Kroeker 1ef6319990 Merge pull request #5645 from martin-frbg/cortex925-cpuid
Add CPU autodetection for Arm Cortex X925/A725
2026-02-14 20:07:24 +01:00
Chip Kerchner 1d6aa0dc31 Add dummy memsets - just in case. 2026-02-13 20:03:35 +00:00
Chip Kerchner 7a1d23400f Add flag for not converting A & B - will be used in future to do conversion during packing. 2026-02-13 19:00:41 +00:00
Chip Kerchner 1cc377ef61 Only convert B if M is greater or equal to 4. 2026-02-13 18:14:11 +00:00
Chip Kerchner 0acb60aab3 Conversion from BF16 to FP32 only once. 2026-02-13 17:55:15 +00:00
Chip Kerchner 9701a80a9f One small change. 2026-02-12 20:35:41 +00:00
Chip Kerchner 4121a22c02 Convert BF16 values once (and vectorized). 2026-02-12 18:45:39 +00:00
Martin Kroeker 1690982cf1 Merge pull request #5644 from martin-frbg/issue5641
Work around llvm failing to compile the AVX512 sgemm kernel
2026-02-12 18:04:36 +01:00
Martin Kroeker 5613deb794 Merge pull request #5646 from mattip/azure-timeout
use 100 minute timeout for azure mingw32 job
2026-02-12 16:19:37 +01:00
Martin Kroeker ea82d802e6 fix typo 2026-02-12 15:55:55 +01:00
mattip e5ba61c344 use 100 minute timeout for azure mingw32 job 2026-02-12 12:09:59 +02:00
Martin Kroeker 387be46c42 Support Cortex X925 as NeoverseV2 2026-02-12 00:43:52 +01:00
Martin Kroeker 445b11148f work around llvm failing to compile the AVX512 sgemm kernel 2026-02-12 00:10:26 +01:00
Martin Kroeker db00d5c2c9 Fix SGEMM returning wrong results in multithreading on NeoverseV2 2026-02-12 00:02:13 +01:00
Chip Kerchner 33560437f5 Convert inputs from BF16 to FP32 and use FP32 vector madds. 18% faster. 2026-02-11 19:50:48 +00:00
Chip Kerchner e3cb067bf4 Fixed MADD to use float16 values. Use LMUL = 2 in main loop. Now 1.85X faster on BananaPi. 2026-02-11 00:27:27 +00:00
Chip Kerchner 74d9fe2832 Forget to add defintion. 2026-02-10 19:00:26 +00:00
Chip Kerchner aa1cebd45b 128-bit versions. 2026-02-10 18:30:02 +00:00
Chip Kerchner b5f2a50fe9 Added ability to accumulate in FP16 for GEMM. Widens once at the end of loops. 2026-02-10 17:30:05 +00:00
Chip Kerchner 7da983ebac Merge remote-tracking branch 'origin/develop' into develop 2026-02-10 17:27:51 +00:00
Martin Kroeker 986ba29493 Merge pull request #5637 from gula00/fix-typo
docs: fix minor spelling typos
2026-02-09 09:07:03 +01:00
Qingyu Li 37f7a2e00c docs: fix minor spelling typos 2026-02-09 08:25:31 +08:00
Martin Kroeker 08381cd2f0 Merge pull request #5636 from martin-frbg/arrowhu
Add CPUID identification for Intel Arrow Lake H/U
2026-02-08 17:44:11 +01:00
Martin Kroeker 35e8eeaad3 Merge pull request #5633 from cho-m/makefile-flangnew-macos
build: fix Makefile build with LLVM flang on macOS
2026-02-08 15:18:31 +01:00
Chip Kerchner 720654ace1 Merge remote-tracking branch 'origin/develop' into develop 2026-02-06 13:20:24 +00:00
Matti Picus ea44d63ad7 copy exports.h to palack-netlib/LAPACKE/include 2026-02-06 17:44:38 +11:00
Martin Kroeker 0ae18524cd Add Arrow Lake H/U 2026-02-05 20:18:46 +01:00
Matti Picus a5eeb2bb08 move cflag modification in Makefile and fixup lapack c compilation 2026-02-05 21:24:33 +11:00
Martin Kroeker 20699b1812 Merge pull request #5634 from yuanjia111/develop
Fix: Remove invalid parentheses after endif
2026-02-05 08:39:46 +01:00
Matti Picus fc243a36e8 cleanup, set '-fvisibility=hidden' flag 2026-02-05 06:31:18 +11:00
Matti Picus 3c5cea0ca9 remove '-fvisibility=hidden' in cmake LAPACK_CFLAGS 2026-02-05 06:31:18 +11:00
mattip c4d1ab81c6 typo 2026-02-05 06:31:18 +11:00
mattip 5d13317c8f add another OPENBLAS_EXPORT 2026-02-05 06:31:18 +11:00
mattip d0c4d08637 fix position of OPENBLAS_EXPORT, decorate server_win32 function 2026-02-05 06:31:18 +11:00
mattip 1353767996 add OPENBLAS_EXPORT to cblas.h during build, remove for install 2026-02-05 06:31:17 +11:00
mattip da494a58da windows needs declaration to match definition 2026-02-05 06:31:17 +11:00
mattip b53e015473 only use '.hidden' on ELF 2026-02-05 06:31:17 +11:00
mattip 73f34751fd move defines to separate file for kernels/generic/lsame.c 2026-02-05 06:31:17 +11:00
mattip be7da1f111 add visibility=default to exported functions, visibility=hidden to most assembler 2026-02-05 06:31:17 +11:00
yuanjia 9e42e40884 Remove accidental file tream 2026-02-04 10:12:28 +08:00
yuanjia e955736005 Fix: Remove invalid parentheses after endif 2026-02-04 09:57:48 +08:00
Michael Cho 59da821b0d build: fix Makefile build with LLVM flang on macOS 2026-02-01 15:16:11 -05:00
Chip Kerchner cb4e4ce8bb Merge remote-tracking branch 'origin' into develop 2026-01-30 17:36:01 +00:00
Martin Kroeker 1a9cf8e291 Merge pull request #5631 from martin-frbg/issue5626n
Fix CMake/LLVM compilation issues seen under Windows-on-Arm
2026-01-30 10:17:46 +01:00
Martin Kroeker 27e35d639d Merge pull request #5630 from martin-frbg/pantherlake
Add Intel Panther Lake CPUID
2026-01-30 08:24:18 +01:00
Martin Kroeker 69d92490c1 move inclusion of sme_abi header into the conditional section 2026-01-29 22:24:00 +01:00
Martin Kroeker ebc3eaf80b Need strings.h for strncasecmp prototype 2026-01-29 22:21:46 +01:00
Martin Kroeker 0d6b7fe07b Fix gcc version check in absence of gcc compiler 2026-01-29 22:20:32 +01:00
Martin Kroeker 2ddcdafc0b Merge pull request #5628 from martin-frbg/issue5627
Fix stack address of flag parameter in (pre-POWER6) POWER ?SCAL kernels
2026-01-29 20:32:46 +01:00
Martin Kroeker 2ef9819803 Add Intel Panther Lake CPUID 2026-01-29 18:51:21 +01:00
Martin Kroeker 601bdde8ec fix stack location of dummy2 flag 2026-01-27 22:40:50 +01:00
Martin Kroeker d53d2b11a9 fix stack location of dummy2 flag 2026-01-27 22:39:37 +01:00
Martin Kroeker bc3b7e749a Merge pull request #5623 from martin-frbg/issue5366
Rename the DllMain copy used in static linking to OpenBLASDllMain
2026-01-23 22:48:53 +01:00
Martin Kroeker 80995622dd Rename the DllMain copy used in static linking to OpenBLASDllMain 2026-01-22 11:19:04 +01:00
Martin Kroeker dafb996425 Merge pull request #5621 from martin-frbg/woa_sum
Provide optimized ?SUM kernels for NeoverseN1 and related
2026-01-21 11:03:55 +01:00
Martin Kroeker b6aff4754a Merge pull request #5619 from lujiaweics/fix/serialize_parallelized_syrk_function_callers
Serialize accesses to parallelized syrk functions from multiple calle…
2026-01-20 23:28:18 +01:00
Martin Kroeker 861b3db733 Reuse ?SUM kernels from ThunderX2T99 2026-01-20 15:42:09 +01:00
Martin Kroeker 71261a7b3f Trivially derive optimized S/DSUM for existing SASUM/DASUM kernels 2026-01-20 15:38:50 +01:00
lujiaweics 1f3b81e562 Serialize accesses to parallelized syrk functions from multiple callers, like it was already done for GEMM in level3_thread.c and GEMM3M in level3_gemm3m_thread.c 2026-01-20 21:31:35 +08:00
Martin Kroeker 413e609f9c Merge pull request #5618 from vtjnash/jn/zdot_thunderx2t99-ICE
arm64: fix clang ICE on Windows for thunderx2t kernels
2026-01-20 14:02:30 +01:00
Martin Kroeker a10f535803 Merge pull request #5617 from martin-frbg/fix_apple_ranlib
CI, MacOS: fix missing ranlib with latest llvm
2026-01-20 14:02:07 +01:00
Martin Kroeker 2b4eaad2a0 try to make do without ranlib on OSX 2026-01-19 21:18:12 +01:00
Martin Kroeker 5ffbf38b41 Merge pull request #5616 from 7schroet/develop
Fix Intel OpenMP flag
2026-01-19 21:04:37 +01:00
Martin Kroeker 331b9ef11f Use llvm-ranlib in gmake/llvm builds on Mac 2026-01-19 18:10:58 +01:00
Jameson NashandClaude Opus 4.5 a18a4ee08a arm64: fix clang ICE on Windows for zdot_thunderx2t99.c
Guard .align directive to avoid internal compiler error on
AArch64 Windows with clang.

See: https://github.com/llvm/llvm-project/issues/149547
See: #5076

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 15:36:14 +00:00
Martin Kroeker 60d03c3600 fix missing ranlib 2026-01-19 15:40:58 +01:00
Martin Kroeker d5a5c7d319 Merge pull request #5598 from moluopro/develop
build: skip tests when building for iOS
2026-01-19 14:18:15 +01:00
Niclas Schroeter 3c9858cfa0 Fix Intel OpenMP flag 2026-01-19 11:53:27 +01:00
Martin Kroeker 14594773a0 Merge pull request #5615 from martin-frbg/issue5607
Fix building without multithreading or LAPACK
2026-01-19 00:35:33 +01:00
Martin Kroeker a8a2238848 Merge pull request #5611 from martin-frbg/issue5602
Fix too small DGEMM_R for some Loongson LA464 cpus
2026-01-18 23:26:11 +01:00
Martin Kroeker 8870cfc750 Merge pull request #5609 from eschnett/patch-2
Avoid integer overflow in dynamic_riscv64.c
2026-01-18 23:25:34 +01:00
Martin Kroeker d40e19ef41 Merge pull request #5606 from botantony/openblas_config-fix-arm-gcc-build
fix: don't use `_Float16` type on GCC 12
2026-01-18 23:24:51 +01:00
Martin Kroeker 566e315f4f Make test_post_fork_async depend on LAPACK as it uses getrf 2026-01-18 19:59:49 +01:00
Martin Kroeker 8742434212 Include thread callback replacement hook in singlethreaded builds as well 2026-01-18 19:55:40 +01:00
Martin Kroeker 8ea938f03a Merge pull request #5613 from al3xtjames/gemm-smp
Fix ARMV9SME/VORTEXM4 GEMM compilation with SMP disabled
2026-01-18 14:01:59 +01:00
Martin Kroeker 67c0675cf0 Merge branch 'OpenMathLib:develop' into issue5602 2026-01-18 13:50:02 +01:00
Martin Kroeker 01657b356f Merge pull request #5614 from martin-frbg/fixcirrusbsd
Cirrus CI: fix softlink for libgfortran on freebsd
2026-01-18 13:49:39 +01:00
Martin Kroeker 70ecde3e49 Merge pull request #5610 from OpenMathLib/release-0.3.0
Merge back from release 0.3.31 to develop to copy tag
2026-01-18 13:47:36 +01:00
Martin Kroeker 3628f35251 fix libgfortran link on freebsd 2026-01-18 12:55:55 +01:00
Alex James d2906e8787 Fix ARMV9SME/VORTEXM4 GEMM compilation with SMP disabled
gemm.c currently declares gotoblas_corename in SMP-enabled builds, but
the ARMV9SME and VORTEXM4 targets call gotoblas_corename even when SMP
is disabled. Fix compilation of the ARMV9SME and VORTEXM4 targets with
SMP disabled by unconditionally declaring gotoblas_corename for
DYNAMIC_ARCH builds.
2026-01-17 22:03:29 -08:00
Martin Kroeker f298361f98 Document size restriction on GEMM_R 2026-01-17 20:58:49 +01:00
Martin Kroeker 4001d7a74f Increase LA464/16MB DGEMM_R for minimal spacing of 64 to MAX(p,q) 2026-01-17 20:53:51 +01:00
Erik Schnetter 55e853a698 Avoid integer overflow in dynamic_riscv64.c
Closes https://github.com/OpenMathLib/OpenBLAS/issues/5608.
2026-01-16 10:36:53 -05:00
botantony c077708852 fix: don't use _Float16 type on GCC 12
`_Float16` is not supported by GCC 12 on Arm64 architectures:
https://godbolt.org/z/nKbrjPTvG

Related to:
https://github.com/Homebrew/homebrew-core/pull/263008
https://github.com/Homebrew/homebrew-core/pull/263009

Signed-off-by: botantony <antonsm21@gmail.com>
2026-01-16 03:04:13 +01:00
Martin Kroeker 45e9820118 Update version to 0.3.31.dev 2026-01-16 00:09:51 +01:00
Martin Kroeker f8a9c067d8 Update version to 0.3.31.dev 2026-01-16 00:09:15 +01:00
moluopro a3af4cadcc build: skip tests when building for iOS 2026-01-11 20:16:42 +08:00
Jameson NashandClaude Opus 4.5 4026d7ba7c Fix LIBNAMESUFFIX handling in CMake and update documentation
- Fix cmake/system.cmake: LIBPREFIX was incorrectly overwritten when
  LIBNAMESUFFIX was defined, losing both "lib" prefix and "openblas"
- Fix Makefile.rule docs: typo used LIBNAMESUFFIX instead of LIBNAMEPREFIX
- Fix Makefile.rule docs: removed misleading underscores from examples
- Fix docs/build_system.md: removed incorrect claim about automatic
  underscore separator

The implementation does not add an underscore before the suffix - users
who want a separator should include it in their LIBNAMESUFFIX value
(e.g., LIBNAMESUFFIX=_omp).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 13:33:59 -05:00
Jameson Nash 1607a49cb9 build: fix rule for building dynamic files
Previously the architecture-specific dynamic files were relying on the
built-in rules alone.
2025-12-11 15:11:40 -05:00
Jameson NashandClaude Opus 4.5 7414e363f0 Add $(EXE) suffix to executables in Makefiles
Define EXE variable in Makefile.system (set to .exe on Windows,
empty otherwise) and update all test executables to use it for
Windows compatibility.

- Makefile.system: Add EXE variable definition
- test/Makefile: Update all executables with $(EXE) suffix
- ctest/Makefile: Update all executables with $(EXE) suffix
- utest/Makefile: Update UTESTBIN and UTESTEXTBIN with $(EXE) suffix
- Makefile.install: Update install_tests target with $(EXE) suffix
- .gitignore: Add *.exe pattern

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 14:49:34 -05:00
1052 changed files with 99648 additions and 35085 deletions
+122 -119
View File
@@ -1,6 +1,6 @@
macos_instance:
image: ghcr.io/cirruslabs/macos-monterey-xcode:latest
#macos_instance:
# image: ghcr.io/cirruslabs/macos-monterey-xcode:latest
#
#task:
# name: AppleM1/LLVM
# compile_script:
@@ -9,7 +9,7 @@ macos_instance:
# - export LDFLAGS="-L/opt/homebrew/opt/llvm/lib"
# - export CPPFLAGS="-I/opt/homebrew/opt/llvm/include"
# - make TARGET=VORTEX USE_OPENMP=1 CC=clang
#
#task:
# name: AppleM1/LLVM/ILP64
# compile_script:
@@ -18,7 +18,7 @@ macos_instance:
# - export LDFLAGS="-L/opt/homebrew/opt/llvm/lib"
# - export CPPFLAGS="-I/opt/homebrew/opt/llvm/include"
# - make TARGET=VORTEX USE_OPENMP=1 CC=clang INTERFACE64=1
#
#task:
# name: AppleM1/LLVM/CMAKE
# compile_script:
@@ -30,7 +30,7 @@ macos_instance:
# - cd build
# - cmake -DTARGET=VORTEX -DCMAKE_C_COMPILER=clang -DBUILD_SHARED_LIBS=ON ..
# - make -j 4
#
#task:
# name: AppleM1/GCC/MAKE/OPENMP
# compile_script:
@@ -39,122 +39,125 @@ macos_instance:
# - export LDFLAGS="-L/opt/homebrew/lib"
# - export CPPFLAGS="-I/opt/homebrew/include"
# - make CC=gcc-11 FC=gfortran-11 USE_OPENMP=1
macos_instance:
image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest
task:
name: AppleM1/LLVM x86_64 xbuild
compile_script:
- #brew install llvm
- export #PATH=/opt/homebrew/opt/llvm/bin:$PATH
- export #LDFLAGS="-L/opt/homebrew/opt/llvm/lib"
- export #CPPFLAGS="-I/opt/homebrew/opt/llvm/include"
- export ARCHS="i386 x86_64"
- export ARCHS_STANDARD="i386 x86_64"
- export ARCHS_STANDARD_32_64_BIT="i386 x86_64"
- export ARCHS_STANDARD_64_BIT=x86_64
- export ARCHS_STANDARD_INCLUDING_64_BIT="i386 x86_64"
- export ARCHS_UNIVERSAL_IPHONE_OS="i386 x86_64"
- export VALID_ARCHS="i386 x86_64"
- xcrun --sdk macosx --show-sdk-path
- xcodebuild -version
- export CC=/Applications/Xcode_26.0.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
- export CFLAGS="-O2 -unwindlib=none -Wno-macro-redefined -isysroot /Applications/Xcode_26.0.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk -arch x86_64"
- make TARGET=CORE2 DYNAMIC_ARCH=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1 RANLIB="ls -l"
always:
config_artifacts:
path: "*conf*"
type: text/plain
#
#macos_instance:
# image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest
#task:
# name: AppleM1/LLVM x86_64 xbuild
# compile_script:
# - #brew install llvm
# - export #PATH=/opt/homebrew/opt/llvm/bin:$PATH
# - export #LDFLAGS="-L/opt/homebrew/opt/llvm/lib"
# - export #CPPFLAGS="-I/opt/homebrew/opt/llvm/include"
# - export ARCHS="i386 x86_64"
# - export ARCHS_STANDARD="i386 x86_64"
# - export ARCHS_STANDARD_32_64_BIT="i386 x86_64"
# - export ARCHS_STANDARD_64_BIT=x86_64
# - export ARCHS_STANDARD_INCLUDING_64_BIT="i386 x86_64"
# - export ARCHS_UNIVERSAL_IPHONE_OS="i386 x86_64"
# - export VALID_ARCHS="i386 x86_64"
# - xcrun --sdk macosx --show-sdk-path
# - xcodebuild -version
# - export CC=/Applications/Xcode_26.0.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
# - export CFLAGS="-O2 -unwindlib=none -Wno-macro-redefined -isysroot /Applications/Xcode_26.0.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk -arch x86_64"
# - make TARGET=CORE2 DYNAMIC_ARCH=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1 RANLIB="ls -l"
# always:
# config_artifacts:
# path: "*conf*"
# type: text/plain
# lib_artifacts:
# path: "libopenblas*"
# type: application/octet-streamm
macos_instance:
image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest
task:
name: AppleM1/LLVM armv8-ios xbuild
compile_script:
- #brew install llvm
- export #PATH=/opt/homebrew/opt/llvm/bin:$PATH
- export #LDFLAGS="-L/opt/homebrew/opt/llvm/lib"
- export #CPPFLAGS="-I/opt/homebrew/opt/llvm/include"
- export CC=/Applications/Xcode_26.0.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
- export CFLAGS="-O2 -unwindlib=none -Wno-macro-redefined -isysroot /Applications/Xcode_26.0.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS26.0.sdk -arch arm64 -miphoneos-version-min=10.0"
- xcrun --sdk iphoneos --show-sdk-path
- ls -l /Applications
- make TARGET=ARMV8 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1 CROSS=1
always:
config_artifacts:
path: "*conf*"
type: text/plain
macos_instance:
image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest
task:
name: AppleM1/LLVM armv7-androidndk xbuild
compile_script:
- brew install --cask android-ndk
- export ANDROID_NDK_HOME="/opt/homebrew/share/android-ndk"
- export CC=/opt/homebrew/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi23-clang
- make TARGET=ARMV7 ARM_SOFTFP_ABI=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1 RANLIB="ls -l"
always:
config_artifacts:
path: "*conf*"
type: text/plain
task:
name: NeoverseN1
arm_container:
image: node:latest
compile_script:
- make
task:
name: NeoverseN1-ILP64
arm_container:
image: node:latest
compile_script:
- make INTERFACE64=1
task:
name: NeoverseN1-OMP
arm_container:
image: node:latest
cpu: 8
compile_script:
- make USE_OPENMP=1
FreeBSD_task:
name: FreeBSD-gcc
freebsd_instance:
image_family: freebsd-14-3
install_script:
- pkg update -f && pkg upgrade -y && pkg install -y gmake gcc
compile_script:
- ls -l /usr/local/lib
- gmake CC=gcc
FreeBSD_task:
name: freebsd-gcc-ilp64
freebsd_instance:
image_family: freebsd-14-3
install_script:
- pkg update -f && pkg upgrade -y && pkg install -y gmake gcc
compile_script:
- ls -l /usr/local/lib
- gmake CC=gcc INTERFACE64=1
FreeBSD_task:
name: FreeBSD-clang-openmp
freebsd_instance:
image_family: freebsd-14-3
install_script:
- pkg update -f && pkg upgrade -y && pkg install -y gmake gcc
- ln -s /usr/local/lib/gcc13/libgfortran.so.5.0.0 /usr/lib/libgfortran.so
compile_script:
- gmake CC=clang FC=gfortran USE_OPENMP=1 CPP_THREAD_SAFETY_TEST=1
#
#macos_instance:
# image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest
#task:
# name: AppleM1/LLVM armv8-ios xbuild
# compile_script:
# - #brew install llvm
# - export #PATH=/opt/homebrew/opt/llvm/bin:$PATH
# - export #LDFLAGS="-L/opt/homebrew/opt/llvm/lib"
# - export #CPPFLAGS="-I/opt/homebrew/opt/llvm/include"
# - export CC=/Applications/Xcode_26.0.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
# - export CFLAGS="-O2 -unwindlib=none -Wno-macro-redefined -isysroot /Applications/Xcode_26.0.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS26.0.sdk -arch arm64 -miphoneos-version-min=10.0"
# - xcrun --sdk iphoneos --show-sdk-path
# - ls -l /Applications
# - make TARGET=ARMV8 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1 CROSS=1
# always:
# config_artifacts:
# path: "*conf*"
# type: text/plain
#
#macos_instance:
# image: ghcr.io/cirruslabs/macos-tahoe-xcode:latest
#task:
# name: AppleM1/LLVM armv7-androidndk xbuild
# compile_script:
# - brew install --cask android-ndk
# - export ANDROID_NDK_HOME="/opt/homebrew/share/android-ndk"
# - export CC=/opt/homebrew/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi23-clang
# - export AR=/opt/homebrew/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar
# - export RANLIB=/opt/homebrew/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib
# - make TARGET=ARMV7 ARM_SOFTFP_ABI=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1
# always:
# config_artifacts:
# path: "*conf*"
# type: text/plain
#
#task:
# name: NeoverseN1
# arm_container:
# image: node:latest
# compile_script:
# - make
#
# task:
# name: NeoverseN1-ILP64
# arm_container:
# image: node:latest
# compile_script:
# - make INTERFACE64=1
#
#task:
# name: NeoverseN1-OMP
# arm_container:
# image: node:latest
# cpu: 8
# compile_script:
# - make USE_OPENMP=1
#
#
#FreeBSD_task:
# name: FreeBSD-gcc
# freebsd_instance:
# image_family: freebsd-14-3
# install_script:
# - pkg update -f && pkg upgrade -y && pkg install -y gmake gcc
# compile_script:
# - ls -l /usr/local/lib
# - gmake CC=gcc
#
#
#FreeBSD_task:
# name: freebsd-gcc-ilp64
# freebsd_instance:
# image_family: freebsd-14-3
# install_script:
# - pkg update -f && pkg upgrade -y && pkg install -y gmake gcc
# compile_script:
# - ls -l /usr/local/lib
# - gmake CC=gcc INTERFACE64=1
#
#FreeBSD_task:
# name: FreeBSD-clang-openmp
# freebsd_instance:
# image_family: freebsd-14-3
# install_script:
# - pkg update -f && pkg upgrade -y && pkg install -y gmake gcc
# - ln -s /usr/local/lib/gcc14/libgfortran.so.5.0.0 /usr/lib/libgfortran.so
# compile_script:
# - gmake CC=clang FC=gfortran USE_OPENMP=1 CPP_THREAD_SAFETY_TEST=1
#
#task:
# name: Windows/LLVM16 --- too slow ---
# windows_container:
+151 -4
View File
@@ -1,6 +1,14 @@
name: apple m
on: [push, pull_request]
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -10,7 +18,7 @@ permissions:
contents: read # to fetch code (actions/checkout)
jobs:
build:
build-windows:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: macos-14
@@ -24,7 +32,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: Print system information
run: |
@@ -52,7 +60,7 @@ jobs:
fi
- name: Compilation cache
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.ccache
# We include the commit sha in the cache key, as new cache entries are
@@ -99,6 +107,7 @@ jobs:
run: |
export CPPFLAGS="-I/opt/homebrew/opt/llvm/include"
export CC="/opt/homebrew/opt/llvm/bin/clang"
export RANLIB=llvm-ranlib
case "${{ matrix.build }}" in
"make")
make -j$(nproc) DYNAMIC_ARCH=1 USE_OPENMP=${{matrix.openmp}} INTERFACE64=${{matrix.ilp64}} FC="ccache ${{ matrix.fortran }}"
@@ -154,3 +163,141 @@ jobs:
exit 1
;;
esac
xbuild-x86_64:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: macos-26
strategy:
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Print system information
run: |
if [ "$RUNNER_OS" == "macOS" ]; then
sysctl -a | grep machdep.cpu
else
echo "::error::$RUNNER_OS not supported"
exit 1
fi
- name: Install Dependencies
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt-get install -y gfortran cmake ccache libtinfo5
elif [ "$RUNNER_OS" == "macOS" ]; then
# It looks like "gfortran" isn't working correctly unless "gcc" is re-installed.
brew reinstall gcc
brew install coreutils ccache
brew install llvm
else
echo "::error::$RUNNER_OS not supported"
exit 1
fi
- name: Crossbuild OpenBLAS to x86_64
run: |
#export PATH=/opt/homebrew/opt/llvm/bin:$PATH
#export LDFLAGS="-L/opt/homebrew/opt/llvm/lib"
#export CPPFLAGS="-I/opt/homebrew/opt/llvm/include"
export ARCHS="i386 x86_64"
export ARCHS_STANDARD="i386 x86_64"
export ARCHS_STANDARD_32_64_BIT="i386 x86_64"
export ARCHS_STANDARD_64_BIT=x86_64
export ARCHS_STANDARD_INCLUDING_64_BIT="i386 x86_64"
export ARCHS_UNIVERSAL_IPHONE_OS="i386 x86_64"
export VALID_ARCHS="i386 x86_64"
xcrun --sdk macosx --show-sdk-path
xcodebuild -version
export CC=/Applications/Xcode_26.0.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
export CFLAGS="-O2 -unwindlib=none -Wno-macro-redefined -isysroot /Applications/Xcode_26.0.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk -arch x86_64"
make TARGET=CORE2 DYNAMIC_ARCH=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1 RANLIB="ls -l"
xbuild-ios:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: macos-26
strategy:
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Print system information
run: |
if [ "$RUNNER_OS" == "macOS" ]; then
sysctl -a | grep machdep.cpu
else
echo "::error::$RUNNER_OS not supported"
exit 1
fi
- name: Install Dependencies
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt-get install -y gfortran cmake ccache libtinfo5
elif [ "$RUNNER_OS" == "macOS" ]; then
# It looks like "gfortran" isn't working correctly unless "gcc" is re-installed.
brew reinstall gcc
brew install coreutils ccache
brew install llvm
else
echo "::error::$RUNNER_OS not supported"
exit 1
fi
- name: Crossbuild to iOS
run: |
CC="$(xcrun --sdk iphoneos --find clang)"
SDKROOT="$(xcrun --sdk iphoneos --show-sdk-path)"
echo "CC=${CC}"
echo "SDKROOT=${SDKROOT}"
make TARGET=ARMV8 DYNAMIC_ARCH=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1 \
CC="${CC}" CFLAGS="-O2 -Wno-macro-redefined -isysroot ${SDKROOT} -arch arm64 -miphoneos-version-min=10.0"
xbuild-ios32:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: macos-26
strategy:
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Print system information
run: |
if [ "$RUNNER_OS" == "macOS" ]; then
sysctl -a | grep machdep.cpu
else
echo "::error::$RUNNER_OS not supported"
exit 1
fi
- name: Install Dependencies
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt-get install -y gfortran cmake ccache libtinfo5
elif [ "$RUNNER_OS" == "macOS" ]; then
# It looks like "gfortran" isn't working correctly unless "gcc" is re-installed.
brew reinstall gcc
brew install coreutils ccache
brew install llvm
brew install --cask android-ndk
else
echo "::error::$RUNNER_OS not supported"
exit 1
fi
- name: AppleM1/LLVM armv7-androidndk xbuild
run: |
export ANDROID_NDK_HOME="/opt/homebrew/share/android-ndk"
export CC=/opt/homebrew/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi23-clang
export AR=/opt/homebrew/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar
export RANLIB=/opt/homebrew/share/android-ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib
make TARGET=ARMV7 ARM_SOFTFP_ABI=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1
+8 -2
View File
@@ -5,10 +5,16 @@ on:
branches:
- develop
- release-**
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
branches:
- develop
- release-**
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -30,7 +36,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: Print system information
run: |
@@ -52,7 +58,7 @@ jobs:
fi
- name: Compilation cache
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.ccache
# We include the commit sha in the cache key, as new cache entries are
+20 -8
View File
@@ -1,6 +1,14 @@
name: c910v qemu test
on: [push, pull_request]
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -31,7 +39,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: install build deps
run: |
@@ -40,7 +48,7 @@ jobs:
gcc-${{ matrix.apt_triple }} gfortran-${{ matrix.apt_triple }} libgomp1-riscv64-cross libglib2.0-dev
- name: checkout qemu
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
repository: XUANTIE-RV/qemu
path: qemu
@@ -50,15 +58,18 @@ jobs:
run: |
# Force use c910v qemu-user
wget https://github.com/revyos/qemu/commit/222729c7455784dd855216d7a2bec4bd8f2a6800.patch
# Backport the upstream linux-user clone_lock fix
wget -O qemu-clone-lock.patch https://gitlab.com/qemu-project/qemu/-/commit/d22e9aec572396836782e993cb18d598e6012688.patch
cd qemu
patch -p1 < ../222729c7455784dd855216d7a2bec4bd8f2a6800.patch
patch -p1 < ../qemu-clone-lock.patch
export CXXFLAGS="-Wno-error"; export CFLAGS="-Wno-error"
./configure --prefix=$GITHUB_WORKSPACE/qemu-install --target-list=riscv64-linux-user --disable-system
make -j$(nproc)
make install
- name: Compilation cache
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.ccache
key: ccache-${{ runner.os }}-${{ matrix.target }}-${{ github.ref }}-${{ github.sha }}
@@ -85,8 +96,9 @@ jobs:
run: |
run_with_retry() {
local cmd="$1"
local time_out=10
local retries=10
local time_out="${2:-10}"
local retries="${3:-10}"
local timeout_step="${4:-5}"
local attempt=0
for ((i=1; i<=retries; i++)); do
@@ -98,7 +110,7 @@ jobs:
local exit_code=$?
if [ $exit_code -eq 140 ]; then
echo "Attempt $i timed out (retrying...)"
time_out=$((time_out + 5))
time_out=$((time_out + timeout_step))
else
echo "Attempt $i failed with exit code $exit_code. Aborting workflow."
exit $exit_code
@@ -113,7 +125,7 @@ jobs:
export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH
which qemu-riscv64
export QEMU_BIN=$(which qemu-riscv64)
run_with_retry "$QEMU_BIN ./utest/openblas_utest"
run_with_retry "$QEMU_BIN ./utest/openblas_utest" 120 2 30
run_with_retry "$QEMU_BIN ./utest/openblas_utest_ext"
OPENBLAS_NUM_THREADS=2 qemu-riscv64 ./ctest/xscblat1
+14 -5
View File
@@ -1,6 +1,14 @@
name: Run codspeed benchmarks
on: [push, pull_request]
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -21,8 +29,8 @@ jobs:
pyver: ["3.12"]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: ${{ matrix.pyver }}
@@ -43,7 +51,7 @@ jobs:
fi
- name: Compilation cache
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.ccache
# We include the commit sha in the cache key, as new cache entries are
@@ -147,8 +155,9 @@ jobs:
OPENBLAS_NUM_THREADS=1 pytest benchmarks/bench_blas.py -k 'gesdd'
- name: Run benchmarks
uses: CodSpeedHQ/action@v3
uses: CodSpeedHQ/action@v4
with:
mode: simulation
token: ${{ secrets.CODSPEED_TOKEN }}
run: |
cd benchmark/pybench
+10 -2
View File
@@ -4,9 +4,17 @@ on:
push:
branches:
- develop
paths:
- 'docs/**'
- 'mkdocs.yml'
- '.github/workflows/docs.yml'
pull_request:
branches:
- develop
paths:
- 'docs/**'
- 'mkdocs.yml'
- '.github/workflows/docs.yml'
jobs:
build:
@@ -14,11 +22,11 @@ jobs:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: actions/setup-python@v5
- uses: actions/setup-python@v6
with:
python-version: "3.10"
+349 -18
View File
@@ -1,6 +1,15 @@
name: continuous build
on: [push, pull_request, workflow_dispatch]
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -33,7 +42,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: Print system information
run: |
@@ -61,8 +70,8 @@ jobs:
sudo ./llvm.sh 21
fi
if [ "${{ matrix.fortran }}" == "flang" ]; then
wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_amd64.deb
sudo apt install ./libtinfo5_6.3-2ubuntu0.1_amd64.deb
wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.2_amd64.deb
sudo apt install ./libtinfo5_6.3-2ubuntu0.2_amd64.deb
else
sudo apt-get install -y ${{ matrix.fortran }}
fi
@@ -76,7 +85,7 @@ jobs:
fi
- name: Compilation cache
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.ccache
# We include the commit sha in the cache key, as new cache entries are
@@ -196,29 +205,29 @@ jobs:
- msystem: UCRT64
idx: int32
target-prefix: mingw-w64-ucrt-x86_64
fc-pkg: fc
fc-pkg: mingw-w64-ucrt-x86_64-fc
- msystem: MINGW32
idx: int32
target-prefix: mingw-w64-i686
fc-pkg: fc
fc-pkg:
- msystem: CLANG64
idx: int32
target-prefix: mingw-w64-clang-x86_64
fc-pkg: fc
fc-pkg: mingw-w64-clang-x86_64-fc
- msystem: UCRT64
idx: int64
idx64-flags: -DBINARY=64 -DINTERFACE64=1
target-prefix: mingw-w64-ucrt-x86_64
fc-pkg: fc
fc-pkg: mingw-w64-ucrt-x86_64-fc
- msystem: CLANG64
idx: int64
idx64-flags: -DBINARY=64 -DINTERFACE64=1
target-prefix: mingw-w64-clang-x86_64
fc-pkg: fc
fc-pkg: mingw-w64-clang-x86_64-fc
- msystem: UCRT64
idx: int32
target-prefix: mingw-w64-ucrt-x86_64
fc-pkg: fc
fc-pkg: mingw-w64-ucrt-x86_64-fc
build-type: None
exclude:
- msystem: MINGW32
@@ -247,13 +256,13 @@ jobs:
install: >-
base-devel
${{ matrix.target-prefix }}-cc
${{ matrix.target-prefix }}-${{ matrix.fc-pkg }}
${{ matrix.fc-pkg }}
${{ matrix.target-prefix }}-cmake
${{ matrix.target-prefix }}-ninja
${{ matrix.target-prefix }}-ccache
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: Prepare ccache
# Get cache location of ccache
@@ -266,7 +275,7 @@ jobs:
echo "key=ccache-msys2-${{ matrix.msystem }}-${{ matrix.idx }}-${{ matrix.build-type }}-${{ github.ref }}-${{ github.sha }}" >> $GITHUB_OUTPUT
- name: Restore ccache
uses: actions/cache/restore@v3
uses: actions/cache/restore@v5
with:
path: ${{ steps.ccache-prepare.outputs.ccachedir }}
key: ${{ steps.ccache-prepare.outputs.key }}
@@ -311,7 +320,7 @@ jobs:
- name: Save ccache
# Save the cache after we are done (successfully) building
uses: actions/cache/save@v3
uses: actions/cache/save@v5
with:
path: ${{ steps.ccache-prepare.outputs.ccachedir }}
key: ${{ steps.ccache-prepare.outputs.key }}
@@ -334,6 +343,277 @@ jobs:
echo "::endgroup::"
linux_thread_stress:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
name: ${{ matrix.check-name }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- backend: pthread
check-name: "linux_thread_stress (pthread)"
- backend: openmp
check-name: "linux_thread_stress (openmp)"
- backend: tsan
check-name: linux_thread_sanitizer
- backend: tsan-openmp
check-name: linux_thread_sanitizer_openmp
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Install Dependencies
run: |
cat << EOF | sudo tee -a /etc/apt/apt.conf.d/01norecommend
APT::Install-Recommends "0";
APT::Install-Suggests "0";
EOF
sudo apt-get update
sudo apt-get install -y ccache cmake ninja-build
case "${{ matrix.backend }}" in
tsan|tsan-openmp) sudo apt-get install -y clang llvm ;;
esac
if [ "${{ matrix.backend }}" = "tsan-openmp" ]; then
sudo apt-get install -y libomp-dev
fi
- name: Compilation cache
uses: actions/cache@v5
with:
path: ~/.ccache
key: ccache-${{ runner.os }}-thread-${{ matrix.backend }}-${{ github.ref }}-${{ github.sha }}
restore-keys: |
ccache-${{ runner.os }}-thread-${{ matrix.backend }}-${{ github.ref }}
ccache-${{ runner.os }}-thread-${{ matrix.backend }}
- name: Configure ccache
# Limit the maximum size and switch on compression to avoid exceeding the total disk or cache quota.
run: |
test -d ~/.ccache || mkdir -p ~/.ccache
echo "max_size = 250M" > ~/.ccache/ccache.conf
echo "compression = true" >> ~/.ccache/ccache.conf
ccache -s
- name: Configure OpenBLAS
run: |
mkdir build && cd build
build_type=Release
c_compiler=gcc
cxx_compiler=g++
dynamic_arch=ON
use_openmp=OFF
cpp_thread_safety_use_openmp=ON
dgemm_args="512;12;4"
dgemm_mixed_args="524288;16;20"
dgemv_args="512;12;4"
sanitizer_flags=
if [ "${{ matrix.backend }}" = "openmp" ]; then
use_openmp=ON
elif [ "${{ matrix.backend }}" = "tsan" ] || [ "${{ matrix.backend }}" = "tsan-openmp" ]; then
build_type=RelWithDebInfo
c_compiler=clang
cxx_compiler=clang++
dynamic_arch=OFF
cpp_thread_safety_use_openmp=OFF
dgemm_args="64;4;1"
dgemm_mixed_args="131072;8;10"
dgemv_args="64;4;1"
sanitizer_flags="-fsanitize=thread -g -O1 -fno-omit-frame-pointer"
if [ "${{ matrix.backend }}" = "tsan-openmp" ]; then
use_openmp=ON
cpp_thread_safety_use_openmp=ON
fi
fi
cmake_args=(
-G Ninja
"-DCMAKE_BUILD_TYPE=$build_type"
"-DCMAKE_C_COMPILER=$c_compiler"
"-DCMAKE_CXX_COMPILER=$cxx_compiler"
-DBUILD_SHARED_LIBS=ON
-DBUILD_STATIC_LIBS=OFF
-DBUILD_WITHOUT_LAPACK=ON
-DBUILD_SINGLE=OFF
-DBUILD_DOUBLE=ON
-DBUILD_COMPLEX=OFF
-DBUILD_COMPLEX16=OFF
"-DDYNAMIC_ARCH=$dynamic_arch"
-DNOFORTRAN=ON
-DUSE_THREAD=ON
"-DUSE_OPENMP=$use_openmp"
-DNUM_THREADS=32
-DNUM_PARALLEL=2
-DTARGET=CORE2
-DCPP_THREAD_SAFETY_TEST=ON
"-DCPP_THREAD_SAFETY_USE_OPENMP=$cpp_thread_safety_use_openmp"
"-DCPP_THREAD_SAFETY_DGEMM_ARGS=$dgemm_args"
"-DCPP_THREAD_SAFETY_DGEMM_MIXED_ARGS=$dgemm_mixed_args"
"-DCPP_THREAD_SAFETY_DGEMV_ARGS=$dgemv_args"
-DCMAKE_C_COMPILER_LAUNCHER=ccache
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
)
if [ "${{ matrix.backend }}" = "tsan" ] || [ "${{ matrix.backend }}" = "tsan-openmp" ]; then
cmake_args+=(
"-DCMAKE_C_FLAGS=$sanitizer_flags"
"-DCMAKE_CXX_FLAGS=$sanitizer_flags"
-DCMAKE_SHARED_LINKER_FLAGS=-fsanitize=thread
-DCMAKE_EXE_LINKER_FLAGS=-fsanitize=thread
)
fi
cmake "${cmake_args[@]}" ..
- name: Build OpenBLAS
run: |
cd build
cmake --build . --target dgemm_thread_safety dgemm_thread_safety_mixed dgemv_thread_safety
- name: Show ccache status
continue-on-error: true
run: ccache -s
- name: Run thread stress tests
timeout-minutes: 30
run: |
cd build
if [ "${{ matrix.backend }}" = "tsan" ] || [ "${{ matrix.backend }}" = "tsan-openmp" ]; then
export LLVM_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
export TSAN_OPTIONS=halt_on_error=1:exitcode=66:second_deadlock_stack=1
fi
if [ "${{ matrix.backend }}" = "tsan-openmp" ]; then
# Load Archer (the OMPT tool from Ubuntu's libomp-dev) so TSan
# understands libomp's barriers instead of flagging them as false positives. The OpenMP runtime will load this tool automatically if OMP_TOOL_LIBRARIES is set.
archer=$(clang -print-file-name=libarcher.so)
[ -f "$archer" ] || archer=$(find /usr/lib/llvm-* -name libarcher.so 2>/dev/null | head -1)
if [ ! -f "$archer" ]; then
echo "::error::libarcher.so not found (expected from libomp-dev)"
exit 1
fi
echo "Using distro Archer: $archer"
export OMP_TOOL_LIBRARIES="$archer"
export TSAN_OPTIONS="$TSAN_OPTIONS:ignore_noninstrumented_modules=1"
fi
if [ "${{ matrix.backend }}" != "tsan" ]; then
export OMP_NUM_THREADS=16
fi
export OPENBLAS_NUM_THREADS=8
ctest -R 'dgemm_thread_safety|dgemm_thread_safety_mixed|dgemv_thread_safety' --output-on-failure
msys2_thread_stress:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
env:
CHERE_INVOKING: 1
steps:
- name: Get CPU name
shell: pwsh
run : |
Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name
- name: Install build dependencies
uses: msys2/setup-msys2@v2
with:
msystem: UCRT64
update: true
release: false # Use pre-installed version
install: >-
base-devel
mingw-w64-ucrt-x86_64-cc
mingw-w64-ucrt-x86_64-cmake
mingw-w64-ucrt-x86_64-ninja
mingw-w64-ucrt-x86_64-ccache
- name: Checkout repository
uses: actions/checkout@v6
- name: Prepare ccache
# Get cache location of ccache
# Create key that is used in action/cache/restore and action/cache/save steps
id: ccache-prepare
run: |
echo "ccachedir=$(cygpath -m $(ccache -k cache_dir))" >> $GITHUB_OUTPUT
# We include the commit sha in the cache key, as new cache entries are
# only created if there is no existing entry for the key yet.
echo "key=ccache-msys2-thread-stress-${{ github.ref }}-${{ github.sha }}" >> $GITHUB_OUTPUT
- name: Restore ccache
uses: actions/cache/restore@v5
with:
path: ${{ steps.ccache-prepare.outputs.ccachedir }}
key: ${{ steps.ccache-prepare.outputs.key }}
# Restore a matching ccache cache entry. Prefer same branch.
restore-keys: |
ccache-msys2-thread-stress-${{ github.ref }}
ccache-msys2-thread-stress
- name: Configure ccache
# Limit the maximum size and switch on compression to avoid exceeding the total disk or cache quota.
run: |
which ccache
test -d ${{ steps.ccache-prepare.outputs.ccachedir }} || mkdir -p ${{ steps.ccache-prepare.outputs.ccachedir }}
echo "max_size = 250M" > ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf
echo "compression = true" >> ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf
ccache -p
ccache -s
- name: Configure OpenBLAS
run: |
mkdir build && cd build
cmake -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_STATIC_LIBS=OFF \
-DBUILD_WITHOUT_LAPACK=ON \
-DBUILD_SINGLE=OFF \
-DBUILD_DOUBLE=ON \
-DBUILD_COMPLEX=OFF \
-DBUILD_COMPLEX16=OFF \
-DDYNAMIC_ARCH=OFF \
-DNOFORTRAN=ON \
-DUSE_THREAD=ON \
-DUSE_OPENMP=OFF \
-DNUM_THREADS=32 \
-DTARGET=CORE2 \
-DCPP_THREAD_SAFETY_TEST=ON \
-DCPP_THREAD_SAFETY_DGEMM_ARGS="384;8;4" \
-DCPP_THREAD_SAFETY_DGEMM_MIXED_ARGS="524288;16;20" \
-DCPP_THREAD_SAFETY_DGEMV_ARGS="384;8;4" \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
..
- name: Build OpenBLAS
run: |
cd build
cmake --build . --target dgemm_thread_safety dgemm_thread_safety_mixed dgemm_thread_safety_shutdown dgemv_thread_safety
- name: Show ccache status
continue-on-error: true
run: ccache -s
- name: Save ccache
# Save the cache after we are done (successfully) building
uses: actions/cache/save@v5
with:
path: ${{ steps.ccache-prepare.outputs.ccachedir }}
key: ${{ steps.ccache-prepare.outputs.key }}
- name: Run thread stress tests
timeout-minutes: 30
run: |
cd build
export PATH="$PWD/lib:$PATH"
OPENBLAS_NUM_THREADS=8 OMP_NUM_THREADS=16 ctest -R 'dgemm_thread_safety|dgemm_thread_safety_mixed|dgemm_thread_safety_shutdown|dgemv_thread_safety' --output-on-failure
cross_build:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: ubuntu-22.04
@@ -357,7 +637,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: Install Dependencies
run: |
@@ -365,7 +645,7 @@ jobs:
sudo apt-get install -y ccache gcc-${{ matrix.triple }} gfortran-${{ matrix.triple }} libgomp1-${{ matrix.target }}-cross
- name: Compilation cache
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.ccache
key: ccache-${{ runner.os }}-${{ matrix.target }}-${{ github.ref }}-${{ github.sha }}
@@ -392,7 +672,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: Install Dependencies
run: |
@@ -404,4 +684,55 @@ jobs:
make -j${nproc}
make -j${nproc} lapack-test
neoverse_n1_build:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: ubuntu-24.04-arm
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Install Dependencies
run: |
sudo apt-get update
sudo apt-get install -y gcc gfortran make
- name: Build OpenBLAS
run: |
make -j${nproc} TARGET=NEOVERSEN1
make -j${nproc} TARGET=NEOVERSEN1 lapack-test
neoverse_n1_omp_build:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: ubuntu-24.04-arm
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Install Dependencies
run: |
sudo apt-get update
sudo apt-get install -y gcc gfortran make
- name: Build OpenBLAS
run: |
make -j${nproc} TARGET=NEOVERSEN1 USE_OPENMP=1
neoverse_n1_ilp64_build:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: ubuntu-24.04-arm
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Install Dependencies
run: |
sudo apt-get update
sudo apt-get install -y gcc gfortran make
- name: Build OpenBLAS
run: |
make -j${nproc} TARGET=NEOVERSEN1 INTERFACE64=1
make -j${nproc} TARGET=NEOVERSEN1 INTERFACE64=1 lapack-test
+63
View File
@@ -0,0 +1,63 @@
name: freebsd
on:
push:
branches:
- develop
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
branches:
- develop
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
bsd-x86:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v6
- name: build
id: freebsd_x86_64
uses: vmactions/freebsd-vm@v1
with:
usesh: true
prepare: |
run: |
freebsd-version
sysctl hw.ncpu
pkg install -y gmake gcc15
gmake CC=gcc15 FC=gfortran15
bsd-aarch64:
if: "github.repository == 'OpenMathLib/OpenBLAS'"
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v6
- name: build
id: freebsd_arm64
uses: vmactions/freebsd-vm@v1
with:
arch: aarch64
usesh: true
run: |
freebsd-version
sysctl hw.ncpu
pkg install -y gmake gcc15
gmake CC=gcc15 FC=gfortran15
+10 -2
View File
@@ -1,6 +1,14 @@
name: harmonyos
on: [push, pull_request]
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -20,7 +28,7 @@ jobs:
-DCMAKE_INSTALL_PREFIX=install \
-DCMAKE_BUILD_TYPE=Release \
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: ndk-install
run: |
wget https://repo.huaweicloud.com/harmonyos/os/4.1.1-Release/ohos-sdk-windows_linux-public.tar.gz
+23 -8
View File
@@ -1,6 +1,14 @@
name: loongarch64 qemu test
on: [push, pull_request]
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -38,16 +46,16 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: Install APT deps
run: |
sudo apt-get update && \
sudo apt-get install autoconf automake autotools-dev ninja-build make ccache qemu-user-static \
sudo apt-get install autoconf automake autotools-dev ninja-build make ccache \
gcc-14-loongarch64-linux-gnu g++-14-loongarch64-linux-gnu gfortran-14-loongarch64-linux-gnu
- name: Compilation cache
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.ccache
key: ccache-${{ runner.os }}-${{ matrix.target }}-${{ github.ref }}-${{ github.sha }}
@@ -62,11 +70,18 @@ jobs:
echo "compression = true" >> ~/.ccache/ccache.conf
ccache -s
- name: Disable utest dsdot:dsdot_n_1
- name: Install QEMU 10.2.1
run: |
echo -n > utest/test_dsdot.c
echo "Due to the current version of qemu causing utest cases to fail,"
echo "the utest dsdot:dsdot_n_1 have been temporarily disabled."
qemu_deb="${RUNNER_TEMP}/qemu-user_10.2.1+ds-1ubuntu3_amd64.deb"
qemu_root="${RUNNER_TEMP}/qemu-user-10.2.1"
wget --output-document="${qemu_deb}" \
https://archive.ubuntu.com/ubuntu/pool/universe/q/qemu/qemu-user_10.2.1+ds-1ubuntu3_amd64.deb
echo "e6bdaac070232a44b8657cad84ac0853d84b7167b55af82370af040291f55bd8 ${qemu_deb}" \
| sha256sum --check -
dpkg-deb --extract "${qemu_deb}" "${qemu_root}"
sudo install -m 0755 "${qemu_root}/usr/bin/qemu-loongarch64" \
/usr/local/bin/qemu-loongarch64-static
qemu-loongarch64-static --version
- name: Build OpenBLAS
run: |
+12 -10
View File
@@ -1,6 +1,14 @@
name: loongarch64 clang qemu test
on: [push, pull_request]
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -31,7 +39,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: Install libffi6
run: |
@@ -51,7 +59,7 @@ jobs:
tar -xf loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3.tar.xz -C /opt
- name: Checkout qemu
uses: actions/checkout@v3
uses: actions/checkout@v6
with:
repository: qemu/qemu
path: qemu
@@ -69,7 +77,7 @@ jobs:
echo "PATH=$GITHUB_WORKSPACE:/opt/clang+llvm_8.0.1-6_amd64-linux-gnu_debian-10/bin:/opt/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3/bin:$PATH" >> $GITHUB_ENV
- name: Compilation cache
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.ccache
key: ccache-${{ runner.os }}-${{ matrix.target }}-${{ github.ref }}-${{ github.sha }}
@@ -84,12 +92,6 @@ jobs:
echo "compression = true" >> ~/.ccache/ccache.conf
ccache -s
- name: Disable utest dsdot:dsdot_n_1
run: |
echo -n > utest/test_dsdot.c
echo "Due to the qemu versions 7.2 causing utest cases to fail,"
echo "the utest dsdot:dsdot_n_1 have been temporarily disabled."
- name: Build OpenBLAS
run: make CC='ccache clang --target=loongarch64-linux-gnu --sysroot=/opt/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3/loongarch64-linux-gnu/sysroot/ -static' FC='ccache loongarch64-linux-gnu-gfortran -static' HOSTCC='ccache clang' CROSS_SUFFIX=llvm- NO_SHARED=1 ${{ matrix.opts }} -j$(nproc)
+13 -5
View File
@@ -1,6 +1,14 @@
name: mips64 qemu test
on: [push, pull_request]
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -35,7 +43,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: install build deps
run: |
@@ -44,11 +52,11 @@ jobs:
gcc-${{ matrix.triple }} gfortran-${{ matrix.triple }} libgomp1-mips64el-cross libglib2.0-dev
- name: checkout qemu
uses: actions/checkout@v3
uses: actions/checkout@v6
with:
repository: qemu/qemu
path: qemu
ref: ae35f033b874c627d81d51070187fbf55f0bf1a7
ref: 3e0bcba1ca7d6607ca49a988d165f052a3a53323
- name: build qemu
run: |
@@ -58,7 +66,7 @@ jobs:
make install
- name: Compilation cache
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.ccache
key: ccache-${{ runner.os }}-${{ matrix.target }}-${{ github.ref }}-${{ github.sha }}
+2 -2
View File
@@ -48,7 +48,7 @@ jobs:
sleep ${delay}
if: github.event_name == 'schedule'
- uses: actions/checkout@v2
- uses: actions/checkout@v6
# This isn't even needed, technically. Homebrew will get `develop` via git
- name: Update Homebrew
@@ -69,7 +69,7 @@ jobs:
mv *.bottle.tar.gz bottles
- name: Upload bottle
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: openblas--HEAD.catalina.bottle.tar.gz
path: bottles
+11 -3
View File
@@ -1,6 +1,14 @@
name: riscv64 zvl256b qemu test
on: [push, pull_request]
on:
push:
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -34,7 +42,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: install build deps
run: |
@@ -48,7 +56,7 @@ jobs:
chmod +x /opt/riscv/bin/qemu-riscv64
- name: Compilation cache
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.ccache
key: ccache-${{ runner.os }}-${{ matrix.target }}-${{ github.ref }}-${{ github.sha }}
+7 -1
View File
@@ -4,9 +4,15 @@ on:
push:
branches:
- develop
paths-ignore:
- 'docs/**'
- '**/*.md'
pull_request:
branches:
- develop
paths-ignore:
- 'docs/**'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -21,7 +27,7 @@ jobs:
runs-on: windows-11-arm
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v6
- name: Install LLVM for Win-ARM64
shell: pwsh
+1
View File
@@ -4,6 +4,7 @@
*.dylib
*.def
*.o
*.exe
*.out
*.tmp
lapack-3.1.1
+113 -28
View File
@@ -9,7 +9,7 @@ project(OpenBLAS C ASM)
set(OpenBLAS_MAJOR_VERSION 0)
set(OpenBLAS_MINOR_VERSION 3)
set(OpenBLAS_PATCH_VERSION 31)
set(OpenBLAS_PATCH_VERSION 34.dev)
set(OpenBLAS_VERSION "${OpenBLAS_MAJOR_VERSION}.${OpenBLAS_MINOR_VERSION}.${OpenBLAS_PATCH_VERSION}")
@@ -58,9 +58,10 @@ else()
set(NO_AFFINITY 1)
endif()
option(CPP_THREAD_SAFETY_TEST "Run a massively parallel DGEMM test to confirm thread safety of the library (requires OpenMP and about 1.3GB of RAM)" OFF)
option(CPP_THREAD_SAFETY_TEST "Run massively parallel DGEMM tests to confirm thread safety of the library (requires about 1.3GB of RAM)" OFF)
option(CPP_THREAD_SAFETY_USE_OPENMP "Use OpenMP to launch the C++ thread safety tests" ON)
option(CPP_THREAD_SAFETY_GEMV "Run a massively parallel DGEMV test to confirm thread safety of the library (requires OpenMP)" OFF)
option(CPP_THREAD_SAFETY_GEMV "Run a massively parallel DGEMV test to confirm thread safety of the library" OFF)
option(BUILD_STATIC_LIBS "Build static library" OFF)
option(BUILD_SHARED_LIBS "Build shared library" OFF)
if(NOT BUILD_STATIC_LIBS AND NOT BUILD_SHARED_LIBS)
@@ -243,6 +244,38 @@ if (${DYNAMIC_ARCH})
endforeach()
endif ()
# Work around Apple issue with "argument list too long" when linking.
# Seen for DYNAMIC_ARCH when there are a _LOT_ of variants build, previously
# mostly with older versions on POWERPC or Intel CPUs, but with newer ARM
# CPUs and newer compilers this will also occur on ARM.
#
# This must happen before the add_library() calls, otherwise this will have
# no effect.
#
# Unfortunately, while this workaround will work for shared libraries (with
# either Ninja oder Unix Makefiles), but not for static libraries, as ar
# does not accept response files. So for the case where we (also) build
# static libraries we need an additional workaround, see below. (The
# generation of the response files by CMake must still be enabled, so this
# is required regardless.)
if(APPLE)
set(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS ON)
set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES ON)
if(NOT NOFORTRAN)
set(CMAKE_Fortran_USE_RESPONSE_FILE_FOR_OBJECTS ON)
set(CMAKE_Fortran_USE_RESPONSE_FILE_FOR_LIBRARIES ON)
# NAG Fortran does not support the GCC-specific -x f95-cpp-input flag
# used in the shared library link rule below. Override
# CMAKE_Fortran_CREATE_SHARED_LIBRARY early (before targets are defined)
# to use the C compiler link rule instead; the shared library contains
# only C and assembler objects so this is safe.
if(CMAKE_Fortran_COMPILER_ID MATCHES "NAG")
set(CMAKE_Fortran_CREATE_SHARED_LIBRARY ${CMAKE_C_CREATE_SHARED_LIBRARY})
endif()
endif()
set(CMAKE_NINJA_FORCE_RESPONSE_FILE ON)
endif()
# add objects to the openblas lib
if(NOT NO_LAPACK)
add_library(LAPACK_OVERRIDES OBJECT ${LA_SOURCES})
@@ -308,20 +341,22 @@ if (USE_OPENMP)
endif()
endif()
# Fix "Argument list too long" for macOS - mostly seen with older OS versions on POWERPC or Intel CPUs
if(APPLE)
# Use response files
set(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
# Second part of "Argument list too long" fix when static libraries are
# built. See above for details.
if(APPLE AND BUILD_STATIC_LIBS)
# Always build static library first
if(BUILD_STATIC_LIBS)
set(STATIC_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${OpenBLAS_LIBNAME}.a")
set(STATIC_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib${OpenBLAS_LIBNAME}.a")
# Handle differences in how many response files are generated and/or where
# they are stored for Ninja / Unix Makefiles.
if("${CMAKE_GENERATOR}" MATCHES "Ninja")
set(CREATE_STATIC_LIBRARY_COMMAND
"sh -c 'cat ${CMAKE_BINARY_DIR}/CMakeFiles/openblas_static.rsp | xargs -n 1024 ${CMAKE_AR} -ru ${STATIC_PATH} && exit 0' "
"sh -c '${CMAKE_AR} -rs ${STATIC_PATH} ${CMAKE_BINARY_DIR}/driver/others/CMakeFiles/driver_others.dir/xerbla.c.o && exit 0' ")
else()
add_library(${OpenBLAS_LIBNAME}_static STATIC ${TARGET_OBJS} ${OpenBLAS_DEF_FILE})
set(STATIC_PATH "lib${OpenBLAS_LIBNAME}.a")
set(CREATE_STATIC_LIBRARY_COMMAND
"sh -c 'cat ${CMAKE_BINARY_DIR}/CMakeFiles/${OpenBLAS_LIBNAME}_static.dir/objects*.rsp | xargs -n 1024 ${CMAKE_AR} -ru ${STATIC_PATH} && exit 0' "
"sh -c '${CMAKE_AR} -rs ${STATIC_PATH} ${CMAKE_BINARY_DIR}/driver/others/CMakeFiles/driver_others.dir/xerbla.c.o && exit 0' ")
endif()
set(CREATE_STATIC_LIBRARY_COMMAND
"sh -c 'cat ${CMAKE_BINARY_DIR}/CMakeFiles/${OpenBLAS_LIBNAME}_static.dir/objects*.rsp | xargs -n 1024 ${CMAKE_AR} -ru ${STATIC_PATH} && exit 0' "
"sh -c '${CMAKE_AR} -rs ${STATIC_PATH} ${CMAKE_BINARY_DIR}/driver/others/CMakeFiles/driver_others.dir/xerbla.c.o && exit 0' ")
if(BUILD_SHARED_LIBS)
add_dependencies(${OpenBLAS_LIBNAME}_shared ${OpenBLAS_LIBNAME}_static)
set(SHARED_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libopenblas.${OpenBLAS_MAJOR_VERSION}.${OpenBLAS_MINOR_VERSION}.dylib")
@@ -332,12 +367,34 @@ if(APPLE)
set(OMP_LIB "")
endif()
if(NOT NOFORTRAN)
set(CMAKE_Fortran_USE_RESPONSE_FILE_FOR_OBJECTS 1)
set(CMAKE_Fortran_CREATE_STATIC_LIBRARY ${CREATE_STATIC_LIBRARY_COMMAND})
if(BUILD_SHARED_LIBS)
set(CMAKE_Fortran_CREATE_SHARED_LIBRARY
"sh -c 'echo \"\" | ${CMAKE_Fortran_COMPILER} -o dummy.o -c -x f95-cpp-input - '"
"sh -c '${CMAKE_Fortran_COMPILER} -fpic -shared -Wl,-all_load -Wl,-force_load,${STATIC_PATH} dummy.o -o ${SHARED_PATH} ${OMP_LIB}'")
if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
set(CMAKE_Fortran_CREATE_SHARED_LIBRARY
"sh -c 'echo \"\" | ${CMAKE_Fortran_COMPILER} -o dummy.o -c -x f95-cpp-input - '"
"sh -c '${CMAKE_Fortran_COMPILER} -fpic -shared -Wl,-all_load -Wl,-force_load,${STATIC_PATH} dummy.o -o ${SHARED_PATH} ${OMP_LIB}'")
elseif(CMAKE_Fortran_COMPILER_ID MATCHES "NAG")
# NAG does not support -x f95-cpp-input, and macOS needs -dynamiclib
# rather than -Wl,-shared. Use the C compiler as the linker driver
# and add the NAG Fortran runtime so NAGf90_* symbols resolve.
# Locate the NAG Fortran runtime (libf<XY>rts) without hardcoding the
# version digits: NAG 7.1 ships libf71rts, 7.2 ships libf72rts, etc.
get_filename_component(_NAG_FC_DIR "${CMAKE_Fortran_COMPILER}" DIRECTORY)
set(_NAG_RTS_DIR "${_NAG_FC_DIR}/../lib/NAG_Fortran")
file(GLOB _NAG_RTS_CANDIDATES
"${_NAG_RTS_DIR}/libf*rts.dylib"
"${_NAG_RTS_DIR}/libf*rts.a")
if(_NAG_RTS_CANDIDATES)
list(GET _NAG_RTS_CANDIDATES 0 _NAG_RTS_LIB)
get_filename_component(_NAG_RTS_NAME "${_NAG_RTS_LIB}" NAME_WE)
string(REGEX REPLACE "^lib" "" _NAG_RTS_LIBNAME "${_NAG_RTS_NAME}")
set(_NAG_RTS_FLAGS "-L${_NAG_RTS_DIR} -l${_NAG_RTS_LIBNAME}")
else()
set(_NAG_RTS_FLAGS "")
endif()
set(CMAKE_Fortran_CREATE_SHARED_LIBRARY
"sh -c '${CMAKE_C_COMPILER} -dynamiclib -Wl,-all_load -Wl,-force_load,${STATIC_PATH} -o ${SHARED_PATH} ${OMP_LIB} ${_NAG_RTS_FLAGS}'")
endif()
endif()
else()
set(CMAKE_C_CREATE_STATIC_LIBRARY ${CREATE_STATIC_LIBRARY_COMMAND})
@@ -676,19 +733,48 @@ if(NOT NO_CBLAS)
message (STATUS "Generating cblas.h in ${CMAKE_INSTALL_INCLUDEDIR}")
set(CBLAS_H ${CMAKE_BINARY_DIR}/generated/cblas.h)
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/cblas.h CBLAS_H_CONTENTS)
string(REPLACE "common" "openblas_config" CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS}")
string(REPLACE "common" "openblas_config" CBLAS_H_CONTENTS_NEW2 "${CBLAS_H_CONTENTS}")
string(REPLACE "OPENBLAS_EXPORT " "" CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW2}")
# Symbol prefix/suffix settings rename exported functions, not C typedefs.
# Protect callback type names from the textual function-name rewriting below.
string(REPLACE "openblas_dojob_callback" "OPENBLAS_DOJOB_CALLBACK_TYPE"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REPLACE "openblas_threads_callback" "OPENBLAS_THREADS_CALLBACK_TYPE"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REPLACE "openblas_xerbla_handler" "OPENBLAS_XERBLA_HANDLER_TYPE"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
if (NOT ${SYMBOLPREFIX} STREQUAL "")
string(REPLACE " cblas" " ${SYMBOLPREFIX}cblas" CBLAS_H_CONTENTS "${CBLAS_H_CONTENTS_NEW}")
string(REPLACE " openblas" " ${SYMBOLPREFIX}openblas" CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS}")
string (REPLACE " ${SYMBOLPREFIX}openblas_complex" " openblas_complex" CBLAS_H_CONTENTS "${CBLAS_H_CONTENTS_NEW}")
string(REPLACE " goto" " ${SYMBOLPREFIX}goto" CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS}")
string(REPLACE " cblas" " ${SYMBOLPREFIX}cblas"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REPLACE " openblas" " ${SYMBOLPREFIX}openblas"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REPLACE " ${SYMBOLPREFIX}openblas_complex" " openblas_complex"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REPLACE " goto" " ${SYMBOLPREFIX}goto"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
endif()
if (NOT ${SYMBOLSUFFIX} STREQUAL "")
string(REGEX REPLACE "(cblas[^ (]*)" "\\1${SYMBOLSUFFIX}" CBLAS_H_CONTENTS "${CBLAS_H_CONTENTS_NEW}")
string(REGEX REPLACE "(openblas[^ (]*)" "\\1${SYMBOLSUFFIX}" CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS}")
string(REGEX REPLACE "(openblas_complex[^ ]*)${SYMBOLSUFFIX}" "\\1" CBLAS_H_CONTENTS "${CBLAS_H_CONTENTS_NEW}")
string(REGEX REPLACE "(goto[^ (]*)" "\\1${SYMBOLSUFFIX}" CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS}")
string(REGEX REPLACE "(cblas[A-Za-z0-9_]*)" "\\1${SYMBOLSUFFIX}"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REGEX REPLACE "(openblas[A-Za-z0-9_]*)" "\\1${SYMBOLSUFFIX}"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REPLACE "openblas_config${SYMBOLSUFFIX}" "openblas_config"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REGEX REPLACE "(openblas_complex[A-Za-z0-9_]*)${SYMBOLSUFFIX}" "\\1"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REGEX REPLACE "(goto[A-Za-z0-9_]*)" "\\1${SYMBOLSUFFIX}"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
endif()
string(REPLACE "OPENBLAS_DOJOB_CALLBACK_TYPE" "openblas_dojob_callback"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REPLACE "OPENBLAS_THREADS_CALLBACK_TYPE" "openblas_threads_callback"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
string(REPLACE "OPENBLAS_XERBLA_HANDLER_TYPE" "openblas_xerbla_handler"
CBLAS_H_CONTENTS_NEW "${CBLAS_H_CONTENTS_NEW}")
file(WRITE ${CBLAS_H} "${CBLAS_H_CONTENTS_NEW}")
install (FILES ${CBLAS_H} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
@@ -764,4 +850,3 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PN}ConfigVersion.cmake
install(EXPORT "${PN}${SUFFIX64}Targets"
NAMESPACE "${PN}${SUFFIX64}::"
DESTINATION ${CMAKECONFIG_INSTALL_DIR})
+16
View File
@@ -272,3 +272,19 @@ In chronological order:
* Anna Mayne <anna.mayne@arm.com>
* [2025-11-19] Update thread throttling profile for SGEMV on NEOVERSEV1 and NEOVERSEV2
* Fadi Arafeh <fadi.arafeh@arm.com>
* [2026-03-05] Accelerate SVE128 SBGEMM/BGEMM
* Nathan Sircombe <nathan.sircombe@arm.com>
* [2026-04-16] Add CPU ID for Neoverse V3
hheei <hheei@users.noreply.github.com>
* Aadityansha Verma <https://github.com/aadityansha06>
* [2026-07-14] Add independent transpose support for C in GEADD (sgeadd/dgeadd/cgeadd/zgeadd).
* Vincent Lovero <https://github.com/vlovero>
* [2026-08-11] ARM v9.2 SME GEMM kernels for Apple M
* Hugo Meiland <hugo@meiland.nl>
* [2026-08-09] Add Cortex-A72 DGEMM 6x8 microkernel and blocking
+247 -1
View File
@@ -1,7 +1,253 @@
OpenBLAS ChangeLog
====================================================================
Version 0.3.34
16-Jul-2026
general:
- Fixed potential race conditions between concurrent calls to level3 BLAS
functions (inadvertent use of non-unified locks)
- Fixed potential race condition in GETRF
- Added or improved multithreading thresholds in SPR,SPR2,SYR,SYR2,TBMV,TPMV
- Added multithreading thresholds to GETRS, LAED3, LASWP, LAUUM, TRTRS, ZTRTRI
- Added a BLAS extension for overriding the default error handler (XERBLA) function
- Reimplemented the BLAS extension GEADD to support independent transposition of
both matrices (unlike the previous, ATLAS-like implementation)
- Guarded against spurious NaN values in the reimplemented ?LAED3
- Fixed compilation of the BLAS extension tests with CMake
- Fixed spurious and conflicting setting of job numbers in gmake builds
- Fixed a potential linking issue with the fortran runtime in the BLAS tests
- Fixed potential access to unrelated memory in the C fallback versions of LAPACK
functions ILAENV and IPARMQ
- Fixed the generated pkgfile to support spaces in path names
- Added support for compilation with the experimental, LLVM-based memory-safe C toolchain
known as Fil-C
- Imported recent updates from Reference-LAPACK to realign with its upcoming 3.13.0 release:
- Added non-trivial terminating case to ?LARFT calculation (Reference-LAPACK PR 1163)
- Fixed workspace calculation for CUNMLQ with K=0 (Reference-LAPACK PR 1225)
- Rearranged computations in C/ZLARTG to avoid large intermediates (PR 1245)
- Fixed wrong Y increment used in ?ORDB3/?UNBDB3 (Reference-LAPACK PR 1265)
- Fixed wrong name reported in XERBLA call of ZLA_SYRFSX_EXTENDED (PR 1268)
- Fixed wrong JOBA type in SGESVJ call of SGEJSV (Reference-LAPACK PR 1269)
- Fixed wrong workspace in DGEJSV corrupting memory in DGESVJ (PR 1270)
- Fixed wrong or missing EXTERNAL declarations (Reference-LAPACK PR 1271)
- Fixed wrong operand number in errors of GGSVD3,UN/ORBDB4,UN/ORCSD (PR 1272)
- Fixed sign of error flag in LWORK check of LAQZ0 (Reference-LAPACK PR 1273)
- Fixed too small workspace query result from SGGEV3 (Reference-LAPACK PR 1274)
- Fixed DLASWLQ not rejecting NB=0 (Reference-LAPACK PR 1275)
- Avoid immediate overflows in GEJSV,GESVJ,GESVDX,GEDMD (Reference-LAPACK PR 1283)
- Ignore LDU value when U unused in LAPACKE_?GESVD_WORK (Reference-LAPACK PR 1284)
- Fixed premature return before fallback code in BDSQR (Reference-LAPACK PR 1285)
- Increased tolerance in LASD2 to improve BDSDC stability (Reference-LAPACK PR 1286)
- Fixed row-major A dimension for SIDE=R in LAPACKE_?TPRFB_WORK (PR 1287)
- Fixed seed advancement in SLARUV/DLARUV (Reference-LAPACK PR 1288)
- Fixed workspace queries for TZRZF/UNMRZ in GELSY (Reference-LAPACK PRs 1289/1325)
- Avoid immediate overflows in ?LARFGP (Reference-LAPACK PR 1290)
- Added handling of degenerate cases in OR/UNCSD2BY1 (Reference-LAPACK PR 1291)
- Fixed workspace for tiny inputs in ORM/UNM-L/R-Q and -Q-L/R (PR 1292)
- Scaled convergence thresholds in ?BBCSD to improve accuracy (PR 1293)
- Fixed integer overflow in the LAPACKE nancheck helpers (Reference-LAPACK PR 1294)
- Relaxed eigenvalue consistency checks in testsuite (Reference-LAPACK PR 1297)
- Fixed test failures in ?CHKLQ with NB=1 and M=N (Reference-LAPACK PR 1298)
- Switched to QR algorithm in ?BDSDC for bidiagonal SVD with vectors (PR 1300)
- Replaced HUGE intrinsic in ?TGSJA with parameter for consistency (PR 1305)
- Corrected description of QMAX parameter in ?LASQ3 (Reference-LAPACK PR 1307)
- Fixed bad scaling in ?LARFF that slowed down DSYEVR/ZHEEVR (PR 1309)
- Fixed handling of negative increments in ?LARF/?LARF1F/?LARF1L (PR 1315)
- Increased tolerances in ?LAED to match changes in ?LASD (PR 1317)
- Fixed LAPACKE_?lacpy_work destroying data in row-major mode (PR 1318)
arm:
- Added a significantly faster SGEMM kernel
arm64:
- Added optimized kernels for OMATCOPY_CT and OMATCOPY_RT on all targets
- Fixed SDOT/DDOT on non-SVE-capable cpus not initializing the result correctly
- Fixed miscompilation of CGETF2/ZGETF2 by LLVM on Apple M
- Fixed SSYRK miscalculation on Apple M systems bigger than the Mac mini
- Fixed remaining cases of CMake build failure due to long argument lists on OSX
- On OSX, reduced the list of DYNAMIC_ARCH targets to those relevant for this os
- Fixed platform detection and cross-builds to iOS on OSX with AppleClang
- Fixed gmake builds for SME targets on OSX with AppleClang
- Improved the compiler test for SME compatibility in the CMake build files
- Fixed runtime detection of SME in DYNAMIC_ARCH builds made with CMake
- Restored a fix for building DYNAMIC_ARCH under Windows on Arm that was inadvertently
dropped in 0.3.33)
- Corrected the selection criteria for the SME-based SGEMM kernel on Apple M
- Fixed DYNAMIC_ARCH builds on hosts without SVE capability
- Fixed building a shared library with NAG Fortran on OSX
- Fixed misdetection of C11 capability (and resulting race conditions during concurrent
calls) in Clang builds under OSX
- Fixed miscalculation of Apple M cpu time leading to benchmarks 40 times too slow
loongarch64:
- Corrected generation of the LSX/LASX status flags in the configuration files
- Fixed potential reads of memory beyond the array bounds in the LA464 SGEMM kernel
- Added optimized SDOT, ICAMIN/IZAMIN and ZGEMM kernels for 2K3000
power:
- Fixed an incompatibility in the assembly kernels for SCAL on FreeBSD
- Fixed a potentially spurious check for gfortran in gmake builds with LLVM
that could make POWER9/10 builds fall back to POWER8 kernels
- Improved build flags and cpu register constraints for POWER10
- Fixed linking issues on BSD
riscv64:
- Fixed compilation for DYNAMIC_ARCH with BUILD_BFLOAT16 defined
- Fixed SGEMM and DGEMM errors on ZVL256 introduced in 0.3.33
- Sped up GEMV on C910V and ZVL256B targets
- Improved the x280 S/DROTM kernel and enabled it on ZVL128B/ZVL256B
- Added optimized STRSM kernels for ZVL128B/ZVL256B
- Added optimized D/C/ZTRSM kernels (RN and RT cases) for ZVL128B/ZVL256B
- Added a dedicated target for the SiFive U74 with optimized SGEMM and DGEMM kernels
- Made L2 cache size available at runtime for scaling GEMM block sizes
x86_64:
- Fixed remaining cases of CMake build failure due to long argument lists on OSX
- Improved cpu capability check for recent Zhaoxin cpus
- Fixed wrong TRSM results on AMD Barcelona (and Ryzen systems in 32bit builds)
- Added autodetection support for the fake Opteron-like CPUID used by QEMU on AMD hardware
- Fixed automatic setting of the BINARY=32 option when building with 32bit toolchains
- Fixed miscompilation of GEMM,SYR2K and TPMV kernels with gcc15/gcc16 on 32bit FreeBSD
====================================================================
Version 0.3.33
23-Apr-2026
general:
- fixed an incorrect cast in the SBGEMM test case that could lead to spurious test failures
- fixed an invalid memory access in the converted C version of the CBLAS tests
- made the BIGNUMA setting automatic when the number of cores exceeds 256
- Imported recent updates from Reference-LAPACK to realign with its upcoming 3.13.0 release:
- Implement ?LARF1F and ?ORM2R (Reference-LAPACK PRs 1019,1020,1196,1257)
- Change loop order in ?GETC2 to improve performance (Reference-LAPACK PR 1023)
- Change WORK array dimension in ?GELQS/?GEQRS (Reference-LAPACK PR 1094)
- Add NaN checks for input matrix A in ?GEEV (Reference-LAPACK PR 1136)
- Fix support for jobu/v in LAPACKE_?GESVDQ_WORK (Reference-LAPACK PRs 1146,1221)
- Fix display of version number in LAPACK testsuite (Reference-LAPACK PR 1149)
- Fix DGGES test seed to avoid bad matrix cases (Reference-LAPACK PR 1187)
- Fix truncation of large WORK array sizes in ZHE (Reference-LAPACK PR 1195)
- Fix overwriting of LDSWORK parameter in ?TRSYL3 (Reference-LAPACK PR 1206)
- Fix overwriting of error states in some EIG tests (Reference-LAPACK PR 1207)
- Remove unused parameter in DORBDB3/ZUNBDB3 (Reference-LAPACK PR 1209)
- Re-enable testing of ?BB and ?GG driver functions (Reference-LAPACK PR 1211)
- Fix workspace size calculation in ?TGSEN (Reference-LAPACK PR 774)
- Fix typos in the EIG DMD tests and initialized the cutoff variable (PR 1212,1228)
- Optimized looping in ?LACPY/?LASCL/?LANTR with fat matrix and UPLO=L (PR 1251)
arm64:
- worked around a serious miscompilation of the DDOT kernel by GCC15, affecting
most non-SVE targets, and SVE targets in the case of non-unit array stride)
- fixed an accuracy issue in the GEMV kernel for Neoverse V1 and other SVE targets
- fixed broken STRMM and SSYMM in DYNAMIC_ARCH builds when running on non-SME hardware
- added an optimized SHGEMM kernel for Neoverse N2
- fixed DYNAMIC_ARCH builds under Windows on Arm
- Added autodetection of Cortex A75/A76 in DYNAMIC_ARCH builds
- Added autodetection of Neoverse V3, currently supported through V2 kernels
- Re-added support for the "VORTEX" target in DYNAMIC_ARCH builds with DYNAMIC_LIST
- Fixed CMake-based builds that use the "Ninja" generator
loongarch64:
- fixed a build failure due to missing support for the new half-precision float type
- fixed a long-standing bug in asserting 64bit capability in the c_check helper script
x86_64:
- added a workaround for miscompilation of the AVX512 GEMM kernels by LLVM on Windows
- fixed a build failure in the LAED3 code when compiling with MinGW on Windows
- fixed CMake-based compilation with the NVIDIA HPC compiler
- Fixed CMake-based builds that use the "Ninja" generator
wasm:
- added optimized kernels for STRSM and DTRSM
- added a 4x4 WASM SIMD128 GEMM microkernel for SGEMM/DGEMM with matching
4-wide packing and TRMM, using relaxed SIMD madd in the inner loop
- gated leftover WASM TRSM call counters behind OPENBLAS_WASM_TRSM_PROFILE
====================================================================
Version 0.3.32
23-Mar-2026
general:
- Moved the preliminary support for a Web Assembly target to its own WASM
architecture and WASM128_GENERIC target
- Fixed a potential performance difference between dedicated compilation for
a target and its representation in DYNAMIC_ARCH builds by making additional
cpu-specific parameters available to the DYNAMIC_ARCH configuration
- Fixed the reimplementation of LAPACK ?GESV to conform to the reference (i.e.
compute the LU factorization even when NRHS is zero)
- Improved the error message that is displayed when the compile-time allocation
of memory buffers is exceeded
- Fixed a problem with non-serialized accesses to parallelized SYRK by concurrent
callers
- Fixed an ABI mismatch in the internal version of CDOT/ZDOT used by the C fallback
versions of the LAPACK source
- Improved the f_check script for detecting the Fortran compiler to handle embedded
dashes in path names
- Fixed several memory access issues in the utests that were detected by Address
Sanitizer
- Fixed Makefile errors in cases where only a subset of precision types was selected
- Fixed missing function errors in Makefile builds without LAPACK or without threads
- Fixed a syntax error in the benchmarks Makefile
- Fixed compiler warnings in the CBLAS testsuite
- Fixed the OpenMP compiler option used with the Intel Ifx compiler
- Updated the README sections on supported cpus and operating systems, and added
notes pertaining to JAVA
- Updated the documentation page for supported BLAS-like extensions
- included fixes from the Reference-LAPACK project:
- Improved step length selection in the fallback path of ?LAED4
(Reference-LAPACK PR 1191)
- Rounding up of LWORK and removal of redundant type conversions in the GVD
functions (Reference-LAPACK PR 1202)
- internal errors were getting ignored in calculation of selected eigenvalues
(Reference-LAPACK PR 1204)
arm64:
- Fixed a potential miscompilation of the SDOT/DDOT/DSDOT kernels
- Fixed DYNAMIC_ARCH compilation with CMake and compilers lacking SVE support
- Improved the performance of BGEMM and SBGEMM kernels for Neoverse V2
- Added optimized SSUM and DSUM kernels for Neoverse N1
- Added preliminary support for Neoverse V3 cpus as NEOVERSEV2
- Added cpu autodetection of Cortex A725 and X925 cpus
- Fixed a CMake build problem with flang on Mac OS
- Fixed build problems with gcc versions 12 and earlier that do not support fp16
- Fixed compilation of GEMM kernels for VORTEXM4/ARMV9SME without multithreading
- Fixed the optimized CDOT/ZDOT kernel to compile with LLVM under Windows on Arm
- Renamed the copy of the DllMain function used in static linking on MS Windows to
OpenBLASDllMain to avoid symbol name conflicts with other libraries
ioongarch64:
- fixed POTRF returning wrong results on LA464 due to a wrong parameter setting
power:
- Fixed compilation problems caused by missing support for half-precision floats (FP16)
- Fixed a potential miscompilation of the POWER10 DGEMV kernel by limiting its optimization
level
- Fixed a SCAL issue on PPCG4/PPC970 running Linux
- Worked around a SCAL issue on PPC970 running FreeBSD by switching to the generic C kernels
riscv64:
- Optimized the CROT/ZROT kernel for vector length 128 in the non-unit stride path
- Improved SBGEMM/SHGEMM and related helper functions for type conversion
- Fixed probing for BFLOAT16 support in DYNAMIC_ARCH cpu detection at runtime
x86_64:
- Fixed a potential miscompilation (by gcc 15.x) of the AVX512 SGEMM kernel for "small"
matrix sizes
- Fixed the SROT and DROT kernels for Haswell to have consistent (FMA) rounding
in the main loop and tail call
- Added automatic detection of Intel Arrow Lake H/U, Panther Lake and Jasper Lake
- Added automatic detection of Intel Emerald Rapids and upcoming cpu models
- Updated the cache size translation table in the cpu model autodetection code
- Improved cpu detection fallback to also include Nehalem as a non-AVX option
- Fixed a Makefile build issue with clang and the SkylakeX SGEMM kernel
- Renamed the copy of the DllMain function used in static linking on MS Windows to
OpenBLASDllMain to avoid symbol name conflicts with other libraries
wasm:
- Added optimized intrinsics kernels for SGEMM and DGEMM as well as DOT, ROT and SUM
====================================================================
Version 0.3.31
15-Jan-2025
15-Jan-2026
general:
- reverted a matrix partitioning optimization from 0.3.30 that could lead to
+2 -1
View File
@@ -1,6 +1,7 @@
TOPDIR = .
include ./Makefile.system
LNCMD = ln -fs
OSNAME_DISPLAY ?= $(OSNAME)
ifeq ($(FIXED_LIBNAME), 1)
LNCMD = true
endif
@@ -58,7 +59,7 @@ all :: tests
@echo
@echo " OpenBLAS build complete. ($(LIB_COMPONENTS))"
@echo
@echo " OS ... $(OSNAME) "
@echo " OS ... $(OSNAME_DISPLAY) "
@echo " Architecture ... $(ARCH) "
ifndef BINARY64
@echo " BINARY ... 32bit "
+7 -9
View File
@@ -34,7 +34,7 @@ endif
ifeq ($(C_COMPILER), FUJITSU)
ISCLANG=1
endif
ifneq (1, $(filter 1,$(GCCVERSIONGT4) $(ISCLANG)))
ifeq "$(or $(GCCVERSIONGT4),$(ISCLANG))" ""
CCOMMON_OPT += -march=armv8-a
ifneq ($(F_COMPILER), NAG)
FCOMMON_OPT += -march=armv8-a
@@ -59,11 +59,11 @@ endif
endif
ifeq ($(CORE), ARMV9SME)
CCOMMON_OPT += -march=armv9-a+sve2+sme
CCOMMON_OPT += -march=armv9-a+sve2+sme+sme-f64f64
FCOMMON_OPT += -march=armv9-a+sve2
ifdef OS_WINDOWS
ifeq ($(C_COMPILER), CLANG)
CCOMMON_OPT += --aarch64-stack-hazard-size=0
CCOMMON_OPT += -mllvm --aarch64-stack-hazard-size=0
endif
endif
endif
@@ -310,12 +310,10 @@ endif
ifeq ($(CORE), VORTEXM4)
ifneq ($(C_COMPILER), GCC)
ifeq ($(APPLECLANG),1)
CCOMMON_OPT += -march=armv8.4-a+sme
else
CCOMMON_OPT += -march=armv8.4-a+sme
override LDFLAGS += -lclang_rt_builtins-aarch64
endif
CCOMMON_OPT += -march=armv8.4-a+sme+sme-f64f64
#ifneq ($(APPLECLANG),1)
#override LDFLAGS += -lclang_rt_builtins-aarch64
#endif
else
CCOMMON_OPT += -march=armv8.4-a
endif
+49 -39
View File
@@ -32,7 +32,7 @@ PKG_EXTRALIB := $(EXTRALIB)
ifeq ($(INTERFACE64),1)
SUFFIX64=64
endif
PKGFILE="$(DESTDIR)$(OPENBLAS_PKGCONFIG_DIR)/$(LIBSONAMEBASE)$(SUFFIX64).pc"
PKGFILE := $(DESTDIR)$(OPENBLAS_PKGCONFIG_DIR)/$(LIBSONAMEBASE)$(SUFFIX64).pc
ifeq ($(USE_OPENMP), 1)
ifeq ($(C_COMPILER), PGI)
@@ -73,7 +73,10 @@ install : lib.grd
ifneq ($(NO_CBLAS),1)
@echo Generating cblas.h in $(DESTDIR)$(OPENBLAS_INCLUDE_DIR)
@cp cblas.h cblas.tmp
@sed -e 's/openblas_dojob_callback/OPENBLAS_DOJOB_CALLBACK_TYPE/g' \
-e 's/openblas_threads_callback/OPENBLAS_THREADS_CALLBACK_TYPE/g' \
-e 's/openblas_xerbla_handler/OPENBLAS_XERBLA_HANDLER_TYPE/g' \
cblas.h > cblas.tmp
ifdef SYMBOLPREFIX
@sed 's/cblas[^() ]*/$(SYMBOLPREFIX)&/g' cblas.tmp > cblas.tmp2
@sed 's/openblas[^() ]*/$(SYMBOLPREFIX)&/g' cblas.tmp2 > cblas.tmp
@@ -88,7 +91,16 @@ ifdef SYMBOLSUFFIX
@sed 's/\(openblas_complex_\)\([^ ]*\)$(SYMBOLSUFFIX)/\1\2 /g' cblas.tmp > cblas.tmp2
@sed 's/goto[^() ]*/&$(SYMBOLSUFFIX)/g' cblas.tmp2 > cblas.tmp
endif
@sed 's/common/openblas_config/g' cblas.tmp > "$(DESTDIR)$(OPENBLAS_INCLUDE_DIR)/cblas.h"
@sed 's/OPENBLAS_EXPORT //' cblas.tmp > cblas.tmp2
@sed 's/common/openblas_config/g' cblas.tmp2 > cblas.tmp
@sed -e 's/OPENBLAS_DOJOB_CALLBACK_TYPE/openblas_dojob_callback/g' \
-e 's/OPENBLAS_THREADS_CALLBACK_TYPE/openblas_threads_callback/g' \
-e 's/OPENBLAS_XERBLA_HANDLER_TYPE/openblas_xerbla_handler/g' \
-e 's/common/openblas_config/g' \
cblas.tmp > "$(DESTDIR)$(OPENBLAS_INCLUDE_DIR)/cblas.h"
endif
ifneq ($(OSNAME), AIX)
@@ -191,8 +203,6 @@ endif
ifeq ($(INTERFACE64),1)
SUFFIX64=64
endif
PKGFILE="$(DESTDIR)$(OPENBLAS_PKGCONFIG_DIR)/$(LIBSONAMEBASE)$(SUFFIX64).pc"
@echo Generating $(LIBSONAMEBASE)$(SUFFIX64).pc in "$(DESTDIR)$(OPENBLAS_PKGCONFIG_DIR)"
@echo 'libdir='$(OPENBLAS_LIBRARY_DIR) > "$(PKGFILE)"
@echo 'libprefix='$(LIBNAMEPREFIX) >> "$(PKGFILE)"
@@ -271,46 +281,46 @@ endif
install_tests : lib.grd
ifneq ($(ONLY_CBLAS), 1)
@install -m 666 utest/openblas_utest $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 utest/openblas_utest_ext $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 utest/openblas_utest$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 utest/openblas_utest_ext$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
ifeq ($(NOFORTRAN), $(filter 0,$(NOFORTRAN)))
ifndef NO_FBLAS
ifeq ($(BUILD_BFLOAT16),1)
@install -m 666 test/test_sbgemm $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/test_sbgemm$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
endif
ifeq ($(BUILD_SINGLE),1)
@install -m 666 test/sblat1 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/sblat2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/sblat3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/sblat1$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/sblat2$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/sblat3$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/sblat2.dat $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/sblat3.dat $(DESTDIR)$(OPENBLAS_BINARY_DIR)
endif
ifeq ($(BUILD_DOUBLE),1)
@install -m 666 test/dblat1 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/dblat2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/dblat3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/dblat1$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/dblat2$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/dblat3$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/dblat2.dat $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/dblat3.dat $(DESTDIR)$(OPENBLAS_BINARY_DIR)
endif
ifeq ($(BUILD_COMPLEX),1)
@install -m 666 test/cblat1 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/cblat2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/cblat3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/cblat1$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/cblat2$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/cblat3$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/cblat2.dat $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/cblat3.dat $(DESTDIR)$(OPENBLAS_BINARY_DIR)
ifeq ($(ARCH), filter($(ARCH), x86 x86_64 ia64 MIPS))
@install -m 666 test/cblat3_3m $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/cblat3_3m$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/cblat3_3m.dat $(DESTDIR)$(OPENBLAS_BINARY_DIR)
endif
endif
ifeq ($(BUILD_COMPLEX16),1)
@install -m 666 test/zblat1 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/zblat2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/zblat3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/zblat1$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/zblat2$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/zblat3$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/zblat2.dat $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/zblat3.dat $(DESTDIR)$(OPENBLAS_BINARY_DIR)
ifeq ($(ARCH), filter($(ARCH), x86 x86_64 ia64 MIPS))
@install -m 666 test/zblat3_3m $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/zblat3_3m$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 test/zblat3_3m.dat $(DESTDIR)$(OPENBLAS_BINARY_DIR)
endif
endif
@@ -318,46 +328,46 @@ endif
endif
ifneq ($(ONLY_CBLAS), 1)
ifeq ($(BUILD_SINGLE),1)
@install -m 666 ctest/xscblat1 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xscblat2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xscblat3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xscblat1$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xscblat2$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xscblat3$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/sin2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/sin3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
endif
ifeq ($(BUILD_DOUBLE),1)
@install -m 666 ctest/xdcblat1 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xdcblat2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xdcblat3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xdcblat1$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xdcblat2$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xdcblat3$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/din2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/din3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
endif
ifeq ($(BUILD_COMPLEX),1)
@install -m 666 ctest/xccblat1 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xccblat2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xccblat3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xccblat1$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xccblat2$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xccblat3$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/cin2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/cin3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
ifeq ($(ARCH), filter($(ARCH), x86 x86_64 ia64 MIPS))
@install -m 666 ctest/xccblat3_3m $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xccblat3_3m$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/cin3_3m $(DESTDIR)$(OPENBLAS_BINARY_DIR)
endif
endif
ifeq ($(BUILD_COMPLEX16),1)
@install -m 666 ctest/xzcblat1 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xzcblat2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xzcblat3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xzcblat1$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xzcblat2$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xzcblat3$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/zin2 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/zin3 $(DESTDIR)$(OPENBLAS_BINARY_DIR)
ifeq ($(ARCH), filter($(ARCH), x86 x86_64 ia64 MIPS))
@install -m 666 ctest/xzcblat3_3m $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/xzcblat3_3m$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 ctest/zin3_3m $(DESTDIR)$(OPENBLAS_BINARY_DIR)
endif
endif
endif
ifeq ($(CPP_THREAD_SAFETY_TEST), 1)
@install -m 666 cpp_thread_test/dgemm_tester $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 cpp_thread_test/dgemv_tester $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 cpp_thread_test/dgemm_tester$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 cpp_thread_test/dgemm_mixed_tester$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
@install -m 666 cpp_thread_test/dgemv_tester$(EXE) $(DESTDIR)$(OPENBLAS_BINARY_DIR)
endif
endif
+5
View File
@@ -112,6 +112,11 @@ endif
ifeq ($(C_COMPILER), CLANG)
CCOMMON_OPT += -fno-integrated-as
ifeq ($(OSNAME), FreeBSD)
ifeq ($(CORE), $(filter $(CORE),POWER9 POWER10))
CCOMMON_OPT += -Wa,-mpwr10
endif
endif
endif
# workaround for C->FORTRAN ABI violation in LAPACKE
ifeq ($(F_COMPILER), GFORTRAN)
+4
View File
@@ -75,6 +75,10 @@ ifeq ($(TARGET), RISCV64_GENERIC)
TARGET_FLAGS = -march=rv64imafdc -mabi=lp64d
endif
ifeq ($(TARGET), U74)
TARGET_FLAGS = -march=rv64imafdc_zba_zbb -mabi=lp64d
endif
all: getarch_2nd
./getarch_2nd 0 >> $(TARGET_MAKE)
./getarch_2nd 1 >> $(TARGET_CONF)
+4
View File
@@ -25,3 +25,7 @@ ifeq ($(CORE), RISCV64_GENERIC)
CCOMMON_OPT += -march=rv64imafdc -mabi=lp64d
FCOMMON_OPT += -march=rv64imafdc -mabi=lp64d
endif
ifeq ($(CORE), U74)
CCOMMON_OPT += -march=rv64imafdc_zba_zbb -mabi=lp64d -mtune=sifive-u74
FCOMMON_OPT += -march=rv64imafdc_zba_zbb -mabi=lp64d -mtune=sifive-u74
endif
+11 -11
View File
@@ -3,17 +3,17 @@
#
# This library's version
VERSION = 0.3.31
VERSION = 0.3.34.dev
# If you set this prefix, the library name will be lib$(LIBNAMESUFFIX)openblas.a
# and lib$(LIBNAMESUFFIX)openblas.so, with a matching soname in the shared library
#
# If you set this prefix, the library name will be lib$(LIBNAMEPREFIX)openblas.a
# and lib$(LIBNAMEPREFIX)openblas.so, with a matching soname in the shared library
#
# LIBNAMEPREFIX = scipy
# If you set the suffix, the library name will be libopenblas_$(LIBNAMESUFFIX).a
# and libopenblas_$(LIBNAMESUFFIX).so. Meanwhile, the soname in shared library
# is libopenblas_$(LIBNAMESUFFIX).so.0.
# LIBNAMESUFFIX = omp
# If you set the suffix, the library name will be libopenblas$(LIBNAMESUFFIX).a
# and libopenblas$(LIBNAMESUFFIX).so. Meanwhile, the soname in shared library
# is libopenblas$(LIBNAMESUFFIX).so.0.
# LIBNAMESUFFIX = _omp
# You can specify the target architecture, otherwise it's
# automatically detected.
@@ -290,10 +290,10 @@ COMMON_PROF = -pg
# This is mostly intended as a developer feature to spot regressions, but users and
# package maintainers can enable this if they have doubts about the thread safety of
# the library, given the configuration in this file.
# By default, the thread safety tester launches 52 concurrent calculations at the same
# time.
# By default, the thread safety testers launch many concurrent calculations at
# the same time.
#
# Please note that the test uses ~1300 MiB of RAM for the DGEMM test.
# Please note that the tests use ~1300 MiB of RAM for the DGEMM test.
#
# The test requires CBLAS to be built, a C++11 capable compiler and the presence of
# an OpenMP implementation. If you are cross-compiling this test will probably not
+41 -3
View File
@@ -194,7 +194,7 @@ ifeq ($(TARGET_CORE), EXCAVATOR)
GETARCH_FLAGS := -DFORCE_BARCELONA
endif
ifeq ($(TARGET_CORE), ZEN)
GETARCH_FLAGS := -DFORCE_BARCELONA
GETARCH_FLAGS := -DFORCE_NEHALEM
endif
endif
@@ -247,6 +247,11 @@ NO_PARALLEL_MAKE=0
endif
GETARCH_FLAGS += -DNO_PARALLEL_MAKE=$(NO_PARALLEL_MAKE)
ifndef MAKE_NB_JOBS
ifneq (,$(patsubst -j%,%,$(filter -j%,$(MAKEFLAGS))))
MAKE_NB_JOBS=-1
endif
endif
ifdef MAKE_NB_JOBS
GETARCH_FLAGS += -DMAKE_NB_JOBS=$(MAKE_NB_JOBS)
endif
@@ -280,7 +285,7 @@ GEMM_GEMV_FORWARD = 1
SBGEMM_GEMV_FORWARD = 1
BGEMM_GEMV_FORWARD = 1
endif
ifeq ($(ARCH), riscv)
ifeq ($(ARCH), riscv64)
GEMM_GEMV_FORWARD = 1
endif
ifeq ($(ARCH), power)
@@ -417,6 +422,9 @@ endif
ifeq ($(C_COMPILER), CLANG)
CLANGVERSIONGTEQ9 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 9)
CLANGVERSIONGTEQ12 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 12)
ifeq ($(F_COMPILER), GFORTRAN)
GCCVERSIONGT4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 4)
endif
endif
#
@@ -469,7 +477,7 @@ EXTRALIB += -lm
endif
ifeq ($(OSNAME), $(filter $(OSNAME),FreeBSD OpenBSD NetBSD DragonFly))
ifeq ($(ARCH), $(filter $(ARCH),arm arm64))
ifeq ($(ARCH), $(filter $(ARCH),arm arm64 power))
EXTRALIB += -lm
endif
endif
@@ -592,11 +600,13 @@ ifeq ($(F_COMPILER), GFORTRAN)
ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
EXPRECISION = 1
CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
CCOMMON_OPT += -fvisibility=hidden
FCOMMON_OPT += -m128bit-long-double
endif
ifeq ($(C_COMPILER), CLANG)
EXPRECISION = 1
CCOMMON_OPT += -DEXPRECISION
CCOMMON_OPT += -fvisibility=hidden
FCOMMON_OPT += -m128bit-long-double
endif
endif
@@ -615,11 +625,13 @@ ifeq ($(F_COMPILER), GFORTRAN)
ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
EXPRECISION = 1
CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
CCOMMON_OPT += -fvisibility=hidden
FCOMMON_OPT += -m128bit-long-double
endif
ifeq ($(C_COMPILER), CLANG)
EXPRECISION = 1
CCOMMON_OPT += -DEXPRECISION
CCOMMON_OPT += -fvisibility=hidden
FCOMMON_OPT += -m128bit-long-double
endif
endif
@@ -733,6 +745,20 @@ DYNAMIC_CORE += THUNDERX2T99
DYNAMIC_CORE += TSV110
DYNAMIC_CORE += EMAG8180
DYNAMIC_CORE += THUNDERX3T110
ifeq ($(OSNAME), Darwin)
DYNAMIC_CORE = ARMV8
DYNAMIC_CORE += NEOVERSEN1
ifneq ($(NO_SME), 1)
DYNAMIC_CORE += ARMV9SME
ifeq ($(OSNAME), Darwin)
ifneq ($(C_COMPILER), GCC)
DYNAMIC_CORE += VORTEXM4
endif
endif
endif
endif
ifdef DYNAMIC_LIST
override DYNAMIC_CORE = ARMV8 $(DYNAMIC_LIST)
XCCOMMON_OPT = -DDYNAMIC_LIST -DDYN_ARMV8
@@ -1626,7 +1652,11 @@ ifneq ($(C_COMPILER), SUN)
CCOMMON_OPT += -UASMNAME -UASMFNAME -UNAME -UCNAME -UCHAR_NAME -UCHAR_CNAME
endif
endif
ifeq ( ,$(findstring pizfix,$(CEXTRALIB)))
CCOMMON_OPT += -DASMNAME=$(FU)$(*F) -DASMFNAME=$(FU)$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F) -DCHAR_NAME=\"$(*F)$(BU)\" -DCHAR_CNAME=\"$(*F)\"
else
CCOMMON_OPT += -DASMNAME=$(FU)pizlonated_$(*F) -DASMFNAME=$(FU)pizlonated_$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F) -DCHAR_NAME=\"$(*F)$(BU)\" -DCHAR_CNAME=\"$(*F)\"
endif
ifeq ($(CORE), PPC440)
CCOMMON_OPT += -DALLOC_QALLOC
@@ -1796,6 +1826,14 @@ ifndef LIBSUFFIX
LIBSUFFIX = a
endif
ifndef EXE
ifeq ($(OSNAME), $(filter $(OSNAME),WINNT CYGWIN_NT))
EXE = .exe
else
EXE =
endif
endif
ifneq ($(DYNAMIC_ARCH), 1)
ifndef SMP
LIBNAME = $(LIBPREFIX)_$(LIBCORE)$(REVISION).$(LIBSUFFIX)
+1
View File
@@ -0,0 +1 @@
CCOMMON_OPT += -msimd128 -mrelaxed-simd
+5
View File
@@ -61,6 +61,9 @@ endif
ifeq ($(CORE), SKYLAKEX)
ifndef NO_AVX512
CCOMMON_OPT += -march=skylake-avx512
ifeq ($(C_COMPILER), CLANG)
CCOMMON_OPT += -mllvm -exhaustive-register-search
endif
ifneq ($(F_COMPILER), NAG)
FCOMMON_OPT += -march=skylake-avx512
endif
@@ -93,6 +96,7 @@ ifeq ($(C_COMPILER), GCC)
endif
endif
else ifeq ($(C_COMPILER), CLANG)
CCOMMON_OPT += -mllvm -exhaustive-register-search
# cooperlake support was added in clang 9
ifeq ($(CLANGVERSIONGTEQ9), 1)
CCOMMON_OPT += -march=cooperlake
@@ -135,6 +139,7 @@ ifeq ($(C_COMPILER), GCC)
endif
endif
else ifeq ($(C_COMPILER), CLANG)
CCOMMON_OPT += -mllvm -exhaustive-register-search
# sapphire rapids support was added in clang 12
ifeq ($(CLANGVERSIONGTEQ12), 1)
CCOMMON_OPT += -march=sapphirerapids
+32 -16
View File
@@ -2,15 +2,10 @@
[![Join the chat at https://gitter.im/xianyi/OpenBLAS](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/xianyi/OpenBLAS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
Cirrus CI: [![Build Status](https://api.cirrus-ci.com/github/xianyi/OpenBLAS.svg?branch=develop)](https://cirrus-ci.com/github/xianyi/OpenBLAS)
GitHub Actions: [![Build Status](https://github.com/OpenMathLib/OpenBLAS/actions/workflows/dynamic_arch.yml/badge.svg?branch=develop)](https://github.com/OpenMathLib/OpenBLAS/actions/workflows/dynamic_arch.yml?query=branch%3Adevelop)
Azure Pipelines: [![Build Status](https://dev.azure.com/xianyi/OpenBLAS/_apis/build/status/xianyi.OpenBLAS?branchName=develop)](https://dev.azure.com/xianyi/OpenBLAS/_build/latest?definitionId=1&branchName=develop)
[![Build Status](https://dev.azure.com/xianyi/OpenBLAS/_apis/build/status/xianyi.OpenBLAS?branchName=develop)](https://dev.azure.com/xianyi/OpenBLAS/_build/latest?definitionId=1&branchName=develop)
OSUOSL POWERCI [![Build Status](https://powerci.osuosl.org/buildStatus/icon?job=OpenBLAS_gh%2Fdevelop)](http://powerci.osuosl.org/job/OpenBLAS_gh/job/develop/)
OSUOSL IBMZ-CI [![Build Status](http://ibmz-ci.osuosl.org/buildStatus/icon?job=OpenBLAS-Z%2Fdevelop)](http://ibmz-ci.osuosl.org/job/OpenBLAS-Z/job/develop/)
## Introduction
OpenBLAS is an optimized BLAS (Basic Linear Algebra Subprograms) library based on GotoBLAS2 1.13 BSD version.
@@ -148,11 +143,12 @@ Please read `GotoBLAS_01Readme.txt` for older CPU models already supported by th
- **Intel Haswell**: Optimized Level-3 and Level-2 BLAS with AVX2 and FMA on x86-64.
- **Intel Skylake-X**: Optimized Level-3 and Level-2 BLAS with AVX512 and FMA on x86-64.
- **Intel Cooper Lake**: as Skylake-X with improved BFLOAT16 support.
- **Intel Sapphire Rapids**: as Cooper Lake with improved BFLOAT16 SBGEMM kernel.
- **AMD Bobcat**: Used GotoBLAS2 Barcelona codes.
- **AMD Bulldozer**: x86-64 ?GEMM FMA4 kernels. (Thanks to Werner Saar)
- **AMD PILEDRIVER**: Uses Bulldozer codes with some optimizations.
- **AMD STEAMROLLER**: Uses Bulldozer codes with some optimizations.
- **AMD ZEN**: Uses Haswell codes with some optimizations for Zen 2/3 (use SkylakeX for Zen4)
- **AMD ZEN**: Uses Haswell codes with some optimizations for Zen 2/3, SkylakeX for Zen4, Cooperlake for Zen5
#### MIPS32
@@ -175,7 +171,7 @@ Please read `GotoBLAS_01Readme.txt` for older CPU models already supported by th
- **Cortex-A53**: same as ARMV8 (different cpu specifications)
- **Cortex-A55**: same as ARMV8 (different cpu specifications)
- **Cortex A57**: Optimized Level-3 and Level-2 functions
- **Cortex A72**: same as A57 ( different cpu specifications)
- **Cortex A72**: same as A57 (different cpu specifications)
- **Cortex A73**: same as A57 (different cpu specifications)
- **Cortex A76**: same as A57 (different cpu specifications)
- **Falkor**: same as A57 (different cpu specifications)
@@ -186,9 +182,15 @@ Please read `GotoBLAS_01Readme.txt` for older CPU models already supported by th
- **EMAG 8180**: preliminary support based on A57
- **Neoverse N1**: (AWS Graviton2) preliminary support
- **Neoverse V1**: (AWS Graviton3) optimized Level-3 BLAS
- **Neoverse N2**: preliminary support
- **Neoverse V2**: preliminary support
- **Neoverse V3**: preliminary support
- **Neoverse V3AE**: preliminary support
- **Apple Vortex**: preliminary support based on ThunderX2/3
- **Apple VortexM4**: preliminary support based on ThunderX2/3, SME kernels for SGEMM,SSYMM,STRMM,SSYRK,SSYR2K
- **A64FX**: preliminary support, optimized Level-3 BLAS
- **ARMV8SVE**: any ARMV8 cpu with SVE extensions
- **ARMV9SME**: any ARMV9 cpu with SVE and SME extensions
#### PPC/PPC64
@@ -219,6 +221,8 @@ Please read `GotoBLAS_01Readme.txt` for older CPU models already supported by th
make HOSTCC=gcc TARGET=x280 NUM_THREADS=8 CC=riscv64-unknown-linux-gnu-clang FC=riscv64-unknown-linux-gnu-gfortran
```
(For RVV 1.0 target selection and compiler requirements, see the [RISC-V section in docs/install.md](docs/install.md#risc-v).)
- **ZVL???B**: Level-3 BLAS and Level-1,2 including vectorised kernels targeting generic RISCV cores with vector support with registers of at least the corresponding width; ZVL128B and ZVL256B are available.
e.g.:
```sh
@@ -249,9 +253,15 @@ e.g.:
```
The old-style TARGET=LOONGSON3R5 is still supported
#### WASM
Not a cpu target in the strict sense, but portable WebAssembly for browser-based applications and the like. See emscripten.org for the compiler and related information
- **WASM128_GENERIC**: Optimized SGEMM,DGEMM, DAXPY, SSUM/DSUM, SDOT/DDOT and SROT/DROT
### Support for multiple targets in a single library
OpenBLAS can be built for multiple targets with runtime detection of the target cpu by specifiying `DYNAMIC_ARCH=1` in Makefile.rule, on the gmake command line or as `-DDYNAMIC_ARCH=TRUE` in cmake.
OpenBLAS can be built for multiple targets with runtime detection of the target cpu by specifying `DYNAMIC_ARCH=1` in Makefile.rule, on the gmake command line or as `-DDYNAMIC_ARCH=TRUE` in cmake.
For **x86_64**, the list of targets this activates contains Prescott, Core2, Nehalem, Barcelona, Sandybridge, Bulldozer, Piledriver, Steamroller, Excavator, Haswell, Zen, SkylakeX, Cooper Lake, Sapphire Rapids. For cpu generations not included in this list, the corresponding older model is used. If you also specify `DYNAMIC_OLDER=1`, specific support for Penryn, Dunnington, Opteron, Opteron/SSE3, Bobcat, Atom and Nano is added. Finally there is an option `DYNAMIC_LIST` that allows to specify an individual list of targets to include instead of the default.
@@ -277,23 +287,29 @@ Please note that it is not possible to combine support for different architectur
### Supported OS
- **GNU/Linux**
- **MinGW or Visual Studio (CMake)/Windows**: Please read <https://github.com/xianyi/OpenBLAS/wiki/How-to-use-OpenBLAS-in-Microsoft-Visual-Studio>.
- **Darwin/macOS/OSX/iOS**: Experimental. Although GotoBLAS2 already supports Darwin, we are not OSX/iOS experts.
- **FreeBSD**: Supported by the community. We don't actively test the library on this OS.
- **MinGW or Visual Studio (CMake)/Windows**: Please read <https://github.com/OpenMathLib/OpenBLAS/blob/develop/docs/install.md#visual-studio--native-windows-abi>.
- **Darwin/macOS/OSX/iOS**: Already supported on PPC and x86 by the original GotoBLAS, now also on ARM64 but we are not OSX/iOS experts.
- **FreeBSD**: Supported by the community. Basic test coverage is provided by GitHub Actions.
- **OpenBSD**: Supported by the community. We don't actively test the library on this OS.
- **NetBSD**: Supported by the community. We don't actively test the library on this OS.
- **DragonFly BSD**: Supported by the community. We don't actively test the library on this OS.
- **Android**: Supported by the community. Please read <https://github.com/xianyi/OpenBLAS/wiki/How-to-build-OpenBLAS-for-Android>.
- **AIX**: Supported on PPC up to POWER10
- **Android**: Supported by the community. Please read <https://github.com/OpenMathLib/OpenBLAS/blob/develop/docs/install.md#android>.
- **AIX**: Supported on PPC up to POWER10 but testing is increasingly problematic due to lack of publicly available systems
- **Haiku**: Supported by the community. We don't actively test the library on this OS.
- **SunOS**: Supported by the community. We don't actively test the library on this OS.
- **Cortex-M**: Supported by the community. Please read <https://github.com/xianyi/OpenBLAS/wiki/How-to-use-OpenBLAS-on-Cortex-M>.
- **Cortex-M**: Supported by the community. Please read <https://github.com/OpenMathLib/OpenBLAS/blob/develop/docs/install.md#cortex-m>.
## Usage
Statically link with `libopenblas.a` or dynamically link with `-lopenblas` if OpenBLAS was
compiled as a shared library.
### Considerations for using the library from Java
The default stack size of only 1MB may be too small, especially if you built OpenBLAS to support larger matrix sizes than provided for by the default settings. Use the -Xss option to request a larger stack size if you encounter problems.
When a Windows build of OpenBLAS was created using the MINGW gfortran (for the LAPACK parts), the java application may hang on startup due to a deadlock between the gfortran runtime library initialization and any pipes created by a Win11/SBT/Play Framework environment. Use -Djdk.console=jdk.internal.le to work around this.
### Setting the number of threads using environment variables
Environment variables are used to specify a maximum number of threads.
+5
View File
@@ -128,6 +128,7 @@ RISCV64_ZVL128B
C910V
x280
RISCV64_ZVL256B
U74 (e.g. SiFive U74 / StarFive JH7110 / VisionFive 2)
11.LOONGARCH64:
// LOONGSONGENERIC/LOONGSON2K1000/LOONGSON3R5 are legacy names,
@@ -153,3 +154,7 @@ EV6
14.CSKY
CSKY
CK860FV
15. WebAssembly/Emscripten:
WASM128_GENERIC
+38 -19
View File
@@ -4,6 +4,15 @@ trigger:
branches:
include:
- develop
paths:
exclude:
- 'docs/**'
- '**/*.md'
pr:
paths:
exclude:
- 'docs/**'
- '**/*.md'
resources:
containers:
- container: oneapi-hpckit
@@ -91,6 +100,7 @@ jobs:
openblas_utest.exe
- job: Windows_mingw_gmake
timeoutInMinutes: 100
pool:
vmImage: 'windows-latest'
steps:
@@ -155,7 +165,7 @@ jobs:
- job: OSX_OpenMP
pool:
vmImage: 'macOS-14'
vmImage: 'macOS-15'
steps:
- script: |
brew update
@@ -165,7 +175,7 @@ jobs:
- job: OSX_GCC_Nothreads
pool:
vmImage: 'macOS-14'
vmImage: 'macOS-15'
steps:
- script: |
brew update
@@ -180,11 +190,13 @@ jobs:
make CC=gcc-15 FC=gfortran-15
- job: OSX_LLVM_flangnew
timeoutInMinutes: 100
pool:
vmImage: 'macOS-latest'
variables:
LD_LIBRARY_PATH: /usr/local/opt/llvm/lib
LIBRARY_PATH: /usr/local/opt/llvm/lib
RANLIB: touch
steps:
- script: |
brew update
@@ -192,11 +204,13 @@ jobs:
make TARGET=NEHALEM CC=/usr/local/opt/llvm/bin/clang FC=/usr/local/opt/flang/bin/flang NO_SHARED=1
- job: OSX_OpenMP_Clang
timeoutInMinutes: 100
pool:
vmImage: 'macOS-latest'
variables:
LD_LIBRARY_PATH: /usr/local/opt/llvm/lib
LIBRARY_PATH: /usr/local/opt/llvm/lib
RANLIB: touch
steps:
- script: |
brew update
@@ -204,6 +218,7 @@ jobs:
make TARGET=CORE2 USE_OPENMP=1 DYNAMIC_ARCH=1 DYNAMIC_LIST='NEHALEM HASWELL SKYLAKEX' CC=/usr/local/opt/llvm/bin/clang NOFORTRAN=1
- job: OSX_OpenMP_Clang_cmake
timeoutInMinutes: 100
pool:
vmImage: 'macOS-latest'
variables:
@@ -211,25 +226,28 @@ jobs:
LIBRARY_PATH: /usr/local/opt/llvm/lib
steps:
- script: |
set -euo pipefail
brew update
brew install llvm libomp
mkdir build
cd build
cmake -DTARGET=CORE2 -DUSE_OPENMP=1 -DINTERFACE64=1 -DDYNAMIC_ARCH=1 -DDYNAMIC_LIST='NEHALEM HASWELL SKYLAKEX' -DCMAKE_C_COMPILER=/usr/local/opt/llvm/bin/clang -DNOFORTRAN=1 -DNO_AVX512=1 ..
make
cmake -DTARGET=CORE2 -DUSE_OPENMP=1 -DINTERFACE64=1 -DDYNAMIC_ARCH=1 -DDYNAMIC_LIST='NEHALEM;HASWELL;SKYLAKEX' -DCMAKE_C_COMPILER=/usr/local/opt/llvm/bin/clang -DNOFORTRAN=1 -DNO_AVX512=1 ..
cmake --build . --parallel "$(sysctl -n hw.logicalcpu)"
ctest
- job: OSX_dynarch_cmake
timeoutInMinutes: 100
pool:
vmImage: 'macOS-14'
vmImage: 'macOS-15'
variables:
LD_LIBRARY_PATH: /usr/local/opt/llvm/lib
LIBRARY_PATH: /usr/local/opt/llvm/lib
steps:
- script: |
set -euo pipefail
mkdir build
cd build
cmake -DTARGET=CORE2 -DDYNAMIC_ARCH=1 -DDYNAMIC_LIST='NEHALEM HASWELL SKYLAKEX' -DCMAKE_C_COMPILER=gcc-13 -DCMAKE_Fortran_COMPILER=gfortran-13 -DBUILD_SHARED_LIBS=ON ..
cmake -DTARGET=CORE2 -DDYNAMIC_ARCH=1 -DDYNAMIC_LIST='NEHALEM;HASWELL;SKYLAKEX' -DCMAKE_C_COMPILER=gcc-13 -DCMAKE_Fortran_COMPILER=gfortran-13 -DBUILD_SHARED_LIBS=ON ..
cmake --build .
ctest
@@ -240,6 +258,7 @@ jobs:
LD_LIBRARY_PATH: /usr/local/opt/llvm/lib
MACOS_HPCKIT_URL: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/edb4dc2f-266f-47f2-8d56-21bc7764e119/m_HPCKit_p_2023.2.0.49443.dmg
LIBRARY_PATH: /usr/local/opt/llvm/lib
RANLIB: touch
MACOS_FORTRAN_COMPONENTS: intel.oneapi.mac.ifort-compiler
steps:
- script: |
@@ -268,7 +287,7 @@ jobs:
- job: OSX_NDK_ARMV7
pool:
vmImage: 'macOS-14'
vmImage: 'macOS-15'
steps:
- script: |
brew update
@@ -278,19 +297,19 @@ jobs:
- job: OSX_IOS_ARMV8
pool:
vmImage: 'macOS-14'
vmImage: 'macOS-15'
variables:
CC: /Applications/Xcode_16.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
CFLAGS: -O2 -Wno-macro-redefined -isysroot /Applications/Xcode_16.2.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.2.sdk -arch arm64 -miphoneos-version-min=10.0
CC: /Applications/Xcode_16.4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
CFLAGS: -O2 -Wno-macro-redefined -isysroot /Applications/Xcode_16.4.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.5.sdk -arch arm64 -miphoneos-version-min=10.0
steps:
- script: |
ls /Applications/Xcode_16.2.app/Contents/Developer/Platforms/
ls /Applications/Xcode_16.2.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
ls /Applications/Xcode_16.4.app/Contents/Developer/Platforms/
ls /Applications/Xcode_16.4.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
make TARGET=ARMV8 DYNAMIC_ARCH=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1
- job: OSX_IOS_ARMV7
pool:
vmImage: 'macOS-14'
vmImage: 'macOS-15'
variables:
CC: /Applications/Xcode_16.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
CFLAGS: -O2 -mno-thumb -Wno-macro-redefined -isysroot /Applications/Xcode_16.2.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.2.sdk -arch armv7 -miphoneos-version-min=5.1
@@ -300,15 +319,15 @@ jobs:
- job: OSX_xbuild_DYNAMIC_ARM64
pool:
vmImage: 'macOS-14'
vmImage: 'macOS-15'
variables:
CC: /Applications/Xcode_16.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
CFLAGS: -O2 -Wno-macro-redefined -isysroot /Applications/Xcode_16.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -arch arm64
CC: /Applications/Xcode_16.4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
CFLAGS: -O2 -Wno-macro-redefined -isysroot /Applications/Xcode_16.4.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.5.sdk -arch arm64
steps:
- script: |
ls /Applications/Xcode_16.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
/Applications/Xcode_12.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch arm64 --print-supported-cpus
/Applications/Xcode_16.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang --version
ls /Applications/Xcode_16.4.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
/Applications/Xcode_16.4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch arm64 --print-supported-cpus
/Applications/Xcode_16.4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang --version
make TARGET=ARMV8 DYNAMIC_ARCH=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1
- job: ALPINE_MUSL
+36 -2
View File
@@ -95,10 +95,15 @@ else
GOTO_HFLOAT_TARGETS=
endif
ifeq ($(USE_OPENMP), 1)
SMALLSCALING=smallscaling
endif
ifeq ($(OSNAME), WINNT)
goto :: slinpack.goto dlinpack.goto clinpack.goto zlinpack.goto \
scholesky.goto dcholesky.goto ccholesky.goto zcholesky.goto \
cblas_sgemm.goto cblas_dgemm.goto cblas_cgemm.goto cblas_zgemm.goto \
sgemm.goto dgemm.goto cgemm.goto zgemm.goto \
strmm.goto dtrmm.goto ctrmm.goto ztrmm.goto \
strsm.goto dtrsm.goto ctrsm.goto ztrsm.goto \
@@ -268,6 +273,7 @@ mkl :: slinpack.mkl dlinpack.mkl clinpack.mkl zlinpack.mkl \
else
goto :: sgemm.goto dgemm.goto cgemm.goto zgemm.goto \
cblas_sgemm.goto cblas_dgemm.goto cblas_cgemm.goto cblas_zgemm.goto \
strmm.goto dtrmm.goto ctrmm.goto ztrmm.goto \
strsm.goto dtrsm.goto ctrsm.goto ztrsm.goto \
sspr.goto dspr.goto \
@@ -301,7 +307,7 @@ goto :: sgemm.goto dgemm.goto cgemm.goto zgemm.goto \
stpsv.goto dtpsv.goto ctpsv.goto ztpsv.goto \
strsv.goto dtrsv.goto ctrsv.goto ztrsv.goto \
ssymm.goto dsymm.goto csymm.goto zsymm.goto \
smallscaling \
$(SMALLSCALING) \
isamax.goto idamax.goto icamax.goto izamax.goto \
ismax.goto idmax.goto \
isamin.goto idamin.goto icamin.goto izamin.goto \
@@ -681,6 +687,18 @@ endif
sgemm.goto : sgemm.$(SUFFIX) ../$(LIBNAME)
$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm
cblas_sgemm.goto : cblas_sgemm.$(SUFFIX) ../$(LIBNAME)
$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm
cblas_dgemm.goto : cblas_dgemm.$(SUFFIX) ../$(LIBNAME)
$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm
cblas_cgemm.goto : cblas_cgemm.$(SUFFIX) ../$(LIBNAME)
$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm
cblas_zgemm.goto : cblas_zgemm.$(SUFFIX) ../$(LIBNAME)
$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm
sgemm.acml : sgemm.$(SUFFIX)
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
@@ -3027,6 +3045,18 @@ cgemm.$(SUFFIX) : gemm.c
zgemm.$(SUFFIX) : gemm.c
$(CC) $(CFLAGS) -c -DCOMPLEX -DDOUBLE -o $(@F) $^
cblas_sgemm.$(SUFFIX) : cblasgemm.c
$(CC) $(CFLAGS) -c -UCOMPLEX -UDOUBLE -o $(@F) $^
cblas_dgemm.$(SUFFIX) : cblasgemm.c
$(CC) $(CFLAGS) -c -UCOMPLEX -DDOUBLE -o $(@F) $^
cblas_cgemm.$(SUFFIX) : cblasgemm.c
$(CC) $(CFLAGS) -c -DCOMPLEX -UDOUBLE -o $(@F) $^
cblas_zgemm.$(SUFFIX) : cblasgemm.c
$(CC) $(CFLAGS) -c -DCOMPLEX -DDOUBLE -o $(@F) $^
ssymm.$(SUFFIX) : symm.c
$(CC) $(CFLAGS) -c -UCOMPLEX -UDOUBLE -o $(@F) $^
@@ -3155,7 +3185,7 @@ bgemv.$(SUFFIX) : gemv.c
$(CC) $(CFLAGS) -c -DBFLOAT16 -DBGEMM -UCOMPLEX -UDOUBLE -o $(@F) $^
sbgemv.$(SUFFIX) : gemv.c
$(CC) $(CFLAGS) -c -DBFLOAT16 -UCOMPLEX -UDOUBLE -o $(@F) $^
endif ()
endif
zgemv.$(SUFFIX) : gemv.c
$(CC) $(CFLAGS) -c -DCOMPLEX -DDOUBLE -o $(@F) $^
@@ -3533,7 +3563,11 @@ zomatcopy.$(SUFFIX) : omatcopy.c
smallscaling: smallscaling.c ../$(LIBNAME)
ifeq ($(C_COMPILER), GCC)
$(CC) $(CFLAGS) -o $(@F) $^ $(EXTRALIB) -fopenmp -lm -lpthread
else
$(CC) $(CFLAGS) -o $(@F) $^ $(EXTRALIB) -quak -openmp -lm -lpthread
endif
clean ::
@rm -f *.goto *.mkl *.acml *.atlas *.veclib *.essl smallscaling
+1 -3
View File
@@ -95,7 +95,6 @@ static void *aligned_alloc_cacheline(size_t n)
#if defined(__WIN32__) || defined(__WIN64__) || !defined(_POSIX_TIMERS)
struct timeval start, stop;
#elif defined(__APPLE__)
mach_timebase_info_data_t info;
uint64_t start = 0, stop = 0;
#else
struct timespec start = { 0, 0 }, stop = { 0, 0 };
@@ -106,8 +105,7 @@ double getsec()
#if defined(__WIN32__) || defined(__WIN64__) || !defined(_POSIX_TIMERS)
return (double)(stop.tv_sec - start.tv_sec) + (double)((stop.tv_usec - start.tv_usec)) * 1.e-6;
#elif defined(__APPLE__)
mach_timebase_info(&info);
return (double)(((stop - start) * info.numer)/info.denom) * 1.e-9;
return (double)(stop - start) * 1.e-9;
#else
return (double)(stop.tv_sec - start.tv_sec) + (double)((stop.tv_nsec - start.tv_nsec)) * 1.e-9;
#endif
+233
View File
@@ -0,0 +1,233 @@
/***************************************************************************
Copyright (c) 2014, The OpenBLAS Project
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. Neither the name of the OpenBLAS project nor the names of
its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
#include "bench.h"
#include "cblas.h"
#undef GEMM
#ifndef COMPLEX
#ifdef DOUBLE
#define GEMM cblas_dgemm
#elif defined(BFLOAT16) && defined(BGEMM)
#define GEMM cblas_bgemm
#elif defined(BFLOAT16)
#define GEMM cblas_sbgemm
#undef IFLOAT
#define IFLOAT bfloat16
#elif defined(HFLOAT16)
#define GEMM cblas_shgemm
#undef IFLOAT
#define IFLOAT hfloat16
#else
#define GEMM cblas_sgemm
#undef IFLOAT
#define IFLOAT float
#endif
#else
#ifdef DOUBLE
#define GEMM cblas_zgemm
#else
#define GEMM cblas_cgemm
#endif
#endif
int main(int argc, char *argv[]){
IFLOAT *a, *b;
//IFLOAT *aa, *bb;
FLOAT *c;
//FLOAT *cc;
#ifdef BGEMM
blasint one=1;
blasint two=2;
float alpha_in[] = {1.0, 0.0};
float beta_in[] = {0.0, 0.0};
FLOAT alpha[2], beta[2];
sbstobf16_(&two, alpha_in, &one, alpha, &one);
sbstobf16_(&two, beta_in, &one, beta, &one);
#else
#ifdef COMPLEX
FLOAT alpha[] = {1.0, 0.0};
FLOAT beta [] = {0.0, 0.0};
#else
FLOAT alpha = 1.0;
FLOAT beta = 0.0;
#endif
#endif
CBLAS_TRANSPOSE transa = CblasNoTrans;
CBLAS_TRANSPOSE transb = CblasNoTrans;
char transac, transbc;
blasint m, n, k, i, j, lda, ldb, ldc;
int loops = 1;
int has_param_m = 0;
int has_param_n = 0;
int has_param_k = 0;
int has_param_lda = 0;
int has_param_ldb = 0;
char *p;
//blasint sme=0;
int from = 1;
int to = 200;
int step = 1;
double time1, timeg;
argc--;argv++;
if (argc > 0) { from = atol(*argv); argc--; argv++; }
if (argc > 0) { to = MAX(atol(*argv), from); argc--; argv++; }
if (argc > 0) { step = atol(*argv); argc--; argv++; }
if ((p = getenv("OPENBLAS_TRANS"))) {
transa=(*p=='N') ? CblasNoTrans : CblasTrans;
transb=(*p=='N') ? CblasNoTrans : CblasTrans;
}
if ((p = getenv("OPENBLAS_TRANSA"))) {
transa=(*p=='N') ? CblasNoTrans : CblasTrans;
}
if ((p = getenv("OPENBLAS_TRANSB"))) {
transb=(*p=='N') ? CblasNoTrans : CblasTrans;
}
transac=(transa==CblasNoTrans) ? 'N' : 'T';
transbc=(transb==CblasNoTrans) ? 'N' : 'T';
fprintf(stderr, "From : %3d To : %3d Step=%d : Transa=%c : Transb=%c\n", from, to, step, transac, transbc);
p = getenv("OPENBLAS_LOOPS");
if ( p != NULL ) {
loops = atoi(p);
}
if ((p = getenv("OPENBLAS_PARAM_M"))) {
m = atoi(p);
has_param_m=1;
} else {
m = to;
}
if ((p = getenv("OPENBLAS_PARAM_N"))) {
n = atoi(p);
has_param_n=1;
} else {
n = to;
}
if ((p = getenv("OPENBLAS_PARAM_K"))) {
k = atoi(p);
has_param_k=1;
} else {
k = to;
}
if ((p = getenv("OPENBLAS_PARAM_LDA"))) {
lda = atoi(p);
has_param_lda=1;
}
if ((p = getenv("OPENBLAS_PARAM_LDB"))) {
ldb = atoi(p);
has_param_ldb=1;
}
if (( a = (IFLOAT *)malloc(sizeof(IFLOAT) * m * k * COMPSIZE)) == NULL) {
fprintf(stderr,"Out of Memory!!\n");exit(1);
}
if (( b = (IFLOAT *)malloc(sizeof(IFLOAT) * k * n * COMPSIZE)) == NULL) {
fprintf(stderr,"Out of Memory!!\n");exit(1);
}
if (( c = (FLOAT *)malloc(sizeof(FLOAT) * m * n * COMPSIZE)) == NULL) {
fprintf(stderr,"Out of Memory!!\n");exit(1);
}
//if (( aa = (IFLOAT *)malloc(sizeof(IFLOAT) * m * k * COMPSIZE)) == NULL) {
// fprintf(stderr,"Out of Memory!!\n");exit(1);
//}
//if (( bb = (IFLOAT *)malloc(sizeof(IFLOAT) * k * n * COMPSIZE)) == NULL) {
// fprintf(stderr,"Out of Memory!!\n");exit(1);
//}
//if (( cc = (FLOAT *)malloc(sizeof(FLOAT) * m * n * COMPSIZE)) == NULL) {
// fprintf(stderr,"Out of Memory!!\n");exit(1);
//}
#ifdef __linux
srandom(getpid());
#endif
for (i = 0; i < m * k * COMPSIZE; i++) {
a[i] = ((IFLOAT) rand() / (IFLOAT) RAND_MAX) - 0.5;
// aa[i]=a[i];
}
for (i = 0; i < k * n * COMPSIZE; i++) {
b[i] = ((IFLOAT) rand() / (IFLOAT) RAND_MAX) - 0.5;
// bb[i]=b[i];
}
for (i = 0; i < m * n * COMPSIZE; i++) {
c[i] = ((FLOAT) rand() / (FLOAT) RAND_MAX) - 0.5;
// cc[i]=c[i];
}
fprintf(stderr, " SIZE Flops Time\n");
for (i = from; i <= to; i += step) {
timeg=0;
if (!has_param_m) { m = i; }
if (!has_param_n) { n = i; }
if (!has_param_k) { k = i; }
if (!has_param_lda) {
if (transa == CblasNoTrans) { lda = k; }
else { lda = m; }
}
if (!has_param_ldb) {
if (transb == CblasNoTrans) { ldb = n; }
else { ldb = k; }
}
ldc = n;
fprintf(stderr, " M=%4d, N=%4d, K=%4d : ", (int)m, (int)n, (int)k);
begin();
for (j=0; j<loops; j++) {
GEMM (CblasRowMajor,transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc);
}
// for (ii = 0; ii < m * n * COMPSIZE; ii++) if (fabsf(c[ii]-cc[ii])>1.5e-5){fprintf(stderr,"mismatch %d %f != %f: %g\n",ii,c[ii],cc[ii],fabsf(c[ii]-cc[ii]));}
end();
time1 = getsec();
timeg = time1/loops;
fprintf(stderr,
" %10.2f MFlops %10.6f sec\n",
COMPSIZE * COMPSIZE * 2. * (double)k * (double)m * (double)n / timeg * 1.e-6, time1);
}
return 0;
}
// void main(int argc, char *argv[]) __attribute__((weak, alias("MAIN__")));
+3 -1
View File
@@ -1,3 +1,4 @@
//#pragma clang optimize off
/***************************************************************************
Copyright (c) 2014, The OpenBLAS Project
All rights reserved.
@@ -45,6 +46,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define IFLOAT hfloat16
#else
#define GEMM BLASFUNC(sgemm)
#undef IFLOAT
#define IFLOAT float
#endif
@@ -186,7 +188,7 @@ int main(int argc, char *argv[]){
timeg = time1/loops;
fprintf(stderr,
" %10.2f MFlops %10.6f sec\n",
" %10.2lf MFlops %10.6f sec\n",
COMPSIZE * COMPSIZE * 2. * (double)k * (double)m * (double)n / timeg * 1.e-6, time1);
}
+1 -1
View File
@@ -236,7 +236,7 @@ def test_gesdd(benchmark, mn, variant):
assert info == 0
atol = {'s': 1e-5, 'd': 1e-13}
atol = {'s': 5e-5, 'd': 1e-13}
np.testing.assert_allclose(u @ np.diag(s) @ vt, a, atol=atol[variant])
+12 -6
View File
@@ -23,6 +23,7 @@ config="$2"
compiler_name="$3"
shift 3
flags="$*"
darwin_os=""
# First, we need to know the target OS and compiler name
{
@@ -69,7 +70,7 @@ case "$data" in *OS_FREEBSD*) os=FreeBSD ;; esac
case "$data" in *OS_NETBSD*) os=NetBSD ;; esac
case "$data" in *OS_OPENBSD*) os=OpenBSD ;; esac
case "$data" in *OS_DRAGONFLY*) os=DragonFly ;; esac
case "$data" in *OS_DARWIN*) os=Darwin ;; esac
case "$data" in *OS_DARWIN*) os=Darwin; darwin_os=macOS ;; esac
case "$data" in *OS_SUNOS*) os=SunOS ;; esac
case "$data" in *OS_AIX*) os=AIX ;; esac
case "$data" in *OS_OSF*) os=osf ;; esac
@@ -78,6 +79,7 @@ case "$data" in *OS_CYGWIN_NT*) os=CYGWIN_NT ;; esac
case "$data" in *OS_INTERIX*) os=Interix ;; esac
case "$data" in *OS_ANDROID*) os=Android ;; esac
case "$data" in *OS_HAIKU*) os=Haiku ;; esac
case "$data" in *OS_IOS*) darwin_os=iOS ;; esac
case "$data" in
*ARCH_X86_64*) architecture=x86_64 ;;
@@ -95,6 +97,7 @@ case "$data" in
*ARCH_RISCV64*) architecture=riscv64 ;;
*ARCH_LOONGARCH64*) architecture=loongarch64 ;;
*ARCH_CSKY*) architecture=csky ;;
*ARCH_WASM*) architecture=wasm ;;
esac
defined=0
@@ -128,7 +131,7 @@ case "$architecture" in
defined=1
;;
arm|arm64) defined=1 ;;
zarch|e2k|alpha|ia64|riscv64|loonarch64)
zarch|e2k|alpha|ia64|riscv64|loongarch64|wasm)
defined=1
BINARY=64
;;
@@ -252,6 +255,7 @@ case "$data" in
*ARCH_ZARCH*) architecture=zarch ;;
*ARCH_LOONGARCH64*) architecture=loongarch64 ;;
*ARCH_CSKY*) architecture=csky ;;
*ARCH_WASM*) architecture=wasm ;;
esac
binformat='bin32'
@@ -338,8 +342,8 @@ no_sme=0
is_appleclang=0
if [ "$architecture" = "arm64" ]; then
if [ "$compiler" = "CLANG" ]; then
data=`$compiler_name --version`
case "$data" in Apple*)
vdata=`$compiler_name --version`
case "$vdata" in Apple*)
is_appleclang=1
esac
fi
@@ -400,7 +404,7 @@ fi
data=`$compiler_name $flags -S ctest1.c && grep globl ctest1.s | head -n 1 && rm -f ctest1.s`
need_fu=''
if echo "$data" | grep 'globl[[:space:]][_\.]'; then
if echo "$data" | grep -q 'globl[[:space:]][_\.]'; then
need_fu="${data##*globl[[:space:]]}"
need_fu="${need_fu%%[!_\.]*}"
fi
@@ -417,6 +421,8 @@ fi
[ "$os" = "Android" ] && [ "$hostos" = "Linux" ] && [ -n "$TERMUX_APP_PID" ] \
&& cross=0
[ "$darwin_os" = iOS ] && cross=1
[ "$USE_OPENMP" != 1 ] && openmp=''
linker_L=""
@@ -483,11 +489,11 @@ done
:> "$makefile" || exit 1
:> "$config" || exit 1
# print $data, "\n";
{
printf "OSNAME=%s\n" "$os"
[ -n "$darwin_os" ] && printf "OSNAME_DISPLAY=%s\n" "$darwin_os"
printf "ARCH=%s\n" "$architecture"
printf "C_COMPILER=%s\n" "$compiler"
[ $binformat != 'bin32' ] && printf "BINARY32=\n"
+10 -1
View File
@@ -56,6 +56,7 @@ if ($@){
}
$compiler = "";
$darwin_os = "";
$compiler = LSB if ($data =~ /COMPILER_LSB/);
$compiler = CLANG if ($data =~ /COMPILER_CLANG/);
$compiler = PGI if ($data =~ /COMPILER_PGI/);
@@ -73,7 +74,13 @@ $os = FreeBSD if ($data =~ /OS_FREEBSD/);
$os = NetBSD if ($data =~ /OS_NETBSD/);
$os = OpenBSD if ($data =~ /OS_OPENBSD/);
$os = DragonFly if ($data =~ /OS_DRAGONFLY/);
$os = Darwin if ($data =~ /OS_DARWIN/);
if ($data =~ /OS_DARWIN/) {
$os = Darwin;
$darwin_os = "macOS";
}
if ($data =~ /OS_IOS/) {
$darwin_os = "iOS";
}
$os = SunOS if ($data =~ /OS_SUNOS/);
$os = AIX if ($data =~ /OS_AIX/);
$os = osf if ($data =~ /OS_OSF/);
@@ -391,6 +398,7 @@ if ($architecture ne $hostarch) {
$cross = 1 if ($os ne $hostos);
$cross = 0 if (($os eq "Android") && ($hostos eq "Linux") && ($ENV{TERMUX_APP_PID} != ""));
$cross = 1 if $darwin_os eq "iOS";
$openmp = "" if $ENV{USE_OPENMP} != 1;
@@ -454,6 +462,7 @@ open(CONFFILE, "> $config" ) || die "Can't create $config";
# print $data, "\n";
print MAKEFILE "OSNAME=$os\n";
print MAKEFILE "OSNAME_DISPLAY=$darwin_os\n" if $darwin_os ne "";
print MAKEFILE "ARCH=$architecture\n";
print MAKEFILE "C_COMPILER=$compiler\n";
print MAKEFILE "BINARY32=\n" if $binformat ne bin32;
+266 -231
View File
@@ -38,36 +38,71 @@ extern "C" {
#endif /* __cplusplus */
/*Set the number of threads on runtime.*/
void openblas_set_num_threads(int num_threads);
void goto_set_num_threads(int num_threads);
int openblas_set_num_threads_local(int num_threads);
OPENBLAS_EXPORT void openblas_set_num_threads(int num_threads);
OPENBLAS_EXPORT void goto_set_num_threads(int num_threads);
OPENBLAS_EXPORT int openblas_set_num_threads_local(int num_threads);
/*Get the number of threads on runtime.*/
int openblas_get_num_threads(void);
OPENBLAS_EXPORT int openblas_get_num_threads(void);
/*Get the number of physical processors (cores).*/
int openblas_get_num_procs(void);
OPENBLAS_EXPORT int openblas_get_num_procs(void);
/*Get the build configure on runtime.*/
char* openblas_get_config(void);
OPENBLAS_EXPORT char* openblas_get_config(void);
/*Get the CPU corename on runtime.*/
char* openblas_get_corename(void);
OPENBLAS_EXPORT char* openblas_get_corename(void);
/*Set the threading backend to a custom callback.*/
typedef void (*openblas_dojob_callback)(int thread_num, void *jobdata, int dojob_data);
typedef void (*openblas_threads_callback)(int sync, openblas_dojob_callback dojob, int numjobs, size_t jobdata_elsize, void *jobdata, int dojob_data);
void openblas_set_threads_callback_function(openblas_threads_callback callback);
OPENBLAS_EXPORT void openblas_set_threads_callback_function(openblas_threads_callback callback);
/* Replace the XERBLA handler for this OpenBLAS instance and return the
* previous handler. Passing NULL restores the default. Callbacks may run
* concurrently and must be thread-safe. The name and info pointers are valid
* only during the callback; name spans name_length bytes and need not be
* NUL-terminated. Replacement is thread-safe but does not wait for in-flight
* calls, so the previous handler must remain loaded until they complete. */
#ifndef OPENBLAS_XERBLA_HANDLER_DEFINED
#define OPENBLAS_XERBLA_HANDLER_DEFINED
typedef void (*openblas_xerbla_handler)(const char *name,
const blasint *info,
size_t name_length);
#endif
OPENBLAS_EXPORT openblas_xerbla_handler openblas_set_xerbla(openblas_xerbla_handler handler);
/* Cooperative cancellation of in-flight operations.
*
* Every thread owns a pointer-sized generation slot;
* openblas_cancel_token() returns its (stable) address for the calling
* thread. Supported compute drivers (currently the level-3 GEMM drivers)
* advance the slot to a fresh even generation at operation entry on the
* issuing thread and poll it during the computation. To cancel the
* operation in flight on a thread, load that thread's slot value, verify
* the operation you mean to cancel is still the current one, and call
* openblas_cancel(token, loaded_value): the cancel bit (bit 0) is set iff
* the slot still holds the loaded value, so stale requests cannot affect
* later operations. A cancelled operation leaves its output in an
* unspecified, partially-updated state; the caller must discard the
* result. The library itself stays consistent and can service further
* calls. openblas_cancel_token() may return NULL if per-thread state
* cannot be allocated; cancellation is then unavailable on that thread
* (openblas_cancel(NULL, ...) is a harmless no-op). These symbols are
* exported without any symbol prefix/suffix decoration. */
size_t *openblas_cancel_token(void);
OPENBLAS_EXPORT void openblas_cancel(size_t *token, size_t loaded_token);
#ifdef OPENBLAS_OS_LINUX
/* Sets thread affinity for OpenBLAS threads. `thread_idx` is in [0, openblas_get_num_threads()-1]. */
int openblas_setaffinity(int thread_idx, size_t cpusetsize, cpu_set_t* cpu_set);
OPENBLAS_EXPORT int openblas_setaffinity(int thread_idx, size_t cpusetsize, cpu_set_t* cpu_set);
/* Queries thread affinity for OpenBLAS threads. `thread_idx` is in [0, openblas_get_num_threads()-1]. */
int openblas_getaffinity(int thread_idx, size_t cpusetsize, cpu_set_t* cpu_set);
OPENBLAS_EXPORT int openblas_getaffinity(int thread_idx, size_t cpusetsize, cpu_set_t* cpu_set);
#endif
/* Get the parallelization type which is used by OpenBLAS */
int openblas_get_parallel(void);
OPENBLAS_EXPORT int openblas_get_parallel(void);
/* OpenBLAS is compiled for sequential use */
#define OPENBLAS_SEQUENTIAL 0
/* OpenBLAS is compiled using normal threading model */
@@ -94,400 +129,400 @@ typedef enum CBLAS_DIAG {CblasNonUnit=131, CblasUnit=132} CBLAS_DIAG;
typedef enum CBLAS_SIDE {CblasLeft=141, CblasRight=142} CBLAS_SIDE;
typedef CBLAS_ORDER CBLAS_LAYOUT;
float cblas_sdsdot(OPENBLAS_CONST blasint n, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST float *y, OPENBLAS_CONST blasint incy);
double cblas_dsdot (OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST float *y, OPENBLAS_CONST blasint incy);
float cblas_sdot(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST float *y, OPENBLAS_CONST blasint incy);
double cblas_ddot(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST double *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT float cblas_sdsdot(OPENBLAS_CONST blasint n, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST float *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT double cblas_dsdot (OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST float *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT float cblas_sdot(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST float *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT double cblas_ddot(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST double *y, OPENBLAS_CONST blasint incy);
openblas_complex_float cblas_cdotu(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy);
openblas_complex_float cblas_cdotc(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy);
openblas_complex_double cblas_zdotu(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy);
openblas_complex_double cblas_zdotc(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT openblas_complex_float cblas_cdotu(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT openblas_complex_float cblas_cdotc(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT openblas_complex_double cblas_zdotu(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT openblas_complex_double cblas_zdotc(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy);
void cblas_cdotu_sub(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy, void *ret);
void cblas_cdotc_sub(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy, void *ret);
void cblas_zdotu_sub(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy, void *ret);
void cblas_zdotc_sub(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy, void *ret);
OPENBLAS_EXPORT void cblas_cdotu_sub(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy, void *ret);
OPENBLAS_EXPORT void cblas_cdotc_sub(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy, void *ret);
OPENBLAS_EXPORT void cblas_zdotu_sub(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy, void *ret);
OPENBLAS_EXPORT void cblas_zdotc_sub(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *y, OPENBLAS_CONST blasint incy, void *ret);
float cblas_sasum (OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
double cblas_dasum (OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
float cblas_scasum(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
double cblas_dzasum(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT float cblas_sasum (OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT double cblas_dasum (OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT float cblas_scasum(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT double cblas_dzasum(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
float cblas_ssum (OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
double cblas_dsum (OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
float cblas_scsum(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
double cblas_dzsum(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT float cblas_ssum (OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT double cblas_dsum (OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT float cblas_scsum(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT double cblas_dzsum(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
float cblas_snrm2 (OPENBLAS_CONST blasint N, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX);
double cblas_dnrm2 (OPENBLAS_CONST blasint N, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX);
float cblas_scnrm2(OPENBLAS_CONST blasint N, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX);
double cblas_dznrm2(OPENBLAS_CONST blasint N, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT float cblas_snrm2 (OPENBLAS_CONST blasint N, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT double cblas_dnrm2 (OPENBLAS_CONST blasint N, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT float cblas_scnrm2(OPENBLAS_CONST blasint N, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT double cblas_dznrm2(OPENBLAS_CONST blasint N, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX);
CBLAS_INDEX cblas_isamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_idamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_icamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_izamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_isamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_idamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_icamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_izamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_isamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_idamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_icamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_izamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_isamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_idamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_icamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_izamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
float cblas_samax(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
double cblas_damax(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
float cblas_scamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
double cblas_dzamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT float cblas_samax(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT double cblas_damax(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT float cblas_scamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT double cblas_dzamax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
float cblas_samin(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
double cblas_damin(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
float cblas_scamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
double cblas_dzamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT float cblas_samin(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT double cblas_damin(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT float cblas_scamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT double cblas_dzamin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_ismax(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_idmax(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_icmax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_izmax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_ismax(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_idmax(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_icmax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_izmax(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_ismin(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_idmin(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_icmin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
CBLAS_INDEX cblas_izmin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_ismin(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_idmin(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_icmin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
OPENBLAS_EXPORT CBLAS_INDEX cblas_izmin(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx);
void cblas_saxpy(OPENBLAS_CONST blasint n, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, float *y, OPENBLAS_CONST blasint incy);
void cblas_daxpy(OPENBLAS_CONST blasint n, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx, double *y, OPENBLAS_CONST blasint incy);
void cblas_caxpy(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
void cblas_zaxpy(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_saxpy(OPENBLAS_CONST blasint n, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, float *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_daxpy(OPENBLAS_CONST blasint n, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx, double *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_caxpy(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_zaxpy(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
void cblas_caxpyc(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
void cblas_zaxpyc(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_caxpyc(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_zaxpyc(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
void cblas_scopy(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, float *y, OPENBLAS_CONST blasint incy);
void cblas_dcopy(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx, double *y, OPENBLAS_CONST blasint incy);
void cblas_ccopy(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
void cblas_zcopy(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_scopy(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, float *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_dcopy(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx, double *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_ccopy(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_zcopy(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
void cblas_sswap(OPENBLAS_CONST blasint n, float *x, OPENBLAS_CONST blasint incx, float *y, OPENBLAS_CONST blasint incy);
void cblas_dswap(OPENBLAS_CONST blasint n, double *x, OPENBLAS_CONST blasint incx, double *y, OPENBLAS_CONST blasint incy);
void cblas_cswap(OPENBLAS_CONST blasint n, void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
void cblas_zswap(OPENBLAS_CONST blasint n, void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_sswap(OPENBLAS_CONST blasint n, float *x, OPENBLAS_CONST blasint incx, float *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_dswap(OPENBLAS_CONST blasint n, double *x, OPENBLAS_CONST blasint incx, double *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_cswap(OPENBLAS_CONST blasint n, void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_zswap(OPENBLAS_CONST blasint n, void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incy);
void cblas_srot(OPENBLAS_CONST blasint N, float *X, OPENBLAS_CONST blasint incX, float *Y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST float c, OPENBLAS_CONST float s);
void cblas_drot(OPENBLAS_CONST blasint N, double *X, OPENBLAS_CONST blasint incX, double *Y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST double c, OPENBLAS_CONST double s);
void cblas_csrot(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST float c, OPENBLAS_CONST float s);
void cblas_zdrot(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST double c, OPENBLAS_CONST double s);
OPENBLAS_EXPORT void cblas_srot(OPENBLAS_CONST blasint N, float *X, OPENBLAS_CONST blasint incX, float *Y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST float c, OPENBLAS_CONST float s);
OPENBLAS_EXPORT void cblas_drot(OPENBLAS_CONST blasint N, double *X, OPENBLAS_CONST blasint incX, double *Y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST double c, OPENBLAS_CONST double s);
OPENBLAS_EXPORT void cblas_csrot(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST float c, OPENBLAS_CONST float s);
OPENBLAS_EXPORT void cblas_zdrot(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, void *y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST double c, OPENBLAS_CONST double s);
void cblas_srotg(float *a, float *b, float *c, float *s);
void cblas_drotg(double *a, double *b, double *c, double *s);
void cblas_crotg(void *a, void *b, float *c, void *s);
void cblas_zrotg(void *a, void *b, double *c, void *s);
OPENBLAS_EXPORT void cblas_srotg(float *a, float *b, float *c, float *s);
OPENBLAS_EXPORT void cblas_drotg(double *a, double *b, double *c, double *s);
OPENBLAS_EXPORT void cblas_crotg(void *a, void *b, float *c, void *s);
OPENBLAS_EXPORT void cblas_zrotg(void *a, void *b, double *c, void *s);
void cblas_srotm(OPENBLAS_CONST blasint N, float *X, OPENBLAS_CONST blasint incX, float *Y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST float *P);
void cblas_drotm(OPENBLAS_CONST blasint N, double *X, OPENBLAS_CONST blasint incX, double *Y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST double *P);
OPENBLAS_EXPORT void cblas_srotm(OPENBLAS_CONST blasint N, float *X, OPENBLAS_CONST blasint incX, float *Y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST float *P);
OPENBLAS_EXPORT void cblas_drotm(OPENBLAS_CONST blasint N, double *X, OPENBLAS_CONST blasint incX, double *Y, OPENBLAS_CONST blasint incY, OPENBLAS_CONST double *P);
void cblas_srotmg(float *d1, float *d2, float *b1, OPENBLAS_CONST float b2, float *P);
void cblas_drotmg(double *d1, double *d2, double *b1, OPENBLAS_CONST double b2, double *P);
OPENBLAS_EXPORT void cblas_srotmg(float *d1, float *d2, float *b1, OPENBLAS_CONST float b2, float *P);
OPENBLAS_EXPORT void cblas_drotmg(double *d1, double *d2, double *b1, OPENBLAS_CONST double b2, double *P);
void cblas_sscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, float *X, OPENBLAS_CONST blasint incX);
void cblas_dscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, double *X, OPENBLAS_CONST blasint incX);
void cblas_cscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, void *X, OPENBLAS_CONST blasint incX);
void cblas_zscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, void *X, OPENBLAS_CONST blasint incX);
void cblas_csscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, void *X, OPENBLAS_CONST blasint incX);
void cblas_zdscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, void *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_sscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, float *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_dscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, double *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_cscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, void *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_zscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, void *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_csscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, void *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_zdscal(OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, void *X, OPENBLAS_CONST blasint incX);
void cblas_sgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n,
OPENBLAS_EXPORT void cblas_sgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n,
OPENBLAS_CONST float alpha, OPENBLAS_CONST float *a, OPENBLAS_CONST blasint lda, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST float beta, float *y, OPENBLAS_CONST blasint incy);
void cblas_dgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n,
OPENBLAS_EXPORT void cblas_dgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n,
OPENBLAS_CONST double alpha, OPENBLAS_CONST double *a, OPENBLAS_CONST blasint lda, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST double beta, double *y, OPENBLAS_CONST blasint incy);
void cblas_cgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n,
OPENBLAS_EXPORT void cblas_cgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *a, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *beta, void *y, OPENBLAS_CONST blasint incy);
void cblas_zgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n,
OPENBLAS_EXPORT void cblas_zgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *a, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST void *beta, void *y, OPENBLAS_CONST blasint incy);
void cblas_sger (OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST float *Y, OPENBLAS_CONST blasint incY, float *A, OPENBLAS_CONST blasint lda);
void cblas_dger (OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST double *Y, OPENBLAS_CONST blasint incY, double *A, OPENBLAS_CONST blasint lda);
void cblas_cgeru(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *A, OPENBLAS_CONST blasint lda);
void cblas_cgerc(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *A, OPENBLAS_CONST blasint lda);
void cblas_zgeru(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *A, OPENBLAS_CONST blasint lda);
void cblas_zgerc(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *A, OPENBLAS_CONST blasint lda);
OPENBLAS_EXPORT void cblas_sger (OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST float *Y, OPENBLAS_CONST blasint incY, float *A, OPENBLAS_CONST blasint lda);
OPENBLAS_EXPORT void cblas_dger (OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST double *Y, OPENBLAS_CONST blasint incY, double *A, OPENBLAS_CONST blasint lda);
OPENBLAS_EXPORT void cblas_cgeru(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *A, OPENBLAS_CONST blasint lda);
OPENBLAS_EXPORT void cblas_cgerc(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *A, OPENBLAS_CONST blasint lda);
OPENBLAS_EXPORT void cblas_zgeru(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *A, OPENBLAS_CONST blasint lda);
OPENBLAS_EXPORT void cblas_zgerc(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *A, OPENBLAS_CONST blasint lda);
void cblas_strsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, float *X, OPENBLAS_CONST blasint incX);
void cblas_dtrsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, double *X, OPENBLAS_CONST blasint incX);
void cblas_ctrsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
void cblas_ztrsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_strsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, float *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_dtrsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, double *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_ctrsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_ztrsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
void cblas_strmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, float *X, OPENBLAS_CONST blasint incX);
void cblas_dtrmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, double *X, OPENBLAS_CONST blasint incX);
void cblas_ctrmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
void cblas_ztrmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_strmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, float *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_dtrmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, double *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_ctrmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
OPENBLAS_EXPORT void cblas_ztrmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
void cblas_ssyr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, float *A, OPENBLAS_CONST blasint lda);
void cblas_dsyr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, double *A, OPENBLAS_CONST blasint lda);
void cblas_cher(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, void *A, OPENBLAS_CONST blasint lda);
void cblas_zher(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, void *A, OPENBLAS_CONST blasint lda);
OPENBLAS_EXPORT void cblas_ssyr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, float *A, OPENBLAS_CONST blasint lda);
OPENBLAS_EXPORT void cblas_dsyr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, double *A, OPENBLAS_CONST blasint lda);
OPENBLAS_EXPORT void cblas_cher(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, void *A, OPENBLAS_CONST blasint lda);
OPENBLAS_EXPORT void cblas_zher(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, void *A, OPENBLAS_CONST blasint lda);
void cblas_ssyr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo,OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *X,
OPENBLAS_EXPORT void cblas_ssyr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo,OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *X,
OPENBLAS_CONST blasint incX, OPENBLAS_CONST float *Y, OPENBLAS_CONST blasint incY, float *A, OPENBLAS_CONST blasint lda);
void cblas_dsyr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *X,
OPENBLAS_EXPORT void cblas_dsyr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *X,
OPENBLAS_CONST blasint incX, OPENBLAS_CONST double *Y, OPENBLAS_CONST blasint incY, double *A, OPENBLAS_CONST blasint lda);
void cblas_cher2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX,
OPENBLAS_EXPORT void cblas_cher2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX,
OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *A, OPENBLAS_CONST blasint lda);
void cblas_zher2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX,
OPENBLAS_EXPORT void cblas_zher2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX,
OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *A, OPENBLAS_CONST blasint lda);
void cblas_sgbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_sgbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_CONST blasint KL, OPENBLAS_CONST blasint KU, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST float beta, float *Y, OPENBLAS_CONST blasint incY);
void cblas_dgbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_dgbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_CONST blasint KL, OPENBLAS_CONST blasint KU, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST double beta, double *Y, OPENBLAS_CONST blasint incY);
void cblas_cgbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_cgbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_CONST blasint KL, OPENBLAS_CONST blasint KU, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *beta, void *Y, OPENBLAS_CONST blasint incY);
void cblas_zgbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_zgbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_CONST blasint KL, OPENBLAS_CONST blasint KU, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *beta, void *Y, OPENBLAS_CONST blasint incY);
void cblas_ssbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A,
OPENBLAS_EXPORT void cblas_ssbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A,
OPENBLAS_CONST blasint lda, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST float beta, float *Y, OPENBLAS_CONST blasint incY);
void cblas_dsbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A,
OPENBLAS_EXPORT void cblas_dsbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A,
OPENBLAS_CONST blasint lda, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST double beta, double *Y, OPENBLAS_CONST blasint incY);
void cblas_stbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_stbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, float *X, OPENBLAS_CONST blasint incX);
void cblas_dtbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_dtbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, double *X, OPENBLAS_CONST blasint incX);
void cblas_ctbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_ctbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
void cblas_ztbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_ztbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
void cblas_stbsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_stbsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, float *X, OPENBLAS_CONST blasint incX);
void cblas_dtbsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_dtbsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, double *X, OPENBLAS_CONST blasint incX);
void cblas_ctbsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_ctbsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
void cblas_ztbsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_ztbsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *X, OPENBLAS_CONST blasint incX);
void cblas_stpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_stpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST float *Ap, float *X, OPENBLAS_CONST blasint incX);
void cblas_dtpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_dtpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST double *Ap, double *X, OPENBLAS_CONST blasint incX);
void cblas_ctpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_ctpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST void *Ap, void *X, OPENBLAS_CONST blasint incX);
void cblas_ztpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_ztpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST void *Ap, void *X, OPENBLAS_CONST blasint incX);
void cblas_stpsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_stpsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST float *Ap, float *X, OPENBLAS_CONST blasint incX);
void cblas_dtpsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_dtpsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST double *Ap, double *X, OPENBLAS_CONST blasint incX);
void cblas_ctpsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_ctpsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST void *Ap, void *X, OPENBLAS_CONST blasint incX);
void cblas_ztpsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_EXPORT void cblas_ztpsv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_DIAG Diag,
OPENBLAS_CONST blasint N, OPENBLAS_CONST void *Ap, void *X, OPENBLAS_CONST blasint incX);
void cblas_ssymv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A,
OPENBLAS_EXPORT void cblas_ssymv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A,
OPENBLAS_CONST blasint lda, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST float beta, float *Y, OPENBLAS_CONST blasint incY);
void cblas_dsymv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A,
OPENBLAS_EXPORT void cblas_dsymv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A,
OPENBLAS_CONST blasint lda, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST double beta, double *Y, OPENBLAS_CONST blasint incY);
void cblas_chemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A,
OPENBLAS_EXPORT void cblas_chemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A,
OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *beta, void *Y, OPENBLAS_CONST blasint incY);
void cblas_zhemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A,
OPENBLAS_EXPORT void cblas_zhemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A,
OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *beta, void *Y, OPENBLAS_CONST blasint incY);
void cblas_sspmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *Ap,
OPENBLAS_EXPORT void cblas_sspmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *Ap,
OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST float beta, float *Y, OPENBLAS_CONST blasint incY);
void cblas_dspmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *Ap,
OPENBLAS_EXPORT void cblas_dspmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *Ap,
OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST double beta, double *Y, OPENBLAS_CONST blasint incY);
void cblas_sspr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, float *Ap);
void cblas_dspr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, double *Ap);
OPENBLAS_EXPORT void cblas_sspr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, float *Ap);
OPENBLAS_EXPORT void cblas_dspr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, double *Ap);
void cblas_chpr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, void *A);
void cblas_zhpr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST void *X,OPENBLAS_CONST blasint incX, void *A);
OPENBLAS_EXPORT void cblas_chpr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, void *A);
OPENBLAS_EXPORT void cblas_zhpr(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST void *X,OPENBLAS_CONST blasint incX, void *A);
void cblas_sspr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST float *Y, OPENBLAS_CONST blasint incY, float *A);
void cblas_dspr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST double *Y, OPENBLAS_CONST blasint incY, double *A);
void cblas_chpr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *Ap);
void cblas_zhpr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *Ap);
OPENBLAS_EXPORT void cblas_sspr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST float *Y, OPENBLAS_CONST blasint incY, float *A);
OPENBLAS_EXPORT void cblas_dspr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST double *Y, OPENBLAS_CONST blasint incY, double *A);
OPENBLAS_EXPORT void cblas_chpr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *Ap);
OPENBLAS_EXPORT void cblas_zhpr2(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *Y, OPENBLAS_CONST blasint incY, void *Ap);
void cblas_chbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_chbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *beta, void *Y, OPENBLAS_CONST blasint incY);
void cblas_zhbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_zhbmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *beta, void *Y, OPENBLAS_CONST blasint incY);
void cblas_chpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_chpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *Ap, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *beta, void *Y, OPENBLAS_CONST blasint incY);
void cblas_zhpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_zhpmv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint N,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *Ap, OPENBLAS_CONST void *X, OPENBLAS_CONST blasint incX, OPENBLAS_CONST void *beta, void *Y, OPENBLAS_CONST blasint incY);
void cblas_sgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_sgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST float *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST float beta, float *C, OPENBLAS_CONST blasint ldc);
void cblas_dgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_dgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST double *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST double beta, double *C, OPENBLAS_CONST blasint ldc);
void cblas_cgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_cgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_cgemm3m(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_cgemm3m(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_zgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_zgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_zgemm3m(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_zgemm3m(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_sgemmt(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_sgemmt(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint K,
OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST float *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST float beta, float *C, OPENBLAS_CONST blasint ldc);
void cblas_dgemmt(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_dgemmt(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint K,
OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST double *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST double beta, double *C, OPENBLAS_CONST blasint ldc);
void cblas_cgemmt(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_cgemmt(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint K,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_zgemmt(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_zgemmt(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint K,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_ssymm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_ssymm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST float *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST float beta, float *C, OPENBLAS_CONST blasint ldc);
void cblas_dsymm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_dsymm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST double *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST double beta, double *C, OPENBLAS_CONST blasint ldc);
void cblas_csymm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_csymm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_zsymm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_zsymm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_ssyrk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_EXPORT void cblas_ssyrk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST float beta, float *C, OPENBLAS_CONST blasint ldc);
void cblas_dsyrk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_EXPORT void cblas_dsyrk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST double beta, double *C, OPENBLAS_CONST blasint ldc);
void cblas_csyrk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_EXPORT void cblas_csyrk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_zsyrk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_EXPORT void cblas_zsyrk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_ssyr2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_EXPORT void cblas_ssyr2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST float *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST float beta, float *C, OPENBLAS_CONST blasint ldc);
void cblas_dsyr2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_EXPORT void cblas_dsyr2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST double *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST double beta, double *C, OPENBLAS_CONST blasint ldc);
void cblas_csyr2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_EXPORT void cblas_csyr2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_zsyr2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_EXPORT void cblas_zsyr2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans,
OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_strmm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_EXPORT void cblas_strmm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, float *B, OPENBLAS_CONST blasint ldb);
void cblas_dtrmm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_EXPORT void cblas_dtrmm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, double *B, OPENBLAS_CONST blasint ldb);
void cblas_ctrmm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_EXPORT void cblas_ctrmm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *B, OPENBLAS_CONST blasint ldb);
void cblas_ztrmm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_EXPORT void cblas_ztrmm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *B, OPENBLAS_CONST blasint ldb);
void cblas_strsm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_EXPORT void cblas_strsm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, float *B, OPENBLAS_CONST blasint ldb);
void cblas_dtrsm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_EXPORT void cblas_dtrsm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *A, OPENBLAS_CONST blasint lda, double *B, OPENBLAS_CONST blasint ldb);
void cblas_ctrsm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_EXPORT void cblas_ctrsm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *B, OPENBLAS_CONST blasint ldb);
void cblas_ztrsm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_EXPORT void cblas_ztrsm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA,
OPENBLAS_CONST enum CBLAS_DIAG Diag, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, void *B, OPENBLAS_CONST blasint ldb);
void cblas_chemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_chemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_zhemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_EXPORT void cblas_zhemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_SIDE Side, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST void *beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_cherk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_cherk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST float alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST float beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_zherk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_zherk(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST double alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST double beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_cher2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_cher2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST float beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_zher2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_zher2k(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_UPLO Uplo, OPENBLAS_CONST enum CBLAS_TRANSPOSE Trans, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST void *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST double beta, void *C, OPENBLAS_CONST blasint ldc);
void cblas_xerbla(blasint p, OPENBLAS_CONST char *rout, OPENBLAS_CONST char *form, ...);
OPENBLAS_EXPORT void cblas_xerbla(blasint p, OPENBLAS_CONST char *rout, OPENBLAS_CONST char *form, ...);
/*** BLAS extensions ***/
void cblas_saxpby(OPENBLAS_CONST blasint n, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx,OPENBLAS_CONST float beta, float *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_saxpby(OPENBLAS_CONST blasint n, OPENBLAS_CONST float alpha, OPENBLAS_CONST float *x, OPENBLAS_CONST blasint incx,OPENBLAS_CONST float beta, float *y, OPENBLAS_CONST blasint incy);
void cblas_daxpby(OPENBLAS_CONST blasint n, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx,OPENBLAS_CONST double beta, double *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_daxpby(OPENBLAS_CONST blasint n, OPENBLAS_CONST double alpha, OPENBLAS_CONST double *x, OPENBLAS_CONST blasint incx,OPENBLAS_CONST double beta, double *y, OPENBLAS_CONST blasint incy);
void cblas_caxpby(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx,OPENBLAS_CONST void *beta, void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_caxpby(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx,OPENBLAS_CONST void *beta, void *y, OPENBLAS_CONST blasint incy);
void cblas_zaxpby(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx,OPENBLAS_CONST void *beta, void *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_zaxpby(OPENBLAS_CONST blasint n, OPENBLAS_CONST void *alpha, OPENBLAS_CONST void *x, OPENBLAS_CONST blasint incx,OPENBLAS_CONST void *beta, void *y, OPENBLAS_CONST blasint incy);
void cblas_somatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float calpha, OPENBLAS_CONST float *a,
OPENBLAS_EXPORT void cblas_somatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float calpha, OPENBLAS_CONST float *a,
OPENBLAS_CONST blasint clda, float *b, OPENBLAS_CONST blasint cldb);
void cblas_domatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double calpha, OPENBLAS_CONST double *a,
OPENBLAS_EXPORT void cblas_domatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double calpha, OPENBLAS_CONST double *a,
OPENBLAS_CONST blasint clda, double *b, OPENBLAS_CONST blasint cldb);
void cblas_comatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float* calpha, OPENBLAS_CONST float* a,
OPENBLAS_EXPORT void cblas_comatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float* calpha, OPENBLAS_CONST float* a,
OPENBLAS_CONST blasint clda, float*b, OPENBLAS_CONST blasint cldb);
void cblas_zomatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double* calpha, OPENBLAS_CONST double* a,
OPENBLAS_EXPORT void cblas_zomatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double* calpha, OPENBLAS_CONST double* a,
OPENBLAS_CONST blasint clda, double *b, OPENBLAS_CONST blasint cldb);
void cblas_simatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float calpha, float *a,
OPENBLAS_EXPORT void cblas_simatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float calpha, float *a,
OPENBLAS_CONST blasint clda, OPENBLAS_CONST blasint cldb);
void cblas_dimatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double calpha, double *a,
OPENBLAS_EXPORT void cblas_dimatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double calpha, double *a,
OPENBLAS_CONST blasint clda, OPENBLAS_CONST blasint cldb);
void cblas_cimatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float* calpha, float* a,
OPENBLAS_EXPORT void cblas_cimatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float* calpha, float* a,
OPENBLAS_CONST blasint clda, OPENBLAS_CONST blasint cldb);
void cblas_zimatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double* calpha, double* a,
OPENBLAS_EXPORT void cblas_zimatcopy(OPENBLAS_CONST enum CBLAS_ORDER CORDER, OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS, OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double* calpha, double* a,
OPENBLAS_CONST blasint clda, OPENBLAS_CONST blasint cldb);
void cblas_sgeadd(OPENBLAS_CONST enum CBLAS_ORDER CORDER,OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float calpha, OPENBLAS_CONST float *a, OPENBLAS_CONST blasint clda, OPENBLAS_CONST float cbeta,
float *c, OPENBLAS_CONST blasint cldc);
void cblas_dgeadd(OPENBLAS_CONST enum CBLAS_ORDER CORDER,OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double calpha, OPENBLAS_CONST double *a, OPENBLAS_CONST blasint clda, OPENBLAS_CONST double cbeta,
OPENBLAS_EXPORT void cblas_sgeadd(OPENBLAS_CONST enum CBLAS_ORDER CORDER,OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS_A,OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS_C,OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float calpha, OPENBLAS_CONST float *a, OPENBLAS_CONST blasint clda,OPENBLAS_CONST float cbeta, float *c,
OPENBLAS_CONST blasint cldc);
OPENBLAS_EXPORT void cblas_dgeadd(OPENBLAS_CONST enum CBLAS_ORDER CORDER,OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS_A,OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS_C,OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double calpha, OPENBLAS_CONST double *a, OPENBLAS_CONST blasint clda, OPENBLAS_CONST double cbeta,
double *c, OPENBLAS_CONST blasint cldc);
void cblas_cgeadd(OPENBLAS_CONST enum CBLAS_ORDER CORDER,OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float *calpha, OPENBLAS_CONST float *a, OPENBLAS_CONST blasint clda, OPENBLAS_CONST float *cbeta,
OPENBLAS_EXPORT void cblas_cgeadd(OPENBLAS_CONST enum CBLAS_ORDER CORDER,OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS_A,OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS_C,OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST float *calpha, OPENBLAS_CONST float *a, OPENBLAS_CONST blasint clda, OPENBLAS_CONST float *cbeta,
float *c, OPENBLAS_CONST blasint cldc);
void cblas_zgeadd(OPENBLAS_CONST enum CBLAS_ORDER CORDER,OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double *calpha, OPENBLAS_CONST double *a, OPENBLAS_CONST blasint clda, OPENBLAS_CONST double *cbeta,
OPENBLAS_EXPORT void cblas_zgeadd(OPENBLAS_CONST enum CBLAS_ORDER CORDER,OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS_A,OPENBLAS_CONST enum CBLAS_TRANSPOSE CTRANS_C,OPENBLAS_CONST blasint crows, OPENBLAS_CONST blasint ccols, OPENBLAS_CONST double *calpha, OPENBLAS_CONST double *a, OPENBLAS_CONST blasint clda, OPENBLAS_CONST double *cbeta,
double *c, OPENBLAS_CONST blasint cldc);
void cblas_sgemm_batch(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransA_array, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransB_array, OPENBLAS_CONST blasint * M_array, OPENBLAS_CONST blasint * N_array, OPENBLAS_CONST blasint * K_array,
OPENBLAS_EXPORT void cblas_sgemm_batch(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransA_array, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransB_array, OPENBLAS_CONST blasint * M_array, OPENBLAS_CONST blasint * N_array, OPENBLAS_CONST blasint * K_array,
OPENBLAS_CONST float * alpha_array, OPENBLAS_CONST float ** A_array, OPENBLAS_CONST blasint * lda_array, OPENBLAS_CONST float ** B_array, OPENBLAS_CONST blasint * ldb_array, OPENBLAS_CONST float * beta_array, float ** C_array, OPENBLAS_CONST blasint * ldc_array, OPENBLAS_CONST blasint group_count, OPENBLAS_CONST blasint * group_size);
void cblas_dgemm_batch(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransA_array, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransB_array, OPENBLAS_CONST blasint * M_array, OPENBLAS_CONST blasint * N_array, OPENBLAS_CONST blasint * K_array,
OPENBLAS_EXPORT void cblas_dgemm_batch(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransA_array, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransB_array, OPENBLAS_CONST blasint * M_array, OPENBLAS_CONST blasint * N_array, OPENBLAS_CONST blasint * K_array,
OPENBLAS_CONST double * alpha_array, OPENBLAS_CONST double ** A_array, OPENBLAS_CONST blasint * lda_array, OPENBLAS_CONST double ** B_array, OPENBLAS_CONST blasint * ldb_array, OPENBLAS_CONST double * beta_array, double ** C_array, OPENBLAS_CONST blasint * ldc_array, OPENBLAS_CONST blasint group_count, OPENBLAS_CONST blasint * group_size);
void cblas_cgemm_batch(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransA_array, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransB_array, OPENBLAS_CONST blasint * M_array, OPENBLAS_CONST blasint * N_array, OPENBLAS_CONST blasint * K_array,
OPENBLAS_EXPORT void cblas_cgemm_batch(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransA_array, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransB_array, OPENBLAS_CONST blasint * M_array, OPENBLAS_CONST blasint * N_array, OPENBLAS_CONST blasint * K_array,
OPENBLAS_CONST void * alpha_array, OPENBLAS_CONST void ** A_array, OPENBLAS_CONST blasint * lda_array, OPENBLAS_CONST void ** B_array, OPENBLAS_CONST blasint * ldb_array, OPENBLAS_CONST void * beta_array, void ** C_array, OPENBLAS_CONST blasint * ldc_array, OPENBLAS_CONST blasint group_count, OPENBLAS_CONST blasint * group_size);
void cblas_zgemm_batch(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransA_array, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransB_array, OPENBLAS_CONST blasint * M_array, OPENBLAS_CONST blasint * N_array, OPENBLAS_CONST blasint * K_array,
OPENBLAS_EXPORT void cblas_zgemm_batch(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransA_array, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransB_array, OPENBLAS_CONST blasint * M_array, OPENBLAS_CONST blasint * N_array, OPENBLAS_CONST blasint * K_array,
OPENBLAS_CONST void * alpha_array, OPENBLAS_CONST void ** A_array, OPENBLAS_CONST blasint * lda_array, OPENBLAS_CONST void ** B_array, OPENBLAS_CONST blasint * ldb_array, OPENBLAS_CONST void * beta_array, void ** C_array, OPENBLAS_CONST blasint * ldc_array, OPENBLAS_CONST blasint group_count, OPENBLAS_CONST blasint * group_size);
void cblas_sgemm_batch_strided(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST float alpha, OPENBLAS_CONST float * A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST blasint stridea, OPENBLAS_CONST float * B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST blasint strideb, OPENBLAS_CONST float beta, float * C, OPENBLAS_CONST blasint ldc, OPENBLAS_CONST blasint stridec, OPENBLAS_CONST blasint group_size);
OPENBLAS_EXPORT void cblas_sgemm_batch_strided(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST float alpha, OPENBLAS_CONST float * A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST blasint stridea, OPENBLAS_CONST float * B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST blasint strideb, OPENBLAS_CONST float beta, float * C, OPENBLAS_CONST blasint ldc, OPENBLAS_CONST blasint stridec, OPENBLAS_CONST blasint group_size);
void cblas_dgemm_batch_strided(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST double alpha, OPENBLAS_CONST double * A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST blasint stridea, OPENBLAS_CONST double * B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST blasint strideb, OPENBLAS_CONST double beta, double * C, OPENBLAS_CONST blasint ldc, OPENBLAS_CONST blasint stridec, OPENBLAS_CONST blasint group_size);
OPENBLAS_EXPORT void cblas_dgemm_batch_strided(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST double alpha, OPENBLAS_CONST double * A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST blasint stridea, OPENBLAS_CONST double * B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST blasint strideb, OPENBLAS_CONST double beta, double * C, OPENBLAS_CONST blasint ldc, OPENBLAS_CONST blasint stridec, OPENBLAS_CONST blasint group_size);
void cblas_cgemm_batch_strided(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void * alpha, OPENBLAS_CONST void * A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST blasint stridea, OPENBLAS_CONST void * B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST blasint strideb, OPENBLAS_CONST void * beta, void * C, OPENBLAS_CONST blasint ldc, OPENBLAS_CONST blasint stridec, OPENBLAS_CONST blasint group_size);
OPENBLAS_EXPORT void cblas_cgemm_batch_strided(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void * alpha, OPENBLAS_CONST void * A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST blasint stridea, OPENBLAS_CONST void * B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST blasint strideb, OPENBLAS_CONST void * beta, void * C, OPENBLAS_CONST blasint ldc, OPENBLAS_CONST blasint stridec, OPENBLAS_CONST blasint group_size);
void cblas_zgemm_batch_strided(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void * alpha, OPENBLAS_CONST void * A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST blasint stridea, OPENBLAS_CONST void * B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST blasint strideb, OPENBLAS_CONST void * beta, void * C, OPENBLAS_CONST blasint ldc, OPENBLAS_CONST blasint stridec, OPENBLAS_CONST blasint group_size);
OPENBLAS_EXPORT void cblas_zgemm_batch_strided(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST void * alpha, OPENBLAS_CONST void * A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST blasint stridea, OPENBLAS_CONST void * B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST blasint strideb, OPENBLAS_CONST void * beta, void * C, OPENBLAS_CONST blasint ldc, OPENBLAS_CONST blasint stridec, OPENBLAS_CONST blasint group_size);
/*** BFLOAT16 and INT8 extensions ***/
/* convert float array to BFLOAT16 array by rounding */
void cblas_sbstobf16(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *in, OPENBLAS_CONST blasint incin, bfloat16 *out, OPENBLAS_CONST blasint incout);
OPENBLAS_EXPORT void cblas_sbstobf16(OPENBLAS_CONST blasint n, OPENBLAS_CONST float *in, OPENBLAS_CONST blasint incin, bfloat16 *out, OPENBLAS_CONST blasint incout);
/* convert double array to BFLOAT16 array by rounding */
void cblas_sbdtobf16(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *in, OPENBLAS_CONST blasint incin, bfloat16 *out, OPENBLAS_CONST blasint incout);
OPENBLAS_EXPORT void cblas_sbdtobf16(OPENBLAS_CONST blasint n, OPENBLAS_CONST double *in, OPENBLAS_CONST blasint incin, bfloat16 *out, OPENBLAS_CONST blasint incout);
/* convert BFLOAT16 array to float array */
void cblas_sbf16tos(OPENBLAS_CONST blasint n, OPENBLAS_CONST bfloat16 *in, OPENBLAS_CONST blasint incin, float *out, OPENBLAS_CONST blasint incout);
OPENBLAS_EXPORT void cblas_sbf16tos(OPENBLAS_CONST blasint n, OPENBLAS_CONST bfloat16 *in, OPENBLAS_CONST blasint incin, float *out, OPENBLAS_CONST blasint incout);
/* convert BFLOAT16 array to double array */
void cblas_dbf16tod(OPENBLAS_CONST blasint n, OPENBLAS_CONST bfloat16 *in, OPENBLAS_CONST blasint incin, double *out, OPENBLAS_CONST blasint incout);
void cblas_bgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n, OPENBLAS_CONST bfloat16 alpha, OPENBLAS_CONST bfloat16 *a, OPENBLAS_CONST blasint lda, OPENBLAS_CONST bfloat16 *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST bfloat16 beta, bfloat16 *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_dbf16tod(OPENBLAS_CONST blasint n, OPENBLAS_CONST bfloat16 *in, OPENBLAS_CONST blasint incin, double *out, OPENBLAS_CONST blasint incout);
OPENBLAS_EXPORT void cblas_bgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n, OPENBLAS_CONST bfloat16 alpha, OPENBLAS_CONST bfloat16 *a, OPENBLAS_CONST blasint lda, OPENBLAS_CONST bfloat16 *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST bfloat16 beta, bfloat16 *y, OPENBLAS_CONST blasint incy);
/* dot production of BFLOAT16 input arrays, and output as float */
float cblas_sbdot(OPENBLAS_CONST blasint n, OPENBLAS_CONST bfloat16 *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST bfloat16 *y, OPENBLAS_CONST blasint incy);
void cblas_sbgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n, OPENBLAS_CONST float alpha, OPENBLAS_CONST bfloat16 *a, OPENBLAS_CONST blasint lda, OPENBLAS_CONST bfloat16 *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST float beta, float *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT float cblas_sbdot(OPENBLAS_CONST blasint n, OPENBLAS_CONST bfloat16 *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST bfloat16 *y, OPENBLAS_CONST blasint incy);
OPENBLAS_EXPORT void cblas_sbgemv(OPENBLAS_CONST enum CBLAS_ORDER order, OPENBLAS_CONST enum CBLAS_TRANSPOSE trans, OPENBLAS_CONST blasint m, OPENBLAS_CONST blasint n, OPENBLAS_CONST float alpha, OPENBLAS_CONST bfloat16 *a, OPENBLAS_CONST blasint lda, OPENBLAS_CONST bfloat16 *x, OPENBLAS_CONST blasint incx, OPENBLAS_CONST float beta, float *y, OPENBLAS_CONST blasint incy);
void cblas_bgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_bgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST bfloat16 alpha, OPENBLAS_CONST bfloat16 *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST bfloat16 *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST bfloat16 beta, bfloat16 *C, OPENBLAS_CONST blasint ldc);
void cblas_sbgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_sbgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST float alpha, OPENBLAS_CONST bfloat16 *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST bfloat16 *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST float beta, float *C, OPENBLAS_CONST blasint ldc);
void cblas_sbgemm_batch(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransA_array, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransB_array, OPENBLAS_CONST blasint * M_array, OPENBLAS_CONST blasint * N_array, OPENBLAS_CONST blasint * K_array,
OPENBLAS_EXPORT void cblas_sbgemm_batch(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransA_array, OPENBLAS_CONST enum CBLAS_TRANSPOSE * TransB_array, OPENBLAS_CONST blasint * M_array, OPENBLAS_CONST blasint * N_array, OPENBLAS_CONST blasint * K_array,
OPENBLAS_CONST float * alpha_array, OPENBLAS_CONST bfloat16 ** A_array, OPENBLAS_CONST blasint * lda_array, OPENBLAS_CONST bfloat16 ** B_array, OPENBLAS_CONST blasint * ldb_array, OPENBLAS_CONST float * beta_array, float ** C_array, OPENBLAS_CONST blasint * ldc_array, OPENBLAS_CONST blasint group_count, OPENBLAS_CONST blasint * group_size);
void cblas_sbgemm_batch_strided(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST float alpha, OPENBLAS_CONST bfloat16 * A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST blasint stridea, OPENBLAS_CONST bfloat16 * B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST blasint strideb, OPENBLAS_CONST float beta, float * C, OPENBLAS_CONST blasint ldc, OPENBLAS_CONST blasint stridec, OPENBLAS_CONST blasint group_size);
OPENBLAS_EXPORT void cblas_sbgemm_batch_strided(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K, OPENBLAS_CONST float alpha, OPENBLAS_CONST bfloat16 * A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST blasint stridea, OPENBLAS_CONST bfloat16 * B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST blasint strideb, OPENBLAS_CONST float beta, float * C, OPENBLAS_CONST blasint ldc, OPENBLAS_CONST blasint stridec, OPENBLAS_CONST blasint group_size);
/*** FLOAT16 extensions ***/
void cblas_shgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_EXPORT void cblas_shgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
OPENBLAS_CONST float alpha, OPENBLAS_CONST hfloat16 *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST hfloat16 *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST float beta, float *C, OPENBLAS_CONST blasint ldc);
#ifdef __cplusplus
+19 -2
View File
@@ -48,10 +48,27 @@ if (DYNAMIC_ARCH)
if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER_EQUAL 11) # SVE ACLE supported in LLVM >= 11
set(DYNAMIC_CORE ${DYNAMIC_CORE} NEOVERSEV1 NEOVERSEN2 ARMV8SVE A64FX)
endif ()
if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER_EQUAL 19 OR (${CMAKE_C_COMPILER_ID} MATCHES AppleClang AND ${CMAKE_C_COMPILER_VERSION} VERSION_GREATER_EQUAL 17) ) # SME ACLE supported in LLVM >= 19 and AppleClang >= 17
set(DYNAMIC_CORE ${DYNAMIC_CORE} ARMV9SME VORTEXM4)
if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER_EQUAL 17) # SME ACLE supported in LLVM >= 17
set(DYNAMIC_CORE ${DYNAMIC_CORE} ARMV9SME)
endif()
if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER_EQUAL 19 OR (${CMAKE_C_COMPILER_ID} MATCHES AppleClang AND ${CMAKE_C_COMPILER_VERSION} VERSION_GREATER_EQUAL 17) ) # SME w/out SVE supported in LLVM >= 19 and AppleClang >= 17
set(DYNAMIC_CORE ${DYNAMIC_CORE} VORTEXM4)
endif()
endif()
endif ()
if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR ${CMAKE_SYSTEM_NAME} STREQUAL "iOS")
set(DYNAMIC_CORE ARMV8 NEOVERSEN1)
if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER_EQUAL 19 OR (${CMAKE_C_COMPILER_ID} MATCHES AppleClang AND ${CMAKE_C_COMPILER_VERSION} VERSION_GREATER_EQUAL 17) ) # SME ACLE supported in LLVM >= 19 and AppleClang >= 17
set(DYNAMIC_CORE ${DYNAMIC_CORE} VORTEXM4)
endif()
if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER_EQUAL 14) # SME ACLE supported in GCC >= 14
set(DYNAMIC_CORE ${DYNAMIC_CORE} ARMV9SME)
endif()
endif()
if (DYNAMIC_LIST)
set(DYNAMIC_CORE ARMV8 ${DYNAMIC_LIST})
endif ()
+10 -6
View File
@@ -113,6 +113,7 @@ if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI")
endif ()
if (${CMAKE_C_COMPILER_ID} STREQUAL "NVHPC")
set (GCC_VERSION 100)
if (POWER)
set(CCOMMON_OPT "${CCOMMON_OPT} -tp pwr8")
elseif (X86_64)
@@ -312,13 +313,13 @@ endif ()
if (${CORE} STREQUAL ARMV9SME)
if (NOT DYNAMIC_ARCH)
if (${CMAKE_C_COMPILER_ID} STREQUAL "NVHPC" AND NOT NO_SVE)
set (CCOMMON_OPT "${CCOMMON_OPT} -tp=host")
set (CCOMMON_OPT "${CCOMMON_OPT} -tp=host")
else ()
set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv9-a+sme")
if (${OSNAME} STREQUAL Windows AND ${CMAKE_C_COMPILER_ID} MATCHES "Clang" )
set (CCOMMON_OPT "${CCOMMON_OPT} --aarch64-stack-hazard-size=0")
set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv9-a+sme+sme-f64f64")
if (CMAKE_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_C_COMPILER_ID MATCHES "Clang")
set (CCOMMON_OPT "${CCOMMON_OPT} -mllvm --aarch64-stack-hazard-size=0")
endif ()
endif ()
endif ()
endif ()
endif ()
@@ -328,7 +329,7 @@ if (${CORE} STREQUAL VORTEXM4)
set (CCOMMON_OPT "${CCOMMON_OPT} -tp=host")
else ()
if (${CMAKE_C_COMPILER_ID} STREQUAL "AppleClang")
set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.4-a+sme -mcpu=apple-m4")
set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.4-a+sme+sme-f64f64 -mcpu=apple-m4")
else ()
set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.4-a -mcpu=apple-m4")
endif ()
@@ -427,6 +428,9 @@ endif()
if (${CORE} STREQUAL RISCV64_GENERIC)
set (CCOMMON_OPT "${CCOMMON_OPT} -march=rv64imafdc -mabi=lp64d")
endif()
if (${CORE} STREQUAL U74)
set (CCOMMON_OPT "${CCOMMON_OPT} -march=rv64imafdc_zba_zbb -mabi=lp64d -mtune=sifive-u74")
endif()
if (${CORE} STREQUAL x280)
set (CCOMMON_OPT "${CCOMMON_OPT} -march=rv64imafdcv_zba_zbb_zfh_zvl512b -mabi=lp64d")
endif()
+1 -1
View File
@@ -128,7 +128,7 @@ if (${F_COMPILER} STREQUAL "INTEL" OR CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
endif ()
set(FCOMMON_OPT "${FCOMMON_OPT} -recursive -fp-model=consistent")
if (USE_OPENMP)
set(OpenMP_Fortran_FLAGS "-openmp" CACHE STRING "OpenMP Fortran compiler flags")
set(OpenMP_Fortran_FLAGS "-qopenmp" CACHE STRING "OpenMP Fortran compiler flags")
endif ()
endif ()
+22 -20
View File
@@ -70,8 +70,8 @@ set(SLASRC
slaqgb.f slaqge.f slaqp2.f slaqps.f slaqp2rk.f slaqp3rk.f slaqsb.f slaqsp.f slaqsy.f
slaqr0.f slaqr1.f slaqr2.f slaqr3.f slaqr4.f slaqr5.f
slaqtr.f slar1v.f slar2v.f ilaslr.f ilaslc.f
slarf.f slarfb.f slarfb_gett.f slarfg.f slarfgp.f slarft.f slarfx.f slarfy.f slargv.f
slarrv.f slartv.f
slarf.f slarfb.f slarfb_gett.f slarfg.f slarfgp.f slarft.f slarft_lvl2.f slarfx.f
slarfy.f slargv.f slarf1f.f slarf1l.f slarrv.f slartv.f
slarz.f slarzb.f slarzt.f slasy2.f
slasyf.f slasyf_rook.f slasyf_rk.f slasyf_aa.f
slatbs.f slatdf.f slatps.f slatrd.f slatrs.f slatrz.f
@@ -124,7 +124,7 @@ set(SLASRC
ssbev_2stage.f ssbevx_2stage.f ssbevd_2stage.f ssygv_2stage.f
sgesvdq.f slaorhr_col_getrfnp.f
slaorhr_col_getrfnp2.f sorgtsqr.f sorgtsqr_row.f sorhr_col.f
slatrs3.f strsyl3.f sgelst.f sgedmd.f90 sgedmdq.f90)
slatrs3.f strsyl3.f sgelst.f sgedmd.f90 sgedmdq.f90 sgecxx.f)
set(SXLASRC sgesvxx.f sgerfsx.f sla_gerfsx_extended.f sla_geamv.f
sla_gercond.f sla_gerpvgrw.f ssysvxx.f ssyrfsx.f
@@ -177,7 +177,8 @@ set(CLASRC
claqr0.f claqr1.f claqr2.f claqr3.f claqr4.f claqr5.f
claqz0.f claqz1.f claqz2.f claqz3.f
claqsp.f claqsy.f clar1v.f clar2v.f ilaclr.f ilaclc.f
clarf.f clarfb.f clarfb_gett.f clarfg.f clarfgp.f clarft.f
clarf.f clarfb.f clarfb_gett.f clarfg.f clarfgp.f clarft.f clarft_lvl2.f
clarf1f.f clarf1l.f
clarfx.f clarfy.f clargv.f clarnv.f clarrv.f clartg.f90 clartv.f
clarz.f clarzb.f clarzt.f clascl.f claset.f clasr.f classq.f90
clasyf.f clasyf_rook.f clasyf_rk.f clasyf_aa.f
@@ -223,7 +224,7 @@ set(CLASRC
chbev_2stage.f chbevx_2stage.f chbevd_2stage.f chegv_2stage.f
cgesvdq.f claunhr_col_getrfnp.f claunhr_col_getrfnp2.f
cungtsqr.f cungtsqr_row.f cunhr_col.f
clatrs3.f ctrsyl3.f cgelst.f cgedmd.f90 cgedmdq.f90)
clatrs3.f ctrsyl3.f cgelst.f cgedmd.f90 cgedmdq.f90 cgecxx.f)
set(CXLASRC cgesvxx.f cgerfsx.f cla_gerfsx_extended.f cla_geamv.f
cla_gercond_c.f cla_gercond_x.f cla_gerpvgrw.f
@@ -261,8 +262,8 @@ set(DLASRC
dlaqgb.f dlaqge.f dlaqp2.f dlaqp2rk.f dlaqp3rk.f dlaqps.f dlaqsb.f dlaqsp.f dlaqsy.f
dlaqr0.f dlaqr1.f dlaqr2.f dlaqr3.f dlaqr4.f dlaqr5.f
dlaqtr.f dlar1v.f dlar2v.f iladlr.f iladlc.f
dlarf.f dlarfb.f dlarfb_gett.f dlarfg.f dlarfgp.f dlarft.f dlarfx.f dlarfy.f
dlargv.f dlarrv.f dlartv.f
dlarf.f dlarfb.f dlarfb_gett.f dlarfg.f dlarfgp.f dlarft.f dlarft_lvl2.f
dlarfx.f dlarfy.f dlarf1f.f dlarf1l.f dlargv.f dlarrv.f dlartv.f
dlarz.f dlarzb.f dlarzt.f dlasy2.f
dlasyf.f dlasyf_rook.f dlasyf_rk.f dlasyf_aa.f
dlatbs.f dlatdf.f dlatps.f dlatrd.f dlatrs.f dlatrz.f
@@ -316,7 +317,7 @@ set(DLASRC
dsbev_2stage.f dsbevx_2stage.f dsbevd_2stage.f dsygv_2stage.f
dcombssq.f dgesvdq.f dlaorhr_col_getrfnp.f
dlaorhr_col_getrfnp2.f dorgtsqr.f dorgtsqr_row.f dorhr_col.f
dlatrs3.f dtrsyl3.f dgelst.f dgedmd.f90 dgedmdq.f90)
dlatrs3.f dtrsyl3.f dgelst.f dgedmd.f90 dgedmdq.f90 dgecxx.f)
set(DXLASRC dgesvxx.f dgerfsx.f dla_gerfsx_extended.f dla_geamv.f
dla_gercond.f dla_gerpvgrw.f dsysvxx.f dsyrfsx.f
@@ -371,7 +372,7 @@ set(ZLASRC
zlaqr0.f zlaqr1.f zlaqr2.f zlaqr3.f zlaqr4.f zlaqr5.f
zlaqsp.f zlaqsy.f zlar1v.f zlar2v.f ilazlr.f ilazlc.f
zlarcm.f zlarf.f zlarfb.f zlarfb_gett.f
zlarfg.f zlarfgp.f zlarft.f
zlarfg.f zlarfgp.f zlarft.f zlarft_lvl2.f zlarf1f.f zlarf1l.f
zlarfx.f zlarfy.f zlargv.f zlarnv.f zlarrv.f zlartg.f90 zlartv.f
zlarz.f zlarzb.f zlarzt.f zlascl.f zlaset.f zlasr.f
zlassq.f90 zlasyf.f zlasyf_rook.f zlasyf_rk.f zlasyf_aa.f
@@ -419,7 +420,7 @@ set(ZLASRC
zhbev_2stage.f zhbevx_2stage.f zhbevd_2stage.f zhegv_2stage.f
zgesvdq.f zlaunhr_col_getrfnp.f zlaunhr_col_getrfnp2.f
zungtsqr.f zungtsqr_row.f zunhr_col.f
zlatrs3.f ztrsyl3.f zgelst.f zgedmd.f90 zgedmdq.f90)
zlatrs3.f ztrsyl3.f zgelst.f zgedmd.f90 zgedmdq.f90 zgecxx.f)
set(ZXLASRC zgesvxx.f zgerfsx.f zla_gerfsx_extended.f zla_geamv.f
zla_gercond_c.f zla_gercond_x.f zla_gerpvgrw.f zsysvxx.f zsyrfsx.f
@@ -574,8 +575,8 @@ set(SLASRC
slaqgb.c slaqge.c slaqp2.c slaqp2rk.c slaqp3rk.c slaqps.c slaqsb.c slaqsp.c slaqsy.c
slaqr0.c slaqr1.c slaqr2.c slaqr3.c slaqr4.c slaqr5.c
slaqtr.c slar1v.c slar2v.c ilaslr.c ilaslc.c
slarf.c slarfb.c slarfb_gett.c slarfg.c slarfgp.c slarft.c slarfx.c slarfy.c slargv.c
slarrv.c slartv.c
slarf.c slarfb.c slarfb_gett.c slarfg.c slarfgp.c slarft.c slarft_lvl2.c slarfx.c
slarfy.c slargv.c slarf1f.c slarf1l.c slarrv.c slartv.c
slarz.c slarzb.c slarzt.c slasy2.c
slasyf.c slasyf_rook.c slasyf_rk.c slasyf_aa.c
slatbs.c slatdf.c slatps.c slatrd.c slatrs.c slatrz.c
@@ -628,7 +629,7 @@ set(SLASRC
ssbev_2stage.c ssbevx_2stage.c ssbevd_2stage.c ssygv_2stage.c
sgesvdq.c slaorhr_col_getrfnp.c
slaorhr_col_getrfnp2.c sorgtsqr.c sorgtsqr_row.c sorhr_col.c
slatrs3.c strsyl3.c sgelst.c sgedmd.c sgedmdq.c)
slatrs3.c strsyl3.c sgelst.c sgedmd.c sgedmdq.c sgecxx.c)
set(SXLASRC sgesvxx.c sgerfsx.c sla_gerfsx_extended.c sla_geamv.c
sla_gercond.c sla_gerpvgrw.c ssysvxx.c ssyrfsx.c
@@ -681,6 +682,7 @@ set(CLASRC
claqr0.c claqr1.c claqr2.c claqr3.c claqr4.c claqr5.c
claqsp.c claqsy.c clar1v.c clar2v.c ilaclr.c ilaclc.c
clarf.c clarfb.c clarfb_gett.c clarfg.c clarfgp.c clarft.c
clarft_lvl2.c clarf1f.c clarf1l.c
clarfx.c clarfy.c clargv.c clarnv.c clarrv.c clartg.c clartv.c
clarz.c clarzb.c clarzt.c clascl.c claset.c clasr.c classq.c
clasyf.c clasyf_rook.c clasyf_rk.c clasyf_aa.c
@@ -726,7 +728,7 @@ set(CLASRC
chbev_2stage.c chbevx_2stage.c chbevd_2stage.c chegv_2stage.c
cgesvdq.c claunhr_col_getrfnp.c claunhr_col_getrfnp2.c
cungtsqr.c cungtsqr_row.c cunhr_col.c
clatrs3.c ctrsyl3.c cgelst.c cgedmd.c cgedmdq.c)
clatrs3.c ctrsyl3.c cgelst.c cgedmd.c cgedmdq.c cgecxx.c)
set(CXLASRC cgesvxx.c cgerfsx.c cla_gerfsx_extended.c cla_geamv.c
cla_gercond_c.c cla_gercond_x.c cla_gerpvgrw.c
@@ -763,8 +765,8 @@ set(DLASRC
dlaqgb.c dlaqge.c dlaqp2.c dlaqp2rk.c dlaqp3rk.c dlaqps.c dlaqsb.c dlaqsp.c dlaqsy.c
dlaqr0.c dlaqr1.c dlaqr2.c dlaqr3.c dlaqr4.c dlaqr5.c
dlaqtr.c dlar1v.c dlar2v.c iladlr.c iladlc.c
dlarf.c dlarfb.c dlarfb_gett.c dlarfg.c dlarfgp.c dlarft.c dlarfx.c dlarfy.c
dlargv.c dlarrv.c dlartv.c
dlarf.c dlarfb.c dlarfb_gett.c dlarfg.c dlarfgp.c dlarft.c dlarft_lvl2.c
dlarfx.c dlarfy.c dlarf1f.c dlarf1l.c dlargv.c dlarrv.c dlartv.c
dlarz.c dlarzb.c dlarzt.c dlasy2.c
dlasyf.c dlasyf_rook.c dlasyf_rk.c dlasyf_aa.c
dlatbs.c dlatdf.c dlatps.c dlatrd.c dlatrs.c dlatrz.c
@@ -818,7 +820,7 @@ set(DLASRC
dsbev_2stage.c dsbevx_2stage.c dsbevd_2stage.c dsygv_2stage.c
dcombssq.c dgesvdq.c dlaorhr_col_getrfnp.c
dlaorhr_col_getrfnp2.c dorgtsqr.c dorgtsqr_row.c dorhr_col.c
dlatrs3.c dtrsyl3.c dgelst.c dgedmd.c dgedmdq.c)
dlatrs3.c dtrsyl3.c dgelst.c dgedmd.c dgedmdq.c dgecxx.c)
set(DXLASRC dgesvxx.c dgerfsx.c dla_gerfsx_extended.c dla_geamv.c
dla_gercond.c dla_gerpvgrw.c dsysvxx.c dsyrfsx.c
@@ -871,8 +873,8 @@ set(ZLASRC
zlaqhb.c zlaqhe.c zlaqhp.c zlaqp2.c zlaqp2rk.c zlaqp3rk.c zlaqps.c zlaqsb.c
zlaqr0.c zlaqr1.c zlaqr2.c zlaqr3.c zlaqr4.c zlaqr5.c
zlaqsp.c zlaqsy.c zlar1v.c zlar2v.c ilazlr.c ilazlc.c
zlarcm.c zlarf.c zlarfb.c zlarfb_gett.c
zlarfg.c zlarfgp.c zlarft.c
zlarcm.c zlarf.c zlarfb.c zlarfb_gett.c zlarf1f.c zlarf1l.c
zlarfg.c zlarfgp.c zlarft.c zlarft_lvl2.c
zlarfx.c zlarfy.c zlargv.c zlarnv.c zlarrv.c zlartg.c zlartv.c
zlarz.c zlarzb.c zlarzt.c zlascl.c zlaset.c zlasr.c
zlassq.c zlasyf.c zlasyf_rook.c zlasyf_rk.c zlasyf_aa.c
@@ -920,7 +922,7 @@ set(ZLASRC
zhbev_2stage.c zhbevx_2stage.c zhbevd_2stage.c zhegv_2stage.c
zgesvdq.c zlaunhr_col_getrfnp.c zlaunhr_col_getrfnp2.c
zungtsqr.c zungtsqr_row.c zunhr_col.c zlatrs3.c ztrsyl3.c zgelst.c
zgedmd.c zgedmdq.c)
zgedmd.c zgedmdq.c zgecxx.c)
set(ZXLASRC zgesvxx.c zgerfsx.c zla_gerfsx_extended.c zla_geamv.c
zla_gercond_c.c zla_gercond_x.c zla_gerpvgrw.c zsysvxx.c zsyrfsx.c
+9 -1
View File
@@ -30,6 +30,8 @@ set(CSRC
lapacke_cgebrd_work.c
lapacke_cgecon.c
lapacke_cgecon_work.c
lapacke_cgecxx.c
lapacke_cgecxx_work.c
lapacke_cgeequ.c
lapacke_cgeequ_work.c
lapacke_cgeequb.c
@@ -659,6 +661,8 @@ set(DSRC
lapacke_dgebrd_work.c
lapacke_dgecon.c
lapacke_dgecon_work.c
lapacke_dgecxx.c
lapacke_dgecxx_work.c
lapacke_dgeequ.c
lapacke_dgeequ_work.c
lapacke_dgeequb.c
@@ -1241,6 +1245,8 @@ set(SSRC
lapacke_sgebrd_work.c
lapacke_sgecon.c
lapacke_sgecon_work.c
lapacke_sgecxx.c
lapacke_sgecxx_work.c
lapacke_sgeequ.c
lapacke_sgeequ_work.c
lapacke_sgeequb.c
@@ -1817,6 +1823,8 @@ set(ZSRC
lapacke_zgebrd_work.c
lapacke_zgecon.c
lapacke_zgecon_work.c
lapacke_zgecxx.c
lapacke_zgecxx_work.c
lapacke_zgeequ.c
lapacke_zgeequ_work.c
lapacke_zgeequb.c
@@ -2542,4 +2550,4 @@ endforeach ()
set(lapacke_include_dir "${NETLIB_LAPACK_DIR}/LAPACKE/include")
include_directories(${lapacke_include_dir})
set_source_files_properties(${LAPACKE_SOURCES} PROPERTIES COMPILE_FLAGS "${LAPACK_CFLAGS}")
set_source_files_properties(${LAPACKE_SOURCES} PROPERTIES COMPILE_FLAGS "${LAPACK_CFLAGS} -fvisibility=default")
+23 -1
View File
@@ -98,6 +98,10 @@ if (${COMPILER_ID} STREQUAL "GNU")
set(COMPILER_ID "GCC")
endif ()
if (HOST_OS STREQUAL "EMSCRIPTEN")
set (ARCH wasm)
endif()
string(TOUPPER ${ARCH} UC_ARCH)
file(WRITE ${TARGET_CONF_TEMP}
"#define OS_${HOST_OS}\t1\n"
@@ -1309,7 +1313,7 @@ endif ()
set(ZGEMM_UNROLL_M 2)
set(ZGEMM_UNROLL_N 4)
set(SYMV_P 16)
elseif ("${TCORE}" STREQUAL "ARMV8SVE" OR "${TCORE}" STREQUAL "CORTEXA510" OR "${TCORE}" STREQUAL "CORTEXX2" OR "${TCORE}" STREQUAL "ARMV9")
elseif ("${TCORE}" STREQUAL "ARMV8SVE" OR "${TCORE}" STREQUAL "CORTEXA510" OR "${TCORE}" STREQUAL "CORTEXX2" OR "${TCORE}" STREQUAL "ARMV9SME")
file(APPEND ${TARGET_CONF_TEMP}
"#define L1_DATA_SIZE\t32768\n"
"#define L1_DATA_LINESIZE\t64\n"
@@ -1500,6 +1504,24 @@ endif ()
"#define DTB_DEFAULT_ENTRIES 128\n"
"#define DTB_SIZE 4096\n"
"#define L2_ASSOCIATIVE 4\n")
elseif ("${TCORE}" STREQUAL "U74")
file(APPEND ${TARGET_CONF_TEMP}
"#define L1_DATA_SIZE 32768\n"
"#define L1_DATA_LINESIZE 64\n"
"#define L2_SIZE 2097152\n"
"#define L2_LINESIZE 64 \n"
"#define DTB_DEFAULT_ENTRIES 128\n"
"#define DTB_SIZE 4096\n"
"#define L2_ASSOCIATIVE 16\n")
elseif ("${TCORE}" STREQUAL "WASM128_GENERIC")
file(APPEND ${TARGET_CONF_TEMP}
"#define L1_DATA_SIZE 32768\n"
"#define L1_DATA_LINESIZE 32\n"
"#define L2_SIZE 1048576\n"
"#define L2_LINESIZE 32 \n"
"#define DTB_DEFAULT_ENTRIES 128\n"
"#define DTB_SIZE 4096\n"
"#define L2_ASSOCIATIVE 4\n")
elseif ("${TCORE}" STREQUAL "LA64_GENERIC")
file(APPEND ${TARGET_CONF_TEMP}
"#define DTB_DEFAULT_ENTRIES 64\n")
+21 -10
View File
@@ -68,10 +68,10 @@ endif ()
if (DEFINED BINARY AND DEFINED TARGET AND BINARY EQUAL 32)
message(STATUS "Compiling a ${BINARY}-bit binary.")
set(NO_AVX 1)
if (${TARGET} STREQUAL "HASWELL" OR ${TARGET} STREQUAL "SANDYBRIDGE" OR ${TARGET} STREQUAL "SKYLAKEX" OR ${TARGET} STREQUAL "COOPERLAKE" OR ${TARGET} STREQUAL "SAPPHIRERAPIDS")
if (${TARGET} STREQUAL "HASWELL" OR ${TARGET} STREQUAL "ZEN" OR ${TARGET} STREQUAL "SANDYBRIDGE" OR ${TARGET} STREQUAL "SKYLAKEX" OR ${TARGET} STREQUAL "COOPERLAKE" OR ${TARGET} STREQUAL "SAPPHIRERAPIDS")
set(TARGET "NEHALEM")
endif ()
if (${TARGET} STREQUAL "BULLDOZER" OR ${TARGET} STREQUAL "PILEDRIVER" OR ${TARGET} STREQUAL "ZEN")
if (${TARGET} STREQUAL "BULLDOZER" OR ${TARGET} STREQUAL "PILEDRIVER")
set(TARGET "BARCELONA")
endif ()
if (${TARGET} STREQUAL "ARMV8" OR ${TARGET} STREQUAL "CORTEXA57" OR ${TARGET} STREQUAL "CORTEXA53" OR ${TARGET} STREQUAL "CORTEXA55")
@@ -147,6 +147,9 @@ if (POWER)
set(HAVE_GAS 0)
elseif (CMAKE_ASM_COMPILER_ID STREQUAL "Clang")
set(CCOMMON_OPT "${CCOMMON_OPT} -fno-integrated-as")
if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
set(CCOMMON_OPT "${CCOMMON_OPT} -Wa,-mpwr10")
endif ()
set(HAVE_GAS 0)
endif ()
set(GETARCH_FLAGS "${GETARCH_FLAGS} -DHAVE_GAS=${HAVE_GAS}")
@@ -366,23 +369,22 @@ if (${TARGET} STREQUAL NEOVERSEV1)
endif()
endif()
if (${TARGET} STREQUAL ARMV9SME)
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv9-a+sme -O3")
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv9-a+sme+sme-f64f64 -O3")
if (${CMAKE_SYSTEM_NAME} STREQUAL Windows AND ${CMAKE_C_COMPILER_ID} MATCHES "Clang")
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} --aarch64-stack-hazard-size=0")
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mllvm --aarch64-stack-hazard-size=0")
endif()
endif()
if (${TARGET} STREQUAL VORTEXM4)
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.4-a+sme -O3")
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.4-a+sme+sme-f64f64 -O3")
if (${CMAKE_SYSTEM_NAME} STREQUAL Windows AND ${CMAKE_C_COMPILER_ID} MATCHES "Clang")
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} --aarch64-stack-hazard-size=0")
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mllvm --aarch64-stack-hazard-size=0")
endif()
endif()
if (${TARGET} STREQUAL A64FX)
if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI" AND NOT NO_SVE)
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -Msve-intrinsics -march=armv8.2-a+sve -mtune=a64fx")
else ()
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
if (${GCC_VERSION} VERSION_GREATER 10.4 OR ${GCC_VERSION} VERSION_EQUAL 10.4)
if (CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.4 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 10.4)
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.2-a+sve -mtune=a64fx")
else ()
message(FATAL_ERROR "Compiler $${CMAKE_C_COMPILER} {GCC_VERSION} does not support A64FX.")
@@ -408,6 +410,9 @@ if (${TARGET} STREQUAL NEOVERSEV1)
if (${TARGET} STREQUAL RISCV64_GENERIC)
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=rv64imafdc -mabi=lp64d")
endif()
if (${TARGET} STREQUAL U74)
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=rv64imafdc_zba_zbb -mabi=lp64d -mtune=sifive-u74")
endif()
if (${TARGET} STREQUAL x280)
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=rv64imafdcv_zba_zbb_zfh_zvl512b -mabi=lp64d")
endif()
@@ -647,8 +652,8 @@ endif()
set(LIBPREFIX "lib${LIBNAMEPREFIX}openblas")
if (DEFINED LIBNAMESUFFIX)
set(LIBPREFIX "${LIBNAMEPREFIX}_${LIBNAMESUFFIX}")
if (DEFINED LIBNAMESUFFIX AND NOT "${LIBNAMESUFFIX}" STREQUAL "")
set(LIBPREFIX "lib${LIBNAMEPREFIX}openblas${LIBNAMESUFFIX}")
endif ()
if (NOT DEFINED SYMBOLPREFIX)
@@ -741,6 +746,7 @@ if (BUILD_HFLOAT16)
endif()
if(NOT MSVC)
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CCOMMON_OPT}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
endif()
# TODO: not sure what PFLAGS is -hpa
set(PFLAGS "${PFLAGS} ${CCOMMON_OPT} -I${TOPDIR} -DPROFILE ${COMMON_PROF}")
@@ -803,6 +809,7 @@ if (${CMAKE_C_COMPILER_ID} MATCHES "IntelLLVM" AND ${CMAKE_SYSTEM_NAME} STREQUAL
set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DNOCHANGE")
endif ()
string(REPLACE "-fvisibility=hidden" "" LAPACK_CFLAGS ${LAPACK_CFLAGS})
if (NOT DEFINED SUFFIX)
set(SUFFIX o)
@@ -878,6 +885,10 @@ if (DEFINED ARCH)
set(USE_GEMM3M 1)
endif ()
if (EMSCRIPTEN)
set(USE_GEMM3M 0)
endif ()
if (${CORE} STREQUAL "generic")
set(USE_GEMM3M 0)
endif ()
+15 -4
View File
@@ -28,7 +28,7 @@ if(MINGW)
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpmachine
OUTPUT_VARIABLE OPENBLAS_MINGW_TARGET_MACHINE
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(OPENBLAS_MINGW_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64")
if(OPENBLAS_MINGW_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64|aarch64")
set(MINGW64 1)
endif()
endif()
@@ -40,6 +40,8 @@ if(CMAKE_CL_64 OR MINGW64)
else()
set(X86_64 1)
endif()
elseif(OS_EMSCRIPTEN)
set(WASM 1)
elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING))
set(X86 1)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc.*|power.*|Power.*" OR (CMAKE_SYSTEM_NAME MATCHES "Darwin" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc.*"))
@@ -145,13 +147,22 @@ endif()
endif()
if (ARM64)
if (NOT NO_SVE)
file(WRITE ${PROJECT_BINARY_DIR}/sve.c "#include <arm_sve.h>\n\n int main(void){}\n")
execute_process(COMMAND ${CMAKE_C_COMPILER} -march=armv8-a+sve -c -o ${PROJECT_BINARY_DIR}/sve.o ${PROJECT_BINARY_DIR}/sve.c OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE NO_SVE)
if (NO_SVE EQUAL 1)
set (CCOMMON_OPT "${CCOMMON_OPT} -DNO_SVE")
endif()
file(REMOVE "${PROJECT_BINARY_DIR}/sve.c" "${PROJECT_BINARY_DIR}/sve.o")
endif()
if (NOT NO_SME)
file(WRITE ${PROJECT_BINARY_DIR}/sme.c ".text \n.global sme_test\n\nsme_test:\nsmstart\nsmstop\nret\n")
execute_process(COMMAND ${CMAKE_C_COMPILER} -march=armv9-a+sve2+sme -c -v -o ${PROJECT_BINARY_DIR}/sme.o ${PROJECT_BINARY_DIR}/sme.c OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE NO_SME)
file(WRITE ${PROJECT_BINARY_DIR}/sme.S ".text \n.global sme_test\n\nsme_test:\nsmstart\nsmstop\nret\n")
execute_process(COMMAND ${CMAKE_C_COMPILER} -march=armv9-a+sve2+sme -c -v -o ${PROJECT_BINARY_DIR}/sme.o ${PROJECT_BINARY_DIR}/sme.S OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE NO_SME)
if (NO_SME EQUAL 1)
set (CCOMMON_OPT "${CCOMMON_OPT} -DNO_SME")
endif()
file(REMOVE "${PROJECT_BINARY_DIR}/sme.c" "${PROJECT_BINARY_DIR}/sme.o")
file(REMOVE "${PROJECT_BINARY_DIR}/sme.S" "${PROJECT_BINARY_DIR}/sme.o")
endif()
endif()
+1 -1
View File
@@ -51,7 +51,7 @@ macro(ParseMakefileVars MAKEFILE_IN)
if (${OSNAME} STREQUAL Windows)
set (OSNAME WINNT)
endif ()
message(STATUS OS ${OSNAME} COMPILER ${C_COMPILER})
#message(STATUS OS ${OSNAME} COMPILER ${C_COMPILER})
set (IfElse 0)
set (ElseSeen 0)
set (SkipIfs 0)
+85 -19
View File
@@ -57,6 +57,7 @@ extern "C" {
#define __USE_SVID
#endif
#include "exports.h"
#ifdef BUILD_KERNEL
#include "config_kernel.h"
#else
@@ -79,6 +80,22 @@ extern "C" {
#endif
#endif
#ifndef ASSEMBLER
#if defined(HAVE_C11) && !defined(__cplusplus)
#if defined(C_GCC) && ( __GNUC__ < 7)
// workaround for GCC bug 65467
#ifndef _Atomic
#define _Atomic volatile
#endif
#endif
#include <stdatomic.h>
#else
#ifndef _Atomic
#define _Atomic volatile
#endif
#endif
#endif
#if !defined(NOINCLUDE) && !defined(ASSEMBLER)
#include <stdio.h>
#include <stdlib.h>
@@ -193,8 +210,10 @@ extern "C" {
#ifdef NEEDBUNDERSCORE
#define BLASFUNC(FUNC) FUNC##_
#define OPENBLAS_API(FUNC) OPENBLAS_EXPORT FUNC##_
#else
#define BLASFUNC(FUNC) FUNC
#define OPENBLAS_API(FUNC) OPENBLAS_EXPORT FUNC
#endif
#undef USE_PTHREAD_LOCK
@@ -386,9 +405,11 @@ typedef int blasint;
#endif
#endif
#ifdef __EMSCRIPTEN__
#if defined(ARCH_WASM)
#ifndef YIELDING
#define YIELDING
#endif
#endif
#if defined(_MSC_VER) && !defined(__clang__)
#undef YIELDING // MSVC doesn't support assembly code
@@ -428,6 +449,12 @@ please https://github.com/xianyi/OpenBLAS/issues/246
#include "common_quad.h"
#endif
#ifndef ASSEMBLER
#if defined(HAVE_C11) && !defined(__cplusplus)
#define BLAS_LOCK_DEFINED
#endif
#endif
#ifdef ARCH_ALPHA
#include "common_alpha.h"
#endif
@@ -498,6 +525,10 @@ please https://github.com/xianyi/OpenBLAS/issues/246
#include "common_csky.h"
#endif
#ifdef ARCH_WASM
#include "common_wasm.h"
#endif
#ifndef ASSEMBLER
#ifdef OS_WINDOWSSTORE
typedef char env_var_t[MAX_PATH];
@@ -551,6 +582,27 @@ static __inline void blas_lock(volatile BLASULONG *address){
#define BLAS_LOCK_DEFINED
#endif
#if defined(HAVE_C11) && !defined(__cplusplus)
static __inline void blas_lock(volatile BLASULONG *address) {
BLASULONG expected = 0;
while (!atomic_compare_exchange_strong((volatile _Atomic BLASULONG *)address,
&expected, (BLASULONG)1)) {
expected = 0;
YIELDING;
}
}
#endif
static __inline void blas_unlock(volatile BLASULONG *address){
#if defined(HAVE_C11) && !defined(__cplusplus)
atomic_store((volatile _Atomic BLASULONG *)address, (BLASULONG)0);
#else
MB;
*address = 0;
#endif
}
#ifndef RPCC_DEFINED
#error "rpcc() implementation is missing for your platform"
#endif
@@ -712,7 +764,18 @@ int get_num_proc (int);
int get_node_equal (void);
#endif
void goto_set_num_threads(int);
OPENBLAS_EXPORT void goto_set_num_threads(int);
/* Cooperative cancellation of in-flight operations
* (implemented in driver/others/openblas_cancel.c). These symbols are
* exported without SYMBOLPREFIX/SYMBOLSUFFIX decoration. */
size_t *openblas_cancel_token(void);
OPENBLAS_EXPORT void openblas_cancel(size_t *token, size_t loaded_token);
/* Internal helpers for the instrumented compute drivers. */
size_t openblas_cancel_begin(void);
size_t *openblas_cancel_self(void);
int openblas_cancel_poll(size_t *slot, size_t gen);
void gotoblas_affinity_init(void);
void gotoblas_affinity_quit(void);
@@ -734,19 +797,6 @@ __declspec(dllimport) int __cdecl omp_in_parallel(void);
__declspec(dllimport) int __cdecl omp_get_num_procs(void);
#endif
#ifdef HAVE_C11
#if defined(C_GCC) && ( __GNUC__ < 7)
// workaround for GCC bug 65467
#ifndef _Atomic
#define _Atomic volatile
#endif
#endif
#include <stdatomic.h>
#else
#ifndef _Atomic
#define _Atomic volatile
#endif
#endif
#else
#ifdef __ELF__
@@ -755,10 +805,6 @@ int omp_get_num_procs(void) __attribute__ ((weak));
#endif
#endif
static __inline void blas_unlock(volatile BLASULONG *address){
MB;
*address = 0;
}
#ifdef OS_WINDOWSSTORE
static __inline int readenv_atoi(char *env) {
@@ -848,6 +894,26 @@ typedef struct {
#endif
#include "common_interface.h"
/* Internal declaration of the public C XERBLA callback API. Keep this out of
* common_interface.h, whose contents are copied verbatim into f77blas.h and
* are not adjusted for SYMBOLPREFIX/SYMBOLSUFFIX by the CMake build. */
#ifndef ASSEMBLER
#ifdef __cplusplus
extern "C" {
#endif
#ifndef OPENBLAS_XERBLA_HANDLER_DEFINED
#define OPENBLAS_XERBLA_HANDLER_DEFINED
typedef void (*openblas_xerbla_handler)(const char *name,
const blasint *info,
size_t name_length);
#endif
OPENBLAS_EXPORT openblas_xerbla_handler openblas_set_xerbla(openblas_xerbla_handler handler);
#ifdef __cplusplus
}
#endif
#endif
#ifdef SANITY_CHECK
#include "common_reference.h"
#endif
+12
View File
@@ -45,6 +45,7 @@
#define WMB asm("wmb")
#define RMB asm("mb")
#ifndef BLAS_LOCK_DEFINED
static __inline void blas_lock(unsigned long *address){
#ifndef __DECC
unsigned long tmp1, tmp2;
@@ -78,6 +79,7 @@ static __inline void blas_lock(unsigned long *address){
#endif
}
#define BLAS_LOCK_DEFINED
#endif
static __inline unsigned int rpcc(void){
@@ -143,6 +145,16 @@ static __inline int blas_quickdivide(unsigned int x, unsigned int y){
.ent REALNAME; \
REALNAME:
#define PROLOGUE_EXPORT \
.arch ev6; \
.set noat; \
.set noreorder; \
.text; \
.align 5; \
.globl REALNAME; \
.ent REALNAME; \
REALNAME:
#ifdef PROFILE
#define PROFCODE \
ldgp $gp, 0($27); \
+2
View File
@@ -53,6 +53,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#if defined(ARMV6) || defined(ARMV7) || defined(ARMV8)
#ifndef BLAS_LOCK_DEFINED
static __inline void blas_lock(volatile BLASULONG *address){
int register ret;
@@ -75,6 +76,7 @@ static __inline void blas_lock(volatile BLASULONG *address){
#define BLAS_LOCK_DEFINED
#endif
#endif
static inline int blas_quickdivide(blasint x, blasint y){
return x / y;
+2
View File
@@ -68,6 +68,7 @@ static __inline int WhereAmI(void){
}
#endif
#ifndef BLAS_LOCK_DEFINED
static __inline void blas_lock(volatile BLASULONG *address){
BLASULONG ret;
@@ -101,6 +102,7 @@ static __inline void blas_lock(volatile BLASULONG *address){
}
#define BLAS_LOCK_DEFINED
#endif
#if !defined(OS_DARWIN) && !defined (OS_ANDROID)
static __inline BLASULONG rpcc(void){
+2
View File
@@ -119,6 +119,7 @@
#endif
#define CGEMM_BETA cgemm_beta
#define SME_CGEMM_KERNEL sme_cgemm_kernel
#define CGEMM_KERNEL_N cgemm_kernel_n
#define CGEMM_KERNEL_L cgemm_kernel_l
@@ -326,6 +327,7 @@
#define CTRSM_ILTNCOPY gotoblas -> ctrsm_iltncopy
#define CGEMM_BETA gotoblas -> cgemm_beta
#define SME_CGEMM_KERNEL gotoblas -> sme_cgemm_kernel
#define CGEMM_KERNEL_N gotoblas -> cgemm_kernel_n
#define CGEMM_KERNEL_L gotoblas -> cgemm_kernel_l
#define CGEMM_KERNEL_R gotoblas -> cgemm_kernel_r
+2
View File
@@ -114,6 +114,7 @@
#define DGEMM_BETA dgemm_beta
#define DGEMM_KERNEL dgemm_kernel
#define SME_DGEMM_KERNEL sme_dgemm_kernel
#define DTRMM_KERNEL_LN dtrmm_kernel_LN
#define DTRMM_KERNEL_LT dtrmm_kernel_LT
@@ -246,6 +247,7 @@
#define DGEMM_BETA gotoblas -> dgemm_beta
#define DGEMM_KERNEL gotoblas -> dgemm_kernel
#define SME_DGEMM_KERNEL gotoblas -> sme_dgemm_kernel
#define DTRMM_KERNEL_LN gotoblas -> dtrmm_kernel_LN
#define DTRMM_KERNEL_LT gotoblas -> dtrmm_kernel_LT
+11
View File
@@ -56,6 +56,7 @@
#define RPCC64BIT
#ifndef __ECC
#ifndef BLAS_LOCK_DEFINED
static __inline void blas_lock(volatile unsigned long *address){
unsigned long ret;
@@ -70,6 +71,7 @@ static __inline void blas_lock(volatile unsigned long *address){
} while (ret);
}
#define BLAS_LOCK_DEFINED
#endif
static __inline unsigned long rpcc(void) {
unsigned long clocks;
@@ -98,11 +100,13 @@ static __inline void ldmxcsr(unsigned long fp) {
#else
#ifndef BLAS_LOCK_DEFINED
static __inline void blas_lock(volatile unsigned long *address){
while (*address || _InterlockedCompareExchange((volatile int *) address,1,0))
;
}
#define BLAS_LOCK_DEFINED
#endif
static __inline unsigned int rpcc(void) {
return __getReg(_IA64_REG_AR_ITC);
@@ -367,6 +371,13 @@ static __inline int blas_quickdivide(unsigned int x, unsigned int y){
.proc REALNAME; \
REALNAME:
#define PROLOGUE_EXPORT \
.explicit; \
.text; \
.align 128; \
.global REALNAME; \
.proc REALNAME; \
REALNAME:
#ifdef PROFILE
#define PROFCODE \
+456 -456
View File
File diff suppressed because it is too large Load Diff
+29 -4
View File
@@ -135,6 +135,31 @@ void ssyr2k_direct_alpha_betaLT(BLASLONG N, BLASLONG K,
float beta,
float * R, BLASLONG strideR);
void sme_sgemm_kernel(char*, char*, BLASLONG M, BLASLONG N, BLASLONG K,
float * alpha,
float * A, BLASLONG ldA,
float * B, BLASLONG ldB,
float * beta,
float * C, BLASLONG ldC);
void sme_dgemm_kernel(const char*, const char*, const BLASLONG M, const BLASLONG N, const BLASLONG K,
const double * alpha,
const double * A, const BLASLONG ldA,
const double * B, const BLASLONG ldB,
const double * beta,
double * C, const BLASLONG ldC);
void sme_cgemm_kernel(const char*, const char*, const BLASLONG M, const BLASLONG N, const BLASLONG K,
const float alpha_r, const float alpha_i,
const float * A, const BLASLONG ldA,
const float * B, const BLASLONG ldB,
const float beta_r, const float beta_i,
float * C, const BLASLONG ldC);
void sme_zgemm_kernel(const char*, const char*, const BLASLONG M, const BLASLONG N, const BLASLONG K,
const double alpha_r, const double alpha_i,
const double * A, const BLASLONG ldA,
const double * B, const BLASLONG ldB,
const double beta_r, const double beta_i,
double * C, const BLASLONG ldC);
int sgemm_direct_performant(BLASLONG M, BLASLONG N, BLASLONG K);
int shgemm_beta(BLASLONG, BLASLONG, BLASLONG, float,
@@ -2050,10 +2075,10 @@ int zimatcopy_k_rnc(BLASLONG, BLASLONG, double, double, double *, BLASLONG);
int zimatcopy_k_ctc(BLASLONG, BLASLONG, double, double, double *, BLASLONG);
int zimatcopy_k_rtc(BLASLONG, BLASLONG, double, double, double *, BLASLONG);
int sgeadd_k(BLASLONG, BLASLONG, float, float*, BLASLONG, float, float *, BLASLONG);
int dgeadd_k(BLASLONG, BLASLONG, double, double*, BLASLONG, double, double *, BLASLONG);
int cgeadd_k(BLASLONG, BLASLONG, float, float, float*, BLASLONG, float, float, float *, BLASLONG);
int zgeadd_k(BLASLONG, BLASLONG, double,double, double*, BLASLONG, double, double, double *, BLASLONG);
int sgeadd_k(BLASLONG, BLASLONG, float, float*, BLASLONG, float, float *, BLASLONG,BLASLONG,BLASLONG);
int dgeadd_k(BLASLONG, BLASLONG, double, double*, BLASLONG, double, double *, BLASLONG,BLASLONG,BLASLONG);
int cgeadd_k(BLASLONG, BLASLONG, float, float, float*, BLASLONG, float, float, float *, BLASLONG,BLASLONG,BLASLONG);
int zgeadd_k(BLASLONG, BLASLONG, double,double, double*, BLASLONG, double, double, double *, BLASLONG,BLASLONG,BLASLONG);
int sgemm_batch_thread(blas_arg_t * queue, BLASLONG nums);
int dgemm_batch_thread(blas_arg_t * queue, BLASLONG nums);
+1 -1
View File
@@ -70,7 +70,7 @@ extern long int syscall (long int __sysno, ...);
static inline int my_mbind(void *addr, unsigned long len, int mode,
unsigned long *nodemask, unsigned long maxnode,
unsigned flags) {
#if defined (__LSB_VERSION__) || defined(ARCH_ZARCH)
#if defined (__LSB_VERSION__) || defined(ARCH_ZARCH) || defined(__PIZLONATOR_WAS_HERE__)
// So far, LSB (Linux Standard Base) don't support syscall().
// https://lsbbugs.linuxfoundation.org/show_bug.cgi?id=3482
return 0;
+13 -1
View File
@@ -266,13 +266,25 @@ static inline int get_cpu_model(char *model_name) {
#if defined(ASSEMBLER) && !defined(NEEDPARAM)
#define PROLOGUE \
#define PROLOGUE_EXPORT \
.text ;\
.align 5 ;\
.globl REALNAME ;\
.type REALNAME, @function ;\
REALNAME: ;\
#ifdef __ELF__
#define PROLOGUE \
.text ;\
.align 5 ;\
.globl REALNAME ;\
.hidden REALNAME ;\
.type REALNAME, @function ;\
REALNAME: ;\
#else
#define PROLOGUE PROLOGUE_EXPORT
#endif
#if defined(__linux__) && defined(__ELF__)
#define GNUSTACK .section .note.GNU-stack,"",@progbits
#else
+12 -1
View File
@@ -2712,7 +2712,7 @@
#ifndef ASSEMBLER
#if !defined(DYNAMIC_ARCH) \
&& (defined(ARCH_X86) || defined(ARCH_X86_64) || defined(ARCH_IA64) || defined(ARCH_MIPS64) || defined(ARCH_ARM64) \
|| defined(ARCH_LOONGARCH64) || defined(ARCH_E2K) || defined(ARCH_ALPHA))
|| defined(ARCH_LOONGARCH64) || defined(ARCH_E2K) || defined(ARCH_ALPHA) || defined(ARCH_RISCV64))
extern BLASLONG gemm_offset_a;
extern BLASLONG gemm_offset_b;
extern BLASLONG bgemm_p;
@@ -2763,6 +2763,13 @@ typedef struct {
void * routine;
int routine_mode;
/* Generation slot of the thread that issued this operation and the
generation it runs as (see driver/others/openblas_cancel.c), or
NULL/0. Consulted only by the level-3 thread drivers; must be set
explicitly wherever it is to be observed. */
size_t * cancel_slot;
size_t cancel_gen;
} blas_arg_t;
#endif
@@ -3159,6 +3166,8 @@ typedef struct {
#define NEG_TCOPY ZNEG_TCOPY
#define LARF_L ZLARF_L
#define LARF_R ZLARF_R
#define LAED3_SINGLE dlaed3_single
#define LAED3_PARALLEL dlaed3_parallel
#else
#define GETF2 CGETF2
#define GETRF CGETRF
@@ -3180,6 +3189,8 @@ typedef struct {
#define NEG_TCOPY CNEG_TCOPY
#define LARF_L CLARF_L
#define LARF_R CLARF_R
#define LAED3_SINGLE slaed3_single
#define LAED3_PARALLEL slaed3_parallel
#endif
#endif
+11 -1
View File
@@ -73,11 +73,21 @@ static inline int blas_quickdivide(blasint x, blasint y){
#if defined(ASSEMBLER) && !defined(NEEDPARAM)
#define PROLOGUE \
#define PROLOGUE_EXPORT \
.arm ;\
.global REALNAME ;\
REALNAME:
#ifdef __ELF__
#define PROLOGUE \
.arm ;\
.global REALNAME ;\
.hidden REALNAME ;\
REALNAME:
#else
#define PROLOGUE PROLOGUE_EXPORT
#endif
#define EPILOGUE
#define PROFCODE
+17 -1
View File
@@ -205,7 +205,7 @@ static inline int blas_quickdivide(blasint x, blasint y){
#define ASSEMBLER_ARCH mips64
#endif
#define PROLOGUE \
#define PROLOGUE_EXPORT \
.text ;\
.set ASSEMBLER_ARCH ;\
.align 5 ;\
@@ -216,6 +216,22 @@ REALNAME: ;\
.set noreorder ;\
.set nomacro
#ifdef __ELF__
#define PROLOGUE \
.text ;\
.set ASSEMBLER_ARCH ;\
.align 5 ;\
.globl REALNAME ;\
.hidden REALNAME ;\
.ent REALNAME ;\
.type REALNAME, @function ;\
REALNAME: ;\
.set noreorder ;\
.set nomacro
#else
#define PROLOGUE PROLOGUE_EXPORT
#endif
#if defined(__linux__) && defined(__ELF__)
#define GNUSTACK .section .note.GNU-stack,"",@progbits
#else
+18 -4
View File
@@ -47,6 +47,9 @@
typedef struct {
int dtb_entries;
int switch_ratio;
int divide_rate;
int divide_limit;
int preferred_size;
int offsetA, offsetB, align;
#if BUILD_HFLOAT16 == 1
int shgemm_p, shgemm_q, shgemm_r;
@@ -273,6 +276,7 @@ int (*shgemv_t) (BLASLONG, BLASLONG, float, hfloat16 *, BLASLONG, hfloat16 *, BL
void (*ssyr2k_direct_alpha_betaUT) (BLASLONG, BLASLONG, float, float *, BLASLONG, float *, BLASLONG, float, float *, BLASLONG);
void (*ssyr2k_direct_alpha_betaLN) (BLASLONG, BLASLONG, float, float *, BLASLONG, float *, BLASLONG, float, float *, BLASLONG);
void (*ssyr2k_direct_alpha_betaLT) (BLASLONG, BLASLONG, float, float *, BLASLONG, float *, BLASLONG, float, float *, BLASLONG);
void (*sme_sgemm_kernel) (char*, char*, BLASLONG, BLASLONG, BLASLONG, float*, float *, BLASLONG , float *, BLASLONG ,float*, float *, BLASLONG);
#endif
@@ -398,6 +402,9 @@ int (*shgemv_t) (BLASLONG, BLASLONG, float, hfloat16 *, BLASLONG, hfloat16 *, BL
int (*dsymv_U) (BLASLONG, BLASLONG, double, double *, BLASLONG, double *, BLASLONG, double *, BLASLONG, double *);
#endif
#if (BUILD_DOUBLE==1) || (BUILD_COMPLEX16==1)
#ifdef ARCH_ARM64
void (*sme_dgemm_kernel) (const char*, const char*, const BLASLONG, const BLASLONG, const BLASLONG, const double*, const double *, const BLASLONG , const double *, const BLASLONG ,const double*, double *, const BLASLONG);
#endif
int (*dgemm_kernel )(BLASLONG, BLASLONG, BLASLONG, double, double *, double *, double *, BLASLONG);
int (*dgemm_beta )(BLASLONG, BLASLONG, BLASLONG, double, double *, BLASLONG, double *, BLASLONG, double *, BLASLONG);
@@ -613,6 +620,9 @@ int (*shgemv_t) (BLASLONG, BLASLONG, float, hfloat16 *, BLASLONG, hfloat16 *, BL
int (*chemv_M) (BLASLONG, BLASLONG, float, float, float *, BLASLONG, float *, BLASLONG, float *, BLASLONG, float *);
int (*chemv_V) (BLASLONG, BLASLONG, float, float, float *, BLASLONG, float *, BLASLONG, float *, BLASLONG, float *);
#ifdef ARCH_ARM64
void (*sme_cgemm_kernel) (const char*, const char*, const BLASLONG, const BLASLONG, const BLASLONG, const float, const float, const float *, const BLASLONG , const float *, const BLASLONG, const float, const float, float *, const BLASLONG);
#endif
int (*cgemm_kernel_n )(BLASLONG, BLASLONG, BLASLONG, float, float, float *, float *, float *, BLASLONG);
int (*cgemm_kernel_l )(BLASLONG, BLASLONG, BLASLONG, float, float, float *, float *, float *, BLASLONG);
int (*cgemm_kernel_r )(BLASLONG, BLASLONG, BLASLONG, float, float, float *, float *, float *, BLASLONG);
@@ -823,6 +833,10 @@ int (*shgemv_t) (BLASLONG, BLASLONG, float, hfloat16 *, BLASLONG, hfloat16 *, BL
int (*zhemv_M) (BLASLONG, BLASLONG, double, double, double *, BLASLONG, double *, BLASLONG, double *, BLASLONG, double *);
int (*zhemv_V) (BLASLONG, BLASLONG, double, double, double *, BLASLONG, double *, BLASLONG, double *, BLASLONG, double *);
#ifdef ARCH_ARM64
void (*sme_zgemm_kernel) (const char*, const char*, const BLASLONG, const BLASLONG, const BLASLONG, const double, const double, const double *, const BLASLONG , const double *, const BLASLONG, const double, const double, double *, const BLASLONG);
#endif
int (*zgemm_kernel_n )(BLASLONG, BLASLONG, BLASLONG, double, double, double *, double *, double *, BLASLONG);
int (*zgemm_kernel_l )(BLASLONG, BLASLONG, BLASLONG, double, double, double *, double *, double *, BLASLONG);
int (*zgemm_kernel_r )(BLASLONG, BLASLONG, BLASLONG, double, double, double *, double *, double *, BLASLONG);
@@ -1253,16 +1267,16 @@ int (*shgemv_t) (BLASLONG, BLASLONG, float, hfloat16 *, BLASLONG, hfloat16 *, BL
#endif
#if (BUILD_SINGLE==1)
int (*sgeadd_k) (BLASLONG, BLASLONG, float, float *, BLASLONG, float, float *, BLASLONG);
int (*sgeadd_k) (BLASLONG, BLASLONG, float, float *, BLASLONG, float, float *, BLASLONG, BLASLONG, BLASLONG);
#endif
#if (BUILD_DOUBLE==1)
int (*dgeadd_k) (BLASLONG, BLASLONG, double, double *, BLASLONG, double, double *, BLASLONG);
int (*dgeadd_k) (BLASLONG, BLASLONG, double, double *, BLASLONG, double, double *, BLASLONG, BLASLONG, BLASLONG);
#endif
#if (BUILD_COMPLEX==1)
int (*cgeadd_k) (BLASLONG, BLASLONG, float, float, float *, BLASLONG, float, float, float *, BLASLONG);
int (*cgeadd_k) (BLASLONG, BLASLONG, float, float, float *, BLASLONG, float, float, float *, BLASLONG, BLASLONG, BLASLONG);
#endif
#if (BUILD_COMPLEX16==1)
int (*zgeadd_k) (BLASLONG, BLASLONG, double, double, double *, BLASLONG, double, double, double *, BLASLONG);
int (*zgeadd_k) (BLASLONG, BLASLONG, double, double, double *, BLASLONG, double, double, double *, BLASLONG, BLASLONG, BLASLONG);
#endif
} gotoblas_t;
+73
View File
@@ -89,6 +89,7 @@
void *qalloc(int flags, size_t bytes);
#ifndef BLAS_LOCK_DEFINED
static inline void blas_lock(volatile unsigned long *address){
long int ret, val = 1;
@@ -123,6 +124,7 @@ static inline void blas_lock(volatile unsigned long *address){
} while (ret);
}
#define BLAS_LOCK_DEFINED
#endif
static inline unsigned long rpcc(void){
unsigned long ret;
@@ -532,6 +534,13 @@ static inline int blas_quickdivide(blasint x, blasint y){
#if defined(OS_LINUX) || defined(OS_FREEBSD)
#ifndef __64BIT__
#define PROLOGUE \
.section .text;\
.align 6;\
.globl REALNAME;\
.hidden REALNAME ;\
.type REALNAME, @function;\
REALNAME:
#define PROLOGUE_EXPORT \
.section .text;\
.align 6;\
.globl REALNAME;\
@@ -541,6 +550,13 @@ REALNAME:
#else
#if _CALL_ELF == 2
#define PROLOGUE \
.section .text;\
.align 6;\
.globl REALNAME;\
.hidden REALNAME ;\
.type REALNAME, @function;\
REALNAME:
#define PROLOGUE_EXPORT \
.section .text;\
.align 6;\
.globl REALNAME;\
@@ -549,6 +565,21 @@ REALNAME:
#define EPILOGUE .size REALNAME, .-REALNAME
#else
#define PROLOGUE \
.section .text;\
.align 5;\
.globl REALNAME;\
.hidden REALNAME ;\
.section ".opd","aw";\
.align 3;\
REALNAME:;\
.quad .REALNAME, .TOC.@tocbase, 0;\
.previous;\
.size REALNAME, 24;\
.type .REALNAME, @function;\
.globl .REALNAME;\
.hidden .REALNAME ;\
.REALNAME:
#define PROLOGUE_EXPORT \
.section .text;\
.align 5;\
.globl REALNAME;\
@@ -637,6 +668,17 @@ REALNAME:;\
.csect .text[PR],5;\
.REALNAME:
#define PROLOGUE_EXPORT \
.machine "any";\
.toc;\
.globl .REALNAME;\
.globl REALNAME;\
.csect REALNAME[DS],3;\
REALNAME:;\
.long .REALNAME, TOC[tc0], 0;\
.csect .text[PR],5;\
.REALNAME:
#define EPILOGUE \
_section_.text:;\
.csect .data[RW],4;\
@@ -655,6 +697,17 @@ REALNAME:;\
.csect .text[PR], 5;\
.REALNAME:
#define PROLOGUE_EXPORT \
.machine "any";\
.toc;\
.globl .REALNAME;\
.globl REALNAME;\
.csect REALNAME[DS],3;\
REALNAME:;\
.llong .REALNAME, TOC[tc0], 0;\
.csect .text[PR], 5;\
.REALNAME:
#define EPILOGUE \
_section_.text:;\
.csect .data[RW],4;\
@@ -674,6 +727,16 @@ _section_.text:;\
.text
.align 4
.globl REALNAME
REALNAME:
.endmacro
.macro PROLOGUE_EXPORT
.section __TEXT,__text,regular,pure_instructions
.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
.machine ppc
.text
.align 4
.globl REALNAME
REALNAME:
.endmacro
#else
@@ -684,6 +747,16 @@ REALNAME:
.text
.align 4
.globl REALNAME
REALNAME:
.endmacro
.macro PROLOGUE_EXPORT
.section __TEXT,__text,regular,pure_instructions
.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
.machine ppc64
.text
.align 4
.globl REALNAME
REALNAME:
.endmacro
#endif
+2
View File
@@ -76,6 +76,7 @@
#define SGEMM_ITCOPY sgemm_itcopy
#endif
#define SME_SGEMM_KERNEL sme_sgemm_kernel
#define STRMM_OUNUCOPY strmm_ounucopy
#define STRMM_OUNNCOPY strmm_ounncopy
#define STRMM_OUTUCOPY strmm_outucopy
@@ -248,6 +249,7 @@
#define SSYR2K_DIRECT_ALPHA_BETA_UT gotoblas -> ssyr2k_direct_alpha_betaUT
#define SSYR2K_DIRECT_ALPHA_BETA_LN gotoblas -> ssyr2k_direct_alpha_betaLN
#define SSYR2K_DIRECT_ALPHA_BETA_LT gotoblas -> ssyr2k_direct_alpha_betaLT
#define SME_SGEMM_KERNEL gotoblas -> sme_sgemm_kernel
#endif
#define SGEMM_ONCOPY gotoblas -> sgemm_oncopy
+10
View File
@@ -45,6 +45,7 @@
#ifndef ASSEMBLER
#ifndef BLAS_LOCK_DEFINED
static __inline void blas_lock(volatile unsigned long *address){
long int ret = 1;
@@ -60,6 +61,7 @@ static __inline void blas_lock(volatile unsigned long *address){
} while (ret);
}
#define BLAS_LOCK_DEFINED
#endif
static __inline unsigned long rpcc(void){
unsigned long clocks;
@@ -209,6 +211,14 @@ static __inline int blas_quickdivide(blasint x, blasint y){
.proc 07; \
REALNAME:;
#define PROLOGUE_EXPORT \
.section ".text"; \
.align 32; \
.global REALNAME;\
.type REALNAME, #function; \
.proc 07; \
REALNAME:;
#if defined(__linux__) && defined(__ELF__)
#define GNUSTACK .section .note.GNU-stack,"",@progbits
#else
+23 -1
View File
@@ -51,7 +51,7 @@ extern void goto_set_num_threads(int nthreads);
#undef TIMING_DEBUG
/* Global Parameter */
extern int blas_cpu_number;
extern _Atomic int blas_cpu_number;
extern int blas_num_threads;
extern int blas_omp_linked;
@@ -106,7 +106,15 @@ typedef struct blas_queue {
blas_arg_t *args;
void *range_m;
void *range_n;
/*
* sa and sb are caller-owned inputs. worker_sb reports the sb workspace
* used by the threading backend for the most recent invocation.
* Keeping these roles separate prevents a reused queue from treating a
* released workspace as input to its next invocation.
*/
void *sa, *sb;
void *worker_sb;
struct blas_queue *next;
@@ -138,10 +146,20 @@ typedef struct blas_queue {
extern int blas_server_avail;
extern int blas_omp_number_max;
extern int blas_omp_threads_local;
extern int blas_is_num_threads_set_explicitly;
static __inline int num_cpu_avail(int level) {
#ifdef USE_OPENMP
/* If the user explicitly called openblas_set_num_threads(),
respect that setting instead of overriding it with
`omp_get_max_threads()` below (which is to get a default
in case the user hasn't made an explicit choice). */
if (blas_is_num_threads_set_explicitly) {
if (omp_in_parallel()) return 1;
return blas_cpu_number;
}
int openmp_nthreads;
openmp_nthreads=omp_get_max_threads();
if (omp_in_parallel()) openmp_nthreads = blas_omp_threads_local;
@@ -174,6 +192,7 @@ static __inline void blas_queue_init(blas_queue_t *queue){
queue -> sa = NULL;
queue -> sb = NULL;
queue -> worker_sb = NULL;
queue-> next = NULL;
}
@@ -191,6 +210,9 @@ int exec_blas(BLASLONG num_cpu, blas_param_t *param, void *buffer);
#ifndef ASSEMBLER
void blas_level3_thread_enter(void);
void blas_level3_thread_leave(void);
int blas_level1_thread(int mode, BLASLONG m, BLASLONG n, BLASLONG k, void *alpha,
void *a, BLASLONG lda,
void *b, BLASLONG ldb,
+91
View File
@@ -0,0 +1,91 @@
/*****************************************************************************
Copyright (c) 2011-2014, The OpenBLAS Project
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. Neither the name of the OpenBLAS project nor the names of
its contributors may be used to endorse or promote products
derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**********************************************************************************/
/*********************************************************************/
/* Copyright 2009, 2010 The University of Texas at Austin. */
/* All rights reserved. */
/* */
/* Redistribution and use in source and binary forms, with or */
/* without modification, are permitted provided that the following */
/* conditions are met: */
/* */
/* 1. Redistributions of source code must retain the above */
/* copyright notice, this list of conditions and the following */
/* disclaimer. */
/* */
/* 2. Redistributions in binary form must reproduce the above */
/* copyright notice, this list of conditions and the following */
/* disclaimer in the documentation and/or other materials */
/* provided with the distribution. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
/* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
/* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
/* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
/* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
/* POSSIBILITY OF SUCH DAMAGE. */
/* */
/* The views and conclusions contained in the software and */
/* documentation are those of the authors and should not be */
/* interpreted as representing official policies, either expressed */
/* or implied, of The University of Texas at Austin. */
/*********************************************************************/
#ifndef COMMON_WASM
#define COMMON_WASM
#define MB __sync_synchronize()
#define WMB __sync_synchronize()
#define RMB __sync_synchronize()
#ifndef ASSEMBLER
static inline int blas_quickdivide(blasint x, blasint y){
return x / y;
}
#endif
#define BUFFER_SIZE ( 16 << 20)
#define SEEK_ADDRESS
#endif
+26 -2
View File
@@ -54,6 +54,7 @@
#define __volatile__
#endif
#ifndef BLAS_LOCK_DEFINED
static __inline void blas_lock(volatile BLASULONG *address){
int ret;
@@ -83,6 +84,7 @@ static __inline void blas_lock(volatile BLASULONG *address){
}
#define BLAS_LOCK_DEFINED
#endif
static __inline unsigned long long rpcc(void){
#if defined(_MSC_VER) && !defined(__clang__)
@@ -298,6 +300,7 @@ static __inline int blas_quickdivide(unsigned int x, unsigned int y){
#ifdef OS_DARWIN
#define PROLOGUE .text;.align 5; .globl REALNAME; REALNAME:
#define PROLOGUE_EXPORT PROLOGUE
#define EPILOGUE .subsections_via_symbols
#define PROFCODE
#endif
@@ -318,13 +321,25 @@ static __inline int blas_quickdivide(unsigned int x, unsigned int y){
#endif
#if defined(OS_WINNT) || defined(OS_CYGWIN_NT) || defined(OS_INTERIX)
#define PROLOGUE \
#define PROLOGUE_EXPORT \
.text; \
.align 16; \
.globl REALNAME ;\
.def REALNAME;.scl 2;.type 32;.endef; \
REALNAME:
#ifdef __ELF__
#define PROLOGUE \
.text; \
.align 16; \
.globl REALNAME ;\
.hidden REALNAME ;\
.def REALNAME;.scl 2;.type 32;.endef; \
REALNAME:
#else
#define PROLOGUE PROLOGUE_EXPORT
#endif
#define PROFCODE
#ifdef __clang__
@@ -339,7 +354,16 @@ REALNAME:
.text; \
.align 16; \
.globl REALNAME ;\
.type REALNAME, @function; \
.hidden REALNAME ;\
.type REALNAME, @function; \
REALNAME: \
_CET_ENDBR
#define PROLOGUE_EXPORT \
.text; \
.align 16; \
.globl REALNAME ;\
.type REALNAME, @function; \
REALNAME: \
_CET_ENDBR
+30 -3
View File
@@ -70,6 +70,7 @@
#define RMB
#endif
#ifndef BLAS_LOCK_DEFINED
static __inline void blas_lock(volatile BLASULONG *address){
@@ -83,11 +84,15 @@ static __inline void blas_lock(volatile BLASULONG *address){
while (*address) {YIELDING;}
#ifndef C_MSVC
#ifdef __PIZLONATOR_WAS_HERE__
ret=__atomic_exchange_n(address, 1, __ATOMIC_SEQ_CST);
#else
__asm__ __volatile__(
"xchgl %0, %1\n"
: "=r"(ret), "=m"(*address)
: "0"(1), "m"(*address)
: "memory");
#endif
#else
ret=InterlockedExchange64((volatile LONG64 *)(address), 1);
#endif
@@ -95,6 +100,7 @@ static __inline void blas_lock(volatile BLASULONG *address){
}
#define BLAS_LOCK_DEFINED
#endif
static __inline BLASULONG rpcc(void){
#ifdef C_MSVC
@@ -237,7 +243,7 @@ static __inline unsigned int blas_quickdivide(unsigned int x, unsigned int y){
y = blas_quick_divide_table[y];
__asm__ __volatile__ ("mull %0" :"=d" (result), "+a"(x) : "0" (y));
__asm__ __volatile__ ("mull %0" :"=d" (result), "+a"(x) : "0" (y) : "cc");
return result;
}
#endif
@@ -401,6 +407,7 @@ static __inline unsigned int blas_quickdivide(unsigned int x, unsigned int y){
#ifdef OS_DARWIN
#define PROLOGUE .text;.align 5; .globl REALNAME; REALNAME:
#define PROLOGUE_EXPORT .text;.align 5; .globl REALNAME; REALNAME:
#define EPILOGUE .subsections_via_symbols
#define PROFCODE
#endif
@@ -437,12 +444,23 @@ static __inline unsigned int blas_quickdivide(unsigned int x, unsigned int y){
#endif
#if defined(OS_WINDOWS) && !defined(C_PGI)
#define PROLOGUE \
#define PROLOGUE_EXPORT \
.text; \
.align 16; \
.globl REALNAME ;\
.def REALNAME;.scl 2;.type 32;.endef; \
REALNAME:
#ifdef __ELF__
#define PROLOGUE \
.text; \
.align 16; \
.globl REALNAME ;\
.hidden REALNAME ; \
.def REALNAME;.scl 2;.type 32;.endef; \
REALNAME:
#else
#define PROLOGUE PROLOGUE_EXPORT
#endif
#define PROFCODE
@@ -454,7 +472,16 @@ REALNAME:
.text; \
.align 512; \
.globl REALNAME ;\
.type REALNAME, @function; \
.hidden REALNAME ;\
.type REALNAME, @function; \
REALNAME: \
_CET_ENDBR
#define PROLOGUE_EXPORT \
.text; \
.align 512; \
.globl REALNAME ;\
.type REALNAME, @function; \
REALNAME: \
_CET_ENDBR
+2
View File
@@ -119,6 +119,7 @@
#endif
#define ZGEMM_BETA zgemm_beta
#define SME_ZGEMM_KERNEL sme_zgemm_kernel
#define ZGEMM_KERNEL_N zgemm_kernel_n
#define ZGEMM_KERNEL_L zgemm_kernel_l
@@ -326,6 +327,7 @@
#define ZTRSM_ILTNCOPY gotoblas -> ztrsm_iltncopy
#define ZGEMM_BETA gotoblas -> zgemm_beta
#define SME_ZGEMM_KERNEL gotoblas -> sme_zgemm_kernel
#define ZGEMM_KERNEL_N gotoblas -> zgemm_kernel_n
#define ZGEMM_KERNEL_L gotoblas -> zgemm_kernel_l
#define ZGEMM_KERNEL_R gotoblas -> zgemm_kernel_r
+37 -10
View File
@@ -5,19 +5,46 @@ enable_language(CXX)
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -DADD${BU} -DCBLAS")
if (USE_OPENMP)
set(CPP_THREAD_SAFETY_LIBS ${OpenBLAS_LIBNAME})
find_package(Threads REQUIRED)
list(APPEND CPP_THREAD_SAFETY_LIBS Threads::Threads)
add_definitions(-DOPENBLAS_USE_GENERATED_CBLAS_H)
if ((CPP_THREAD_SAFETY_TEST OR CPP_THREAD_SAFETY_GEMV) AND CPP_THREAD_SAFETY_USE_OPENMP)
find_package(OpenMP REQUIRED COMPONENTS CXX)
list(APPEND CPP_THREAD_SAFETY_LIBS OpenMP::OpenMP_CXX)
add_definitions(-DCPP_THREAD_SAFETY_USE_OPENMP)
endif()
set(CPP_THREAD_SAFETY_DGEMM_ARGS "" CACHE STRING "Arguments passed to the DGEMM thread safety test")
set(CPP_THREAD_SAFETY_DGEMM_MIXED_ARGS "" CACHE STRING "Arguments passed to the mixed DGEMM thread safety test")
set(CPP_THREAD_SAFETY_DGEMV_ARGS "" CACHE STRING "Arguments passed to the DGEMV thread safety test")
set(CPP_THREAD_SAFETY_SHUTDOWN_ARGS "" CACHE STRING "Arguments passed to the DGEMM shutdown safety test")
if (CPP_THREAD_SAFETY_TEST)
message(STATUS building thread safety test)
add_executable(dgemm_thread_safety dgemm_thread_safety.cpp)
target_link_libraries(dgemm_thread_safety ${OpenBLAS_LIBNAME})
add_test( dgemm_thread_safety ${CMAKE_CURRENT_BINARY_DIR}/dgemm_thread_safety)
message(STATUS "building thread safety test")
add_executable(dgemm_thread_safety dgemm_thread_safety.cpp)
target_link_libraries(dgemm_thread_safety ${CPP_THREAD_SAFETY_LIBS})
add_test(NAME dgemm_thread_safety COMMAND ${CMAKE_CURRENT_BINARY_DIR}/dgemm_thread_safety ${CPP_THREAD_SAFETY_DGEMM_ARGS})
add_executable(dgemm_thread_safety_mixed dgemm_thread_safety_mixed.cpp)
target_link_libraries(dgemm_thread_safety_mixed ${CPP_THREAD_SAFETY_LIBS})
add_test(NAME dgemm_thread_safety_mixed COMMAND ${CMAKE_CURRENT_BINARY_DIR}/dgemm_thread_safety_mixed ${CPP_THREAD_SAFETY_DGEMM_MIXED_ARGS})
if (WIN32)
add_executable(dgemm_thread_safety_shutdown dgemm_thread_safety_shutdown.cpp)
target_link_libraries(dgemm_thread_safety_shutdown ${CPP_THREAD_SAFETY_LIBS})
add_test(NAME dgemm_thread_safety_shutdown COMMAND ${CMAKE_CURRENT_BINARY_DIR}/dgemm_thread_safety_shutdown ${CPP_THREAD_SAFETY_SHUTDOWN_ARGS})
set_tests_properties(dgemm_thread_safety_shutdown PROPERTIES TIMEOUT 900)
endif()
if (USE_THREAD AND (USE_OPENMP OR (NOT WIN32 AND NOT CYGWIN)))
add_test(NAME dgemm_thread_safety_mixed_callback COMMAND ${CMAKE_CURRENT_BINARY_DIR}/dgemm_thread_safety_mixed ${CPP_THREAD_SAFETY_DGEMM_MIXED_ARGS} --callback)
endif()
endif()
if (CPP_THREAD_SAFETY_TEST OR CPP_THREAD_SAFETY_GEMV)
add_executable(dgemv_thread_safety dgemv_thread_safety.cpp)
target_link_libraries(dgemv_thread_safety ${OpenBLAS_LIBNAME})
add_test(dgemv_thread_safety ${CMAKE_CURRENT_BINARY_DIR}/dgemv_thread_safety)
endif()
add_executable(dgemv_thread_safety dgemv_thread_safety.cpp)
target_link_libraries(dgemv_thread_safety ${CPP_THREAD_SAFETY_LIBS})
add_test(NAME dgemv_thread_safety COMMAND ${CMAKE_CURRENT_BINARY_DIR}/dgemv_thread_safety ${CPP_THREAD_SAFETY_DGEMV_ARGS})
endif()
+37 -4
View File
@@ -1,15 +1,48 @@
TOPDIR = ..
include $(TOPDIR)/Makefile.system
all :: dgemv_tester dgemm_tester
all :: dgemv_tester dgemm_tester dgemm_mixed_tester
ifeq ($(OSNAME), WINNT)
all :: dgemm_shutdown_tester
endif
CALLBACK_THREAD_TEST =
ifeq ($(SMP),1)
ifeq ($(USE_OPENMP),1)
CALLBACK_THREAD_TEST = 1
else
ifneq ($(OSNAME),$(filter $(OSNAME),WINNT CYGWIN_NT))
CALLBACK_THREAD_TEST = 1
endif
endif
endif
ifeq ($(CALLBACK_THREAD_TEST),1)
.PHONY : dgemm_mixed_callback_tester
all :: dgemm_mixed_callback_tester
endif
dgemv_tester :
$(CXX) $(COMMON_OPT) -Wall -Wextra -Wshadow -fopenmp -std=c++11 dgemv_thread_safety.cpp ../$(LIBNAME) $(EXTRALIB) $(FEXTRALIB) -o dgemv_tester
$(CXX) $(COMMON_OPT) -Wall -Wextra -Wshadow -std=c++11 dgemv_thread_safety.cpp ../$(LIBNAME) $(EXTRALIB) $(FEXTRALIB) -o dgemv_tester
./dgemv_tester
dgemm_tester : dgemv_tester
$(CXX) $(COMMON_OPT) -Wall -Wextra -Wshadow -fopenmp -std=c++11 dgemm_thread_safety.cpp ../$(LIBNAME) $(EXTRALIB) $(FEXTRALIB) -o dgemm_tester
$(CXX) $(COMMON_OPT) -Wall -Wextra -Wshadow -std=c++11 dgemm_thread_safety.cpp ../$(LIBNAME) $(EXTRALIB) $(FEXTRALIB) -o dgemm_tester
./dgemm_tester
dgemm_mixed_tester : dgemm_tester
$(CXX) $(COMMON_OPT) -Wall -Wextra -Wshadow -std=c++11 dgemm_thread_safety_mixed.cpp ../$(LIBNAME) $(EXTRALIB) $(FEXTRALIB) -o dgemm_mixed_tester
./dgemm_mixed_tester
dgemm_shutdown_tester : dgemm_mixed_tester
$(CXX) $(COMMON_OPT) -Wall -Wextra -Wshadow -std=c++11 dgemm_thread_safety_shutdown.cpp ../$(LIBNAME) $(EXTRALIB) $(FEXTRALIB) -o dgemm_shutdown_tester
./dgemm_shutdown_tester
ifeq ($(CALLBACK_THREAD_TEST),1)
dgemm_mixed_callback_tester : dgemm_mixed_tester
./dgemm_mixed_tester --callback
endif
clean ::
rm -f dgemv_tester dgemm_tester
rm -f dgemv_tester dgemm_tester dgemm_mixed_tester dgemm_shutdown_tester
@@ -1,3 +1,9 @@
#ifdef CPP_THREAD_SAFETY_USE_OPENMP
#include <omp.h>
#else
#include <thread>
#endif
inline void pauser(){
/// a portable way to pause a program
std::string dummy;
@@ -13,6 +19,29 @@ void FailIfThreadsAreZero(uint32_t numConcurrentThreads) {
}
}
uint32_t GetMaxHwThreads() {
#ifdef CPP_THREAD_SAFETY_USE_OPENMP
return omp_get_max_threads();
#else
const uint32_t maxHwThreads = std::thread::hardware_concurrency();
return maxHwThreads == 0 ? 1 : maxHwThreads;
#endif
}
void SetLauncherThreads(uint32_t numConcurrentThreads) {
#ifdef CPP_THREAD_SAFETY_USE_OPENMP
omp_set_num_threads(numConcurrentThreads);
#endif
}
const char *LauncherName() {
#ifdef CPP_THREAD_SAFETY_USE_OPENMP
return " using OpenMP";
#else
return "";
#endif
}
void FillMatrices(std::vector<std::vector<double>>& matBlock, std::mt19937_64& PRNG, std::uniform_real_distribution<double>& rngdist, const blasint randomMatSize, const uint32_t numConcurrentThreads, const uint32_t numMat){
for(uint32_t i=0; i<numMat; i++){
for(uint32_t j = 0; j < static_cast<uint32_t>(randomMatSize*randomMatSize); j++){
+9 -4
View File
@@ -2,8 +2,11 @@
#include <vector>
#include <random>
#include <future>
#include <omp.h>
#ifdef OPENBLAS_USE_GENERATED_CBLAS_H
#include "generated/cblas.h"
#else
#include "../cblas.h"
#endif
#include "cpp_thread_safety_common.h"
void launch_cblas_dgemm(double* A, double* B, double* C, const blasint randomMatSize){
@@ -14,7 +17,7 @@ int main(int argc, char* argv[]){
blasint randomMatSize = 1024; //dimension of the random square matrices used
uint32_t numConcurrentThreads = 96; //number of concurrent calls of the functions being tested
uint32_t numTestRounds = 16; //number of testing rounds before success exit
uint32_t maxHwThreads = omp_get_max_threads();
uint32_t maxHwThreads = GetMaxHwThreads();
if (maxHwThreads < 96)
numConcurrentThreads = maxHwThreads;
@@ -65,11 +68,13 @@ int main(int argc, char* argv[]){
//PrintMatrices(matBlock, randomMatSize, numConcurrentThreads, 3);
std::cout<<"done\n";
std::cout<<"Testing CBLAS DGEMM thread safety\n";
omp_set_num_threads(numConcurrentThreads);
SetLauncherThreads(numConcurrentThreads);
for(uint32_t R=0; R<numTestRounds; R++){
std::cout<<"DGEMM round #"<<R<<std::endl;
std::cout<<"Launching "<<numConcurrentThreads<<" threads simultaneously using OpenMP..."<<std::flush;
std::cout<<"Launching "<<numConcurrentThreads<<" threads simultaneously"<<LauncherName()<<"..."<<std::flush;
#ifdef CPP_THREAD_SAFETY_USE_OPENMP
#pragma omp parallel for default(none) shared(futureBlock, matBlock, randomMatSize, numConcurrentThreads)
#endif
for(uint32_t i=0; i<numConcurrentThreads; i++){
futureBlock[i] = std::async(std::launch::async, launch_cblas_dgemm, &matBlock[i*3][0], &matBlock[i*3+1][0], &matBlock[i*3+2][0], randomMatSize);
//launch_cblas_dgemm( &matBlock[i][0], &matBlock[i+1][0], &matBlock[i+2][0]);
@@ -0,0 +1,173 @@
#include <atomic>
#include <cstdint>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <random>
#include <string>
#include <thread>
#include <vector>
#ifdef OPENBLAS_USE_GENERATED_CBLAS_H
#include "generated/cblas.h"
#else
#include "../cblas.h"
#endif
#include "cpp_thread_safety_common.h"
std::atomic<uint32_t> callbackInvocations(0);
void thread_callback(int sync, openblas_dojob_callback doJob, int numJobs,
size_t jobDataElementSize, void* jobData, int doJobData){
(void)sync;
callbackInvocations.fetch_add(1, std::memory_order_relaxed);
std::vector<std::thread> workers;
workers.reserve(numJobs);
char* jobs = static_cast<char*>(jobData);
for(int i=0; i<numJobs; i++)
workers.emplace_back(doJob, i, jobs + i * jobDataElementSize, doJobData);
for(auto& worker : workers)
worker.join();
}
void compute_dgemm_pair(std::vector<double>& transA, std::vector<double>& noTransA, std::vector<double>& B, double* firstOutput, double* secondOutput, const blasint randomMatSize, const bool sameVariant){
cblas_dgemm(CblasRowMajor, CblasTrans, CblasNoTrans, randomMatSize, 2, 2, 1.0, &transA[0], randomMatSize, &B[0], 2, 0.0, firstOutput, 2);
if (sameVariant)
cblas_dgemm(CblasRowMajor, CblasTrans, CblasNoTrans, randomMatSize, 2, 4, 1.0, &transA[0], randomMatSize, &B[0], 2, 0.0, secondOutput, 2);
else
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, randomMatSize, 2, 4, 1.0, &noTransA[0], 4, &B[0], 2, 0.0, secondOutput, 2);
}
void run_worker(std::vector<double>& transA, std::vector<double>& noTransA, std::vector<double>& B, const std::vector<double>& referenceFirst, const std::vector<double>& referenceSecond, const blasint randomMatSize, const uint32_t numTestRounds, const bool sameVariant, std::atomic<uint32_t>& readyThreads, std::atomic<bool>& startThreads, uint32_t& mismatches){
std::vector<double> firstOutput(static_cast<size_t>(randomMatSize) * 2);
std::vector<double> secondOutput(static_cast<size_t>(randomMatSize) * 2);
const size_t outputBytes = static_cast<size_t>(randomMatSize) * 2 * sizeof(double);
uint32_t localMismatches = 0;
readyThreads.fetch_add(1);
while (!startThreads.load())
std::this_thread::yield();
for(uint32_t i=0; i<numTestRounds; i++){
compute_dgemm_pair(transA, noTransA, B, &firstOutput[0], &secondOutput[0], randomMatSize, sameVariant);
if (std::memcmp(&firstOutput[0], &referenceFirst[0], outputBytes) != 0 ||
std::memcmp(&secondOutput[0], &referenceSecond[0], outputBytes) != 0)
localMismatches++;
}
mismatches = localMismatches;
}
int main(int argc, char* argv[]){
blasint randomMatSize = 262144;
uint32_t numConcurrentThreads = 8;
uint32_t numTestRounds = 200;
uint32_t maxHwThreads = GetMaxHwThreads();
bool sameVariant = false;
bool useCallback = false;
if (maxHwThreads < numConcurrentThreads)
numConcurrentThreads = maxHwThreads;
std::vector<std::string> positionalArgs;
for (int i = 1; i < argc; i++){
std::cout<<argv[i]<<std::endl;
if (std::string(argv[i]) == "--callback")
useCallback = true;
else
positionalArgs.push_back(argv[i]);
}
if (!positionalArgs.empty() && positionalArgs.size() != 3 && positionalArgs.size() != 4){
std::cout<<"ERROR: expected: [<M> <threads> <rounds> [sameVariant]] [--callback]"<<std::endl;
return 1;
}
if(!positionalArgs.empty()){
randomMatSize = std::stoul(positionalArgs[0]);
numConcurrentThreads = std::stoul(positionalArgs[1]);
numTestRounds = std::stoul(positionalArgs[2]);
if (positionalArgs.size() == 4)
sameVariant = std::stoul(positionalArgs[3]) != 0;
}
FailIfThreadsAreZero(numConcurrentThreads);
const size_t matrixElements = static_cast<size_t>(randomMatSize) * 4;
const size_t outputElements = static_cast<size_t>(randomMatSize) * 2;
std::vector<double> transA(matrixElements);
std::vector<double> noTransA(matrixElements);
std::vector<double> B(8);
std::vector<double> referenceFirst(outputElements);
std::vector<double> referenceSecond(outputElements);
std::vector<std::thread> threads(numConcurrentThreads);
std::vector<uint32_t> mismatchBlock(numConcurrentThreads);
std::atomic<uint32_t> readyThreads(0);
std::atomic<bool> startThreads(false);
std::cout<<"*----------------------------------*\n";
std::cout<<"| Mixed DGEMM thread safety tester |\n";
std::cout<<"*----------------------------------*\n";
std::cout<<"Tall-skinny DGEMM M dimension: "<<randomMatSize<<'\n';
std::cout<<"Number of concurrent calls into OpenBLAS : "<<numConcurrentThreads<<'\n';
std::cout<<"Number of testing rounds : "<<numTestRounds<<'\n';
std::cout<<"Second DGEMM uses "<<(sameVariant ? "the same transpose variant" : "a different transpose variant")<<'\n';
std::cout<<"OpenBLAS internal threads : "<<openblas_get_num_threads()<<'\n';
if (useCallback)
std::cout<<"Thread execution backend : caller callback\n";
std::cout<<"This test will need "<<(static_cast<uint64_t>(matrixElements) * 2 * 8 + static_cast<uint64_t>(outputElements) * (2 + 2 * numConcurrentThreads) * 8)/static_cast<double>(1024*1024)<<" MiB of RAM\n"<<std::endl;
std::cout<<"Filling matrices with deterministic values..."<<std::flush;
for(size_t i=0; i<matrixElements; i++){
transA[i] = static_cast<double>(i % 512);
noTransA[i] = static_cast<double>((i * 7) % 512);
}
std::cout<<"done\n";
std::cout<<"Filling RHS matrix..."<<std::flush;
for(uint32_t i=0; i<8; i++){
B[i] = 0.1 * static_cast<double>(i + 1);
}
std::cout<<"done\n";
std::cout<<"Computing reference results..."<<std::flush;
compute_dgemm_pair(transA, noTransA, B, &referenceFirst[0], &referenceSecond[0], randomMatSize, sameVariant);
std::cout<<"done\n";
if (useCallback)
openblas_set_threads_callback_function(thread_callback);
std::cout<<"Testing mixed CBLAS DGEMM thread safety\n";
std::cout<<"Launching "<<numConcurrentThreads<<" worker threads..."<<std::flush;
for(uint32_t i=0; i<numConcurrentThreads; i++){
threads[i] = std::thread(run_worker, std::ref(transA), std::ref(noTransA), std::ref(B), std::cref(referenceFirst), std::cref(referenceSecond), randomMatSize, numTestRounds, sameVariant, std::ref(readyThreads), std::ref(startThreads), std::ref(mismatchBlock[i]));
}
while (readyThreads.load() != numConcurrentThreads)
std::this_thread::yield();
startThreads.store(true);
std::cout<<"done\n";
std::cout<<"Waiting for worker threads to finish..."<<std::flush;
uint32_t mismatches = 0;
for(uint32_t i=0; i<numConcurrentThreads; i++){
threads[i].join();
mismatches += mismatchBlock[i];
}
std::cout<<"done\n";
if (useCallback) {
const uint32_t invocations = callbackInvocations.load();
std::cout<<"Thread callback invocations: "<<invocations<<std::endl;
if (invocations == 0) {
std::cout<<"Thread callback was not invoked!"<<std::endl;
return 1;
}
}
std::cout<<"Mixed DGEMM mismatches: "<<mismatches<<std::endl;
if (mismatches != 0) {
std::cout<<"Mixed CBLAS DGEMM thread safety test FAILED!"<<std::endl;
return 1;
}
std::cout<<"Mixed CBLAS DGEMM thread safety test PASSED!\n"<<std::endl;
return 0;
}
@@ -0,0 +1,165 @@
/* Stress test for library shutdown racing with in-flight BLAS calls
* (https://github.com/OpenMathLib/OpenBLAS/issues/5954).
*
* Windows only. On POSIX, exit() runs the library destructor while worker
* threads are still computing into OpenBLAS-owned buffers, which no amount of
* locking inside blas_shutdown can make safe, so there is nothing to assert
* there; CMakeLists.txt only registers this test on WIN32.
*
* The parent re-executes itself as short-lived children and checks that each
* one terminates cleanly, turning shutdown-path crashes and deadlocks into
* ordinary test failures. Each child (--child-storm N) starts N callers that
* allocate their matrices and park on a gate, releases them so they all enter
* their first dgemm at once, and exits a millisecond later while that
* allocation storm is still in flight.
*
* N must exceed NUM_BUFFERS = MAX(50, NUM_THREADS * 2 * NUM_PARALLEL) for the
* build under test; below that every slot is already mapped and the race is
* unreachable.
*/
#include <atomic>
#include <chrono>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#ifdef OPENBLAS_USE_GENERATED_CBLAS_H
#include "generated/cblas.h"
#else
#include "../cblas.h"
#endif
#include <windows.h>
namespace {
const blasint stormM = 200, stormK = 120, stormN = 90; /* the gh-5954 shape */
const blasint poolDim = 320; /* above the multithreading threshold, so the pool spins up */
const uint32_t defaultStormCallers = 128;
const uint32_t stormDelayMs = 3; /* gate to sweep; at 0 the sweep beats the allocations */
const int stormBlasThreads = 4;
const int stormTimeoutSec = 15;
const int numStormChildren = 40;
std::atomic<uint32_t> parked(0); /* callers built and waiting on the gate */
std::atomic<bool> gate(false);
void fillOperands(std::vector<double>& A, std::vector<double>& B) {
for (size_t i = 0; i < A.size(); i++) A[i] = (i % 1000) / 1000.0;
for (size_t i = 0; i < B.size(); i++) B[i] = (i % 997) / 997.0;
}
void dgemmOnce(blasint m, blasint k, blasint n) {
std::vector<double> A(m * k), B(k * n), C(m * n);
fillOperands(A, B);
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, m, n, k,
1.0, A.data(), m, B.data(), k, 0.1, C.data(), m);
}
/* Allocate before parking, so that when the gate opens nothing stands between
the thread and its first dgemm. */
void gatedWorker(blasint m, blasint k, blasint n) {
std::vector<double> A(m * k), B(k * n), C(m * n);
fillOperands(A, B);
parked.fetch_add(1, std::memory_order_release);
while (!gate.load(std::memory_order_acquire)) std::this_thread::yield();
for (;;)
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, m, n, k,
1.0, A.data(), m, B.data(), k, 0.1, C.data(), m);
}
int ChildStorm(uint32_t nCallers) {
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
openblas_set_num_threads(stormBlasThreads);
/* Build the OpenBLAS worker pool first, so the storm is buffer allocation
and not pool startup. */
dgemmOnce(poolDim, poolDim, poolDim);
for (uint32_t i = 0; i < nCallers; i++)
std::thread(gatedWorker, stormM, stormK, stormN).detach();
for (int ms = 0; parked.load(std::memory_order_acquire) < nCallers && ms < 10000; ms++)
std::this_thread::sleep_for(std::chrono::milliseconds(1));
gate.store(true, std::memory_order_release);
std::this_thread::sleep_for(std::chrono::milliseconds(stormDelayMs));
std::exit(0);
}
/* Returns 0 if the child exited cleanly, nonzero otherwise; fills outcome. */
int RunChild(const std::string& args, int timeoutSec, std::string& outcome) {
char exe[MAX_PATH];
if (GetModuleFileNameA(NULL, exe, MAX_PATH) == 0) {
outcome = "GetModuleFileName failed";
return 1;
}
std::string cmd = "\"" + std::string(exe) + "\" " + args;
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcessA(NULL, &cmd[0], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
outcome = "CreateProcess failed";
return 1;
}
int ret = 1;
char buf[64];
if (WaitForSingleObject(pi.hProcess, timeoutSec * 1000) != WAIT_OBJECT_0) {
TerminateProcess(pi.hProcess, 1);
WaitForSingleObject(pi.hProcess, 5000);
snprintf(buf, sizeof(buf), "HANG (killed after %ds)", timeoutSec);
} else {
DWORD code = 1;
GetExitCodeProcess(pi.hProcess, &code);
if (code == 0) {
snprintf(buf, sizeof(buf), "clean exit");
ret = 0;
} else {
snprintf(buf, sizeof(buf), "CRASH (exit code 0x%08lX)", (unsigned long)code);
}
}
outcome = buf;
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return ret;
}
} // namespace
int main(int argc, char* argv[]) {
if (argc >= 3 && std::strcmp(argv[1], "--child-storm") == 0)
return ChildStorm(uint32_t(std::atoi(argv[2])));
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
uint32_t callers = defaultStormCallers;
if (argc >= 2) {
int n = std::atoi(argv[1]);
if (n > 0) callers = uint32_t(n);
}
int failures = 0;
std::cout << "Testing process exit during an allocation storm (" << callers << " callers)"
<< std::endl;
for (int i = 0; i < numStormChildren; i++) {
std::string outcome;
failures += RunChild("--child-storm " + std::to_string(callers), stormTimeoutSec, outcome);
std::cout << " storm child " << i << ": " << outcome << std::endl;
}
if (failures) {
std::cout << "CBLAS DGEMM shutdown safety test FAILED! (" << failures
<< " child processes)" << std::endl;
return 1;
}
std::cout << "CBLAS DGEMM shutdown safety test PASSED!" << std::endl;
return 0;
}
+9 -4
View File
@@ -2,8 +2,11 @@
#include <vector>
#include <random>
#include <future>
#include <omp.h>
#ifdef OPENBLAS_USE_GENERATED_CBLAS_H
#include "generated/cblas.h"
#else
#include "../cblas.h"
#endif
#include "cpp_thread_safety_common.h"
void launch_cblas_dgemv(double* A, double* x, double* y, const blasint randomMatSize)
@@ -17,7 +20,7 @@ int main(int argc, char* argv[])
blasint randomMatSize = 1024; //dimension of the random square matrices and vectors being used
uint32_t numConcurrentThreads = 52; //number of concurrent calls of the functions being tested
uint32_t numTestRounds = 16; //number of testing rounds before success exit
uint32_t maxHwThreads = omp_get_max_threads();
uint32_t maxHwThreads = GetMaxHwThreads();
if (maxHwThreads < 52)
numConcurrentThreads = maxHwThreads;
@@ -84,12 +87,14 @@ int main(int argc, char* argv[])
std::cout<<"done\n";
std::cout<<"Testing CBLAS DGEMV thread safety"<<std::endl;
omp_set_num_threads(numConcurrentThreads);
SetLauncherThreads(numConcurrentThreads);
for(uint32_t R=0; R<numTestRounds; R++)
{
std::cout<<"DGEMV round #"<<R<<std::endl;
std::cout<<"Launching "<<numConcurrentThreads<<" threads simultaneously using OpenMP..."<<std::flush;
std::cout<<"Launching "<<numConcurrentThreads<<" threads simultaneously"<<LauncherName()<<"..."<<std::flush;
#ifdef CPP_THREAD_SAFETY_USE_OPENMP
#pragma omp parallel for default(none) shared(futureBlock, matBlock, vecBlock, randomMatSize, numConcurrentThreads)
#endif
for(uint32_t i=0; i<numConcurrentThreads; i++)
{
futureBlock[i] = std::async(std::launch::async, launch_cblas_dgemv, &matBlock[i][0], &vecBlock[i*2][0], &vecBlock[i*2+1][0], randomMatSize);
+8 -5
View File
@@ -321,8 +321,11 @@ int detect(void)
return CPU_CORTEXX2;
else if (strstr(cpu_part, "0xd4e")) //X3
return CPU_CORTEXX2;
else if (strstr(cpu_part, "0xd4f")) //NVIDIA Grace et al.
else if (strstr(cpu_part, "0xd4f"))
return CPU_NEOVERSEV2;
else if (strstr(cpu_part, "0xd87") || strstr(cpu_part, "0xd85") // A725,X925
|| strstr(cpu_part, "0xd84") || strstr(cpu_part, "0xd83")) // V3,V3AE
return CPU_NEOVERSEV2;
else if (strstr(cpu_part, "0xd0b"))
return CPU_CORTEXA76;
}
@@ -423,13 +426,13 @@ int detect(void)
if (errcode != ERROR_SUCCESS) wprintf(L"Error reading cpuname from registry:%x\n",errcode);
//wprintf(stderr,L"%s\n",(PWSTR)valstring);
RegCloseKey(reghandle);
if (strstr(valstring, "Snapdragon(R) X Elite")) {
if (strstr(pvalstring, "Snapdragon(R) X Elite")) {
aliased = 1;
return CPU_NEOVERSEN1;
}
if (strstr(valstring, "Ampere(R) Altra")) return CPU_NEOVERSEN1;
if (strstr(valstring, "Snapdragon (TM) 8cx Gen 3")) return CPU_CORTEXX1;
if (strstr(valstring, "Snapdragon Compute Platform")) return CPU_CORTEXX1;
if (strstr(pvalstring, "Ampere(R) Altra")) return CPU_NEOVERSEN1;
if (strstr(pvalstring, "Snapdragon (TM) 8cx Gen 3")) return CPU_CORTEXX1;
if (strstr(pvalstring, "Snapdragon Compute Platform")) return CPU_CORTEXX1;
#endif
#endif
return CPU_ARMV8;
+2 -2
View File
@@ -395,8 +395,8 @@ void get_cpuconfig(void) {
}
}
if(os_support_lsx) printf("#define HAVE_LSX\n");
if(os_support_lasx) printf("#define HAVE_LASX\n");
if(os_support_lsx()) printf("#define HAVE_LSX\n");
if(os_support_lasx()) printf("#define HAVE_LASX\n");
get_cpucount(&num_cores);
if (num_cores)
+40 -41
View File
@@ -1,5 +1,5 @@
/*****************************************************************************
Copyright (c) 2011-2014, The OpenBLAS Project
Copyright (c) 2011-2026, The OpenBLAS Project
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -13,9 +13,9 @@ met:
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. Neither the name of the OpenBLAS project nor the names of
its contributors may be used to endorse or promote products
derived from this software without specific prior written
3. Neither the name of the OpenBLAS project nor the names of
its contributors may be used to endorse or promote products
derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
@@ -109,7 +109,7 @@ int detect(void){
return CPU_1004K;
} else if (strstr(p, " 24K")) {
return CPU_24K;
} else
} else
return CPU_UNKNOWN;
}
#endif
@@ -136,6 +136,40 @@ void get_subdirname(void){
printf("mips");
}
int get_feature(char *search) {
#ifdef __linux
FILE *infile;
char buffer[2048], *p, *t;
p = (char *)NULL;
infile = fopen("/proc/cpuinfo", "r");
while (fgets(buffer, sizeof(buffer), infile)) {
if (!strncmp("Features", buffer, 8) ||
!strncmp("ASEs implemented", buffer, 16)) {
p = strchr(buffer, ':') + 2;
break;
}
}
fclose(infile);
if (p == NULL)
return 0;
t = strtok(p, " ");
while (t = strtok(NULL, " ")) {
if (strstr(t, search)) {
return (1);
}
}
#endif
return (0);
}
void get_cpuconfig(void){
if(detect()==CPU_P5600){
printf("#define P5600\n");
@@ -165,7 +199,7 @@ void get_cpuconfig(void){
}else{
printf("#define UNKNOWN\n");
}
#ifndef NO_MSA
#ifndef NO_MSA
if (get_feature("msa")) printf("#define HAVE_MSA\n");
#endif
}
@@ -181,38 +215,3 @@ void get_libname(void){
printf("mips\n");
}
}
int get_feature(char *search)
{
#ifdef __linux
FILE *infile;
char buffer[2048], *p,*t;
p = (char *) NULL ;
infile = fopen("/proc/cpuinfo", "r");
while (fgets(buffer, sizeof(buffer), infile))
{
if (!strncmp("Features", buffer, 8) || !strncmp("ASEs implemented", buffer, 16))
{
p = strchr(buffer, ':') + 2;
break;
}
}
fclose(infile);
if( p == NULL ) return 0;
t = strtok(p," ");
while( t = strtok(NULL," "))
{
if (strstr(t, search)) { return(1); }
}
#endif
return(0);
}
+39 -40
View File
@@ -1,5 +1,5 @@
/*****************************************************************************
Copyright (c) 2011-2014, The OpenBLAS Project
Copyright (c) 2011-2026, The OpenBLAS Project
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -13,9 +13,9 @@ met:
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. Neither the name of the OpenBLAS project nor the names of
its contributors may be used to endorse or promote products
derived from this software without specific prior written
3. Neither the name of the OpenBLAS project nor the names of
its contributors may be used to endorse or promote products
derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
@@ -145,13 +145,47 @@ void get_subarchitecture(void){
printf("SICORTEX");
}else{
printf("MIPS64_GENERIC");
}
}
}
void get_subdirname(void){
printf("mips64");
}
int get_feature(char *search) {
#ifdef __linux
FILE *infile;
char buffer[2048], *p, *t;
p = (char *)NULL;
infile = fopen("/proc/cpuinfo", "r");
while (fgets(buffer, sizeof(buffer), infile)) {
if (!strncmp("Features", buffer, 8) ||
!strncmp("ASEs implemented", buffer, 16)) {
p = strchr(buffer, ':') + 2;
break;
}
}
fclose(infile);
if (p == NULL)
return 0;
t = strtok(p, " ");
while (t = strtok(NULL, " ")) {
if (strstr(t, search)) {
return (1);
}
}
#endif
return (0);
}
void get_cpuconfig(void){
if(detect()==CPU_LOONGSON3R3) {
printf("#define LOONGSON3R3\n");
@@ -228,38 +262,3 @@ void get_libname(void){
printf("mips64_generic\n");
}
}
int get_feature(char *search)
{
#ifdef __linux
FILE *infile;
char buffer[2048], *p,*t;
p = (char *) NULL ;
infile = fopen("/proc/cpuinfo", "r");
while (fgets(buffer, sizeof(buffer), infile))
{
if (!strncmp("Features", buffer, 8) || !strncmp("ASEs implemented", buffer, 16))
{
p = strchr(buffer, ':') + 2;
break;
}
}
fclose(infile);
if( p == NULL ) return 0;
t = strtok(p," ");
while( t = strtok(NULL," "))
{
if (strstr(t, search)) { return(1); }
}
#endif
return(0);
}
+23 -8
View File
@@ -75,13 +75,15 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define CPU_x280 2
#define CPU_RISCV64_ZVL256B 3
#define CPU_RISCV64_ZVL128B 4
#define CPU_U74 5
static char *cpuname[] = {
"RISCV64_GENERIC",
"C910V",
"x280",
"CPU_RISCV64_ZVL256B",
"CPU_RISCV64_ZVL128B"
"CPU_RISCV64_ZVL128B",
"U74"
};
static char *cpuname_lower[] = {
@@ -89,15 +91,17 @@ static char *cpuname_lower[] = {
"c910v",
"x280",
"riscv64_zvl256b",
"riscv64_zvl128b"
"riscv64_zvl128b",
"u74"
};
int detect(void){
#ifdef __linux
FILE *infile;
char buffer[512],isa_buffer[512],model_buffer[512];
char buffer[512],isa_buffer[512],model_buffer[512], uarch_buffer[512];
const char* check_c910_str = "T-HEAD C910";
char *pmodel = NULL, *pisa = NULL;
const char* check_u74_str = "sifive,u74";
char *pmodel = NULL, *pisa = NULL, *puarch = NULL;
infile = fopen("/proc/cpuinfo", "r");
if (!infile)
@@ -110,6 +114,13 @@ int detect(void){
pmodel++;
}
if(!strncmp(buffer, "uarch", 5)){
strcpy(uarch_buffer, buffer);
puarch = strchr(uarch_buffer, ':');
if (puarch)
puarch++;
}
if(!strncmp(buffer, "isa", 3)){
strcpy(isa_buffer, buffer);
pisa = strchr(isa_buffer, '4');
@@ -120,12 +131,16 @@ int detect(void){
fclose(infile);
if (!pmodel || !pisa)
if ((!pmodel && !puarch) || !pisa)
return(CPU_GENERIC);
if (strstr(pmodel, check_c910_str) && strchr(pisa, 'v'))
return CPU_C910V;
if (pmodel) {
if (strstr(pmodel, check_c910_str) && strchr(pisa, 'v'))
return CPU_C910V;
} else if (puarch) {
if (strstr(puarch, check_u74_str) && !strchr(pisa, 'v'))
return CPU_U74;
}
return CPU_GENERIC;
#endif
+1696 -1755
View File
File diff suppressed because it is too large Load Diff
+4 -1
View File
@@ -178,7 +178,10 @@ ARCH_CSKY
#endif
#if defined(__EMSCRIPTEN__)
ARCH_RISCV64
ARCH_WASM
OS_WINDOWS
#endif
#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
OS_IOS
#endif
+1
View File
@@ -18,6 +18,7 @@ if(WIN32)
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/test_cblas_helper.ps1
"$ErrorActionPreference = \"Stop\"\n"
"Get-Content $args[1] | & $args[0]\n"
"exit $LASTEXITCODE\n"
)
set(test_helper powershell -ExecutionPolicy Bypass "${CMAKE_CURRENT_BINARY_DIR}/test_cblas_helper.ps1")
else()
+99 -99
View File
@@ -67,16 +67,16 @@ ztestl3o_3m = c_zblas3_3m.o c_z3chke_3m.o auxiliary.o c_xerbla.o constant.o
all :: all1 all2 all3
ifeq ($(BUILD_SINGLE),1)
all1targets += xscblat1
all1targets += xscblat1$(EXE)
endif
ifeq ($(BUILD_DOUBLE),1)
all1targets += xdcblat1
all1targets += xdcblat1$(EXE)
endif
ifeq ($(BUILD_COMPLEX),1)
all1targets += xccblat1
all1targets += xccblat1$(EXE)
endif
ifeq ($(BUILD_COMPLEX16),1)
all1targets += xzcblat1
all1targets += xzcblat1$(EXE)
endif
all1: $(all1targets)
@@ -84,44 +84,44 @@ all1: $(all1targets)
ifneq ($(CROSS), 1)
ifeq ($(USE_OPENMP), 1)
ifeq ($(BUILD_SINGLE),1)
OMP_NUM_THREADS=2 ./xscblat1
OMP_NUM_THREADS=2 ./xscblat1$(EXE)
endif
ifeq ($(BUILD_DOUBLE),1)
OMP_NUM_THREADS=2 ./xdcblat1
endif
OMP_NUM_THREADS=2 ./xdcblat1$(EXE)
endif
ifeq ($(BUILD_COMPLEX),1)
OMP_NUM_THREADS=2 ./xccblat1
OMP_NUM_THREADS=2 ./xccblat1$(EXE)
endif
ifeq ($(BUILD_COMPLEX16),1)
OMP_NUM_THREADS=2 ./xzcblat1
OMP_NUM_THREADS=2 ./xzcblat1$(EXE)
endif
else
ifeq ($(BUILD_SINGLE),1)
OPENBLAS_NUM_THREADS=2 ./xscblat1
OPENBLAS_NUM_THREADS=2 ./xscblat1$(EXE)
endif
ifeq ($(BUILD_DOUBLE),1)
OPENBLAS_NUM_THREADS=2 ./xdcblat1
OPENBLAS_NUM_THREADS=2 ./xdcblat1$(EXE)
endif
ifeq ($(BUILD_COMPLEX),1)
OPENBLAS_NUM_THREADS=2 ./xccblat1
OPENBLAS_NUM_THREADS=2 ./xccblat1$(EXE)
endif
ifeq ($(BUILD_COMPLEX16),1)
OPENBLAS_NUM_THREADS=2 ./xzcblat1
OPENBLAS_NUM_THREADS=2 ./xzcblat1$(EXE)
endif
endif
endif
ifeq ($(BUILD_SINGLE),1)
all2targets += xscblat2
all2targets += xscblat2$(EXE)
endif
ifeq ($(BUILD_DOUBLE),1)
all2targets += xdcblat2
all2targets += xdcblat2$(EXE)
endif
ifeq ($(BUILD_COMPLEX),1)
all2targets += xccblat2
all2targets += xccblat2$(EXE)
endif
ifeq ($(BUILD_COMPLEX16),1)
all2targets += xzcblat2
all2targets += xzcblat2$(EXE)
endif
all2: $(all2targets)
@@ -129,50 +129,50 @@ all2: $(all2targets)
ifneq ($(CROSS), 1)
ifeq ($(USE_OPENMP), 1)
ifeq ($(BUILD_SINGLE),1)
OMP_NUM_THREADS=2 ./xscblat2 < sin2
OMP_NUM_THREADS=2 ./xscblat2$(EXE) < sin2
endif
ifeq ($(BUILD_DOUBLE),1)
OMP_NUM_THREADS=2 ./xdcblat2 < din2
OMP_NUM_THREADS=2 ./xdcblat2$(EXE) < din2
endif
ifeq ($(BUILD_COMPLEX),1)
OMP_NUM_THREADS=2 ./xccblat2 < cin2
OMP_NUM_THREADS=2 ./xccblat2$(EXE) < cin2
endif
ifeq ($(BUILD_COMPLEX16),1)
OMP_NUM_THREADS=2 ./xzcblat2 < zin2
OMP_NUM_THREADS=2 ./xzcblat2$(EXE) < zin2
endif
else
ifeq ($(BUILD_SINGLE),1)
OPENBLAS_NUM_THREADS=2 ./xscblat2 < sin2
OPENBLAS_NUM_THREADS=2 ./xscblat2$(EXE) < sin2
endif
ifeq ($(BUILD_DOUBLE),1)
OPENBLAS_NUM_THREADS=2 ./xdcblat2 < din2
OPENBLAS_NUM_THREADS=2 ./xdcblat2$(EXE) < din2
endif
ifeq ($(BUILD_COMPLEX),1)
OPENBLAS_NUM_THREADS=2 ./xccblat2 < cin2
OPENBLAS_NUM_THREADS=2 ./xccblat2$(EXE) < cin2
endif
ifeq ($(BUILD_COMPLEX16),1)
OPENBLAS_NUM_THREADS=2 ./xzcblat2 < zin2
OPENBLAS_NUM_THREADS=2 ./xzcblat2$(EXE) < zin2
endif
endif
endif
ifeq ($(BUILD_SINGLE),1)
all3targets += xscblat3
all3targets += xscblat3$(EXE)
endif
ifeq ($(BUILD_DOUBLE),1)
all3targets += xdcblat3
all3targets += xdcblat3$(EXE)
endif
ifeq ($(BUILD_COMPLEX),1)
all3targets += xccblat3
all3targets += xccblat3$(EXE)
ifeq ($(SUPPORT_GEMM3M),1)
all3targets += xccblat3_3m
all3targets += xccblat3_3m$(EXE)
endif
endif
ifeq ($(BUILD_COMPLEX16),1)
all3targets += xzcblat3
all3targets += xzcblat3$(EXE)
ifeq ($(SUPPORT_GEMM3M),1)
all3targets += xzcblat3_3m
all3targets += xzcblat3_3m$(EXE)
endif
endif
@@ -181,46 +181,46 @@ all3: $(all3targets)
ifneq ($(CROSS), 1)
ifeq ($(USE_OPENMP), 1)
ifeq ($(BUILD_SINGLE),1)
OMP_NUM_THREADS=2 ./xscblat3 < sin3
OMP_NUM_THREADS=2 ./xscblat3$(EXE) < sin3
endif
ifeq ($(BUILD_DOUBLE),1)
OMP_NUM_THREADS=2 ./xdcblat3 < din3
OMP_NUM_THREADS=2 ./xdcblat3$(EXE) < din3
endif
ifeq ($(BUILD_COMPLEX),1)
OMP_NUM_THREADS=2 ./xccblat3 < cin3
OMP_NUM_THREADS=2 ./xccblat3$(EXE) < cin3
endif
ifeq ($(BUILD_COMPLEX16),1)
OMP_NUM_THREADS=2 ./xzcblat3 < zin3
OMP_NUM_THREADS=2 ./xzcblat3$(EXE) < zin3
endif
else
ifeq ($(BUILD_SINGLE),1)
OPENBLAS_NUM_THREADS=2 ./xscblat3 < sin3
OPENBLAS_NUM_THREADS=2 ./xscblat3$(EXE) < sin3
endif
ifeq ($(BUILD_DOUBLE),1)
OPENBLAS_NUM_THREADS=2 ./xdcblat3 < din3
OPENBLAS_NUM_THREADS=2 ./xdcblat3$(EXE) < din3
endif
ifeq ($(BUILD_COMPLEX),1)
OPENBLAS_NUM_THREADS=2 ./xccblat3 < cin3
OPENBLAS_NUM_THREADS=2 ./xccblat3$(EXE) < cin3
endif
ifeq ($(BUILD_COMPLEX16),1)
OPENBLAS_NUM_THREADS=2 ./xzcblat3 < zin3
OPENBLAS_NUM_THREADS=2 ./xzcblat3$(EXE) < zin3
endif
endif
ifeq ($(SUPPORT_GEMM3M),1)
ifeq ($(USE_OPENMP), 1)
ifeq ($(BUILD_COMPLEX),1)
OMP_NUM_THREADS=2 ./xccblat3_3m < cin3_3m
OMP_NUM_THREADS=2 ./xccblat3_3m$(EXE) < cin3_3m
endif
ifeq ($(BUILD_COMPLEX16),1)
OMP_NUM_THREADS=2 ./xzcblat3_3m < zin3_3m
OMP_NUM_THREADS=2 ./xzcblat3_3m$(EXE) < zin3_3m
endif
else
ifeq ($(BUILD_COMPLEX),1)
OPENBLAS_NUM_THREADS=2 ./xccblat3_3m < cin3_3m
OPENBLAS_NUM_THREADS=2 ./xccblat3_3m$(EXE) < cin3_3m
endif
ifeq ($(BUILD_COMPLEX16),1)
OPENBLAS_NUM_THREADS=2 ./xzcblat3_3m < zin3_3m
OPENBLAS_NUM_THREADS=2 ./xzcblat3_3m$(EXE) < zin3_3m
endif
endif
endif
@@ -254,64 +254,64 @@ endif
ifeq ($(BUILD_SINGLE),1)
# Single real
ifeq ($(NOFORTRAN), $(filter 0 2,$(NOFORTRAN)))
xscblat1: $(stestl1o) c_sblat1.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xscblat1 c_sblat1.o $(stestl1o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xscblat2: $(stestl2o) c_sblat2.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xscblat2 c_sblat2.o $(stestl2o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xscblat3: $(stestl3o) c_sblat3.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xscblat3 c_sblat3.o $(stestl3o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xscblat1$(EXE): $(stestl1o) c_sblat1.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_sblat1.o $(stestl1o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xscblat2$(EXE): $(stestl2o) c_sblat2.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_sblat2.o $(stestl2o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xscblat3$(EXE): $(stestl3o) c_sblat3.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_sblat3.o $(stestl3o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
else
xscblat1: $(stestl1o) c_sblat1c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xscblat1 c_sblat1c.o $(stestl1o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xscblat2: $(stestl2o) c_sblat2c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xscblat2 c_sblat2c.o $(stestl2o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xscblat3: $(stestl3o) c_sblat3c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xscblat3 c_sblat3c.o $(stestl3o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xscblat1$(EXE): $(stestl1o) c_sblat1c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_sblat1c.o $(stestl1o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xscblat2$(EXE): $(stestl2o) c_sblat2c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_sblat2c.o $(stestl2o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xscblat3$(EXE): $(stestl3o) c_sblat3c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_sblat3c.o $(stestl3o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
endif
endif
ifeq ($(BUILD_DOUBLE),1)
# Double real
ifeq ($(NOFORTRAN), $(filter 0 2,$(NOFORTRAN)))
xdcblat1: $(dtestl1o) c_dblat1.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xdcblat1 c_dblat1.o $(dtestl1o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xdcblat2: $(dtestl2o) c_dblat2.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xdcblat2 c_dblat2.o $(dtestl2o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xdcblat3: $(dtestl3o) c_dblat3.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xdcblat3 c_dblat3.o $(dtestl3o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xdcblat1$(EXE): $(dtestl1o) c_dblat1.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_dblat1.o $(dtestl1o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xdcblat2$(EXE): $(dtestl2o) c_dblat2.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_dblat2.o $(dtestl2o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xdcblat3$(EXE): $(dtestl3o) c_dblat3.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_dblat3.o $(dtestl3o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
else
xdcblat1: $(dtestl1o) c_dblat1c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xdcblat1 c_dblat1c.o $(dtestl1o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xdcblat2: $(dtestl2o) c_dblat2c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xdcblat2 c_dblat2c.o $(dtestl2o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xdcblat3: $(dtestl3o) c_dblat3c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xdcblat3 c_dblat3c.o $(dtestl3o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xdcblat1$(EXE): $(dtestl1o) c_dblat1c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_dblat1c.o $(dtestl1o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xdcblat2$(EXE): $(dtestl2o) c_dblat2c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_dblat2c.o $(dtestl2o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xdcblat3$(EXE): $(dtestl3o) c_dblat3c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_dblat3c.o $(dtestl3o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
endif
endif
ifeq ($(BUILD_COMPLEX),1)
# Single complex
ifeq ($(NOFORTRAN), $(filter 0 2,$(NOFORTRAN)))
xccblat1: $(ctestl1o) c_cblat1.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xccblat1 c_cblat1.o $(ctestl1o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xccblat2: $(ctestl2o) c_cblat2.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xccblat2 c_cblat2.o $(ctestl2o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xccblat3: $(ctestl3o) c_cblat3.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xccblat3 c_cblat3.o $(ctestl3o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xccblat1$(EXE): $(ctestl1o) c_cblat1.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_cblat1.o $(ctestl1o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xccblat2$(EXE): $(ctestl2o) c_cblat2.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_cblat2.o $(ctestl2o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xccblat3$(EXE): $(ctestl3o) c_cblat3.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_cblat3.o $(ctestl3o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
ifeq ($(SUPPORT_GEMM3M),1)
xccblat3_3m: $(ctestl3o_3m) c_cblat3_3m.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xccblat3_3m c_cblat3_3m.o $(ctestl3o_3m) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xccblat3_3m$(EXE): $(ctestl3o_3m) c_cblat3_3m.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_cblat3_3m.o $(ctestl3o_3m) $(LIB) $(EXTRALIB) $(CEXTRALIB)
endif
else
xccblat1: $(ctestl1o) c_cblat1c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xccblat1 c_cblat1c.o $(ctestl1o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xccblat2: $(ctestl2o) c_cblat2c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xccblat2 c_cblat2c.o $(ctestl2o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xccblat3: $(ctestl3o) c_cblat3c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xccblat3 c_cblat3c.o $(ctestl3o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xccblat1$(EXE): $(ctestl1o) c_cblat1c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_cblat1c.o $(ctestl1o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xccblat2$(EXE): $(ctestl2o) c_cblat2c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_cblat2c.o $(ctestl2o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xccblat3$(EXE): $(ctestl3o) c_cblat3c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_cblat3c.o $(ctestl3o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
ifeq ($(SUPPORT_GEMM3M),1)
xccblat3_3m: $(ctestl3o_3m) c_cblat3c_3m.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xccblat3_3m c_cblat3c_3m.o $(ctestl3o_3m) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xccblat3_3m$(EXE): $(ctestl3o_3m) c_cblat3c_3m.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_cblat3c_3m.o $(ctestl3o_3m) $(LIB) $(EXTRALIB) $(CEXTRALIB)
endif
endif
endif
@@ -320,26 +320,26 @@ endif
ifeq ($(BUILD_COMPLEX16),1)
# Double complex
ifeq ($(NOFORTRAN), $(filter 0 2,$(NOFORTRAN)))
xzcblat1: $(ztestl1o) c_zblat1.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xzcblat1 c_zblat1.o $(ztestl1o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xzcblat2: $(ztestl2o) c_zblat2.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xzcblat2 c_zblat2.o $(ztestl2o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xzcblat3: $(ztestl3o) c_zblat3.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xzcblat3 c_zblat3.o $(ztestl3o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xzcblat1$(EXE): $(ztestl1o) c_zblat1.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_zblat1.o $(ztestl1o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xzcblat2$(EXE): $(ztestl2o) c_zblat2.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_zblat2.o $(ztestl2o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xzcblat3$(EXE): $(ztestl3o) c_zblat3.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_zblat3.o $(ztestl3o) $(LIB) $(EXTRALIB) $(CEXTRALIB)
ifeq ($(SUPPORT_GEMM3M),1)
xzcblat3_3m: $(ztestl3o_3m) c_zblat3_3m.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o xzcblat3_3m c_zblat3_3m.o $(ztestl3o_3m) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xzcblat3_3m$(EXE): $(ztestl3o_3m) c_zblat3_3m.o $(TOPDIR)/$(LIBNAME)
$(FC) $(FLDFLAGS) -o $@ c_zblat3_3m.o $(ztestl3o_3m) $(LIB) $(EXTRALIB) $(CEXTRALIB)
endif
else
xzcblat1: $(ztestl1o) c_zblat1c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xzcblat1 c_zblat1c.o $(ztestl1o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xzcblat2: $(ztestl2o) c_zblat2c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xzcblat2 c_zblat2c.o $(ztestl2o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xzcblat3: $(ztestl3o) c_zblat3c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xzcblat3 c_zblat3c.o $(ztestl3o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xzcblat1$(EXE): $(ztestl1o) c_zblat1c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_zblat1c.o $(ztestl1o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xzcblat2$(EXE): $(ztestl2o) c_zblat2c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_zblat2c.o $(ztestl2o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
xzcblat3$(EXE): $(ztestl3o) c_zblat3c.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_zblat3c.o $(ztestl3o) $(LIB) $(CEXTRALIB) $(filter-out -lgfortran,$(EXTRALIB))
ifeq ($(SUPPORT_GEMM3M),1)
xzcblat3_3m: $(ztestl3o_3m) c_zblat3c_3m.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o xzcblat3_3m c_zblat3c_3m.o $(ztestl3o_3m) $(LIB) $(EXTRALIB) $(CEXTRALIB)
xzcblat3_3m$(EXE): $(ztestl3o_3m) c_zblat3c_3m.o $(TOPDIR)/$(LIBNAME)
$(CC) $(CFLAGS) -o $@ c_zblat3c_3m.o $(ztestl3o_3m) $(LIB) $(EXTRALIB) $(CEXTRALIB)
endif
endif
endif
+6 -15
View File
@@ -4,21 +4,14 @@
#include "cblas_test.h"
int cblas_ok, cblas_lerr, cblas_info;
int link_xerbla=TRUE;
char *cblas_rout;
#ifdef F77_Char
void F77_xerbla(F77_Char F77_srname, void *vinfo);
#else
void F77_xerbla(char *srname, void *vinfo);
#endif
void chkxer(void) {
extern int cblas_ok, cblas_lerr, cblas_info;
extern int link_xerbla;
extern char *cblas_rout;
if (cblas_lerr == 1 ) {
printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout);
printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %lld NOT DETECTED BY %s *****\n",
(long long)cblas_info, cblas_rout);
cblas_ok = 0 ;
}
cblas_lerr = 1 ;
@@ -36,11 +29,7 @@ void F77_c2chke(char *rout) {
extern int RowMajorStrg;
extern char *cblas_rout;
if (link_xerbla) /* call these first to link */
{
cblas_xerbla(cblas_info,cblas_rout,"");
F77_xerbla(cblas_rout,&cblas_info);
}
cblas_test_set_xerbla();
cblas_ok = TRUE ;
cblas_lerr = PASSED ;
@@ -821,6 +810,8 @@ void F77_c2chke(char *rout) {
}
if (cblas_ok == TRUE)
printf(" %-12s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout);
else
else {
printf("******* %s FAILED THE TESTS OF ERROR-EXITS *******\n",cblas_rout);
cblas_test_fail();
}
}
+6 -15
View File
@@ -4,21 +4,14 @@
#include "cblas_test.h"
int cblas_ok, cblas_lerr, cblas_info;
int link_xerbla=TRUE;
char *cblas_rout;
#ifdef F77_Char
void F77_xerbla(F77_Char F77_srname, void *vinfo);
#else
void F77_xerbla(char *srname, void *vinfo);
#endif
void chkxer(void) {
extern int cblas_ok, cblas_lerr, cblas_info;
extern int link_xerbla;
extern char *cblas_rout;
if (cblas_lerr == 1 ) {
printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout);
printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %lld NOT DETECTED BY %s *****\n",
(long long)cblas_info, cblas_rout);
cblas_ok = 0 ;
}
cblas_lerr = 1 ;
@@ -39,11 +32,7 @@ void F77_c3chke(char * rout) {
cblas_ok = TRUE ;
cblas_lerr = PASSED ;
if (link_xerbla) /* call these first to link */
{
cblas_xerbla(cblas_info,cblas_rout,"");
F77_xerbla(cblas_rout,&cblas_info);
}
cblas_test_set_xerbla();
if (strncmp( sf,"cblas_cgemm" ,11)==0) {
@@ -1703,6 +1692,8 @@ void F77_c3chke(char * rout) {
if (cblas_ok == 1 )
printf(" %-12s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout);
else
else {
printf("***** %s FAILED THE TESTS OF ERROR-EXITS *******\n",cblas_rout);
cblas_test_fail();
}
}
+6 -15
View File
@@ -4,21 +4,14 @@
#include "cblas_test.h"
int cblas_ok, cblas_lerr, cblas_info;
int link_xerbla=TRUE;
char *cblas_rout;
#ifdef F77_Char
void F77_xerbla(F77_Char F77_srname, void *vinfo);
#else
void F77_xerbla(char *srname, void *vinfo);
#endif
void chkxer(void) {
extern int cblas_ok, cblas_lerr, cblas_info;
extern int link_xerbla;
extern char *cblas_rout;
if (cblas_lerr == 1 ) {
printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout);
printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %lld NOT DETECTED BY %s *****\n",
(long long)cblas_info, cblas_rout);
cblas_ok = 0 ;
}
cblas_lerr = 1 ;
@@ -39,11 +32,7 @@ void F77_c3chke(char * rout) {
cblas_ok = TRUE ;
cblas_lerr = PASSED ;
if (link_xerbla) /* call these first to link */
{
cblas_xerbla(cblas_info,cblas_rout,"");
F77_xerbla(cblas_rout,&cblas_info);
}
cblas_test_set_xerbla();
if (strncmp( sf,"cblas_cgemm3m" ,13)==0) {
@@ -1931,6 +1920,8 @@ void F77_c3chke(char * rout) {
if (cblas_ok == 1 )
printf(" %-12s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout);
else
else {
printf("***** %s FAILED THE TESTS OF ERROR-EXITS *******\n",cblas_rout);
cblas_test_fail();
}
}
+8 -15
View File
@@ -23,17 +23,10 @@ typedef struct { real r, i; } complex;
typedef struct { doublereal r, i; } doublecomplex;
#ifdef _MSC_VER
static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;}
static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;}
static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;}
static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;}
#else
static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;}
static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;}
static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;}
static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;}
#endif
#define pCf(z) (*_pCf(z))
#define pCd(z) (*_pCd(z))
typedef int logical;
typedef short int shortlogical;
typedef char logical1;
@@ -440,12 +433,12 @@ static real c_b43 = (float)1.;
extern /* Subroutine */ int ctest_(integer*, complex*, complex*, complex*, real*);
static complex mwpcs[5], mwpct[5];
extern /* Subroutine */ int itest1_(integer*, integer*), stest1_(real*,real*,real*,real*);
extern /* Subroutine */ int cscaltest_(integer*, complex*, complex*, integer*);
extern /* Subroutine */ void cscaltest_(integer*, complex*, complex*, integer*);
static complex cx[8];
extern real scnrm2test_(integer*, complex*, integer*);
static integer np1;
extern integer icamaxtest_(integer*, complex*, integer*);
extern /* Subroutine */ int csscaltest_(integer*, real*, complex*, integer*);
extern /* Subroutine */ void csscaltest_(integer*, real*, complex*, integer*);
extern real scasumtest_(integer*, complex*, integer*);
static integer len;
@@ -468,7 +461,7 @@ static real c_b43 = (float)1.;
i__1 = len;
for (i__ = 1; i__ <= i__1; ++i__) {
i__2 = i__ - 1;
i__3 = i__ + (np1 + combla_1.incx * 5 << 3) - 49;
i__3 = i__ + ((np1 + combla_1.incx * 5) << 3) - 49;
cx[i__2].r = cv[i__3].r, cx[i__2].i = cv[i__3].i;
/* L20: */
}
@@ -483,13 +476,13 @@ static real c_b43 = (float)1.;
} else if (combla_1.icase == 8) {
/* .. CSCAL .. */
cscaltest_(&combla_1.n, &ca, cx, &combla_1.incx);
ctest_(&len, cx, &ctrue5[(np1 + combla_1.incx * 5 << 3) - 48],
&ctrue5[(np1 + combla_1.incx * 5 << 3) - 48], sfac);
ctest_(&len, cx, &ctrue5[((np1 + combla_1.incx * 5) << 3) - 48],
&ctrue5[((np1 + combla_1.incx * 5) << 3) - 48], sfac);
} else if (combla_1.icase == 9) {
/* .. CSSCALTEST .. */
csscaltest_(&combla_1.n, &sa, cx, &combla_1.incx);
ctest_(&len, cx, &ctrue6[(np1 + combla_1.incx * 5 << 3) - 48],
&ctrue6[(np1 + combla_1.incx * 5 << 3) - 48], sfac);
ctest_(&len, cx, &ctrue6[((np1 + combla_1.incx * 5) << 3) - 48],
&ctrue6[((np1 + combla_1.incx * 5) << 3) - 48], sfac);
} else if (combla_1.icase == 10) {
/* .. ICAMAXTEST .. */
i__1 = icamaxtest_(&combla_1.n, cx, &combla_1.incx);
@@ -737,7 +730,7 @@ static real c_b43 = (float)1.;
static complex ctemp;
extern /* Subroutine */ int ctest_(integer*, complex*, complex*, complex*, real*);
static integer ksize;
extern /* Subroutine */ int cdotctest_(integer*, complex*, integer*, complex*, integer*,complex*), ccopytest_(integer*, complex*, integer*, complex*, integer*), cdotutest_(integer*, complex*, integer*, complex*, integer*, complex*),
extern /* Subroutine */ void cdotctest_(integer*, complex*, integer*, complex*, integer*,complex*), ccopytest_(integer*, complex*, integer*, complex*, integer*), cdotutest_(integer*, complex*, integer*, complex*, integer*, complex*),
cswaptest_(integer*, complex*, integer*, complex*, integer*), caxpytest_(integer*, complex*, complex*, integer*, complex*, integer*);
static integer ki, kn;
static complex cx[7], cy[7];
+32 -46
View File
@@ -23,17 +23,12 @@ typedef struct { real r, i; } complex;
typedef struct { doublereal r, i; } doublecomplex;
#ifdef _MSC_VER
static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;}
static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;}
static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;}
static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;}
#else
static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;}
static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;}
static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;}
static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;}
#endif
#define pCf(z) (*_pCf(z))
#define pCd(z) (*_pCd(z))
typedef int logical;
typedef short int shortlogical;
typedef char logical1;
@@ -319,7 +314,7 @@ static logical c_false = FALSE_;
static char snamet[12];
static real thresh;
static logical rorder;
extern /* Subroutine */ void cc2chke_(char*, ftnlen);
extern /* Subroutine */ void cc2chke_(char*);
static integer layout;
static logical ltestt, tsterr;
static complex alf[7];
@@ -712,7 +707,7 @@ L100:
ftnlen)12);
/* Test error exits. */
if (tsterr) {
cc2chke_(snames[isnum - 1], (ftnlen)12);
cc2chke_(snames[isnum - 1]);
}
/* Test computations. */
infoc_1.infot = 0;
@@ -892,8 +887,8 @@ L240:
static integer ia, ib, ic;
static logical banded;
static integer nc, nd, im, in, kl, ml, nk, nl, ku, ix, iy, ms, lx, ly, ns;
extern /* Subroutine */ int ccgbmv_(integer*, char*, integer*, integer*, integer*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, complex*, integer*, ftnlen);
extern /* Subroutine */ void ccgemv_(integer*, char*, integer*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, complex*, integer*, ftnlen);
extern /* Subroutine */ void ccgbmv_(integer*, char*, integer*, integer*, integer*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, complex*, integer*);
extern /* Subroutine */ void ccgemv_(integer*, char*, integer*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, complex*, integer*);
extern logical lceres_(char*, char*, integer*, integer*, complex*, complex*, integer*, ftnlen, ftnlen);
static char ctrans[14];
static real errmax;
@@ -1142,8 +1137,7 @@ L240:
}
ccgemv_(iorder, trans, &m, &n, &alpha,
&aa[1], &lda, &xx[1], &incx,
&beta, &yy[1], &incy, (ftnlen)
1);
&beta, &yy[1], &incy);
} else if (banded) {
if (*trace) {
/*
@@ -1158,8 +1152,7 @@ L240:
}
ccgbmv_(iorder, trans, &m, &n, &kl, &
ku, &alpha, &aa[1], &lda, &xx[
1], &incx, &beta, &yy[1], &
incy, (ftnlen)1);
1], &incx, &beta, &yy[1], &incy);
}
/* Check if error-exit was taken incorrectly. */
@@ -1347,10 +1340,10 @@ L140:
static integer nc, ik, in;
static logical packed;
static integer nk, ks, ix, iy, ns, lx, ly;
extern /* Subroutine */ void cchbmv_(integer*, char*, integer*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, complex*, integer*, ftnlen);
extern /* Subroutine */ void cchemv_(integer*, char*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, complex*, integer*, ftnlen);
extern /* Subroutine */ void cchbmv_(integer*, char*, integer*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, complex*, integer*);
extern /* Subroutine */ void cchemv_(integer*, char*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, complex*, integer*);
extern logical lceres_(char*, char*, integer*, integer*, complex*, complex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cchpmv_(integer*, char*, integer*, complex*, complex*, complex*, integer*, complex*, complex*, integer*, ftnlen);
extern /* Subroutine */ void cchpmv_(integer*, char*, integer*, complex*, complex*, complex*, integer*, complex*, complex*, integer*);
static real errmax;
static complex transl;
static integer laa, lda;
@@ -1566,7 +1559,7 @@ L140:
}
cchemv_(iorder, uplo, &n, &alpha, &aa[1],
&lda, &xx[1], &incx, &beta, &yy[1]
, &incy, (ftnlen)1);
, &incy);
} else if (banded) {
if (*trace) {
/*
@@ -1581,7 +1574,7 @@ L140:
}
cchbmv_(iorder, uplo, &n, &k, &alpha, &aa[
1], &lda, &xx[1], &incx, &beta, &
yy[1], &incy, (ftnlen)1);
yy[1], &incy);
} else if (packed) {
if (*trace) {
/*
@@ -1596,7 +1589,7 @@ L140:
}
cchpmv_(iorder, uplo, &n, &alpha, &aa[1],
&xx[1], &incx, &beta, &yy[1], &
incy, (ftnlen)1);
incy);
}
/* Check if error-exit was taken incorrectly. */
@@ -1792,15 +1785,15 @@ L130:
static logical packed;
static integer nk, ks, ix, ns, lx;
extern logical lceres_(char*, char*, integer*, integer*, complex*, complex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cctbmv_(integer*, char*, char*, char*, integer*, integer*, complex*, integer*, complex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cctbsv_(integer*, char*, char*, char*, integer*, integer*, complex*, integer*, complex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cctbmv_(integer*, char*, char*, char*, integer*, integer*, complex*, integer*, complex*, integer*);
extern /* Subroutine */ void cctbsv_(integer*, char*, char*, char*, integer*, integer*, complex*, integer*, complex*, integer*);
static char ctrans[14];
extern /* Subroutine */ void cctpmv_(integer*, char*, char*, char*, integer*, complex*, complex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cctpmv_(integer*, char*, char*, char*, integer*, complex*, complex*, integer*);
static real errmax;
extern /* Subroutine */ void cctrmv_(integer*, char*, char*, char*, integer*, complex*, integer*, complex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cctpsv_(integer*, char*, char*, char*, integer*, complex*, complex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cctrmv_(integer*, char*, char*, char*, integer*, complex*, integer*, complex*, integer*);
extern /* Subroutine */ void cctpsv_(integer*, char*, char*, char*, integer*, complex*, complex*, integer*);
static complex transl;
extern /* Subroutine */ void cctrsv_(integer*, char*, char*, char*, integer*, complex*, integer*, complex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cctrsv_(integer*, char*, char*, char*, integer*, complex*, integer*, complex*, integer*);
static char transs[1];
static integer laa, icd, lda;
extern logical lce_(complex*, complex*, integer*);
@@ -2010,8 +2003,7 @@ L130:
f_rew(&al__1);*/
}
cctrmv_(iorder, uplo, trans, diag, &n, &
aa[1], &lda, &xx[1], &incx, (
ftnlen)1, (ftnlen)1, (ftnlen)1);
aa[1], &lda, &xx[1], &incx);
} else if (banded) {
if (*trace) {
/*
@@ -2025,8 +2017,7 @@ L130:
f_rew(&al__1);*/
}
cctbmv_(iorder, uplo, trans, diag, &n, &k,
&aa[1], &lda, &xx[1], &incx, (
ftnlen)1, (ftnlen)1, (ftnlen)1);
&aa[1], &lda, &xx[1], &incx);
} else if (packed) {
if (*trace) {
/*
@@ -2040,8 +2031,7 @@ L130:
f_rew(&al__1);*/
}
cctpmv_(iorder, uplo, trans, diag, &n, &
aa[1], &xx[1], &incx, (ftnlen)1, (
ftnlen)1, (ftnlen)1);
aa[1], &xx[1], &incx);
}
} else if (s_cmp(sname + 9, "sv", (ftnlen)2, (
ftnlen)2) == 0) {
@@ -2058,8 +2048,7 @@ L130:
f_rew(&al__1);*/
}
cctrsv_(iorder, uplo, trans, diag, &n, &
aa[1], &lda, &xx[1], &incx, (
ftnlen)1, (ftnlen)1, (ftnlen)1);
aa[1], &lda, &xx[1], &incx);
} else if (banded) {
if (*trace) {
/*
@@ -2073,8 +2062,7 @@ L130:
f_rew(&al__1);*/
}
cctbsv_(iorder, uplo, trans, diag, &n, &k,
&aa[1], &lda, &xx[1], &incx, (
ftnlen)1, (ftnlen)1, (ftnlen)1);
&aa[1], &lda, &xx[1], &incx);
} else if (packed) {
if (*trace) {
/*
@@ -2088,8 +2076,7 @@ L130:
f_rew(&al__1);*/
}
cctpsv_(iorder, uplo, trans, diag, &n, &
aa[1], &xx[1], &incx, (ftnlen)1, (
ftnlen)1, (ftnlen)1);
aa[1], &xx[1], &incx);
}
}
@@ -2634,10 +2621,10 @@ L150:
static char uplo[1];
static integer i__, j, n;
extern /* Subroutine */ int cmake_(char*, char*, char*, integer*, integer*, complex*, integer*, complex*, integer*, integer*, integer*, logical*, complex*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void ccher_(integer*, char*, integer*, real*, complex*, integer*, complex*, integer*, ftnlen);
extern /* Subroutine */ void ccher_(integer*, char*, integer*, real*, complex*, integer*, complex*, integer*);
static complex alpha, w[1];
static logical isame[13];
extern /* Subroutine */ void cchpr_(integer*, char*, integer*, real*, complex*, integer*, complex*, ftnlen);
extern /* Subroutine */ void cchpr_(integer*, char*, integer*, real*, complex*, integer*, complex*);
extern /* Subroutine */ int cmvch_(char*, integer*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, complex*, integer*, complex*, real*, complex*, real*, real*, logical*, integer*, logical*, ftnlen);
static integer nargs;
static logical reset;
@@ -2812,7 +2799,7 @@ L150:
f_rew(&al__1);*/
}
ccher_(iorder, uplo, &n, &ralpha, &xx[1], &incx, &aa[
1], &lda, (ftnlen)1);
1], &lda);
} else if (packed) {
if (*trace) {
/*
@@ -2825,8 +2812,7 @@ L150:
al__1.aunit = *ntra;
f_rew(&al__1);*/
}
cchpr_(iorder, uplo, &n, &ralpha, &xx[1], &incx, &aa[
1], (ftnlen)1);
cchpr_(iorder, uplo, &n, &ralpha, &xx[1], &incx, &aa[1]);
}
/* Check if error-exit was taken incorrectly. */
@@ -3005,8 +2991,8 @@ L130:
static integer incxs, incys;
static logical upper;
static char uplos[1];
extern /* Subroutine */ void ccher2_(integer*, char*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, integer*, ftnlen);
extern /* Subroutine */ void cchpr2_(integer*, char*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, ftnlen);
extern /* Subroutine */ void ccher2_(integer*, char*, integer*, complex*, complex*, integer*, complex*, integer*, complex*, integer*);
extern /* Subroutine */ void cchpr2_(integer*, char*, integer*, complex*, complex*, integer*, complex*, integer*, complex*);
static integer ia, ja, ic, nc, jj, lj, in;
static logical packed;
static integer ix, iy, ns, lx, ly;
@@ -3202,7 +3188,7 @@ L130:
f_rew(&al__1);*/
}
ccher2_(iorder, uplo, &n, &alpha, &xx[1], &incx, &
yy[1], &incy, &aa[1], &lda, (ftnlen)1);
yy[1], &incy, &aa[1], &lda);
} else if (packed) {
if (*trace) {
/*
@@ -3216,7 +3202,7 @@ L130:
f_rew(&al__1);*/
}
cchpr2_(iorder, uplo, &n, &alpha, &xx[1], &incx, &
yy[1], &incy, &aa[1], (ftnlen)1);
yy[1], &incy, &aa[1]);
}
/* Check if error-exit was taken incorrectly. */
+35 -40
View File
@@ -23,17 +23,12 @@ typedef struct { real r, i; } complex;
typedef struct { doublereal r, i; } doublecomplex;
#ifdef _MSC_VER
static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;}
static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;}
static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;}
static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;}
#else
static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;}
static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;}
static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;}
static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;}
#endif
#define pCf(z) (*_pCf(z))
#define pCd(z) (*_pCd(z))
typedef int logical;
typedef short int shortlogical;
typedef char logical1;
@@ -284,10 +279,10 @@ int /* Main program */ main(void)
real r__1;
/* Local variables */
integer nalf, idim[9];
logical same;
integer nbet, ntra;
logical rewi;
static integer nalf, idim[9];
static logical same;
static integer nbet, ntra;
static logical rewi;
extern /* Subroutine */ int cchk1_(char *, real *, real *, integer *,
integer *, logical *, logical *, logical *, integer *, integer *,
integer *, complex *, integer *, complex *, integer *, complex *,
@@ -311,35 +306,35 @@ int /* Main program */ main(void)
integer *, complex *, integer *, complex *, integer *, complex *,
complex *, complex *, complex *, complex *, complex *, complex *,
complex *, complex *, real *, complex *, integer *);
complex c__[4225] /* was [65][65] */;
real g[65];
integer i__, j, n;
logical fatal;
complex w[130];
static complex c__[4225] /* was [65][65] */;
static real g[65];
static integer i__, j, n;
static logical fatal;
static complex w[130];
extern /* Subroutine */ int cmmch_(char *, char *, integer *, integer *,
integer *, complex *, complex *, integer *, complex *, integer *,
complex *, complex *, integer *, complex *, real *, complex *,
integer *, real *, real *, logical *, integer *, logical *);
extern real sdiff_(real *, real *);
logical trace;
integer nidim;
char snaps[32];
integer isnum;
logical ltest[9];
complex aa[4225], ab[8450] /* was [65][130] */, bb[4225], cc[4225], as[
static logical trace;
static integer nidim;
static char snaps[32];
static integer isnum;
static logical ltest[9];
static complex aa[4225], ab[8450] /* was [65][130] */, bb[4225], cc[4225], as[
4225], bs[4225], cs[4225], ct[65];
logical sfatal, corder;
char snamet[12], transa[1], transb[1];
real thresh;
logical rorder;
extern /* Subroutine */ int cc3chke_(char *);
integer layout;
logical ltestt, tsterr;
complex alf[7];
static logical sfatal, corder;
static char snamet[12], transa[1], transb[1];
static real thresh;
static logical rorder;
extern /* Subroutine */ void cc3chke_(char *);
static integer layout;
static logical ltestt, tsterr;
static complex alf[7];
extern logical lce_(complex *, complex *, integer *);
complex bet[7];
real eps, err;
char tmpchar;
static complex bet[7];
static real eps, err;
static char tmpchar;
/* Test program for the COMPLEX Level 3 Blas. */
@@ -856,7 +851,7 @@ L230:
*, char *, char *, integer *, integer *, integer *, complex *,
integer *, integer *, complex *, integer *);
integer ia, ib, ma, mb, na, nb, nc, ik, im, in;
extern /* Subroutine */ int ccgemm_(integer *, char *, char *, integer *,
extern /* Subroutine */ void ccgemm_(integer *, char *, char *, integer *,
integer *, integer *, complex *, complex *, integer *, complex *,
integer *, complex *, complex *, integer *);
integer ks, ms, ns;
@@ -1268,13 +1263,13 @@ L130:
*, char *, char *, integer *, integer *, complex *, integer *,
integer *, complex *, integer *);
integer ia, ib, na, nc, im, in;
extern /* Subroutine */ int cchemm_(integer *, char *, char *, integer *,
extern /* Subroutine */ void cchemm_(integer *, char *, char *, integer *,
integer *, complex *, complex *, integer *, complex *, integer *,
complex *, complex *, integer *);
integer ms, ns;
extern logical lceres_(char *, char *, integer *, integer *, complex *,
complex *, integer *);
extern /* Subroutine */ int ccsymm_(integer *, char *, char *, integer *,
extern /* Subroutine */ void ccsymm_(integer *, char *, char *, integer *,
integer *, complex *, complex *, integer *, complex *, integer *,
complex *, complex *, integer *);
real errmax;
@@ -1668,11 +1663,11 @@ L120:
integer ia, na, nc, im, in, ms, ns;
extern logical lceres_(char *, char *, integer *, integer *, complex *,
complex *, integer *);
extern /* Subroutine */ int cctrmm_(integer *, char *, char *, char *,
extern /* Subroutine */ void cctrmm_(integer *, char *, char *, char *,
char *, integer *, integer *, complex *, complex *, integer *,
complex *, integer *);
char tranas[1], transa[1];
extern /* Subroutine */ int cctrsm_(integer *, char *, char *, char *,
extern /* Subroutine */ void cctrsm_(integer *, char *, char *, char *,
char *, integer *, integer *, complex *, complex *, integer *,
complex *, integer *);
real errmax;
@@ -2143,7 +2138,7 @@ L160:
integer *, char *, integer *, char *, char *, integer *, integer *
, real *, integer *, real *, integer *);
integer ia, ib, jc, ma, na, nc, ik, in, jj, lj, ks;
extern /* Subroutine */ int ccherk_(integer *, char *, char *, integer *,
extern /* Subroutine */ void ccherk_(integer *, char *, char *, integer *,
integer *, real *, complex *, integer *, real *, complex *,
integer *);
integer ns;
@@ -2151,7 +2146,7 @@ L160:
extern logical lceres_(char *, char *, integer *, integer *, complex *,
complex *, integer *);
real errmax;
extern /* Subroutine */ int ccsyrk_(integer *, char *, char *, integer *,
extern /* Subroutine */ void ccsyrk_(integer *, char *, char *, integer *,
integer *, complex *, complex *, integer *, complex *, complex *,
integer *);
char transs[1], transt[1];
@@ -2643,12 +2638,12 @@ L130:
complex *, integer *);
real errmax;
char transs[1], transt[1];
extern /* Subroutine */ int ccher2k_(integer *, char *, char *, integer *,
extern /* Subroutine */ void ccher2k_(integer *, char *, char *, integer *,
integer *, complex *, complex *, integer *, complex *, integer *,
real *, complex *, integer *);
integer laa, lbb, lda, lcc, ldb, ldc;
extern logical lce_(complex *, complex *, integer *);
extern /* Subroutine */ int ccsyr2k_(integer *, char *, char *, integer *,
extern /* Subroutine */ void ccsyr2k_(integer *, char *, char *, integer *,
integer *, complex *, complex *, integer *, complex *, integer *,
complex *, complex *, integer *);
complex als;
+6 -15
View File
@@ -4,21 +4,14 @@
#include "cblas_test.h"
int cblas_ok, cblas_lerr, cblas_info;
int link_xerbla=TRUE;
char *cblas_rout;
#ifdef F77_Char
void F77_xerbla(F77_Char F77_srname, void *vinfo);
#else
void F77_xerbla(char *srname, void *vinfo);
#endif
void chkxer(void) {
extern int cblas_ok, cblas_lerr, cblas_info;
extern int link_xerbla;
extern char *cblas_rout;
if (cblas_lerr == 1 ) {
printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout);
printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %lld NOT DETECTED BY %s *****\n",
(long long)cblas_info, cblas_rout);
cblas_ok = 0 ;
}
cblas_lerr = 1 ;
@@ -34,11 +27,7 @@ void F77_d2chke(char *rout) {
extern int RowMajorStrg;
extern char *cblas_rout;
if (link_xerbla) /* call these first to link */
{
cblas_xerbla(cblas_info,cblas_rout,"");
F77_xerbla(cblas_rout,&cblas_info);
}
cblas_test_set_xerbla();
cblas_ok = TRUE ;
cblas_lerr = PASSED ;
@@ -784,6 +773,8 @@ void F77_d2chke(char *rout) {
}
if (cblas_ok == TRUE)
printf(" %-12s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout);
else
else {
printf("******* %s FAILED THE TESTS OF ERROR-EXITS *******\n",cblas_rout);
cblas_test_fail();
}
}
+6 -15
View File
@@ -4,21 +4,14 @@
#include "cblas_test.h"
int cblas_ok, cblas_lerr, cblas_info;
int link_xerbla=TRUE;
char *cblas_rout;
#ifdef F77_Char
void F77_xerbla(F77_Char F77_srname, void *vinfo);
#else
void F77_xerbla(char *srname, void *vinfo);
#endif
void chkxer(void) {
extern int cblas_ok, cblas_lerr, cblas_info;
extern int link_xerbla;
extern char *cblas_rout;
if (cblas_lerr == 1 ) {
printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %d NOT DETECTED BY %s *****\n", cblas_info, cblas_rout);
printf("***** ILLEGAL VALUE OF PARAMETER NUMBER %lld NOT DETECTED BY %s *****\n",
(long long)cblas_info, cblas_rout);
cblas_ok = 0 ;
}
cblas_lerr = 1 ;
@@ -34,11 +27,7 @@ void F77_d3chke(char *rout) {
extern int RowMajorStrg;
extern char *cblas_rout;
if (link_xerbla) /* call these first to link */
{
cblas_xerbla(cblas_info,cblas_rout,"");
F77_xerbla(cblas_rout,&cblas_info);
}
cblas_test_set_xerbla();
cblas_ok = TRUE ;
cblas_lerr = PASSED ;
@@ -1266,6 +1255,8 @@ void F77_d3chke(char *rout) {
}
if (cblas_ok == TRUE )
printf(" %-12s PASSED THE TESTS OF ERROR-EXITS\n", cblas_rout);
else
else {
printf("***** %s FAILED THE TESTS OF ERROR-EXITS *******\n",cblas_rout);
cblas_test_fail();
}
}
+1 -1
View File
@@ -54,7 +54,7 @@ void F77_drot( const int *N, double *X, const int *incX, double *Y,
}
void F77_drotm(const int *N, double *X, const int *incX, double *Y,
const int *incY, const double *dparam)
const int *incY, double *dparam)
{
cblas_drotm(*N, X, *incX, Y, *incY, dparam);
return;
+13 -8
View File
@@ -332,7 +332,8 @@ static doublereal c_b34 = 1.;
/* Local variables */
static integer k;
extern /* Subroutine */ int drotgtest_(doublereal*,doublereal*,doublereal*,doublereal*), stest1_(doublereal*,doublereal*,doublereal*,doublereal*);
extern /* Subroutine */ void drotgtest_(doublereal*,doublereal*,doublereal*,doublereal*);
extern int stest1_(doublereal*,doublereal*,doublereal*,doublereal*);
static doublereal sa, sb, sc, ss;
/* .. Parameters .. */
@@ -404,7 +405,8 @@ L40:
static integer i__;
extern doublereal dnrm2test_(integer*, doublereal*, integer*);
static doublereal stemp[1], strue[8];
extern /* Subroutine */ int stest_(integer*,doublereal*,doublereal*,doublereal*,doublereal*), dscaltest_(integer*,doublereal*,doublereal*,integer*);
extern /* Subroutine */ int stest_(integer*,doublereal*,doublereal*,doublereal*,doublereal*);
extern void dscaltest_(integer*,doublereal*,doublereal*,integer*);
extern doublereal dasumtest_(integer*,doublereal*,integer*);
extern /* Subroutine */ int itest1_(integer*,integer*), stest1_(doublereal*,doublereal*,doublereal*,doublereal*);
static doublereal sx[8];
@@ -430,7 +432,7 @@ L40:
/* .. Set vector arguments .. */
i__1 = len;
for (i__ = 1; i__ <= i__1; ++i__) {
sx[i__ - 1] = dv[i__ + (np1 + combla_1.incx * 5 << 3) - 49];
sx[i__ - 1] = dv[i__ + ((np1 + combla_1.incx * 5) << 3) - 49];
/* L20: */
}
@@ -450,7 +452,7 @@ L40:
, sx, &combla_1.incx);
i__1 = len;
for (i__ = 1; i__ <= i__1; ++i__) {
strue[i__ - 1] = dtrue5[i__ + (np1 + combla_1.incx * 5 <<
strue[i__ - 1] = dtrue5[i__ + ((np1 + combla_1.incx * 5) <<
3) - 49];
/* L40: */
}
@@ -517,8 +519,10 @@ L40:
static integer lenx, leny;
extern doublereal ddottest_(integer*,doublereal*,integer*,doublereal*,integer*);
static integer i__, j, ksize;
extern /* Subroutine */ int stest_(integer*,doublereal*,doublereal*,doublereal*,doublereal*), dcopytest_(integer*,doublereal*,integer*,doublereal*,integer*), dswaptest_(integer*,doublereal*,integer*,doublereal*,integer*),
daxpytest_(integer*,doublereal*,doublereal*,integer*,doublereal*,integer*), stest1_(doublereal*,doublereal*,doublereal*,doublereal*);
extern /* Subroutine */ int stest_(integer*,doublereal*,doublereal*,doublereal*,doublereal*);
extern void dcopytest_(integer*,doublereal*,integer*,doublereal*,integer*), dswaptest_(integer*,doublereal*,integer*,doublereal*,integer*),
daxpytest_(integer*,doublereal*,doublereal*,integer*,doublereal*,integer*);
extern int stest1_(doublereal*,doublereal*,doublereal*,doublereal*);
static integer ki, kn, mx, my;
static doublereal sx[7], sy[7], stx[7], sty[7];
@@ -618,9 +622,10 @@ L40:
;
/* Local variables */
extern /* Subroutine */ int drottest_(integer*,doublereal*,integer*,doublereal*,integer*,doublereal*,doublereal*);
extern /* Subroutine */ void drottest_(integer*,doublereal*,integer*,doublereal*,integer*,doublereal*,doublereal*);
static integer i__, k, ksize;
extern /* Subroutine */int stest_(integer*,doublereal*,doublereal*,doublereal*,doublereal*), drotmtest_(integer*,doublereal*,integer*,doublereal*,integer*,doublereal*);
extern /* Subroutine */int stest_(integer*,doublereal*,doublereal*,doublereal*,doublereal*);
extern void drotmtest_(integer*,doublereal*,integer*,doublereal*,integer*,doublereal*);
static integer ki, kn;
static doublereal dparam[5], sx[10], sy[10], stx[10], sty[10];
+32 -53
View File
@@ -21,19 +21,6 @@ typedef float real;
typedef double doublereal;
typedef struct { real r, i; } complex;
typedef struct { doublereal r, i; } doublecomplex;
#ifdef _MSC_VER
static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;}
static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;}
static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;}
static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;}
#else
static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;}
static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;}
static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;}
static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;}
#endif
#define pCf(z) (*_pCf(z))
#define pCd(z) (*_pCd(z))
typedef int logical;
typedef short int shortlogical;
typedef char logical1;
@@ -318,7 +305,7 @@ static logical c_false = FALSE_;
static char snamet[12];
static doublereal thresh;
static logical rorder;
extern /* Subroutine */ void cd2chke_(char*, ftnlen);
extern /* Subroutine */ void cd2chke_(char*);
static integer layout;
static logical ltestt, tsterr;
static doublereal alf[7];
@@ -706,7 +693,7 @@ L100:
ftnlen)12);
/* Test error exits. */
if (tsterr) {
cd2chke_(snames[isnum - 1], (ftnlen)12);
cd2chke_(snames[isnum - 1]);
}
/* Test computations. */
infoc_1.infot = 0;
@@ -885,8 +872,8 @@ L240:
static integer ia, ib, ic;
static logical banded;
static integer nc, nd, im, in, kl, ml, nk, nl, ku, ix, iy, ms, lx, ly, ns;
extern /* Subroutine */ void cdgbmv_(integer*, char*, integer*, integer*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*, ftnlen);
extern /* Subroutine */ void cdgemv_(integer*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*, ftnlen);
extern /* Subroutine */ void cdgbmv_(integer*, char*, integer*, integer*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*);
extern /* Subroutine */ void cdgemv_(integer*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*);
extern logical lderes_(char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
static char ctrans[14];
static doublereal errmax, transl;
@@ -1118,8 +1105,7 @@ L240:
}
cdgemv_(iorder, trans, &m, &n, &alpha,
&aa[1], &lda, &xx[1], &incx,
&beta, &yy[1], &incy, (ftnlen)
1);
&beta, &yy[1], &incy);
} else if (banded) {
if (*trace) {
/*
@@ -1135,7 +1121,7 @@ L240:
cdgbmv_(iorder, trans, &m, &n, &kl, &
ku, &alpha, &aa[1], &lda, &xx[
1], &incx, &beta, &yy[1], &
incy, (ftnlen)1);
incy);
}
/* Check if error-exit was taken incorrectly. */
@@ -1329,10 +1315,10 @@ L140:
static logical packed;
static integer nk, ks, ix, iy, ns, lx, ly;
extern logical lderes_(char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cdsbmv_(integer*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*, ftnlen);
extern /* Subroutine */ void cdspmv_(integer*, char*, integer*, doublereal*, doublereal*, doublereal*, integer*, doublereal*, doublereal*, integer*, ftnlen);
extern /* Subroutine */ void cdsbmv_(integer*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*);
extern /* Subroutine */ void cdspmv_(integer*, char*, integer*, doublereal*, doublereal*, doublereal*, integer*, doublereal*, doublereal*, integer*);
static doublereal errmax, transl;
extern /* Subroutine */ void cdsymv_(integer*, char*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*, ftnlen);
extern /* Subroutine */ void cdsymv_(integer*, char*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*);
static integer laa, lda;
extern logical lde_(doublereal*, doublereal*, integer*);
static doublereal als, bls, err;
@@ -1536,7 +1522,7 @@ L140:
}
cdsymv_(iorder, uplo, &n, &alpha, &aa[1],
&lda, &xx[1], &incx, &beta, &yy[1]
, &incy, (ftnlen)1);
, &incy);
} else if (banded) {
if (*trace) {
/*
@@ -1551,7 +1537,7 @@ L140:
}
cdsbmv_(iorder, uplo, &n, &k, &alpha, &aa[
1], &lda, &xx[1], &incx, &beta, &
yy[1], &incy, (ftnlen)1);
yy[1], &incy);
} else if (packed) {
if (*trace) {
/*
@@ -1566,7 +1552,7 @@ L140:
}
cdspmv_(iorder, uplo, &n, &alpha, &aa[1],
&xx[1], &incx, &beta, &yy[1], &
incy, (ftnlen)1);
incy);
}
/* Check if error-exit was taken incorrectly. */
@@ -1770,15 +1756,15 @@ L130:
static logical packed;
static integer nk, ks, ix, ns, lx;
extern logical lderes_(char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cdtbmv_(integer*, char*, char*, char*, integer*, integer*, doublereal*, integer*, doublereal*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cdtbsv_(integer*, char*, char*, char*, integer*, integer*, doublereal*, integer*, doublereal*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cdtbmv_(integer*, char*, char*, char*, integer*, integer*, doublereal*, integer*, doublereal*, integer*);
extern /* Subroutine */ void cdtbsv_(integer*, char*, char*, char*, integer*, integer*, doublereal*, integer*, doublereal*, integer*);
static char ctrans[14];
static doublereal errmax;
extern /* Subroutine */ void cdtpmv_(integer*, char*, char*, char*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cdtrmv_(integer*, char*, char*, char*, integer*, doublereal*, integer*, doublereal*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cdtpmv_(integer*, char*, char*, char*, integer*, doublereal*, doublereal*, integer*);
extern /* Subroutine */ void cdtrmv_(integer*, char*, char*, char*, integer*, doublereal*, integer*, doublereal*, integer*);
static doublereal transl;
extern /* Subroutine */ void cdtpsv_(integer*, char*, char*, char*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cdtrsv_(integer*, char*, char*, char*, integer*, doublereal*, integer*, doublereal*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cdtpsv_(integer*, char*, char*, char*, integer*, doublereal*, doublereal*, integer*);
extern /* Subroutine */ void cdtrsv_(integer*, char*, char*, char*, integer*, doublereal*, integer*, doublereal*, integer*);
static char transs[1];
static integer laa, icd, lda;
extern logical lde_(doublereal*, doublereal*, integer*);
@@ -1978,8 +1964,7 @@ L130:
f_rew(&al__1);*/
}
cdtrmv_(iorder, uplo, trans, diag, &n, &
aa[1], &lda, &xx[1], &incx, (
ftnlen)1, (ftnlen)1, (ftnlen)1);
aa[1], &lda, &xx[1], &incx);
} else if (banded) {
if (*trace) {
/*
@@ -1993,8 +1978,7 @@ L130:
f_rew(&al__1);*/
}
cdtbmv_(iorder, uplo, trans, diag, &n, &k,
&aa[1], &lda, &xx[1], &incx, (
ftnlen)1, (ftnlen)1, (ftnlen)1);
&aa[1], &lda, &xx[1], &incx);
} else if (packed) {
if (*trace) {
/*
@@ -2008,8 +1992,7 @@ L130:
f_rew(&al__1);*/
}
cdtpmv_(iorder, uplo, trans, diag, &n, &
aa[1], &xx[1], &incx, (ftnlen)1, (
ftnlen)1, (ftnlen)1);
aa[1], &xx[1], &incx);
}
} else if (s_cmp(sname + 9, "sv", (ftnlen)2, (
ftnlen)2) == 0) {
@@ -2026,8 +2009,7 @@ L130:
f_rew(&al__1);*/
}
cdtrsv_(iorder, uplo, trans, diag, &n, &
aa[1], &lda, &xx[1], &incx, (
ftnlen)1, (ftnlen)1, (ftnlen)1);
aa[1], &lda, &xx[1], &incx);
} else if (banded) {
if (*trace) {
/*
@@ -2041,8 +2023,7 @@ L130:
f_rew(&al__1);*/
}
cdtbsv_(iorder, uplo, trans, diag, &n, &k,
&aa[1], &lda, &xx[1], &incx, (
ftnlen)1, (ftnlen)1, (ftnlen)1);
&aa[1], &lda, &xx[1], &incx);
} else if (packed) {
if (*trace) {
/*
@@ -2056,8 +2037,7 @@ L130:
f_rew(&al__1);*/
}
cdtpsv_(iorder, uplo, trans, diag, &n, &
aa[1], &xx[1], &incx, (ftnlen)1, (
ftnlen)1, (ftnlen)1);
aa[1], &xx[1], &incx);
}
}
@@ -2587,11 +2567,11 @@ L150:
static logical isame[13];
extern /* Subroutine */ int dmvch_(char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*, doublereal*, doublereal*, doublereal*, doublereal*, doublereal*, logical*, integer*, logical*, ftnlen);
static integer nargs;
extern /* Subroutine */ void cdspr_(integer*, char*, integer*, doublereal*, doublereal*, integer*, doublereal*, ftnlen);
extern /* Subroutine */ void cdspr_(integer*, char*, integer*, doublereal*, doublereal*, integer*, doublereal*);
static logical reset;
static char cuplo[14];
static integer incxs;
extern /* Subroutine */ void cdsyr_(integer*, char*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, ftnlen);
extern /* Subroutine */ void cdsyr_(integer*, char*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*);
static logical upper;
static char uplos[1];
static integer ia, ja, ic, nc, jj, lj, in;
@@ -2751,7 +2731,7 @@ L150:
f_rew(&al__1);*/
}
cdsyr_(iorder, uplo, &n, &alpha, &xx[1], &incx, &aa[1]
, &lda, (ftnlen)1);
, &lda);
} else if (packed) {
if (*trace) {
/*
@@ -2764,8 +2744,7 @@ L150:
al__1.aunit = *ntra;
f_rew(&al__1);*/
}
cdspr_(iorder, uplo, &n, &alpha, &xx[1], &incx, &aa[1]
, (ftnlen)1);
cdspr_(iorder, uplo, &n, &alpha, &xx[1], &incx, &aa[1]);
}
/* Check if error-exit was taken incorrectly. */
@@ -2948,8 +2927,8 @@ L130:
static integer incxs, incys;
static logical upper;
static char uplos[1];
extern /* Subroutine */ void cdspr2_(integer*, char*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, ftnlen);
extern /* Subroutine */ void cdsyr2_(integer*, char*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, integer*, ftnlen);
extern /* Subroutine */ void cdspr2_(integer*, char*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*);
extern /* Subroutine */ void cdsyr2_(integer*, char*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, integer*);
static integer ia, ja, ic, nc, jj, lj, in;
static logical packed;
static integer ix, iy, ns, lx, ly;
@@ -3132,7 +3111,7 @@ L130:
f_rew(&al__1);*/
}
cdsyr2_(iorder, uplo, &n, &alpha, &xx[1], &incx, &
yy[1], &incy, &aa[1], &lda, (ftnlen)1);
yy[1], &incy, &aa[1], &lda);
} else if (packed) {
if (*trace) {
/*
@@ -3146,7 +3125,7 @@ L130:
f_rew(&al__1);*/
}
cdspr2_(iorder, uplo, &n, &alpha, &xx[1], &incx, &
yy[1], &incy, &aa[1], (ftnlen)1);
yy[1], &incy, &aa[1]);
}
/* Check if error-exit was taken incorrectly. */
+14 -32
View File
@@ -21,19 +21,6 @@ typedef float real;
typedef double doublereal;
typedef struct { real r, i; } complex;
typedef struct { doublereal r, i; } doublecomplex;
#ifdef _MSC_VER
static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;}
static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;}
static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;}
static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;}
#else
static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;}
static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;}
static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;}
static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;}
#endif
#define pCf(z) (*_pCf(z))
#define pCd(z) (*_pCd(z))
typedef int logical;
typedef short int shortlogical;
typedef char logical1;
@@ -309,7 +296,7 @@ static logical c_false = FALSE_;
static char snamet[12], transa[1], transb[1];
static doublereal thresh;
static logical rorder;
extern /* Subroutine */ void cd3chke_(char*, ftnlen);
extern /* Subroutine */ void cd3chke_(char*);
static integer layout;
static logical ltestt, tsterr;
static doublereal alf[7];
@@ -658,7 +645,7 @@ L80:
ftnlen)12);
/* Test error exits. */
if (tsterr) {
cd3chke_(snames[isnum - 1], (ftnlen)12);
cd3chke_(snames[isnum - 1]);
}
/* Test computations. */
infoc_1.infot = 0;
@@ -807,7 +794,7 @@ L230:
static logical reset;
extern /* Subroutine */ void dprcn1_(integer*, integer*, char*, integer*, char*, char*, integer*, integer*, integer*, doublereal*, integer*, integer*, doublereal*, integer*, ftnlen, ftnlen, ftnlen);
static integer ia, ib, ma, mb, na, nb, nc, ik, im, in;
extern /* Subroutine */ void cdgemm_(integer*, char*, char*, integer*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cdgemm_(integer*, char*, char*, integer*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*);
static integer ks, ms, ns;
extern logical lderes_(char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
static char tranas[1], tranbs[1], transa[1], transb[1];
@@ -1012,8 +999,7 @@ L230:
}
cdgemm_(iorder, transa, transb, &m, &n, &k, &
alpha, &aa[1], &lda, &bb[1], &ldb, &
beta, &cc[1], &ldc, (ftnlen)1, (
ftnlen)1);
beta, &cc[1], &ldc);
/* Check if error-exit was taken incorrectly. */
@@ -1204,7 +1190,7 @@ L130:
extern /* Subroutine */ void dprcn2_(integer*, integer*, char*, integer*, char*, char*, integer*, integer*, doublereal*, integer*, integer*, doublereal*, integer*, ftnlen, ftnlen, ftnlen);
static integer ia, ib, na, nc, im, in, ms, ns;
extern logical lderes_(char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cdsymm_(integer*, char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cdsymm_(integer*, char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*);
static doublereal errmax;
static integer laa, lbb, lda, lcc, ldb, ldc;
extern logical lde_(doublereal*, doublereal*, integer*);
@@ -1386,8 +1372,7 @@ L130:
f_rew(&al__1);*/
}
cdsymm_(iorder, side, uplo, &m, &n, &alpha, &aa[1]
, &lda, &bb[1], &ldb, &beta, &cc[1], &ldc,
(ftnlen)1, (ftnlen)1);
, &lda, &bb[1], &ldb, &beta, &cc[1], &ldc);
/* Check if error-exit was taken incorrectly. */
@@ -1580,9 +1565,9 @@ L120:
extern /* Subroutine */ void dprcn3_(integer*, integer*, char*, integer*, char*, char*, char*, char*, integer*, integer*, doublereal*, integer*, integer*, ftnlen, ftnlen, ftnlen, ftnlen, ftnlen);
static integer ia, na, nc, im, in, ms, ns;
extern logical lderes_(char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cdtrmm_(integer*, char*, char*, char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, ftnlen, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cdtrmm_(integer*, char*, char*, char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*);
static char tranas[1], transa[1];
extern /* Subroutine */ void cdtrsm_(integer*, char*, char*, char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, ftnlen, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cdtrsm_(integer*, char*, char*, char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*);
static doublereal errmax;
static integer laa, icd, lbb, lda, ldb;
extern logical lde_(doublereal*, doublereal*, integer*);
@@ -1762,8 +1747,7 @@ L120:
}
cdtrmm_(iorder, side, uplo, transa, diag,
&m, &n, &alpha, &aa[1], &lda, &bb[
1], &ldb, (ftnlen)1, (ftnlen)1, (
ftnlen)1, (ftnlen)1);
1], &ldb);
} else if (s_cmp(sname + 9, "sm", (ftnlen)2, (
ftnlen)2) == 0) {
if (*trace) {
@@ -1780,8 +1764,7 @@ L120:
}
cdtrsm_(iorder, side, uplo, transa, diag,
&m, &n, &alpha, &aa[1], &lda, &bb[
1], &ldb, (ftnlen)1, (ftnlen)1, (
ftnlen)1, (ftnlen)1);
1], &ldb);
}
/* Check if error-exit was taken incorrectly. */
@@ -2038,7 +2021,7 @@ L160:
static integer ia, ib, jc, ma, na, nc, ik, in, jj, lj, ks, ns;
extern logical lderes_(char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
static doublereal errmax;
extern /* Subroutine */ void cdsyrk_(integer*, char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cdsyrk_(integer*, char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, doublereal*, integer*);
static char transs[1];
static integer laa, lda, lcc, ldc;
extern logical lde_(doublereal*, doublereal*, integer*);
@@ -2199,8 +2182,7 @@ L160:
f_rew(&al__1);*/
}
cdsyrk_(iorder, uplo, trans, &n, &k, &alpha, &aa[
1], &lda, &beta, &cc[1], &ldc, (ftnlen)1,
(ftnlen)1);
1], &lda, &beta, &cc[1], &ldc);
/* Check if error-exit was taken incorrectly. */
@@ -2420,7 +2402,7 @@ L130:
static char transs[1];
static integer laa, lbb, lda, lcc, ldb, ldc;
extern logical lde_(doublereal*, doublereal*, integer*);
extern /* Subroutine */ void cdsyr2k_(integer*, char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cdsyr2k_(integer*, char*, char*, integer*, integer*, doublereal*, doublereal*, integer*, doublereal*, integer*, doublereal*, doublereal*, integer*);
static doublereal als;
static integer ict, icu;
static doublereal err;
@@ -2604,7 +2586,7 @@ L130:
}
cdsyr2k_(iorder, uplo, trans, &n, &k, &alpha, &aa[
1], &lda, &bb[1], &ldb, &beta, &cc[1], &
ldc, (ftnlen)1, (ftnlen)1);
ldc);
/* Check if error-exit was taken incorrectly. */

Some files were not shown because too many files have changed in this diff Show More