Compare commits

...
290 Commits
Author SHA1 Message Date
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 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
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
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
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
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 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
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
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
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
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
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
teddygood 53d0be88f8 Add WebAssembly SIMD backend for universal intrinsics 2026-03-18 03:23:31 +09: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
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
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
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
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
Martin Kroeker 0ae18524cd Add Arrow Lake H/U 2026-02-05 20:18:46 +01: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
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 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
457 changed files with 18685 additions and 14942 deletions
+5 -3
View File
@@ -89,14 +89,16 @@ task:
type: text/plain
macos_instance:
image: ghcr.io/cirruslabs/macos-sonoma-xcode:latest
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
- make TARGET=ARMV7 ARM_SOFTFP_ABI=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1 RANLIB="ls -l"
- 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*"
@@ -151,7 +153,7 @@ FreeBSD_task:
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
- 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
+1
View File
@@ -99,6 +99,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 }}"
+1 -1
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 32.dev)
set(OpenBLAS_VERSION "${OpenBLAS_MAJOR_VERSION}.${OpenBLAS_MINOR_VERSION}.${OpenBLAS_PATCH_VERSION}")
+3
View File
@@ -272,3 +272,6 @@ 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
+84 -1
View File
@@ -1,7 +1,90 @@
OpenBLAS ChangeLog
====================================================================
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
+1 -1
View File
@@ -3,7 +3,7 @@
#
# This library's version
VERSION = 0.3.31
VERSION = 0.3.32.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
+1
View File
@@ -0,0 +1 @@
CCOMMON_OPT += -msimd128
+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
+24 -7
View File
@@ -148,11 +148,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
@@ -186,9 +187,13 @@ 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
- **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
@@ -249,9 +254,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 +288,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.
- **MinGW or Visual Studio (CMake)/Windows**: Please read <https://github.com/OpenMathLib/OpenBLAS/docs/nstall.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. We don't actively test the library on this OS.
- **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/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/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.
+4
View File
@@ -153,3 +153,7 @@ EV6
14.CSKY
CSKY
CK860FV
15. WebAssembly/Emscripten:
WASM128_GENERIC
+4
View File
@@ -91,6 +91,7 @@ jobs:
openblas_utest.exe
- job: Windows_mingw_gmake
timeoutInMinutes: 100
pool:
vmImage: 'windows-latest'
steps:
@@ -185,6 +186,7 @@ jobs:
variables:
LD_LIBRARY_PATH: /usr/local/opt/llvm/lib
LIBRARY_PATH: /usr/local/opt/llvm/lib
RANLIB: touch
steps:
- script: |
brew update
@@ -197,6 +199,7 @@ jobs:
variables:
LD_LIBRARY_PATH: /usr/local/opt/llvm/lib
LIBRARY_PATH: /usr/local/opt/llvm/lib
RANLIB: touch
steps:
- script: |
brew update
@@ -240,6 +243,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: |
+1 -1
View File
@@ -3155,7 +3155,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) $^
+7 -1
View File
@@ -23,6 +23,7 @@ config="$2"
compiler_name="$3"
shift 3
flags="$*"
is_ios=false
# First, we need to know the target OS and compiler name
{
@@ -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*) is_ios=true ;; 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'
@@ -417,6 +421,8 @@ fi
[ "$os" = "Android" ] && [ "$hostos" = "Linux" ] && [ -n "$TERMUX_APP_PID" ] \
&& cross=0
[ "$is_ios" = true ] && cross=1
[ "$USE_OPENMP" != 1 ] && openmp=''
linker_L=""
+2
View File
@@ -48,9 +48,11 @@ 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 (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 ACLE supported in LLVM >= 19 and AppleClang >= 17
set(DYNAMIC_CORE ${DYNAMIC_CORE} ARMV9SME VORTEXM4)
endif()
endif()
endif ()
if (DYNAMIC_LIST)
set(DYNAMIC_CORE ARMV8 ${DYNAMIC_LIST})
+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 ()
+8 -6
View File
@@ -71,7 +71,7 @@ set(SLASRC
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
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
@@ -178,6 +178,7 @@ set(CLASRC
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
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
@@ -262,7 +263,7 @@ set(DLASRC
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
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
@@ -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 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
@@ -575,7 +576,7 @@ set(SLASRC
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
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
@@ -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
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
@@ -764,7 +766,7 @@ set(DLASRC
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
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
@@ -871,7 +873,7 @@ 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
zlarcm.c zlarf.c zlarfb.c zlarfb_gett.c zlarf1f.c zlarf1l.c
zlarfg.c zlarfgp.c zlarft.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
+13
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"
@@ -1500,6 +1504,15 @@ endif ()
"#define DTB_DEFAULT_ENTRIES 128\n"
"#define DTB_SIZE 4096\n"
"#define L2_ASSOCIATIVE 4\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")
+5
View File
@@ -381,6 +381,7 @@ if (${TARGET} STREQUAL NEOVERSEV1)
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 ()
set (GCC_VERSION 0.0)
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)
set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.2-a+sve -mtune=a64fx")
@@ -878,6 +879,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 ()
+11
View File
@@ -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,6 +147,15 @@ 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)
+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)
+7 -1
View File
@@ -386,9 +386,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
@@ -498,6 +500,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];
+4
View File
@@ -3159,6 +3159,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 +3182,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
+3
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;
+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
+2
View File
@@ -323,6 +323,8 @@ int detect(void)
return CPU_CORTEXX2;
else if (strstr(cpu_part, "0xd4f")) //NVIDIA Grace et al.
return CPU_NEOVERSEV2;
else if (strstr(cpu_part, "0xd87") || strstr(cpu_part, "0xd85") || strstr(cpu_part, "0xd83")) // X925/A725
return CPU_NEOVERSEV2;
else if (strstr(cpu_part, "0xd0b"))
return CPU_CORTEXA76;
}
+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);
}
+1694 -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)
OS_IOS
#endif
+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;
+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. */
+10 -6
View File
@@ -342,7 +342,8 @@ static real c_b34 = (float)1.;
/* Local variables */
static integer k;
extern /* Subroutine */ int srotgtest_(real*,real*,real*,real*), stest1_(real*,real*,real*,real*);
extern /* Subroutine */ void srotgtest_(real*,real*,real*,real*);
extern int stest1_(real*,real*,real*,real*);
static real sa, sb, sc, ss;
/* .. Parameters .. */
@@ -435,7 +436,8 @@ L40:
static integer i__;
extern real snrm2test_(integer*,real*,integer*);
static real stemp[1], strue[8];
extern /* Subroutine */ int stest_(integer*, real*,real*,real*,real*), sscaltest_(integer*,real*,real*,integer*);
extern /* Subroutine */ int stest_(integer*, real*,real*,real*,real*);
extern void sscaltest_(integer*,real*,real*,integer*);
extern real sasumtest_(integer*,real*,integer*);
extern /* Subroutine */ int itest1_(integer*,integer*), stest1_(real*,real*,real*,real*);
static real sx[8];
@@ -462,7 +464,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: */
}
@@ -482,7 +484,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: */
}
@@ -592,7 +594,8 @@ L40:
static integer lenx, leny;
extern real sdottest_(integer*,real*,integer*,real*,integer*);
static integer i__, j, ksize;
extern /* Subroutine */ int stest_(integer*,real*,real*,real*,real*), scopytest_(integer*,real*,integer*,real*,integer*), sswaptest_(integer*,real*,integer*,real*,integer*),
extern /* Subroutine */ int stest_(integer*,real*,real*,real*,real*);
extern void scopytest_(integer*,real*,integer*,real*,integer*), sswaptest_(integer*,real*,integer*,real*,integer*),
saxpytest_(integer*,real*,real*,integer*,real*,integer*);
static integer ki;
extern /* Subroutine */ int stest1_(real*,real*,real*,real*);
@@ -710,7 +713,8 @@ L40:
/* Local variables */
extern /* Subroutine */ void srottest_(integer*,real*,integer*,real*,integer*,real*,real*);
static integer i__, k, ksize;
extern /* Subroutine */ int stest_(integer*,real*,real*,real*,real*), srotmtest_(integer*,real*,integer*,real*,integer*,real*);
extern /* Subroutine */ int stest_(integer*,real*,real*,real*,real*);
extern void srotmtest_(integer*,real*,integer*,real*,integer*,real*);
static integer ki, kn;
static real sx[19], sy[19], sparam[5], stx[19], sty[19];
+34 -55
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;
@@ -319,7 +306,7 @@ extern /* Subroutine */ int schk6_(char* sname, real* eps, real* thresh, integer
static logical rorder;
static integer layout;
static logical ltestt;
extern /* Subroutine */ int cs2chke_(char*, ftnlen);
extern /* Subroutine */ void cs2chke_(char*);
static logical tsterr;
static real alf[7];
static integer inc[7], nkb;
@@ -702,7 +689,7 @@ L100:
ftnlen)12);
/* Test error exits. */
if (tsterr) {
cs2chke_(snames[isnum - 1], (ftnlen)12);
cs2chke_(snames[isnum - 1]);
}
/* Test computations. */
infoc_1.infot = 0;
@@ -880,8 +867,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 csgbmv_(integer*, char*, integer*, integer*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, ftnlen);
extern /* Subroutine */ void csgemv_(integer*, char*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, ftnlen);
extern /* Subroutine */ void csgbmv_(integer*, char*, integer*, integer*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*);
extern /* Subroutine */ void csgemv_(integer*, char*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*);
static char ctrans[14];
static real errmax;
extern logical lseres_(char* type__, char* uplo, integer* m, integer* n, real* aa, real* as, integer* lda, ftnlen ltype_len, ftnlen uplo_len);
@@ -1115,8 +1102,7 @@ L240:
}
csgemv_(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) {
/*
@@ -1132,7 +1118,7 @@ L240:
csgbmv_(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. */
@@ -1327,10 +1313,10 @@ L140:
static integer nk, ks, ix, iy, ns, lx, ly;
static real errmax;
extern logical lseres_(char* , char*, integer*, integer*, real*, real*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cssbmv_(integer*, char*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, ftnlen);
extern /* Subroutine */ void cssbmv_(integer*, char*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*);
static real transl;
extern /* Subroutine */ void csspmv_(integer*, char*, integer*, real*, real*, real*, integer*, real*, real*, integer*, ftnlen);
extern /* Subroutine */ void cssymv_(integer*, char*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, ftnlen);
extern /* Subroutine */ void csspmv_(integer*, char*, integer*, real*, real*, real*, integer*, real*, real*, integer*);
extern /* Subroutine */ void cssymv_(integer*, char*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*);
static integer laa, lda;
static real als, bls;
extern logical lse_(real*, real*, integer*);
@@ -1531,7 +1517,7 @@ L140:
}
cssymv_(iorder, uplo, &n, &alpha, &aa[1],
&lda, &xx[1], &incx, &beta, &yy[1]
, &incy, (ftnlen)1);
, &incy);
} else if (banded) {
if (*trace) {
/*
@@ -1546,7 +1532,7 @@ L140:
}
cssbmv_(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) {
/*
@@ -1561,7 +1547,7 @@ L140:
}
csspmv_(iorder, uplo, &n, &alpha, &aa[1],
&xx[1], &incx, &beta, &yy[1], &
incy, (ftnlen)1);
incy);
}
/* Check if error-exit was taken incorrectly. */
@@ -1767,14 +1753,14 @@ L130:
static char ctrans[14];
static real errmax;
extern logical lseres_(char*, char*, integer*, integer*, real*, real*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cstbmv_(integer*, char*, char*, char*, integer*, integer*, real*, integer*, real*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cstbmv_(integer*, char*, char*, char*, integer*, integer*, real*, integer*, real*, integer*);
static real transl;
extern /* Subroutine */ void cstbsv_(integer*, char*, char*, char*, integer*, integer*, real*, integer*, real*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cstbsv_(integer*, char*, char*, char*, integer*, integer*, real*, integer*, real*, integer*);
static char transs[1];
extern /* Subroutine */ void cstpmv_(integer*, char*, char*, char*, integer*, real*, real*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cstrmv_(integer*, char*, char*, char*, integer*, real*, integer*, real*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cstpsv_(integer*, char*, char*, char*, integer*, real*, real*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cstrsv_(integer*, char*, char*, char*, integer*, real*, integer*, real*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cstpmv_(integer*, char*, char*, char*, integer*, real*, real*, integer*);
extern /* Subroutine */ void cstrmv_(integer*, char*, char*, char*, integer*, real*, integer*, real*, integer*);
extern /* Subroutine */ void cstpsv_(integer*, char*, char*, char*, integer*, real*, real*, integer*);
extern /* Subroutine */ void cstrsv_(integer*, char*, char*, char*, integer*, real*, integer*, real*, integer*);
static integer laa, icd, lda, ict, icu;
extern logical lse_(real*, real*, integer*);
static real err;
@@ -1972,8 +1958,7 @@ L130:
f_rew(&al__1);*/
}
cstrmv_(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) {
/*
@@ -1987,8 +1972,7 @@ L130:
f_rew(&al__1);*/
}
cstbmv_(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) {
/*
@@ -2002,8 +1986,7 @@ L130:
f_rew(&al__1);*/
}
cstpmv_(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) {
@@ -2020,8 +2003,7 @@ L130:
f_rew(&al__1);*/
}
cstrsv_(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) {
/*
@@ -2035,8 +2017,7 @@ L130:
f_rew(&al__1);*/
}
cstbsv_(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) {
/*
@@ -2050,8 +2031,7 @@ L130:
f_rew(&al__1);*/
}
cstpsv_(iorder, uplo, trans, diag, &n, &
aa[1], &xx[1], &incx, (ftnlen)1, (
ftnlen)1, (ftnlen)1);
aa[1], &xx[1], &incx);
}
}
@@ -2585,10 +2565,10 @@ L150:
static logical reset;
static char cuplo[14];
static integer incxs;
extern /* Subroutine */ void csspr_(integer*, char*, integer*, real*, real*, integer*, real*, ftnlen);
extern /* Subroutine */ void csspr_(integer*, char*, integer*, real*, real*, integer*, real*);
static logical upper;
static char uplos[1];
extern /* Subroutine */ void cssyr_(integer*, char*, integer*, real*, real*, integer*, real*, integer*, ftnlen);
extern /* Subroutine */ void cssyr_(integer*, char*, integer*, real*, real*, integer*, real*, integer*);
static integer ia, ja, ic, nc, jj, lj, in;
static logical packed;
static integer ix, ns, lx;
@@ -2747,7 +2727,7 @@ L150:
f_rew(&al__1);*/
}
cssyr_(iorder, uplo, &n, &alpha, &xx[1], &incx, &aa[1]
, &lda, (ftnlen)1);
, &lda);
} else if (packed) {
if (*trace) {
/*
@@ -2760,8 +2740,7 @@ L150:
al__1.aunit = *ntra;
f_rew(&al__1);*/
}
csspr_(iorder, uplo, &n, &alpha, &xx[1], &incx, &aa[1]
, (ftnlen)1);
csspr_(iorder, uplo, &n, &alpha, &xx[1], &incx, &aa[1]);
}
/* Check if error-exit was taken incorrectly. */
@@ -2945,13 +2924,13 @@ L130:
static logical upper;
static char uplos[1];
static integer ia, ja, ic;
extern /* Subroutine */ void csspr2_(integer*, char*, integer*, real*, real*, integer*, real*, integer*, real*, ftnlen);
extern /* Subroutine */ void csspr2_(integer*, char*, integer*, real*, real*, integer*, real*, integer*, real*);
static integer nc, jj, lj, in;
static logical packed;
extern /* Subroutine */ void cssyr2_(integer*, char*, integer*, real*, real*, integer*, real*, integer*, real*, integer*, ftnlen);
extern /* Subroutine */ void cssyr2_(integer*, char*, integer*, real*, real*, integer*, real*, integer*, real*, integer*);
static integer ix, iy, ns, lx, ly;
static real errmax;
extern logical lseres_(char* type__, char* uplo, integer* m, integer* n, real* aa, real* as, integer* lda, ftnlen ltype_len, ftnlen uplo_len);
extern logical lseres_(char* type__, char* uplo, integer* m, integer* n, real* aa, real* as, integer* lda, ftnlen, ftnlen);
static real transl;
static integer laa, lda;
static real als;
@@ -3131,7 +3110,7 @@ L130:
f_rew(&al__1);*/
}
cssyr2_(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) {
/*
@@ -3145,7 +3124,7 @@ L130:
f_rew(&al__1);*/
}
csspr2_(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. */
@@ -3380,7 +3359,7 @@ L170:
i__2 = *m;
for (i__ = 1; i__ <= i__2; ++i__) {
if (gen || (upper && i__ <= j) || (lower && i__ >= j)) {
if (i__ <= j && (j - i__ <= *ku || i__ >= j && i__ - j <= *kl))
if (((i__ <= j && j - i__ <= *ku) || (i__ >= j && i__ - j <= *kl)))
{
a[i__ + j * a_dim1] = sbeg_(reset) + *transl;
} else {
+15 -33
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 logical rorder;
static integer layout;
static logical ltestt, tsterr;
extern /* Subroutine */ void cs3chke_(char*, ftnlen);
extern /* Subroutine */ void cs3chke_(char*);
static real alf[7], bet[7];
extern logical lse_(real*, real*, integer*);
static real eps, err;
@@ -522,7 +509,7 @@ L30:
if (i__1 < 2) {
goto L60;
}
for (i__ = 1; i__ <= 9; ++i__) {
for (i__ = 1; i__ <= 6; ++i__) {
if (s_cmp(snamet, snames[i__ - 1] , (ftnlen)12, (ftnlen)12) ==
0) {
goto L50;
@@ -656,7 +643,7 @@ L80:
ftnlen)12);
/* Test error exits. */
if (tsterr) {
cs3chke_(snames[isnum - 1], (ftnlen)12);
cs3chke_(snames[isnum - 1]);
}
/* Test computations. */
infoc_1.infot = 0;
@@ -800,7 +787,7 @@ L230:
extern /* Subroutine */ int smake_(char*, char*, char*, integer*, integer*, real*, integer*, real*, integer*, logical*, real*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ int smmch_(char*, char*, integer*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, real*, real*, real*, integer*, real*, real*, logical*, integer*, logical*, ftnlen, ftnlen);
static integer ia, ib, ma, mb, na, nb, nc, ik, im, in, ks, ms, ns;
extern /* Subroutine */ void csgemm_(integer*, char*, char*, integer*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void csgemm_(integer*, char*, char*, integer*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*);
static char tranas[1], tranbs[1], transa[1], transb[1];
static real errmax;
extern logical lseres_(char*, char*, integer*, integer*, real*, real*, integer*, ftnlen, ftnlen);
@@ -1003,8 +990,7 @@ L230:
}
csgemm_(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. */
@@ -1197,7 +1183,7 @@ L130:
static integer ia, ib, na, nc, im, in, ms, ns;
static real errmax;
extern logical lseres_(char*, char*, integer*, integer*, real*, real*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cssymm_(integer*, char*, char*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cssymm_(integer*, char*, char*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*);
extern void sprcn2_(integer*, integer*, char*, integer*, char*, char*, integer*, integer*, real*, integer*, integer*, real*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ int smake_(char*, char*, char*, integer*, integer*, real*, integer*, real*, integer*, logical*, real*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ int smmch_(char*, char*, integer*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, real*, real*, real*, integer*, real*, real*, logical*, integer*, logical*, ftnlen, ftnlen);
@@ -1378,8 +1364,7 @@ L130:
// f_rew(&al__1);
}
cssymm_(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. */
@@ -1575,8 +1560,8 @@ L120:
extern /* Subroutine */ int smake_(char*, char*, char*, integer*, integer*, real*, integer*, real*, integer*, logical*, real*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ int smmch_(char*, char*, integer*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, real*, real*, real*, integer*, real*, real*, logical*, integer*, logical*, ftnlen, ftnlen);
extern logical lseres_(char*, char*, integer*, integer*, real*, real*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cstrmm_(integer*, char*, char*, char*, char*, integer*, integer*, real*, real*, integer*, real*, integer*, ftnlen, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cstrsm_(integer*, char*, char*, char*, char*, integer*, integer*, real*, real*, integer*, real*, integer*, ftnlen, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cstrmm_(integer*, char*, char*, char*, char*, integer*, integer*, real*, real*, integer*, real*, integer*);
extern /* Subroutine */ void cstrsm_(integer*, char*, char*, char*, char*, integer*, integer*, real*, real*, integer*, real*, integer*);
static integer laa, icd, lbb, lda, ldb, ics;
static real als;
static integer ict, icu;
@@ -1752,8 +1737,7 @@ L120:
}
cstrmm_(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) {
@@ -1768,8 +1752,7 @@ L120:
}
cstrsm_(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. */
@@ -2028,7 +2011,7 @@ L160:
static real errmax;
extern logical lseres_(char*, char*, integer*, integer*, real*, real*, integer*, ftnlen, ftnlen);
static char transs[1];
extern /* Subroutine */ void cssyrk_(integer*, char*, char*, integer*, integer*, real*, real*, integer*, real*, real*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cssyrk_(integer*, char*, char*, integer*, integer*, real*, real*, integer*, real*, real*, integer*);
static integer laa, lda, lcc, ldc;
static real als;
static integer ict, icu;
@@ -2186,8 +2169,7 @@ L160:
// f_rew(&al__1);
}
cssyrk_(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. */
@@ -2409,7 +2391,7 @@ L130:
static integer laa, lbb, lda, lcc, ldb, ldc;
static real als;
static integer ict, icu;
extern /* Subroutine */ void cssyr2k_(integer*, char*, char*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cssyr2k_(integer*, char*, char*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*);
extern logical lse_(real*, real*, integer*);
extern /* Subroutine */ int smmch_(char*, char*, integer*, integer*, integer*, real*, real*, integer*, real*, integer*, real*, real*, integer*, real*, real*, real*, integer*, real*, real*, logical*, integer*, logical*, ftnlen, ftnlen);
static real err;
@@ -2591,7 +2573,7 @@ L130:
}
cssyr2k_(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. */
+11 -18
View File
@@ -22,18 +22,10 @@ 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;
@@ -380,11 +372,12 @@ static doublereal c_b43 = 1.;
static integer i__;
extern /* Subroutine */ int ctest_(integer*, doublecomplex*, doublecomplex*, doublecomplex*, doublereal*);
static doublecomplex mwpcs[5], mwpct[5];
extern /* Subroutine */ int zscaltest_(integer*, doublecomplex*, doublecomplex*, integer*), itest1_(integer*, integer*), stest1_(doublereal*, doublereal*, doublereal*, doublereal*);
extern /* Subroutine */ void zscaltest_(integer*, doublecomplex*, doublecomplex*, integer*);
extern int itest1_(integer*, integer*), stest1_(doublereal*, doublereal*, doublereal*, doublereal*);
static doublecomplex cx[8];
extern doublereal dznrm2test_(integer*, doublecomplex*, integer*);
static integer np1;
extern /* Subroutine */ int zdscaltest_(integer*, doublereal*, doublecomplex*, integer*);
extern /* Subroutine */ void zdscaltest_(integer*, doublereal*, doublecomplex*, integer*);
extern integer izamaxtest_(integer*, doublecomplex*, integer*);
extern doublereal dzasumtest_(integer*, doublecomplex*, integer*);
static integer len;
@@ -408,7 +401,7 @@ static doublereal c_b43 = 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: */
}
@@ -423,13 +416,13 @@ static doublereal c_b43 = 1.;
} else if (combla_1.icase == 8) {
/* .. ZSCALTEST .. */
zscaltest_(&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) {
/* .. ZDSCALTEST .. */
zdscaltest_(&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) {
/* .. IZAMAXTEST .. */
i__1 = izamaxtest_(&combla_1.n, cx, &combla_1.incx);
@@ -591,11 +584,11 @@ static doublereal c_b43 = 1.;
extern /* Subroutine */ int ctest_(integer*, doublecomplex*, doublecomplex*, doublecomplex*, doublereal*);
static integer ksize;
static doublecomplex ztemp;
extern /* Subroutine */ int zdotctest_(integer*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*), zcopytest_(integer*, doublecomplex*, integer*, doublecomplex*, integer*);
extern /* Subroutine */ void zdotctest_(integer*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*), zcopytest_(integer*, doublecomplex*, integer*, doublecomplex*, integer*);
static integer ki;
extern /* Subroutine */ int zdotutest_(integer*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*), zswaptest_(integer*, doublecomplex*, integer*, doublecomplex*, integer*);
extern /* Subroutine */ void zdotutest_(integer*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*), zswaptest_(integer*, doublecomplex*, integer*, doublecomplex*, integer*);
static integer kn;
extern /* Subroutine */ int zaxpytest_(integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*);
extern /* Subroutine */ void zaxpytest_(integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*);
static doublecomplex cx[7], cy[7];
static integer mx, my;
+32 -48
View File
@@ -22,17 +22,12 @@ 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;
@@ -322,7 +317,7 @@ static logical c_false = FALSE_;
static logical rorder;
static integer layout;
static logical ltestt, tsterr;
extern /* Subroutine */ void cz2chke_(char*, ftnlen);
extern /* Subroutine */ void cz2chke_(char*);
static doublecomplex alf[7];
static integer inc[7], nkb;
static doublecomplex bet[7];
@@ -713,7 +708,7 @@ L100:
ftnlen)12);
/* Test error exits. */
if (tsterr) {
cz2chke_(snames[isnum - 1], (ftnlen)12);
cz2chke_(snames[isnum - 1]);
}
/* Test computations. */
infoc_1.infot = 0;
@@ -893,9 +888,9 @@ 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 czgbmv_(integer*, char*, integer*, integer*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen);
extern /* Subroutine */ void czgbmv_(integer*, char*, integer*, integer*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*);
static char ctrans[14];
extern /* Subroutine */ void czgemv_(integer*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen);
extern /* Subroutine */ void czgemv_(integer*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*);
static doublereal errmax;
static doublecomplex transl;
extern logical lzeres_(char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
@@ -1144,8 +1139,7 @@ L240:
}
czgemv_(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) {
/*
@@ -1160,8 +1154,7 @@ L240:
}
czgbmv_(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. */
@@ -1349,12 +1342,12 @@ L140:
static integer nc, ik, in;
static logical packed;
static integer nk, ks, ix, iy, ns, lx, ly;
extern /* Subroutine */ void czhbmv_(integer*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen);
extern /* Subroutine */ void czhemv_(integer*, char*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen);
extern /* Subroutine */ void czhbmv_(integer*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*);
extern /* Subroutine */ void czhemv_(integer*, char*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*);
static doublereal errmax;
static doublecomplex transl;
extern logical lzeres_(char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void czhpmv_(integer*, char*, integer*, doublecomplex*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen);
extern /* Subroutine */ void czhpmv_(integer*, char*, integer*, doublecomplex*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*);
static integer laa, lda;
static doublecomplex als, bls;
static doublereal err;
@@ -1568,7 +1561,7 @@ L140:
}
czhemv_(iorder, uplo, &n, &alpha, &aa[1],
&lda, &xx[1], &incx, &beta, &yy[1]
, &incy, (ftnlen)1);
, &incy);
} else if (banded) {
if (*trace) {
/*
@@ -1583,7 +1576,7 @@ L140:
}
czhbmv_(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) {
/*
@@ -1597,8 +1590,7 @@ L140:
f_rew(&al__1);*/
}
czhpmv_(iorder, uplo, &n, &alpha, &aa[1],
&xx[1], &incx, &beta, &yy[1], &
incy, (ftnlen)1);
&xx[1], &incx, &beta, &yy[1], &incy);
}
/* Check if error-exit was taken incorrectly. */
@@ -1798,13 +1790,13 @@ L130:
static doublereal errmax;
static doublecomplex transl;
extern logical lzeres_(char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cztbmv_(integer*, char*, char*, char*, integer*, integer*, doublecomplex*, integer*, doublecomplex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cztbmv_(integer*, char*, char*, char*, integer*, integer*, doublecomplex*, integer*, doublecomplex*, integer*);
static char transs[1];
extern /* Subroutine */ void cztbsv_(integer*, char*, char*, char*, integer*, integer*, doublecomplex*, integer*, doublecomplex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cztpmv_(integer*, char*, char*, char*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cztpsv_(integer*, char*, char*, char*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cztrmv_(integer*, char*, char*, char*, integer*, doublecomplex*, integer*, doublecomplex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cztrsv_(integer*, char*, char*, char*, integer*, doublecomplex*, integer*, doublecomplex*, integer*, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cztbsv_(integer*, char*, char*, char*, integer*, integer*, doublecomplex*, integer*, doublecomplex*, integer*);
extern /* Subroutine */ void cztpmv_(integer*, char*, char*, char*, integer*, doublecomplex*, doublecomplex*, integer*);
extern /* Subroutine */ void cztpsv_(integer*, char*, char*, char*, integer*, doublecomplex*, doublecomplex*, integer*);
extern /* Subroutine */ void cztrmv_(integer*, char*, char*, char*, integer*, doublecomplex*, integer*, doublecomplex*, integer*);
extern /* Subroutine */ void cztrsv_(integer*, char*, char*, char*, integer*, doublecomplex*, integer*, doublecomplex*, integer*);
static integer laa, icd, lda, ict, icu;
static doublereal err;
extern logical lze_(doublecomplex*, doublecomplex*, integer*);
@@ -2014,8 +2006,7 @@ L130:
f_rew(&al__1);*/
}
cztrmv_(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) {
/*
@@ -2029,8 +2020,7 @@ L130:
f_rew(&al__1);*/
}
cztbmv_(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) {
/*
@@ -2044,8 +2034,7 @@ L130:
f_rew(&al__1);*/
}
cztpmv_(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) {
@@ -2062,8 +2051,7 @@ L130:
f_rew(&al__1);*/
}
cztrsv_(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) {
/*
@@ -2077,8 +2065,7 @@ L130:
f_rew(&al__1);*/
}
cztbsv_(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) {
/*
@@ -2092,8 +2079,7 @@ L130:
f_rew(&al__1);*/
}
cztpsv_(iorder, uplo, trans, diag, &n, &
aa[1], &xx[1], &incx, (ftnlen)1, (
ftnlen)1, (ftnlen)1);
aa[1], &xx[1], &incx);
}
}
@@ -2644,11 +2630,11 @@ L150:
static logical isame[13];
extern /* Subroutine */ int zmake_(char*, char*, char*, integer*, integer*, doublecomplex*, integer*, doublecomplex*, integer*, integer*, integer*, logical*, doublecomplex*, ftnlen, ftnlen, ftnlen);
static integer nargs;
extern /* Subroutine */ void czher_(integer*, char*, integer*, doublereal*, doublecomplex*, integer*, doublecomplex*, integer*, ftnlen);
extern /* Subroutine */ void czher_(integer*, char*, integer*, doublereal*, doublecomplex*, integer*, doublecomplex*, integer*);
static logical reset;
static char cuplo[14];
static integer incxs;
extern /* Subroutine */ void czhpr_(integer*, char*, integer*, doublereal*, doublecomplex*, integer*, doublecomplex*, ftnlen);
extern /* Subroutine */ void czhpr_(integer*, char*, integer*, doublereal*, doublecomplex*, integer*, doublecomplex*);
extern /* Subroutine */ int zmvch_(char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, doublereal*, doublecomplex*, doublereal*, doublereal*, logical*, integer*, logical*, ftnlen);
static logical upper;
static char uplos[1];
@@ -2817,8 +2803,7 @@ L150:
al__1.aunit = *ntra;
f_rew(&al__1);*/
}
czher_(iorder, uplo, &n, &ralpha, &xx[1], &incx, &aa[
1], &lda, (ftnlen)1);
czher_(iorder, uplo, &n, &ralpha, &xx[1], &incx, &aa[1], &lda);
} else if (packed) {
if (*trace) {
/*
@@ -2831,8 +2816,7 @@ L150:
al__1.aunit = *ntra;
f_rew(&al__1);*/
}
czhpr_(iorder, uplo, &n, &ralpha, &xx[1], &incx, &aa[
1], (ftnlen)1);
czhpr_(iorder, uplo, &n, &ralpha, &xx[1], &incx, &aa[1]);
}
/* Check if error-exit was taken incorrectly. */
@@ -3011,8 +2995,8 @@ L130:
extern /* Subroutine */ int zmvch_(char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, doublereal*, doublecomplex*, doublereal*, doublereal*, logical*, integer*, logical*, ftnlen);
static logical upper;
static char uplos[1];
extern /* Subroutine */ void czher2_(integer*, char*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, integer*, ftnlen);
extern /* Subroutine */ void czhpr2_(integer*, char*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, ftnlen);
extern /* Subroutine */ void czher2_(integer*, char*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, integer*);
extern /* Subroutine */ void czhpr2_(integer*, char*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*);
static integer ia, ja, ic, nc, jj, lj, in;
static logical packed;
static integer ix, iy, ns, lx, ly;
@@ -3208,7 +3192,7 @@ L130:
f_rew(&al__1);*/
}
czher2_(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) {
/*
@@ -3222,7 +3206,7 @@ L130:
f_rew(&al__1);*/
}
czhpr2_(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. */
+20 -27
View File
@@ -25,11 +25,9 @@ typedef struct { doublereal r, i; } doublecomplex;
static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;}
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 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;
@@ -314,7 +312,7 @@ static logical c_false = FALSE_;
static logical rorder;
static integer layout;
static logical ltestt, tsterr;
extern /* Subroutine */ int cz3chke_(char*, ftnlen);
extern /* Subroutine */ void cz3chke_(char*);
static doublecomplex alf[7], bet[7];
static doublereal eps, err;
extern logical lze_(doublecomplex*, doublecomplex*, integer*);
@@ -679,7 +677,7 @@ L80:
ftnlen)12);
/* Test error exits. */
if (tsterr) {
cz3chke_(snames[isnum - 1], (ftnlen)12);
cz3chke_(snames[isnum - 1]);
}
/* Test computations. */
infoc_1.infot = 0;
@@ -831,7 +829,7 @@ L230:
static integer ia, ib;
extern /* Subroutine */ int zprcn1_(integer*, integer*, char*, integer*, char*, char*, integer*, integer*, integer*, doublecomplex*, integer*, integer*, doublecomplex*, integer*, ftnlen, ftnlen, ftnlen);
static integer ma, mb, na, nb, nc, ik, im, in, ks, ms, ns;
extern /* Subroutine */ void czgemm_(integer*, char*, char*, integer*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void czgemm_(integer*, char*, char*, integer*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*);
static char tranas[1], tranbs[1], transa[1], transb[1];
static doublereal errmax;
extern logical lzeres_(char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
@@ -1047,8 +1045,7 @@ L230:
}
czgemm_(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. */
@@ -1242,10 +1239,10 @@ return 0;
static integer ia, ib;
extern /* Subroutine */ int zprcn2_(integer*, integer*, char*, integer*, char*, char*, integer*, integer*, doublecomplex*, integer*, integer*, doublecomplex*, integer*, ftnlen, ftnlen, ftnlen);
static integer na, nc, im, in, ms, ns;
extern /* Subroutine */ void czhemm_(integer*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void czhemm_(integer*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*);
static doublereal errmax;
extern logical lzeres_(char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void czsymm_(integer*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void czsymm_(integer*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*);
static integer laa, lbb, lda, lcc, ldb, ldc, ics;
static doublecomplex als, bls;
static integer icu;
@@ -1438,11 +1435,11 @@ return 0;
if (isconj) {
czhemm_(iorder, side, uplo, &m, &n, &alpha, &
aa[1], &lda, &bb[1], &ldb, &beta, &cc[
1], &ldc, (ftnlen)1, (ftnlen)1);
1], &ldc);
} else {
czsymm_(iorder, side, uplo, &m, &n, &alpha, &
aa[1], &lda, &bb[1], &ldb, &beta, &cc[
1], &ldc, (ftnlen)1, (ftnlen)1);
1], &ldc);
}
/* Check if error-exit was taken incorrectly. */
@@ -1641,8 +1638,8 @@ return 0;
static char tranas[1], transa[1];
static doublereal errmax;
extern logical lzeres_(char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void cztrmm_(integer*, char*, char*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, ftnlen, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cztrsm_(integer*, char*, char*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, ftnlen, ftnlen, ftnlen, ftnlen);
extern /* Subroutine */ void cztrmm_(integer*, char*, char*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*);
extern /* Subroutine */ void cztrsm_(integer*, char*, char*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*);
static integer laa, icd, lbb, lda, ldb, ics;
static doublecomplex als;
static integer ict, icu;
@@ -1828,8 +1825,7 @@ return 0;
}
cztrmm_(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) {
@@ -1846,8 +1842,7 @@ return 0;
}
cztrsm_(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. */
@@ -2119,11 +2114,11 @@ return 0;
extern /* Subroutine */ int zprcn6_(integer*, integer*, char*, integer*, char*, char*, integer*, integer*, doublereal*, integer*, doublereal*, integer*, ftnlen, ftnlen, ftnlen);
static integer ik, in, jj, lj, ks, ns;
static doublereal ralpha;
extern /* Subroutine */ int czherk_(integer*, char*, char*, integer*, integer*, doublereal*, doublecomplex*, integer*, doublereal*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void czherk_(integer*, char*, char*, integer*, integer*, doublereal*, doublecomplex*, integer*, doublereal*, doublecomplex*, integer*);
static doublereal errmax;
extern logical lzeres_(char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
static char transs[1], transt[1];
extern /* Subroutine */ int czsyrk_(integer*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void czsyrk_(integer*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*);
static integer laa, lda, lcc, ldc;
static doublecomplex als;
static integer ict, icu;
@@ -2319,8 +2314,7 @@ return 0;
f_rew(&al__1);*/
}
czherk_(iorder, uplo, trans, &n, &k, &ralpha,
&aa[1], &lda, &rbeta, &cc[1], &ldc, (
ftnlen)1, (ftnlen)1);
&aa[1], &lda, &rbeta, &cc[1], &ldc);
} else {
if (*trace) {
zprcn4_(ntra, &nc, sname, iorder, uplo,
@@ -2334,8 +2328,7 @@ return 0;
f_rew(&al__1);*/
}
czsyrk_(iorder, uplo, trans, &n, &k, &alpha, &
aa[1], &lda, &beta, &cc[1], &ldc, (
ftnlen)1, (ftnlen)1);
aa[1], &lda, &beta, &cc[1], &ldc);
}
/* Check if error-exit was taken incorrectly. */
@@ -2615,11 +2608,11 @@ return 0;
static doublereal errmax;
extern logical lzeres_(char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
static char transs[1], transt[1];
extern /* Subroutine */ int czher2k_(integer*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublereal*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void czher2k_(integer*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublereal*, doublecomplex*, integer*);
static integer laa, lbb, lda, lcc, ldb, ldc;
static doublecomplex als;
static integer ict, icu;
extern /* Subroutine */ int czsyr2k_(integer*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*, ftnlen, ftnlen);
extern /* Subroutine */ void czsyr2k_(integer*, char*, char*, integer*, integer*, doublecomplex*, doublecomplex*, integer*, doublecomplex*, integer*, doublecomplex*, doublecomplex*, integer*);
static doublereal err;
extern logical lze_(doublecomplex*, doublecomplex*, integer*);
@@ -2830,7 +2823,7 @@ return 0;
}
czher2k_(iorder, uplo, trans, &n, &k, &alpha,
&aa[1], &lda, &bb[1], &ldb, &rbeta, &
cc[1], &ldc, (ftnlen)1, (ftnlen)1);
cc[1], &ldc);
} else {
if (*trace) {
zprcn5_(ntra, &nc, sname, iorder, uplo,
@@ -2845,7 +2838,7 @@ return 0;
}
czsyr2k_(iorder, uplo, trans, &n, &k, &alpha,
&aa[1], &lda, &bb[1], &ldb, &beta, &
cc[1], &ldc, (ftnlen)1, (ftnlen)1);
cc[1], &ldc);
}
/* Check if error-exit was taken incorrectly. */
+13 -1
View File
@@ -13,7 +13,9 @@ This page documents those non-standard APIs.
| ?omatcopy | s,d,c,z | out-of-place transposition/copying |
| ?geadd | s,d,c,z | ATLAS-like matrix add `B = &alpha;*A+&beta;*B` |
| ?gemmt | s,d,c,z | `gemm` but only a triangular part updated |
| cblas_?gemm_batch | s,d,c,z,b | `gemm` with several groups of input data
|
| cblas_?gemm_batch_strided | s,d,c,z,b | `gemm` with groups of data stored at fixed offsets in the input arrays
## bfloat16 functionality
@@ -26,6 +28,15 @@ BLAS-like and conversion functions for `bfloat16` (available when OpenBLAS was c
* `float cblas_sbdot` computes the dot product of two bfloat16 arrays
* `void cblas_sbgemv` performs the matrix-vector operations of GEMV with the input matrix and X vector as bfloat16
* `void cblas_sbgemm` performs the matrix-matrix operations of GEMM with both input arrays containing bfloat16
* `void cblas_bgemv` performs the matrix-vector operations of GEMV with the input matrix, X vector and result as bfloat16
* `void cblas_bgemm` performs the matrix-matrix operations of GEMM with both input arrays containing bfloat16 and the output being bfloat16 as well
## half-precision float or fp16 functionality
BLAS-like and conversion functions for `hfloat16` (available when OpenBLAS was compiled with `BUILD_HFLOAT16=1`):
* `void cblas_shgemm` performs the matrix-matrix operations of GEMM with both input arrays containing hfloat16
## Utility functions
@@ -36,4 +47,5 @@ BLAS-like and conversion functions for `bfloat16` (available when OpenBLAS was c
* `char * openblas_get_config()` returns the options OpenBLAS was built with, something like `NO_LAPACKE DYNAMIC_ARCH NO_AFFINITY Haswell`
* `int openblas_set_affinity(int thread_index, size_t cpusetsize, cpu_set_t *cpuset)` sets the CPU affinity mask of the given thread
to the provided cpuset. Only available on Linux, with semantics identical to `pthread_setaffinity_np`.
* `openblas_set_thread_callback_function` overrides the default multithreading backend with the provided argument
+8 -2
View File
@@ -47,7 +47,8 @@ You can find the full list of modifications in Changelog.txt.
The detailed explanation is probably in the original publication authored by Kazushige Goto - Goto, Kazushige; van de Geijn, Robert A; Anatomy of high-performance matrix multiplication. ACM Transactions on Mathematical Software (TOMS). Volume 34 Issue 3, May 2008
While this article is paywalled and too old for preprints to be available on arxiv.org, more recent
publications like https://arxiv.org/pdf/1609.00076 contain at least a brief description of the algorithm.
In practice, the values are derived by experimentation to yield the block sizes that give the highest performance. A general rule of thumb for selecting a starting point seems to be that PxQ is about half the size of L2 cache.
In practice, the values are derived by experimentation to yield the block sizes that give the highest performance. A general rule of thumb for selecting a starting point seems to be that PxQ is about half the size of L2 cache. R needs to be greater than the bigger of P and Q by
at least 64, or bad things will happen with the work splitting in (at least) POTRF.
### <a name="reportbug"></a>How can I report a bug?
@@ -344,7 +345,12 @@ Multithreading support in OpenBLAS requires the use of internal buffers for shar
If you get a message "error while loading shared libraries: libopenblas.so.0: ELF load command address/offset not properly aligned" when starting a program that is (dynamically) linked to OpenBLAS, this is very likely due to a bug in the GNU linker (ld) that is part of the
GNU binutils package. This error was specifically observed on older versions of Ubuntu Linux updated with the (at the time) most recent binutils version 2.38, but an internet search turned up sporadic reports involving various other libraries dating back several years. A bugfix was created by the binutils developers and should be available in later versions of binutils.(See issue 3708 for details)
#### <a name="OpenMP"></a>Using OpenBLAS with OpenMP
### <a name="CallingConvention"></a>The tests work fine, but calling any complex function from my code produces wrong or no results
This is almost certainly a problem with the calling convention used, in particular with the way the computed result is transported back to the caller. By default, OpenBLAS follows the F2C convention of returning the result on the stack rather than as the first argument to the function. So if your code has a prototype like "void cdotu ( complex *res, int n,...)" change it to "complex cdotu (int n,...)". Better yet,
use the CBLAS interface rather than the Fortran one.
### <a name="OpenMP"></a>Using OpenBLAS with OpenMP
OpenMP provides its own locking mechanisms, so when your code makes BLAS/LAPACK calls from inside OpenMP parallel regions it is imperative
that you use an OpenBLAS that is built with USE_OPENMP=1, as otherwise deadlocks might occur. Furthermore, OpenBLAS will automatically restrict itself to using only a single thread when called from an OpenMP parallel region. When it is certain that calls will only occur
+4
View File
@@ -443,6 +443,10 @@ To then use the built OpenBLAS shared library in Visual Studio:
### Windows on Arm
If you want to use a regular x64 Windows build of OpenBLAS with x64 software in the Prism emulator, be sure to use the latest version of Prism, and to check the box
to "Disable floating point optimization" in the Emulation settings. (Right-click on the executable to open "Properties", then on the "Compatibility" tab click on
"Change emulation settings").
A fully functional native OpenBLAS for WoA that can be built as both a static and dynamic library using LLVM toolchain and Visual Studio 2022. Before starting to build, make sure that you have installed Visual Studio 2022 on your ARM device, including the "Desktop Development with C++" component (that contains the cmake tool).
(Note that you can use the free "Visual Studio 2022 Community Edition" for this task. In principle it would be possible to build with VisualStudio alone, but using
the LLVM toolchain enables native compilation of the Fortran sources of LAPACK and of all the optimized assembly files, which VisualStudio cannot handle on its own)
+1 -1
View File
@@ -30,7 +30,7 @@ OpenBLAS checks the following environment variables on startup:
cache where it is not reported correctly (in virtual environments)
Deprecated variables still recognized for compatibilty:
Deprecated variables still recognized for compatibility:
* `GOTO_NUM_THREADS`: equivalent to `OPENBLAS_NUM_THREADS`
* `GOTOBLAS_MAIN_FREE`: equivalent to `OPENBLAS_MAIN_FREE`
+12 -4
View File
@@ -59,13 +59,21 @@
#define GEMM_Q 128
#endif
#ifdef GEMM_DIVIDE_RATE
#ifdef DYNAMIC_ARCH
#define DIVIDE_LIMIT gotoblas->divide_limit
#define DIVIDE_RATE gotoblas->divide_rate
#else
#define DIVIDE_LIMIT GEMM_DIVIDE_LIMIT
#define DIVIDE_RATE GEMM_DIVIDE_RATE
#endif
#ifdef GEMM_DIVIDE_LIMIT
#define DIVIDE_LIMIT GEMM_DIVIDE_LIMIT
#endif
//#ifdef GEMM_DIVIDE_RATE
//#define DIVIDE_RATE GEMM_DIVIDE_RATE
//#endif
//#ifdef GEMM_DIVIDE_LIMIT
//#define DIVIDE_LIMIT GEMM_DIVIDE_LIMIT
//#endif
#ifdef THREADED_LEVEL3
#include "level3_thread.c"
+3 -2
View File
@@ -41,6 +41,7 @@
#define CACHE_LINE_SIZE 8
#endif
#define DIVIDE_RATE_MAX 2
#ifndef DIVIDE_RATE
#define DIVIDE_RATE 2
#endif
@@ -93,7 +94,7 @@ typedef struct {
#else
volatile
#endif
BLASLONG working[MAX_CPU_NUMBER][CACHE_LINE_SIZE * DIVIDE_RATE];
BLASLONG working[MAX_CPU_NUMBER][CACHE_LINE_SIZE * DIVIDE_RATE_MAX];
} job_t;
@@ -294,7 +295,7 @@ static int inner_thread(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n,
FLOAT *a, *b, *c;
job_t *job = (job_t *)args -> common;
BLASLONG xxx, bufferside;
FLOAT *buffer[DIVIDE_RATE];
FLOAT *buffer[DIVIDE_RATE_MAX];
BLASLONG ls, min_l, jjs, min_jj;
BLASLONG is, min_i, div_n;
+75 -2
View File
@@ -41,6 +41,8 @@
#define CACHE_LINE_SIZE 8
#endif
#define DIVIDE_RATE_MAX 2
#ifndef DIVIDE_RATE
#define DIVIDE_RATE 2
#endif
@@ -69,7 +71,7 @@ _Atomic
#else
volatile
#endif
BLASLONG working[MAX_CPU_NUMBER][CACHE_LINE_SIZE * DIVIDE_RATE];
BLASLONG working[MAX_CPU_NUMBER][CACHE_LINE_SIZE * DIVIDE_RATE_MAX];
} job_t;
@@ -133,7 +135,7 @@ _Atomic
static int inner_thread(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLOAT *sb, BLASLONG mypos){
FLOAT *buffer[DIVIDE_RATE];
FLOAT *buffer[DIVIDE_RATE_MAX];
BLASLONG k, lda, ldc;
BLASLONG m_from, m_to, n_from, n_to;
@@ -504,6 +506,33 @@ static int inner_thread(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n,
int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLOAT *sb, BLASLONG mypos){
#ifdef USE_OPENMP
static omp_lock_t level3_lock, critical_section_lock;
static volatile BLASULONG init_lock = 0, omp_lock_initialized = 0,
parallel_section_left = MAX_PARALLEL_NUMBER;
// Lock initialization; Todo : Maybe this part can be moved to blas_init() in blas_server_omp.c
while(omp_lock_initialized == 0)
{
blas_lock(&init_lock);
{
if(omp_lock_initialized == 0)
{
omp_init_lock(&level3_lock);
omp_init_lock(&critical_section_lock);
omp_lock_initialized = 1;
WMB;
}
blas_unlock(&init_lock);
}
}
#elif defined(OS_WINDOWS)
CRITICAL_SECTION level3_lock;
InitializeCriticalSection((PCRITICAL_SECTION)&level3_lock);
#else
static pthread_mutex_t level3_lock = PTHREAD_MUTEX_INITIALIZER;
#endif
blas_arg_t newarg;
#ifndef USE_ALLOC_HEAP
@@ -560,6 +589,30 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
#endif
#endif
#ifdef USE_OPENMP
omp_set_lock(&level3_lock);
omp_set_lock(&critical_section_lock);
parallel_section_left--;
/*
How OpenMP locks works with NUM_PARALLEL
1) parallel_section_left = Number of available concurrent executions of OpenBLAS - Number of currently executing OpenBLAS executions
2) level3_lock is acting like a master lock or barrier which stops OpenBLAS calls when all the parallel_section are currently busy executing other OpenBLAS calls
3) critical_section_lock is used for updating variables shared between threads executing OpenBLAS calls concurrently and for unlocking of master lock whenever required
4) Unlock master lock only when we have not already exhausted all the parallel_sections and allow another thread with a OpenBLAS call to enter
*/
if(parallel_section_left != 0)
omp_unset_lock(&level3_lock);
omp_unset_lock(&critical_section_lock);
#elif defined(OS_WINDOWS)
EnterCriticalSection((PCRITICAL_SECTION)&level3_lock);
#else
pthread_mutex_lock(&level3_lock);
#endif
newarg.m = args -> m;
newarg.n = args -> n;
newarg.k = args -> k;
@@ -706,5 +759,25 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
free(job);
#endif
#ifdef USE_OPENMP
omp_set_lock(&critical_section_lock);
parallel_section_left++;
/*
Unlock master lock only when all the parallel_sections are already exhausted and one of the thread has completed its OpenBLAS call
otherwise just increment the parallel_section_left
The master lock is only locked when we have exhausted all the parallel_sections, So only unlock it then and otherwise just increment the count
*/
if(parallel_section_left == 1)
omp_unset_lock(&level3_lock);
omp_unset_lock(&critical_section_lock);
#elif defined(OS_WINDOWS)
LeaveCriticalSection((PCRITICAL_SECTION)&level3_lock);
#else
pthread_mutex_unlock(&level3_lock);
#endif
return 0;
}
+11 -6
View File
@@ -41,12 +41,17 @@
#define CACHE_LINE_SIZE 8
#endif
#define DIVIDE_RATE_MAX 2
#ifndef DIVIDE_RATE
#define DIVIDE_RATE 2
#endif
#ifndef GEMM_PREFERED_SIZE
#define GEMM_PREFERED_SIZE 1
#ifdef DYNAMIC_ARCH
#define GEMM_PREFERRED_SIZE gotoblas->preferred_size
#endif
#ifndef GEMM_PREFERRED_SIZE
#define GEMM_PREFERRED_SIZE 1
#endif
//The array of job_t may overflow the stack.
@@ -93,7 +98,7 @@
typedef struct {
volatile
BLASLONG working[MAX_CPU_NUMBER][CACHE_LINE_SIZE * DIVIDE_RATE];
BLASLONG working[MAX_CPU_NUMBER][CACHE_LINE_SIZE * DIVIDE_RATE_MAX];
} job_t;
@@ -234,7 +239,7 @@ typedef struct {
static int inner_thread(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, IFLOAT *sa, IFLOAT *sb, BLASLONG mypos){
IFLOAT *buffer[DIVIDE_RATE];
IFLOAT *buffer[DIVIDE_RATE_MAX];
BLASLONG k, lda, ldb, ldc;
BLASLONG m_from, m_to, n_from, n_to;
@@ -707,7 +712,7 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG
while (m > 0){
width = blas_quickdivide(m + nthreads_m - num_parts - 1, nthreads_m - num_parts);
width = round_up(m, width, GEMM_PREFERED_SIZE);
width = round_up(m, width, GEMM_PREFERRED_SIZE);
m -= width;
@@ -758,7 +763,7 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG
if (width < switch_ratio) {
width = switch_ratio;
}
width = round_up(width_n, width, GEMM_PREFERED_SIZE);
width = round_up(width_n, width, GEMM_PREFERRED_SIZE);
width_n -= width;
if (width_n < 0) {
+1 -1
View File
@@ -27,7 +27,6 @@ if (USE_THREAD)
${BLAS_SERVER}
divtable.c # TODO: Makefile has -UDOUBLE
blas_l1_thread.c
blas_server_callback.c
)
if (NOT NO_AFFINITY)
@@ -42,6 +41,7 @@ set(COMMON_SOURCES
openblas_env.c
openblas_get_num_procs.c
openblas_get_num_threads.c
blas_server_callback.c
)
# these need to have NAME/CNAME set, so use GenerateNamedObjects, but don't use standard name mangling
+2 -2
View File
@@ -1,12 +1,12 @@
TOPDIR = ../..
include ../../Makefile.system
COMMONOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) c_abs.$(SUFFIX) z_abs.$(SUFFIX) openblas_set_num_threads.$(SUFFIX) openblas_get_num_threads.$(SUFFIX) openblas_get_num_procs.$(SUFFIX) openblas_get_config.$(SUFFIX) openblas_get_parallel.$(SUFFIX) openblas_error_handle.$(SUFFIX) openblas_env.$(SUFFIX)
COMMONOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) c_abs.$(SUFFIX) z_abs.$(SUFFIX) openblas_set_num_threads.$(SUFFIX) openblas_get_num_threads.$(SUFFIX) openblas_get_num_procs.$(SUFFIX) openblas_get_config.$(SUFFIX) openblas_get_parallel.$(SUFFIX) openblas_error_handle.$(SUFFIX) openblas_env.$(SUFFIX) blas_server_callback.$(SUFFIX)
#COMMONOBJS += slamch.$(SUFFIX) slamc3.$(SUFFIX) dlamch.$(SUFFIX) dlamc3.$(SUFFIX)
ifdef SMP
COMMONOBJS += blas_server.$(SUFFIX) divtable.$(SUFFIX) blasL1thread.$(SUFFIX) blas_server_callback.$(SUFFIX)
COMMONOBJS += blas_server.$(SUFFIX) divtable.$(SUFFIX) blasL1thread.$(SUFFIX)
ifneq ($(NO_AFFINITY), 1)
COMMONOBJS += init.$(SUFFIX)
endif
+23 -7
View File
@@ -38,6 +38,7 @@
/*********************************************************************/
#include "common.h"
#include <strings.h>
#if (defined OS_LINUX || defined OS_ANDROID)
#include <asm/hwcap.h>
#include <sys/auxv.h>
@@ -128,10 +129,16 @@ extern gotoblas_t gotoblas_ARMV9SME;
#else
#define gotoblas_ARMV9SME gotoblas_ARMV8
#endif
#ifdef DYN_VORTEX
extern gotoblas_t gotoblas_VORTEX;
#elif defined(DYN_NEOVERSEN1)
#define gotoblas_VORTEX gotoblas_NEOVERSEN1
#else
#define gotoblas_VORTEX gotoblas_ARMV8
#endif
#ifdef DYN_VORTEXM4
extern gotoblas_t gotoblas_VORTEXM4;
#else
#error "dont have vortexm4"
#define gotoblas_VORTEXM4 gotoblas_ARMV8
#endif
#ifdef DYN_CORTEXA55
@@ -144,7 +151,7 @@ extern gotoblas_t gotoblas_A64FX;
#else
#define gotoblas_A64FX gotoblas_ARMV8
#endif
#else
#else //not a user-specified dynamic_list
extern gotoblas_t gotoblas_CORTEXA53;
#define gotoblas_CORTEXA55 gotoblas_CORTEXA53
extern gotoblas_t gotoblas_CORTEXA57;
@@ -156,6 +163,7 @@ extern gotoblas_t gotoblas_THUNDERX2T99;
extern gotoblas_t gotoblas_TSV110;
extern gotoblas_t gotoblas_EMAG8180;
extern gotoblas_t gotoblas_NEOVERSEN1;
#define gotoblas_VORTEX gotoblas_NEOVERSEN1
#ifndef NO_SVE
extern gotoblas_t gotoblas_NEOVERSEV1;
extern gotoblas_t gotoblas_NEOVERSEN2;
@@ -191,7 +199,7 @@ extern void openblas_warning(int verbose, const char * msg);
#define FALLBACK_VERBOSE 1
#define NEOVERSEN1_FALLBACK "OpenBLAS : Your OS does not support SVE instructions. OpenBLAS is using Neoverse N1 kernels as a fallback, which may give poorer performance.\n"
#define NUM_CORETYPES 20
#define NUM_CORETYPES 21
/*
* In case asm/hwcap.h is outdated on the build system, make sure
@@ -231,6 +239,7 @@ static char *corename[] = {
"armv8sve",
"a64fx",
"armv9sme",
"vortex",
"vortexm4",
"unknown"
};
@@ -255,7 +264,8 @@ char *gotoblas_corename(void) {
if (gotoblas == &gotoblas_ARMV8SVE) return corename[16];
if (gotoblas == &gotoblas_A64FX) return corename[17];
if (gotoblas == &gotoblas_ARMV9SME) return corename[18];
if (gotoblas == &gotoblas_VORTEXM4) return corename[19];
if (gotoblas == &gotoblas_VORTEX) return corename[19];
if (gotoblas == &gotoblas_VORTEXM4) return corename[20];
return corename[NUM_CORETYPES];
}
@@ -294,7 +304,8 @@ static gotoblas_t *force_coretype(char *coretype) {
case 16: return (&gotoblas_ARMV8SVE);
case 17: return (&gotoblas_A64FX);
case 18: return (&gotoblas_ARMV9SME);
case 19: return (&gotoblas_VORTEXM4);
case 19: return (&gotoblas_VORTEX);
case 20: return (&gotoblas_VORTEXM4);
}
snprintf(message, 128, "Core not found: %s\n", coretype);
openblas_warning(1, message);
@@ -311,7 +322,7 @@ static gotoblas_t *get_coretype(void) {
return &gotoblas_VORTEXM4;
}
#endif
return &gotoblas_NEOVERSEN1;
return &gotoblas_VORTEX;
#endif
#if (!defined OS_LINUX && !defined OS_ANDROID)
@@ -396,6 +407,8 @@ static gotoblas_t *get_coretype(void) {
case 0xd08: // Cortex A72
return &gotoblas_CORTEXA72;
case 0xd09: // Cortex A73
case 0xd0a: // Cortex A75
case 0xd0b: // Cortex A76
return &gotoblas_CORTEXA73;
case 0xd0c: // Neoverse N1
return &gotoblas_NEOVERSEN1;
@@ -413,6 +426,9 @@ static gotoblas_t *get_coretype(void) {
}else
return &gotoblas_NEOVERSEV1;
case 0xd4f:
case 0xd83:
case 0xd85:
case 0xd87:
if (!(getauxval(AT_HWCAP) & HWCAP_SVE)) {
openblas_warning(FALLBACK_VERBOSE, NEOVERSEN1_FALLBACK);
return &gotoblas_NEOVERSEN1;
@@ -482,7 +498,7 @@ static gotoblas_t *get_coretype(void) {
break;
case 0x61: // Apple
if (support_sme1()) return &gotoblas_VORTEXM4;
return &gotoblas_NEOVERSEN1;
return &gotoblas_VORTEX;
break;
default:
snprintf(coremsg, 128, "Unknown CPU model - implementer %x part %x\n",implementer,part);
+1 -1
View File
@@ -99,7 +99,7 @@ struct riscv_hwprobe {
#define RISCV_HWPROBE_IMA_V (1 << 2)
#define RISCV_HWPROBE_EXT_ZFH (1 << 27)
#define RISCV_HWPROBE_EXT_ZVFH (1 << 30)
#define RISCV_HWPROBE_EXT_ZVFBFWMA (1 << 54)
#define RISCV_HWPROBE_EXT_ZVFBFWMA (1ULL << 54)
#ifndef NR_riscv_hwprobe
#ifndef NR_arch_specific_syscall
+20 -7
View File
@@ -1317,7 +1317,11 @@ UNLOCK_COMMAND(&alloc_lock);
error:
printf("OpenBLAS : Program will terminate because you tried to allocate too many TLS memory regions.\n");
printf("This library was built to support a maximum of %d threads - either rebuild OpenBLAS\n", NUM_BUFFERS);
printf("with a larger NUM_THREADS value or set the environment variable OPENBLAS_NUM_THREADS to\n");
#ifdef USE_OPENMP
printf("with a larger NUM_THREADS value or set the environment variable OMP_NUM_THREADS to\n");
#else
printf("with a larger NUM_THREADS value or set the environment variable OPENBLAS_NUM_THREADS to\n");
#endif
printf("a sufficiently small number. This error typically occurs when the software that relies on\n");
printf("OpenBLAS calls BLAS functions from many threads in parallel, or when your computer has more\n");
printf("cpu cores than what OpenBLAS was configured to handle.\n");
@@ -1601,7 +1605,7 @@ void DESTRUCTOR gotoblas_quit(void) {
}
#if defined(_MSC_VER) && !defined(__clang__)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
BOOL APIENTRY OpenBLASDllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
@@ -1650,10 +1654,10 @@ static int on_process_term(void)
#endif
#ifdef _WIN64
static const PIMAGE_TLS_CALLBACK dll_callback(HINSTANCE h, DWORD ul_reason_for_call, PVOID pv) = DllMain;
static const PIMAGE_TLS_CALLBACK dll_callback(HINSTANCE h, DWORD ul_reason_for_call, PVOID pv) = OpenBLASDllMain;
#pragma const_seg()
#else
static void (APIENTRY *dll_callback)(HINSTANCE h, DWORD ul_reason_for_call, PVOID pv) = DllMain;
static void (APIENTRY *dll_callback)(HINSTANCE h, DWORD ul_reason_for_call, PVOID pv) = OpenBLASDllMain;
#pragma data_seg()
#endif
@@ -3039,8 +3043,13 @@ void *blas_memory_alloc(int procpos){
#endif
if (memory_overflowed) goto terminate;
fprintf(stderr,"OpenBLAS warning: precompiled NUM_THREADS exceeded, adding auxiliary array for thread metadata.\n");
fprintf(stderr,"Note that your application may still crash, if it is calling OpenBLAS from multiple threads in parallel\n");
fprintf(stderr,"To avoid this warning, please rebuild your copy of OpenBLAS with a larger NUM_THREADS setting\n");
#ifdef USE_OPENMP
fprintf(stderr,"or set the environment variable OMP_NUM_THREADS to %d or lower\n", MAX_CPU_NUMBER);
#else
fprintf(stderr,"or set the environment variable OPENBLAS_NUM_THREADS to %d or lower\n", MAX_CPU_NUMBER);
#endif
memory_overflowed=1;
MB;
new_release_info = (struct release_t*) malloc(NEW_BUFFERS * sizeof(struct release_t));
@@ -3142,7 +3151,11 @@ terminate:
#endif
printf("OpenBLAS : Program is Terminated. Because you tried to allocate too many memory regions.\n");
printf("This library was built to support a maximum of %d threads - either rebuild OpenBLAS\n", NUM_BUFFERS);
printf("with a larger NUM_THREADS value or set the environment variable OPENBLAS_NUM_THREADS to\n");
#ifdef USE_OPENMP
printf("with a larger NUM_THREADS value or set the environment variable OMP_NUM_THREADS to\n");
#else
printf("with a larger NUM_THREADS value or set the environment variable OPENBLAS_NUM_THREADS to\n");
#endif
printf("a sufficiently small number. This error typically occurs when the software that relies on\n");
printf("OpenBLAS calls BLAS functions from many threads in parallel, or when your computer has more\n");
printf("cpu cores than what OpenBLAS was configured to handle.\n");
@@ -3473,7 +3486,7 @@ void DESTRUCTOR gotoblas_quit(void) {
}
#if defined(_MSC_VER) && !defined(__clang__)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
BOOL APIENTRY OpenBLASDllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
@@ -3517,7 +3530,7 @@ static int on_process_term(void)
#else
#pragma data_seg(".CRT$XLB")
#endif
static void (APIENTRY *dll_callback)(HINSTANCE h, DWORD ul_reason_for_call, PVOID pv) = DllMain;
static void (APIENTRY *dll_callback)(HINSTANCE h, DWORD ul_reason_for_call, PVOID pv) = OpenBLASDllMain;
#ifdef _WIN64
#pragma const_seg()
#else
+4
View File
@@ -162,11 +162,15 @@ ifeq ($(F_COMPILER), INTEL)
else
ifeq ($(F_COMPILER), FLANG)
$(FC) $(FFLAGS) $(LDFLAGS) -fno-fortran-main -Mnomain -all_load -headerpad_max_install_names -install_name "$(CURDIR)/../$(INTERNALNAME)" -dynamiclib -o ../$(LIBDYNNAME) $< -Wl,-exported_symbols_list,osx.def $(FEXTRALIB)
else
ifeq ($(F_COMPILER), FLANGNEW)
$(FC) $(FFLAGS) $(LDFLAGS) -Wl,-all_load -Wl,-headerpad_max_install_names -Wl,-install_name,"$(CURDIR)/../$(INTERNALNAME)" -Wl,-dylib -o ../$(LIBDYNNAME) $< -Wl,-exported_symbols_list,osx.def $(FEXTRALIB)
else
$(FC) $(FFLAGS) $(LDFLAGS) -all_load -headerpad_max_install_names -install_name "$(CURDIR)/../$(INTERNALNAME)" -dynamiclib -o ../$(LIBDYNNAME) $< -Wl,-exported_symbols_list,osx.def $(FEXTRALIB)
endif
endif
endif
endif
dllinit.$(SUFFIX) : dllinit.c
$(CC) $(CFLAGS) -c -o $(@F) -s $<
+4 -4
View File
@@ -343,13 +343,13 @@ linker_a=""
if [ -n "$link" ]; then
link=`echo "$link" | sed 's/\-Y[[:space:]]P\,/\-Y/g'`
link=`echo " $link" | sed 's/ \-Y[[:space:]]P\,/ \-Y/g'`
link=`echo "$link" | sed 's/\-R[[:space:]]*/\-rpath\%/g'`
link=`echo "$link" | sed 's/ \-R[[:space:]]*/ \-rpath\%/g'`
link=`echo "$link" | sed 's/\-rpath[[:space:]]+/\-rpath\%/g'`
link=`echo "$link" | sed 's/ \-rpath[[:space:]]+/ \-rpath\%/g'`
link=`echo "$link" | sed 's/\-rpath-link[[:space:]]+/\-rpath-link\%/g'`
link=`echo "$link" | sed 's/ \-rpath-link[[:space:]]+/ \-rpath-link\%/g'`
flags=`echo "$link" | tr "',\n" " "`
# remove leading and trailing quotes from each flag.
+18
View File
@@ -1232,6 +1232,20 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#else
#endif
#ifdef FORCE_WASM128_GENERIC
#define FORCE
#define ARCHITECTURE "WASM"
#define SUBARCHITECTURE "WASM128_GENERIC"
#define SUBDIRNAME "wasm"
#define ARCHCONFIG "-DWASM128_GENERIC " \
"-DL1_DATA_SIZE=32768 -DL1_DATA_LINESIZE=32 " \
"-DL2_SIZE=1048576 -DL2_LINESIZE=32 " \
"-DDTB_DEFAULT_ENTRIES=128 -DDTB_SIZE=4096 -DL2_ASSOCIATIVE=4 "
#define LIBNAME "wasm128"
#define CORENAME "WASM128_GENERIC"
#else
#endif
#ifdef FORCE_CORTEXA15
#define FORCE
#define ARCHITECTURE "ARM"
@@ -1949,6 +1963,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define OPENBLAS_SUPPORTED
#endif
#ifdef __wasm__
#define OPENBLAS_SUPPORTED
#endif
#ifndef OPENBLAS_SUPPORTED
#error "This arch/CPU is not supported by OpenBLAS."
#endif
+2 -2
View File
@@ -530,8 +530,8 @@ ifneq ($(NO_LAPACK), 1)
SBLASOBJS += $(SLAPACKOBJS)
DBLASOBJS += $(DLAPACKOBJS)
#QBLASOBJS += $(QLAPACKOBJS)
CBLASOBJS += $(CLAPACKOBJS)
ZBLASOBJS += $(ZLAPACKOBJS)
CBLASOBJS += $(CLAPACKOBJS) slaed3.$(SUFFIX)
ZBLASOBJS += $(ZLAPACKOBJS) dlaed3.$(SUFFIX)
#XBLASOBJS += $(XLAPACKOBJS)
endif
+1 -1
View File
@@ -184,11 +184,11 @@ static int init_amxtile_permission() {
}
#endif
#ifdef SMP
#ifdef DYNAMIC_ARCH
extern char* gotoblas_corename(void);
#endif
#ifdef SMP
#if defined(DYNAMIC_ARCH) || defined(NEOVERSEV1)
static inline int get_gemm_optimal_nthreads_neoversev1(double MNK, int ncpu) {
return
+8 -8
View File
@@ -99,7 +99,7 @@ int NAME(blasint *N, blasint *NRHS, FLOAT *a, blasint *ldA, blasint *ipiv,
*Info = 0;
if (args.m == 0 || args.n == 0) return 0;
if (args.m == 0) return 0;
IDEBUG_START;
@@ -117,20 +117,20 @@ int NAME(blasint *N, blasint *NRHS, FLOAT *a, blasint *ldA, blasint *ipiv,
#if defined(_WIN64) && defined(_M_ARM64)
#ifdef COMPLEX
if (args.m * args.n <= 300)
if (args.m * args.m <= 300)
#else
if (args.m * args.n <= 500)
if (args.m * args.m <= 500)
#endif
args.nthreads = 1;
else if (args.m * args.n <= 1000)
else if (args.m * args.m <= 1000)
args.nthreads = 4;
else
args.nthreads = num_cpu_avail(4);
#else
#ifndef DOUBLE
if (args.m * args.n < 40000)
if (args.m * args.m < 40000)
#else
if (args.m * args.n < 10000)
if (args.m * args.m < 10000)
#endif
args.nthreads = 1;
else
@@ -143,7 +143,7 @@ int NAME(blasint *N, blasint *NRHS, FLOAT *a, blasint *ldA, blasint *ipiv,
args.n = *N;
info = GETRF_SINGLE(&args, NULL, NULL, sa, sb, 0);
if (info == 0){
if (info == 0 && *NRHS >0){
args.n = *NRHS;
GETRS_N_SINGLE(&args, NULL, NULL, sa, sb, 0);
}
@@ -154,7 +154,7 @@ int NAME(blasint *N, blasint *NRHS, FLOAT *a, blasint *ldA, blasint *ipiv,
args.n = *N;
info = GETRF_PARALLEL(&args, NULL, NULL, sa, sb, 0);
if (info == 0){
if (info == 0 && *NRHS > 0){
args.n = *NRHS;
GETRS_N_PARALLEL(&args, NULL, NULL, sa, sb, 0);
}
+2 -2
View File
@@ -48,7 +48,7 @@ function (build_core TARGET_CORE KDIR TSUFFIX KERNEL_DEFINITIONS)
endif ()
if (${ADD_COMMONOBJS})
if (X86)
if (X86 AND NOT EMSCRIPTEN)
if (NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
GenerateNamedObjects("${KERNELDIR}/cpuid.S" "" "" false "" "" true)
else()
@@ -235,7 +235,7 @@ function (build_core TARGET_CORE KDIR TSUFFIX KERNEL_DEFINITIONS)
# Makefile.L3
set(USE_TRMM false)
string(TOUPPER ${TARGET_CORE} UC_TARGET_CORE)
if (ARM OR ARM64 OR RISCV64 OR (UC_TARGET_CORE MATCHES LONGSOON3B) OR (UC_TARGET_CORE MATCHES GENERIC) OR (UC_TARGET_CORE MATCHES HASWELL) OR (UC_TARGET_CORE MATCHES ZEN) OR (UC_TARGET_CORE MATCHES SKYLAKEX) OR (UC_TARGET_CORE MATCHES COOPERLAKE) OR (UC_TARGET_CORE MATCHES SAPPHIRERAPIDS))
if (ARM OR ARM64 OR RISCV64 OR WASM OR (UC_TARGET_CORE MATCHES LONGSOON3B) OR (UC_TARGET_CORE MATCHES GENERIC) OR (UC_TARGET_CORE MATCHES HASWELL) OR (UC_TARGET_CORE MATCHES ZEN) OR (UC_TARGET_CORE MATCHES SKYLAKEX) OR (UC_TARGET_CORE MATCHES COOPERLAKE) OR (UC_TARGET_CORE MATCHES SAPPHIRERAPIDS))
set(USE_TRMM true)
endif ()
if (ZARCH OR (UC_TARGET_CORE MATCHES POWER8) OR (UC_TARGET_CORE MATCHES POWER9) OR (UC_TARGET_CORE MATCHES POWER10))
+4
View File
@@ -70,6 +70,10 @@ ifeq ($(ARCH), riscv64)
USE_TRMM = 1
endif
ifeq ($(ARCH), wasm)
USE_TRMM = 1
endif
ifneq ($(DYNAMIC_ARCH), 1)
ifeq ($(TARGET), GENERIC)
USE_TRMM = 1
+6 -3
View File
@@ -1,5 +1,5 @@
/***************************************************************************
Copyright (c) 2013, The OpenBLAS Project
Copyright (c) 2013-2026, 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
@@ -50,8 +50,11 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y)
while(i < n)
{
dot += y[iy] * x[ix] ;
#if defined(DSDOT)
dot += (double)y[iy] * (double)x[ix] ;
#else
dot += y[iy] * x[ix];
#endif
ix += inc_x ;
iy += inc_y ;
i++ ;
+1 -1
View File
@@ -42,7 +42,7 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
n *= inc_x;
if (inc_x == 1)
{
#if V_SIMD && (!defined(DOUBLE) || (defined(DOUBLE) && V_SIMD_F64 && V_SIMD > 128))
#if V_SIMD && (!defined(DOUBLE) || (defined(DOUBLE) && V_SIMD_F64 && (V_SIMD > 128 || defined(ARCH_WASM))))
#ifdef DOUBLE
const int vstep = v_nlanes_f64;
const int unrollx4 = n & (-vstep * 4);
+5
View File
@@ -80,6 +80,11 @@ DASUMKERNEL = dasum_thunderx2t99.c
CASUMKERNEL = casum_thunderx2t99.c
ZASUMKERNEL = zasum_thunderx2t99.c
SSUMKERNEL = ssum_thunderx2t99.c
DSUMKERNEL = dsum_thunderx2t99.c
CSUMKERNEL = csum_thunderx2t99.c
ZSUMKERNEL = zsum_thunderx2t99.c
SCOPYKERNEL = copy_thunderx2t99.c
DCOPYKERNEL = copy_thunderx2t99.c
CCOPYKERNEL = copy_thunderx2t99.c
+27 -4
View File
@@ -191,25 +191,48 @@ ZGEMMOTCOPYOBJ = zgemm_otcopy$(TSUFFIX).$(SUFFIX)
ifeq ($(BUILD_BFLOAT16), 1)
BGEMM_BETA = bgemm_beta_neon.c
BGEMMKERNEL = sbgemm_kernel_$(BGEMM_UNROLL_M)x$(BGEMM_UNROLL_N)_neoversen2.c
ifneq ($(BGEMM_UNROLL_M), $(BGEMM_UNROLL_N))
BGEMMINCOPY = sbgemm_ncopy_$(BGEMM_UNROLL_M)_neoversen2.c
BGEMMITCOPY = sbgemm_tcopy_$(BGEMM_UNROLL_M)_neoversen2.c
BGEMMONCOPY = sbgemm_ncopy_$(BGEMM_UNROLL_N)_neoversen2.c
BGEMMOTCOPY = sbgemm_tcopy_$(BGEMM_UNROLL_N)_neoversen2.c
BGEMMINCOPYOBJ = bgemm_incopy$(TSUFFIX).$(SUFFIX)
BGEMMITCOPYOBJ = bgemm_itcopy$(TSUFFIX).$(SUFFIX)
endif
BGEMMONCOPY = sbgemm_ncopy_$(BGEMM_UNROLL_N)_neoversen2.c
BGEMMOTCOPY = sbgemm_tcopy_$(BGEMM_UNROLL_N)_neoversen2.c
BGEMMONCOPYOBJ = bgemm_oncopy$(TSUFFIX).$(SUFFIX)
BGEMMOTCOPYOBJ = bgemm_otcopy$(TSUFFIX).$(SUFFIX)
BGEMVTKERNEL = sbgemv_t_bfdot.c
BGEMVNKERNEL = bgemv_n_sve_v3x4.c
ifeq ($(BUILD_HFLOAT16), 1)
SHGEMMKERNEL = shgemm_kernel_$(SHGEMM_UNROLL_M)x$(SHGEMM_UNROLL_N)_neoversen2.c
SHGEMMINCOPY = shgemm_ncopy_$(SHGEMM_UNROLL_M)_neoversen2.c
SHGEMMITCOPY = shgemm_tcopy_$(SHGEMM_UNROLL_M)_neoversen2.c
ifneq ($(SHGEMM_UNROLL_M), $(SHGEMM_UNROLL_N))
SHGEMMINCOPY = ../generic/gemm_ncopy_$(SHGEMM_UNROLL_M).c
SHGEMMITCOPY = ../generic/gemm_tcopy_$(SHGEMM_UNROLL_M).c
endif
SHGEMMONCOPY = shgemm_ncopy_$(SHGEMM_UNROLL_N)_neoversen2.c
SHGEMMOTCOPY = shgemm_tcopy_$(SHGEMM_UNROLL_N)_neoversen2.c
SHGEMMINCOPYOBJ = shgemm_incopy$(TSUFFIX).$(SUFFIX)
SHGEMMITCOPYOBJ = shgemm_itcopy$(TSUFFIX).$(SUFFIX)
SHGEMMONCOPYOBJ = shgemm_oncopy$(TSUFFIX).$(SUFFIX)
SHGEMMOTCOPYOBJ = shgemm_otcopy$(TSUFFIX).$(SUFFIX)
ifndef SHGEMM_BETA
SHGEMM_BETA = sbgemm_beta_neoversen2.c
endif
endif
SBGEMM_BETA = sbgemm_beta_neoversen2.c
SBGEMMKERNEL = sbgemm_kernel_$(SBGEMM_UNROLL_M)x$(SBGEMM_UNROLL_N)_neoversen2.c
ifneq ($(SBGEMM_UNROLL_M), $(SBGEMM_UNROLL_N))
SBGEMMINCOPY = sbgemm_ncopy_$(SBGEMM_UNROLL_M)_neoversen2.c
SBGEMMITCOPY = sbgemm_tcopy_$(SBGEMM_UNROLL_M)_neoversen2.c
SBGEMMONCOPY = sbgemm_ncopy_$(SBGEMM_UNROLL_N)_neoversen2.c
SBGEMMOTCOPY = sbgemm_tcopy_$(SBGEMM_UNROLL_N)_neoversen2.c
SBGEMMINCOPYOBJ = sbgemm_incopy$(TSUFFIX).$(SUFFIX)
SBGEMMITCOPYOBJ = sbgemm_itcopy$(TSUFFIX).$(SUFFIX)
endif
SBGEMMONCOPY = sbgemm_ncopy_$(SBGEMM_UNROLL_N)_neoversen2.c
SBGEMMOTCOPY = sbgemm_tcopy_$(SBGEMM_UNROLL_N)_neoversen2.c
SBGEMMONCOPYOBJ = sbgemm_oncopy$(TSUFFIX).$(SUFFIX)
SBGEMMOTCOPYOBJ = sbgemm_otcopy$(TSUFFIX).$(SUFFIX)
SBGEMVTKERNEL = sbgemv_t_bfdot.c
+4 -1
View File
@@ -262,7 +262,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
static RETURN_TYPE dot_kernel_asimd(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y)
{
RETURN_TYPE dot = 0.0;
#ifndef DOUBLE
volatile
#endif
RETURN_TYPE dot = 0.0;
BLASLONG j = 0;
__asm__ __volatile__ (
+244
View File
@@ -0,0 +1,244 @@
/***************************************************************************
Copyright (c) 2017, 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 "common.h"
#include <arm_neon.h>
#define N "x0" /* vector length */
#define X "x1" /* "X" vector address */
#define INC_X "x2" /* "X" stride */
#define J "x5" /* loop variable */
#define REG0 "xzr"
#define SUMF "d0"
#define TMPF "d1"
/******************************************************************************/
#define KERNEL_F1 \
"ldr "TMPF", ["X"] \n" \
"add "X", "X", #8 \n" \
"fadd "SUMF", "SUMF", "TMPF" \n"
#define KERNEL_F32 \
"ldr q16, ["X"] \n" \
"ldr q17, ["X", #16] \n" \
"ldr q18, ["X", #32] \n" \
"ldr q19, ["X", #48] \n" \
"ldp q20, q21, ["X", #64] \n" \
"ldp q22, q23, ["X", #96] \n" \
"ldp q24, q25, ["X", #128] \n" \
"ldp q26, q27, ["X", #160] \n" \
"fadd v16.2d, v16.2d, v17.2d \n" \
"fadd v18.2d, v18.2d, v19.2d \n" \
"ldp q28, q29, ["X", #192] \n" \
"ldp q30, q31, ["X", #224] \n" \
"add "X", "X", #256 \n" \
"fadd v20.2d, v20.2d, v21.2d \n" \
"fadd v22.2d, v22.2d, v23.2d \n" \
"PRFM PLDL1KEEP, ["X", #1024] \n" \
"PRFM PLDL1KEEP, ["X", #1024+64] \n" \
"fadd v24.2d, v24.2d, v25.2d \n" \
"fadd v26.2d, v26.2d, v27.2d \n" \
"fadd v28.2d, v28.2d, v29.2d \n" \
"fadd v30.2d, v30.2d, v31.2d \n" \
"fadd v0.2d, v0.2d, v16.2d \n" \
"fadd v1.2d, v1.2d, v18.2d \n" \
"fadd v2.2d, v2.2d, v20.2d \n" \
"fadd v3.2d, v3.2d, v22.2d \n" \
"PRFM PLDL1KEEP, ["X", #1024+128] \n" \
"PRFM PLDL1KEEP, ["X", #1024+192] \n" \
"fadd v4.2d, v4.2d, v24.2d \n" \
"fadd v5.2d, v5.2d, v26.2d \n" \
"fadd v6.2d, v6.2d, v28.2d \n" \
"fadd v7.2d, v7.2d, v30.2d \n"
#define KERNEL_F32_FINALIZE \
"fadd v0.2d, v0.2d, v1.2d \n" \
"fadd v2.2d, v2.2d, v3.2d \n" \
"fadd v4.2d, v4.2d, v5.2d \n" \
"fadd v6.2d, v6.2d, v7.2d \n" \
"fadd v0.2d, v0.2d, v2.2d \n" \
"fadd v4.2d, v4.2d, v6.2d \n" \
"fadd v0.2d, v0.2d, v4.2d \n" \
"faddp "SUMF", v0.2d \n"
#define INIT_S \
"lsl "INC_X", "INC_X", #3 \n"
#define KERNEL_S1 \
"ldr "TMPF", ["X"] \n" \
"add "X", "X", "INC_X" \n" \
"fadd "SUMF", "SUMF", "TMPF" \n"
#if defined(SMP)
extern int blas_level1_thread_with_return_value(int mode, BLASLONG m, BLASLONG n,
BLASLONG k, void *alpha, void *a, BLASLONG lda, void *b, BLASLONG ldb,
void *c, BLASLONG ldc, int (*function)(), int nthreads);
#endif
static FLOAT dsum_compute(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
FLOAT dsum = 0.0 ;
if ( n < 0 ) return(dsum);
__asm__ __volatile__ (
" mov "N", %[N_] \n"
" mov "X", %[X_] \n"
" mov "INC_X", %[INCX_] \n"
" fmov "SUMF", "REG0" \n"
" fmov d1, "REG0" \n"
" fmov d2, "REG0" \n"
" fmov d3, "REG0" \n"
" fmov d4, "REG0" \n"
" fmov d5, "REG0" \n"
" fmov d6, "REG0" \n"
" fmov d7, "REG0" \n"
" cmp "N", xzr \n"
" ble 9f //dsum_kernel_L999 \n"
" cmp "INC_X", xzr \n"
" ble 9f //dsum_kernel_L999 \n"
" cmp "INC_X", #1 \n"
" bne 5f //dsum_kernel_S_BEGIN \n"
"1: //dsum_kernel_F_BEGIN: \n"
" asr "J", "N", #5 \n"
" cmp "J", xzr \n"
" beq 3f //dsum_kernel_F1 \n"
#if !(defined(__clang__) && defined(OS_WINDOWS))
".align 5 \n"
#endif
"2: //dsum_kernel_F32: \n"
" "KERNEL_F32" \n"
" subs "J", "J", #1 \n"
" bne 2b //dsum_kernel_F32 \n"
" "KERNEL_F32_FINALIZE" \n"
"3: //dsum_kernel_F1: \n"
" ands "J", "N", #31 \n"
" ble 9f //dsum_kernel_L999 \n"
"4: //dsum_kernel_F10: \n"
" "KERNEL_F1" \n"
" subs "J", "J", #1 \n"
" bne 4b //dsum_kernel_F10 \n"
" b 9f //dsum_kernel_L999 \n"
"5: //dsum_kernel_S_BEGIN: \n"
" "INIT_S" \n"
" asr "J", "N", #2 \n"
" cmp "J", xzr \n"
" ble 7f //dsum_kernel_S1 \n"
"6: //dsum_kernel_S4: \n"
" "KERNEL_S1" \n"
" "KERNEL_S1" \n"
" "KERNEL_S1" \n"
" "KERNEL_S1" \n"
" subs "J", "J", #1 \n"
" bne 6b //dsum_kernel_S4 \n"
"7: //dsum_kernel_S1: \n"
" ands "J", "N", #3 \n"
" ble 9f //dsum_kernel_L999 \n"
"8: //dsum_kernel_S10: \n"
" "KERNEL_S1" \n"
" subs "J", "J", #1 \n"
" bne 8b //dsum_kernel_S10 \n"
"9: //dsum_kernel_L999: \n"
" fmov %[DSUM_], "SUMF" \n"
: [DSUM_] "=r" (dsum) //%0
: [N_] "r" (n), //%1
[X_] "r" (x), //%2
[INCX_] "r" (inc_x) //%3
: "cc",
"memory",
"x0", "x1", "x2", "x3", "x4", "x5",
"d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7"
);
return dsum;
}
#if defined(SMP)
static int dsum_thread_function(BLASLONG n, BLASLONG dummy0,
BLASLONG dummy1, FLOAT dummy2, FLOAT *x, BLASLONG inc_x, FLOAT *y,
BLASLONG inc_y, FLOAT *result, BLASLONG dummy3)
{
*result = dsum_compute(n, x, inc_x);
return 0;
}
#endif
FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
#if defined(SMP)
int nthreads;
FLOAT dummy_alpha;
#endif
FLOAT dsum = 0.0;
#if defined(SMP)
if (inc_x == 0 || n <= 10000)
nthreads = 1;
else
nthreads = num_cpu_avail(1);
if (nthreads == 1) {
dsum = dsum_compute(n, x, inc_x);
} else {
int mode, i;
char result[MAX_CPU_NUMBER * sizeof(double) * 2];
FLOAT *ptr;
mode = BLAS_DOUBLE;
blas_level1_thread_with_return_value(mode, n, 0, 0, &dummy_alpha,
x, inc_x, NULL, 0, result, 0,
( void *)dsum_thread_function, nthreads);
ptr = (FLOAT *)result;
for (i = 0; i < nthreads; i++) {
dsum = dsum + (*ptr);
ptr = (FLOAT *)(((char *)ptr) + sizeof(double) * 2);
}
}
#else
dsum = dsum_compute(n, x, inc_x);
#endif
return dsum;
}
+3
View File
@@ -155,7 +155,10 @@ static double nrm2_compute(BLASLONG n, FLOAT *x, BLASLONG inc_x)
" cmp "J", xzr \n"
" beq .Lnrm2_kernel_F1 \n"
/* https://github.com/llvm/llvm-project/issues/149547 */
#if !(defined(__clang__) && defined(OS_WINDOWS))
" .align 5 \n"
#endif
".Lnrm2_kernel_F: \n"
" "KERNEL_F" \n"
" subs "J", "J", #1 \n"
@@ -0,0 +1,56 @@
/***************************************************************************
* Copyright (c) 2026 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 <arm_sve.h>
#include <arm_neon.h>
#include "common.h"
#define ALPHA_ONE
#include "sbgemm_kernel_8x8_neoversen2_impl.c"
#undef ALPHA_ONE
#undef UPDATE_C
#include "sbgemm_kernel_8x8_neoversen2_impl.c"
int CNAME(BLASLONG m, BLASLONG n, BLASLONG k, FLOAT alpha, IFLOAT *A, IFLOAT *B,
FLOAT *C, BLASLONG ldc) {
#ifdef BGEMM
bfloat16_t alpha_bf16;
memcpy(&alpha_bf16, &alpha, sizeof(bfloat16_t));
float alpha_f32 = vcvtah_f32_bf16(alpha_bf16);
#else
float alpha_f32 = alpha;
#endif
if (alpha_f32 == 1.0f)
return gemm_kernel_neoversen2_alpha_one(m, n, k, alpha, A, B, C, ldc);
else
return gemm_kernel_neoversen2_alpha(m, n, k, alpha, A, B, C, ldc);
return 0;
}
@@ -0,0 +1,763 @@
/***************************************************************************
* Copyright (c) 2022,2026 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 <arm_sve.h>
#include <arm_neon.h>
#include "common.h"
#define INIT_C(M, N) mc##M##N = svdup_f32(0);
#define MATMUL(M, N) mc##M##N = svbfmmla(mc##M##N, ma##M, mb##N);
#define INIT_C_8x4 \
do { \
INIT_C(0, 0); \
INIT_C(0, 1); \
INIT_C(1, 0); \
INIT_C(1, 1); \
INIT_C(2, 0); \
INIT_C(2, 1); \
INIT_C(3, 0); \
INIT_C(3, 1); \
} while (0);
#define INIT_C_8x8 \
do { \
INIT_C(0, 0); \
INIT_C(0, 1); \
INIT_C(0, 2); \
INIT_C(0, 3); \
INIT_C(1, 0); \
INIT_C(1, 1); \
INIT_C(1, 2); \
INIT_C(1, 3); \
INIT_C(2, 0); \
INIT_C(2, 1); \
INIT_C(2, 2); \
INIT_C(2, 3); \
INIT_C(3, 0); \
INIT_C(3, 1); \
INIT_C(3, 2); \
INIT_C(3, 3); \
} while (0);
#ifdef BGEMM
#ifdef ALPHA_ONE
#define UPDATE_C(PG16, PG32, PTR, SRC) \
do { \
tmp16 = svld1_bf16((PG16), (PTR)); \
tmp32 = svreinterpret_f32(svzip1_bf16(zeros, tmp16)); \
tmp32 = svadd_z((PG32), SRC, tmp32); \
tmp16 = svcvt_bf16_f32_z((PG32), tmp32); \
tmp16 = svuzp1_bf16(tmp16, tmp16); \
svst1_bf16((PG16), (PTR), tmp16); \
} while (0)
#else
#define UPDATE_C(PG16, PG32, PTR, SRC) \
do { \
tmp16 = svld1_bf16((PG16), (PTR)); \
tmp32 = svreinterpret_f32(svzip1_bf16(zeros, tmp16)); \
tmp32 = svmad_z((PG32), svalpha, SRC, tmp32); \
tmp16 = svcvt_bf16_f32_z((PG32), tmp32); \
tmp16 = svuzp1_bf16(tmp16, tmp16); \
svst1_bf16((PG16), (PTR), tmp16); \
} while (0)
#endif
#else
#ifdef ALPHA_ONE
#define UPDATE_C(PG16, PG32, PTR, SRC) \
do { \
tmp32 = svld1_f32((PG32), (PTR)); \
tmp32 = svadd_z((PG32), SRC, tmp32); \
svst1_f32((PG32), (PTR), tmp32); \
} while (0);
#else
#define UPDATE_C(PG16, PG32, PTR, SRC) \
do { \
tmp32 = svld1_f32((PG32), (PTR)); \
tmp32 = svmad_z((PG32), svalpha, SRC, tmp32); \
svst1_f32((PG32), (PTR), tmp32); \
} while (0);
#endif
#endif
#ifdef BGEMM
#define OUTPUT_FLOAT bfloat16_t
#else
#define OUTPUT_FLOAT float
#endif
#ifdef ALPHA_ONE
static int gemm_kernel_neoversen2_alpha_one(BLASLONG m, BLASLONG n, BLASLONG k, FLOAT alpha, IFLOAT * A, IFLOAT * B, FLOAT * C, BLASLONG ldc)
#else
static int gemm_kernel_neoversen2_alpha(BLASLONG m, BLASLONG n, BLASLONG k, FLOAT alpha, IFLOAT * A, IFLOAT * B, FLOAT * C, BLASLONG ldc)
#endif
{
BLASLONG pad_k = (k + 3) & ~3;
svbfloat16_t ma0, ma1, ma2, ma3, mb0, mb1, mb2, mb3;
svfloat32_t mc00, mc01, mc02, mc03;
svfloat32_t mc10, mc11, mc12, mc13;
svfloat32_t mc20, mc21, mc22, mc23;
svfloat32_t mc30, mc31, mc32, mc33;
svfloat32_t vc0, vc1, vc2, vc3, vc4, vc5, vc6, vc7;
svfloat32_t vc8, vc9, vc10, vc11, vc12, vc13, vc14, vc15;
#ifndef ALPHA_ONE
#ifdef BGEMM
bfloat16_t alpha_bf16;
memcpy(&alpha_bf16, &alpha, sizeof(bfloat16_t));
svfloat32_t svalpha = svdup_f32(vcvtah_f32_bf16(alpha_bf16));
#else
svfloat32_t svalpha = svdup_f32(alpha);
#endif
#endif
svbool_t pg32_first_4 = svdupq_b32(1, 1, 1, 1);
svbool_t pg32_first_2 = svdupq_b32(1, 1, 0, 0);
svbool_t pg32_first_1 = svdupq_b32(1, 0, 0, 0);
svbool_t pg16_first_8 = svdupq_b16(1, 1, 1, 1, 1, 1, 1, 1);
svbool_t pg16_first_4 = svdupq_b16(1, 1, 1, 1, 0, 0, 0, 0);
#ifdef BGEMM
svbool_t pg16_first_2 = svdupq_b16(1, 1, 0, 0, 0, 0, 0, 0);
svbool_t pg16_first_1 = svdupq_b16(1, 0, 0, 0, 0, 0, 0, 0);
svbfloat16_t zeros = svdup_n_bf16(vcvth_bf16_f32(0.0));
#endif
bfloat16_t *ptr_a = (bfloat16_t *)A;
bfloat16_t *ptr_b = (bfloat16_t *)B;
OUTPUT_FLOAT *ptr_c = (OUTPUT_FLOAT*)C;
bfloat16_t *ptr_a0;
bfloat16_t *ptr_b0;
OUTPUT_FLOAT *ptr_c0, *ptr_c1, *ptr_c2, *ptr_c3;
OUTPUT_FLOAT *ptr_c4, *ptr_c5, *ptr_c6, *ptr_c7;
svfloat32_t tmp32;
#ifdef BGEMM
svbfloat16_t tmp16;
#endif
for (BLASLONG j = 0; j < n / 8; j++) {
ptr_c0 = ptr_c;
ptr_c1 = ptr_c0 + ldc;
ptr_c2 = ptr_c1 + ldc;
ptr_c3 = ptr_c2 + ldc;
ptr_c4 = ptr_c3 + ldc;
ptr_c5 = ptr_c4 + ldc;
ptr_c6 = ptr_c5 + ldc;
ptr_c7 = ptr_c6 + ldc;
ptr_c += 8 * ldc;
ptr_a = (bfloat16_t *)A;
for (BLASLONG i = 0; i < m / 8; i++) {
ptr_a0 = ptr_a;
ptr_a += 8 * pad_k;
ptr_b0 = ptr_b;
INIT_C_8x8;
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
ma1 = svld1_bf16(pg16_first_8, ptr_a0 + 8);
ma2 = svld1_bf16(pg16_first_8, ptr_a0 + 16);
ma3 = svld1_bf16(pg16_first_8, ptr_a0 + 24);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
mb1 = svld1_bf16(pg16_first_8, ptr_b0 + 8);
mb2 = svld1_bf16(pg16_first_8, ptr_b0 + 16);
mb3 = svld1_bf16(pg16_first_8, ptr_b0 + 24);
MATMUL(0, 0); MATMUL(0, 1); MATMUL(0, 2); MATMUL(0, 3);
MATMUL(1, 0); MATMUL(1, 1); MATMUL(1, 2); MATMUL(1, 3);
MATMUL(2, 0); MATMUL(2, 1); MATMUL(2, 2); MATMUL(2, 3);
MATMUL(3, 0); MATMUL(3, 1); MATMUL(3, 2); MATMUL(3, 3);
ptr_a0 += 32;
ptr_b0 += 32;
}
vc0 = svuzp1(mc00, mc10);
vc1 = svuzp1(mc20, mc30);
vc2 = svuzp2(mc00, mc10);
vc3 = svuzp2(mc20, mc30);
vc4 = svuzp1(mc01, mc11);
vc5 = svuzp1(mc21, mc31);
vc6 = svuzp2(mc01, mc11);
vc7 = svuzp2(mc21, mc31);
vc8 = svuzp1(mc02, mc12);
vc9 = svuzp1(mc22, mc32);
vc10 = svuzp2(mc02, mc12);
vc11 = svuzp2(mc22, mc32);
vc12 = svuzp1(mc03, mc13);
vc13 = svuzp1(mc23, mc33);
vc14 = svuzp2(mc03, mc13);
vc15 = svuzp2(mc23, mc33);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0, vc0);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0 + 4, vc1);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c1, vc2);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c1 + 4, vc3);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c2, vc4);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c2 + 4, vc5);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c3, vc6);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c3 + 4, vc7);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c4, vc8);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c4 + 4, vc9);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c5, vc10);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c5 + 4, vc11);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c6, vc12);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c6 + 4, vc13);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c7, vc14);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c7 + 4, vc15);
ptr_c0 += 8;
ptr_c1 += 8;
ptr_c2 += 8;
ptr_c3 += 8;
ptr_c4 += 8;
ptr_c5 += 8;
ptr_c6 += 8;
ptr_c7 += 8;
}
if (m & 4) {
ptr_a0 = ptr_a;
ptr_a += 4 * pad_k;
ptr_b0 = ptr_b;
INIT_C(0, 0); INIT_C(0, 1); INIT_C(0, 2); INIT_C(0, 3);
INIT_C(1, 0); INIT_C(1, 1); INIT_C(1, 2); INIT_C(1, 3);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
ma1 = svld1_bf16(pg16_first_8, ptr_a0 + 8);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
mb1 = svld1_bf16(pg16_first_8, ptr_b0 + 8);
mb2 = svld1_bf16(pg16_first_8, ptr_b0 + 16);
mb3 = svld1_bf16(pg16_first_8, ptr_b0 + 24);
MATMUL(0, 0); MATMUL(0, 1); MATMUL(0, 2); MATMUL(0, 3);
MATMUL(1, 0); MATMUL(1, 1); MATMUL(1, 2); MATMUL(1, 3);
ptr_a0 += 16;
ptr_b0 += 32;
}
vc0 = svuzp1(mc00, mc10);
vc1 = svuzp2(mc00, mc10);
vc2 = svuzp1(mc01, mc11);
vc3 = svuzp2(mc01, mc11);
vc4 = svuzp1(mc02, mc12);
vc5 = svuzp2(mc02, mc12);
vc6 = svuzp1(mc03, mc13);
vc7 = svuzp2(mc03, mc13);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0, vc0);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c1, vc1);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c2, vc2);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c3, vc3);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c4, vc4);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c5, vc5);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c6, vc6);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c7, vc7);
ptr_c0 += 4;
ptr_c1 += 4;
ptr_c2 += 4;
ptr_c3 += 4;
ptr_c4 += 4;
ptr_c5 += 4;
ptr_c6 += 4;
ptr_c7 += 4;
}
if (m & 2) {
ptr_a0 = ptr_a;
ptr_a += 2 * pad_k;
ptr_b0 = ptr_b;
INIT_C(0, 0); INIT_C(0, 1); INIT_C(0, 2); INIT_C(0, 3);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
mb1 = svld1_bf16(pg16_first_8, ptr_b0 + 8);
mb2 = svld1_bf16(pg16_first_8, ptr_b0 + 16);
mb3 = svld1_bf16(pg16_first_8, ptr_b0 + 24);
MATMUL(0, 0); MATMUL(0, 1); MATMUL(0, 2); MATMUL(0, 3);
ptr_a0 += 8;
ptr_b0 += 32;
}
vc0 = svuzp1(mc00, mc00);
vc1 = svuzp2(mc00, mc00);
vc2 = svuzp1(mc01, mc01);
vc3 = svuzp2(mc01, mc01);
vc4 = svuzp1(mc02, mc02);
vc5 = svuzp2(mc02, mc02);
vc6 = svuzp1(mc03, mc03);
vc7 = svuzp2(mc03, mc03);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c0, vc0);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c1, vc1);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c2, vc2);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c3, vc3);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c4, vc4);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c5, vc5);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c6, vc6);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c7, vc7);
ptr_c0 += 2;
ptr_c1 += 2;
ptr_c2 += 2;
ptr_c3 += 2;
ptr_c4 += 2;
ptr_c5 += 2;
ptr_c6 += 2;
ptr_c7 += 2;
}
if (m & 1) {
ptr_a0 = ptr_a;
ptr_b0 = ptr_b;
INIT_C(0, 0); INIT_C(0, 1); INIT_C(0, 2); INIT_C(0, 3);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_4, ptr_a0);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
mb1 = svld1_bf16(pg16_first_8, ptr_b0 + 8);
mb2 = svld1_bf16(pg16_first_8, ptr_b0 + 16);
mb3 = svld1_bf16(pg16_first_8, ptr_b0 + 24);
MATMUL(0, 0); MATMUL(0, 1); MATMUL(0, 2); MATMUL(0, 3);
ptr_a0 += 4;
ptr_b0 += 32;
}
vc1 = svuzp2(mc00, mc00);
vc3 = svuzp2(mc01, mc01);
vc5 = svuzp2(mc02, mc02);
vc7 = svuzp2(mc03, mc03);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c0, mc00);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c1, vc1);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c2, mc01);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c3, vc3);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c4, mc02);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c5, vc5);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c6, mc03);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c7, vc7);
}
ptr_b += 8 * pad_k;
}
if (n & 4) {
ptr_c0 = ptr_c;
ptr_c1 = ptr_c0 + ldc;
ptr_c2 = ptr_c1 + ldc;
ptr_c3 = ptr_c2 + ldc;
ptr_c += 4 * ldc;
ptr_a = (bfloat16_t *)A;
for (BLASLONG i = 0; i < m / 8; i++) {
ptr_a0 = ptr_a;
ptr_a += 8 * pad_k;
ptr_b0 = ptr_b;
INIT_C_8x4;
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
ma1 = svld1_bf16(pg16_first_8, ptr_a0 + 8);
ma2 = svld1_bf16(pg16_first_8, ptr_a0 + 16);
ma3 = svld1_bf16(pg16_first_8, ptr_a0 + 24);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
mb1 = svld1_bf16(pg16_first_8, ptr_b0 + 8);
MATMUL(0, 0); MATMUL(0, 1);
MATMUL(1, 0); MATMUL(1, 1);
MATMUL(2, 0); MATMUL(2, 1);
MATMUL(3, 0); MATMUL(3, 1);
ptr_a0 += 32;
ptr_b0 += 16;
}
vc0 = svuzp1(mc00, mc10);
vc1 = svuzp1(mc20, mc30);
vc2 = svuzp2(mc00, mc10);
vc3 = svuzp2(mc20, mc30);
vc4 = svuzp1(mc01, mc11);
vc5 = svuzp1(mc21, mc31);
vc6 = svuzp2(mc01, mc11);
vc7 = svuzp2(mc21, mc31);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0, vc0);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0+4, vc1);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c1, vc2);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c1+4, vc3);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c2, vc4);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c2+4, vc5);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c3, vc6);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c3+4, vc7);
ptr_c0 += 8;
ptr_c1 += 8;
ptr_c2 += 8;
ptr_c3 += 8;
}
if (m & 4) {
ptr_a0 = ptr_a;
ptr_a += 4 * pad_k;
ptr_b0 = ptr_b;
INIT_C(0, 0); INIT_C(0, 1);
INIT_C(1, 0); INIT_C(1, 1);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
ma1 = svld1_bf16(pg16_first_8, ptr_a0 + 8);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
mb1 = svld1_bf16(pg16_first_8, ptr_b0 + 8);
MATMUL(0, 0); MATMUL(0, 1);
MATMUL(1, 0); MATMUL(1, 1);
ptr_a0 += 16;
ptr_b0 += 16;
}
vc0 = svuzp1(mc00, mc10);
vc1 = svuzp2(mc00, mc10);
vc2 = svuzp1(mc01, mc11);
vc3 = svuzp2(mc01, mc11);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0, vc0);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c1, vc1);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c2, vc2);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c3, vc3);
ptr_c0 += 4;
ptr_c1 += 4;
ptr_c2 += 4;
ptr_c3 += 4;
}
if (m & 2) {
ptr_a0 = ptr_a;
ptr_a += 2 * pad_k;
ptr_b0 = ptr_b;
INIT_C(0, 0); INIT_C(0, 1);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
mb1 = svld1_bf16(pg16_first_8, ptr_b0 + 8);
MATMUL(0, 0); MATMUL(0, 1);
ptr_a0 += 8;
ptr_b0 += 16;
}
vc0 = svuzp1(mc00, mc00);
vc1 = svuzp2(mc00, mc00);
vc2 = svuzp1(mc01, mc01);
vc3 = svuzp2(mc01, mc01);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c0, vc0);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c1, vc1);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c2, vc2);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c3, vc3);
ptr_c0 += 2;
ptr_c1 += 2;
ptr_c2 += 2;
ptr_c3 += 2;
}
if (m & 1) {
ptr_a0 = ptr_a;
ptr_b0 = ptr_b;
INIT_C(0, 0); INIT_C(0, 1);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_4, ptr_a0);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
mb1 = svld1_bf16(pg16_first_8, ptr_b0 + 8);
MATMUL(0, 0); MATMUL(0, 1);
ptr_a0 += 4;
ptr_b0 += 16;
}
vc1 = svuzp2(mc00, mc00);
vc3 = svuzp2(mc01, mc01);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c0, mc00);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c1, vc1);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c2, mc01);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c3, vc3);
}
ptr_b += 4 * pad_k;
}
if (n & 2) {
ptr_c0 = ptr_c;
ptr_c1 = ptr_c0 + ldc;
ptr_c += 2 * ldc;
ptr_a = (bfloat16_t *)A;
for (BLASLONG i = 0; i < m / 8; i++) {
ptr_a0 = ptr_a;
ptr_a += 8 * pad_k;
ptr_b0 = ptr_b;
INIT_C(0, 0);
INIT_C(1, 0);
INIT_C(2, 0);
INIT_C(3, 0);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
ma1 = svld1_bf16(pg16_first_8, ptr_a0 + 8);
ma2 = svld1_bf16(pg16_first_8, ptr_a0 + 16);
ma3 = svld1_bf16(pg16_first_8, ptr_a0 + 24);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
MATMUL(0, 0);
MATMUL(1, 0);
MATMUL(2, 0);
MATMUL(3, 0);
ptr_a0 += 32;
ptr_b0 += 8;
}
vc0 = svuzp1(mc00, mc10);
vc1 = svuzp1(mc20, mc30);
vc2 = svuzp2(mc00, mc10);
vc3 = svuzp2(mc20, mc30);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0, vc0);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0 + 4, vc1);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c1, vc2);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c1 + 4, vc3);
ptr_c0 += 8;
ptr_c1 += 8;
}
if (m & 4) {
ptr_a0 = ptr_a;
ptr_a += 4 * pad_k;
ptr_b0 = ptr_b;
INIT_C(0, 0);
INIT_C(1, 0);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
ma1 = svld1_bf16(pg16_first_8, ptr_a0 + 8);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
MATMUL(0, 0);
MATMUL(1, 0);
ptr_a0 += 16;
ptr_b0 += 8;
}
vc0 = svuzp1(mc00, mc10);
vc1 = svuzp2(mc00, mc10);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0, vc0);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c1, vc1);
ptr_c0 += 4;
ptr_c1 += 4;
}
if (m & 2) {
ptr_a0 = ptr_a;
ptr_a += 2 * pad_k;
ptr_b0 = ptr_b;
INIT_C(0, 0);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
MATMUL(0, 0);
ptr_a0 += 8;
ptr_b0 += 8;
}
vc0 = svuzp1(mc00, mc00);
vc1 = svuzp2(mc00, mc00);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c0, vc0);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c1, vc1);
ptr_c0 += 2;
ptr_c1 += 2;
}
if (m & 1) {
ptr_a0 = ptr_a;
ptr_b0 = ptr_b;
INIT_C(0, 0);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_4, ptr_a0);
mb0 = svld1_bf16(pg16_first_8, ptr_b0);
MATMUL(0, 0);
ptr_a0 += 4;
ptr_b0 += 8;
}
vc1 = svuzp2(mc00, mc00);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c0, mc00);
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c1, vc1);
}
ptr_b += 2 * pad_k;
}
if (n & 1) {
ptr_c0 = ptr_c;
ptr_a = (bfloat16_t *)A;
for (BLASLONG i = 0; i < m / 8; i++) {
ptr_a0 = ptr_a;
ptr_a += 8 * pad_k;
ptr_b0 = ptr_b;
INIT_C(0, 0);
INIT_C(1, 0);
INIT_C(2, 0);
INIT_C(3, 0);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
ma1 = svld1_bf16(pg16_first_8, ptr_a0 + 8);
ma2 = svld1_bf16(pg16_first_8, ptr_a0 + 16);
ma3 = svld1_bf16(pg16_first_8, ptr_a0 + 24);
mb0 = svld1_bf16(pg16_first_4, ptr_b0);
MATMUL(0, 0);
MATMUL(1, 0);
MATMUL(2, 0);
MATMUL(3, 0);
ptr_a0 += 32;
ptr_b0 += 4;
}
vc0 = svuzp1(mc00, mc10);
vc1 = svuzp1(mc20, mc30);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0, vc0);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0 + 4, vc1);
ptr_c0 += 8;
}
if (m & 4) {
ptr_a0 = ptr_a;
ptr_a += 4 * pad_k;
ptr_b0 = ptr_b;
INIT_C(0, 0);
INIT_C(1, 0);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
ma1 = svld1_bf16(pg16_first_8, ptr_a0 + 8);
mb0 = svld1_bf16(pg16_first_4, ptr_b0);
MATMUL(0, 0);
MATMUL(1, 0);
ptr_a0 += 16;
ptr_b0 += 4;
}
vc0 = svuzp1(mc00, mc10);
UPDATE_C(pg16_first_4, pg32_first_4, ptr_c0, vc0);
ptr_c0 += 4;
}
if (m & 2) {
ptr_a0 = ptr_a;
ptr_a += 2 * pad_k;
ptr_b0 = ptr_b;
INIT_C(0, 0);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_8, ptr_a0);
mb0 = svld1_bf16(pg16_first_4, ptr_b0);
MATMUL(0, 0);
ptr_a0 += 8;
ptr_b0 += 4;
}
vc0 = svuzp1(mc00, mc00);
UPDATE_C(pg16_first_2, pg32_first_2, ptr_c0, vc0);
ptr_c0 += 2;
}
if (m & 1) {
ptr_a0 = ptr_a;
ptr_b0 = ptr_b;
INIT_C(0, 0);
for (BLASLONG p = 0; p < pad_k; p += 4) {
ma0 = svld1_bf16(pg16_first_4, ptr_a0);
mb0 = svld1_bf16(pg16_first_4, ptr_b0);
MATMUL(0, 0);
ptr_a0 += 4;
ptr_b0 += 4;
}
UPDATE_C(pg16_first_1, pg32_first_1, ptr_c0, mc00);
}
}
return 0;
}
+3
View File
@@ -238,7 +238,10 @@ static double nrm2_compute(BLASLONG n, FLOAT *x, BLASLONG inc_x)
" cmp "J", xzr \n"
" beq 5f //nrm2_kernel_S_BEGIN \n"
/* https://github.com/llvm/llvm-project/issues/149547 */
#if !(defined(__clang__) && defined(OS_WINDOWS))
" .align 5 \n"
#endif
"2: //nrm2_kernel_F: \n"
" "KERNEL_F" \n"
" subs "J", "J", #1 \n"
@@ -7,7 +7,6 @@
#include <stdlib.h>
#include <inttypes.h>
#include <math.h>
#include "sme_abi.h"
#if defined(DYNAMIC_ARCH)
#define COMBINE(a,b) a ## b
@@ -26,6 +25,7 @@ extern void SME1_PREPROCESS(uint64_t nbr, uint64_t nbc,\
const float * restrict a, float * a_mod);
#if defined(HAVE_SME)
#include "sme_abi.h"
#if defined(__ARM_FEATURE_SME) && defined(__clang__) && __clang_major__ >= 16
#include <arm_sme.h>
@@ -214,3 +214,4 @@ void CNAME (BLASLONG M, BLASLONG N, BLASLONG K, float alpha, float * __restrict
float beta, float * __restrict R, BLASLONG strideR){fprintf(stderr,"empty sgemm_direct_alpha_beta should not be called!!!\n");}
#endif
+887
View File
@@ -0,0 +1,887 @@
/***************************************************************************
* Copyright (c) 2026 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 <arm_neon.h>
#include "common.h"
static inline void kernel_8x8(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
float32x4_t c0_low = vdupq_n_f32(0.0f);
float32x4_t c0_high = vdupq_n_f32(0.0f);
float32x4_t c1_low = vdupq_n_f32(0.0f);
float32x4_t c1_high = vdupq_n_f32(0.0f);
float32x4_t c2_low = vdupq_n_f32(0.0f);
float32x4_t c2_high = vdupq_n_f32(0.0f);
float32x4_t c3_low = vdupq_n_f32(0.0f);
float32x4_t c3_high = vdupq_n_f32(0.0f);
float32x4_t c4_low = vdupq_n_f32(0.0f);
float32x4_t c4_high = vdupq_n_f32(0.0f);
float32x4_t c5_low = vdupq_n_f32(0.0f);
float32x4_t c5_high = vdupq_n_f32(0.0f);
float32x4_t c6_low = vdupq_n_f32(0.0f);
float32x4_t c6_high = vdupq_n_f32(0.0f);
float32x4_t c7_low = vdupq_n_f32(0.0f);
float32x4_t c7_high = vdupq_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float16x8_t a_f16 = vld1q_f16(A);
float32x4_t a_low = vcvt_f32_f16(vget_low_f16(a_f16));
float32x4_t a_high = vcvt_f32_f16(vget_high_f16(a_f16));
float16x8_t b_f16 = vld1q_f16(B);
float32x4_t b_low = vcvt_f32_f16(vget_low_f16(b_f16));
float32x4_t b_high = vcvt_f32_f16(vget_high_f16(b_f16));
float32_t b0_lane0 = vgetq_lane_f32(b_low, 0);
c0_low = vfmaq_n_f32(c0_low, a_low, b0_lane0);
c0_high = vfmaq_n_f32(c0_high, a_high, b0_lane0);
float32_t b0_lane1 = vgetq_lane_f32(b_low, 1);
c1_low = vfmaq_n_f32(c1_low, a_low, b0_lane1);
c1_high = vfmaq_n_f32(c1_high, a_high, b0_lane1);
float32_t b0_lane2 = vgetq_lane_f32(b_low, 2);
c2_low = vfmaq_n_f32(c2_low, a_low, b0_lane2);
c2_high = vfmaq_n_f32(c2_high, a_high, b0_lane2);
float32_t b0_lane3 = vgetq_lane_f32(b_low, 3);
c3_low = vfmaq_n_f32(c3_low, a_low, b0_lane3);
c3_high = vfmaq_n_f32(c3_high, a_high, b0_lane3);
float32_t b1_lane0 = vgetq_lane_f32(b_high, 0);
c4_low = vfmaq_n_f32(c4_low, a_low, b1_lane0);
c4_high = vfmaq_n_f32(c4_high, a_high, b1_lane0);
float32_t b1_lane1 = vgetq_lane_f32(b_high, 1);
c5_low = vfmaq_n_f32(c5_low, a_low, b1_lane1);
c5_high = vfmaq_n_f32(c5_high, a_high, b1_lane1);
float32_t b1_lane2 = vgetq_lane_f32(b_high, 2);
c6_low = vfmaq_n_f32(c6_low, a_low, b1_lane2);
c6_high = vfmaq_n_f32(c6_high, a_high, b1_lane2);
float32_t b1_lane3 = vgetq_lane_f32(b_high, 3);
c7_low = vfmaq_n_f32(c7_low, a_low, b1_lane3);
c7_high = vfmaq_n_f32(c7_high, a_high, b1_lane3);
A += 8;
B += 8;
}
FLOAT *col_0 = C + 0 * ldc;
FLOAT *col_1 = C + 1 * ldc;
FLOAT *col_2 = C + 2 * ldc;
FLOAT *col_3 = C + 3 * ldc;
FLOAT *col_4 = C + 4 * ldc;
FLOAT *col_5 = C + 5 * ldc;
FLOAT *col_6 = C + 6 * ldc;
FLOAT *col_7 = C + 7 * ldc;
float32x4_t t0_l = vld1q_f32(col_0);
float32x4_t t0_h = vld1q_f32(col_0 + 4);
t0_l = vaddq_f32(t0_l, vmulq_n_f32(c0_low, alpha));
t0_h = vaddq_f32(t0_h, vmulq_n_f32(c0_high, alpha));
vst1q_f32(col_0, t0_l);
vst1q_f32(col_0 + 4, t0_h);
float32x4_t t1_l = vld1q_f32(col_1);
float32x4_t t1_h = vld1q_f32(col_1 + 4);
t1_l = vaddq_f32(t1_l, vmulq_n_f32(c1_low, alpha));
t1_h = vaddq_f32(t1_h, vmulq_n_f32(c1_high, alpha));
vst1q_f32(col_1, t1_l);
vst1q_f32(col_1 + 4, t1_h);
float32x4_t t2_l = vld1q_f32(col_2);
float32x4_t t2_h = vld1q_f32(col_2 + 4);
t2_l = vaddq_f32(t2_l, vmulq_n_f32(c2_low, alpha));
t2_h = vaddq_f32(t2_h, vmulq_n_f32(c2_high, alpha));
vst1q_f32(col_2, t2_l);
vst1q_f32(col_2 + 4, t2_h);
float32x4_t t3_l = vld1q_f32(col_3);
float32x4_t t3_h = vld1q_f32(col_3 + 4);
t3_l = vaddq_f32(t3_l, vmulq_n_f32(c3_low, alpha));
t3_h = vaddq_f32(t3_h, vmulq_n_f32(c3_high, alpha));
vst1q_f32(col_3, t3_l);
vst1q_f32(col_3 + 4, t3_h);
float32x4_t t4_l = vld1q_f32(col_4);
float32x4_t t4_h = vld1q_f32(col_4 + 4);
t4_l = vaddq_f32(t4_l, vmulq_n_f32(c4_low, alpha));
t4_h = vaddq_f32(t4_h, vmulq_n_f32(c4_high, alpha));
vst1q_f32(col_4, t4_l);
vst1q_f32(col_4 + 4, t4_h);
float32x4_t t5_l = vld1q_f32(col_5);
float32x4_t t5_h = vld1q_f32(col_5 + 4);
t5_l = vaddq_f32(t5_l, vmulq_n_f32(c5_low, alpha));
t5_h = vaddq_f32(t5_h, vmulq_n_f32(c5_high, alpha));
vst1q_f32(col_5, t5_l);
vst1q_f32(col_5 + 4, t5_h);
float32x4_t t6_l = vld1q_f32(col_6);
float32x4_t t6_h = vld1q_f32(col_6 + 4);
t6_l = vaddq_f32(t6_l, vmulq_n_f32(c6_low, alpha));
t6_h = vaddq_f32(t6_h, vmulq_n_f32(c6_high, alpha));
vst1q_f32(col_6, t6_l);
vst1q_f32(col_6 + 4, t6_h);
float32x4_t t7_l = vld1q_f32(col_7);
float32x4_t t7_h = vld1q_f32(col_7 + 4);
t7_l = vaddq_f32(t7_l, vmulq_n_f32(c7_low, alpha));
t7_h = vaddq_f32(t7_h, vmulq_n_f32(c7_high, alpha));
vst1q_f32(col_7, t7_l);
vst1q_f32(col_7 + 4, t7_h);
}
static inline void kernel_4x8(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
float32x4_t c0 = vdupq_n_f32(0.0f);
float32x4_t c1 = vdupq_n_f32(0.0f);
float32x4_t c2 = vdupq_n_f32(0.0f);
float32x4_t c3 = vdupq_n_f32(0.0f);
float32x4_t c4 = vdupq_n_f32(0.0f);
float32x4_t c5 = vdupq_n_f32(0.0f);
float32x4_t c6 = vdupq_n_f32(0.0f);
float32x4_t c7 = vdupq_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float32x4_t a_f16 = vcvt_f32_f16(vld1_f16(A));
float16x8_t b_f16 = vld1q_f16(B);
float32x4_t b_low = vcvt_f32_f16(vget_low_f16(b_f16));
float32x4_t b_high = vcvt_f32_f16(vget_high_f16(b_f16));
float32_t b0_lane0 = vgetq_lane_f32(b_low, 0);
c0 = vfmaq_n_f32(c0, a_f16, b0_lane0);
float32_t b0_lane1 = vgetq_lane_f32(b_low, 1);
c1 = vfmaq_n_f32(c1, a_f16, b0_lane1);
float32_t b0_lane2 = vgetq_lane_f32(b_low, 2);
c2 = vfmaq_n_f32(c2, a_f16, b0_lane2);
float32_t b0_lane3 = vgetq_lane_f32(b_low, 3);
c3 = vfmaq_n_f32(c3, a_f16, b0_lane3);
float32_t b1_lane0 = vgetq_lane_f32(b_high, 0);
c4 = vfmaq_n_f32(c4, a_f16, b1_lane0);
float32_t b1_lane1 = vgetq_lane_f32(b_high, 1);
c5 = vfmaq_n_f32(c5, a_f16, b1_lane1);
float32_t b1_lane2 = vgetq_lane_f32(b_high, 2);
c6 = vfmaq_n_f32(c6, a_f16, b1_lane2);
float32_t b1_lane3 = vgetq_lane_f32(b_high, 3);
c7 = vfmaq_n_f32(c7, a_f16, b1_lane3);
A += 4;
B += 8;
}
FLOAT *col_0 = C + 0 * ldc;
FLOAT *col_1 = C + 1 * ldc;
FLOAT *col_2 = C + 2 * ldc;
FLOAT *col_3 = C + 3 * ldc;
FLOAT *col_4 = C + 4 * ldc;
FLOAT *col_5 = C + 5 * ldc;
FLOAT *col_6 = C + 6 * ldc;
FLOAT *col_7 = C + 7 * ldc;
float32x4_t t0 = vld1q_f32(col_0);
t0 = vaddq_f32(t0, vmulq_n_f32(c0, alpha));
vst1q_f32(col_0, t0);
float32x4_t t1 = vld1q_f32(col_1);
t1 = vaddq_f32(t1, vmulq_n_f32(c1, alpha));
vst1q_f32(col_1, t1);
float32x4_t t2 = vld1q_f32(col_2);
t2 = vaddq_f32(t2, vmulq_n_f32(c2, alpha));
vst1q_f32(col_2, t2);
float32x4_t t3 = vld1q_f32(col_3);
t3 = vaddq_f32(t3, vmulq_n_f32(c3, alpha));
vst1q_f32(col_3, t3);
float32x4_t t4 = vld1q_f32(col_4);
t4 = vaddq_f32(t4, vmulq_n_f32(c4, alpha));
vst1q_f32(col_4, t4);
float32x4_t t5 = vld1q_f32(col_5);
t5 = vaddq_f32(t5, vmulq_n_f32(c5, alpha));
vst1q_f32(col_5, t5);
float32x4_t t6 = vld1q_f32(col_6);
t6 = vaddq_f32(t6, vmulq_n_f32(c6, alpha));
vst1q_f32(col_6, t6);
float32x4_t t7 = vld1q_f32(col_7);
t7 = vaddq_f32(t7, vmulq_n_f32(c7, alpha));
vst1q_f32(col_7, t7);
}
static inline void kernel_2x8(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
float32x2_t c0 = vdup_n_f32(0.0f);
float32x2_t c1 = vdup_n_f32(0.0f);
float32x2_t c2 = vdup_n_f32(0.0f);
float32x2_t c3 = vdup_n_f32(0.0f);
float32x2_t c4 = vdup_n_f32(0.0f);
float32x2_t c5 = vdup_n_f32(0.0f);
float32x2_t c6 = vdup_n_f32(0.0f);
float32x2_t c7 = vdup_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float32x4_t a_f32 = vcvt_f32_f16(vld1_f16(A));
float32x2_t a_low = vget_low_f32(a_f32);
float16x8_t b_f16 = vld1q_f16(B);
float32x4_t b_low = vcvt_f32_f16(vget_low_f16(b_f16));
float32x4_t b_high = vcvt_f32_f16(vget_high_f16(b_f16));
float32_t b0_lane0 = vgetq_lane_f32(b_low, 0);
c0 = vfma_n_f32(c0, a_low, b0_lane0);
float32_t b0_lane1 = vgetq_lane_f32(b_low, 1);
c1 = vfma_n_f32(c1, a_low, b0_lane1);
float32_t b0_lane2 = vgetq_lane_f32(b_low, 2);
c2 = vfma_n_f32(c2, a_low, b0_lane2);
float32_t b0_lane3 = vgetq_lane_f32(b_low, 3);
c3 = vfma_n_f32(c3, a_low, b0_lane3);
float32_t b1_lane0 = vgetq_lane_f32(b_high, 0);
c4 = vfma_n_f32(c4, a_low, b1_lane0);
float32_t b1_lane1 = vgetq_lane_f32(b_high, 1);
c5 = vfma_n_f32(c5, a_low, b1_lane1);
float32_t b1_lane2 = vgetq_lane_f32(b_high, 2);
c6 = vfma_n_f32(c6, a_low, b1_lane2);
float32_t b1_lane3 = vgetq_lane_f32(b_high, 3);
c7 = vfma_n_f32(c7, a_low, b1_lane3);
A += 2;
B += 8;
}
FLOAT *col_0 = C + 0 * ldc;
FLOAT *col_1 = C + 1 * ldc;
FLOAT *col_2 = C + 2 * ldc;
FLOAT *col_3 = C + 3 * ldc;
FLOAT *col_4 = C + 4 * ldc;
FLOAT *col_5 = C + 5 * ldc;
FLOAT *col_6 = C + 6 * ldc;
FLOAT *col_7 = C + 7 * ldc;
float32x2_t t0 = vld1_f32(col_0);
t0 = vadd_f32(t0, vmul_n_f32(c0, alpha));
vst1_f32(col_0, t0);
float32x2_t t1 = vld1_f32(col_1);
t1 = vadd_f32(t1, vmul_n_f32(c1, alpha));
vst1_f32(col_1, t1);
float32x2_t t2 = vld1_f32(col_2);
t2 = vadd_f32(t2, vmul_n_f32(c2, alpha));
vst1_f32(col_2, t2);
float32x2_t t3 = vld1_f32(col_3);
t3 = vadd_f32(t3, vmul_n_f32(c3, alpha));
vst1_f32(col_3, t3);
float32x2_t t4 = vld1_f32(col_4);
t4 = vadd_f32(t4, vmul_n_f32(c4, alpha));
vst1_f32(col_4, t4);
float32x2_t t5 = vld1_f32(col_5);
t5 = vadd_f32(t5, vmul_n_f32(c5, alpha));
vst1_f32(col_5, t5);
float32x2_t t6 = vld1_f32(col_6);
t6 = vadd_f32(t6, vmul_n_f32(c6, alpha));
vst1_f32(col_6, t6);
float32x2_t t7 = vld1_f32(col_7);
t7 = vadd_f32(t7, vmul_n_f32(c7, alpha));
vst1_f32(col_7, t7);
}
static inline void kernel_1x8(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
FLOAT c0 = 0, c1 = 0, c2 = 0, c3 = 0, c4 = 0, c5 = 0, c6 = 0, c7 = 0;
for (BLASLONG k = 0; k < K; ++k) {
FLOAT a = A[0];
c0 += a * B[0];
c1 += a * B[1];
c2 += a * B[2];
c3 += a * B[3];
c4 += a * B[4];
c5 += a * B[5];
c6 += a * B[6];
c7 += a * B[7];
A += 1;
B += 8;
}
C[0 * ldc] += alpha * c0;
C[1 * ldc] += alpha * c1;
C[2 * ldc] += alpha * c2;
C[3 * ldc] += alpha * c3;
C[4 * ldc] += alpha * c4;
C[5 * ldc] += alpha * c5;
C[6 * ldc] += alpha * c6;
C[7 * ldc] += alpha * c7;
}
static inline void kernel_8x4(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
float32x4_t c0_low = vdupq_n_f32(0.0f);
float32x4_t c0_high = vdupq_n_f32(0.0f);
float32x4_t c1_low = vdupq_n_f32(0.0f);
float32x4_t c1_high = vdupq_n_f32(0.0f);
float32x4_t c2_low = vdupq_n_f32(0.0f);
float32x4_t c2_high = vdupq_n_f32(0.0f);
float32x4_t c3_low = vdupq_n_f32(0.0f);
float32x4_t c3_high = vdupq_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float16x8_t a_f16 = vld1q_f16(A);
float32x4_t a_low = vcvt_f32_f16(vget_low_f16(a_f16));
float32x4_t a_high = vcvt_f32_f16(vget_high_f16(a_f16));
float32x4_t b_f32 = vcvt_f32_f16(vld1_f16(B));
float32_t b0_lane0 = vgetq_lane_f32(b_f32, 0);
c0_low = vfmaq_n_f32(c0_low, a_low, b0_lane0);
c0_high = vfmaq_n_f32(c0_high, a_high, b0_lane0);
float32_t b0_lane1 = vgetq_lane_f32(b_f32, 1);
c1_low = vfmaq_n_f32(c1_low, a_low, b0_lane1);
c1_high = vfmaq_n_f32(c1_high, a_high, b0_lane1);
float32_t b0_lane2 = vgetq_lane_f32(b_f32, 2);
c2_low = vfmaq_n_f32(c2_low, a_low, b0_lane2);
c2_high = vfmaq_n_f32(c2_high, a_high, b0_lane2);
float32_t b0_lane3 = vgetq_lane_f32(b_f32, 3);
c3_low = vfmaq_n_f32(c3_low, a_low, b0_lane3);
c3_high = vfmaq_n_f32(c3_high, a_high, b0_lane3);
A += 8;
B += 4;
}
FLOAT *col_0 = C + 0 * ldc;
FLOAT *col_1 = C + 1 * ldc;
FLOAT *col_2 = C + 2 * ldc;
FLOAT *col_3 = C + 3 * ldc;
float32x4_t t0_l = vld1q_f32(col_0);
float32x4_t t0_h = vld1q_f32(col_0 + 4);
t0_l = vaddq_f32(t0_l, vmulq_n_f32(c0_low, alpha));
t0_h = vaddq_f32(t0_h, vmulq_n_f32(c0_high, alpha));
vst1q_f32(col_0, t0_l);
vst1q_f32(col_0 + 4, t0_h);
float32x4_t t1_l = vld1q_f32(col_1);
float32x4_t t1_h = vld1q_f32(col_1 + 4);
t1_l = vaddq_f32(t1_l, vmulq_n_f32(c1_low, alpha));
t1_h = vaddq_f32(t1_h, vmulq_n_f32(c1_high, alpha));
vst1q_f32(col_1, t1_l);
vst1q_f32(col_1 + 4, t1_h);
float32x4_t t2_l = vld1q_f32(col_2);
float32x4_t t2_h = vld1q_f32(col_2 + 4);
t2_l = vaddq_f32(t2_l, vmulq_n_f32(c2_low, alpha));
t2_h = vaddq_f32(t2_h, vmulq_n_f32(c2_high, alpha));
vst1q_f32(col_2, t2_l);
vst1q_f32(col_2 + 4, t2_h);
float32x4_t t3_l = vld1q_f32(col_3);
float32x4_t t3_h = vld1q_f32(col_3 + 4);
t3_l = vaddq_f32(t3_l, vmulq_n_f32(c3_low, alpha));
t3_h = vaddq_f32(t3_h, vmulq_n_f32(c3_high, alpha));
vst1q_f32(col_3, t3_l);
vst1q_f32(col_3 + 4, t3_h);
}
static inline void kernel_4x4(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
float32x4_t c0 = vdupq_n_f32(0.0f);
float32x4_t c1 = vdupq_n_f32(0.0f);
float32x4_t c2 = vdupq_n_f32(0.0f);
float32x4_t c3 = vdupq_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float32x4_t a_f32 = vcvt_f32_f16(vld1_f16(A));
float32x4_t b_f32 = vcvt_f32_f16(vld1_f16(B));
float32_t b0_lane0 = vgetq_lane_f32(b_f32, 0);
c0 = vfmaq_n_f32(c0, a_f32, b0_lane0);
float32_t b0_lane1 = vgetq_lane_f32(b_f32, 1);
c1 = vfmaq_n_f32(c1, a_f32, b0_lane1);
float32_t b0_lane2 = vgetq_lane_f32(b_f32, 2);
c2 = vfmaq_n_f32(c2, a_f32, b0_lane2);
float32_t b0_lane3 = vgetq_lane_f32(b_f32, 3);
c3 = vfmaq_n_f32(c3, a_f32, b0_lane3);
A += 4;
B += 4;
}
FLOAT *col_0 = C + 0 * ldc;
FLOAT *col_1 = C + 1 * ldc;
FLOAT *col_2 = C + 2 * ldc;
FLOAT *col_3 = C + 3 * ldc;
float32x4_t t0 = vld1q_f32(col_0);
t0 = vaddq_f32(t0, vmulq_n_f32(c0, alpha));
vst1q_f32(col_0, t0);
float32x4_t t1 = vld1q_f32(col_1);
t1 = vaddq_f32(t1, vmulq_n_f32(c1, alpha));
vst1q_f32(col_1, t1);
float32x4_t t2 = vld1q_f32(col_2);
t2 = vaddq_f32(t2, vmulq_n_f32(c2, alpha));
vst1q_f32(col_2, t2);
float32x4_t t3 = vld1q_f32(col_3);
t3 = vaddq_f32(t3, vmulq_n_f32(c3, alpha));
vst1q_f32(col_3, t3);
}
static inline void kernel_2x4(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
float32x2_t c0 = vdup_n_f32(0.0f);
float32x2_t c1 = vdup_n_f32(0.0f);
float32x2_t c2 = vdup_n_f32(0.0f);
float32x2_t c3 = vdup_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float32x4_t a_f32 = vcvt_f32_f16(vld1_f16(A));
float32x2_t a_low = vget_low_f32(a_f32);
float32x4_t b_f32 = vcvt_f32_f16(vld1_f16(B));
float32_t b0_lane0 = vgetq_lane_f32(b_f32, 0);
c0 = vfma_n_f32(c0, a_low, b0_lane0);
float32_t b0_lane1 = vgetq_lane_f32(b_f32, 1);
c1 = vfma_n_f32(c1, a_low, b0_lane1);
float32_t b0_lane2 = vgetq_lane_f32(b_f32, 2);
c2 = vfma_n_f32(c2, a_low, b0_lane2);
float32_t b0_lane3 = vgetq_lane_f32(b_f32, 3);
c3 = vfma_n_f32(c3, a_low, b0_lane3);
A += 2;
B += 4;
}
FLOAT *col_0 = C + 0 * ldc;
FLOAT *col_1 = C + 1 * ldc;
FLOAT *col_2 = C + 2 * ldc;
FLOAT *col_3 = C + 3 * ldc;
float32x2_t t0 = vld1_f32(col_0);
t0 = vadd_f32(t0, vmul_n_f32(c0, alpha));
vst1_f32(col_0, t0);
float32x2_t t1 = vld1_f32(col_1);
t1 = vadd_f32(t1, vmul_n_f32(c1, alpha));
vst1_f32(col_1, t1);
float32x2_t t2 = vld1_f32(col_2);
t2 = vadd_f32(t2, vmul_n_f32(c2, alpha));
vst1_f32(col_2, t2);
float32x2_t t3 = vld1_f32(col_3);
t3 = vadd_f32(t3, vmul_n_f32(c3, alpha));
vst1_f32(col_3, t3);
}
static inline void kernel_1x4(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
FLOAT c0 = 0, c1 = 0, c2 = 0, c3 = 0;
for (BLASLONG k = 0; k < K; ++k) {
FLOAT a = A[0];
c0 += a * B[0];
c1 += a * B[1];
c2 += a * B[2];
c3 += a * B[3];
A += 1;
B += 4;
}
C[0 * ldc] += alpha * c0;
C[1 * ldc] += alpha * c1;
C[2 * ldc] += alpha * c2;
C[3 * ldc] += alpha * c3;
}
static inline void kernel_8x2(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
float32x4_t c0_low = vdupq_n_f32(0.0f);
float32x4_t c0_high = vdupq_n_f32(0.0f);
float32x4_t c1_low = vdupq_n_f32(0.0f);
float32x4_t c1_high = vdupq_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float16x8_t a_f16 = vld1q_f16(A);
float32x4_t a_low = vcvt_f32_f16(vget_low_f16(a_f16));
float32x4_t a_high = vcvt_f32_f16(vget_high_f16(a_f16));
float32x4_t b_f32 = vcvt_f32_f16(vld1_f16(B));
float32_t b0_lane0 = vgetq_lane_f32(b_f32, 0);
c0_low = vfmaq_n_f32(c0_low, a_low, b0_lane0);
c0_high = vfmaq_n_f32(c0_high, a_high, b0_lane0);
float32_t b0_lane1 = vgetq_lane_f32(b_f32, 1);
c1_low = vfmaq_n_f32(c1_low, a_low, b0_lane1);
c1_high = vfmaq_n_f32(c1_high, a_high, b0_lane1);
A += 8;
B += 2;
}
FLOAT *col_0 = C + 0 * ldc;
FLOAT *col_1 = C + 1 * ldc;
float32x4_t t0_l = vld1q_f32(col_0);
float32x4_t t0_h = vld1q_f32(col_0 + 4);
t0_l = vaddq_f32(t0_l, vmulq_n_f32(c0_low, alpha));
t0_h = vaddq_f32(t0_h, vmulq_n_f32(c0_high, alpha));
vst1q_f32(col_0, t0_l);
vst1q_f32(col_0 + 4, t0_h);
float32x4_t t1_l = vld1q_f32(col_1);
float32x4_t t1_h = vld1q_f32(col_1 + 4);
t1_l = vaddq_f32(t1_l, vmulq_n_f32(c1_low, alpha));
t1_h = vaddq_f32(t1_h, vmulq_n_f32(c1_high, alpha));
vst1q_f32(col_1, t1_l);
vst1q_f32(col_1 + 4, t1_h);
}
static inline void kernel_4x2(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
float32x4_t c0 = vdupq_n_f32(0.0f);
float32x4_t c1 = vdupq_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float32x4_t a_f32 = vcvt_f32_f16(vld1_f16(A));
float32x4_t b_f32 = vcvt_f32_f16(vld1_f16(B));
float32_t b0_lane0 = vgetq_lane_f32(b_f32, 0);
c0 = vfmaq_n_f32(c0, a_f32, b0_lane0);
float32_t b0_lane1 = vgetq_lane_f32(b_f32, 1);
c1 = vfmaq_n_f32(c1, a_f32, b0_lane1);
A += 4;
B += 2;
}
FLOAT *col_0 = C + 0 * ldc;
FLOAT *col_1 = C + 1 * ldc;
float32x4_t t0 = vld1q_f32(col_0);
t0 = vaddq_f32(t0, vmulq_n_f32(c0, alpha));
vst1q_f32(col_0, t0);
float32x4_t t1 = vld1q_f32(col_1);
t1 = vaddq_f32(t1, vmulq_n_f32(c1, alpha));
vst1q_f32(col_1, t1);
}
static inline void kernel_2x2(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
float32x2_t c0 = vdup_n_f32(0.0f);
float32x2_t c1 = vdup_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float32x4_t a_f32 = vcvt_f32_f16(vld1_f16(A));
float32x2_t a_low = vget_low_f32(a_f32);
float32x4_t b_f32 = vcvt_f32_f16(vld1_f16(B));
float32_t b0_lane0 = vgetq_lane_f32(b_f32, 0);
c0 = vfma_n_f32(c0, a_low, b0_lane0);
float32_t b0_lane1 = vgetq_lane_f32(b_f32, 1);
c1 = vfma_n_f32(c1, a_low, b0_lane1);
;
A += 2;
B += 2;
}
FLOAT *col_0 = C + 0 * ldc;
FLOAT *col_1 = C + 1 * ldc;
float32x2_t t0 = vld1_f32(col_0);
t0 = vadd_f32(t0, vmul_n_f32(c0, alpha));
vst1_f32(col_0, t0);
float32x2_t t1 = vld1_f32(col_1);
t1 = vadd_f32(t1, vmul_n_f32(c1, alpha));
vst1_f32(col_1, t1);
}
static inline void kernel_1x2(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, BLASLONG ldc, FLOAT alpha) {
FLOAT c0 = 0, c1 = 0;
for (BLASLONG k = 0; k < K; ++k) {
FLOAT a = A[0];
c0 += a * B[0];
c1 += a * B[1];
A += 1;
B += 2;
}
C[0 * ldc] += alpha * c0;
C[1 * ldc] += alpha * c1;
}
static inline void kernel_8x1(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, FLOAT alpha) {
float32x4_t c0_low = vdupq_n_f32(0.0f);
float32x4_t c0_high = vdupq_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float16x8_t a_f16 = vld1q_f16(A);
float32x4_t a_low = vcvt_f32_f16(vget_low_f16(a_f16));
float32x4_t a_high = vcvt_f32_f16(vget_high_f16(a_f16));
float b_scalar = (float)B[0];
c0_low = vfmaq_n_f32(c0_low, a_low, b_scalar);
c0_high = vfmaq_n_f32(c0_high, a_high, b_scalar);
A += 8;
B += 1;
}
FLOAT *col_0 = C;
float32x4_t t0_l = vld1q_f32(col_0);
float32x4_t t0_h = vld1q_f32(col_0 + 4);
t0_l = vaddq_f32(t0_l, vmulq_n_f32(c0_low, alpha));
t0_h = vaddq_f32(t0_h, vmulq_n_f32(c0_high, alpha));
vst1q_f32(col_0, t0_l);
vst1q_f32(col_0 + 4, t0_h);
}
static inline void kernel_4x1(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, FLOAT alpha) {
float32x4_t c0 = vdupq_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float32x4_t a_f32 = vcvt_f32_f16(vld1_f16(A));
float b_scalar = (float)B[0];
c0 = vfmaq_n_f32(c0, a_f32, b_scalar);
A += 4;
B += 1;
}
FLOAT *col_0 = C;
float32x4_t t0 = vld1q_f32(col_0);
t0 = vaddq_f32(t0, vmulq_n_f32(c0, alpha));
vst1q_f32(col_0, t0);
}
static inline void kernel_2x1(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, FLOAT alpha) {
float32x2_t c0 = vdup_n_f32(0.0f);
for (BLASLONG k = 0; k < K; ++k) {
float32x4_t a_f32 = vcvt_f32_f16(vld1_f16(A));
float32x2_t a_low = vget_low_f32(a_f32);
float b_scalar = (float)B[0];
c0 = vfma_n_f32(c0, a_low, b_scalar);
A += 2;
B += 1;
}
FLOAT *col_0 = C;
float32x2_t t0 = vld1_f32(col_0);
t0 = vadd_f32(t0, vmul_n_f32(c0, alpha));
vst1_f32(col_0, t0);
}
static inline void kernel_1x1(BLASLONG K, const float16_t *A, const float16_t *B, FLOAT *C, FLOAT alpha) {
FLOAT sum = 0.0f;
for (BLASLONG k = 0; k < K; ++k) {
sum += A[0] * B[0];
A += 1;
B += 1;
}
C[0] += alpha * sum;
}
int CNAME(BLASLONG M, BLASLONG N, BLASLONG K, FLOAT alpha, IFLOAT *A, IFLOAT *B, FLOAT *C, BLASLONG ldc) {
float16_t *A_base = (float16_t *)A;
float16_t *B_base = (float16_t *)B;
FLOAT *Ccol = C;
BLASLONG m_rem1, m_rem2, m_rem3, m_rem4;
while (N >= 8) {
const float16_t *Aptr = A_base;
const float16_t *Bptr = B_base;
FLOAT *Crow = Ccol;
m_rem1 = M;
while (m_rem1 >= 8) {
kernel_8x8(K, Aptr, Bptr, Crow, ldc, alpha);
Aptr += K * 8;
Crow += 8;
m_rem1 -= 8;
}
if (m_rem1 >= 4) {
kernel_4x8(K, Aptr, Bptr, Crow, ldc, alpha);
Aptr += K * 4;
Crow += 4;
m_rem1 -= 4;
}
if (m_rem1 >= 2) {
kernel_2x8(K, Aptr, Bptr, Crow, ldc, alpha);
Aptr += K * 2;
Crow += 2;
m_rem1 -= 2;
}
if (m_rem1 >= 1) {
kernel_1x8(K, Aptr, Bptr, Crow, ldc, alpha);
}
B_base += K * 8;
Ccol += ldc * 8;
N -= 8;
}
if (N >= 4) {
const float16_t *Aptr = A_base;
const float16_t *Bptr = B_base;
FLOAT *Crow = Ccol;
m_rem2 = M;
while (m_rem2 >= 8) {
kernel_8x4(K, Aptr, Bptr, Crow, ldc, alpha);
Aptr += K * 8;
Crow += 8;
m_rem2 -= 8;
}
if (m_rem2 >= 4) {
kernel_4x4(K, Aptr, Bptr, Crow, ldc, alpha);
Aptr += K * 4;
Crow += 4;
m_rem2 -= 4;
}
if (m_rem2 >= 2) {
kernel_2x4(K, Aptr, Bptr, Crow, ldc, alpha);
Aptr += K * 2;
Crow += 2;
m_rem2 -= 2;
}
if (m_rem2 >= 1) {
kernel_1x4(K, Aptr, Bptr, Crow, ldc, alpha);
}
B_base += K * 4;
Ccol += ldc * 4;
N -= 4;
}
if (N >= 2) {
const float16_t *Aptr = A_base;
const float16_t *Bptr = B_base;
FLOAT *Crow = Ccol;
m_rem3 = M;
while (m_rem3 >= 8) {
kernel_8x2(K, Aptr, Bptr, Crow, ldc, alpha);
Aptr += K * 8;
Crow += 8;
m_rem3 -= 8;
}
if (m_rem3 >= 4) {
kernel_4x2(K, Aptr, Bptr, Crow, ldc, alpha);
Aptr += K * 4;
Crow += 4;
m_rem3 -= 4;
}
if (m_rem3 >= 2) {
kernel_2x2(K, Aptr, Bptr, Crow, ldc, alpha);
Aptr += K * 2;
Crow += 2;
m_rem3 -= 2;
}
if (m_rem3 >= 1) {
kernel_1x2(K, Aptr, Bptr, Crow, ldc, alpha);
}
B_base += K * 2;
Ccol += ldc * 2;
N -= 2;
}
if (N >= 1) {
const float16_t *Aptr = A_base;
const float16_t *Bptr = B_base;
FLOAT *Crow = Ccol;
m_rem4 = M;
while (m_rem4 >= 8) {
kernel_8x1(K, Aptr, Bptr, Crow, alpha);
Aptr += K * 8;
Crow += 8;
m_rem4 -= 8;
}
if (m_rem4 >= 4) {
kernel_4x1(K, Aptr, Bptr, Crow, alpha);
Aptr += K * 4;
Crow += 4;
m_rem4 -= 4;
}
if (m_rem4 >= 2) {
kernel_2x1(K, Aptr, Bptr, Crow, alpha);
Aptr += K * 2;
Crow += 2;
m_rem4 -= 2;
}
if (m_rem4 >= 1) {
kernel_1x1(K, Aptr, Bptr, Crow, alpha);
}
}
return 0;
}
+258
View File
@@ -0,0 +1,258 @@
/***************************************************************************
* Copyright (c) 2026, 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 <arm_neon.h>
#include "common.h"
static inline void transpose8x8(float16x8_t *rows, float16x8_t *cols) {
float64x2_t b0 = vtrn1q_f64(vreinterpretq_f64_f16(rows[0]), vreinterpretq_f64_f16(rows[4]));
float64x2_t b1 = vtrn1q_f64(vreinterpretq_f64_f16(rows[1]), vreinterpretq_f64_f16(rows[5]));
float64x2_t b2 = vtrn1q_f64(vreinterpretq_f64_f16(rows[2]), vreinterpretq_f64_f16(rows[6]));
float64x2_t b3 = vtrn1q_f64(vreinterpretq_f64_f16(rows[3]), vreinterpretq_f64_f16(rows[7]));
float64x2_t b4 = vtrn2q_f64(vreinterpretq_f64_f16(rows[0]), vreinterpretq_f64_f16(rows[4]));
float64x2_t b5 = vtrn2q_f64(vreinterpretq_f64_f16(rows[1]), vreinterpretq_f64_f16(rows[5]));
float64x2_t b6 = vtrn2q_f64(vreinterpretq_f64_f16(rows[2]), vreinterpretq_f64_f16(rows[6]));
float64x2_t b7 = vtrn2q_f64(vreinterpretq_f64_f16(rows[3]), vreinterpretq_f64_f16(rows[7]));
float32x4_t c0 = vtrn1q_f32(vreinterpretq_f32_f64(b0), vreinterpretq_f32_f64(b2));
float32x4_t c1 = vtrn1q_f32(vreinterpretq_f32_f64(b1), vreinterpretq_f32_f64(b3));
float32x4_t c2 = vtrn2q_f32(vreinterpretq_f32_f64(b0), vreinterpretq_f32_f64(b2));
float32x4_t c3 = vtrn2q_f32(vreinterpretq_f32_f64(b1), vreinterpretq_f32_f64(b3));
float32x4_t c4 = vtrn1q_f32(vreinterpretq_f32_f64(b4), vreinterpretq_f32_f64(b6));
float32x4_t c5 = vtrn1q_f32(vreinterpretq_f32_f64(b5), vreinterpretq_f32_f64(b7));
float32x4_t c6 = vtrn2q_f32(vreinterpretq_f32_f64(b4), vreinterpretq_f32_f64(b6));
float32x4_t c7 = vtrn2q_f32(vreinterpretq_f32_f64(b5), vreinterpretq_f32_f64(b7));
float16x8_t d0 = vtrn1q_f16(vreinterpretq_f16_f32(c0), vreinterpretq_f16_f32(c1));
float16x8_t d1 = vtrn2q_f16(vreinterpretq_f16_f32(c0), vreinterpretq_f16_f32(c1));
float16x8_t d2 = vtrn1q_f16(vreinterpretq_f16_f32(c2), vreinterpretq_f16_f32(c3));
float16x8_t d3 = vtrn2q_f16(vreinterpretq_f16_f32(c2), vreinterpretq_f16_f32(c3));
float16x8_t d4 = vtrn1q_f16(vreinterpretq_f16_f32(c4), vreinterpretq_f16_f32(c5));
float16x8_t d5 = vtrn2q_f16(vreinterpretq_f16_f32(c4), vreinterpretq_f16_f32(c5));
float16x8_t d6 = vtrn1q_f16(vreinterpretq_f16_f32(c6), vreinterpretq_f16_f32(c7));
float16x8_t d7 = vtrn2q_f16(vreinterpretq_f16_f32(c6), vreinterpretq_f16_f32(c7));
cols[0] = d0;
cols[1] = d1;
cols[2] = d2;
cols[3] = d3;
cols[4] = d4;
cols[5] = d5;
cols[6] = d6;
cols[7] = d7;
}
static inline void transpose_4x4(float16x4_t *rows, float16x4_t *cols) {
float16x8_t t0 = vcombine_f16(rows[0], vdup_n_f16(0.0f));
float16x8_t t1 = vcombine_f16(rows[1], vdup_n_f16(0.0f));
float16x8_t t2 = vcombine_f16(rows[2], vdup_n_f16(0.0f));
float16x8_t t3 = vcombine_f16(rows[3], vdup_n_f16(0.0f));
float16x8_t t02 = vzip1q_f16(t0, t2);
float16x8_t t13 = vzip1q_f16(t1, t3);
float16x8x2_t t0123 = vzipq_f16(t02, t13);
cols[0] = vget_low_f16(t0123.val[0]);
cols[1] = vget_high_f16(t0123.val[0]);
cols[2] = vget_low_f16(t0123.val[1]);
cols[3] = vget_high_f16(t0123.val[1]);
}
int CNAME(BLASLONG m, BLASLONG n, IFLOAT *a, BLASLONG lda, IFLOAT *b) {
BLASLONG i, j;
IFLOAT *a_offset = a;
IFLOAT *b_offset = b;
float16x8_t v0, v1, v2, v3, v4, v5, v6, v7;
float16x4_t v8, v9, v10, v11;
BLASLONG n8 = n >> 3;
for (j = 0; j < n8; j++) {
IFLOAT *a0 = a_offset;
IFLOAT *a1 = a0 + lda;
IFLOAT *a2 = a1 + lda;
IFLOAT *a3 = a2 + lda;
IFLOAT *a4 = a3 + lda;
IFLOAT *a5 = a4 + lda;
IFLOAT *a6 = a5 + lda;
IFLOAT *a7 = a6 + lda;
a_offset += 8 * lda;
BLASLONG m8 = m >> 3;
for (i = 0; i < m8; i++) {
v0 = vld1q_f16((float16_t *)a0);
v1 = vld1q_f16((float16_t *)a1);
v2 = vld1q_f16((float16_t *)a2);
v3 = vld1q_f16((float16_t *)a3);
v4 = vld1q_f16((float16_t *)a4);
v5 = vld1q_f16((float16_t *)a5);
v6 = vld1q_f16((float16_t *)a6);
v7 = vld1q_f16((float16_t *)a7);
float16x8_t rows[8] = {v0, v1, v2, v3, v4, v5, v6, v7};
float16x8_t cols[8];
transpose8x8(rows, cols);
vst1q_f16((float16_t *)b_offset, cols[0]);
vst1q_f16((float16_t *)b_offset + 8, cols[1]);
vst1q_f16((float16_t *)b_offset + 16, cols[2]);
vst1q_f16((float16_t *)b_offset + 24, cols[3]);
vst1q_f16((float16_t *)b_offset + 32, cols[4]);
vst1q_f16((float16_t *)b_offset + 40, cols[5]);
vst1q_f16((float16_t *)b_offset + 48, cols[6]);
vst1q_f16((float16_t *)b_offset + 56, cols[7]);
a0 += 8;
a1 += 8;
a2 += 8;
a3 += 8;
a4 += 8;
a5 += 8;
a6 += 8;
a7 += 8;
b_offset += 64;
}
BLASLONG i = (m & 7);
if (i > 0) {
for (BLASLONG k = 0; k < i; k++) {
*(b_offset + 0) = *a0;
*(b_offset + 1) = *a1;
*(b_offset + 2) = *a2;
*(b_offset + 3) = *a3;
*(b_offset + 4) = *a4;
*(b_offset + 5) = *a5;
*(b_offset + 6) = *a6;
*(b_offset + 7) = *a7;
a0++;
a1++;
a2++;
a3++;
a4++;
a5++;
a6++;
a7++;
b_offset += 8;
}
}
}
if (n & 4) {
IFLOAT *a0 = a_offset;
IFLOAT *a1 = a0 + lda;
IFLOAT *a2 = a1 + lda;
IFLOAT *a3 = a2 + lda;
a_offset += 4 * lda;
BLASLONG m4 = m >> 2;
for (i = 0; i < m4; i++) {
v8 = vld1_f16((float16_t *)a0);
v9 = vld1_f16((float16_t *)a1);
v10 = vld1_f16((float16_t *)a2);
v11 = vld1_f16((float16_t *)a3);
float16x4_t rows[4] = {v8, v9, v10, v11};
float16x4_t cols[4];
transpose_4x4(rows, cols);
vst1_f16((float16_t *)b_offset, cols[0]);
vst1_f16((float16_t *)b_offset + 4, cols[1]);
vst1_f16((float16_t *)b_offset + 8, cols[2]);
vst1_f16((float16_t *)b_offset + 12, cols[3]);
a0 += 4;
a1 += 4;
a2 += 4;
a3 += 4;
b_offset += 16;
}
BLASLONG i = (m & 3);
if (i > 0) {
for (BLASLONG k = 0; k < i; k++) {
*(b_offset + 0) = *a0;
*(b_offset + 1) = *a1;
*(b_offset + 2) = *a2;
*(b_offset + 3) = *a3;
a0++;
a1++;
a2++;
a3++;
b_offset += 4;
}
}
}
if (n & 2) {
IFLOAT *a0 = a_offset;
IFLOAT *a1 = a0 + lda;
a_offset += 2 * lda;
BLASLONG m2 = m >> 1;
for (i = 0; i < m2; i++) {
v8 = vld1_f16((float16_t *)a0);
v9 = vld1_f16((float16_t *)a1);
float16_t col0[2] = {vget_lane_f16(v8, 0), vget_lane_f16(v9, 0)};
float16_t col1[2] = {vget_lane_f16(v8, 1), vget_lane_f16(v9, 1)};
b_offset[0] = col0[0];
b_offset[1] = col0[1];
b_offset[2] = col1[0];
b_offset[3] = col1[1];
a0 += 2;
a1 += 2;
b_offset += 4;
}
if (m & 1) {
b_offset[0] = *a0;
b_offset[1] = *a1;
b_offset += 2;
}
}
if (n & 1) {
IFLOAT *a0 = a_offset;
for (i = 0; i < m; i++) {
*b_offset++ = *a0;
a0++;
}
}
return 0;
}
+87
View File
@@ -0,0 +1,87 @@
/***************************************************************************
* Copyright (c) 2026, 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 <arm_sve.h>
#include "common.h"
int CNAME(BLASLONG m, BLASLONG n, IFLOAT *a, BLASLONG lda, IFLOAT *b) {
BLASLONG i, j;
IFLOAT *aoffset, *aoffset1;
IFLOAT *boffset, *boffset1;
IFLOAT *boffset2, *boffset3, *boffset4;
aoffset = a;
boffset = b;
boffset2 = b + m * (n & ~7);
boffset3 = b + m * (n & ~3);
boffset4 = b + m * (n & ~1);
svbool_t pg8 = svwhilelt_b16(0, 8);
svbool_t pg4 = svwhilelt_b16(0, 4);
for (j = 0; j < m; j++) {
aoffset1 = aoffset;
boffset1 = boffset;
aoffset += lda;
boffset += 8;
for (i = 0; i < (n >> 3); i++) {
svfloat16_t v0 = svld1_f16(pg8, (float16_t *)aoffset1);
svst1_f16(pg8, (float16_t *)boffset1, v0);
aoffset1 += 8;
boffset1 += 8 * m;
}
if (n & 4) {
svfloat16_t v0 = svld1_f16(pg4, (float16_t *)aoffset1);
svst1_f16(pg4, (float16_t *)boffset2, v0);
aoffset1 += 4;
boffset2 += 4;
}
if (n & 2) {
boffset3[0] = aoffset1[0];
boffset3[1] = aoffset1[1];
aoffset1 += 2;
boffset3 += 2;
}
if (n & 1) {
boffset4[0] = aoffset1[0];
aoffset1 += 1;
boffset4 += 1;
}
}
return 0;
}
+245
View File
@@ -0,0 +1,245 @@
/***************************************************************************
Copyright (c) 2017, 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 "common.h"
#include <arm_neon.h>
#define N "x0" /* vector length */
#define X "x1" /* "X" vector address */
#define INC_X "x2" /* "X" stride */
#define J "x5" /* loop variable */
#define REG0 "wzr"
#define SUMF "s0"
#define SUMFD "d0"
/******************************************************************************/
#define KERNEL_F1 \
"ldr s1, ["X"] \n" \
"add "X", "X", #4 \n" \
"fadd "SUMF", "SUMF", s1 \n"
#define KERNEL_F64 \
"ldr q16, ["X"] \n" \
"ldr q17, ["X", #16] \n" \
"ldr q18, ["X", #32] \n" \
"ldr q19, ["X", #48] \n" \
"ldp q20, q21, ["X", #64] \n" \
"ldp q22, q23, ["X", #96] \n" \
"ldp q24, q25, ["X", #128] \n" \
"ldp q26, q27, ["X", #160] \n" \
"fadd v16.4s, v16.4s, v17.4s \n" \
"fadd v18.4s, v18.4s, v19.4s \n" \
"ldp q28, q29, ["X", #192] \n" \
"ldp q30, q31, ["X", #224] \n" \
"add "X", "X", #256 \n" \
"fadd v20.4s, v20.4s, v21.4s \n" \
"fadd v22.4s, v22.4s, v23.4s \n" \
"PRFM PLDL1KEEP, ["X", #1024] \n" \
"PRFM PLDL1KEEP, ["X", #1024+64] \n" \
"fadd v24.4s, v24.4s, v25.4s \n" \
"fadd v26.4s, v26.4s, v27.4s \n" \
"fadd v0.4s, v0.4s, v16.4s \n" \
"fadd v1.4s, v1.4s, v18.4s \n" \
"fadd v2.4s, v2.4s, v20.4s \n" \
"fadd v3.4s, v3.4s, v22.4s \n" \
"PRFM PLDL1KEEP, ["X", #1024+128] \n" \
"PRFM PLDL1KEEP, ["X", #1024+192] \n" \
"fadd v28.4s, v28.4s, v29.4s \n" \
"fadd v30.4s, v30.4s, v31.4s \n" \
"fadd v4.4s, v4.4s, v24.4s \n" \
"fadd v5.4s, v5.4s, v26.4s \n" \
"fadd v6.4s, v6.4s, v28.4s \n" \
"fadd v7.4s, v7.4s, v30.4s \n"
#define KERNEL_F64_FINALIZE \
"fadd v0.4s, v0.4s, v1.4s \n" \
"fadd v2.4s, v2.4s, v3.4s \n" \
"fadd v4.4s, v4.4s, v5.4s \n" \
"fadd v6.4s, v6.4s, v7.4s \n" \
"fadd v0.4s, v0.4s, v2.4s \n" \
"fadd v4.4s, v4.4s, v6.4s \n" \
"fadd v0.4s, v0.4s, v4.4s \n" \
"ext v1.16b, v0.16b, v0.16b, #8 \n" \
"fadd v0.2s, v0.2s, v1.2s \n" \
"faddp "SUMF", v0.2s \n"
#define INIT_S \
"lsl "INC_X", "INC_X", #2 \n"
#define KERNEL_S1 \
"ldr s1, ["X"] \n" \
"add "X", "X", "INC_X" \n" \
"fadd "SUMF", "SUMF", s1 \n"
#if defined(SMP)
extern int blas_level1_thread_with_return_value(int mode, BLASLONG m, BLASLONG n,
BLASLONG k, void *alpha, void *a, BLASLONG lda, void *b, BLASLONG ldb,
void *c, BLASLONG ldc, int (*function)(), int nthreads);
#endif
static FLOAT ssum_compute(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
FLOAT ssum = 0.0 ;
if ( n < 0 ) return(ssum);
__asm__ __volatile__ (
" mov "N", %[N_] \n"
" mov "X", %[X_] \n"
" mov "INC_X", %[INCX_] \n"
" fmov "SUMF", "REG0" \n"
" fmov s1, "REG0" \n"
" fmov s2, "REG0" \n"
" fmov s3, "REG0" \n"
" fmov s4, "REG0" \n"
" fmov s5, "REG0" \n"
" fmov s6, "REG0" \n"
" fmov s7, "REG0" \n"
" cmp "N", xzr \n"
" ble 9f //ssum_kernel_L999 \n"
" cmp "INC_X", xzr \n"
" ble 9f //ssum_kernel_L999 \n"
" cmp "INC_X", #1 \n"
" bne 5f //ssum_kernel_S_BEGIN \n"
"1: //sum_kernel_F_BEGIN: \n"
" asr "J", "N", #6 \n"
" cmp "J", xzr \n"
" beq 3f //ssum_kernel_F1 \n"
#if !(defined(__clang__) && defined(OS_WINDOWS))
".align 5 \n"
#endif
"2: //ssum_kernel_F64: \n"
" "KERNEL_F64" \n"
" subs "J", "J", #1 \n"
" bne 2b //ssum_kernel_F64 \n"
" "KERNEL_F64_FINALIZE" \n"
"3: //ssum_kernel_F1: \n"
" ands "J", "N", #63 \n"
" ble 9f //ssum_kernel_L999 \n"
"4: //ssum_kernel_F10: \n"
" "KERNEL_F1" \n"
" subs "J", "J", #1 \n"
" bne 4b //ssum_kernel_F10 \n"
" b 9f //ssum_kernel_L999 \n"
"5: //ssum_kernel_S_BEGIN: \n"
" "INIT_S" \n"
" asr "J", "N", #2 \n"
" cmp "J", xzr \n"
" ble 7f //ssum_kernel_S1 \n"
"6: //ssum_kernel_S4: \n"
" "KERNEL_S1" \n"
" "KERNEL_S1" \n"
" "KERNEL_S1" \n"
" "KERNEL_S1" \n"
" subs "J", "J", #1 \n"
" bne 6b //ssum_kernel_S4 \n"
"7: //ssum_kernel_S1: \n"
" ands "J", "N", #3 \n"
" ble 9f //ssum_kernel_L999 \n"
"8: //ssum_kernel_S10: \n"
" "KERNEL_S1" \n"
" subs "J", "J", #1 \n"
" bne 8b //ssum_kernel_S10 \n"
"9: //ssum_kernel_L999: \n"
" fmov %[SSUM_], "SUMFD" \n"
: [SSUM_] "=r" (ssum) //%0
: [N_] "r" (n), //%1
[X_] "r" (x), //%2
[INCX_] "r" (inc_x) //%3
: "cc",
"memory",
"x0", "x1", "x2", "x3", "x4", "x5",
"d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7"
);
return ssum;
}
#if defined(SMP)
static int ssum_thread_function(BLASLONG n, BLASLONG dummy0,
BLASLONG dummy1, FLOAT dummy2, FLOAT *x, BLASLONG inc_x, FLOAT *y,
BLASLONG inc_y, FLOAT *result, BLASLONG dummy3)
{
*result = ssum_compute(n, x, inc_x);
return 0;
}
#endif
FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
#if defined(SMP)
int nthreads;
FLOAT dummy_alpha;
#endif
FLOAT ssum = 0.0;
#if defined(SMP)
if (inc_x == 0 || n <= 10000)
nthreads = 1;
else
nthreads = num_cpu_avail(1);
if (nthreads == 1) {
ssum = ssum_compute(n, x, inc_x);
} else {
int mode, i;
char result[MAX_CPU_NUMBER * sizeof(double) * 2];
FLOAT *ptr;
mode = BLAS_SINGLE;
blas_level1_thread_with_return_value(mode, n, 0, 0, &dummy_alpha,
x, inc_x, NULL, 0, result, 0,
( void *)ssum_thread_function, nthreads);
ptr = (FLOAT *)result;
for (i = 0; i < nthreads; i++) {
ssum = ssum + (*ptr);
ptr = (FLOAT *)(((char *)ptr) + sizeof(double) * 2);
}
}
#else
ssum = ssum_compute(n, x, inc_x);
#endif
return ssum;
}
+2 -1
View File
@@ -243,7 +243,8 @@ static void zdot_compute(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLON
" asr "J", "N", #"N_DIV_SHIFT" \n"
" cmp "J", xzr \n"
" beq 3f //dot_kernel_F1 \n"
#ifndef _MSC_VER
/* https://github.com/llvm/llvm-project/issues/149547 */
#if !(defined(__clang__) && defined(OS_WINDOWS))
" .align 5 \n"
#endif
"2: //dot_kernel_F: \n"
+3
View File
@@ -136,7 +136,10 @@ static FLOAT zasum_compute(BLASLONG n, FLOAT *x, BLASLONG inc_x)
" cmp "J", xzr \n"
" beq 3f //asum_kernel_F1 \n"
/* https://github.com/llvm/llvm-project/issues/149547 */
#if !(defined(__clang__) && defined(OS_WINDOWS))
".align 5 \n"
#endif
"2: //asum_kernel_F16: \n"
" "KERNEL_F16" \n"
" subs "J", "J", #1 \n"
+88 -11
View File
@@ -47,11 +47,46 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y)
if ( (inc_x == 1) && (inc_y == 1) )
{
#if V_SIMD && !defined(DSDOT)
const int vstep = v_nlanes_f32;
const int unrollx4 = n & (-vstep * 4);
const int unrollx = n & -vstep;
v_f32 vsum0 = v_zero_f32();
#if defined(DOUBLE) && V_SIMD && V_SIMD_F64 && !defined(DSDOT)
const int vstep = v_nlanes_f64;
const int unrollx4 = n & (-vstep * 4);
const int unrollx = n & -vstep;
v_f64 vsum0 = v_zero_f64();
v_f64 vsum1 = v_zero_f64();
v_f64 vsum2 = v_zero_f64();
v_f64 vsum3 = v_zero_f64();
while(i < unrollx4)
{
vsum0 = v_muladd_f64(
v_loadu_f64(x + i), v_loadu_f64(y + i), vsum0
);
vsum1 = v_muladd_f64(
v_loadu_f64(x + i + vstep), v_loadu_f64(y + i + vstep), vsum1
);
vsum2 = v_muladd_f64(
v_loadu_f64(x + i + vstep*2), v_loadu_f64(y + i + vstep*2), vsum2
);
vsum3 = v_muladd_f64(
v_loadu_f64(x + i + vstep*3), v_loadu_f64(y + i + vstep*3), vsum3
);
i += vstep*4;
}
vsum0 = v_add_f64(
v_add_f64(vsum0, vsum1), v_add_f64(vsum2 , vsum3)
);
while(i < unrollx)
{
vsum0 = v_muladd_f64(
v_loadu_f64(x + i), v_loadu_f64(y + i), vsum0
);
i += vstep;
}
dot = v_sum_f64(vsum0);
#elif V_SIMD && !defined(DSDOT)
const int vstep = v_nlanes_f32;
const int unrollx4 = n & (-vstep * 4);
const int unrollx = n & -vstep;
v_f32 vsum0 = v_zero_f32();
v_f32 vsum1 = v_zero_f32();
v_f32 vsum2 = v_zero_f32();
v_f32 vsum3 = v_zero_f32();
@@ -82,10 +117,54 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y)
i += vstep;
}
dot = v_sum_f32(vsum0);
#elif defined(DSDOT)
int n1 = n & -4;
for (; i < n1; i += 4)
{
#elif defined(DSDOT) && defined(ARCH_WASM) && V_SIMD && V_SIMD_F64
const int vstep = v_nlanes_f32;
const int unrollx4 = n & (-vstep * 4);
const int unrollx = n & -vstep;
v_f64 vsum0_lo = v_zero_f64();
v_f64 vsum0_hi = v_zero_f64();
v_f64 vsum1_lo = v_zero_f64();
v_f64 vsum1_hi = v_zero_f64();
v_f64 vsum2_lo = v_zero_f64();
v_f64 vsum2_hi = v_zero_f64();
v_f64 vsum3_lo = v_zero_f64();
v_f64 vsum3_hi = v_zero_f64();
while(i < unrollx4)
{
v_f32 vx0 = v_loadu_f32(x + i);
v_f32 vy0 = v_loadu_f32(y + i);
v_f32 vx1 = v_loadu_f32(x + i + vstep);
v_f32 vy1 = v_loadu_f32(y + i + vstep);
v_f32 vx2 = v_loadu_f32(x + i + vstep*2);
v_f32 vy2 = v_loadu_f32(y + i + vstep*2);
v_f32 vx3 = v_loadu_f32(x + i + vstep*3);
v_f32 vy3 = v_loadu_f32(y + i + vstep*3);
vsum0_lo = v_muladd_f64(v_cvt_f32_f64_lo(vx0), v_cvt_f32_f64_lo(vy0), vsum0_lo);
vsum0_hi = v_muladd_f64(v_cvt_f32_f64_hi(vx0), v_cvt_f32_f64_hi(vy0), vsum0_hi);
vsum1_lo = v_muladd_f64(v_cvt_f32_f64_lo(vx1), v_cvt_f32_f64_lo(vy1), vsum1_lo);
vsum1_hi = v_muladd_f64(v_cvt_f32_f64_hi(vx1), v_cvt_f32_f64_hi(vy1), vsum1_hi);
vsum2_lo = v_muladd_f64(v_cvt_f32_f64_lo(vx2), v_cvt_f32_f64_lo(vy2), vsum2_lo);
vsum2_hi = v_muladd_f64(v_cvt_f32_f64_hi(vx2), v_cvt_f32_f64_hi(vy2), vsum2_hi);
vsum3_lo = v_muladd_f64(v_cvt_f32_f64_lo(vx3), v_cvt_f32_f64_lo(vy3), vsum3_lo);
vsum3_hi = v_muladd_f64(v_cvt_f32_f64_hi(vx3), v_cvt_f32_f64_hi(vy3), vsum3_hi);
i += vstep*4;
}
vsum0_lo = v_add_f64(v_add_f64(vsum0_lo, vsum1_lo), v_add_f64(vsum2_lo, vsum3_lo));
vsum0_hi = v_add_f64(v_add_f64(vsum0_hi, vsum1_hi), v_add_f64(vsum2_hi, vsum3_hi));
while(i < unrollx)
{
v_f32 vx = v_loadu_f32(x + i);
v_f32 vy = v_loadu_f32(y + i);
vsum0_lo = v_muladd_f64(v_cvt_f32_f64_lo(vx), v_cvt_f32_f64_lo(vy), vsum0_lo);
vsum0_hi = v_muladd_f64(v_cvt_f32_f64_hi(vx), v_cvt_f32_f64_hi(vy), vsum0_hi);
i += vstep;
}
dot = v_sum_f64(vsum0_lo) + v_sum_f64(vsum0_hi);
#elif defined(DSDOT)
int n1 = n & -4;
for (; i < n1; i += 4)
{
dot += (double) y[i] * (double) x[i]
+ (double) y[i+1] * (double) x[i+1]
+ (double) y[i+2] * (double) x[i+2]
@@ -133,5 +212,3 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y)
return(dot);
}
+15 -9
View File
@@ -30,6 +30,12 @@
#include "conversion_macros.h"
#ifdef BGEMM
#define C_TO_F32 TO_F32
#else
#define C_TO_F32
#endif
int CNAME(BLASLONG bm,BLASLONG bn,BLASLONG bk,FLOAT alpha,IFLOAT* ba,IFLOAT* bb,FLOAT* C,BLASLONG ldc
#ifdef TRMMKERNEL
,BLASLONG offset
@@ -108,13 +114,13 @@ int CNAME(BLASLONG bm,BLASLONG bn,BLASLONG bk,FLOAT alpha,IFLOAT* ba,IFLOAT* bb,
ptrbb = ptrbb+2;
}
res0 = res0*ALPHA;
C0[0] = TO_OUTPUT(TO_F32(C0[0])+res0);
C0[0] = TO_OUTPUT(C_TO_F32(C0[0])+res0);
res1 = res1*ALPHA;
C0[1] = TO_OUTPUT(TO_F32(C0[1])+res1);
C0[1] = TO_OUTPUT(C_TO_F32(C0[1])+res1);
res2 = res2*ALPHA;
C1[0] = TO_OUTPUT(TO_F32(C1[0])+res2);
C1[0] = TO_OUTPUT(C_TO_F32(C1[0])+res2);
res3 = res3*ALPHA;
C1[1] = TO_OUTPUT(TO_F32(C1[1])+res3);
C1[1] = TO_OUTPUT(C_TO_F32(C1[1])+res3);
C0 = C0+2;
C1 = C1+2;
}
@@ -134,9 +140,9 @@ int CNAME(BLASLONG bm,BLASLONG bn,BLASLONG bk,FLOAT alpha,IFLOAT* ba,IFLOAT* bb,
ptrbb = ptrbb+2;
}
res0 = res0*ALPHA;
C0[0] = TO_OUTPUT(TO_F32(C0[0])+res0);
C0[0] = TO_OUTPUT(C_TO_F32(C0[0])+res0);
res1 = res1*ALPHA;
C1[0] = TO_OUTPUT(TO_F32(C1[0])+res1);
C1[0] = TO_OUTPUT(C_TO_F32(C1[0])+res1);
C0 = C0+1;
C1 = C1+1;
}
@@ -165,9 +171,9 @@ int CNAME(BLASLONG bm,BLASLONG bn,BLASLONG bk,FLOAT alpha,IFLOAT* ba,IFLOAT* bb,
ptrbb = ptrbb+1;
}
res0 = res0*ALPHA;
C0[0] = TO_OUTPUT(TO_F32(C0[0])+res0);
C0[0] = TO_OUTPUT(C_TO_F32(C0[0])+res0);
res1 = res1*ALPHA;
C0[1] = TO_OUTPUT(TO_F32(C0[1])+res1);
C0[1] = TO_OUTPUT(C_TO_F32(C0[1])+res1);
C0 = C0+2;
}
for (i=0; i<(bm&1); i+=1)
@@ -183,7 +189,7 @@ int CNAME(BLASLONG bm,BLASLONG bn,BLASLONG bk,FLOAT alpha,IFLOAT* ba,IFLOAT* bb,
ptrbb = ptrbb+1;
}
res0 = res0*ALPHA;
C0[0] = TO_OUTPUT(TO_F32(C0[0])+res0);
C0[0] = TO_OUTPUT(C_TO_F32(C0[0])+res0);
C0 = C0+1;
}
k = (bk<<0);
+4 -4
View File
@@ -1,17 +1,17 @@
ifndef SNRM2KERNEL
SNRM2KERNEL = nrm2.c
SNRM2KERNEL = ../arm/nrm2.c
endif
ifndef DNRM2KERNEL
DNRM2KERNEL = nrm2.c
DNRM2KERNEL = ../arm/nrm2.c
endif
ifndef CNRM2KERNEL
CNRM2KERNEL = znrm2.c
CNRM2KERNEL = ../arm/znrm2.c
endif
ifndef ZNRM2KERNEL
ZNRM2KERNEL = znrm2.c
ZNRM2KERNEL = ../arm/znrm2.c
endif
ifndef SCABS_KERNEL
+88 -91
View File
@@ -1,50 +1,13 @@
SAMAXKERNEL = ../mips/amax.c
DAMAXKERNEL = ../mips/amax.c
CAMAXKERNEL = ../mips/zamax.c
ZAMAXKERNEL = ../mips/zamax.c
SAMINKERNEL = ../mips/amin.c
DAMINKERNEL = ../mips/amin.c
CAMINKERNEL = ../mips/zamin.c
ZAMINKERNEL = ../mips/zamin.c
SMAXKERNEL = ../mips/max.c
DMAXKERNEL = ../mips/max.c
SMINKERNEL = ../mips/min.c
DMINKERNEL = ../mips/min.c
ISAMAXKERNEL = ../mips/iamax.c
IDAMAXKERNEL = ../mips/iamax.c
ICAMAXKERNEL = ../mips/izamax.c
IZAMAXKERNEL = ../mips/izamax.c
ISAMINKERNEL = ../mips/iamin.c
IDAMINKERNEL = ../mips/iamin.c
ICAMINKERNEL = ../mips/izamin.c
IZAMINKERNEL = ../mips/izamin.c
ISMAXKERNEL = ../mips/imax.c
IDMAXKERNEL = ../mips/imax.c
ISMINKERNEL = ../mips/imin.c
IDMINKERNEL = ../mips/imin.c
SSUMKERNEL = ../mips/sum.c
DSUMKERNEL = ../mips/sum.c
CSUMKERNEL = ../mips/zsum.c
ZSUMKERNEL = ../mips/zsum.c
ifndef NO_MSA
SASUMKERNEL = ../mips/sasum_msa.c
DASUMKERNEL = ../mips/dasum_msa.c
CASUMKERNEL = ../mips/casum_msa.c
ZASUMKERNEL = ../mips/zasum_msa.c
else
SASUMKERNEL = ../mips/asum.c
DASUMKERNEL = ../mips/asum.c
CASUMKERNEL = ../mips/zasum.c
ZASUMKERNEL = ../mips/zasum.c
SASUMKERNEL = ../arm/asum.c
DASUMKERNEL = ../arm/asum.c
CASUMKERNEL = ../arm/zasum.c
ZASUMKERNEL = ../arm/zasum.c
endif
ifndef NO_MSA
@@ -53,10 +16,10 @@ DAXPYKERNEL = ../mips/daxpy_msa.c
CAXPYKERNEL = ../mips/caxpy_msa.c
ZAXPYKERNEL = ../mips/zaxpy_msa.c
else
SAXPYKERNEL = ../mips/axpy.c
DAXPYKERNEL = ../mips/axpy.c
CAXPYKERNEL = ../mips/zaxpy.c
ZAXPYKERNEL = ../mips/zaxpy.c
SAXPYKERNEL = ../arm/axpy.c
DAXPYKERNEL = ../arm/axpy.c
CAXPYKERNEL = ../arm/zaxpy.c
ZAXPYKERNEL = ../arm/zaxpy.c
endif
ifndef NO_MSA
@@ -65,10 +28,10 @@ DCOPYKERNEL = ../mips/dcopy_msa.c
CCOPYKERNEL = ../mips/ccopy_msa.c
ZCOPYKERNEL = ../mips/zcopy_msa.c
else
SCOPYKERNEL = ../mips/copy.c
DCOPYKERNEL = ../mips/copy.c
CCOPYKERNEL = ../mips/zcopy.c
ZCOPYKERNEL = ../mips/zcopy.c
SCOPYKERNEL = ../arm/copy.c
DCOPYKERNEL = ../arm/copy.c
CCOPYKERNEL = ../arm/zcopy.c
ZCOPYKERNEL = ../arm/zcopy.c
endif
ifndef NO_MSA
@@ -77,16 +40,16 @@ DDOTKERNEL = ../mips/ddot_msa.c
CDOTKERNEL = ../mips/cdot_msa.c
ZDOTKERNEL = ../mips/zdot_msa.c
else
SDOTKERNEL = ../mips/dot.c
DDOTKERNEL = ../mips/dot.c
CDOTKERNEL = ../mips/zdot.c
ZDOTKERNEL = ../mips/zdot.c
SDOTKERNEL = ../arm/dot.c
DDOTKERNEL = ../arm/dot.c
CDOTKERNEL = ../arm/zdot.c
ZDOTKERNEL = ../arm/zdot.c
endif
SNRM2KERNEL = ../mips/nrm2.c
DNRM2KERNEL = ../mips/nrm2.c
CNRM2KERNEL = ../mips/znrm2.c
ZNRM2KERNEL = ../mips/znrm2.c
SNRM2KERNEL = ../arm/nrm2.c
DNRM2KERNEL = ../arm/nrm2.c
CNRM2KERNEL = ../arm/znrm2.c
ZNRM2KERNEL = ../arm/znrm2.c
ifndef NO_MSA
SROTKERNEL = ../mips/srot_msa.c
@@ -94,10 +57,10 @@ DROTKERNEL = ../mips/drot_msa.c
CROTKERNEL = ../mips/crot_msa.c
ZROTKERNEL = ../mips/zrot_msa.c
else
SROTKERNEL = ../mips/rot.c
DROTKERNEL = ../mips/rot.c
CROTKERNEL = ../mips/zrot.c
ZROTKERNEL = ../mips/zrot.c
SROTKERNEL = ../arm/rot.c
DROTKERNEL = ../arm/rot.c
CROTKERNEL = ../arm/zrot.c
ZROTKERNEL = ../arm/zrot.c
endif
ifndef NO_MSA
@@ -105,13 +68,13 @@ SSCALKERNEL = ../mips/sscal_msa.c
DSCALKERNEL = ../mips/dscal_msa.c
#CSCALKERNEL = ../mips/cscal_msa.c
#ZSCALKERNEL = ../mips/zscal_msa.c
CSCALKERNEL = ../mips/zscal.c
ZSCALKERNEL = ../mips/zscal.c
CSCALKERNEL = ../arm/zscal.c
ZSCALKERNEL = ../arm/zscal.c
else
SSCALKERNEL = ../mips/scal.c
DSCALKERNEL = ../mips/scal.c
CSCALKERNEL = ../mips/zscal.c
ZSCALKERNEL = ../mips/zscal.c
SSCALKERNEL = ../arm/scal.c
DSCALKERNEL = ../arm/scal.c
CSCALKERNEL = ../arm/zscal.c
ZSCALKERNEL = ../arm/zscal.c
endif
ifndef NO_MSA
@@ -120,10 +83,10 @@ DSWAPKERNEL = ../mips/dswap_msa.c
CSWAPKERNEL = ../mips/cswap_msa.c
ZSWAPKERNEL = ../mips/zswap_msa.c
else
SSWAPKERNEL = ../mips/swap.c
DSWAPKERNEL = ../mips/swap.c
CSWAPKERNEL = ../mips/zswap.c
ZSWAPKERNEL = ../mips/zswap.c
SSWAPKERNEL = ../arm/swap.c
DSWAPKERNEL = ../arm/swap.c
CSWAPKERNEL = ../arm/zswap.c
ZSWAPKERNEL = ../arm/zswap.c
endif
ifndef NO_MSA
@@ -132,10 +95,10 @@ DGEMVNKERNEL = ../mips/dgemv_n_msa.c
CGEMVNKERNEL = ../mips/cgemv_n_msa.c
ZGEMVNKERNEL = ../mips/zgemv_n_msa.c
else
SGEMVNKERNEL = ../mips/gemv_n.c
DGEMVNKERNEL = ../mips/gemv_n.c
CGEMVNKERNEL = ../mips/zgemv_n.c
ZGEMVNKERNEL = ../mips/zgemv_n.c
SGEMVNKERNEL = ../arm/gemv_n.c
DGEMVNKERNEL = ../arm/gemv_n.c
CGEMVNKERNEL = ../arm/zgemv_n.c
ZGEMVNKERNEL = ../arm/zgemv_n.c
endif
ifndef NO_MSA
@@ -144,25 +107,24 @@ DGEMVTKERNEL = ../mips/dgemv_t_msa.c
CGEMVTKERNEL = ../mips/cgemv_t_msa.c
ZGEMVTKERNEL = ../mips/zgemv_t_msa.c
else
SGEMVTKERNEL = ../mips/gemv_t.c
DGEMVTKERNEL = ../mips/gemv_t.c
CGEMVTKERNEL = ../mips/zgemv_t.c
ZGEMVTKERNEL = ../mips/zgemv_t.c
SGEMVTKERNEL = ../arm/gemv_t.c
DGEMVTKERNEL = ../arm/gemv_t.c
CGEMVTKERNEL = ../arm/zgemv_t.c
ZGEMVTKERNEL = ../arm/zgemv_t.c
endif
ifndef NO_MSA
SGEMMKERNEL = ../mips/sgemm_kernel_8x8_msa.c
SGEMMONCOPY = ../mips/sgemm_ncopy_8_msa.c
SGEMMOTCOPY = ../mips/sgemm_tcopy_8_msa.c
SGEMMONCOPYOBJ = sgemm_oncopy.o
SGEMMOTCOPYOBJ = sgemm_otcopy.o
else
SGEMMKERNEL = ../generic/gemmkernel_2x2.c
SGEMMONCOPY = ../generic/gemm_ncopy_2.c
SGEMMOTCOPY = ../generic/gemm_tcopy_2.c
endif
SGEMMONCOPYOBJ = sgemm_oncopy.o
SGEMMOTCOPYOBJ = sgemm_otcopy.o
endif
ifndef NO_MSA
DGEMMKERNEL = ../mips/dgemm_kernel_8x4_msa.c
@@ -172,15 +134,14 @@ DGEMMONCOPY = ../mips/dgemm_ncopy_4_msa.c
DGEMMOTCOPY = ../mips/dgemm_tcopy_4_msa.c
DGEMMINCOPYOBJ = dgemm_incopy.o
DGEMMITCOPYOBJ = dgemm_itcopy.o
DGEMMONCOPYOBJ = dgemm_oncopy.o
DGEMMOTCOPYOBJ = dgemm_otcopy.o
else
DGEMMKERNEL = ../generic/gemmkernel_2x2.c
DGEMMONCOPY = ../generic/gemm_ncopy_2.c
DGEMMOTCOPY = ../generic/gemm_tcopy_2.c
endif
DGEMMONCOPYOBJ = dgemm_oncopy.o
DGEMMOTCOPYOBJ = dgemm_otcopy.o
endif
ifndef NO_MSA
CGEMMKERNEL = ../mips/cgemm_kernel_8x4_msa.c
@@ -190,29 +151,27 @@ CGEMMONCOPY = ../mips/cgemm_ncopy_4_msa.c
CGEMMOTCOPY = ../mips/cgemm_tcopy_4_msa.c
CGEMMINCOPYOBJ = cgemm_incopy.o
CGEMMITCOPYOBJ = cgemm_itcopy.o
CGEMMONCOPYOBJ = cgemm_oncopy.o
CGEMMOTCOPYOBJ = cgemm_otcopy.o
else
CGEMMKERNEL = ../generic/zgemmkernel_2x2.c
CGEMMONCOPY = ../generic/zgemm_ncopy_2.c
CGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
endif
CGEMMONCOPYOBJ = cgemm_oncopy.o
CGEMMOTCOPYOBJ = cgemm_otcopy.o
endif
ifndef NO_MSA
ZGEMMKERNEL = ../mips/zgemm_kernel_4x4_msa.c
ZGEMMONCOPY = ../mips/zgemm_ncopy_4_msa.c
ZGEMMOTCOPY = ../mips/zgemm_tcopy_4_msa.c
ZGEMMONCOPYOBJ = zgemm_oncopy.o
ZGEMMOTCOPYOBJ = zgemm_otcopy.o
else
ZGEMMKERNEL = ../generic/zgemmkernel_2x2.c
ZGEMMONCOPY = ../generic/zgemm_ncopy_2.c
ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
endif
ZGEMMONCOPYOBJ = zgemm_oncopy.o
ZGEMMOTCOPYOBJ = zgemm_otcopy.o
endif
ifndef NO_MSA
STRSMKERNEL_LN = ../mips/strsm_kernel_LN_8x8_msa.c
@@ -261,3 +220,41 @@ ZTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
endif
#Pure C for other kernels
SAMAXKERNEL = ../arm/amax.c
DAMAXKERNEL = ../arm/amax.c
CAMAXKERNEL = ../arm/zamax.c
ZAMAXKERNEL = ../arm/zamax.c
SAMINKERNEL = ../arm/amin.c
DAMINKERNEL = ../arm/amin.c
CAMINKERNEL = ../arm/zamin.c
ZAMINKERNEL = ../arm/zamin.c
SMAXKERNEL = ../arm/max.c
DMAXKERNEL = ../arm/max.c
SMINKERNEL = ../arm/min.c
DMINKERNEL = ../arm/min.c
ISAMAXKERNEL = ../arm/iamax.c
IDAMAXKERNEL = ../arm/iamax.c
ICAMAXKERNEL = ../arm/izamax.c
IZAMAXKERNEL = ../arm/izamax.c
ISAMINKERNEL = ../arm/iamin.c
IDAMINKERNEL = ../arm/iamin.c
ICAMINKERNEL = ../arm/izamin.c
IZAMINKERNEL = ../arm/izamin.c
ISMAXKERNEL = ../arm/imax.c
IDMAXKERNEL = ../arm/imax.c
ISMINKERNEL = ../arm/imin.c
IDMINKERNEL = ../arm/imin.c
SSUMKERNEL = ../arm/sum.c
DSUMKERNEL = ../arm/sum.c
CSUMKERNEL = ../arm/zsum.c
ZSUMKERNEL = ../arm/zsum.c
+68 -68
View File
@@ -53,92 +53,92 @@ ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
#Pure C for other kernels
SAMAXKERNEL = ../mips/amax.c
DAMAXKERNEL = ../mips/amax.c
CAMAXKERNEL = ../mips/zamax.c
ZAMAXKERNEL = ../mips/zamax.c
SAMAXKERNEL = ../arm/amax.c
DAMAXKERNEL = ../arm/amax.c
CAMAXKERNEL = ../arm/zamax.c
ZAMAXKERNEL = ../arm/zamax.c
SAMINKERNEL = ../mips/amin.c
DAMINKERNEL = ../mips/amin.c
CAMINKERNEL = ../mips/zamin.c
ZAMINKERNEL = ../mips/zamin.c
SAMINKERNEL = ../arm/amin.c
DAMINKERNEL = ../arm/amin.c
CAMINKERNEL = ../arm/zamin.c
ZAMINKERNEL = ../arm/zamin.c
SMAXKERNEL = ../mips/max.c
DMAXKERNEL = ../mips/max.c
SMAXKERNEL = ../arm/max.c
DMAXKERNEL = ../arm/max.c
SMINKERNEL = ../mips/min.c
DMINKERNEL = ../mips/min.c
SMINKERNEL = ../arm/min.c
DMINKERNEL = ../arm/min.c
ISAMAXKERNEL = ../mips/iamax.c
IDAMAXKERNEL = ../mips/iamax.c
ICAMAXKERNEL = ../mips/izamax.c
IZAMAXKERNEL = ../mips/izamax.c
ISAMAXKERNEL = ../arm/iamax.c
IDAMAXKERNEL = ../arm/iamax.c
ICAMAXKERNEL = ../arm/izamax.c
IZAMAXKERNEL = ../arm/izamax.c
ISAMINKERNEL = ../mips/iamin.c
IDAMINKERNEL = ../mips/iamin.c
ICAMINKERNEL = ../mips/izamin.c
IZAMINKERNEL = ../mips/izamin.c
ISAMINKERNEL = ../arm/iamin.c
IDAMINKERNEL = ../arm/iamin.c
ICAMINKERNEL = ../arm/izamin.c
IZAMINKERNEL = ../arm/izamin.c
ISMAXKERNEL = ../mips/imax.c
IDMAXKERNEL = ../mips/imax.c
ISMAXKERNEL = ../arm/imax.c
IDMAXKERNEL = ../arm/imax.c
ISMINKERNEL = ../mips/imin.c
IDMINKERNEL = ../mips/imin.c
ISMINKERNEL = ../arm/imin.c
IDMINKERNEL = ../arm/imin.c
SASUMKERNEL = ../mips/asum.c
DASUMKERNEL = ../mips/asum.c
CASUMKERNEL = ../mips/zasum.c
ZASUMKERNEL = ../mips/zasum.c
SASUMKERNEL = ../arm/asum.c
DASUMKERNEL = ../arm/asum.c
CASUMKERNEL = ../arm/zasum.c
ZASUMKERNEL = ../arm/zasum.c
SSUMKERNEL = ../mips/sum.c
DSUMKERNEL = ../mips/sum.c
CSUMKERNEL = ../mips/zsum.c
ZSUMKERNEL = ../mips/zsum.c
SSUMKERNEL = ../arm/sum.c
DSUMKERNEL = ../arm/sum.c
CSUMKERNEL = ../arm/zsum.c
ZSUMKERNEL = ../arm/zsum.c
SAXPYKERNEL = ../mips/axpy.c
DAXPYKERNEL = ../mips/axpy.c
CAXPYKERNEL = ../mips/zaxpy.c
ZAXPYKERNEL = ../mips/zaxpy.c
SAXPYKERNEL = ../arm/axpy.c
DAXPYKERNEL = ../arm/axpy.c
CAXPYKERNEL = ../arm/zaxpy.c
ZAXPYKERNEL = ../arm/zaxpy.c
SCOPYKERNEL = ../mips/copy.c
DCOPYKERNEL = ../mips/copy.c
CCOPYKERNEL = ../mips/zcopy.c
ZCOPYKERNEL = ../mips/zcopy.c
SCOPYKERNEL = ../arm/copy.c
DCOPYKERNEL = ../arm/copy.c
CCOPYKERNEL = ../arm/zcopy.c
ZCOPYKERNEL = ../arm/zcopy.c
SDOTKERNEL = ../mips/dot.c
DDOTKERNEL = ../mips/dot.c
CDOTKERNEL = ../mips/zdot.c
ZDOTKERNEL = ../mips/zdot.c
SDOTKERNEL = ../arm/dot.c
DDOTKERNEL = ../arm/dot.c
CDOTKERNEL = ../arm/zdot.c
ZDOTKERNEL = ../arm/zdot.c
SNRM2KERNEL = ../mips/nrm2.c
DNRM2KERNEL = ../mips/nrm2.c
CNRM2KERNEL = ../mips/znrm2.c
ZNRM2KERNEL = ../mips/znrm2.c
SNRM2KERNEL = ../arm/nrm2.c
DNRM2KERNEL = ../arm/nrm2.c
CNRM2KERNEL = ../arm/znrm2.c
ZNRM2KERNEL = ../arm/znrm2.c
SROTKERNEL = ../mips/rot.c
DROTKERNEL = ../mips/rot.c
CROTKERNEL = ../mips/zrot.c
ZROTKERNEL = ../mips/zrot.c
SROTKERNEL = ../arm/rot.c
DROTKERNEL = ../arm/rot.c
CROTKERNEL = ../arm/zrot.c
ZROTKERNEL = ../arm/zrot.c
SSCALKERNEL = ../mips/scal.c
DSCALKERNEL = ../mips/scal.c
CSCALKERNEL = ../mips/zscal.c
ZSCALKERNEL = ../mips/zscal.c
SSCALKERNEL = ../arm/scal.c
DSCALKERNEL = ../arm/scal.c
CSCALKERNEL = ../arm/zscal.c
ZSCALKERNEL = ../arm/zscal.c
SSWAPKERNEL = ../mips/swap.c
DSWAPKERNEL = ../mips/swap.c
CSWAPKERNEL = ../mips/zswap.c
ZSWAPKERNEL = ../mips/zswap.c
SSWAPKERNEL = ../arm/swap.c
DSWAPKERNEL = ../arm/swap.c
CSWAPKERNEL = ../arm/zswap.c
ZSWAPKERNEL = ../arm/zswap.c
SGEMVNKERNEL = ../mips/gemv_n.c
DGEMVNKERNEL = ../mips/gemv_n.c
CGEMVNKERNEL = ../mips/zgemv_n.c
ZGEMVNKERNEL = ../mips/zgemv_n.c
SGEMVNKERNEL = ../arm/gemv_n.c
DGEMVNKERNEL = ../arm/gemv_n.c
CGEMVNKERNEL = ../arm/zgemv_n.c
ZGEMVNKERNEL = ../arm/zgemv_n.c
SGEMVTKERNEL = ../mips/gemv_t.c
DGEMVTKERNEL = ../mips/gemv_t.c
CGEMVTKERNEL = ../mips/zgemv_t.c
ZGEMVTKERNEL = ../mips/zgemv_t.c
SGEMVTKERNEL = ../arm/gemv_t.c
DGEMVTKERNEL = ../arm/gemv_t.c
CGEMVTKERNEL = ../arm/zgemv_t.c
ZGEMVTKERNEL = ../arm/zgemv_t.c
SSYMV_U_KERNEL = ../generic/symv_k.c
SSYMV_L_KERNEL = ../generic/symv_k.c
-66
View File
@@ -1,66 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
#include <math.h>
#if defined(DOUBLE)
#define ABS fabs
#else
#define ABS fabsf
#endif
FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
BLASLONG i=0;
BLASLONG ix=0;
FLOAT maxf=0.0;
if (n <= 0 || inc_x <= 0) return(maxf);
maxf=ABS(x[0]);
ix += inc_x;
i++;
while(i < n)
{
if( ABS(x[ix]) > maxf )
{
maxf = ABS(x[ix]);
}
ix += inc_x;
i++;
}
return(maxf);
}
-66
View File
@@ -1,66 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
#include <math.h>
#if defined(DOUBLE)
#define ABS fabs
#else
#define ABS fabsf
#endif
FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
BLASLONG i=0;
BLASLONG ix=0;
FLOAT minf=0.0;
if (n <= 0 || inc_x <= 0) return(minf);
minf=ABS(x[0]);
ix += inc_x;
i++;
while(i < n)
{
if( ABS(x[ix]) < minf )
{
minf = ABS(x[ix]);
}
ix += inc_x;
i++;
}
return(minf);
}
-57
View File
@@ -1,57 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
#include <math.h>
#if defined(DOUBLE)
#define ABS fabs
#else
#define ABS fabsf
#endif
FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
BLASLONG i=0;
FLOAT sumf = 0.0;
if (n <= 0 || inc_x <= 0) return(sumf);
n *= inc_x;
while(i < n)
{
sumf += ABS(x[i]);
i += inc_x;
}
return(sumf);
}
-95
View File
@@ -1,95 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
int CNAME(BLASLONG n, FLOAT alpha, FLOAT *x, BLASLONG inc_x, FLOAT beta, FLOAT *y, BLASLONG inc_y)
{
BLASLONG i=0;
BLASLONG ix,iy;
if ( n < 0 ) return(0);
ix = 0;
iy = 0;
if ( beta == 0.0 )
{
if ( alpha == 0.0 )
{
while(i < n)
{
y[iy] = 0.0 ;
iy += inc_y ;
i++ ;
}
}
else
{
while(i < n)
{
y[iy] = alpha * x[ix] ;
ix += inc_x ;
iy += inc_y ;
i++ ;
}
}
}
else
{
if ( alpha == 0.0 )
{
while(i < n)
{
y[iy] = beta * y[iy] ;
iy += inc_y ;
i++ ;
}
}
else
{
while(i < n)
{
y[iy] = alpha * x[ix] + beta * y[iy] ;
ix += inc_x ;
iy += inc_y ;
i++ ;
}
}
}
return(0);
}
-54
View File
@@ -1,54 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y, FLOAT *dummy, BLASLONG dummy2)
{
BLASLONG i=0;
BLASLONG ix,iy;
if ( n < 0 ) return(0);
if ( da == 0.0 ) return(0);
ix = 0;
iy = 0;
while(i < n)
{
y[iy] += da * x[ix] ;
ix += inc_x ;
iy += inc_y ;
i++ ;
}
return(0);
}
-50
View File
@@ -1,50 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
int CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y)
{
BLASLONG i=0;
BLASLONG ix=0,iy=0;
if ( n < 0 ) return(0);
while(i < n)
{
y[iy] = x[ix] ;
ix += inc_x ;
iy += inc_y ;
i++ ;
}
return(0);
}
-58
View File
@@ -1,58 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
#if defined(DSDOT)
double CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y)
#else
FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y)
#endif
{
BLASLONG i=0;
BLASLONG ix=0,iy=0;
double dot = 0.0 ;
if ( n < 0 ) return(dot);
while(i < n)
{
#if defined(DSDOT)
dot += (double)y[iy] * (double)x[ix] ;
#else
dot += y[iy] * x[ix];
#endif
ix += inc_x ;
iy += inc_y ;
i++ ;
}
return(dot);
}
-56
View File
@@ -1,56 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
int CNAME(BLASLONG m, BLASLONG n, BLASLONG dummy1, FLOAT alpha, FLOAT *a, BLASLONG lda, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y, FLOAT *buffer)
{
BLASLONG i;
BLASLONG ix,iy;
BLASLONG j;
FLOAT *a_ptr;
FLOAT temp;
ix = 0;
a_ptr = a;
for (j=0; j<n; j++)
{
temp = alpha * x[ix];
iy = 0;
for (i=0; i<m; i++)
{
y[iy] += temp * a_ptr[i];
iy += inc_y;
}
a_ptr += lda;
ix += inc_x;
}
return(0);
}
-58
View File
@@ -1,58 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
int CNAME(BLASLONG m, BLASLONG n, BLASLONG dummy1, FLOAT alpha, FLOAT *a, BLASLONG lda, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y, FLOAT *buffer)
{
BLASLONG i;
BLASLONG ix,iy;
BLASLONG j;
FLOAT *a_ptr;
FLOAT temp;
iy = 0;
a_ptr = a;
for (j=0; j<n; j++)
{
temp = 0.0;
ix = 0;
for (i=0; i<m; i++)
{
temp += a_ptr[i] * x[ix];
ix += inc_x;
}
y[iy] += alpha * temp;
iy += inc_y;
a_ptr += lda;
}
return(0);
}
-68
View File
@@ -1,68 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
#include <math.h>
#if defined(DOUBLE)
#define ABS fabs
#else
#define ABS fabsf
#endif
BLASLONG CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
BLASLONG i=0;
BLASLONG ix=0;
FLOAT maxf=0.0;
BLASLONG max=0;
if (n <= 0 || inc_x <= 0) return(max);
maxf=ABS(x[0]);
ix += inc_x;
i++;
while(i < n)
{
if( ABS(x[ix]) > maxf )
{
max = i;
maxf = ABS(x[ix]);
}
ix += inc_x;
i++;
}
return(max+1);
}
-68
View File
@@ -1,68 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
#include <math.h>
#if defined(DOUBLE)
#define ABS fabs
#else
#define ABS fabsf
#endif
BLASLONG CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
BLASLONG i=0;
BLASLONG ix=0;
FLOAT minf=0.0;
BLASLONG min=0;
if (n <= 0 || inc_x <= 0) return(min);
minf=ABS(x[0]);
ix += inc_x;
i++;
while(i < n)
{
if( ABS(x[ix]) < ABS(minf) )
{
min = i;
minf = ABS(x[ix]);
}
ix += inc_x;
i++;
}
return(min+1);
}
-59
View File
@@ -1,59 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
#include <math.h>
BLASLONG CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
BLASLONG i=0;
BLASLONG ix=0;
FLOAT maxf=0.0;
BLASLONG max=0;
if (n <= 0 || inc_x <= 0) return(max);
maxf=x[0];
ix += inc_x;
i++;
while(i < n)
{
if( x[ix] > maxf )
{
max = i;
maxf = x[ix];
}
ix += inc_x;
i++;
}
return(max+1);
}
-59
View File
@@ -1,59 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
#include <math.h>
BLASLONG CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
BLASLONG i=0;
BLASLONG ix=0;
FLOAT minf=0.0;
BLASLONG min=0;
if (n <= 0 || inc_x <= 0) return(min);
minf=x[0];
ix += inc_x;
i++;
while(i < n)
{
if( x[ix] < minf )
{
min = i;
minf = x[ix];
}
ix += inc_x;
i++;
}
return(min+1);
}
-72
View File
@@ -1,72 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
#include <math.h>
#if defined(DOUBLE)
#define ABS fabs
#else
#define ABS fabsf
#endif
#define CABS1(x,i) ABS(x[i])+ABS(x[i+1])
BLASLONG CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
BLASLONG i=0;
BLASLONG ix=0;
FLOAT maxf;
BLASLONG max=0;
BLASLONG inc_x2;
if (n <= 0 || inc_x <= 0) return(max);
inc_x2 = 2 * inc_x;
maxf = CABS1(x,0);
ix += inc_x2;
i++;
while(i < n)
{
if( CABS1(x,ix) > maxf )
{
max = i;
maxf = CABS1(x,ix);
}
ix += inc_x2;
i++;
}
return(max+1);
}
-72
View File
@@ -1,72 +0,0 @@
/***************************************************************************
Copyright (c) 2016, 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 "common.h"
#include <math.h>
#if defined(DOUBLE)
#define ABS fabs
#else
#define ABS fabsf
#endif
#define CABS1(x,i) ABS(x[i])+ABS(x[i+1])
BLASLONG CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
{
BLASLONG i=0;
BLASLONG ix=0;
FLOAT minf;
BLASLONG min=0;
BLASLONG inc_x2;
if (n <= 0 || inc_x <= 0) return(min);
inc_x2 = 2 * inc_x;
minf = CABS1(x,0);
ix += inc_x2;
i++;
while(i < n)
{
if( CABS1(x,ix) < minf )
{
min = i;
minf = CABS1(x,ix);
}
ix += inc_x2;
i++;
}
return(min+1);
}

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