FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

cuda: build with CUDA 13 and target Blackwell by melonakos · Pull Request #3715 · arrayfire/arrayfire · GitHub

Repository navigation

Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension .cmake  (2) .cpp  (1) .cu  (1) .hpp  (2) .txt  (1) All 5 file types selected
Viewed files
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Unified
Split
Hide whitespace
Diff view
Unified
Split
Hide whitespace
7 changes: 7 additions & 0 deletions CMakeModules/AFcuda_helpers.cmake
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@
# The complete license agreement can be obtained at:
# http://arrayfire.com/licenses/BSD-3-Clause

# FindCUDA ships its own, older select_compute_arch.cmake that defines the
# same cuda_select_nvcc_arch_flags function. Ours must be included after
# find_package(CUDA) and before the call below, otherwise CMake's copy runs
# and rejects two-digit architectures (12.0) and names it does not know
# (Blackwell).
include(select_compute_arch)

find_program(NVPRUNE NAMES nvprune)
cuda_select_nvcc_arch_flags(cuda_architecture_flags ${CUDA_architecture_build_targets})
set(cuda_architecture_flags ${cuda_architecture_flags} CACHE INTERNAL "CUDA compute flags" FORCE)
Expand Down
86 changes: 76 additions & 10 deletions CMakeModules/select_compute_arch.cmake
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@
# - "Auto" detects local machine GPU compute arch at runtime.
# - "Common" and "All" cover common and entire subsets of architectures
# ARCH_AND_PTX : NAME | NUM.NUM | NUM.NUM(NUM.NUM) | NUM.NUM+PTX
# NAME: Fermi Kepler Maxwell Kepler+Tegra Kepler+Tesla Maxwell+Tegra Pascal Volta Turing Ampere
# NAME: Fermi Kepler Maxwell Kepler+Tegra Kepler+Tesla Maxwell+Tegra Pascal Volta Turing Ampere Hopper Blackwell
# NUM: Any number. Only those pairs are currently accepted by NVCC though:
# 2.0 2.1 3.0 3.2 3.5 3.7 5.0 5.2 5.3 6.0 6.2 7.0 7.2 7.5 8.0 8.6 9.0
# 2.0 2.1 3.0 3.2 3.5 3.7 5.0 5.2 5.3 6.0 6.1 6.2 7.0 7.2 7.5 8.0 8.6 8.7 8.8 8.9 9.0
# 10.0 10.1 10.3 11.0 12.0 12.1
#
# CUDA_COMMON_GPU_ARCHITECTURES and the NAME mappings are what reach nvcc.
# CUDA_ALL_GPU_ARCHITECTURES is the set nvcc for this toolkit accepts; it
# validates what "Auto" detects, and CUDA_MIN_GPU_ARCHITECTURE is its floor.
# Returns LIST of flags to be added to CUDA_NVCC_FLAGS in ${out_variable}
# Additionally, sets ${out_variable}_readable to the resulting numeric list
# Example:
Expand All @@ -32,6 +37,7 @@ endif()
set(CUDA_KNOWN_GPU_ARCHITECTURES "Fermi" "Kepler" "Maxwell" "Kepler+Tegra" "Kepler+Tesla" "Maxwell+Tegra")
set(CUDA_COMMON_GPU_ARCHITECTURES "2.0" "2.1" "3.0" "3.5" "5.0" "5.3")
set(CUDA_LIMIT_GPU_ARCHITECTURE "6.0")
set(CUDA_MIN_GPU_ARCHITECTURE "2.0")
set(CUDA_ALL_GPU_ARCHITECTURES "2.0" "2.1" "3.0" "3.2" "3.5" "3.7" "5.0" "5.2" "5.3")
set(_CUDA_MAX_COMMON_ARCHITECTURE "5.2+PTX")

Expand All @@ -57,6 +63,7 @@ if(CUDA_VERSION VERSION_GREATER_EQUAL "9.0")

list(REMOVE_ITEM CUDA_KNOWN_GPU_ARCHITECTURES "Fermi")
list(REMOVE_ITEM CUDA_ALL_GPU_ARCHITECTURES "2.0" "2.1")
set(CUDA_MIN_GPU_ARCHITECTURE "3.0")
endif()

if(CUDA_VERSION VERSION_GREATER_EQUAL "10.0")
Expand All @@ -82,6 +89,7 @@ if(CUDA_VERSION VERSION_GREATER_EQUAL "11.0")

list(REMOVE_ITEM CUDA_COMMON_GPU_ARCHITECTURES "3.5" "5.0")
list(REMOVE_ITEM CUDA_ALL_GPU_ARCHITECTURES "3.0" "3.2")
set(CUDA_MIN_GPU_ARCHITECTURE "3.5")
endif()

if(CUDA_VERSION VERSION_GREATER_EQUAL "11.1")
Expand All @@ -92,9 +100,15 @@ if(CUDA_VERSION VERSION_GREATER_EQUAL "11.1")
set(CUDA_LIMIT_GPU_ARCHITECTURE "9.0")
endif()

# CUDA 11.4 added sm_87 (Jetson Orin).
if(CUDA_VERSION VERSION_GREATER_EQUAL "11.4")
list(APPEND CUDA_ALL_GPU_ARCHITECTURES "8.7")
endif()

# CUDA 11.8 added sm_89 (Ada) and sm_90 (Hopper).
if(CUDA_VERSION VERSION_GREATER_EQUAL "11.8")
list(APPEND CUDA_COMMON_GPU_ARCHITECTURES "8.9")
list(APPEND CUDA_ALL_GPU_ARCHITECTURES "8.9")
list(APPEND CUDA_ALL_GPU_ARCHITECTURES "8.9" "9.0")

set(_CUDA_MAX_COMMON_ARCHITECTURE "8.9+PTX")
set(CUDA_LIMIT_GPU_ARCHITECTURE "9.0")
Expand All @@ -103,12 +117,45 @@ endif()
if(CUDA_VERSION VERSION_GREATER_EQUAL "12.0")
list(APPEND CUDA_KNOWN_GPU_ARCHITECTURES "Hopper")
list(APPEND CUDA_COMMON_GPU_ARCHITECTURES "9.0")
list(APPEND CUDA_ALL_GPU_ARCHITECTURES "9.0")

set(_CUDA_MAX_COMMON_ARCHITECTURE "9.0+PTX")
set(CUDA_LIMIT_GPU_ARCHITECTURE "9.0")

list(REMOVE_ITEM CUDA_KNOWN_GPU_ARCHITECTURES "Kepler" "Kepler+Tegra" "Kepler+Tesla")
list(REMOVE_ITEM CUDA_ALL_GPU_ARCHITECTURES "3.5" "3.7")
set(CUDA_MIN_GPU_ARCHITECTURE "5.0")
endif()

# CUDA 12.8 added Blackwell (sm_100, sm_101, sm_120). Maxwell, Pascal and
# Volta are deprecated from here on but nvcc still accepts them until 13.0.
# The PTX entry stays at 10.0 rather than 12.0: PTX only runs on devices of
# equal or higher compute capability, and 12.0 would leave the datacenter
# parts (10.x) and Thor (11.0) with nothing to JIT from.
if(CUDA_VERSION VERSION_GREATER_EQUAL "12.8")
list(APPEND CUDA_KNOWN_GPU_ARCHITECTURES "Blackwell")
list(APPEND CUDA_COMMON_GPU_ARCHITECTURES "12.0")
list(APPEND CUDA_ALL_GPU_ARCHITECTURES "10.0" "10.1" "12.0")

set(_CUDA_MAX_COMMON_ARCHITECTURE "10.0+PTX")
set(CUDA_LIMIT_GPU_ARCHITECTURE "12.0")
endif()

# CUDA 12.9 added sm_103 and sm_121.
if(CUDA_VERSION VERSION_GREATER_EQUAL "12.9")
list(APPEND CUDA_ALL_GPU_ARCHITECTURES "10.3" "12.1")
endif()

# https://docs.nvidia.com/cuda/archive/13.0.0/cuda-toolkit-release-notes/index.html
# CUDA 13.0 removed offline compilation for Maxwell, Pascal and Volta
# (sm_50 through sm_72) and for sm_101; nvcc rejects them outright.
# Turing (7.5) is the floor. CUDA 13.0 also added sm_88 and sm_110 (Thor).
if(CUDA_VERSION VERSION_GREATER_EQUAL "13.0")
list(APPEND CUDA_ALL_GPU_ARCHITECTURES "8.8" "11.0")
set(CUDA_MIN_GPU_ARCHITECTURE "7.5")

list(REMOVE_ITEM CUDA_KNOWN_GPU_ARCHITECTURES "Maxwell" "Maxwell+Tegra" "Pascal" "Volta")
list(REMOVE_ITEM CUDA_COMMON_GPU_ARCHITECTURES "5.3" "6.0" "6.1" "7.0")
list(REMOVE_ITEM CUDA_ALL_GPU_ARCHITECTURES "5.0" "5.2" "5.3" "6.0" "6.1" "6.2" "7.0" "7.2" "10.1")
endif()

list(APPEND CUDA_COMMON_GPU_ARCHITECTURES "${_CUDA_MAX_COMMON_ARCHITECTURE}")
Expand All @@ -119,6 +166,7 @@ if(DEFINED CMAKE_SCRIPT_MODE_FILE)
cmake_print_variables(CUDA_KNOWN_GPU_ARCHITECTURES)
cmake_print_variables(CUDA_COMMON_GPU_ARCHITECTURES)
cmake_print_variables(CUDA_LIMIT_GPU_ARCHITECTURE)
cmake_print_variables(CUDA_MIN_GPU_ARCHITECTURE)
cmake_print_variables(CUDA_ALL_GPU_ARCHITECTURES)
endif()

Expand Down Expand Up @@ -177,19 +225,29 @@ function(CUDA_DETECT_INSTALLED_GPUS OUT_VARIABLE)
message(STATUS "Automatic GPU detection failed. Building for common architectures.")
set(${OUT_VARIABLE} ${CUDA_COMMON_GPU_ARCHITECTURES} PARENT_SCOPE)
else()
# Filter based on CUDA version supported archs
# Keep what this toolkit's nvcc can target directly. Anything below the
# floor is skipped (nvcc would abort on it); anything newer than, or in a
# gap of, this toolkit falls back to the PTX entry of the common set.
set(CUDA_GPU_DETECT_OUTPUT_FILTERED "")
separate_arguments(CUDA_GPU_DETECT_OUTPUT)
foreach(ITEM IN ITEMS ${CUDA_GPU_DETECT_OUTPUT})
if(CUDA_LIMIT_GPU_ARCHITECTURE AND ITEM VERSION_GREATER_EQUAL CUDA_LIMIT_GPU_ARCHITECTURE)
if(ITEM IN_LIST CUDA_ALL_GPU_ARCHITECTURES)
string(APPEND CUDA_GPU_DETECT_OUTPUT_FILTERED " ${ITEM}")
elseif(CUDA_MIN_GPU_ARCHITECTURE AND ITEM VERSION_LESS CUDA_MIN_GPU_ARCHITECTURE)
message(STATUS "Detected GPU architecture ${ITEM} is not supported by CUDA ${CUDA_VERSION}; skipping it.")
else()
list(GET CUDA_COMMON_GPU_ARCHITECTURES -1 NEWITEM)
string(APPEND CUDA_GPU_DETECT_OUTPUT_FILTERED " ${NEWITEM}")
else()
string(APPEND CUDA_GPU_DETECT_OUTPUT_FILTERED " ${ITEM}")
endif()
endforeach()
string(STRIP "${CUDA_GPU_DETECT_OUTPUT_FILTERED}" CUDA_GPU_DETECT_OUTPUT_FILTERED)

set(${OUT_VARIABLE} ${CUDA_GPU_DETECT_OUTPUT_FILTERED} PARENT_SCOPE)
if(NOT CUDA_GPU_DETECT_OUTPUT_FILTERED)
message(STATUS "No detected GPU is supported by CUDA ${CUDA_VERSION}. Building for common architectures.")
set(${OUT_VARIABLE} ${CUDA_COMMON_GPU_ARCHITECTURES} PARENT_SCOPE)
else()
set(${OUT_VARIABLE} ${CUDA_GPU_DETECT_OUTPUT_FILTERED} PARENT_SCOPE)
endif()
endif()
endfunction()

Expand Down Expand Up @@ -229,7 +287,7 @@ function(CUDA_SELECT_NVCC_ARCH_FLAGS out_variable)
set(add_ptx TRUE)
set(arch_name ${CMAKE_MATCH_1})
endif()
if(arch_name MATCHES "^([0-9]\\.[0-9](\\([0-9]\\.[0-9]\\))?)$")
if(arch_name MATCHES "^([0-9]+\\.[0-9]+(\\([0-9]+\\.[0-9]+\\))?)$")
set(arch_bin ${CMAKE_MATCH_1})
set(arch_ptx ${arch_bin})
else()
Expand Down Expand Up @@ -268,6 +326,14 @@ function(CUDA_SELECT_NVCC_ARCH_FLAGS out_variable)
elseif(${arch_name} STREQUAL "Hopper")
set(arch_bin 9.0)
set(arch_ptx 9.0)
elseif(${arch_name} STREQUAL "Blackwell")
# sm_110 (Thor) only exists from CUDA 13.0
if(CUDA_VERSION VERSION_GREATER_EQUAL "13.0")
set(arch_bin 10.0 11.0 12.0)
else()
set(arch_bin 10.0 12.0)
endif()
set(arch_ptx 10.0)
else()
message(SEND_ERROR "Unknown CUDA Architecture Name ${arch_name} in CUDA_SELECT_NVCC_ARCH_FLAGS")
endif()
Expand Down
40 changes: 33 additions & 7 deletions src/backend/cuda/CMakeLists.txt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ endif()
include(AFcuda_helpers)
include(FileToString)
include(InternalUtils)
include(select_compute_arch)

# Remove cublas_device library which is no longer included with the cuda
# toolkit. Fixes issues with older CMake versions
Expand Down Expand Up @@ -778,7 +777,9 @@ function(afcu_collect_libs libname)

cmake_parse_arguments(cuda_args "${options}" "${single_args}" "${multi_args}" ${ARGN})

if(cuda_args_LIB_MAJOR AND cuda_args_LIB_MINOR)
# DEFINED, not truthiness: LIB_MINOR is legitimately 0 (cufft/cusolver/
# cusparse under CUDA 13 are 12.0) and a bare 0 evaluates as false.
if(DEFINED cuda_args_LIB_MAJOR AND DEFINED cuda_args_LIB_MINOR)
set(lib_major ${cuda_args_LIB_MAJOR})
set(lib_minor ${cuda_args_LIB_MINOR})
else()
Expand All @@ -788,6 +789,9 @@ function(afcu_collect_libs libname)
set(lib_version "${lib_major}.${lib_minor}")

if (WIN32)
# CUDA 13 moved the redistributable DLLs from bin/ to bin/x64/.
# NO_DEFAULT_PATH keeps find_file from picking a DLL of some other
# toolkit off the environment PATH.
find_file(CUDA_${libname}_LIBRARY_DLL
NAMES
"${PX}${libname}64_${lib_major}${SX}"
Expand All @@ -796,8 +800,13 @@ function(afcu_collect_libs libname)
"${PX}${libname}64_${lib_major}${lib_minor}_0${SX}"
"${PX}${libname}_${lib_major}0_0${SX}"
PATHS ${dlib_path_prefix}
PATH_SUFFIXES x64
NO_DEFAULT_PATH
)
mark_as_advanced(CUDA_${libname}_LIBRARY_DLL)
if(NOT CUDA_${libname}_LIBRARY_DLL)
message(FATAL_ERROR "AF_INSTALL_STANDALONE: ${libname} DLL (major ${lib_major}) not found under ${dlib_path_prefix}")
endif()
install(FILES "${CUDA_${libname}_LIBRARY_DLL}"
DESTINATION ${AF_INSTALL_BIN_DIR}
COMPONENT cuda_dependencies)
Expand All @@ -808,10 +817,16 @@ function(afcu_collect_libs libname)
RENAME "${PX}${libname}.${lib_version}${SX}"
COMPONENT cuda_dependencies)
else () #UNIX
# NO_DEFAULT_PATH: package the library of the toolkit being built
# against, never a distro or wheel copy found on the default paths.
find_library(CUDA_${libname}_LIBRARY
NAMES ${libname}
PATHS
${dlib_path_prefix})
${dlib_path_prefix}
NO_DEFAULT_PATH)
if(NOT CUDA_${libname}_LIBRARY)
message(FATAL_ERROR "AF_INSTALL_STANDALONE: ${libname} library not found under ${dlib_path_prefix}")
endif()

get_filename_component(outpath "${CUDA_${libname}_LIBRARY}" REALPATH)
if(cuda_args_FULL_VERSION)
Expand Down Expand Up @@ -858,7 +873,9 @@ if(AF_INSTALL_STANDALONE)
endif()

if(WIN32 OR NOT AF_WITH_STATIC_CUDA_NUMERIC_LIBS)
if(CUDA_VERSION_MAJOR VERSION_EQUAL 12)
if(CUDA_VERSION_MAJOR VERSION_EQUAL 13)
afcu_collect_libs(cufft LIB_MAJOR 12 LIB_MINOR 0)
elseif(CUDA_VERSION_MAJOR VERSION_EQUAL 12)
afcu_collect_libs(cufft LIB_MAJOR 11 LIB_MINOR 3)
elseif(CUDA_VERSION_MAJOR VERSION_EQUAL 11)
afcu_collect_libs(cufft LIB_MAJOR 10 LIB_MINOR 4)
Expand All @@ -869,17 +886,26 @@ if(AF_INSTALL_STANDALONE)
if(CUDA_VERSION VERSION_GREATER 10.0)
afcu_collect_libs(cublasLt)
endif()
if(CUDA_VERSION_MAJOR VERSION_EQUAL 12)
if(CUDA_VERSION_MAJOR VERSION_EQUAL 13)
afcu_collect_libs(cusolver LIB_MAJOR 12 LIB_MINOR 0)
elseif(CUDA_VERSION_MAJOR VERSION_EQUAL 12)
afcu_collect_libs(cusolver LIB_MAJOR 11 LIB_MINOR 7)
else()
afcu_collect_libs(cusolver)
endif()
afcu_collect_libs(cusparse)
if(CUDA_VERSION_MAJOR VERSION_EQUAL 13)
# CUDA 13.x still ships cuSPARSE with a major version of 12
afcu_collect_libs(cusparse LIB_MAJOR 12 LIB_MINOR 0)
else()
afcu_collect_libs(cusparse)
endif()
if(CUDA_VERSION VERSION_GREATER 12.0)
afcu_collect_libs(nvJitLink)
endif()
elseif(NOT ${use_static_cuda_lapack})
if(CUDA_VERSION_MAJOR VERSION_EQUAL 12)
if(CUDA_VERSION_MAJOR VERSION_EQUAL 13)
afcu_collect_libs(cusolver LIB_MAJOR 12 LIB_MINOR 0)
elseif(CUDA_VERSION_MAJOR VERSION_EQUAL 12)
afcu_collect_libs(cusolver LIB_MAJOR 11 LIB_MINOR 7)
else()
afcu_collect_libs(cusolver)
Expand Down
7 changes: 7 additions & 0 deletions src/backend/cuda/cufft.cu
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include <cufft.hpp>

#include <cuda.h> // CUDA_VERSION
#include <memory.hpp>
#include <platform.hpp>

Expand Down Expand Up @@ -38,19 +39,25 @@ const char *_cufftGetResultString(cufftResult res) {

case CUFFT_UNALIGNED_DATA: return "cuFFT: unaligned data (deprecated)";

#if CUDA_VERSION < 13000
case CUFFT_INCOMPLETE_PARAMETER_LIST:
return "cuFFT: call is missing parameters";
#endif

case CUFFT_INVALID_DEVICE:
return "cuFFT: plan execution different than plan creation";

#if CUDA_VERSION < 13000
case CUFFT_PARSE_ERROR: return "cuFFT: plan parse error";
#endif

case CUFFT_NO_WORKSPACE: return "cuFFT: no workspace provided";

case CUFFT_NOT_IMPLEMENTED: return "cuFFT: not implemented";

#if CUDA_VERSION < 13000
case CUFFT_LICENSE_ERROR: return "cuFFT: license error";
#endif

#if CUDA_VERSION >= 8000
case CUFFT_NOT_SUPPORTED: return "cuFFT: not supported";
Expand Down
Loading
Loading

Back | FazBrowse Home | New Git URL