mkl: 2020.3.304 -> 2021.1.1.52

Intel MKL is succeeded by Intel oneMKL. This also results in several
changes:

- The versioning scheme has been changed, it now consists of a version
  such as "2021.1.1" and a build such as "52".
- The tarball of RPMs has been replaced by a relatively complex
  installer, so instead we use the RPMs provided by the upstream
  Yum repository.

To better detect breakage, the passthru tests also check static builds
and with parallel (iomp) execution.
This commit is contained in:
Daniël de Kok 2021-03-23 11:50:54 +01:00
parent d527d1d528
commit 6556beb779
2 changed files with 111 additions and 79 deletions

View File

@ -17,40 +17,57 @@
let
# Release notes and download URLs are here:
# https://registrationcenter.intel.com/en/products/
version = "${year}.${spot}.${rel}";
version = "${mklVersion}.${rel}";
# Darwin is pinned to 2019.3 because the DMG does not unpack; see here for details:
# https://github.com/matthewbauer/undmg/issues/4
year = if stdenvNoCC.isDarwin then "2019" else "2020";
spot = if stdenvNoCC.isDarwin then "3" else "4";
rel = if stdenvNoCC.isDarwin then "199" else "304";
mklVersion = if stdenvNoCC.isDarwin then "2019.3" else "2021.1.1";
rel = if stdenvNoCC.isDarwin then "199" else "52";
# Replace `openmpSpot` by `spot` after 2020.
openmpSpot = if stdenvNoCC.isDarwin then spot else "3";
# Intel openmp uses its own versioning.
openmpVersion = if stdenvNoCC.isDarwin then "19.0.3" else "19.1.3";
openmpRel = "189";
rpm-ver = "${year}.${spot}-${rel}-${year}.${spot}-${rel}";
# Intel openmp uses its own versioning, but shares the spot release patch.
openmp = if stdenvNoCC.isDarwin then "19.0" else "19.1";
openmp-ver = "${openmp}.${openmpSpot}-${rel}-${openmp}.${openmpSpot}-${rel}";
# Thread Building Blocks release.
tbbRel = "119";
shlibExt = stdenvNoCC.hostPlatform.extensions.sharedLibrary;
in stdenvNoCC.mkDerivation {
oneapi-mkl = fetchurl {
url = "https://yum.repos.intel.com/oneapi/intel-oneapi-mkl-${mklVersion}-${mklVersion}-${rel}.x86_64.rpm";
hash = "sha256-G2Y7iX3UN2YUJhxcMM2KmhONf0ls9owpGlOo8hHOfqA=";
};
oneapi-mkl-common = fetchurl {
url = "https://yum.repos.intel.com/oneapi/intel-oneapi-mkl-common-${mklVersion}-${mklVersion}-${rel}.noarch.rpm";
hash = "sha256-HrMt2OcPIRxM8EL8SPjYTyuHJnC7RhPFUrvLhRH+7vc=";
};
oneapi-mkl-common-devel = fetchurl {
url = "https://yum.repos.intel.com/oneapi/intel-oneapi-mkl-common-devel-${mklVersion}-${mklVersion}-${rel}.noarch.rpm";
hash = "sha256-XDE2WFJzEcpujFmO2AvqQdipZMvKB6/G+ksBe2sE438=";
};
oneapi-mkl-devel = fetchurl {
url = "https://yum.repos.intel.com/oneapi/intel-oneapi-mkl-devel-${mklVersion}-${mklVersion}-${rel}.x86_64.rpm";
hash = "sha256-GhUJZ0Vr/ZXp10maie29/5ryU7zzX3F++wRCuuFcE0s=";
};
oneapi-openmp = fetchurl {
url = "https://yum.repos.intel.com/oneapi/intel-oneapi-openmp-${mklVersion}-${mklVersion}-${openmpRel}.x86_64.rpm";
hash = "sha256-yP2c4aQAFNRffjLoIZgWXLcNXbiez8smsgu2wXitefU=";
};
oneapi-tbb = fetchurl {
url = "https://yum.repos.intel.com/oneapi/intel-oneapi-tbb-${mklVersion}-${mklVersion}-${tbbRel}.x86_64.rpm";
hash = "sha256-K1BvhGoGVU2Zwy5vg2ZvJWBrSdh5uQwo0znt5039X0A=";
};
in stdenvNoCC.mkDerivation ({
pname = "mkl";
inherit version;
src = if stdenvNoCC.isDarwin
then
(fetchurl {
url = "http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/15235/m_mkl_${version}.dmg";
sha256 = "14b3ciz7995sqcd6jz7hc8g2x4zwvqxmgxgni46vrlb7n523l62f";
})
else
(fetchurl {
url = "https://registrationcenter-download.intel.com/akdlm/irc_nas/tec/16917/l_mkl_${version}.tgz";
hash = "sha256-IxTUZTaXTb0I8qTk+emhVdx+eeJ5jHTn3fqtAKWRfqU=";
});
dontUnpack = stdenvNoCC.isLinux;
nativeBuildInputs = [ validatePkgConfig ] ++ (if stdenvNoCC.isDarwin
then
@ -63,30 +80,15 @@ in stdenvNoCC.mkDerivation {
tar xzvf $f
done
'' else ''
# Common stuff
rpmextract rpm/intel-mkl-core-${rpm-ver}.x86_64.rpm
rpmextract rpm/intel-mkl-common-c-${rpm-ver}.noarch.rpm
rpmextract rpm/intel-mkl-common-f-${rpm-ver}.noarch.rpm
rpmextract ${oneapi-mkl}
rpmextract ${oneapi-mkl-common}
rpmextract ${oneapi-mkl-common-devel}
rpmextract ${oneapi-mkl-devel}
rpmextract ${oneapi-openmp}
rpmextract ${oneapi-tbb}
'';
# Dynamic libraries
rpmextract rpm/intel-mkl-cluster-rt-${rpm-ver}.x86_64.rpm
rpmextract rpm/intel-mkl-core-rt-${rpm-ver}.x86_64.rpm
rpmextract rpm/intel-mkl-gnu-f-rt-${rpm-ver}.x86_64.rpm
rpmextract rpm/intel-mkl-gnu-rt-${rpm-ver}.x86_64.rpm
# Intel OpenMP runtime
rpmextract rpm/intel-openmp-${openmp-ver}.x86_64.rpm
'' + (if enableStatic then ''
# Static libraries
rpmextract rpm/intel-mkl-cluster-${rpm-ver}.x86_64.rpm
rpmextract rpm/intel-mkl-gnu-${rpm-ver}.x86_64.rpm
rpmextract rpm/intel-mkl-gnu-f-${rpm-ver}.x86_64.rpm
'' else ''
# Take care of installing dynamic-only PkgConfig files during the installPhase
''
);
installPhase = ''
installPhase = if stdenvNoCC.isDarwin then ''
for f in $(find . -name 'mkl*.pc') ; do
bn=$(basename $f)
substituteInPlace $f \
@ -95,42 +97,54 @@ in stdenvNoCC.mkDerivation {
--replace "lib/intel64_lin" "lib" \
--replace "lib/intel64" "lib"
done
for f in $(find opt/intel -name 'mkl*iomp.pc') ; do
substituteInPlace $f \
--replace "../compiler/lib" "lib"
done
'' +
(if stdenvNoCC.isDarwin then ''
mkdir -p $out/lib
cp -r compilers_and_libraries_${version}/mac/mkl/include $out/
mkdir -p $out/lib
cp -r compilers_and_libraries_${version}/licensing/mkl/en/license.txt $out/lib/
cp -r compilers_and_libraries_${version}/mac/compiler/lib/* $out/lib/
cp -r compilers_and_libraries_${version}/mac/mkl/lib/* $out/lib/
cp -r compilers_and_libraries_${version}/mac/tbb/lib/* $out/lib/
cp -r compilers_and_libraries_${version}/mac/mkl/include $out/
mkdir -p $out/lib/pkgconfig
cp -r compilers_and_libraries_${version}/mac/mkl/bin/pkgconfig/* $out/lib/pkgconfig
cp -r compilers_and_libraries_${version}/licensing/mkl/en/license.txt $out/lib/
cp -r compilers_and_libraries_${version}/mac/compiler/lib/* $out/lib/
cp -r compilers_and_libraries_${version}/mac/mkl/lib/* $out/lib/
cp -r compilers_and_libraries_${version}/mac/tbb/lib/* $out/lib/
mkdir -p $out/lib/pkgconfig
cp -r compilers_and_libraries_${version}/mac/mkl/bin/pkgconfig/* $out/lib/pkgconfig
'' else ''
mkdir -p $out/lib
cp license.txt $out/lib/
for f in $(find . -name 'mkl*.pc') ; do
bn=$(basename $f)
substituteInPlace $f \
--replace $\{MKLROOT} "$out" \
--replace "lib/intel64" "lib"
cp -r opt/intel/compilers_and_libraries_${version}/linux/mkl/include $out/
sed -r -i "s|^prefix=.*|prefix=$out|g" $f
done
mkdir -p $out/lib/pkgconfig
'') +
for f in $(find opt/intel -name 'mkl*iomp.pc') ; do
substituteInPlace $f --replace "../compiler/lib" "lib"
done
# License
install -Dm0655 -t $out/share/doc/mkl opt/intel/oneapi/mkl/2021.1.1/licensing/en/license.txt
# Dynamic libraries
install -Dm0755 -t $out/lib opt/intel/oneapi/mkl/${mklVersion}/lib/intel64/*.so*
install -Dm0755 -t $out/lib opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/*.so*
install -Dm0755 -t $out/lib opt/intel/oneapi/tbb/2021.1.1/lib/intel64/gcc4.8/*.so*
# Headers
cp -r opt/intel/oneapi/mkl/${mklVersion}/include $out/
'' +
(if enableStatic then ''
cp -r opt/intel/compilers_and_libraries_${version}/linux/compiler/lib/intel64_lin/* $out/lib/
cp -r opt/intel/compilers_and_libraries_${version}/linux/mkl/lib/intel64_lin/* $out/lib/
cp -r opt/intel/compilers_and_libraries_${version}/linux/mkl/bin/pkgconfig/* $out/lib/pkgconfig
install -Dm0644 -t $out/lib opt/intel/oneapi/mkl/${mklVersion}/lib/intel64/*.a
install -Dm0644 -t $out/lib/pkgconfig opt/intel/oneapi/mkl/2021.1.1/tools/pkgconfig/*.pc
'' else ''
cp -r opt/intel/compilers_and_libraries_${version}/linux/compiler/lib/intel64_lin/*.so* $out/lib/
cp -r opt/intel/compilers_and_libraries_${version}/linux/mkl/lib/intel64_lin/*.so* $out/lib/
cp -r opt/intel/compilers_and_libraries_${version}/linux/mkl/bin/pkgconfig/*dynamic*.pc $out/lib/pkgconfig
cp opt/intel/oneapi/mkl/${mklVersion}/lib/intel64/*.so* $out/lib
install -Dm0644 -t $out/lib/pkgconfig opt/intel/oneapi/mkl/2021.1.1/tools/pkgconfig/*dynamic*.pc
'') + ''
# Setup symlinks for blas / lapack
ln -s $out/lib/libmkl_rt${shlibExt} $out/lib/libblas${shlibExt}
ln -s $out/lib/libmkl_rt${shlibExt} $out/lib/libcblas${shlibExt}
@ -159,13 +173,18 @@ in stdenvNoCC.mkDerivation {
dontStrip = true;
dontPatchELF = true;
passthru.tests.pkg-config = callPackage ./test { };
passthru.tests = {
pkg-config-dynamic-iomp = callPackage ./test { enableStatic = false; execution = "iomp"; };
pkg-config-static-iomp = callPackage ./test { enableStatic = true; execution = "iomp"; };
pkg-config-dynamic-seq = callPackage ./test { enableStatic = false; execution = "seq"; };
pkg-config-static-seq = callPackage ./test { enableStatic = true; execution = "seq"; };
};
meta = with lib; {
description = "Intel Math Kernel Library";
description = "Intel OneAPI Math Kernel Library";
longDescription = ''
Intel Math Kernel Library (Intel MKL) optimizes code with minimal effort
for future generations of Intel processors. It is compatible with your
Intel OneAPI Math Kernel Library (Intel oneMKL) optimizes code with minimal
effort for future generations of Intel processors. It is compatible with your
choice of compilers, languages, operating systems, and linking and
threading models.
'';
@ -174,4 +193,9 @@ in stdenvNoCC.mkDerivation {
platforms = [ "x86_64-linux" "x86_64-darwin" ];
maintainers = with maintainers; [ bhipple ];
};
}
} // lib.optionalAttrs stdenvNoCC.isDarwin {
src = fetchurl {
url = "http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/15235/m_mkl_${version}.dmg";
sha256 = "14b3ciz7995sqcd6jz7hc8g2x4zwvqxmgxgni46vrlb7n523l62f";
};
})

View File

@ -1,6 +1,14 @@
{ stdenv, pkg-config, mkl }:
{ stdenv
, pkg-config
, mkl
stdenv.mkDerivation {
, enableStatic ? false
, execution ? "seq"
}:
let
linkType = if enableStatic then "static" else "dynamic";
in stdenv.mkDerivation {
pname = "mkl-test";
version = mkl.version;
@ -8,19 +16,19 @@ stdenv.mkDerivation {
nativeBuildInputs = [ pkg-config ];
buildInputs = [ mkl ];
buildInputs = [ (mkl.override { inherit enableStatic; }) ];
doCheck = true;
buildPhase = ''
# Check regular Nix build.
gcc $(pkg-config --cflags --libs mkl-dynamic-ilp64-seq) test.c -o test
gcc test.c -o test $(pkg-config --cflags --libs mkl-${linkType}-ilp64-${execution})
# Clear flags to ensure that we are purely relying on options
# provided by pkg-config.
NIX_CFLAGS_COMPILE="" \
NIX_LDFLAGS="" \
gcc $(pkg-config --cflags --libs mkl-dynamic-ilp64-seq) test.c -o test
gcc test.c -o test $(pkg-config --cflags --libs mkl-${linkType}-ilp64-${execution})
'';
installPhase = ''