2025-07-24 13:55:40 +02:00

185 lines
4.8 KiB
Nix

{
config,
cmake,
cudaPackages,
fetchFromGitHub,
lib,
ninja,
python3Packages ? { },
pythonSupport ? false,
stdenv,
symlinkJoin,
which,
}:
let
inherit (lib) lists strings;
inherit (cudaPackages) backendStdenv cudaAtLeast flags;
cuda-common-redist = with cudaPackages; [
(lib.getDev cuda_cudart) # cuda_runtime.h
(lib.getLib cuda_cudart)
(lib.getDev cuda_cccl) # <nv/target>
(lib.getDev libcublas) # cublas_v2.h
(lib.getLib libcublas)
(lib.getDev libcusolver) # cusolverDn.h
(lib.getLib libcusolver)
(lib.getDev libcusparse) # cusparse.h
(lib.getLib libcusparse)
];
cuda-native-redist = symlinkJoin {
name = "cuda-redist";
paths = with cudaPackages; [ cuda_nvcc ] ++ cuda-common-redist;
};
cuda-redist = symlinkJoin {
name = "cuda-redist";
paths = cuda-common-redist;
};
unsupportedCudaCapabilities = [
"9.0a"
];
cudaCapabilities = lists.subtractLists unsupportedCudaCapabilities flags.cudaCapabilities;
cudaArchitecturesString = strings.concatMapStringsSep ";" flags.dropDots cudaCapabilities;
in
stdenv.mkDerivation (finalAttrs: {
pname = "tiny-cuda-nn";
version = "1.6";
strictDeps = true;
format = strings.optionalString pythonSupport "setuptools";
src = fetchFromGitHub {
owner = "NVlabs";
repo = "tiny-cuda-nn";
rev = "v${finalAttrs.version}";
fetchSubmodules = true;
hash = "sha256-qW6Fk2GB71fvZSsfu+mykabSxEKvaikZ/pQQZUycOy0=";
};
# Remove this once a release is made with
# https://github.com/NVlabs/tiny-cuda-nn/commit/78a14fe8c292a69f54e6d0d47a09f52b777127e1
postPatch = lib.optionals (cudaAtLeast "11.0") ''
substituteInPlace bindings/torch/setup.py --replace-fail \
"-std=c++14" "-std=c++17"
'';
nativeBuildInputs = [
cmake
cuda-native-redist
ninja
which
]
++ lists.optionals pythonSupport (
with python3Packages;
[
pip
setuptools
wheel
]
);
buildInputs = [
cuda-redist
]
++ lib.optionals pythonSupport (
with python3Packages;
[
pybind11
python
]
);
propagatedBuildInputs = lib.optionals pythonSupport (
with python3Packages;
[
torch
]
);
# NOTE: We cannot use pythonImportsCheck for this module because it uses torch to immediately
# initialize CUDA and GPU access is not allowed in the nix build environment.
# NOTE: There are no tests for the C++ library or the python bindings, so we just skip the check
# phase -- we're not missing anything.
doCheck = false;
preConfigure = ''
export TCNN_CUDA_ARCHITECTURES="${cudaArchitecturesString}"
export CUDA_HOME="${cuda-native-redist}"
export LIBRARY_PATH="${cuda-native-redist}/lib/stubs:$LIBRARY_PATH"
export CC="${backendStdenv.cc}/bin/cc"
export CXX="${backendStdenv.cc}/bin/c++"
'';
# When building the python bindings, we cannot re-use the artifacts from the C++ build so we
# skip the CMake configurePhase and the buildPhase.
dontUseCmakeConfigure = pythonSupport;
# The configurePhase usually puts you in the build directory, so for the python bindings we
# need to change directories to the source directory.
configurePhase = strings.optionalString pythonSupport ''
runHook preConfigure
mkdir -p "$NIX_BUILD_TOP/build"
cd "$NIX_BUILD_TOP/build"
runHook postConfigure
'';
buildPhase = strings.optionalString pythonSupport ''
runHook preBuild
python -m pip wheel \
--no-build-isolation \
--no-clean \
--no-deps \
--no-index \
--verbose \
--wheel-dir "$NIX_BUILD_TOP/build" \
"$NIX_BUILD_TOP/source/bindings/torch"
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p "$out/lib"
''
# Installing the C++ library just requires copying the static library to the output directory
+ strings.optionalString (!pythonSupport) ''
cp libtiny-cuda-nn.a "$out/lib/"
''
# Installing the python bindings requires building the wheel and installing it
+ strings.optionalString pythonSupport ''
python -m pip install \
--no-build-isolation \
--no-cache-dir \
--no-deps \
--no-index \
--no-warn-script-location \
--prefix="$out" \
--verbose \
./*.whl
''
+ ''
runHook postInstall
'';
passthru = {
inherit cudaPackages;
};
meta = with lib; {
description = "Lightning fast C++/CUDA neural network framework";
homepage = "https://github.com/NVlabs/tiny-cuda-nn";
license = licenses.bsd3;
maintainers = with maintainers; [ connorbaker ];
platforms = platforms.linux;
badPlatforms = [
# g++: error: unrecognized command-line option '-mf16c'
lib.systems.inspect.patterns.isAarch64
];
# Requires torch.cuda._is_compiled() == True to build
broken = !config.cudaSupport;
};
})