diff --git a/pkgs/development/rocm-modules/5/rocblas/default.nix b/pkgs/development/rocm-modules/5/rocblas/default.nix
index f1cd81df663f..76dc38850d57 100644
--- a/pkgs/development/rocm-modules/5/rocblas/default.nix
+++ b/pkgs/development/rocm-modules/5/rocblas/default.nix
@@ -2,6 +2,7 @@
, stdenv
, fetchFromGitHub
, rocmUpdateScript
+, runCommand
, cmake
, rocm-cmake
, clr
@@ -24,11 +25,147 @@
, tensileLibFormat ? "msgpack"
, gpuTargets ? [ "all" ]
}:
+let
+ rocblas = stdenv.mkDerivation (finalAttrs: {
+ pname = "rocblas";
+ version = "5.7.0";
-# rocBLAS is 3.7GB... I'll have to figure out hydra in another PR
-stdenv.mkDerivation (finalAttrs: {
- pname = "rocblas";
- version = "5.7.0";
+ outputs = [
+ "out"
+ ] ++ lib.optionals buildTests [
+ "test"
+ ] ++ lib.optionals buildBenchmarks [
+ "benchmark"
+ ];
+
+ src = fetchFromGitHub {
+ owner = "ROCmSoftwarePlatform";
+ repo = "rocBLAS";
+ rev = "rocm-${finalAttrs.version}";
+ hash = "sha256-3wKnwvAra8u9xqlC05wUD+gSoBILTVJFU2cIV6xv3Lk=";
+ };
+
+ nativeBuildInputs = [
+ cmake
+ rocm-cmake
+ clr
+ ];
+
+ buildInputs = [
+ python3
+ ] ++ lib.optionals buildTensile [
+ msgpack
+ libxml2
+ python3Packages.msgpack
+ python3Packages.joblib
+ ] ++ lib.optionals buildTests [
+ gtest
+ ] ++ lib.optionals (buildTests || buildBenchmarks) [
+ gfortran
+ openmp
+ amd-blis
+ ] ++ lib.optionals (buildTensile || buildTests || buildBenchmarks) [
+ python3Packages.pyyaml
+ ];
+
+ cmakeFlags = [
+ "-DCMAKE_C_COMPILER=hipcc"
+ "-DCMAKE_CXX_COMPILER=hipcc"
+ "-Dpython=python3"
+ "-DAMDGPU_TARGETS=${lib.concatStringsSep ";" gpuTargets}"
+ "-DBUILD_WITH_TENSILE=${if buildTensile then "ON" else "OFF"}"
+ # Manually define CMAKE_INSTALL_
+ # See: https://github.com/NixOS/nixpkgs/pull/197838
+ "-DCMAKE_INSTALL_BINDIR=bin"
+ "-DCMAKE_INSTALL_LIBDIR=lib"
+ "-DCMAKE_INSTALL_INCLUDEDIR=include"
+ ] ++ lib.optionals buildTensile [
+ "-DVIRTUALENV_HOME_DIR=/build/source/tensile"
+ "-DTensile_TEST_LOCAL_PATH=/build/source/tensile"
+ "-DTensile_ROOT=/build/source/tensile/lib/python${python3.pythonVersion}/site-packages/Tensile"
+ "-DTensile_LOGIC=${tensileLogic}"
+ "-DTensile_CODE_OBJECT_VERSION=${tensileCOVersion}"
+ "-DTensile_SEPARATE_ARCHITECTURES=${if tensileSepArch then "ON" else "OFF"}"
+ "-DTensile_LAZY_LIBRARY_LOADING=${if tensileLazyLib then "ON" else "OFF"}"
+ "-DTensile_LIBRARY_FORMAT=${tensileLibFormat}"
+ ] ++ lib.optionals buildTests [
+ "-DBUILD_CLIENTS_TESTS=ON"
+ ] ++ lib.optionals buildBenchmarks [
+ "-DBUILD_CLIENTS_BENCHMARKS=ON"
+ ] ++ lib.optionals (buildTests || buildBenchmarks) [
+ "-DCMAKE_CXX_FLAGS=-I${amd-blis}/include/blis"
+ ];
+
+ # Tensile REALLY wants to write to the nix directory if we include it normally
+ postPatch = lib.optionalString buildTensile ''
+ cp -a ${tensile} tensile
+ chmod +w -R tensile
+
+ # Rewrap Tensile
+ substituteInPlace tensile/bin/{.t*,.T*,*} \
+ --replace "${tensile}" "/build/source/tensile"
+
+ substituteInPlace CMakeLists.txt \
+ --replace "include(virtualenv)" "" \
+ --replace "virtualenv_install(\''${Tensile_TEST_LOCAL_PATH})" ""
+ '';
+
+ postInstall = lib.optionalString buildTests ''
+ mkdir -p $test/bin
+ cp -a $out/bin/* $test/bin
+ rm $test/bin/*-bench || true
+ '' + lib.optionalString buildBenchmarks ''
+ mkdir -p $benchmark/bin
+ cp -a $out/bin/* $benchmark/bin
+ rm $benchmark/bin/*-test || true
+ '' + lib.optionalString (buildTests || buildBenchmarks ) ''
+ rm -rf $out/bin
+ '';
+
+ passthru.updateScript = rocmUpdateScript {
+ name = finalAttrs.pname;
+ owner = finalAttrs.src.owner;
+ repo = finalAttrs.src.repo;
+ };
+
+ requiredSystemFeatures = [ "big-parallel" ];
+
+ meta = with lib; {
+ description = "BLAS implementation for ROCm platform";
+ homepage = "https://github.com/ROCmSoftwarePlatform/rocBLAS";
+ license = with licenses; [ mit ];
+ maintainers = teams.rocm.members;
+ platforms = platforms.linux;
+ broken = versions.minor finalAttrs.version != versions.minor stdenv.cc.version;
+ };
+ });
+
+ gfx80 = runCommand "rocblas-gfx80" { preferLocalBuild = true; } ''
+ mkdir -p $out/lib/rocblas/library
+ cp -a ${rocblas}/lib/rocblas/library/*gfx80* $out/lib/rocblas/library
+ '';
+
+ gfx90 = runCommand "rocblas-gfx90" { preferLocalBuild = true; } ''
+ mkdir -p $out/lib/rocblas/library
+ cp -a ${rocblas}/lib/rocblas/library/*gfx90* $out/lib/rocblas/library
+ '';
+
+ gfx94 = runCommand "rocblas-gfx94" { preferLocalBuild = true; } ''
+ mkdir -p $out/lib/rocblas/library
+ cp -a ${rocblas}/lib/rocblas/library/*gfx94* $out/lib/rocblas/library
+ '';
+
+ gfx10 = runCommand "rocblas-gfx10" { preferLocalBuild = true; } ''
+ mkdir -p $out/lib/rocblas/library
+ cp -a ${rocblas}/lib/rocblas/library/*gfx10* $out/lib/rocblas/library
+ '';
+
+ gfx11 = runCommand "rocblas-gfx11" { preferLocalBuild = true; } ''
+ mkdir -p $out/lib/rocblas/library
+ cp -a ${rocblas}/lib/rocblas/library/*gfx11* $out/lib/rocblas/library
+ '';
+in stdenv.mkDerivation (finalAttrs: {
+ inherit (rocblas) pname version src passthru meta;
outputs = [
"out"
@@ -38,104 +175,26 @@ stdenv.mkDerivation (finalAttrs: {
"benchmark"
];
- src = fetchFromGitHub {
- owner = "ROCmSoftwarePlatform";
- repo = "rocBLAS";
- rev = "rocm-${finalAttrs.version}";
- hash = "sha256-3wKnwvAra8u9xqlC05wUD+gSoBILTVJFU2cIV6xv3Lk=";
- };
+ dontUnpack = true;
+ dontPatch = true;
+ dontConfigure = true;
+ dontBuild = true;
- nativeBuildInputs = [
- cmake
- rocm-cmake
- clr
- ];
+ installPhase = ''
+ runHook preInstall
- buildInputs = [
- python3
- ] ++ lib.optionals buildTensile [
- msgpack
- libxml2
- python3Packages.msgpack
- python3Packages.joblib
- ] ++ lib.optionals buildTests [
- gtest
- ] ++ lib.optionals (buildTests || buildBenchmarks) [
- gfortran
- openmp
- amd-blis
- ] ++ lib.optionals (buildTensile || buildTests || buildBenchmarks) [
- python3Packages.pyyaml
- ];
-
- cmakeFlags = [
- "-DCMAKE_C_COMPILER=hipcc"
- "-DCMAKE_CXX_COMPILER=hipcc"
- "-Dpython=python3"
- "-DAMDGPU_TARGETS=${lib.concatStringsSep ";" gpuTargets}"
- "-DBUILD_WITH_TENSILE=${if buildTensile then "ON" else "OFF"}"
- # Manually define CMAKE_INSTALL_
- # See: https://github.com/NixOS/nixpkgs/pull/197838
- "-DCMAKE_INSTALL_BINDIR=bin"
- "-DCMAKE_INSTALL_LIBDIR=lib"
- "-DCMAKE_INSTALL_INCLUDEDIR=include"
- ] ++ lib.optionals buildTensile [
- "-DVIRTUALENV_HOME_DIR=/build/source/tensile"
- "-DTensile_TEST_LOCAL_PATH=/build/source/tensile"
- "-DTensile_ROOT=/build/source/tensile/lib/python${python3.pythonVersion}/site-packages/Tensile"
- "-DTensile_LOGIC=${tensileLogic}"
- "-DTensile_CODE_OBJECT_VERSION=${tensileCOVersion}"
- "-DTensile_SEPARATE_ARCHITECTURES=${if tensileSepArch then "ON" else "OFF"}"
- "-DTensile_LAZY_LIBRARY_LOADING=${if tensileLazyLib then "ON" else "OFF"}"
- "-DTensile_LIBRARY_FORMAT=${tensileLibFormat}"
- ] ++ lib.optionals buildTests [
- "-DBUILD_CLIENTS_TESTS=ON"
- ] ++ lib.optionals buildBenchmarks [
- "-DBUILD_CLIENTS_BENCHMARKS=ON"
- ] ++ lib.optionals (buildTests || buildBenchmarks) [
- "-DCMAKE_CXX_FLAGS=-I${amd-blis}/include/blis"
- ];
-
- # Tensile REALLY wants to write to the nix directory if we include it normally
- postPatch = lib.optionalString buildTensile ''
- cp -a ${tensile} tensile
- chmod +w -R tensile
-
- # Rewrap Tensile
- substituteInPlace tensile/bin/{.t*,.T*,*} \
- --replace "${tensile}" "/build/source/tensile"
-
- substituteInPlace CMakeLists.txt \
- --replace "include(virtualenv)" "" \
- --replace "virtualenv_install(\''${Tensile_TEST_LOCAL_PATH})" ""
- '';
-
- postInstall = lib.optionalString buildTests ''
- mkdir -p $test/bin
- cp -a $out/bin/* $test/bin
- rm $test/bin/*-bench || true
+ mkdir -p $out
+ cp -a --no-preserve=mode ${rocblas}/* $out
+ ln -sf ${gfx80}/lib/rocblas/library/* $out/lib/rocblas/library
+ ln -sf ${gfx90}/lib/rocblas/library/* $out/lib/rocblas/library
+ ln -sf ${gfx94}/lib/rocblas/library/* $out/lib/rocblas/library
+ ln -sf ${gfx10}/lib/rocblas/library/* $out/lib/rocblas/library
+ ln -sf ${gfx11}/lib/rocblas/library/* $out/lib/rocblas/library
+ '' + lib.optionalString buildTests ''
+ cp -a ${rocblas.test} $test
'' + lib.optionalString buildBenchmarks ''
- mkdir -p $benchmark/bin
- cp -a $out/bin/* $benchmark/bin
- rm $benchmark/bin/*-test || true
- '' + lib.optionalString (buildTests || buildBenchmarks ) ''
- rm -rf $out/bin
+ cp -a ${rocblas.benchmark} $benchmark
+ '' + ''
+ runHook postInstall
'';
-
- passthru.updateScript = rocmUpdateScript {
- name = finalAttrs.pname;
- owner = finalAttrs.src.owner;
- repo = finalAttrs.src.repo;
- };
-
- requiredSystemFeatures = [ "big-parallel" ];
-
- meta = with lib; {
- description = "BLAS implementation for ROCm platform";
- homepage = "https://github.com/ROCmSoftwarePlatform/rocBLAS";
- license = with licenses; [ mit ];
- maintainers = teams.rocm.members;
- platforms = platforms.linux;
- broken = versions.minor finalAttrs.version != versions.minor stdenv.cc.version;
- };
})