- 科学计算
【免费下载链接】thrust
[ARCHIVED] The C++ parallel algorithms library. See https://github.com/NVIDIA/cccl
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 编译器、运行时库与头文件 |
官方测试策略有两点值得注意:
- Thrust 与 CUB 的发布版本只针对最新版本的 NVHPC 与 CUDA 进行过测试——即本仓库
main分支的状态只保证与当时最新的工具链组合协同工作; - 非官方支持的组合:虽然可以通过从 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 自带编译器 |
| GCC | 5+ | Linux 下的主流宿主编译器 |
| Clang | 7+ | 含 AppleClang 等衍生版本 |
| MSVC | 2019+(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的多配置模式。
环境自检清单
将全文要求汇总为一份可直接对照的自检清单:
- 系统软件:已安装 CUDA Toolkit 或 NVIDIA HPC SDK(版本尽可能新,以匹配 Thrust
main分支的测试基线); - C++ 标准:编译时使用 C++14 或 C++17;若被迫使用 C++11,留意弃用警告;
- 宿主编译器:NVCC 为最新版;GCC ≥ 5.0、Clang ≥ 7.0、MSVC ≥ 2019(19.20);不满足时可通过定义
THRUST_IGNORE_DEPRECATED_COMPILER临时压制警告; - 设备架构:目标 GPU 计算能力 ≥ SM 35;
- 宿主平台:Linux 或 Windows,架构为 x86-64 / aarch64 / ppc64le;
- 构建工具: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
相关推荐
Lsyncd 源码编译构建指南:环境要求、CMake 配置与安装验证
Lsyncd 源码编译构建指南:环境要求、CMake 配置与安装验证 Lsyncd(Live Syncing Daemon)是一个以 C 语言为核心、以 Lua
后端LAMMPS 构建前提条件全解析:编译器、CMake 与 GNU make 环境要求
LAMMPS 构建前提条件全解析:编译器、CMake 与 GNU make 环境要求 本指南系统梳理 LAMMPS 从源码编译前的软硬件前提条件:C++17 编
科研科学计算高性能计算XenonRecomp构建指南:CMake配置与Clang编译环境搭建
XenonRecomp构建指南:CMake配置与Clang编译环境搭建 XenonRecomp是一个强大的工具,能够将Xbox 360游戏可执行文件重新编译为原
开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考