Примеры | Богболт | Документация |
---|
Thrust — это библиотека параллельных алгоритмов C++, которая вдохновила на введение параллельных алгоритмов в стандартную библиотеку C++. Высокоуровневый интерфейс Thrust значительно повышает производительность программистов, обеспечивая при этом переносимость производительности между графическими процессорами и многоядерными процессорами. Он построен на основе существующих платформ параллельного программирования (таких как 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 ());
}
Посмотрите это на 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 Toolkit предоставляет недавнюю версию исходного кода Thrust в include/thrust
. Это подойдет большинству пользователей.
Пользователи, желающие внести свой вклад в Thrust или опробовать новые функции, должны рекурсивно клонировать репозиторий Thrust Github:
git clone --recursive https://github.com/NVIDIA/thrust.git
Для проектов на основе CMake мы предоставляем пакет CMake для использования с find_package
. Дополнительную информацию см. в README CMake. 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 распространяется по лицензии Apache v2.0 с исключениями LLVM; некоторые части распространяются по лицензии Apache v2.0 и Boost License v1.0.