예 | 갓볼트 | 선적 서류 비치 |
---|
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 README를 참조하세요. 추력은 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에 따라 배포됩니다.