mirror of https://github.com/xianyi/OpenBLAS.git
168 lines
8.0 KiB
Markdown
168 lines
8.0 KiB
Markdown
!!! info "Supported build systems"
|
|
|
|
This page describes the Make-based build, which is the
|
|
default/authoritative build method. Note that the OpenBLAS repository also
|
|
supports building with CMake (not described here) - that generally works
|
|
and is tested, however there may be small differences between the Make and
|
|
CMake builds.
|
|
|
|
|
|
## Makefile dependency graph
|
|
|
|
<!---
|
|
An easy way to update this diagram is to copy it into https://mermaid.live
|
|
and edit it interactively.
|
|
-->
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
A[Makefile] -->|included by many of the Makefiles in the subdirectories!| B(Makefile.system)
|
|
B -->|triggered, not included, once by Makefile.system, and runs before any of the actual library code is built. builds and runs the 'getarch' tool for cpu identification, runs the compiler detection scripts c_check/f_check| C{Makefile.prebuild}
|
|
C -->|either this or Makefile_kernel.conf is generated| D[Makefile.conf]
|
|
C -->|temporary Makefile.conf during DYNAMIC_ARCH builds| E[Makefile_kernel.conf]
|
|
B -->|defaults for build options that can be given on the make command line| F[Makefile.rule]
|
|
B -->|architecture-specific compiler options and OpenBLAS buffer size values| G[Makefile.$ARCH]
|
|
A --> exports
|
|
A -->|directories: test, ctest, utest, cpp_thread_test| H(test directories)
|
|
A --> I($BLASDIRS)
|
|
I --> interface
|
|
I --> driver/level2
|
|
I --> driver/level3
|
|
I --> driver/others
|
|
A -->|for each target in DYNAMIC_CORE if DYNAMIC_ARCH=1| kernel
|
|
A -->|subdirs: timing, testing, testing/EIG, testing/LIN| J($NETLIB_LAPACK_DIR)
|
|
A --> relapack
|
|
```
|
|
|
|
|
|
## Important Variables
|
|
|
|
Most of the tunable variables are found in
|
|
[Makefile.rule](https://github.com/xianyi/OpenBLAS/blob/develop/Makefile.rule),
|
|
along with their detailed descriptions.
|
|
|
|
Most of the variables are detected automatically in
|
|
[Makefile.prebuild](https://github.com/xianyi/OpenBLAS/blob/develop/Makefile.prebuild),
|
|
if they are not set in the environment.
|
|
|
|
The most commonly used variables are documented below. There are more options
|
|
though - please read the linked Makefiles if you want to see all variables.
|
|
|
|
### CPU related
|
|
|
|
- `ARCH`: target architecture (e.g., `x86-64`).
|
|
- `DYNAMIC_ARCH`: For building library for multiple `TARGET`s (does not lose any
|
|
optimizations, but increases library size).
|
|
- `DYNAMIC_LIST`: optional user-provided subset of the `DYNAMIC_CORE` list in
|
|
[Makefile.system](https://github.com/xianyi/OpenBLAS/blob/develop/Makefile.system).
|
|
- `TARGET`: target CPU architecture. In case of `DYNAMIC_ARCH=1`, it means that
|
|
the library will not be usable on less capable CPUs.
|
|
- `TARGET_CORE`: override `TARGET` internally during each CPU-specific cycle of
|
|
the build for `DYNAMIC_ARCH`.
|
|
|
|
|
|
### Toolchain related
|
|
|
|
- `CC`: `TARGET` C compiler used for compilation (can be cross-toolchains).
|
|
- `FC`: `TARGET` Fortran compiler used for compilation (can be cross-toolchains,
|
|
set `NOFORTRAN=1` if the used cross-toolchain has no Fortran compiler).
|
|
- `COMMON_OPT`: flags to add to all invocations of the target C and Fortran compilers
|
|
(overrides `CFLAGS`/`FFLAGS` - prefer using `COMMON_OPT`)
|
|
- `CCOMMON_OPT`: flags to add to all invocations of the target C compiler
|
|
(overrides `CFLAGS`)
|
|
- `FCOMMON_OPT`: flags to add to all invocations of the target Fortran compiler
|
|
(overrides `FFLAGS`)
|
|
- `LDFLAGS`: flags to add to all target linker invocations
|
|
- `AR`, `AS`, `LD`, `RANLIB`: `TARGET` toolchain helpers used for compilation
|
|
(can be cross-toolchains).
|
|
- `HOSTCC`: compiler of build machine, needed to create proper config files for
|
|
the target architecture.
|
|
- `HOST_CFLAGS`: flags for the build machine compiler.
|
|
|
|
|
|
### Library related
|
|
|
|
#### Library kind and bitness options
|
|
|
|
- `BINARY`: whether to build a 32-bit or 64-bit library (default is `64`, set
|
|
to `32` on a 32-bit platform).
|
|
- `INTERFACE64`: build with 64-bit (ILP64) integer representations to support
|
|
large array index values (incompatible with the standard 32-bit integer (LP64) API).
|
|
- `NO_STATIC`: if set to `1`, don't build a static library (default is `0`)
|
|
- `NO_SHARED`: if set to `1`, don't build a shared library (default is `0`)
|
|
|
|
#### Data type options
|
|
|
|
- `BUILD_SINGLE`: build the single-precision real functions of BLAS and (if
|
|
it's built) LAPACK
|
|
- `BUILD_DOUBLE`: build the double-precision real functions
|
|
- `BUILD_COMPLEX`: build the single-precision complex functions
|
|
- `BUILD_COMPLEX16`: build the double-precision complex functions
|
|
- `BUILD_BFLOAT16`: build the "half precision brainfloat" real functions
|
|
- `EXPRECISION`: (do not use, this is a work in progress) option to use `long
|
|
double` functions
|
|
|
|
By default, the single- and double-precision real and complex floating-point
|
|
functions are included in the build, while the half- and extended-precision
|
|
functions are not.
|
|
|
|
#### Threading options
|
|
|
|
- `USE_THREAD`: Use a multithreading backend (defaults to `pthreads`).
|
|
- `USE_LOCKING`: implement locking for thread safety even when `USE_THREAD` is
|
|
not set (so that the single-threaded library can safely be called from
|
|
multithreaded programs).
|
|
- `USE_OPENMP`: Use OpenMP as multithreading backend
|
|
- `NUM_THREADS`: define this to the maximum number of parallel threads you
|
|
expect to need (defaults to the number of cores in the build CPU).
|
|
- `NUM_PARALLEL`: define this to the number of OpenMP instances that your code
|
|
may use for parallel calls into OpenBLAS (the default is `1`, see below).
|
|
|
|
OpenBLAS uses a fixed set of memory buffers internally, used for communicating
|
|
and compiling partial results from individual threads. For efficiency, the
|
|
management array structure for these buffers is sized at build time - this
|
|
makes it necessary to know in advance how many threads need to be supported on
|
|
the target system(s).
|
|
|
|
With OpenMP, there is an additional level of complexity as there may be calls
|
|
originating from a parallel region in the calling program. If OpenBLAS gets
|
|
called from a single parallel region, it runs single-threaded automatically to
|
|
avoid overloading the system by fanning out its own set of threads. In the case
|
|
that an OpenMP program makes multiple calls from independent regions or
|
|
instances in parallel, this default serialization is not sufficient as the
|
|
additional caller(s) would compete for the original set of buffers already in
|
|
use by the first call. So if multiple OpenMP runtimes call into OpenBLAS at the
|
|
same time, then only one of them will be able to make progress while all the
|
|
rest of them spin-wait for the one available buffer. Setting `NUM_PARALLEL` to
|
|
the upper bound on the number of OpenMP runtimes that you can have in a process
|
|
ensures that there are a sufficient number of buffer sets available.
|
|
|
|
#### Library and symbol name options
|
|
|
|
- `FIXED_LIBNAME`: if set to `1`, uses a non-versioned name for the library and
|
|
no symbolic linking to variant names (default is `0`)
|
|
- `LIBNAMEPREFIX`: prefix that, if given, will be inserted in the library name
|
|
before `openblas` (e.g., `xxx` will result in `libxxxopenblas.so`)
|
|
- `LIBNAMESUFFIX`: suffix that, if given, will be inserted in the library name
|
|
after `openblas`, separated by an underscore (e.g., `yyy` will result in
|
|
`libopenblas_yyy.so`)
|
|
- `SYMBOLPREFIX`: prefix that, if given, will be added to all symbol names
|
|
*and* to the library name
|
|
- `SYMBOLSUFFIX`: suffix that, if given, will be added to all symbol names
|
|
*and* to the library name
|
|
|
|
#### BLAS and LAPACK options
|
|
|
|
By default, the Fortran and C interfaces to BLAS and LAPACK are built,
|
|
including deprecated functions, while
|
|
[ReLAPACK](https://github.com/HPAC/ReLAPACK) is not.
|
|
|
|
- `NO_CBLAS`: if set to `1`, don't build the CBLAS interface (default is `0`)
|
|
- `ONLY_CBLAS`: if set to `1`, only build the CBLAS interface (default is `0`)
|
|
- `NO_LAPACK`: if set to `1`, don't build LAPACK (default is `0`)
|
|
- `NO_LAPACKE`: if set to `1`, don't build the LAPACKE interface (default is `0`)
|
|
- `BUILD_LAPACK_DEPRECATED`: if set to `0`, don't build deprecated LAPACK
|
|
functions (default is `1`)
|
|
- `BUILD_RELAPACK`: if set to `1`, build Recursive LAPACK on top of LAPACK
|
|
(default is `0`)
|