我目前正在使用 Thrust 在 GPU 和 CPU 之间传输数据。但是当我在代码中包含
<thrust/universal_vector.h>
并使用 CMake 配置项目时,弹出“致命错误:没有这样的文件或目录”。
安装 CUDA 和 CUDA Toolkit 后我不需要安装 Thrust,正如 Nvidia 所说:
安装 CUDA Toolkit 会将 Thrust 头文件复制到标准 CUDA include 您系统的目录。由于Thrust是头文件的模板库,所以不再赘述 需要安装才能开始使用 Thrust。
我检查了我计算机上
thrust
目录中CUDA工具包安装中包含的include
目录,我没有找到官方Thrust GitHub存储库中存在的几个文件,例如universal_allocator.h
, universal_ptr.h
,universal_vector.h
。
这是我的
CMakeLists.txt
:
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_BUILD_TYPE Release)
project(hellocuda LANGUAGES CXX CUDA)
add_executable(main main.cu)
target_include_directories(main PUBLIC ../../include)
target_compile_options(main PUBLIC $<$<COMPILE_LANGUAGE:CUDA>:--extended-lambda>)
target_compile_options(main PUBLIC $<$<COMPILE_LANGUAGE:CUDA>:--expt-relaxed-constexpr>)
我不能只下载 Thrust 存储库并包含在
CMakeLists.txt
中,因为我缺少其他依赖项。只需将文件 universal_allocator.h
、universal_ptr.h
、universal_vector.h
复制到 CUDA 目录中包含的 Thrust 目录也不起作用,但会出现很多错误。
我还用
nvcc --version
检查我的 CUDA 版本:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Oct_12_20:09:46_PDT_2020
Cuda compilation tools, release 11.1, V11.1.105
Build cuda_11.1.TC455_06.29190527_0
我实际上使用CMake成功运行了一些CUDA代码,所以我认为CUDA版本应该没有错误。
正如 talonmies 的评论中所指出的,
universal_
API 是 Thrust 相对较新的新增内容。它们附带 Thrust v1.12,包含在 CUDA Toolkit v11.4 和 Nvidia HPC SDK v21.3 中。
但是,您仍然可以从 GitHub 获取整个 Thrust,以便将较新版本的 Thrust 与较旧版本的 CUDA 结合使用。请参阅获取推力源代码(重点是我的):
CUDA 工具包提供了最新版本的 Thrust 源代码 在
。这适合大多数用户。include/thrust
希望为 Thrust 做出贡献或尝试新功能的用户 应该递归克隆 Thrust Github 存储库:
git clone --recursive https://github.com/NVIDIA/thrust.git
Thrust 的最新版本不在存档的 Thrust 存储库中,而是在较新的 CCCL 存储库中,其中包含自己的入门 - 用户(重点是我的):
GitHub
想要保持 CCCL 开发前沿的用户是 鼓励使用 GitHub 上的 CCCL。 使用较新版本的 CCCL 支持旧版本的 CUDA 工具包,但不支持其他版本 绕路。有关 CCCL 和 CCCL 之间兼容性的完整信息 CUDA 工具包,请参阅我们的平台支持。
CCCL 中的所有内容都只是标头,因此克隆并将其包含在 简单的项目如下所示:
git clone https://github.com/NVIDIA/cccl.git nvcc -Icccl/thrust -Icccl/libcudacxx/include -Icccl/cub main.cu -o main
注意 使用
而不是-I
以避免与 CUDA 工具包中的-isystem
隐式包含的 CCCL 标头发生冲突。全部CCCL 标题使用nvcc
来确保警告仍然存在 就像使用#pragma system_header
一样静音,参见 #527 了解更多信息。-isystem
两个引用的 README 文件还包含有关 CMake 使用的更多信息。