Add `sm_107` for Rubin (#49387)
Signed-off-by: Tyler Michael Smith <tlrmchlsmth@gmail.com> Co-authored-by: OpenAI Codex <noreply@openai.com>
Tyler Michael Smith committed
Jul 24, 2026 at 14:59 UTC
8c13ee5735f54fe7c653cf694be21bb462a99fed
6 files changed
+60
-13
CMakeLists.txt
+12
-7
@@ -114,6 +114,11 @@ find_package(Torch REQUIRED)
114
# Supported NVIDIA architectures.
115
# This check must happen after find_package(Torch) because that's when CMAKE_CUDA_COMPILER_VERSION gets defined
116
if(DEFINED CMAKE_CUDA_COMPILER_VERSION AND
117
+ CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 13.4)
118
+ # Rubin (10.7) can run SM100 family code, but CUDA 13.4 also supports
119
+ # targeting it directly.
120
+ set(CUDA_SUPPORTED_ARCHS "7.5;8.0;8.6;8.7;8.9;9.0;10.0;10.7;11.0;12.0")
121
+elseif(DEFINED CMAKE_CUDA_COMPILER_VERSION AND
122
CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0)
123
# starting from CUDA 12.9 and Blackwell (10.0), we use family-specific targets (10.0f, 12.0f, etc)
124
# to support the whole generation without specifying all sub-architectures
@@ -420,7 +425,7 @@ if(VLLM_GPU_LANG STREQUAL "CUDA" OR VLLM_GPU_LANG STREQUAL "HIP")
425
426
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
427
cuda_archs_loose_intersection(COOPERATIVE_TOPK_ARCHS
423
- "9.0a;10.0f;10.1f;10.3f;11.0f;12.0f;12.1f" "${CUDA_ARCHS}")
428
+ "9.0a;10.0f;10.1f;10.3f;10.7f;11.0f;12.0f;12.1f" "${CUDA_ARCHS}")
429
else()
430
cuda_archs_loose_intersection(COOPERATIVE_TOPK_ARCHS
431
"9.0a;10.0a;10.1a;10.3a;12.0a;12.1a" "${CUDA_ARCHS}")
@@ -695,7 +700,7 @@ if(VLLM_GPU_LANG STREQUAL "CUDA" OR VLLM_GPU_LANG STREQUAL "HIP")
700
701
# DeepSeek V3 fused A GEMM kernel (requires SM 9.0+, Hopper and later)
702
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
698
- cuda_archs_loose_intersection(DSV3_FUSED_A_GEMM_ARCHS "9.0a;10.0f;11.0f;12.0f" "${CUDA_ARCHS}")
703
+ cuda_archs_loose_intersection(DSV3_FUSED_A_GEMM_ARCHS "9.0a;10.0f;10.7f;11.0f;12.0f" "${CUDA_ARCHS}")
704
else()
705
cuda_archs_loose_intersection(DSV3_FUSED_A_GEMM_ARCHS "9.0a;10.0a;10.1a;10.3a;12.0a;12.1a" "${CUDA_ARCHS}")
706
endif()
@@ -832,7 +837,7 @@ if(VLLM_GPU_LANG STREQUAL "CUDA" OR VLLM_GPU_LANG STREQUAL "HIP")
837
# The cutlass_scaled_mm kernels for Blackwell SM100 (c3x, i.e. CUTLASS 3.x)
838
# require CUDA 12.8 or later
839
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
835
- cuda_archs_loose_intersection(SCALED_MM_ARCHS "10.0f;11.0f" "${CUDA_ARCHS}")
840
+ cuda_archs_loose_intersection(SCALED_MM_ARCHS "10.0f;10.7f;11.0f" "${CUDA_ARCHS}")
841
else()
842
cuda_archs_loose_intersection(SCALED_MM_ARCHS "10.0a;10.1a;10.3a" "${CUDA_ARCHS}")
843
endif()
@@ -916,7 +921,7 @@ if(VLLM_GPU_LANG STREQUAL "CUDA" OR VLLM_GPU_LANG STREQUAL "HIP")
921
endif()
922
923
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
919
- cuda_archs_loose_intersection(SCALED_MM_ARCHS "10.0f;11.0f" "${CUDA_ARCHS}")
924
+ cuda_archs_loose_intersection(SCALED_MM_ARCHS "10.0f;10.7f;11.0f" "${CUDA_ARCHS}")
925
else()
926
cuda_archs_loose_intersection(SCALED_MM_ARCHS "10.0a;10.1a;10.3a" "${CUDA_ARCHS}")
927
endif()
@@ -941,7 +946,7 @@ if(VLLM_GPU_LANG STREQUAL "CUDA" OR VLLM_GPU_LANG STREQUAL "HIP")
946
947
# moe_data.cu is used by all CUTLASS MoE kernels.
948
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
944
- cuda_archs_loose_intersection(CUTLASS_MOE_DATA_ARCHS "9.0a;10.0f;11.0f;12.0f" "${CUDA_ARCHS}")
949
+ cuda_archs_loose_intersection(CUTLASS_MOE_DATA_ARCHS "9.0a;10.0f;10.7f;11.0f;12.0f" "${CUDA_ARCHS}")
950
else()
951
cuda_archs_loose_intersection(CUTLASS_MOE_DATA_ARCHS "9.0a;10.0a;10.1a;10.3a;12.0a;12.1a" "${CUDA_ARCHS}")
952
endif()
@@ -998,7 +1003,7 @@ if(VLLM_GPU_LANG STREQUAL "CUDA" OR VLLM_GPU_LANG STREQUAL "HIP")
1003
# SM10x/11x FP4 kernels. MXFP4 experts quantization is currently compiled
1004
# only in this block; SM12x has separate NVFP4 matmul/MoE kernels above.
1005
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
1001
- cuda_archs_loose_intersection(FP4_SM100_ARCHS "10.0f;11.0f" "${CUDA_ARCHS}")
1006
+ cuda_archs_loose_intersection(FP4_SM100_ARCHS "10.0f;10.7f;11.0f" "${CUDA_ARCHS}")
1007
else()
1008
cuda_archs_loose_intersection(FP4_SM100_ARCHS "10.0a;10.1a;10.3a" "${CUDA_ARCHS}")
1009
endif()
@@ -1064,7 +1069,7 @@ if(VLLM_GPU_LANG STREQUAL "CUDA" OR VLLM_GPU_LANG STREQUAL "HIP")
1069
# Runtime dispatch is gated in
1070
# vllm/v1/attention/backends/mla/cutlass_mla.py.
1071
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
1067
- cuda_archs_loose_intersection(MLA_ARCHS "10.0f;11.0f" "${CUDA_ARCHS}")
1072
+ cuda_archs_loose_intersection(MLA_ARCHS "10.0f;10.7f;11.0f" "${CUDA_ARCHS}")
1073
else()
1074
cuda_archs_loose_intersection(MLA_ARCHS "10.0a;10.1a;10.3a" "${CUDA_ARCHS}")
1075
endif()
cmake/external_projects/deepgemm.cmake
+3
@@ -68,6 +68,9 @@ endif()
68
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 12.8)
69
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 12.9)
70
list(APPEND DEEPGEMM_SUPPORT_ARCHS "10.0f")
71
+ if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.4)
72
+ list(APPEND DEEPGEMM_SUPPORT_ARCHS "10.7f")
73
+ endif()
74
else()
75
list(APPEND DEEPGEMM_SUPPORT_ARCHS "10.0a")
76
endif()
cmake/external_projects/flashmla.cmake
+3
-1
@@ -60,6 +60,9 @@ if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 12.9)
60
# CUDA 12.9 has introduced "Family-Specific Architecture Features"
61
# this supports all compute_10x family
62
list(APPEND SUPPORT_ARCHS "10.0f")
63
+ if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.4)
64
+ list(APPEND SUPPORT_ARCHS "10.7f")
65
+ endif()
66
elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 12.8)
67
list(APPEND SUPPORT_ARCHS "10.0a")
68
endif()
@@ -188,4 +191,3 @@ else()
191
add_custom_target(_flashmla_C)
192
add_custom_target(_flashmla_extension_C)
193
endif()
191
-
cmake/external_projects/qutlass.cmake
+5
-1
@@ -55,7 +55,11 @@ message(STATUS "[QUTLASS] QuTLASS is available at ${qutlass_SOURCE_DIR}")
55
56
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
57
cuda_archs_loose_intersection(QUTLASS_SM120_ARCHS "12.0f" "${CUDA_ARCHS}")
58
- cuda_archs_loose_intersection(QUTLASS_SM100_ARCHS "10.0f" "${CUDA_ARCHS}")
58
+ if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.4)
59
+ cuda_archs_loose_intersection(QUTLASS_SM100_ARCHS "10.0f;10.7f" "${CUDA_ARCHS}")
60
+ else()
61
+ cuda_archs_loose_intersection(QUTLASS_SM100_ARCHS "10.0f" "${CUDA_ARCHS}")
62
+ endif()
63
else()
64
cuda_archs_loose_intersection(QUTLASS_SM120_ARCHS "12.0a;12.1a" "${CUDA_ARCHS}")
65
cuda_archs_loose_intersection(QUTLASS_SM100_ARCHS "10.0a;10.3a" "${CUDA_ARCHS}")
cmake/utils.cmake
+14
-4
@@ -396,14 +396,24 @@ function(cuda_archs_loose_intersection OUT_CUDA_ARCHS SRC_CUDA_ARCHS TGT_CUDA_AR
396
# match — e.g. SRC="12.0f" matches TGT="12.1a" since SM121 is in the SM12x
397
# family. The output uses TGT's value to preserve the user's compilation flags.
398
set(_CUDA_ARCHS)
399
+ # Resolve exact base matches before family fallbacks so a generic entry such
400
+ # as 10.0f cannot consume a 10.7 target that has a 10.7f source entry.
401
foreach(_arch ${_SRC_CUDA_ARCHS})
402
if(_arch MATCHES "[af]$")
401
- list(REMOVE_ITEM _SRC_CUDA_ARCHS "${_arch}")
403
string(REGEX REPLACE "[af]$" "" _base "${_arch}")
403
- if ("${_base}" IN_LIST TGT_CUDA_ARCHS)
404
+ if("${_base}" IN_LIST _TGT_CUDA_ARCHS)
405
+ list(REMOVE_ITEM _SRC_CUDA_ARCHS "${_arch}")
406
list(REMOVE_ITEM _TGT_CUDA_ARCHS "${_base}")
407
list(APPEND _CUDA_ARCHS "${_arch}")
406
- elseif("${_base}a" IN_LIST _TGT_CUDA_ARCHS)
408
+ endif()
409
+ endif()
410
+ endforeach()
411
+
412
+ foreach(_arch ${_SRC_CUDA_ARCHS})
413
+ if(_arch MATCHES "[af]$")
414
+ list(REMOVE_ITEM _SRC_CUDA_ARCHS "${_arch}")
415
+ string(REGEX REPLACE "[af]$" "" _base "${_arch}")
416
+ if("${_base}a" IN_LIST _TGT_CUDA_ARCHS)
417
list(REMOVE_ITEM _TGT_CUDA_ARCHS "${_base}a")
418
list(APPEND _CUDA_ARCHS "${_base}a")
419
elseif("${_base}f" IN_LIST _TGT_CUDA_ARCHS)
@@ -487,7 +497,7 @@ endfunction()
497
498
function(cuda_archs_sm90plus OUT_CUDA_ARCHS TGT_CUDA_ARCHS)
499
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
490
- cuda_archs_loose_intersection(_archs "9.0a;10.0f;11.0f;12.0f" "${TGT_CUDA_ARCHS}")
500
+ cuda_archs_loose_intersection(_archs "9.0a;10.0f;10.7f;11.0f;12.0f" "${TGT_CUDA_ARCHS}")
501
else()
502
cuda_archs_loose_intersection(_archs "9.0a;10.0a;10.1a;10.3a;12.0a;12.1a" "${TGT_CUDA_ARCHS}")
503
endif()
tests/test_cmake_utils.py
new
+23
@@ -0,0 +1,23 @@
1
+# SPDX-License-Identifier: Apache-2.0
2
+# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
+
4
+import subprocess
5
+from pathlib import Path
6
+
7
+
8
+def test_exact_family_arch_precedes_generic_family_fallback(tmp_path: Path):
9
+ repo_root = Path(__file__).parents[1]
10
+ script = tmp_path / "test_cuda_archs.cmake"
11
+ script.write_text(
12
+ f"""
13
+cmake_minimum_required(VERSION 3.26)
14
+include("{repo_root / "cmake" / "utils.cmake"}")
15
+cuda_archs_loose_intersection(
16
+ actual "10.0f;10.7f" "10.7")
17
+if(NOT "${{actual}}" STREQUAL "10.7f")
18
+ message(FATAL_ERROR "Expected 10.7f, got '${{actual}}'")
19
+endif()
20
+"""
21
+ )
22
+
23
+ subprocess.run(["cmake", "-P", script], check=True)