CUB는 CUDA 프로그래밍 모델의 모든 계층에 대해 재사용 가능한 최첨단 소프트웨어 구성 요소를 제공합니다.
CUB는 NVIDIA HPC SDK 및 CUDA 툴킷에 포함되어 있습니다.
더 많은 정보와 예시를 보려면 CUB 프로젝트 웹사이트를 추천합니다.
# include < cub/cub.cuh >
// Block-sorting CUDA kernel
__global__ void BlockSortKernel ( int *d_in, int *d_out)
{
using namespace cub ;
// Specialize BlockRadixSort, BlockLoad, and BlockStore for 128 threads
// owning 16 integer items each
typedef BlockRadixSort< int , 128 , 16 > BlockRadixSort;
typedef BlockLoad< int , 128 , 16 , BLOCK_LOAD_TRANSPOSE> BlockLoad;
typedef BlockStore< int , 128 , 16 , BLOCK_STORE_TRANSPOSE> BlockStore;
// Allocate shared memory
__shared__ union {
typename BlockRadixSort::TempStorage sort;
typename BlockLoad::TempStorage load;
typename BlockStore::TempStorage store;
} temp_storage;
int block_offset = blockIdx. x * ( 128 * 16 ); // OffsetT for this block's ment
// Obtain a segment of 2048 consecutive keys that are blocked across threads
int thread_keys[ 16 ];
BlockLoad (temp_storage. load ). Load (d_in + block_offset, thread_keys);
__syncthreads ();
// Collectively sort the keys
BlockRadixSort (temp_storage. sort ). Sort (thread_keys);
__syncthreads ();
// Store the sorted segment
BlockStore (temp_storage. store ). Store (d_out + block_offset, thread_keys);
}
각 스레드 블록은 cub::BlockRadixSort
사용하여 자체 입력 세그먼트를 집합적으로 정렬합니다. 클래스는 정렬되는 데이터 유형, 블록당 스레드 수, 스레드당 키 수 및 대상 컴파일 아키텍처에 따라 암시적으로 특수화됩니다.
cub::BlockLoad
및 cub::BlockStore
클래스도 비슷하게 특화되어 있습니다. 또한 장치 메모리에 대한 통합된 액세스를 제공하기 위해 이러한 기본 요소는 스트라이프 액세스 패턴(연속 스레드가 동시에 연속 항목에 액세스하는 경우)을 사용하여 메모리에 액세스한 다음 키를 스레드 전체에 걸쳐 차단된 요소 배열 로 바꾸도록 구성됩니다 .
특수화되면 이러한 클래스는 불투명한 TempStorage
멤버 유형을 노출합니다. 스레드 블록은 이러한 저장소 유형을 사용하여 스레드 블록에 필요한 공유 메모리 통합을 정적으로 할당합니다. (대안으로 이러한 저장소 유형을 전역 메모리 할당으로 별칭화할 수 있습니다.)
CUB는 다음 컴파일러의 지정된 버전을 사용하여 정기적으로 테스트됩니다. 지원되지 않는 버전은 지원 중단 경고를 내보낼 수 있으며, 이는 컴파일 중에 CUB_IGNORE_DEPRECATED_COMPILER를 정의하여 무시할 수 있습니다.
CUB는 GitHub 외에도 NVIDIA HPC SDK 및 CUDA 툴킷과 함께 배포됩니다.
특정 릴리스에 대한 자세한 내용은 변경 로그를 참조하세요.
CUB 릴리스 | 포함됨 |
---|---|
2.0.1 | CUDA 툴킷 12.0 |
2.0.0 | 미정 |
1.17.2 | 미정 |
1.17.1 | 미정 |
1.17.0 | 미정 |
1.16.0 | 미정 |
1.15.0 | NVIDIA HPC SDK 22.1 및 CUDA 툴킷 11.6 |
1.14.0 | 엔비디아 HPC SDK 21.9 |
1.13.1 | CUDA 툴킷 11.5 |
1.13.0 | 엔비디아 HPC SDK 21.7 |
1.12.1 | CUDA 툴킷 11.4 |
1.12.0 | 엔비디아 HPC SDK 21.3 |
1.11.0 | CUDA 툴킷 11.3 |
1.10.0 | NVIDIA HPC SDK 20.9 및 CUDA 툴킷 11.2 |
1.9.10-1 | NVIDIA HPC SDK 20.7 및 CUDA 툴킷 11.1 |
1.9.10 | 엔비디아 HPC SDK 20.5 |
1.9.9 | CUDA 툴킷 11.0 |
1.9.8-1 | 엔비디아 HPC SDK 20.3 |
1.9.8 | CUDA 툴킷 11.0 조기 액세스 |
1.9.8 | CUDA 11.0 조기 액세스 |
1.8.0 | |
1.7.5 | 추력 1.9.2 |
1.7.4 | 추력 1.9.1-2 |
1.7.3 | |
1.7.2 | |
1.7.1 | |
1.7.0 | 추력 1.9.0-5 |
1.6.4 | |
1.6.3 | |
1.6.2 (이전 1.5.5) | |
1.6.1(이전 1.5.4) | |
1.6.0(이전 1.5.3) | |
1.5.2 | |
1.5.1 | |
1.5.0 | |
1.4.1 | |
1.4.0 | |
1.3.2 | |
1.3.1 | |
1.3.0 | |
1.2.3 | |
1.2.2 | |
1.2.0 | |
1.1.1 | |
1.0.2 | |
1.0.1 | |
0.9.4 | |
0.9.2 | |
0.9.1 | |
0.9.0 |
CUB와 Thrust는 서로 의존합니다. Thrust를 복제하여 Thrust의 구성 요소로 CUB를 빌드하는 것이 좋습니다.
CUB는 CMake 빌드 시스템을 사용하여 단위 테스트, 예제 및 헤더 테스트를 빌드합니다. 개발자로서 CUB를 빌드하려면 다음 방법을 따라야 합니다.
# Clone Thrust and CUB from Github. CUB is located in Thrust's
# `dependencies/cub` submodule.
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 -DTHRUST_INCLUDE_CUB_CMAKE=ON .. # Command line interface.
ccmake -DTHRUST_INCLUDE_CUB_CMAKE=ON .. # ncurses GUI (Linux only)
cmake-gui # Graphical UI, set source/build directories and options in the app
# Build:
cmake --build . -j < num jobs > # invokes make (or ninja, etc)
# Run tests and examples:
ctest
기본적으로 C++14 표준이 대상이지만 CMake에서 변경할 수 있습니다. CUB 빌드 구성 및 풀 요청 생성에 대한 자세한 내용은 CONTRIBUTING.md에서 확인할 수 있습니다.
CUB는 "New BSD" 오픈 소스 라이선스에 따라 제공됩니다.
Copyright (c) 2010-2011, Duane Merrill. All rights reserved.
Copyright (c) 2011-2018, NVIDIA CORPORATION. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the NVIDIA CORPORATION nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.