O CUB fornece componentes de software reutilizáveis e de última geração para cada camada do modelo de programação CUDA:
O CUB está incluído no NVIDIA HPC SDK e no CUDA Toolkit.
Recomendamos o Website do Projeto CUB para mais informações e exemplos.
# 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);
}
Cada bloco de thread usa cub::BlockRadixSort
para classificar coletivamente seu próprio segmento de entrada. A classe é especializada pelo tipo de dados que está sendo classificado, pelo número de threads por bloco, pelo número de chaves por thread e implicitamente pela arquitetura de compilação alvo.
As classes cub::BlockLoad
e cub::BlockStore
são especializadas de forma semelhante. Além disso, para fornecer acessos unidos à memória do dispositivo, essas primitivas são configuradas para acessar a memória usando um padrão de acesso distribuído (onde threads consecutivos acessam simultaneamente itens consecutivos) e então transpõem as chaves para um arranjo bloqueado de elementos entre threads.
Uma vez especializadas, essas classes expõem tipos de membros opacos TempStorage
. O bloco de thread usa esses tipos de armazenamento para alocar estaticamente a união de memória compartilhada necessária ao bloco de thread. (Como alternativa, esses tipos de armazenamento podem ter alias às alocações de memória global).
O CUB é testado regularmente usando as versões especificadas dos compiladores a seguir. Versões não suportadas podem emitir avisos de descontinuação, que podem ser silenciados definindo CUB_IGNORE_DEPRECATED_COMPILER durante a compilação.
O CUB é distribuído com o NVIDIA HPC SDK e o CUDA Toolkit, além do GitHub.
Consulte o changelog para obter detalhes sobre lançamentos específicos.
Lançamento do CUB | Incluído em |
---|---|
2.0.1 | Kit de ferramentas CUDA 12.0 |
2.0.0 | A definir |
1.17.2 | A definir |
1.17.1 | A definir |
1.17.0 | A definir |
1.16.0 | A definir |
1.15.0 | NVIDIA HPC SDK 22.1 e kit de ferramentas CUDA 11.6 |
1.14.0 | SDK NVIDIA HPC 21.9 |
1.13.1 | Kit de ferramentas CUDA 11.5 |
1.13.0 | SDK NVIDIA HPC 21.7 |
1.12.1 | Kit de ferramentas CUDA 11.4 |
1.12.0 | SDK NVIDIA HPC 21.3 |
1.11.0 | Kit de ferramentas CUDA 11.3 |
1.10.0 | NVIDIA HPC SDK 20.9 e kit de ferramentas CUDA 11.2 |
1.9.10-1 | NVIDIA HPC SDK 20.7 e kit de ferramentas CUDA 11.1 |
1.9.10 | SDK NVIDIA HPC 20.5 |
1.9.9 | Kit de ferramentas CUDA 11.0 |
1.9.8-1 | SDK NVIDIA HPC 20.3 |
1.9.8 | Kit de ferramentas CUDA 11.0 Acesso antecipado |
1.9.8 | Acesso antecipado CUDA 11.0 |
1.8.0 | |
1.7.5 | Impulso 1.9.2 |
1.7.4 | Impulso 1.9.1-2 |
1.7.3 | |
1.7.2 | |
1.7.1 | |
1.7.0 | Impulso 1.9.0-5 |
1.6.4 | |
1.6.3 | |
1.6.2 (anteriormente 1.5.5) | |
1.6.1 (anteriormente 1.5.4) | |
1.6.0 (anteriormente 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 e Thrust dependem um do outro. Recomenda-se clonar o Thrust e construir o CUB como um componente do Thrust.
CUB usa o sistema de construção CMake para construir testes de unidade, exemplos e testes de cabeçalho. Para construir o CUB como desenvolvedor, a seguinte receita deve ser seguida:
# 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
Por padrão, o padrão C++14 é direcionado, mas isso pode ser alterado no CMake. Mais informações sobre como configurar sua construção CUB e criar uma solicitação pull podem ser encontradas em CONTRIBUTING.md.
CUB está disponível sob a licença de código aberto "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.