Merge branch 'cuda' into 'master'

cuda : Add cuda-toolkit and its split packages.

See merge request nonguix/nonguix!497
This commit is contained in:
Nicolas Graves 2025-01-09 14:32:33 +00:00
commit 6716b878b0
12 changed files with 2386 additions and 2 deletions

189
guix/import/cuda.scm Normal file
View File

@ -0,0 +1,189 @@
;;; SPDX-License-Identifier: GPL-3.0-or-later
;;; Copyright © 2025 Nicolas Graves <ngraves@ngraves.fr>
;;; This file is not part of GNU Guix but requires this naming scheme
;;; so that the %cuda-updater is properly read when using
;;; `guix refresh -L$(pwd) cuda-cccl' in nonguix root.
(define-module (guix import cuda)
#:use-module (gcrypt hash)
#:use-module (gnu packages)
#:use-module (guix base16)
#:use-module (guix base32)
#:use-module (guix http-client)
#:use-module (guix import json)
#:use-module (guix import utils)
#:use-module (guix memoization)
#:use-module (guix packages)
#:use-module (guix records)
#:use-module (guix upstream)
#:use-module (guix utils)
#:use-module (ice-9 match)
#:use-module (ice-9 regex)
#:use-module (ice-9 textual-ports)
#:use-module (json)
#:use-module (nonguix build-system cuda)
#:use-module (srfi srfi-1)
#:export (%cuda-updater))
(define %cuda-repository-url
"https://developer.download.nvidia.com/compute/cuda/redist/")
(define (cuda-system->guix-system system)
(match system
("linux-x86_64" "x86_64-linux")
("linux-aarch64" "aarch64-linux")
("linux-ppc64le" "powerpc64le-linux")
(_ #f)))
(define (valid-version? version-string)
(false-if-exception (version-prefix version-string 3)))
(define-record-type* <cuda-package>
cuda-package make-cuda-package
cuda-package? this-cuda-package
(name cuda-package-name)
(version cuda-package-version valid-version?)
(hash-info cuda-package-hash-info cuda-hash-info?))
(define-record-type* <cuda-hash-info>
cuda-hash-info make-cuda-hash-info
cuda-hash-info? this-cuda-hash-info
(system cuda-hash-info-system)
(sha256 cuda-hash-info-sha256))
(define (cuda-toolkit-latest-version)
(let* ((url (string-append %cuda-repository-url "index.html"))
(port (http-fetch url #:text? #t)) ; FIXME no error management
(html (get-string-all port))
(regex "redistrib_[0-9.]*.json")
(file-string
(fold-matches regex html ""
(lambda (matching void)
(match:substring matching))))
(version-string
(string-drop-right
(string-drop file-string (string-length "redistrib_"))
(string-length ".json"))))
(close-port port)
version-string))
(define (cuda-json-pkg-alist->cuda-package cuda-pkg-alist)
(make-cuda-package
(snake-case (first cuda-pkg-alist))
(assoc-ref cuda-pkg-alist "version")
(filter
identity
(map (lambda (system)
(let ((inner-alist (assoc-ref cuda-pkg-alist system)))
(if inner-alist
(make-cuda-hash-info
(cuda-system->guix-system system)
(bytevector->nix-base32-string
(base16-string->bytevector
(assoc-ref inner-alist "sha256"))))
#f)))
(list "linux-x86_64" "linux-aarch64" "linux-ppc64le")))))
(define cuda-db-fetch
(memoize
(lambda (toolkit-version)
(map
cuda-json-pkg-alist->cuda-package
(filter list?
(json-fetch
(string-append %cuda-repository-url
"redistrib_" toolkit-version ".json")))))))
(define (cuda-fetch name tk-version)
(let ((candidates (filter
(lambda (pkg) (equal? (cuda-package-name pkg) name))
(cuda-db-fetch tk-version))))
(and (not (null? candidates)) (car candidates))))
(define* (latest-release package #:key (version #f))
"Return an <upstream-source> for the latest-release of PACKAGE."
(let* ((name (package-name package))
(version (or version (cuda-toolkit-latest-version)))
(package (cuda-fetch name version))
(version (and=> package cuda-package-version)))
(and version
(upstream-source
(package name)
(version version)
(urls (list (cuda-module-url name version)))))))
(define (make-cuda-sexp cuda-package)
`(define-public ,(string->symbol (cuda-package-name cuda-package))
(package
(name ,(cuda-package-name cuda-package))
(version ,(cuda-package-version cuda-package))
(source
(origin
(method url-fetch)
(uri (cuda-module-url name version))
(sha256
(base32
(match (or (%current-target-system) (%current-system))
,@(map
(lambda (info)
(list (cuda-hash-info-system info)
(cuda-hash-info-sha256 info)))
(cuda-package-hash-info cuda-package)))))))
(build-system cuda-build-system)
(synopsis #f)
(description #f)
(home-page "https://developer.nvidia.com/cuda-toolkit")
(license (cuda-license name)))))
(define (guix-name->cuda-name package)
(string-join (string-split package #\-) "_"))
(define (cuda-package? package)
"Return true if PACKAGE is a CUDA Toolkit package."
(eq? (package-build-system package) cuda-build-system))
(define %cuda-updater
(upstream-updater
(name 'cuda)
(description "Updater for Cuda packages")
(pred cuda-package?)
(import latest-release)))
;; The issue with guix native importer is that it will only update
;; the x64_86 hash, but we do have different sources based on
;; (%current-target-system).
;; To update all hashes of a package, use:
;; (make-cuda-sexp (cuda-fetch "cuda-profiler-api" "12.1.1"))
;; To update all hashes of all packages, use:
;; (use-modules (ice-9 pretty-print))
;; (for-each
;; (lambda (name)
;; (pretty-print (make-cuda-sexp (cuda-fetch name "12.1.1"))))
;; '("cuda-cccl"
;; "cuda-cudart"
;; "cuda-cuobjdump"
;; "cuda-cuxxfilt"
;; "cuda-cupti"
;; "cuda-gdb"
;; "cuda-nvcc"
;; "cuda-nvml-dev"
;; "cuda-nvdisasm"
;; "cuda-nvprune"
;; "cuda-nvrtc"
;; "cuda-nvtx"
;; "cuda-opencl"
;; "cuda-sanitizer-api"
;; "libcublas"
;; "libcufft"
;; "libcurand"
;; "libcusolver"
;; "libcusparse"
;; ;; "libnvfatbin"
;; "libnvjitlink"
;; "libnvjpeg"
;; "libnpp"))
;; cuda.scm ends here.

View File

@ -0,0 +1,232 @@
;;; SPDX-License-Identifier: GPL-3.0-or-later
;;; Copyright © 2024 Nicolas Graves <ngraves@ngraves.fr>
(define-module (nongnu packages machine-learning)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix gexp)
#:use-module (guix packages)
#:use-module (guix utils)
#:use-module (guix build-system cmake)
#:use-module (guix build-system copy)
#:use-module (guix build-system gnu)
#:use-module (guix build-system python)
#:use-module (guix git-download)
#:use-module (gnu packages)
#:use-module (gnu packages check)
#:use-module (gnu packages cpp)
#:use-module (gnu packages libevent)
#:use-module (gnu packages machine-learning)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages python-xyz)
#:use-module (gnu packages serialization)
#:use-module (nongnu packages nvidia)
#:use-module (ice-9 match))
(define-public gloo-cuda
(let ((version "0.0.0") ; no proper version tag
(commit "e6d509b527712a143996f2f59a10480efa804f8b")
(revision "2"))
(package
(name "gloo-cuda")
(version (git-version version revision commit))
(source
(origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/facebookincubator/gloo")
(commit commit)))
(file-name (git-file-name name version))
(sha256
(base32
"11ywsn1lrd1cpzm1iwvin2c5l962zib5bd852vl54bp12a0w6klj"))))
(build-system cmake-build-system)
(native-inputs
(list googletest))
(inputs
(modify-inputs (package-inputs gloo)
(append cuda-toolkit nvidia-nccl)))
(arguments
(substitute-keyword-arguments (package-arguments gloo)
((#:configure-flags flags ''())
#~(cons "-DUSE_CUDA=ON" #$flags))))
(synopsis "Collective communications library")
(description
"Gloo is a collective communications library. It comes with a
number of collective algorithms useful for machine learning applications.
These include a barrier, broadcast, and allreduce.
Note: This package provides NVIDIA GPU support.")
(home-page "https://github.com/facebookincubator/gloo")
(license license:bsd-3))))
(define %python-pytorch-version "2.4.0")
(define %python-pytorch-src
(origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/pytorch/pytorch")
(commit (string-append "v" %python-pytorch-version))))
(file-name (git-file-name "python-pytorch" %python-pytorch-version))
(sha256
(base32
"18hdhzr12brj0b7ppyiscax0dbra30207qx0cckw78midfkcn7cn"))
(patches (search-patches "python-pytorch-system-libraries.patch"
"python-pytorch-runpath.patch"
"python-pytorch-without-kineto.patch"
;; Some autogeneration scripts depend on the
;; compile PyTorch library. Therefore, we create
;; dummy versions which are regenerated later.
"python-pytorch-fix-codegen.patch"))
(modules '((guix build utils)))
(snippet
'(begin
;; Bundled or unused code
(for-each
(lambda (dir)
(when (file-exists? dir)
(delete-file-recursively dir)))
'("android"
;; "aten/src/ATen/native/cuda/cutlass_extensions"
"aten/src/ATen/native/quantized/cpu/qnnpack"
"caffe2/mobile/contrib/libopencl-stub"
"caffe2/mobile/contrib/libvulkan-stub"
"third_party"))
;; Autogenerated files
(for-each
delete-file
'("aten/src/ATen/nnapi/nnapi_wrapper.cpp"
"aten/src/ATen/nnapi/nnapi_wrapper.h"
;; These files contain just lists of floating point values and
;; might be as well hand-written.
;; "test/cpp/api/init_baseline.h"
;; "test/cpp/api/optim_baseline.h"
"test/mobile/test_upgrader_bytecode_table_example.cpp"
"torch/csrc/jit/mobile/upgrader_mobile.cpp"
"torch/csrc/jit/runtime/decomposition_registry_util.cpp"
"torch/csrc/jit/runtime/serialized_shape_function_registry.cpp"
"torch/csrc/jit/tensorexpr/external_functions_codegen.cpp"
"torch/csrc/jit/serialization/mobile_bytecode_generated.h"))
(delete-file-recursively ".github")
;; These files are needed for CUDA.
;; (for-each
;; (lambda (dir)
;; (for-each
;; delete-file
;; (find-files dir "\\.cu$")))
;; '("aten/src/ATen/native/transformers/cuda/flash_attn/kernels"
;; "aten/src/ATen/native/transformers/cuda/mem_eff_attention/kernels"))
))))
(define-public python-pytorch-cuda
(package
(name "python-pytorch-cuda")
(version %python-pytorch-version)
(source %python-pytorch-src)
(build-system python-build-system)
(arguments
(substitute-keyword-arguments (package-arguments python-pytorch)
((#:phases phases)
#~(modify-phases #$phases
(add-after 'cmake-patches 'cuda-cmake-patches
(lambda _
;; XXX: Currently nvidia-cudnn-frontend doesn't install CMake
;; configuration files, we must add unbundled nlohmann-json.
;; Additionally, it won't work without CUDNN_INCLUDE_DIR.
(substitute* "cmake/Dependencies.cmake"
(("set\\(CUDNN_FRONTEND_INCLUDE_DIR.*$")
(format #f "set(CUDNN_FRONTEND_INCLUDE_DIR ~a/include)
target_include_directories(torch::cudnn INTERFACE
${CUDNN_INCLUDE_DIR} ${~a/include}
)~%"
#$(this-package-input "nvidia-cudnn-frontend")
#$(this-package-input "nlohmann-json"))))
;; XXX: Link the right include dir for cutlass.
(substitute* "aten/src/ATen/CMakeLists.txt"
(("\
\\$\\{CMAKE_CURRENT_SOURCE_DIR\\}/\\.\\./\\.\\./\\.\\./third_party/cutlass")
#$(this-package-input "nvidia-cutlass")))
;; XXX: Not linking gtest+gtest_main breaks compilation
(substitute* '("c10/cuda/test/CMakeLists.txt"
"caffe2/CMakeLists.txt")
(("target_link_libraries\\((.* gtest_main)\\)" all content)
(format #f "target_link_libraries(~a gtest)"
content)))))
(add-after 'use-system-libraries 'use-cuda-libraries
(lambda _
(setenv "USE_CUDA" "1")
(setenv "CUDA_HOME" #$(this-package-input "cuda-dev"))
(setenv "CUDA_TOOLKIT_ROOT_DIR"
#$(this-package-input "cuda-dev"))
(setenv "CUDA_USE_STATIC_CUDA_RUNTIME" "0")
(setenv "CUDA_PROPAGATE_HOST_FLAGS" "0")
(setenv "CUSPARSELT_LIBRARY"
#$(file-append
(this-package-input "cuda-dev") "/lib"))
(setenv "CUSPARSELT_INCLUDE_DIR"
#$(file-append
(this-package-input "cuda-dev") "/include"))
(setenv "USE_CUDNN" "1")
(setenv "CUDNN_LIB_DIR"
#$(file-append
(this-package-input "nvidia-cudnn") "/lib"))
(setenv "CUDNN_INCLUDE_DIR"
#$(file-append
(this-package-input "nvidia-cudnn") "/include"))
;; XXX: 3.5, 5.0 and 9.0a break tests compilation
;; See https://github.com/pytorch/pytorch/issues/113948
(setenv "TORCH_CUDA_ARCH_LIST" "8.0 8.6 8.9 9.0")
;; XXX: Current cutlass package doesn't have necessary
;; headers to enable this option.
(setenv "USE_ROCM" "0")))))))
(native-inputs (package-native-inputs python-pytorch))
(inputs
(modify-inputs (package-inputs python-pytorch)
(replace "tensorpipe" tensorpipe-cuda)
(replace "gloo" gloo-cuda)
(append nvidia-cudnn
nvidia-cudnn-frontend
cuda-dev
nlohmann-json
nvidia-cutlass
nvidia-nccl)))
(propagated-inputs (package-propagated-inputs python-pytorch))
(home-page "https://pytorch.org/")
(synopsis "Python library for tensor computation and deep neural networks")
(description
"PyTorch is a Python package that provides two high-level features:
@itemize
@item tensor computation (like NumPy) with strong GPU acceleration;
@item deep neural networks (DNNs) built on a tape-based autograd system.
@end itemize
You can reuse Python packages such as NumPy, SciPy, and Cython to extend
PyTorch when needed.
Note: This package provides NVIDIA GPU support.")
(license license:bsd-3)))
(define-public tensorpipe-cuda
(package
(name "tensorpipe-cuda")
(version (package-version tensorpipe))
(source (package-source tensorpipe))
(build-system cmake-build-system)
(arguments
(list
#:configure-flags
''("-DBUILD_SHARED_LIBS=ON" "-DTP_USE_CUDA=1")
;; There are no tests
#:tests? #f))
(inputs (list cuda-nvml-dev cuda-toolkit libuv))
(native-inputs (list googletest pkg-config pybind11 libnop))
(home-page "https://github.com/pytorch/tensorpipe")
(synopsis "Tensor-aware point-to-point communication primitive for
machine learning")
(description "TensorPipe provides a tensor-aware channel to transfer
rich objects from one process to another while using the fastest transport for
the tensors contained therein.
Note: This version includes NVIDIA CUDA API and headers.")
(license license:bsd-3)))

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,43 @@
From 1b73d8d74b3ec7949e21d926d28385543c202dc7 Mon Sep 17 00:00:00 2001
From: Nicolas Graves <ngraves@ngraves.fr>
Date: Thu, 25 Jul 2024 14:33:24 +0200
Subject: [PATCH] Find dlpack package instead of building it.
---
python/CMakeLists.txt | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index cdfbf55..4168411 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -2,15 +2,8 @@ cmake_minimum_required(VERSION 3.18)
Include(FetchContent)
-# Fetch and build dlpack
-set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
-set(BUILD_MOCK OFF)
-FetchContent_Declare(
- dlpack
- GIT_REPOSITORY https://github.com/dmlc/dlpack
- GIT_TAG v0.8
-)
-FetchContent_MakeAvailable(dlpack)
+# Find dlpack
+find_package(dlpack CONFIG REQUIRED)
# Find python
find_package(Python 3.8 COMPONENTS Interpreter Development.Module REQUIRED)
@@ -60,7 +53,7 @@ target_compile_definitions(_compiled_module PRIVATE NV_CUDNN_FRONTEND_USE_DYNAMI
target_link_libraries(
_compiled_module
- PRIVATE dlpack
+ PRIVATE dlpack::dlpack
)
set_target_properties(
--
2.45.2

View File

@ -0,0 +1,36 @@
From 3f7a23cc5a84af36442c4035db78e616d884b540 Mon Sep 17 00:00:00 2001
From: Nicolas Graves <ngraves@ngraves.fr>
Date: Thu, 25 Jul 2024 16:43:12 +0200
Subject: [PATCH] Find unbundled nlohmann-json package.
---
CMakeLists.txt | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index adf22fc..8211fcd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,6 +16,11 @@ endif()
add_library(cudnn_frontend INTERFACE)
+# Find the nlohmann_json package
+if(NOT CUDNN_FRONTEND_SKIP_NLOHMANN_JSON)
+ find_package(nlohmann_json CONFIG REQUIRED)
+endif()
+
target_compile_definitions(
cudnn_frontend INTERFACE
$<$<BOOL:${CUDNN_FRONTEND_SKIP_JSON_LIB}>:CUDNN_FRONTEND_SKIP_JSON_LIB>
@@ -25,6 +30,7 @@ target_include_directories(
cudnn_frontend INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+ $<$<NOT:$<BOOL:${CUDNN_FRONTEND_SKIP_NLOHMANN_JSON}>>:$<TARGET_PROPERTY:nlohmann_json::nlohmann_json,INTERFACE_INCLUDE_DIRECTORIES>>
)
# Find the cuda compiler
--
2.45.2

View File

@ -0,0 +1,39 @@
From 0c16ed53cae242b02069a1f6fed463dc819526e0 Mon Sep 17 00:00:00 2001
From: Nicolas Graves <ngraves@ngraves.fr>
Date: Thu, 25 Jul 2024 14:58:42 +0200
Subject: [PATCH] Use absolute store cudnn.so path.
---
python/cudnn/__init__.py | 16 +---------------
1 file changed, 1 insertion(+), 15 deletions(-)
diff --git a/python/cudnn/__init__.py b/python/cudnn/__init__.py
index 35eb883..39dc047 100644
--- a/python/cudnn/__init__.py
+++ b/python/cudnn/__init__.py
@@ -137,21 +137,7 @@ pygraph.execute_plan_at_index = _execute_plan_at_index
def _dlopen_cudnn():
- # First look at python site packages
- lib_path = glob.glob(
- os.path.join(
- sysconfig.get_path("purelib"), "nvidia/cudnn/lib/libcudnn.so.*[0-9]"
- )
- )
-
- if lib_path:
- assert (
- len(lib_path) == 1
- ), f"Found {len(lib_path)} libcudnn.so.x in nvidia-cudnn-cuXX."
- lib = ctypes.CDLL(lib_path[0])
- else: # Fallback
- lib = ctypes.CDLL("libcudnn.so")
-
+ lib = ctypes.CDLL(@store-cudnn.so-path@)
handle = ctypes.cast(lib._handle, ctypes.c_void_p).value
_compiled_module._set_dlhandle_cudnn(handle)
--
2.45.2

View File

@ -0,0 +1,73 @@
From 7ee9ec4c2636cca833761d3466df27edc4e3f952 Mon Sep 17 00:00:00 2001
From: Nicolas Graves <ngraves@ngraves.fr>
Date: Tue, 30 Jul 2024 14:13:09 +0200
Subject: [PATCH] Add CUTLASS_BUILD_STATIC_LIBRARY option
---
tools/library/CMakeLists.txt | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/tools/library/CMakeLists.txt b/tools/library/CMakeLists.txt
index a11ebcf6..79f7ccd1 100644
--- a/tools/library/CMakeLists.txt
+++ b/tools/library/CMakeLists.txt
@@ -34,6 +34,7 @@ include(GNUInstallDirs)
set(CUTLASS_BUILD_MONO_LIBRARY OFF CACHE BOOL
"Determines whether the cutlass library is generated as a single file or multiple files.")
+option(CUTLASS_BUILD_STATIC_LIBRARY "Build static libary for CUTLASS" ON)
################################################################################
@@ -126,7 +127,9 @@ function(cutlass_add_cutlass_library)
# simply link the generated object files to the default library.
target_link_libraries(${DEFAULT_NAME} PRIVATE $<BUILD_INTERFACE:${__NAME}_objs>)
- target_link_libraries(${DEFAULT_NAME}_static PRIVATE $<BUILD_INTERFACE:${__NAME}_objs>)
+ if (CUTLASS_BUILD_STATIC_LIBRARY)
+ target_link_libraries(${DEFAULT_NAME}_static PRIVATE $<BUILD_INTERFACE:${__NAME}_objs>)
+ endif()
else()
@@ -152,7 +155,7 @@ function(cutlass_add_cutlass_library)
)
set_target_properties(${__NAME} PROPERTIES DEBUG_POSTFIX "${CUTLASS_LIBRARY_DEBUG_POSTFIX}")
-
+ if (CUTLASS_BUILD_STATIC_LIBRARY)
cutlass_add_library(
${__NAME}_static
STATIC
@@ -189,6 +192,15 @@ function(cutlass_add_cutlass_library)
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
+ else()
+ install(
+ TARGETS ${__NAME}
+ EXPORT NvidiaCutlass
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ )
+ endif()
if (__SUFFIX)
@@ -197,8 +209,10 @@ function(cutlass_add_cutlass_library)
# commands to pull in all kernels by default.
target_link_libraries(${DEFAULT_NAME} INTERFACE ${__NAME})
- target_link_libraries(${DEFAULT_NAME}_static INTERFACE ${__NAME}_static)
-
+ if (CUTLASS_BUILD_STATIC_LIBRARY)
+ target_link_libraries(${DEFAULT_NAME}_static INTERFACE ${__NAME}_static)
+ endif()
+
endif()
endif()
--
2.45.2

View File

@ -0,0 +1,82 @@
From ce4a14ae4041d6cfb69987fef5a65c50754c89b6 Mon Sep 17 00:00:00 2001
From: Nicolas Graves <ngraves@ngraves.fr>
Date: Sun, 28 Jul 2024 16:57:16 +0200
Subject: [PATCH] Add option CUTLASS_BUILD_STATIC_LIBRARY
---
tools/library/CMakeLists.txt | 26 +++++++++++++++++++++-----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/tools/library/CMakeLists.txt b/tools/library/CMakeLists.txt
index 60a6cca5..f096c84d 100644
--- a/tools/library/CMakeLists.txt
+++ b/tools/library/CMakeLists.txt
@@ -34,6 +34,7 @@ include(GNUInstallDirs)
set(CUTLASS_BUILD_MONO_LIBRARY OFF CACHE BOOL
"Determines whether the cutlass library is generated as a single file or multiple files.")
+option(CUTLASS_BUILD_STATIC_LIBRARY "Build static libary for CUTLASS" ON)
################################################################################
@@ -126,7 +127,9 @@ function(cutlass_add_cutlass_library)
# simply link the generated object files to the default library.
target_link_libraries(${DEFAULT_NAME} PRIVATE $<BUILD_INTERFACE:${__NAME}_objs>)
- target_link_libraries(${DEFAULT_NAME}_static PRIVATE $<BUILD_INTERFACE:${__NAME}_objs>)
+ if (CUTLASS_BUILD_STATIC_LIBRARY)
+ target_link_libraries(${DEFAULT_NAME}_static PRIVATE $<BUILD_INTERFACE:${__NAME}_objs>)
+ endif()
else()
@@ -154,7 +157,7 @@ function(cutlass_add_cutlass_library)
)
set_target_properties(${__NAME} PROPERTIES DEBUG_POSTFIX "${CUTLASS_LIBRARY_DEBUG_POSTFIX}")
-
+ if (CUTLASS_BUILD_STATIC_LIBRARY)
cutlass_add_library(
${__NAME}_static
STATIC
@@ -193,6 +196,15 @@ function(cutlass_add_cutlass_library)
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
+ else()
+ install(
+ TARGETS ${__NAME}
+ EXPORT NvidiaCutlass
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ )
+ endif()
if (__SUFFIX)
@@ -201,7 +213,9 @@ function(cutlass_add_cutlass_library)
# commands to pull in all kernels by default.
target_link_libraries(${DEFAULT_NAME} PUBLIC ${__NAME})
- target_link_libraries(${DEFAULT_NAME}_static PUBLIC ${__NAME}_static)
+ if (CUTLASS_BUILD_STATIC_LIBRARY)
+ target_link_libraries(${DEFAULT_NAME}_static PUBLIC ${__NAME}_static)
+ endif()
endif()
@@ -250,7 +264,9 @@ cutlass_add_cutlass_library(
# For backward compatibility with the old name
add_library(cutlass_lib ALIAS cutlass_library)
-add_library(cutlass_lib_static ALIAS cutlass_library_static)
+if (CUTLASS_BUILD_STATIC_LIBRARY)
+ add_library(cutlass_lib_static ALIAS cutlass_library_static)
+endif()
################################################################################
--
2.45.2

View File

@ -0,0 +1,181 @@
;;; SPDX-License-Identifier: GPL-3.0-or-later
;;; Copyright © 2024 Nicolas Graves <ngraves@ngraves.fr>
(define-module (nonguix build-system cuda)
#:use-module (gnu packages gcc)
#:use-module (guix store)
#:use-module (guix utils)
#:use-module (guix gexp)
#:use-module (guix monads)
#:use-module (guix derivations)
#:use-module (guix search-paths)
#:use-module (guix build-system)
#:use-module (guix build-system gnu)
#:use-module (guix packages)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
#:use-module (nonguix build-system binary)
#:use-module (nonguix utils)
#:use-module ((nonguix licenses) #:prefix license:)
#:export (cuda-license
cuda-current-system
cuda-module-url
guix-system->cuda-system
%cuda-build-system-modules
lower
cuda-build
cuda-build-system))
;; Commentary:
;;
;; Standard build procedure for Cuda binary packages. This is
;; implemented as an extension of `binary-build-system'.
;;
;; Code:
(define %cuda-build-system-modules
;; Build-side modules imported by default.
`((nonguix build cuda-build-system)
(nonguix build utils)
,@%binary-build-system-modules))
(define (build-patchelf-plan wrapper-plan inputs)
#~(let ((patchelf-inputs
(list #$@(map car inputs))))
(map (lambda (file)
(cons file (cons* "out" patchelf-inputs)))
#$wrapper-plan)))
(define (cuda-license name)
(license:nonfree
(format #f "\
https://developer.download.nvidia.com/compute/cuda/redist/~a/LICENSE.txt"
(string-join (string-split name #\-) "_"))))
(define (guix-system->cuda-system system)
(match system
("x86_64-linux" "linux-x86_64")
("aarch64-linux" "linux-aarch64")
("powerpc64le-linux" "linux-ppc64le")
(_ #f)))
(define (cuda-current-system)
(guix-system->cuda-system
(or (%current-target-system) (%current-system))))
(define (cuda-module-url name version)
(let ((system (cuda-current-system))
(snake-name (string-join (string-split name #\-) "_")))
(format #f
"https://developer.download.nvidia.com/compute/cuda/redist\
/~a/~a/~a-~a-~a-archive.tar.xz"
snake-name
system
snake-name
system
version)))
(define* (lower name
#:key source inputs native-inputs outputs system target
(patchelf (default-patchelf))
(glibc (default-glibc))
#:allow-other-keys
#:rest arguments)
"Return a bag for NAME."
(define private-keywords
'(#:target #:patchelf #:inputs #:native-inputs))
(define host-inputs
`(,@(if source
`(("source" ,source))
'())
("gcc:lib" ,gcc "lib")
("glibc" ,glibc)
,@inputs
;; Keep the standard inputs of 'gnu-build-system'.
,@(standard-packages)))
(and (not target) ;XXX: no cross-compilation
(bag
(name name)
(system system)
(host-inputs host-inputs)
(build-inputs `(("patchelf" ,patchelf)
,@native-inputs
;; If current system is i686, the *32 packages will be the
;; same as the non-32, but that's OK.
("libc32" ,(to32 glibc))))
(outputs outputs)
(build cuda-build)
(arguments (append
(strip-keyword-arguments private-keywords arguments)
(list #:wrap-inputs (alist-delete "source" host-inputs)))))))
(define* (cuda-build name inputs
#:key
guile source wrap-inputs
(outputs '("out"))
(patchelf-inputs ''("gcc" "glibc"))
(patchelf-plan ''())
(install-plan ''(("." "./")))
(search-paths '())
(out-of-source? #t)
(validate-runpath? #t)
(patch-shebangs? #t)
(strip-binaries? #t)
(strip-flags ''("--strip-debug"))
(strip-directories ''("lib" "lib64" "libexec"
"bin" "sbin"))
(phases '(@ (nonguix build cuda-build-system)
%standard-phases))
(system (%current-system))
(imported-modules %cuda-build-system-modules)
(modules '((nonguix build cuda-build-system)
(guix build utils)
(nonguix build utils)))
(substitutable? #t)
allowed-references
disallowed-references)
"Build SOURCE using binary-build-system."
(define builder
(with-imported-modules imported-modules
#~(begin
(use-modules #$@modules)
#$(with-build-variables inputs outputs
#~(cuda-build #:source #+source
#:system #$system
#:outputs %outputs
#:inputs %build-inputs
#:patchelf-inputs #$patchelf-inputs
#:patchelf-plan #$patchelf-plan
#:install-plan #$install-plan
#:search-paths '#$(map search-path-specification->sexp
search-paths)
#:phases #$phases
#:out-of-source? #$out-of-source?
#:validate-runpath? #$validate-runpath?
#:patch-shebangs? #$patch-shebangs?
#:strip-binaries? #$strip-binaries?
#:strip-flags #$strip-flags
#:strip-directories #$strip-directories)))))
(mlet %store-monad ((guile (package->derivation (or guile (default-guile))
system #:graft? #f)))
(gexp->derivation name builder
#:system system
#:target #f
#:substitutable? substitutable?
#:allowed-references allowed-references
#:disallowed-references disallowed-references
#:guile-for-build guile)))
(define cuda-build-system
(build-system
(name 'cuda)
(description "The Cuda build system")
(lower lower)))
;;; cuda.scm ends here

View File

@ -3,6 +3,7 @@
;;; Copyright © 2022 Attila Lendvai <attila@lendvai.name> ;;; Copyright © 2022 Attila Lendvai <attila@lendvai.name>
;;; Copyright © 2023 Giacomo Leidi <goodoldpaul@autistici.org> ;;; Copyright © 2023 Giacomo Leidi <goodoldpaul@autistici.org>
;;; Copyright © 2024 Ashish SHUKLA <ashish.is@lostca.se> ;;; Copyright © 2024 Ashish SHUKLA <ashish.is@lostca.se>
;;; Copyright © 2024 Nicolas Graves <ngraves@ngraves.fr>
(define-module (nonguix build binary-build-system) (define-module (nonguix build binary-build-system)
#:use-module ((guix build gnu-build-system) #:prefix gnu:) #:use-module ((guix build gnu-build-system) #:prefix gnu:)
@ -11,6 +12,7 @@
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:export (%standard-phases #:export (%standard-phases
autopatchelf
binary-build)) binary-build))
;; Commentary: ;; Commentary:
@ -140,6 +142,27 @@ The inputs are optional when the file is an executable."
patchelf-plan))) patchelf-plan)))
#t) #t)
(define* (autopatchelf #:key inputs outputs patchelf-plan patchelf-inputs
#:allow-other-keys)
"Automatically build patchelf-plan if not defined, then run patchelf phase.
The plan is the product of all elf-files with all inputs and \"out\"."
(if (equal? patchelf-plan '())
(let* ((elf-files (find-files
"." (lambda (name stat)
(and (elf-file? name)
(not (eq? 'symlink (stat:type stat)))))))
(plan (map (lambda (file)
(list file (cons* "out" patchelf-inputs)))
elf-files)))
(format #t "Applying patchelf-plan: ~a~%" plan)
(patchelf #:inputs inputs
#:outputs outputs
#:patchelf-plan plan))
(patchelf #:inputs inputs
#:outputs outputs
#:patchelf-plan patchelf-plan)))
(define (deb-file? binary-file) (define (deb-file? binary-file)
(string-suffix? ".deb" binary-file)) (string-suffix? ".deb" binary-file))

View File

@ -0,0 +1,73 @@
;;; SPDX-License-Identifier: GPL-3.0-or-later
;;; Copyright © 2024 Nicolas Graves <ngraves@ngraves.fr>
(define-module (nonguix build cuda-build-system)
#:use-module ((guix build gnu-build-system) #:prefix gnu:)
#:use-module ((nonguix build binary-build-system) #:prefix binary:)
#:use-module (guix build utils)
#:use-module (nonguix build utils)
#:use-module (ice-9 ftw)
#:use-module (ice-9 match)
#:export (%standard-phases
cuda-build))
;; Commentary:
;;
;; Builder-side code of the Cuda binary build procedure.
;;
;; Code:
;;; XXX: Copied from upstream guix in tests/store-deduplication.scm
(define (cartesian-product . lst)
"Return the Cartesian product of all the given lists."
(match lst
((head)
(map list head))
((head . rest)
(let ((others (apply cartesian-product rest)))
(apply append
(map
(lambda (init)
(map (lambda (lst)
(cons init lst))
others))
head))))
(()
'())))
(define* (install-pkg-config-files #:key outputs #:allow-other-keys)
(if (directory-exists? "pkg-config")
(with-directory-excursion "pkg-config"
(for-each
(match-lambda
((output file)
(substitute* file
(("^cudaroot=.*")
(string-append "cudaroot=" output "\n"))
(("^libdir=.*")
(string-append "libdir=" output "/lib\n"))
(("^includedir=.*")
(string-append "includedir=" output "/include\n")))
(install-file file
(string-append output "/share/pkg-config"))
(with-directory-excursion
(string-append output "/share/pkg-config")
(symlink (basename file)
(string-append
(string-take file (string-index file #\-)) ".pc")))))
(cartesian-product (map cdr outputs) (find-files "." "\\.pc"))))
(format #t "pkg-config directory doesn't exist, nothing to be done.~%")))
(define %standard-phases
(modify-phases binary:%standard-phases
(replace 'patchelf binary:autopatchelf)
(add-after 'install 'install-static install-static-output)
(add-after 'install-static 'install-pkg-config-files
install-pkg-config-files)))
(define* (cuda-build #:key inputs (phases %standard-phases)
#:allow-other-keys #:rest args)
"Build the given package, applying all of PHASES in order."
(apply gnu:gnu-build #:inputs inputs #:phases phases args))
;;; cuda-build-system.scm ends here

View File

@ -12,7 +12,8 @@
#:export (64-bit? #:export (64-bit?
make-wrapper make-wrapper
concatenate-files concatenate-files
build-paths-from-inputs)) build-paths-from-inputs
install-static-output))
(define (64-bit? file) (define (64-bit? file)
"Return true if ELF file is in 64-bit format, false otherwise. "Return true if ELF file is in 64-bit format, false otherwise.
@ -97,3 +98,22 @@ contents:
(call-with-output-file result (call-with-output-file result
(lambda (port) (lambda (port)
(for-each (cut dump <> port) files)))) (for-each (cut dump <> port) files))))
(define* (install-static-output #:key outputs #:allow-other-keys)
(let ((out (assoc-ref outputs "out"))
(static (assoc-ref outputs "static")))
(if static
(begin
(for-each
(lambda (file)
(if (eq? 'symlink (stat:type (lstat file)))
(with-directory-excursion (string-append static "/lib")
(symlink (basename (readlink file))
(basename file)))
(install-file file (string-append static "/lib")))
(delete-file file))
(find-files (string-append out "/lib") "\\.a$"))
(for-each
(cute install-file <> (string-append static "/include"))
(find-files (string-append out "/include"))))
(format #t "no static output, nothing to be done~%"))))