範例 | 神箭 | 文件 |
---|
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 分發的。