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)