news 2026/10/13 8:02:51

Thrust 环境与构建要求全解析:编译器、C++ 标准、设备架构与 CMake 配置指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Thrust 环境与构建要求全解析:编译器、C++ 标准、设备架构与 CMake 配置指南
  • 科学计算

【免费下载链接】thrust

[ARCHIVED] The C++ parallel algorithms library. See https://github.com/NVIDIA/cccl

项目地址:https://gitcode.com/gh_mirrors/th/thrust
点击查看免费下载

Thrust 是 NVIDIA 出品的 C++ 并行算法库,其模板化算法(thrust::transform、thrust::sort、thrust::reduce等)可在 CUDA、OpenMP、TBB 与串行 CPP 等多种后端上运行。本文以仓库中官方文档 requirements.md 为骨架,系统梳理使用与构建 Thrust 所必需的软件环境——系统软件、C++ 标准、编译器、设备与宿主架构、操作系统及构建工具——并结合thrust/detail/config下的源码说明各项要求的底层检测与告警机制。读完本文,你将能对照清单核验自己的开发环境是否满足要求,理解弃用警告的来源与关闭方式,并据此搭出一套可编译、可测试的 Thrust 开发环境。

说明:当前仓库为 Thrust 的归档镜像,项目开发已整体迁移至 NVIDIA 的 cccl 仓库。以下要求均针对本项目仓库main分支的代码形态,具体某个发布版本的详细变更请以 CHANGELOG.md 为准。

适用范围与版本基线

官方 requirements.md 开篇明确:所有要求均针对 GitHub 上main分支的最新代码。这意味着本文列举的编译器版本下限、C++ 标准支持范围等,代表的是当前开发主线(即本仓库)的状态,而不是某个历史 release 标签的状态。

关于不同发布版本的具体差异,文档要求读者查阅 CHANGELOG.md。从该文件可以还原出环境要求随版本演进的完整脉络:

  • Thrust 1.10.0起(CHANGELOG.md):正式移除 C++03 支持,不再支持 GCC < 5、Clang < 6、MSVC < 2017,并宣布 C++11 进入弃用流程;
  • Thrust 1.12.0起(CHANGELOG.md):进一步弃用 Clang < 7.0 与 MSVC < 2019(即 19.20/16.0/14.20),这与本文档"编译器"一节的现行门槛完全一致。

此外,Thrust 拥有独立于 CUDA Toolkit 与 NVHPC 的版本体系,其版本号编码方式(MMM.mmm.ss-ppp)以及<thrust/version.h>中的THRUST_VERSION、THRUST_MAJOR_VERSION等宏,可参考 版本化说明。本仓库 version.h 当前定义THRUST_VERSION 200200,即 2.2.0 版本。

使用环境要求(Usage Requirements)

要使用 Thrust(含随附的 CUB),必须逐项满足以下四类要求:系统软件、C++ 标准、编译器、设备/宿主架构与操作系统。

系统软件:NVHPC 或 CUDA Toolkit

Thrust 与 CUB 要求安装以下二者之一:

软件说明
NVIDIA HPC SDK(NVHPC)NVIDIA 面向高性能计算的一体化编译器套件,自带 NVC++ 编译器与 CUDA 支持
CUDA Toolkit标准 CUDA 开发工具包,内含 NVCC 编译器、运行时库与头文件

官方测试策略有两点值得注意:

  1. Thrust 与 CUB 的发布版本只针对最新版本的 NVHPC 与 CUDA 进行过测试——即本仓库main分支的状态只保证与当时最新的工具链组合协同工作;
  2. 非官方支持的组合:虽然可以通过从 GitHub 获取较新的 Thrust/CUB 发布版本来搭配较旧的 NVHPC 或 CUDA 使用,但文档明确警告这种组合"not officially supported",请自行承担风险。

对国内用户来说,常规做法是直接安装与目标 Thrust 版本配套的 CUDA Toolkit(例如本仓库 2.2.0 对应的近期 CUDA 版本),并在编译时让 NVCC 找到thrust/头文件目录。

C++ 标准支持范围

Thrust 与 CUB 当前支持的 C++ 方言为:

  • C++11(已弃用,deprecated)
  • C++14
  • C++17

其中 C++14 是官方默认与推荐的标准(CMake 中THRUST_CPP_DIALECT默认值为14,见 CMake 选项文档);C++11 虽仍可编译,但会产生弃用警告,且官方已宣布将在未来版本移除(CHANGELOG.md)。

底层原理:方言的自动检测

Thrust 并不依赖 CMake 单独判定标准版本,而是在头文件 thrust/detail/config/cpp_dialect.h 中于编译期自动检测当前方言:

  • 优先使用THRUST_CPP_DIALECT宏覆盖内置检测;
  • 对 MSVC 特殊处理:由于 MSVC 的__cplusplus值不可靠,转而使用_MSVC_LANG,并将 MSVC 2015(THRUST_MSVC_VERSION < 1910)报告的 C++14 强制修正为 C++11(因其缺少扩展 constexpr 支持,见 cpp_dialect.h);
  • 其余编译器按__cplusplus值映射:< 201103L→ C++03,201103L→ C++11,201402L→ C++14,201703L→ C++17,更大的值记为 2020(cpp_dialect.h)。

编译器要求(配合 NVCC 使用)

与 NVCC 配合使用时,Thrust 与 CUB 支持以下宿主编译器:

编译器支持版本备注
NVCC最新版本NVIDIA CUDA 编译器
NVC++最新版本NVIDIA HPC SDK 自带编译器
GCC5+Linux 下的主流宿主编译器
Clang7+含 AppleClang 等衍生版本
MSVC2019+(19.20/16.0/14.20)Windows 下的宿主编译器

"配合 NVCC 使用"的含义是:NVCC 负责设备端(CUDA)代码的编译,而宿主编译器(GCC/Clang/MSVC/NVC++)负责处理 NVCC 预处理后的宿主端代码;因此宿主编译器的版本门槛同样约束着 Thrust 能否正常使用。

底层原理:编译器版本检测与弃用告警

上述版本门槛并非仅停留在文档层面,而是在编译期被强制执行。在 thrust/detail/config/compiler.h 中,Thrust 通过__GNUC__、__clang_major__、_MSC_VER等宏计算各编译器的归一化版本号:

  • THRUST_GCC_VERSION=__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__(compiler.h),因此 GCC 5.0 对应数值50000;
  • THRUST_CLANG_VERSION同理按major*10000 + minor*100 + patch计算(compiler.h),Clang 7.0 对应70000;
  • THRUST_MSVC_VERSION直接取_MSC_VER,MSVC 2019 的 19.20 对应数值1920。

随后 cpp_dialect.h 在未定义THRUST_IGNORE_DEPRECATED_COMPILER的前提下执行硬性检查:

#ifndef THRUST_IGNORE_DEPRECATED_COMPILER # if THRUST_HOST_COMPILER == THRUST_HOST_COMPILER_GCC && THRUST_GCC_VERSION < 50000 THRUST_COMPILER_DEPRECATION(GCC 5.0); # elif THRUST_HOST_COMPILER == THRUST_HOST_COMPILER_CLANG && THRUST_CLANG_VERSION < 70000 THRUST_COMPILER_DEPRECATION(Clang 7.0); # elif THRUST_HOST_COMPILER == THRUST_HOST_COMPILER_MSVC && THRUST_MSVC_VERSION < 1910 THRUST_COMPILER_DEPRECATION(MSVC 2019 (19.20/16.0/14.20)); # elif THRUST_HOST_COMPILER == THRUST_HOST_COMPILER_MSVC && THRUST_MSVC_VERSION < 1920 THRUST_COMPILER_DEPRECATION_SOFT(MSVC 2019 (19.20/16.0/14.20), MSVC 2017); # endif #endif

可以看到:对 GCC < 5、Clang < 7、MSVC < 2017 属于硬弃用(提示"Thrust requires at least ...");而对 MSVC 2017(1910 <= _MSC_VER < 1920)则是软弃用(提示"仍受支持,但将在未来版本移除")。告警消息本身通过#pragma message(MSVC)或#pragma GCC warning(GCC/Clang)机制输出(cpp_dialect.h),并附上"Define THRUST_IGNORE_DEPRECATED_CPP_DIALECT to suppress this message"的提示。

关闭弃用警告:THRUST_IGNORE_DEPRECATED_COMPILER

文档明确指出,遇到不支持的编译器版本产生的弃用警告时,可在编译期间定义宏THRUST_IGNORE_DEPRECATED_COMPILER来消除。源码给出了更细粒度的控制手段(cpp_dialect.h):

宏作用
THRUST_IGNORE_DEPRECATED_COMPILER仅忽略旧编译器产生的弃用警告(C++03/C++11 的警告不受影响)
THRUST_IGNORE_DEPRECATED_CPP_11仅忽略 C++11 方言的弃用警告
THRUST_IGNORE_DEPRECATED_CPP_DIALECT一次性忽略所有弃用方言与过时编译器的警告

且三者可以组合使用;定义THRUST_IGNORE_DEPRECATED_CPP_DIALECT会自动展开为后两者(cpp_dialect.h)。为兼容 CUB,源码还会把CUB_IGNORE_DEPRECATED_*系列宏自动映射为对应的THRUST_IGNORE_DEPRECATED_*宏(cpp_dialect.h)。

在 CMake 集成场景中,这一宏也可以通过构建配置传递:thrust_create_target会依据配置将THRUST_IGNORE_DEPRECATED_COMPILER作为INTERFACE编译定义附加到生成的 target 上(thrust-config.cmake),从而让依赖该 target 的所有下游编译单元自动获得宏定义。

需要提醒的是:关闭警告只是短期缓解手段(文档与 CHANGELOG.md 均如此说明),这些平台最终会被移除支持,长期方案仍是升级工具链。

设备架构:SM 35 及以上

Thrust 与 CUB 支持自 SM 35 起的所有 NVIDIA 设备架构(包含 Maxwell、Pascal、Volta、Turing、Ampere、Hopper 等各代,直至当时的最新架构)。这一下限同样有源码佐证:CUB 曾移除针对 SM 35 以下不支持硬件的调优策略(CHANGELOG.md)。

在 CMake 构建中,可通过THRUST_ENABLE_COMPUTE_XX系列选项精确控制目标架构(合法取值包括35, 37, 50, 52, 53, 60, 61, 62, 70, 72, 75, 80等,见 CMake 选项文档);默认情况下所有架构均启用,如需收紧可设置THRUST_DISABLE_ARCH_BY_DEFAULT=ON。

宿主架构与操作系统

Thrust 与 CUB 官方支持的宿主(CPU)架构与操作系统如下:

类别支持范围
宿主架构aarch64、x86-64、ppc64le
宿主操作系统Linux、Windows

也就是说:在 x86-64 与 aarch64(如 NVIDIA Jetson、ARM 服务器)以及 ppc64le(IBM POWER)上的 Linux/Windows 环境中,Thrust 均属于受支持平台。macOS 不在官方支持列表内,如需使用请自行评估风险。

构建与测试要求:CMake

在上述使用要求全部满足的基础上,若要自行构建并测试Thrust 与 CUB,官方文档额外要求的工具只有一个:CMake。

结合仓库 CMakeLists.txt 可以进一步明确版本细节:

  • 顶层声明cmake_minimum_required(VERSION 3.15),注释说明:3.15是作为add_subdirectory方式被引入其他项目时的最低版本,3.17用于独立构建本项目的测试/示例,3.18.3用于 C++17 + CUDA 组合(CMakeLists.txt);
  • 未显式指定CMAKE_BUILD_TYPE时默认使用RelWithDebInfo,可选项为Debug、Release、RelWithDebInfo、MinSizeRel(CMakeLists.txt);
  • 顶层构建默认开启头文件编译测试(THRUST_ENABLE_HEADER_TESTING=ON)、单元测试(THRUST_ENABLE_TESTING=ON)与示例构建(THRUST_ENABLE_EXAMPLES=ON),基准测试默认关闭(CMakeLists.txt)。

一个典型的单配置构建流程为:

# 配置:指定宿主系统(CPP/TBB/OMP)、设备系统(CUDA/TBB/OMP/CPP)与 C++ 标准 cmake -DTHRUST_HOST_SYSTEM=CPP -DTHRUST_DEVICE_SYSTEM=CUDA -DTHRUST_CPP_DIALECT=17 \ -DCMAKE_BUILD_TYPE=Release /path/to/thrust/sources # 构建 cmake --build . -j # 运行测试(单元测试通过 ctest 驱动) ctest

其中THRUST_DEVICE_SYSTEM=CUDA是默认的设备后端选择;若只想在纯 CPU 环境(无 CUDA 工具链)下验证 Thrust 的算法正确性,可将设备系统设为CPP、OMP或TBB,此时不依赖 CUDA Toolkit,但 TBB 后端需要额外指定THRUST_TBB_ROOT指向 TBB 安装根目录(各选项的完整说明见 CMake 选项文档)。若需要同时覆盖多种宿主/设备/方言组合,可开启THRUST_ENABLE_MULTICONFIG的多配置模式。

环境自检清单

将全文要求汇总为一份可直接对照的自检清单:

  1. 系统软件:已安装 CUDA Toolkit 或 NVIDIA HPC SDK(版本尽可能新,以匹配 Thrustmain分支的测试基线);
  2. C++ 标准:编译时使用 C++14 或 C++17;若被迫使用 C++11,留意弃用警告;
  3. 宿主编译器:NVCC 为最新版;GCC ≥ 5.0、Clang ≥ 7.0、MSVC ≥ 2019(19.20);不满足时可通过定义THRUST_IGNORE_DEPRECATED_COMPILER临时压制警告;
  4. 设备架构:目标 GPU 计算能力 ≥ SM 35;
  5. 宿主平台:Linux 或 Windows,架构为 x86-64 / aarch64 / ppc64le;
  6. 构建工具:CMake ≥ 3.15(独立构建推荐 ≥ 3.17,C++17+CUDA 需 ≥ 3.18.3)。

只要逐项满足上述条件,即可正常使用 Thrust 的全部并行算法、迭代器与内存管理设施,并顺利通过本仓库 testing 目录下的单元测试验证。若在编译期收到形如Thrust requires at least ...的告警,请回到第 2、3 项核对版本,并视情况通过本文介绍的THRUST_IGNORE_DEPRECATED_*系列宏处理。

  • 科学计算

【免费下载链接】thrust

[ARCHIVED] The C++ parallel algorithms library. See https://github.com/NVIDIA/cccl

项目地址:https://gitcode.com/gh_mirrors/th/thrust
点击查看免费下载
上一篇:WarcraftHelper:魔兽争霸3终极增强插件5分钟快速上手指南
下一篇:WarcraftHelper:三步搞定魔兽争霸3所有兼容问题,立即获得专业级游戏体验

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 8:02:50

钉钉扫码与免登接入统一认证:Hadess 认证链路核心实践

公司内部系统越上越多&#xff0c;账号密码的管理就越让人头疼。前两年我们团队把内部十几个系统的登录全部收敛到了一套认证服务里&#xff0c;对外统一走钉钉扫码和免登&#xff0c;这才彻底解决了"每个系统一套密码、离职账号永远收不回来"的老大难问题。这套认证…

作者头像 李华
网站建设 2026/10/13 8:02:30

OpenClaw Skills安装与失败排查:从原理到实战的完整指南

玩过一阵OpenClaw的朋友应该都有同感——真正的入门门槛不在框架本身&#xff0c;而是"Skills"这层扩展体系的安装和调试。标题写的是"OpenClaw Skills安装与失败处理"&#xff0c;听起来像是文档首页的一句话&#xff0c;实际上这是我自己在模拟项目X里折…

作者头像 李华
网站建设 2026/10/13 8:02:17

开放代码评审实战指南:从流程设计到团队文化落地

1. 从“open-code-review”这个标题说起&#xff1a;它到底想解决什么问题第一次看到“open-code-review”这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率不是一个单纯的工具名&#xff0c;而是一种工作方式的宣言。拆开来看&#xff0c;“open”指向开…

作者头像 李华
网站建设 2026/10/13 8:02:13

OpenRouter 数据通讯缓存设计:语义缓存与大模型 API 成本优化实践

OpenRouter 这名字不少做 AI 应用的人应该不陌生&#xff0c;它本质上是一个聚合了多家大模型 API 的网关&#xff0c;你只要接一个地址&#xff0c;就能按需求切换不同厂商的模型。但网关只是解决了接入的问题&#xff0c;真正让项目跑起来之后你会发现&#xff0c; OpenRout…

作者头像 李华
网站建设 2026/10/13 8:01:34

Copilot与Claude多智能体协同:Antigravity编排实战

1. 多智能体思路的由来&#xff1a;为什么要把Copilot和Claude放进同一个系统 做AI辅助开发这一两年&#xff0c;我最大的感受是&#xff1a;单个AI工具再强&#xff0c;用久了也会碰到天花板。Copilot在代码补全和生成速度上确实快&#xff0c;但独立解决复杂任务时容易"…

作者头像 李华