From 6556beb77968eee00c6c83db8b8c880a5e6b83e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20de=20Kok?= Date: Tue, 23 Mar 2021 11:50:54 +0100 Subject: [PATCH] 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. --- .../libraries/science/math/mkl/default.nix | 172 ++++++++++-------- .../science/math/mkl/test/default.nix | 18 +- 2 files changed, 111 insertions(+), 79 deletions(-) diff --git a/pkgs/development/libraries/science/math/mkl/default.nix b/pkgs/development/libraries/science/math/mkl/default.nix index 34fea3162a9c..1f60f4d95388 100644 --- a/pkgs/development/libraries/science/math/mkl/default.nix +++ b/pkgs/development/libraries/science/math/mkl/default.nix @@ -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"; + }; +}) diff --git a/pkgs/development/libraries/science/math/mkl/test/default.nix b/pkgs/development/libraries/science/math/mkl/test/default.nix index 688c0ec7c399..cb3355260d12 100644 --- a/pkgs/development/libraries/science/math/mkl/test/default.nix +++ b/pkgs/development/libraries/science/math/mkl/test/default.nix @@ -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 = ''