From 3c41d61514029d5aa4ea748c1e46098767ae448b Mon Sep 17 00:00:00 2001 From: Matthew Bauer Date: Tue, 21 Apr 2020 11:03:10 -0500 Subject: [PATCH] doc/overlays.xml: update documentation for BLAS/LAPACK This expands the documentation and explains how to assert LP64. --- doc/languages-frameworks/python.section.md | 29 ++-------------- doc/using/overlays.xml | 40 +++++++++++++++++++++- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/doc/languages-frameworks/python.section.md b/doc/languages-frameworks/python.section.md index f8884785e90..e6f0b64fa9c 100644 --- a/doc/languages-frameworks/python.section.md +++ b/doc/languages-frameworks/python.section.md @@ -1290,32 +1290,9 @@ self: super: { ### How to use Intel's MKL with numpy and scipy? -A `site.cfg` is created that configures BLAS based on the `blas` parameter of -the `numpy` derivation. By passing in `mkl`, `numpy` and packages depending on -`numpy` will be built with `mkl`. - -The following is an overlay that configures `numpy` to use `mkl`: - -```nix -self: super: { - python37 = super.python37.override { - packageOverrides = python-self: python-super: { - numpy = python-super.numpy.override { - blas = super.pkgs.mkl; - }; - }; - }; -} -``` - -`mkl` requires an `openmp` implementation when running with multiple processors. -By default, `mkl` will use Intel's `iomp` implementation if no other is -specified, but this is a runtime-only dependency and binary compatible with the -LLVM implementation. To use that one instead, Intel recommends users set it with -`LD_PRELOAD`. - -Note that `mkl` is only available on `x86_64-{linux,darwin}` platforms; -moreover, Hydra is not building and distributing pre-compiled binaries using it. +MKL can be configured using an overlay. See the section “[Using +overlays to configure +alternatives](#sec-overlays-alternatives-blas-lapack)”. ### What inputs do `setup_requires`, `install_requires` and `tests_require` map to? diff --git a/doc/using/overlays.xml b/doc/using/overlays.xml index 7732e0ac217..5f808839dd0 100644 --- a/doc/using/overlays.xml +++ b/doc/using/overlays.xml @@ -177,7 +177,7 @@ self: super: Intel - MKL (only works on x86 architecture) + MKL (only works on x86 architecture, unfree) The Nixpkgs attribute is mkl. @@ -211,6 +211,44 @@ self: super: using LD_PRELOAD of libblas.so.3 and liblapack.so.3. + + Intel MKL requires an openmp implementation + when running with multiple processors. By default, + mkl will use Intel’s iomp + implementation if no other is specified, but this is a + runtime-only dependency and binary compatible with the LLVM + implementation. To use that one instead, Intel recommends users + set it with LD_PRELOAD. Note that + mkl is only available on + x86_64-linux and + x86_64-darwin. Moreover, Hydra is not build + and distributing pre-compiled binaries using it. + + + For BLAS/LAPACK switching to work correctly, all packages must + depend on blas or lapack. + This ensures that only one BLAS/LAPACK library is used at one + time. There are two versions versions of BLAS/LAPACK currently + in the wild, LP64 (integer size = 32 bits) + and ILP64 (integer size = 64 bits). Some + software needs special flags or patches to work with + ILP64. You can check if + ILP64 is used in Nixpkgs with + blas.isILP64 and + lapack.isILP64. Some software does NOT work + with ILP64, and derivations need to specify + an assertion to prevent this. You can prevent + ILP64 from being used with the following: + + +{ stdenv, blas, lapack, ... }: + +assert (!blas.isILP64) && (!lapack.isILP64); + +stdenv.mkDerivation { + ... +} +