By default, MAGMA builds against compute capability 3.0 (among other capabilities). However, support for this capability was dropped in CUDA 11. This change fixes CUDA 11 support by excluding 3.0. While at it, this change also adds support for newer compute capabilities that are not enabled by MAGMA by default (to support older CUDA versions).
90 lines
2.6 KiB
Nix
90 lines
2.6 KiB
Nix
{ lib, stdenv, fetchurl, cmake, gfortran, ninja, cudatoolkit, libpthreadstubs, lapack, blas }:
|
|
|
|
assert let majorIs = lib.versions.major cudatoolkit.version;
|
|
in majorIs == "9" || majorIs == "10" || majorIs == "11";
|
|
|
|
let
|
|
version = "2.5.4";
|
|
|
|
# We define a specific set of CUDA compute capabilities here,
|
|
# because CUDA 11 does not support compute capability 3.0. Also,
|
|
# we use it to enable newer capabilities that are not enabled
|
|
# by magma by default. The list of supported architectures
|
|
# can be found in magma's top-level CMakeLists.txt.
|
|
cudaCapabilities = rec {
|
|
cuda9 = [
|
|
"Kepler" # 3.0, 3.5
|
|
"Maxwell" # 5.0
|
|
"Pascal" # 6.0
|
|
"Volta" # 7.0
|
|
];
|
|
|
|
cuda10 = [
|
|
"Turing" # 7.5
|
|
] ++ cuda9;
|
|
|
|
cuda11 = [
|
|
"sm_35" # sm_30 is not supported by CUDA 11
|
|
"Maxwell" # 5.0
|
|
"Pascal" # 6.0
|
|
"Volta" # 7.0
|
|
"Turing" # 7.5
|
|
"Ampere" # 8.0
|
|
];
|
|
};
|
|
|
|
capabilityString = lib.strings.concatStringsSep ","
|
|
cudaCapabilities."cuda${lib.versions.major cudatoolkit.version}";
|
|
|
|
in stdenv.mkDerivation {
|
|
pname = "magma";
|
|
inherit version;
|
|
src = fetchurl {
|
|
url = "https://icl.cs.utk.edu/projectsfiles/magma/downloads/magma-${version}.tar.gz";
|
|
sha256 = "0rrvd21hczxlm8awc9z54fj7iqpjmsb518fy32s6ghz0g90znd3p";
|
|
name = "magma-${version}.tar.gz";
|
|
};
|
|
|
|
nativeBuildInputs = [ gfortran cmake ninja ];
|
|
|
|
buildInputs = [ cudatoolkit libpthreadstubs lapack blas ];
|
|
|
|
cmakeFlags = [ "-DGPU_TARGET=${capabilityString}" ];
|
|
|
|
doCheck = false;
|
|
|
|
preConfigure = ''
|
|
export CC=${cudatoolkit.cc}/bin/gcc CXX=${cudatoolkit.cc}/bin/g++
|
|
'';
|
|
|
|
enableParallelBuilding=true;
|
|
buildFlags = [ "magma" "magma_sparse" ];
|
|
|
|
# MAGMA's default CMake setup does not care about installation. So we copy files directly.
|
|
installPhase = ''
|
|
mkdir -p $out
|
|
mkdir -p $out/include
|
|
mkdir -p $out/lib
|
|
mkdir -p $out/lib/pkgconfig
|
|
cp -a ../include/*.h $out/include
|
|
#cp -a sparse-iter/include/*.h $out/include
|
|
cp -a lib/*.so $out/lib
|
|
cat ../lib/pkgconfig/magma.pc.in | \
|
|
sed -e s:@INSTALL_PREFIX@:"$out": | \
|
|
sed -e s:@CFLAGS@:"-I$out/include": | \
|
|
sed -e s:@LIBS@:"-L$out/lib -lmagma -lmagma_sparse": | \
|
|
sed -e s:@MAGMA_REQUIRED@:: \
|
|
> $out/lib/pkgconfig/magma.pc
|
|
'';
|
|
|
|
meta = with lib; {
|
|
description = "Matrix Algebra on GPU and Multicore Architectures";
|
|
license = licenses.bsd3;
|
|
homepage = "http://icl.cs.utk.edu/magma/index.html";
|
|
platforms = platforms.unix;
|
|
maintainers = with maintainers; [ tbenst ];
|
|
};
|
|
|
|
passthru.cudatoolkit = cudatoolkit;
|
|
}
|