diff --git a/pkgs/development/cuda-modules/packages/nvbandwidth/package.nix b/pkgs/development/cuda-modules/packages/nvbandwidth/package.nix new file mode 100644 index 000000000000..0e36cd50bf28 --- /dev/null +++ b/pkgs/development/cuda-modules/packages/nvbandwidth/package.nix @@ -0,0 +1,87 @@ +{ + lib, + backendStdenv, + fetchFromGitHub, + flags, + + # nativeBuildInputs + cmake, + cuda_nvcc, + + # buildInputs + boost, + cuda_cudart, + cuda_nvml_dev, + + # passthru + nvbandwidth, + + config, + cudaSupport ? config.cudaSupport, +}: +backendStdenv.mkDerivation (finalAttrs: { + pname = "nvbandwidth"; + version = "0.9"; + + __structuredAttrs = true; + strictDeps = true; + + src = fetchFromGitHub { + owner = "NVIDIA"; + repo = "nvbandwidth"; + tag = "v${finalAttrs.version}"; + hash = "sha256-j1bKWXHIkjsE/M+w5rRF0UGjkj1gLA2yi+5hc1sWl/A="; + }; + + patches = [ + # Force a dynamic Boost build and link against the CUDA driver / NVML stubs via the CMake + # imported targets exposed by `find_package(CUDAToolkit)`. + ./use-cuda-imported-targets.patch + ]; + + nativeBuildInputs = [ + cmake + cuda_nvcc + ]; + + cmakeFlags = [ + (lib.cmakeFeature "CMAKE_CUDA_ARCHITECTURES" flags.cmakeCudaArchitecturesString) + ]; + + buildInputs = [ + boost + cuda_cudart # cuda_runtime.h, libcuda stub + cuda_nvml_dev # libnvidia-ml + ]; + + installPhase = '' + runHook preInstall + + install -Dm755 nvbandwidth -t $out/bin + + runHook postInstall + ''; + + passthru.gpuCheck = nvbandwidth.overrideAttrs (_: { + requiredSystemFeatures = [ "cuda" ]; + doInstallCheck = true; + postInstallCheck = '' + $out/bin/${nvbandwidth.meta.mainProgram} + ''; + + # Failing (probably a sandbox limitation): + # hwloc/linux: failed to find sysfs cpu topology directory, aborting linux discovery. + meta.broken = true; + }); + + meta = { + description = "Tool for bandwidth measurements on NVIDIA GPUs"; + homepage = "https://github.com/NVIDIA/nvbandwidth"; + changelog = "https://github.com/NVIDIA/nvbandwidth/blob/${finalAttrs.src.tag}/CHANGELOG.md"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ GaetanLepage ]; + mainProgram = "nvbandwidth"; + platforms = lib.platforms.linux; + broken = !cudaSupport; + }; +}) diff --git a/pkgs/development/cuda-modules/packages/nvbandwidth/use-cuda-imported-targets.patch b/pkgs/development/cuda-modules/packages/nvbandwidth/use-cuda-imported-targets.patch new file mode 100644 index 000000000000..f0707cc4021f --- /dev/null +++ b/pkgs/development/cuda-modules/packages/nvbandwidth/use-cuda-imported-targets.patch @@ -0,0 +1,47 @@ +Use CMake imported targets and disable the static Boost build. + +The upstream link command `target_link_libraries(... ${NVML_LIB_NAME} cuda)` +expands to plain `-lnvidia-ml -lcuda`, which forces the linker to look up +those names on its search path. The corresponding stubs live in non-standard +`*/lib/stubs` directories that aren't on the Nix linker search path, so the +build fails. Switching to the `CUDA::nvml` / `CUDA::cuda_driver` imported +targets exposed by `find_package(CUDAToolkit)` makes CMake link against the +absolute stub paths it discovers via `CUDAToolkit_ROOT` instead. + +The static-Boost branch is also dropped: it dispatches on `/etc/os-release`, +which doesn't exist in the Nix sandbox, and we want a dynamic build anyway. +--- + CMakeLists.txt | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -43,16 +43,11 @@ + set(CMAKE_BUILD_TYPE "Release") + endif() + +-if(CMAKE_SYSTEM_NAME STREQUAL "Linux") +- file(READ "/etc/os-release" OS_RELEASE_CONTENT) +- # Skip static libs on Fedora - https://github.com/NVIDIA/nvbandwidth/issues/4 +- if(NOT OS_RELEASE_CONTENT MATCHES "ID=.*fedora|azurelinux") +- set(Boost_USE_STATIC_LIBS ON) +- endif() +-else() ++if(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(Boost_USE_STATIC_LIBS ON) + endif() + find_package(Boost COMPONENTS program_options REQUIRED) ++find_package(CUDAToolkit REQUIRED) + + set(src + environment.cpp +@@ -85,7 +80,7 @@ + + add_executable(nvbandwidth ${src}) + target_include_directories(nvbandwidth PRIVATE ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} .) +-target_link_libraries(nvbandwidth Boost::program_options ${NVML_LIB_NAME} cuda) ++target_link_libraries(nvbandwidth Boost::program_options CUDA::nvml CUDA::cuda_driver) + + if (MULTINODE) + find_package(MPI REQUIRED)