Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automate handling of supported CUDA_ARCH by probing nvcc #143

Open
wants to merge 2 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 and KawPow disabled, they do not work with old CUDA")
message(STATUS "CUDA ${CUDA_VERSION}: RandomX and KawPow disabled, they do not work with CUDA < 9.0")
option(WITH_RANDOMX "Enable RandomX algorithms family" OFF)
option(WITH_KAWPOW "Enable KawPow algorithms family" OFF)
else()
Expand Down
186 changes: 102 additions & 84 deletions cmake/CUDA.cmake
Original file line number Diff line number Diff line change
@@ -1,121 +1,139 @@
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.0 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.5 for Kepler(35/37)/Maxwell/Pascal/Volta /Turing/Ampere(87)\n\n"
" 11.8 for Kepler(35/37)/Maxwell/Pascal/Volta /Turing/Ampere(87)/Hopper\n\n"
"Reference https://developer.nvidia.com/cuda-gpus#compute for arch and family name\n\n"
)

set(USELESS_CUDA_ARCH "32;37;52;53;61;62;72;89")

add_definitions(-DCUB_IGNORE_DEPRECATED_CPP_DIALECT -DTHRUST_IGNORE_DEPRECATED_CPP_DIALECT)

option(XMRIG_LARGEGRID "Support large CUDA block count > 128" ON)
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")
elseif (CUDA_VERSION VERSION_LESS 12.0)
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()

if (NOT CUDA_VERSION VERSION_LESS 11.1)
list(APPEND DEFAULT_CUDA_ARCH "86")
endif()

if (NOT CUDA_VERSION VERSION_LESS 11.5)
list(APPEND DEFAULT_CUDA_ARCH "87")
endif()

if (NOT CUDA_VERSION VERSION_LESS 11.8)
list(APPEND DEFAULT_CUDA_ARCH "90")
endif()
list(SORT DEFAULT_CUDA_ARCH)
# 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 SUPPORT_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}" SUPPORT_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_" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
string(REPLACE "sm_" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
string(REPLACE "lto_" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
string(REPLACE "all-major" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
string(REPLACE "all" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
string(REPLACE "." "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
string(REPLACE "'" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
string(REPLACE "," ";" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
list(SORT SUPPORT_CUDA_ARCH)
list(REMOVE_DUPLICATES SUPPORT_CUDA_ARCH)
list(REMOVE_ITEM SUPPORT_CUDA_ARCH "")
message(STATUS "CUDA Architectures supported by [${CUDA_NVCC_EXECUTABLE}]: ${SUPPORT_CUDA_ARCH}")
set(DEFAULT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")

# Filter bloaty architectures
foreach(CUDA_ARCH_ELEM ${USELESS_CUDA_ARCH})
list(FIND DEFAULT_CUDA_ARCH "${CUDA_ARCH_ELEM}" POS)
if(POS GREATER -1)
list(REMOVE_ITEM DEFAULT_CUDA_ARCH "${CUDA_ARCH_ELEM}")
endif()
endforeach()
message(STATUS "CUDA Architectures filtered defaults: ${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(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 SUPPORT_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 "Currently selected nvcc does not support CUDA architecture '${CUDA_ARCH_ELEM}'. 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(CUDA_ARCH_ELEM)
unset(SUPPORT_CUDA_ARCH)
unset(USELESS_CUDA_ARCH)
unset(MSG_CUDA_MAP)
list(SORT CUDA_ARCH)
list(REMOVE_DUPLICATES CUDA_ARCH)
list(REMOVE_ITEM CUDA_ARCH "")
message(STATUS "CUDA Architectures being built: ${CUDA_ARCH}")

add_definitions(-DCUB_IGNORE_DEPRECATED_CPP_DIALECT -DTHRUST_IGNORE_DEPRECATED_CPP_DIALECT)

Expand Down