Beispiele | Gottbolt | Dokumentation |
---|
Thrust ist die C++-Bibliothek für parallele Algorithmen, die die Einführung paralleler Algorithmen in die C++-Standardbibliothek inspirierte. Die High-Level -Schnittstelle von Thrust steigert die Produktivität von Programmierern erheblich und ermöglicht gleichzeitig die Leistungsportabilität zwischen GPUs und Multicore-CPUs. Es baut auf etablierten parallelen Programmier-Frameworks (wie CUDA, TBB und OpenMP) auf. Es bietet außerdem eine Reihe allgemeiner Funktionen, die denen der C++-Standardbibliothek ähneln.
Die NVIDIA C++-Standardbibliothek ist ein Open-Source-Projekt; Es ist auf GitHub verfügbar und im NVIDIA HPC SDK und CUDA Toolkit enthalten. Wenn Sie eines dieser SDKs installiert haben, sind für die Verwendung von libcu++ keine zusätzlichen Installations- oder Compiler-Flags erforderlich.
Schub lässt sich am besten anhand von Beispielen erlernen.
Im folgenden Beispiel werden Zufallszahlen seriell generiert und anschließend an ein Parallelgerät übertragen, wo sie sortiert werden.
# 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 ());
}
Sehen Sie es auf Godbolt
Dieses Beispiel zeigt die parallele Berechnung der Summe einiger Zufallszahlen:
# 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 >());
}
Sehen Sie es auf Godbolt
Dieses Beispiel zeigt, wie eine solche Reduzierung asynchron durchgeführt wird:
# 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 >());
}
Sehen Sie es auf Godbolt
Thrust ist eine reine Header-Bibliothek; Es ist nicht erforderlich, das Projekt zu erstellen oder zu installieren, es sei denn, Sie möchten die Thrust-Komponententests ausführen.
Das CUDA Toolkit stellt eine aktuelle Version des Thrust-Quellcodes in include/thrust
bereit. Dies wird für die meisten Benutzer geeignet sein.
Benutzer, die zu Thrust beitragen oder neuere Funktionen ausprobieren möchten, sollten das Thrust-Github-Repository rekursiv klonen:
git clone --recursive https://github.com/NVIDIA/thrust.git
Für CMake-basierte Projekte stellen wir ein CMake-Paket zur Verwendung mit find_package
bereit. Weitere Informationen finden Sie in der CMake-README-Datei. Thrust kann auch über add_subdirectory
oder Tools wie den CMake Package Manager hinzugefügt werden.
Kompilieren Sie für Nicht-CMake-Projekte mit:
-I<thrust repo root>
)-I<thrust repo root>/dependencies/libcudacxx/
)-I<thrust repo root>/dependencies/cub/
)-DTHRUST_HOST_SYSTEM=THRUST_HOST_SYSTEM_XXX
, wobei XXX
CPP
(seriell, Standard), OMP
(OpenMP) oder TBB
(Intel TBB) ist.-DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_XXX
, wobei XXX
CPP
, OMP
, TBB
oder CUDA
(Standard) ist. Thrust verwendet das CMake-Build-System, um Unit-Tests, Beispiele und Header-Tests zu erstellen. Um Thrust als Entwickler aufzubauen, wird empfohlen, unser Container-Entwicklungssystem zu verwenden:
# 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
Dies entspricht dem Folgenden, jedoch in einer sauberen Containerumgebung, in der alle Abhängigkeiten installiert sind:
# 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
Standardmäßig werden ein serielles CPP
Hostsystem, CUDA
beschleunigtes Gerätesystem und der C++14-Standard verwendet. Dies kann in CMake und über Flags in ci/local/build.bash
geändert werden
Weitere Informationen zum Konfigurieren Ihres Thrust-Builds und zum Erstellen einer Pull-Anfrage finden Sie im Abschnitt „Mitwirken“.
Thrust ist ein Open-Source-Projekt, das auf GitHub entwickelt wurde. Thrust wird unter der Apache-Lizenz v2.0 mit LLVM-Ausnahmen vertrieben; Einige Teile werden unter der Apache-Lizenz v2.0 und der Boost-Lizenz v1.0 vertrieben.