OpenMathLib/OpenBLAS

GitHub: OpenMathLib/OpenBLAS

OpenBLAS 是一个高性能开源 BLAS 线性代数库,为科学计算和 AI 框架提供底层矩阵运算加速支持。

Stars: 7314 | Forks: 1648

# OpenBLAS [![Join the chat at https://gitter.im/xianyi/OpenBLAS](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/xianyi/OpenBLAS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) Cirrus CI: [![Build Status](https://api.cirrus-ci.com/github/xianyi/OpenBLAS.svg?branch=develop)](https://cirrus-ci.com/github/xianyi/OpenBLAS) [![Build Status](https://dev.azure.com/xianyi/OpenBLAS/_apis/build/status/xianyi.OpenBLAS?branchName=develop)](https://dev.azure.com/xianyi/OpenBLAS/_build/latest?definitionId=1&branchName=develop) OSUOSL POWERCI [![Build Status](https://powerci.osuosl.org/buildStatus/icon?job=OpenBLAS_gh%2Fdevelop)](http://powerci.osuosl.org/job/OpenBLAS_gh/job/develop/) OSUOSL IBMZ-CI [![Build Status](http://ibmz-ci.osuosl.org/buildStatus/icon?job=OpenBLAS-Z%2Fdevelop)](http://ibmz-ci.osuosl.org/job/OpenBLAS-Z/job/develop/) ## 简介 OpenBLAS 是一个基于 GotoBLAS2 1.13 BSD 版本优化的 BLAS (Basic Linear Algebra Subprograms) 库。 有关 OpenBLAS 的更多信息,请参阅: - 文档地址 [openmathlib.org/OpenBLAS/docs/](http://www.openmathlib.org/OpenBLAS/docs), - 主页地址 [openmathlib.org/OpenBLAS/](http://www.openmathlib.org/OpenBLAS)。 关于 BLAS 例程的通用介绍,请参阅 netlib 上托管的其参考实现的详尽文档: 。在该站点上,您还可以找到更高级别库 LAPACK(OpenBLAS 随附的 **L**inear **A**lgebra **Pack**age)的参考实现文档。如果您正在寻找关于线性代数的通用入门或复习资料,MIT OpenCourseWare [此处](https://ocw.mit.edu/resources/res-18-010-a-2020-vision-of-linear-algebra-spring-2020/) 或 YouTube [此处](https://www.youtube.com/playlist?list=PLUl4u3cNGP61iQEFiWLE21EJCxwmWvvek) 上 Gilbert Strang 教授的六个 20 分钟讲座视频可能会有所帮助。 ## 二进制包 我们为以下平台提供官方二进制包: * Windows x86/x86_64 * Windows arm64 (woa) 您可以从 [sourceforge.net 上的文件托管](https://sourceforge.net/projects/openblas/files/) 或 [GitHub 项目页面的 Releases 部分](https://github.com/OpenMathLib/OpenBLAS/releases) 下载它们。 OpenBLAS 也为许多包管理器打了包 - 详情请参阅 [文档的安装部分](http://www.openmathlib.org/OpenBLAS/docs/install/)。 ## 从源代码安装 从 https://github.com/OpenMathLib/OpenBLAS/ 获取源代码。请注意,默认分支是 `develop`(虽然 `master` 分支仍然存在,但已严重过时)。 构建时的参数可以在 `Makefile.rule` 中选择,请参阅那里关于每个选项的简短说明。 大多数选项也可以在命令行中直接作为 `make` 或 `cmake` 调用的参数给出。 ### 依赖项 构建 OpenBLAS 需要安装以下软件: * GNU Make 或 CMake * C 编译器,例如 GCC 或 Clang * Fortran 编译器(可选,用于 LAPACK) 通常,强烈建议使用最新版本的编译器。 如果 Fortran 编译器不可用,则可以编译已通过机器翻译转换为 C 的旧版本内置 LAPACK。 ### 常规编译 只需调用 `make`(或在 BSD 上使用 `gmake`)即可自动检测 CPU。 要设置特定的目标 CPU,请使用 `make TARGET=xxx`,例如 `make TARGET=NEHALEM`。 完整的目标列表位于 `TargetList.txt` 文件中,其他构建选项记录在 Makefile.rule 中,可以在那里设置(通常通过删除相应行的注释字符),或者在 `make` 命令行上使用。 请注意,在构建后运行 `make install` 时,您需要重复提供给构建步骤中 `make` 的所有命令行选项,因为某些设置(如支持的最大线程数)默认是从构建主机自动推导出来的,这可能不是您想要的。 对于使用 `cmake` 构建,适用常规约定,即在 OpenBLAS 源代码顶级目录下或其外部创建一个构建目录,并在那里调用 `cmake`,指定源代码树的路径以及您计划设置的任何构建选项。 有关更多详细信息,请参阅文档中的 [从源代码构建](http://www.openmathlib.org/OpenBLAS/docs/install/#building-from-source) 部分。 ### 交叉编译 设置 `CC` 和 `FC` 以指向交叉编译工具链,如果您使用 `make`,还需将 `HOSTCC` 设置为您的主机 C 编译器。 交叉编译时必须明确指定目标。 示例: * 在 Linux 系统上,交叉编译到较旧的 MIPS64 路由器板: make BINARY=64 CC=mipsisa64r6el-linux-gnuabi64-gcc FC=mipsisa64r6el-linux-gnuabi64-gfortran HOSTCC=gcc TARGET=P6600 * 或者编译到 Windows x64 主机: ``` make CC="i686-w64-mingw32-gcc -Bstatic" FC="i686-w64-mingw32-gfortran -static-libgfortran" TARGET=HASWELL BINARY=32 CROSS=1 NUM_THREADS=20 CONSISTENT_FPCSR=1 HOSTCC=gcc ``` 您可以在下面的“支持的系统”部分和 [从源代码构建文档](http://www.openmathlib.org/OpenBLAS/docs/install) 中找到其他情况的说明。 源代码中包含的 `.yml` 脚本(其中包含针对每次提议的源代码更改自动运行的“持续集成”(CI) 构建测试的构建脚本)也可能提供额外的提示。 当为相同架构的更现代 CPU 目标编译时(例如在 `HASWELL` 主机上编译 `TARGET=SKYLAKEX`),可以使用选项 `CROSS=1` 来抑制构建结束时测试的自动调用。 ### 调试版本 可以使用 `make DEBUG=1` 构建调试版本。 ### 在 Power CPU 上编译带 MASS 支持(可选) [IBM MASS](https://www.ibm.com/support/home/product/W511326D80541V01/other_software/mathematical_acceleration_subsystem) 库包含一组针对 C、C++ 和 Fortran 应用程序的数学函数,这些函数针对 POWER 架构上的最佳性能进行了调优。 带 MASS 的 OpenBLAS 需要 POWER 上的 64 位小端序 OS。 可以按如下方式安装该库: * 在 Ubuntu 上: wget -q http://public.dhe.ibm.com/software/server/POWER/Linux/xl-compiler/eval/ppc64le/ubuntu/public.gpg -O- | sudo apt-key add - echo "deb http://public.dhe.ibm.com/software/server/POWER/Linux/xl-compiler/eval/ppc64le/ubuntu/ trusty main" | sudo tee /etc/apt/sources.list.d/ibm-xl-compiler-eval.list sudo apt-get update sudo apt-get install libxlmass-devel.8.1.5 * 在 RHEL/CentOS 上: wget http://public.dhe.ibm.com/software/server/POWER/Linux/xl-compiler/eval/ppc64le/rhel7/repodata/repomd.xml.key sudo rpm --import repomd.xml.key wget http://public.dhe.ibm.com/software/server/POWER/Linux/xl-compiler/eval/ppc64le/rhel7/ibm-xl-compiler-eval.repo sudo cp ibm-xl-compiler-eval.repo /etc/yum.repos.d/ sudo yum install libxlmass-devel.8.1.5 安装 MASS 库后,使用 `USE_MASS=1` 编译 OpenBLAS。 例如,要在 Power8 上编译带 MASS 支持的版本:`make USE_MASS=1 TARGET=POWER8`。 ### 安装到特定目录(可选) 在调用 `make` 时使用 `PREFIX=`,例如 ``` make install PREFIX=your_installation_directory ``` (连同您在前面的构建步骤中添加到 `make` 命令行的所有选项) 默认安装目录是 `/opt/OpenBLAS`。 ## 支持的 CPU 和操作系统 请阅读 `GotoBLAS_01Readme.txt` 以了解 2010 年 GotoBLAS 已支持的较旧 CPU 型号。 ### 额外支持的 CPU #### x86/x86-64 - **Intel Xeon 56xx (Westmere)**: 使用 GotoBLAS2 Nehalem 代码。 - **Intel Sandy Bridge**: 在 x86-64 上使用 AVX 优化的 Level-3 和 Level-2 BLAS。 - **Intel Haswell**: 在 x86-64 上使用 AVX2 和 FMA 优化的 Level-3 和 Level-2 BLAS。 - **Intel Skylake-X**: 在 x86-64 上使用 AVX512 和 FMA 优化的 Level-3 和 Level-2 BLAS。 - **Intel Cooper Lake**: 与 Skylake-X 相同,改进了 BFLOAT16 支持。 - **AMD Bobcat**: 使用 GotoBLAS2 Barcelona 代码。 - **AMD Bulldozer**: x86-64 ?GEMM FMA4 内核。(感谢 Werner Saar) - **AMD PILEDRIVER**: 使用 Bulldozer 代码并进行了一些优化。 - **AMD STEAMROLLER**: 使用 Bulldozer 代码并进行了一些优化。 - **AMD ZEN**: 使用 Haswell 代码,并针对 Zen 2/3 进行了一些优化(Zen4 请使用 SkylakeX) #### MIPS32 - **MIPS 1004K**: 使用 P5600 代码 - **MIPS 24K**: 使用 P5600 代码 #### MIPS64 - **ICT Loongson 3A**: 优化的 Level-3 BLAS 以及部分 Level-1,2。 - **ICT Loongson 3B**: 实验性 #### ARM - **ARMv6**: 针对 vfpv2 和 vfpv3-d16 优化的 BLAS(例如 BCM2835, Cortex M0+) - **ARMv7**: 针对 vfpv3-d32 优化的 BLAS(例如 Cortex A8, A9 和 A15) #### ARM64 - **ARMv8**: 具有小缓存的基本 ARMV8,优化的 Level-3 和 Level-2 BLAS - **Cortex-A53**: 与 ARMV8 相同(不同的 cpu 规格) - **Cortex-A55**: 与 ARMV8 相同(不同的 cpu 规格) - **Cortex A57**: 优化的 Level-3 和 Level-2 函数 - **Cortex A72**: 与 A57 相同(不同的 cpu 规格) - **Cortex A73**: 与 A57 相同(不同的 cpu 规格) - **Cortex A76**: 与 A57 相同(不同的 cpu 规格) - **Falkor**: 与 A57 相同(不同的 cpu 规格) - **ThunderX**: 优化了一些 Level-1 函数 - **ThunderX2T99**: 优化的 Level-3 BLAS 以及部分 Level-1 和 Level-2 - **ThunderX3T110** - **TSV110**: 优化了一些 Level-3 辅助函数 - **EMAG 8180**: 基于 A57 的初步支持 - **Neoverse N1**: (AWS Graviton2) 初步支持 - **Neoverse V1**: (AWS Graviton3) 优化的 Level-3 BLAS - **Apple Vortex**: 基于 ThunderX2/3 的初步支持 - **A64FX**: 初步支持,优化的 Level-3 BLAS - **ARMV8SVE**: 任何带有 SVE 扩展的 ARMV8 cpu #### PPC/PPC64 - **POWER8**: 优化的 BLAS,仅适用于 PPC64LE (Little Endian),仅适用于 `USE_OPENMP=1` - **POWER9**: 优化的 Level-3 BLAS (real) 和部分 Level-1,2。仅适用于带 OpenMP 的 PPC64LE。 - **POWER10**: 优化的 Level-3 BLAS,包括 SBGEMM 和部分 Level-1,2。 - **AIX**: 带 OpenXL 和 OpenMP 的动态架构。 make CC=ibm-clang_r FC=xlf_r TARGET=POWER7 BINARY=64 USE_OPENMP=1 INTERFACE64=1 DYNAMIC_ARCH=1 USE_THREAD=1 #### IBM zEnterprise System - **Z13**: 优化的 Level-3 BLAS 和 Level-1,2 - **Z14**: 优化的 Level-3 BLAS 和 (单精度) Level-1,2 #### RISC-V - **C910V**: 通过 RISC-V Vector extension 0.7.1 优化的 Level-3 BLAS (real) 和 Level-1,2。 make HOSTCC=gcc TARGET=C910V CC=riscv64-unknown-linux-gnu-gcc FC=riscv64-unknown-linux-gnu-gfortran (已知只要您仅使用单精度函数,也可在 C906 上工作 - 其双精度指令集支持似乎不完整) - **x280**: 通过 RISC-V Vector extension 1.0 优化的 Level-3 BLAS 和 Level-1,2。 make HOSTCC=gcc TARGET=x280 NUM_THREADS=8 CC=riscv64-unknown-linux-gnu-clang FC=riscv64-unknown-linux-gnu-gfortran - **ZVL???B**: Level-3 BLAS 和 Level-1,2,包含针对具有至少相应宽度寄存器的向量支持的通用 RISCV 核心的向量化内核;可用 ZVL128B 和 ZVL256B。 例如: make TARGET=RISCV64_ZVL256B CFLAGS="-DTARGET=RISCV64_ZVL256B" \ BINARY=64 ARCH=riscv64 CC='clang -target riscv64-unknown-linux-gnu' \ AR=riscv64-unknown-linux-gnu-ar AS=riscv64-unknown-linux-gnu-gcc \ LD=riscv64-unknown-linux-gnu-gcc FC=riscv64-unknown-linux-gnu-gfortran \ HOSTCCcc HOSTFC=gfortran -j #### LOONGARCH64 - **LA64_GENERIC**: 使用标量指令优化的 Level-3, Level-2 和 Level-1 BLAS make HOSTCC=gcc TARGET=LA64_GENERIC CC=loongarch64-unknown-linux-gnu-gcc FC=loongarch64-unknown-linux-gnu-gfortran USE_SIMPLE_THREADED_LEVEL3=1 旧风格的 TARGET=LOONGSONGENERIC 仍然受支持 - **LA264**: 使用 LSX 指令优化的 Level-3, Level-2 和 Level-1 BLAS make HOSTCC=gcc TARGET=LA264 CC=loongarch64-unknown-linux-gnu-gcc FC=loongarch64-unknown-linux-gnu-gfortran USE_SIMPLE_THREADED_LEVEL3=1 旧风格的 TARGET=LOONGSON2K1000 仍然受支持 - **LA464**: 使用 LASX 指令优化的 Level-3, Level-2 和 Level-1 BLAS make HOSTCC=gcc TARGET=LA464 CC=loongarch64-unknown-linux-gnu-gcc FC=loongarch64-unknown-linux-gnu-gfortran USE_SIMPLE_THREADED_LEVEL3=1 旧风格的 TARGET=LOONGSON3R5 仍然受支持 ### 单个库支持多个目标 通过在 Makefile.rule、gmake 命令行中指定 `DYNAMIC_ARCH=1`,或在 cmake 中指定 `-DDYNAMIC_ARCH=TRUE`,可以构建支持多个目标并运行时检测目标 CPU 的 OpenBLAS。 对于 **x86_64**,这会激活的目标列表包含 Prescott, Core2, Nehalem, Barcelona, Sandybridge, Bulldozer, Piledriver, Steamroller, Excavator, Haswell, Zen, SkylakeX, Cooper Lake, Sapphire Rapids。对于未包含在此列表中的 CPU 代次,会使用相应的旧型号。如果您还指定了 `DYNAMIC_OLDER=1`,则会添加对 Penryn, Dunnington, Opteron, Opteron/SSE3, Bobcat, Atom 和 Nano 的特定支持。最后还有一个选项 `DYNAMIC_LIST`,允许指定单独的目标列表以包含代替默认列表。 **x86** 也支持 `DYNAMIC_ARCH`,它对应于 Katmai, Coppermine, Northwood, Prescott, Banias, Core2, Penryn, Dunnington, Nehalem, Athlon, Opteron, Opteron_SSE3, Barcelona, Bobcat, Atom 和 Nano。 在 **ARMV8** 上,它启用对 CortexA53, CortexA57, CortexA72, CortexA73, Falkor, ThunderX, ThunderX2T99, TSV110 以及通用 ARMV8 cpu 的支持。如果在构建时编译器支持 SVE,则还会启用对 NeoverseN2, NeoverseV1 以及通用 ArmV8SVE 目标的支持。 对于 **POWER**,该列表包含 POWER6, POWER8 和 POWER9。如果使用足够新的编译器进行构建,POWER10 也可用。 在 **ZARCH** 上,它包含 Z13 和 Z14 以及通用 zarch 支持。 在 **riscv64** 上,除了通用 riscv64 支持外,DYNAMIC_ARCH 还启用对 riscv64_zvl128b 和 riscv64_zvl256b 的支持。启用 DYNAMIC_ARCH 时,需要支持 RVV 1.0 的编译器才能为 riscv64 构建 OpenBLAS。 在 **LoongArch64** 上,它包含 LA264 和 LA464 以及通用 LoongArch64 支持。 `TARGET` 选项可以 —— 并且通常**应该** —— 与 `DYNAMIC_ARCH=1` 结合使用,以指定库中所有公共代码应假设的 cpu 型号,通常您会希望将其设置为您预期遇到的最旧型号。 未能指定此项可能会导致编译器使用高级指令,仅仅因为构建主机恰好支持它们。这种情况最有可能在启用激进优化选项时发生,生成的库随后可能会在较弱的硬件上崩溃并出现非法指令错误,甚至在它到达专为该 cpu 包含的 BLAS 例程之前。 请注意,无法组合对不同架构的支持,因此同一个库中不能同时包含 32 位和 64 位,或 x86_64 和 arm64。 ### 支持的操作系统 - **GNU/Linux** - **MinGW 或 Visual Studio (CMake)/Windows**: 请阅读 。 - **Darwin/macOS/OSX/iOS**: 实验性。虽然 GotoBLAS2 已经支持 Darwin,但我们不是 OSX/iOS 专家。 - **FreeBSD**: 由社区支持。我们没有在此 OS 上主动测试该库。 - **OpenBSD**: 由社区支持。我们没有在此 OS 上主动测试该库。 - **NetBSD**: 由社区支持。我们没有在此 OS 上主动测试该库。 - **DragonFly BSD**: 由社区支持。我们没有在此 OS 上主动测试该库。 - **Android**: 由社区支持。请阅读 。 - **AIX**: 在 PPC 上支持直到 POWER10 - **Haiku**: 由社区支持。我们没有在此 OS 上主动测试该库。 - **SunOS**: 由社区支持。我们没有在此 OS 上主动测试该库。 - **Cortex-M**: 由社区支持。请阅读 。 ## 用法 如果 OpenBLAS 被编译为共享库,请静态链接 `libopenblas.a` 或使用 `-lopenblas` 动态链接。 ### 使用环境变量设置线程数 环境变量用于指定最大线程数。 例如, ``` export OPENBLAS_NUM_THREADS=4 export GOTO_NUM_THREADS=4 export OMP_NUM_THREADS=4 ``` 优先级是 `OPENBLAS_NUM_THREADS` > `GOTO_NUM_THREADS` > `OMP_NUM_THREADS`。 如果您使用 `USE_OPENMP=1` 编译此库,则应设置 `OMP_NUM_THREADS` 环境变量;当使用 `USE_OPENMP=1` 编译时,OpenBLAS 会忽略 `OPENBLAS_NUM_THREADS` 和 `GOTO_NUM_THREADS`。 ### 在运行时设置线程数 我们提供以下函数来在运行时控制线程数: ``` void goto_set_num_threads(int num_threads); void openblas_set_num_threads(int num_threads); ``` 请注意,这些仅在库初始化时使用一次,不可用于微调单个 BLAS 调用中的线程数。 如果您使用 `USE_OPENMP=1` 编译此库,您也应该使用上述函数。 ## 报告 Bug 请在 https://github.com/OpenMathLib/OpenBLAS/issues 提交 issue。 ## 联系方式 + 使用 github 讨论: https://github.com/OpenMathLib/OpenBLAS/discussions * OpenBLAS 用户邮件列表: https://groups.google.com/forum/#!forum/openblas-users * OpenBLAS 开发者邮件列表: https://groups.google.com/forum/#!forum/openblas-dev ## 更新日志 请参阅 Changelog.txt。 ## 故障排除 * 请先阅读文档中的 [FAQ](http://www.openmathlib.org/OpenBLAS/docs/faq) 部分。 * 请使用 GCC 4.6 及更高版本在 Linux/MinGW/BSD 上编译 Sandy Bridge AVX 内核。 * 请使用 Clang 3.1 及更高版本在 Sandy Bridge 微架构上编译该库。 Clang 3.0 会生成错误的 AVX 二进制代码。 * 请使用 GCC 6 或 LLVM 6 及更高版本编译 Skylake/CooperLake AVX512 内核 * 如果您计划使用其新的 flang 编译器编译 Fortran,请使用 LLVM 18 及更高版本(Windows 上为 19 及更高版本) * 请使用 GCC 11 及更高版本在 POWER 架构上编译 OpenBLAS * CPU/核心数应小于或等于 256。在 Linux `x86_64` (`amd64`) 上,如果您使用 `BIGNUMA=1` 构建库,则实验性地支持最多 1024 个 CPU/核心和 128 个 numa 节点。 * OpenBLAS 默认不设置处理器亲和性。 在 Linux 上,您可以通过在 Makefile.rule 中注释掉 `NO_AFFINITY=1` 行来启用处理器亲和性。但是,请注意这可能会导致 [与 R parallel 冲突](https://stat.ethz.ch/pipermail/r-sig-hpc/2012-April/001348.html)。 * 在 Loongson 3A 上,`make test` 可能会失败并出现 `pthread_create` 错误 (`EAGAIN`)。 但是,当您在 shell 上运行相同的测试用例时,它将正常工作。 ## 贡献 1. [查看未解决的 issue](https://github.com/OpenMathLib/OpenBLAS/issues) 或开启一个新的 issue,围绕功能想法或 bug 开始讨论。 2. Fork [OpenBLAS](https://github.com/OpenMathLib/OpenBLAS) 仓库以开始进行您的更改。 3. 编写一个测试来表明 bug 已修复或功能按预期工作。 4. 发送 pull request。确保将您自己添加到 `CONTRIBUTORS.md`。 ## 捐赠 请参阅文档中的[捐赠部分](http://www.openmathlib.org/OpenBLAS/docs/about/#donations)。
标签:Bash脚本, BLAS, Fortran, GotoBLAS, HPC, LAPACK, OpenBLAS, 向量化计算, 客户端加密, 客户端加密, 并行计算, 底层优化, 开源库, 搜索引擎爬虫, 数值计算, 数学库, 矩阵运算, 科学计算, 线性代数, 自动回退, 高性能计算