Skip to content

Commit

Permalink
Automate handling of supported CUDA_ARCH by probing nvcc
Browse files Browse the repository at this point in the history
  • Loading branch information
Spudz76 committed Dec 14, 2021
1 parent 2809c47 commit 0740c91
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 73 deletions.
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.8.12)
cmake_minimum_required(VERSION 3.0)
project(xmrig-cuda)
include(cmake/CUDA-Version.cmake)

Expand All @@ -14,7 +14,7 @@ option(WITH_CN_FEMTO "Enable CryptoNight-UPX2 algorithm" ON)
option(WITH_ARGON2 "Enable Argon2 algorithms family" OFF) #unsupported

if (CUDA_VERSION VERSION_LESS 9.0)
message(STATUS "CUDA ${CUDA_VERSION}: RandomX, AstroBWT, and KawPow disabled, they do not work with old CUDA")
message(STATUS "CUDA ${CUDA_VERSION}: RandomX, AstroBWT, and KawPow disabled, they do not work with CUDA < 9.0")
option(WITH_RANDOMX "Enable RandomX algorithms family" OFF)
option(WITH_ASTROBWT "Enable AstroBWT algorithms family" OFF)
option(WITH_KAWPOW "Enable KawPow algorithms family" OFF)
Expand Down
154 changes: 83 additions & 71 deletions cmake/CUDA.cmake
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
set(MSG_CUDA_MAP "\n\n"
" Valid CUDA Toolkit Map:\n"
" 8.x for Fermi/Kepler /Maxwell/Pascal,\n"
" 9.x for Kepler /Maxwell/Pascal/Volta,\n"
" 10.x for Kepler /Maxwell/Pascal/Volta/Turing,\n"
" 11.x for Kepler (in part)/Maxwell/Pascal/Volta/Turing/Ampere\n\n"
" 8.x for Fermi/Kepler /Maxwell/Pascal,\n"
" 9.0 for Kepler /Maxwell/Pascal/Volta(70),\n"
" 9.1 for Kepler /Maxwell/Pascal/Volta(72),\n"
" 10.x for Kepler /Maxwell/Pascal/Volta /Turing,\n"
" 11.x for Kepler(35/37)/Maxwell/Pascal/Volta /Turing/Ampere(80)\n"
" 11.1 for Kepler(35/37)/Maxwell/Pascal/Volta /Turing/Ampere(86)\n"
" 11.4 for Kepler(35/37)/Maxwell/Pascal/Volta /Turing/Ampere(87)\n\n"
"Reference https://developer.nvidia.com/cuda-gpus#compute for arch and family name\n\n"
)

Expand All @@ -14,94 +17,103 @@ if (XMRIG_LARGEGRID)
add_definitions("-DXMRIG_LARGEGRID=${XMRIG_LARGEGRID}")
endif()

set(DEFAULT_CUDA_ARCH "50")

# Fermi GPUs are only supported with CUDA < 9.0
if (CUDA_VERSION VERSION_LESS 9.0)
list(APPEND DEFAULT_CUDA_ARCH "20;21")
endif()

# Kepler GPUs are only supported with CUDA < 11.0
if (CUDA_VERSION VERSION_LESS 11.0)
list(APPEND DEFAULT_CUDA_ARCH "30")
else()
list(APPEND DEFAULT_CUDA_ARCH "35")
endif()

# add Pascal support for CUDA >= 8.0
if (NOT CUDA_VERSION VERSION_LESS 8.0)
list(APPEND DEFAULT_CUDA_ARCH "60")
endif()

# add Volta support for CUDA >= 9.0
if (NOT CUDA_VERSION VERSION_LESS 9.0)
list(APPEND DEFAULT_CUDA_ARCH "70")
endif()

# add Turing support for CUDA >= 10.0
if (NOT CUDA_VERSION VERSION_LESS 10.0)
list(APPEND DEFAULT_CUDA_ARCH "75")
endif()

# add Ampere support for CUDA >= 11.0
if (NOT CUDA_VERSION VERSION_LESS 11.0)
list(APPEND DEFAULT_CUDA_ARCH "80")
endif()
# Obtain actual list of supported arch from nvcc
execute_process(COMMAND ${CUDA_NVCC_EXECUTABLE} --help OUTPUT_VARIABLE NVCC_HELP OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\n" ";" NVCC_HELP "${NVCC_HELP}")
foreach(LINE ${NVCC_HELP})
string(STRIP "${LINE}" LINE)
if(FOUND_VALUES)
string(FIND "${LINE}" "--" POS)
if(POS EQUAL 0)
break()
endif()
string(APPEND DEFAULT_CUDA_ARCH "${LINE}")
continue()
endif()
if(FOUND_OPT)
string(FIND "${LINE}" "Allowed values for this option:" POS)
if(POS EQUAL -1)
continue()
endif()
math(EXPR chop "${POS} + 31")
string(SUBSTRING "${LINE}" ${chop} -1 LINE)
string(STRIP "${LINE}" DEFAULT_CUDA_ARCH)
set(FOUND_VALUES TRUE)
continue()
endif()
string(FIND "${LINE}" "--gpu-architecture" POS)
if(POS EQUAL 0)
set(FOUND_OPT TRUE)
endif()
endforeach()
unset(NVCC_HELP)
unset(FOUND_VALUES)
unset(FOUND_OPT)
unset(LINE)
string(REPLACE "compute_" "" DEFAULT_CUDA_ARCH "${DEFAULT_CUDA_ARCH}")
string(REPLACE "sm_" "" DEFAULT_CUDA_ARCH "${DEFAULT_CUDA_ARCH}")
string(REPLACE "lto_" "" DEFAULT_CUDA_ARCH "${DEFAULT_CUDA_ARCH}")
string(REPLACE "all-major" "" DEFAULT_CUDA_ARCH "${DEFAULT_CUDA_ARCH}")
string(REPLACE "all" "" DEFAULT_CUDA_ARCH "${DEFAULT_CUDA_ARCH}")
string(REPLACE "." "" DEFAULT_CUDA_ARCH "${DEFAULT_CUDA_ARCH}")
string(REPLACE "'" "" DEFAULT_CUDA_ARCH "${DEFAULT_CUDA_ARCH}")
string(REPLACE "," ";" DEFAULT_CUDA_ARCH "${DEFAULT_CUDA_ARCH}")
list(SORT DEFAULT_CUDA_ARCH)
list(REMOVE_DUPLICATES DEFAULT_CUDA_ARCH)
list(REMOVE_ITEM DEFAULT_CUDA_ARCH "")
message(STATUS "[${CUDA_NVCC_EXECUTABLE}] Architecture support: ${DEFAULT_CUDA_ARCH}")

set(CUDA_ARCH "${DEFAULT_CUDA_ARCH}" CACHE STRING "Set GPU architecture (semicolon separated list, e.g. '-DCUDA_ARCH=20;35;60')")

# validate architectures (only numbers are allowed)
foreach(CUDA_ARCH_ELEM ${CUDA_ARCH})
string(REGEX MATCH "^[0-9]+$" IS_NUMBER ${CUDA_ARCH})
string(REPLACE "." "" CUDA_ARCH_ELEM "${CUDA_ARCH_ELEM}")
string(REGEX MATCH "^[0-9]+$" IS_NUMBER ${CUDA_ARCH_ELEM})
if(NOT IS_NUMBER)
message(FATAL_ERROR "Defined compute architecture '${CUDA_ARCH_ELEM}' in "
"'${CUDA_ARCH}' is not an integral number, use e.g. '30' (for compute architecture 3.0).")
endif()
unset(IS_NUMBER)

if(${CUDA_ARCH_ELEM} LESS 20)
list(FIND DEFAULT_CUDA_ARCH "${CUDA_ARCH_ELEM}" POS)
if(POS EQUAL -1)
message("${MSG_CUDA_MAP}")
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified.")
endif()

if (NOT CUDA_VERSION VERSION_LESS 11.0)
if(${CUDA_ARCH_ELEM} LESS 35)
message("${MSG_CUDA_MAP}")
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. "
"Use CUDA v10.x maximum, Kepler (30) was dropped at v11.")
set(CUDA_UNSUP "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. Use CUDA Toolkit")
if("${CUDA_ARCH_ELEM}" LESS 30)
message(FATAL_ERROR "${CUDA_UNSUP} v8.x maximum, Fermi (20/21) was dropped at v9.0")
endif()
else()
if(NOT ${CUDA_ARCH_ELEM} LESS 80)
message("${MSG_CUDA_MAP}")
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. "
"Use CUDA v11.x minimum, Ampere (80) was added at v11.")
if("${CUDA_ARCH_ELEM}" GREATER_EQUAL 30 AND "${CUDA_ARCH_ELEM}" LESS 40)
if("${CUDA_ARCH_ELEM}" LESS_EQUAL 32)
message(FATAL_ERROR "${CUDA_UNSUP} v10.x maximum, Kepler (30/32) was dropped at v11.0")
else()
message(FATAL_ERROR "${CUDA_UNSUP} v11.x maximum, Kepler (35/37) was dropped at v12.0")
endif()
endif()
endif()

if (CUDA_VERSION VERSION_LESS 10.0)
if(NOT ${CUDA_ARCH_ELEM} LESS 75)
message("${MSG_CUDA_MAP}")
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. "
"Use CUDA v10.x minimum, Turing (75) was added at v10.")
if("${CUDA_ARCH_ELEM}" GREATER_EQUAL 50 AND "${CUDA_ARCH_ELEM}" LESS 60)
message(FATAL_ERROR "${CUDA_UNSUP} v11.x maximum, Maxwell (50/52/53) was dropped at v12.0")
endif()
endif()

if (NOT CUDA_VERSION VERSION_LESS 9.0)
if(${CUDA_ARCH_ELEM} LESS 30)
message("${MSG_CUDA_MAP}")
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. "
"Use CUDA v8.x maximum, Fermi (20/21) was dropped at v9.")
if("${CUDA_ARCH_ELEM}" GREATER_EQUAL 70 AND "${CUDA_ARCH_ELEM}" LESS 80)
if("${CUDA_ARCH_ELEM}" LESS 72)
message(FATAL_ERROR "${CUDA_UNSUP} v9.0 minimum, Volta (70) was added at v9.0")
elseif("${CUDA_ARCH_ELEM}" LESS 75)
message(FATAL_ERROR "${CUDA_UNSUP} v9.1 minimum, Volta (72) was added at v9.1")
else()
message(FATAL_ERROR "${CUDA_UNSUP} v10.0 minimum, Turing (75) was added at v10.0")
endif()
endif()
else()
if(NOT ${CUDA_ARCH_ELEM} LESS 70)
message("${MSG_CUDA_MAP}")
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. "
"Use CUDA v9.x minimum, Volta (70/72) was added at v9.")
if("${CUDA_ARCH_ELEM}" GREATER_EQUAL 80 AND "${CUDA_ARCH_ELEM}" LESS 90)
if("${CUDA_ARCH_ELEM}" LESS 86)
message(FATAL_ERROR "${CUDA_UNSUP} v11.0 minimum, Ampere (80) was added at v11.0")
elseif("${CUDA_ARCH_ELEM}" EQUAL 86)
message(FATAL_ERROR "${CUDA_UNSUP} v11.1 minimum, Ampere (86) was added at v11.1")
else()
message(FATAL_ERROR "${CUDA_UNSUP} v11.4 minimum, Ampere (87) was added at v11.4")
endif()
endif()
endif()
endforeach()

unset(POS)
unset(MSG_CUDA_MAP)
list(SORT CUDA_ARCH)

Expand Down

0 comments on commit 0740c91

Please sign in to comment.