bscpkgs/pkgs/intel-mpi/default.nix

105 lines
2.7 KiB
Nix
Raw Normal View History

2020-06-30 02:46:30 +08:00
{ stdenv
, rpmextract
2020-07-01 23:57:31 +08:00
, gcc
, zlib
2020-08-18 00:51:51 +08:00
, ucx
, numactl
, rdma-core
, libpsm2
, patchelf
2020-07-01 23:57:31 +08:00
, autoPatchelfHook
2020-06-30 02:46:30 +08:00
, enableDebug ? false
# The _mt version seems to cause seg-faults and deadlocks with the libpsm2
# provider library with programs that call the MPI library without any locking
# mechanism. See https://pm.bsc.es/gitlab/rarias/bscpkgs/-/issues/28. By
# default, we use the non-mt variant, which provides a big lock. If you want to
# use it, take a look at the I_MPI_THREAD_SPLIT env-var as well.
, enableMt ? false
2020-06-30 02:46:30 +08:00
}:
let
lib_variant = (if enableDebug then "debug" else "release");
# See https://software.intel.com/content/www/us/en/develop/documentation/mpi-developer-reference-linux/top/environment-variable-reference/other-environment-variables.html
lib_mt = (if enableMt then "_mt" else "");
lib_name = "${lib_variant}${lib_mt}";
in
2020-06-30 02:46:30 +08:00
stdenv.mkDerivation rec {
name = "intel-mpi-${version}";
2021-02-05 17:16:57 +08:00
version = "2019.10.317";
dir_nr = "17534";
2020-06-30 02:46:30 +08:00
2020-07-24 00:47:20 +08:00
src = builtins.fetchTarball {
2020-08-18 00:51:51 +08:00
url = "http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/${dir_nr}/l_mpi_${version}.tgz";
2021-02-05 17:16:57 +08:00
sha256 = "00nimgqywr20dv1ns5kg4r8539gvharn0xfj48i7mhbg8kwf8s08";
2020-06-30 02:46:30 +08:00
};
buildInputs = [
rpmextract
2020-07-01 23:57:31 +08:00
autoPatchelfHook
gcc.cc.lib
zlib
2020-08-18 00:51:51 +08:00
ucx
numactl
rdma-core
libpsm2
patchelf
];
postUnpack = ''
pushd $sourceRoot
rpmextract rpm/intel-mpi-*.rpm
2021-02-05 17:16:57 +08:00
# Predictable name
mv opt/intel/compilers_and_libraries_* opt/intel/compilers_and_libraries
popd
2021-02-05 17:16:57 +08:00
sourceRoot="$sourceRoot/opt/intel/compilers_and_libraries/linux/mpi/intel64"
'';
2020-06-30 02:46:30 +08:00
patches = [
./mpicc.patch
./mpicxx.patch
];
postPatch = ''
2021-02-05 17:16:57 +08:00
for i in bin/mpi* ; do
echo "Fixing paths in $i"
sed -i "s:I_MPI_SUBSTITUTE_INSTALLDIR:$out:g" "$i"
done
'';
2020-06-30 02:46:30 +08:00
dontBuild = true;
installPhase = ''
mkdir -p $out
2020-06-30 02:46:30 +08:00
mv etc $out
mv bin $out
mv include $out
mkdir $out/lib
cp -a lib/lib* $out/lib
cp -a lib/${lib_name}/lib* $out/lib
2020-08-18 00:51:51 +08:00
cp -a libfabric/lib/* $out/lib
cp -a libfabric/lib/prov/* $out/lib
cp -a libfabric/bin/* $out/bin
ln -s . $out/intel64
2020-07-01 23:57:31 +08:00
rm $out/lib/libmpi.dbg
2020-08-18 00:51:51 +08:00
# Fixup Intel PSM2 library missing (now located at PSMX2)
ln -s $out/lib/libpsmx2-fi.so $out/lib/libpsm2-fi.so
'';
dontAutoPatchelf = true;
# The rpath of libfabric.so bundled with Intel MPI is patched to include the
# rdma-core lib path, as is required for dlopen to find the rdma components.
# TODO: Try the upstream libfabric library with rdma support, so we can avoid
# this hack.
postFixup = ''
autoPatchelf -- $out
patchelf --set-rpath "$out/lib:${rdma-core}/lib:${libpsm2}/lib" $out/lib/libfabric.so
echo "Patched RPATH in libfabric.so to: $(patchelf --print-rpath $out/lib/libfabric.so)"
2020-06-30 02:46:30 +08:00
'';
}