Prhub

#40380 Require C++20 for compatibility with PyTorch

原始 PR 作者 r-barnes 合并时间 2026-05-09 13:04 文件变更 3 提交数 1 评论 12 代码增减 +6 / -3

执行摘要

C++ 标准从 17 升级到 20 以兼容 PyTorch

PyTorch头文件(如torch/all.h和ATen/ATen.h)现在强制要求C++20(__cplusplus < 202002L时会触发#error),vLLM若仍使用C++17则无法与新版PyTorch一起编译。PR body明确说明此问题已导致PyTorch出现回退事件。

建议精读该PR,尤其是评论中关于PyTorch C++标准演进方向的讨论。它反映了下游项目如何应对上游依赖的breaking change,对于维护大型分布式系统具有参考价值。

讨论亮点

关键讨论:

  • ZJY0516询问具体哪个PyTorch版本会强制C++20。lakshayg和r-barnes解释:PyTorch已尝试推动C++20,但因vLLM等下游项目失败而回退,预计很快会再次强制。
  • gemini-code-assist[bot]建议显式设置CMAKE_CUDA_STANDARDCMAKE_HIP_STANDARD(已被采纳),并建议移除deepgemm.cmake中的硬编码-std=c++17(已在最终版本中移除,改为仅删除该行)。
  • Harry-Chen触发了CI构建,确认无问题后批准PR。
  • 作者r-barnes最终添加了DCO签名并完成单次提交。

实现拆解

该PR通过修改3个CMake文件,将C++标准从17升级到20:

  1. 主CMakeLists.txt:设置CMAKE_CXX_STANDARD 20,并新增CMAKE_CUDA_STANDARD 20CMAKE_HIP_STANDARD 20及其_REQUIRED版本,确保CUDA和HIP代码也使用C++20标准。
  2. cmake/cpu_extension.cmake:将CMAKE_CXX_STANDARD从17改为20,保持与主配置一致。
  3. cmake/external_projects/deepgemm.cmake:移除硬编码的-std=c++17编译选项,因为全局CMake标准设置已经生效,避免冗余和潜在冲突。
    没有测试或文档配套变更。
文件 模块 状态 重要度
CMakeLists.txt 构建系统 modified 3.14
cmake/cpu_extension.cmake 构建系统 modified 2.94
cmake/external_projects/deepgemm.cmake 构建系统 modified 2.4

关键源码片段

CMakeLists.txt core-logic

主构建配置文件:设置了全局 C++20 标准,并新增 CUDA/HIP 标准的显式声明,是最核心的变更文件。

# vllm_extensions 项目的顶层 CMakeLists.txt
cmake_minimum_required(VERSION 3.26)project(vllm_extensions LANGUAGES CXX)# 关键变更:C++ 标准从 17 升级到 20,以兼容 PyTorch 头文件的强制要求
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 为确保 CUDA 和 HIP 代码也使用 C++20,显式设置对应标准(review 建议后添加)
set(CMAKE_CUDA_STANDARD 20)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CMAKE_HIP_STANDARD 20)
set(CMAKE_HIP_STANDARD_REQUIRED ON)# 其余构建配置保持不变 ...
cmake/external_projects/deepgemm.cmake core-logic

DeepGEMM 外部项目的编译选项,移除了硬编码的 -std=c++17,避免与全局标准冲突。

# deepgemm.cmake 片段:移除冗余的 -std=c++17 硬编码
# 因为全局 CMAKE_CXX_STANDARD 20 已生效,无需重复指定
target_compile_options(_deep_gemm_C PRIVATE
  # 原来这里有一行:$<$<COMPILE_LANGUAGE:CXX>:-std=c++17>
  # 已按 review 建议移除,避免与 CMake 的标准管理冲突
  $<$<COMPILE_LANGUAGE:CXX>:-O3>
  $<$<COMPILE_LANGUAGE:CXX>:-Wno-psabi>
  $<$<COMPILE_LANGUAGE:CXX>:-Wno-deprecated-declarations>
)

评论区精华

是否需要显式设置 CUDA/HIP 标准 正确性

gemini-code-assist[bot] 建议显式设置 CMAKE_CUDA_STANDARD 和 CMAKE_HIP_STANDARD,因为 PyTorch 头文件广泛应用于 CUDA/HIP 源文件,仅靠 CMake 默认传播可能失败。

结论:已采纳:在 CMakeLists.txt 中新增了 CMAKE_CUDA_STANDARD 20 和 CMAKE_HIP_STANDARD 20 及其 _REQUIRED 版本。 · 已解决

移除 deepgemm.cmake 中的硬编码 -std=c++17 style

gemini-code-assist[bot] 指出硬编码 -std=c++17 是非惯用法,应与全局标准保持一致。

结论:已采纳:最终提交直接移除了该行硬编码(-std=c++17 → 无)。 · 已解决

PyTorch 强制 C++20 的时间线 question

ZJY0516 询问具体哪个 PyTorch 版本会强制 C++20。lakshayg 和 r-barnes 解释 PyTorch 已有尝试但被回退,预计很快会再次强制,建议尽快迁移。

结论:明确了迁移的必要性和紧迫性。 · 已解决

风险与影响

低风险:该变更仅修改CMake编译标准设置,不涉及业务逻辑。需注意:

  • 如果某些第三方依赖或旧编译器不支持C++20,可能导致构建失败。vLLM已要求CMake>=3.26,通常能配合现代编译器。
  • CUDA/HIP标准显式设置为20可能对旧版本NVCC/ROCm编译器造成问题,但PR中已包含_REQUIRED标记,若编译器不支持则会报错而非静默降级。

影响范围:所有使用C++/CUDA/HIP编译的vLLM组件,包括核心推理内核、量化内核(如DeepGEMM)等。
对用户:无直接功能变化,但确保vLLM能与最新版PyTorch(即将强制C++20)保持兼容。
对开发团队:统一了构建标准,消除因标准不一致导致的潜在编译问题。

编译器兼容性 CUDA/HIP 标准要求

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论