Skip to content

Commit d7234b4

Browse files
committed
Automate handling of supported CUDA_ARCH by probing nvcc
1 parent 8feec79 commit d7234b4

File tree

2 files changed

+91
-74
lines changed

2 files changed

+91
-74
lines changed

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 2.8.12)
1+
cmake_minimum_required(VERSION 3.0)
22
project(xmrig-cuda)
33
include(cmake/CUDA-Version.cmake)
44

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

1616
if (CUDA_VERSION VERSION_LESS 9.0)
17-
message(STATUS "CUDA ${CUDA_VERSION}: RandomX, AstroBWT, and KawPow disabled, they do not work with old CUDA")
17+
message(STATUS "CUDA ${CUDA_VERSION}: RandomX, AstroBWT, and KawPow disabled, they do not work with CUDA < 9.0")
1818
option(WITH_RANDOMX "Enable RandomX algorithms family" OFF)
1919
option(WITH_ASTROBWT "Enable AstroBWT algorithms family" OFF)
2020
option(WITH_KAWPOW "Enable KawPow algorithms family" OFF)

cmake/CUDA.cmake

Lines changed: 89 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
set(MSG_CUDA_MAP "\n\n"
22
" Valid CUDA Toolkit Map:\n"
3-
" 8.x for Fermi/Kepler /Maxwell/Pascal,\n"
4-
" 9.x for Kepler /Maxwell/Pascal/Volta,\n"
5-
" 10.x for Kepler /Maxwell/Pascal/Volta/Turing,\n"
6-
" 11.x for Kepler (in part)/Maxwell/Pascal/Volta/Turing/Ampere\n\n"
3+
" 8.x for Fermi/Kepler /Maxwell/Pascal,\n"
4+
" 9.0 for Kepler /Maxwell/Pascal/Volta(70),\n"
5+
" 9.1 for Kepler /Maxwell/Pascal/Volta(72),\n"
6+
" 10.x for Kepler /Maxwell/Pascal/Volta /Turing,\n"
7+
" 11.x for Kepler(35/37)/Maxwell/Pascal/Volta /Turing/Ampere(80)\n"
8+
" 11.1 for Kepler(35/37)/Maxwell/Pascal/Volta /Turing/Ampere(86)\n"
9+
" 11.4 for Kepler(35/37)/Maxwell/Pascal/Volta /Turing/Ampere(87)\n\n"
710
"Reference https://developer.nvidia.com/cuda-gpus#compute for arch and family name\n\n"
811
)
912

@@ -14,96 +17,110 @@ if (XMRIG_LARGEGRID)
1417
add_definitions("-DXMRIG_LARGEGRID=${XMRIG_LARGEGRID}")
1518
endif()
1619

17-
set(DEFAULT_CUDA_ARCH "50")
18-
19-
# Fermi GPUs are only supported with CUDA < 9.0
20-
if (CUDA_VERSION VERSION_LESS 9.0)
21-
list(APPEND DEFAULT_CUDA_ARCH "20;21")
22-
endif()
23-
24-
# Kepler GPUs are only supported with CUDA < 11.0
25-
if (CUDA_VERSION VERSION_LESS 11.0)
26-
list(APPEND DEFAULT_CUDA_ARCH "30")
27-
else()
28-
list(APPEND DEFAULT_CUDA_ARCH "35")
29-
endif()
30-
31-
# add Pascal support for CUDA >= 8.0
32-
if (NOT CUDA_VERSION VERSION_LESS 8.0)
33-
list(APPEND DEFAULT_CUDA_ARCH "60")
34-
endif()
35-
36-
# add Volta support for CUDA >= 9.0
37-
if (NOT CUDA_VERSION VERSION_LESS 9.0)
38-
list(APPEND DEFAULT_CUDA_ARCH "70")
39-
endif()
40-
41-
# add Turing support for CUDA >= 10.0
42-
if (NOT CUDA_VERSION VERSION_LESS 10.0)
43-
list(APPEND DEFAULT_CUDA_ARCH "75")
44-
endif()
45-
46-
# add Ampere support for CUDA >= 11.0
47-
if (NOT CUDA_VERSION VERSION_LESS 11.0)
48-
list(APPEND DEFAULT_CUDA_ARCH "80")
49-
endif()
50-
list(SORT DEFAULT_CUDA_ARCH)
20+
# Obtain actual list of supported arch from nvcc
21+
execute_process(COMMAND ${CUDA_NVCC_EXECUTABLE} --help OUTPUT_VARIABLE NVCC_HELP OUTPUT_STRIP_TRAILING_WHITESPACE)
22+
string(REPLACE "\n" ";" NVCC_HELP "${NVCC_HELP}")
23+
foreach(LINE ${NVCC_HELP})
24+
string(STRIP "${LINE}" LINE)
25+
if(FOUND_VALUES)
26+
string(FIND "${LINE}" "--" POS)
27+
if(POS EQUAL 0)
28+
break()
29+
endif()
30+
string(APPEND SUPPORT_CUDA_ARCH "${LINE}")
31+
continue()
32+
endif()
33+
if(FOUND_OPT)
34+
string(FIND "${LINE}" "Allowed values for this option:" POS)
35+
if(POS EQUAL -1)
36+
continue()
37+
endif()
38+
math(EXPR chop "${POS} + 31")
39+
string(SUBSTRING "${LINE}" ${chop} -1 LINE)
40+
string(STRIP "${LINE}" SUPPORT_CUDA_ARCH)
41+
set(FOUND_VALUES TRUE)
42+
continue()
43+
endif()
44+
string(FIND "${LINE}" "--gpu-architecture" POS)
45+
if(POS EQUAL 0)
46+
set(FOUND_OPT TRUE)
47+
endif()
48+
endforeach()
49+
unset(NVCC_HELP)
50+
unset(FOUND_VALUES)
51+
unset(FOUND_OPT)
52+
unset(LINE)
53+
string(REPLACE "compute_" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
54+
string(REPLACE "sm_" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
55+
string(REPLACE "lto_" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
56+
string(REPLACE "all-major" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
57+
string(REPLACE "all" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
58+
string(REPLACE "." "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
59+
string(REPLACE "'" "" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
60+
string(REPLACE "," ";" SUPPORT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
61+
list(SORT SUPPORT_CUDA_ARCH)
62+
list(REMOVE_DUPLICATES SUPPORT_CUDA_ARCH)
63+
list(REMOVE_ITEM SUPPORT_CUDA_ARCH "")
64+
message(STATUS "CUDA Architectures supported by [${CUDA_NVCC_EXECUTABLE}]: ${SUPPORT_CUDA_ARCH}")
65+
set(DEFAULT_CUDA_ARCH "${SUPPORT_CUDA_ARCH}")
5166

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

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

63-
if(${CUDA_ARCH_ELEM} LESS 20)
78+
list(FIND SUPPORT_CUDA_ARCH "${CUDA_ARCH_ELEM}" POS)
79+
if(POS EQUAL -1)
6480
message("${MSG_CUDA_MAP}")
65-
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified.")
66-
endif()
67-
68-
if (NOT CUDA_VERSION VERSION_LESS 11.0)
69-
if(${CUDA_ARCH_ELEM} LESS 35)
70-
message("${MSG_CUDA_MAP}")
71-
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. "
72-
"Use CUDA v10.x maximum, Kepler (30) was dropped at v11.")
81+
set(CUDA_UNSUP "Currently selected nvcc does not support CUDA architecture '${CUDA_ARCH_ELEM}'. Use CUDA Toolkit")
82+
if("${CUDA_ARCH_ELEM}" LESS 30)
83+
message(FATAL_ERROR "${CUDA_UNSUP} v8.x maximum, Fermi (20/21) was dropped at v9.0")
7384
endif()
74-
else()
75-
if(NOT ${CUDA_ARCH_ELEM} LESS 80)
76-
message("${MSG_CUDA_MAP}")
77-
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. "
78-
"Use CUDA v11.x minimum, Ampere (80) was added at v11.")
85+
if("${CUDA_ARCH_ELEM}" GREATER_EQUAL 30 AND "${CUDA_ARCH_ELEM}" LESS 40)
86+
if("${CUDA_ARCH_ELEM}" LESS_EQUAL 32)
87+
message(FATAL_ERROR "${CUDA_UNSUP} v10.x maximum, Kepler (30/32) was dropped at v11.0")
88+
else()
89+
message(FATAL_ERROR "${CUDA_UNSUP} v11.x maximum, Kepler (35/37) was dropped at v12.0")
90+
endif()
7991
endif()
80-
endif()
81-
82-
if (CUDA_VERSION VERSION_LESS 10.0)
83-
if(NOT ${CUDA_ARCH_ELEM} LESS 75)
84-
message("${MSG_CUDA_MAP}")
85-
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. "
86-
"Use CUDA v10.x minimum, Turing (75) was added at v10.")
92+
if("${CUDA_ARCH_ELEM}" GREATER_EQUAL 50 AND "${CUDA_ARCH_ELEM}" LESS 60)
93+
message(FATAL_ERROR "${CUDA_UNSUP} v11.x maximum, Maxwell (50/52/53) was dropped at v12.0")
8794
endif()
88-
endif()
89-
90-
if (NOT CUDA_VERSION VERSION_LESS 9.0)
91-
if(${CUDA_ARCH_ELEM} LESS 30)
92-
message("${MSG_CUDA_MAP}")
93-
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. "
94-
"Use CUDA v8.x maximum, Fermi (20/21) was dropped at v9.")
95+
if("${CUDA_ARCH_ELEM}" GREATER_EQUAL 70 AND "${CUDA_ARCH_ELEM}" LESS 80)
96+
if("${CUDA_ARCH_ELEM}" LESS 72)
97+
message(FATAL_ERROR "${CUDA_UNSUP} v9.0 minimum, Volta (70) was added at v9.0")
98+
elseif("${CUDA_ARCH_ELEM}" LESS 75)
99+
message(FATAL_ERROR "${CUDA_UNSUP} v9.1 minimum, Volta (72) was added at v9.1")
100+
else()
101+
message(FATAL_ERROR "${CUDA_UNSUP} v10.0 minimum, Turing (75) was added at v10.0")
102+
endif()
95103
endif()
96-
else()
97-
if(NOT ${CUDA_ARCH_ELEM} LESS 70)
98-
message("${MSG_CUDA_MAP}")
99-
message(FATAL_ERROR "Unsupported CUDA architecture '${CUDA_ARCH_ELEM}' specified. "
100-
"Use CUDA v9.x minimum, Volta (70/72) was added at v9.")
104+
if("${CUDA_ARCH_ELEM}" GREATER_EQUAL 80 AND "${CUDA_ARCH_ELEM}" LESS 90)
105+
if("${CUDA_ARCH_ELEM}" LESS 86)
106+
message(FATAL_ERROR "${CUDA_UNSUP} v11.0 minimum, Ampere (80) was added at v11.0")
107+
elseif("${CUDA_ARCH_ELEM}" EQUAL 86)
108+
message(FATAL_ERROR "${CUDA_UNSUP} v11.1 minimum, Ampere (86) was added at v11.1")
109+
else()
110+
message(FATAL_ERROR "${CUDA_UNSUP} v11.4 minimum, Ampere (87) was added at v11.4")
111+
endif()
101112
endif()
102113
endif()
103114
endforeach()
104115

116+
unset(POS)
117+
unset(CUDA_ARCH_ELEM)
118+
unset(SUPPORT_CUDA_ARCH)
105119
unset(MSG_CUDA_MAP)
106120
list(SORT CUDA_ARCH)
121+
list(REMOVE_DUPLICATES CUDA_ARCH)
122+
list(REMOVE_ITEM CUDA_ARCH "")
123+
message(STATUS "CUDA Architectures being built: ${CUDA_ARCH}")
107124

108125
add_definitions(-DCUB_IGNORE_DEPRECATED_CPP_DIALECT -DTHRUST_IGNORE_DEPRECATED_CPP_DIALECT)
109126

0 commit comments

Comments
 (0)