示例 | 神箭 | 文档 |
---|
Thrust 是 C++ 并行算法库,它启发了 C++ 标准库中引入并行算法。 Thrust 的高级接口极大地提高了程序员的工作效率,同时实现了 GPU 和多核 CPU 之间的性能可移植性。它构建在已建立的并行编程框架(例如 CUDA、TBB 和 OpenMP)之上。它还提供了许多类似于 C++ 标准库中的通用工具。
NVIDIA C++ 标准库是一个开源项目;它可在 GitHub 上获取,并包含在 NVIDIA HPC SDK 和 CUDA 工具包中。如果您安装了这些 SDK 之一,则无需额外安装或编译器标志即可使用 libcu++。
推力最好通过例子来学习。
以下示例按顺序生成随机数,然后将它们传输到并行设备并进行排序。
# include < thrust/host_vector.h >
# include < thrust/device_vector.h >
# include < thrust/generate.h >
# include < thrust/sort.h >
# include < thrust/copy.h >
# include < thrust/random.h >
int main () {
// Generate 32M random numbers serially.
thrust::default_random_engine rng ( 1337 );
thrust::uniform_int_distribution< int > dist;
thrust::host_vector< int > h_vec ( 32 << 20 );
thrust::generate (h_vec. begin (), h_vec. end (), [&] { return dist (rng); });
// Transfer data to the device.
thrust::device_vector< int > d_vec = h_vec;
// Sort data on the device.
thrust::sort (d_vec. begin (), d_vec. end ());
// Transfer data back to host.
thrust::copy (d_vec. begin (), d_vec. end (), h_vec. begin ());
}
在 Godbolt 上查看
此示例演示并行计算一些随机数的总和:
# include < thrust/host_vector.h >
# include < thrust/device_vector.h >
# include < thrust/generate.h >
# include < thrust/reduce.h >
# include < thrust/functional.h >
# include < thrust/random.h >
int main () {
// Generate random data serially.
thrust::default_random_engine rng ( 1337 );
thrust::uniform_real_distribution< double > dist (- 50.0 , 50.0 );
thrust::host_vector< double > h_vec ( 32 << 20 );
thrust::generate (h_vec. begin (), h_vec. end (), [&] { return dist (rng); });
// Transfer to device and compute the sum.
thrust::device_vector< double > d_vec = h_vec;
double x = thrust::reduce (d_vec. begin (), d_vec. end (), 0 , thrust::plus< int >());
}
在 Godbolt 上查看
此示例展示了如何异步执行此类缩减:
# include < thrust/host_vector.h >
# include < thrust/device_vector.h >
# include < thrust/generate.h >
# include < thrust/async/copy.h >
# include < thrust/async/reduce.h >
# include < thrust/functional.h >
# include < thrust/random.h >
# include < numeric >
int main () {
// Generate 32M random numbers serially.
thrust::default_random_engine rng ( 123456 );
thrust::uniform_real_distribution< double > dist (- 50.0 , 50.0 );
thrust::host_vector< double > h_vec ( 32 << 20 );
thrust::generate (h_vec. begin (), h_vec. end (), [&] { return dist (rng); });
// Asynchronously transfer to the device.
thrust::device_vector< double > d_vec (h_vec. size ());
thrust::device_event e = thrust::async::copy (h_vec. begin (), h_vec. end (),
d_vec. begin ());
// After the transfer completes, asynchronously compute the sum on the device.
thrust::device_future< double > f0 = thrust::async::reduce (thrust::device. after (e),
d_vec. begin (), d_vec. end (),
0.0 , thrust::plus< double >());
// While the sum is being computed on the device, compute the sum serially on
// the host.
double f1 = std::accumulate (h_vec. begin (), h_vec. end (), 0.0 , thrust::plus< double >());
}
在 Godbolt 上查看
Thrust 是一个仅包含头文件的库;除非您想运行 Thrust 单元测试,否则无需构建或安装项目。
CUDA 工具包在include/thrust
中提供了最新版本的 Thrust 源代码。这适合大多数用户。
希望为 Thrust 做出贡献或尝试更新功能的用户应该递归克隆 Thrust Github 存储库:
git clone --recursive https://github.com/NVIDIA/thrust.git
对于基于 CMake 的项目,我们提供了一个与find_package
一起使用的 CMake 包。有关更多信息,请参阅 CMake 自述文件。还可以通过add_subdirectory
或 CMake 包管理器等工具添加 Thrust。
对于非 CMake 项目,请使用以下命令进行编译:
-I<thrust repo root>
)-I<thrust repo root>/dependencies/libcudacxx/
)-I<thrust repo root>/dependencies/cub/
)-DTHRUST_HOST_SYSTEM=THRUST_HOST_SYSTEM_XXX
,其中XXX
是CPP
(串行,默认)、 OMP
(OpenMP) 或TBB
(Intel TBB)-DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_XXX
,其中XXX
是CPP
、 OMP
、 TBB
或CUDA
(默认)。 Thrust 使用 CMake 构建系统来构建单元测试、示例和标头测试。作为开发人员构建Thrust,建议您使用我们的容器化开发系统:
# Clone Thrust and CUB repos recursively:
git clone --recursive https://github.com/NVIDIA/thrust.git
cd thrust
# Build and run tests and examples:
ci/local/build.bash
这相当于以下操作,但在安装了所有依赖项的干净容器化环境中:
# Clone Thrust and CUB repos recursively:
git clone --recursive https://github.com/NVIDIA/thrust.git
cd thrust
# Create build directory:
mkdir build
cd build
# Configure -- use one of the following:
cmake .. # Command line interface.
ccmake .. # ncurses GUI (Linux only).
cmake-gui # Graphical UI, set source/build directories in the app.
# Build:
cmake --build . -j ${NUM_JOBS} # Invokes make (or ninja, etc).
# Run tests and examples:
ctest
默认使用串行CPP
主机系统、 CUDA
加速设备系统和C++14标准。这可以在 CMake 中并通过ci/local/build.bash
标志进行更改
有关配置 Thrust 构建和创建拉取请求的更多信息可以在贡献部分找到。
Thrust 是一个在 GitHub 上开发的开源项目。 Thrust 是在 Apache License v2.0 with LLVM Exceptions 下分发的;某些部分是根据 Apache License v2.0 和 Boost License v1.0 分发的。