例 | ゴッドボルト | ドキュメント |
---|
Thrust は、C++ 標準ライブラリへの並列アルゴリズムの導入のきっかけとなった C++ 並列アルゴリズム ライブラリです。 Thrust の高レベルインターフェイスは、GPU とマルチコア CPU 間のパフォーマンスの移植性を可能にしながら、プログラマーの生産性を大幅に向上させます。これは、確立された並列プログラミング フレームワーク (CUDA、TBB、OpenMP など) の上に構築されます。また、C++ 標準ライブラリにあるものと同様の汎用機能も多数提供します。
NVIDIA C++ 標準ライブラリはオープンソース プロジェクトです。これは GitHub で入手でき、NVIDIA HPC SDK および CUDA Toolkit に含まれています。これらの 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 ());
}
ゴッドボルトで見る
この例では、いくつかの乱数の合計を並列で計算する方法を示します。
# 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 >());
}
ゴッドボルトで見る
この例は、このような削減を非同期で実行する方法を示しています。
# 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 >());
}
ゴッドボルトで見る
Thrust はヘッダーのみのライブラリです。 Thrust 単体テストを実行する場合を除き、プロジェクトをビルドまたはインストールする必要はありません。
CUDA ツールキットは、最新リリースの Thrust ソース コードをinclude/thrust
で提供します。これはほとんどのユーザーに適しています。
Thrust に貢献したい、または新しい機能を試したいユーザーは、Thrust Github リポジトリを再帰的に複製する必要があります。
git clone --recursive https://github.com/NVIDIA/thrust.git
CMake ベースのプロジェクトの場合、 find_package
で使用する CMake パッケージが提供されています。詳細については、CMake README を参照してください。 Thrust は、 add_subdirectory
または CMake パッケージ マネージャーなどのツールを介して追加することもできます。
非 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 は、LLVM 例外を含む Apache License v2.0 に基づいて配布されます。一部の部分は、Apache License v2.0 および Boost License v1.0 に基づいて配布されています。