CUB  
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Classes | List of all members
cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH > Class Template Reference

Detailed description

template< typename T, int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
class cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >

The WarpScan class provides collective methods for computing a parallel prefix scan of items partitioned across a CUDA thread warp.

warp_scan_logo.png
.
Template Parameters
TThe scan input/output element type
LOGICAL_WARP_THREADS[optional] The number of threads per "logical" warp (may be less than the number of hardware warp threads). Default is the warp size associated with the CUDA Compute Capability targeted by the compiler (e.g., 32 threads for SM20).
PTX_ARCH[optional] The PTX compute capability for which to to specialize this collective, formatted as per the CUDA_ARCH macro (e.g., 350 for sm_35). Useful for determining the collective's storage requirements for a given device from the host. (Default: the value of CUDA_ARCH during the current compiler pass)
Overview
  • Given a list of input elements and a binary reduction operator, a prefix scan produces an output list where each element is computed to be the reduction of the elements occurring earlier in the input list. Prefix sum connotes a prefix scan with the addition operator. The term inclusive indicates that the ith output reduction incorporates the ith input. The term exclusive indicates the ith input is not incorporated into the ith output reduction.
  • Supports non-commutative scan operators
  • Supports "logical" warps smaller than the physical warp size (e.g., a logical warp of 8 threads)
  • The number of entrant threads must be an multiple of LOGICAL_WARP_THREADS
Performance Considerations
  • Uses special instructions when applicable (e.g., warp SHFL)
  • Uses synchronization-free communication between warp lanes when applicable
  • Incurs zero bank conflicts for most types
  • Computation is slightly more efficient (i.e., having lower instruction overhead) for:
    • Summation (vs. generic scan)
    • The architecture's warp size is a whole multiple of LOGICAL_WARP_THREADS
Simple Examples
Every thread in the warp uses the WarpScan class by first specializing the WarpScan type, then instantiating an instance with parameters for communication, and finally invoking or more collective member functions.
The code snippet below illustrates four concurrent warp prefix sums within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute warp-wide prefix sums
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).ExclusiveSum(thread_data, thread_data);
Suppose the set of input thread_data across the block of threads is {1, 1, 1, 1, ...}. The corresponding output thread_data in each of the four warps of threads will be 0, 1, 2, 3, ..., 31}.
The code snippet below illustrates a single warp prefix sum within a block of 128 threads.
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for one warp
__shared__ typename WarpScan::TempStorage temp_storage;
...
// Only the first warp performs a prefix sum
if (threadIdx.x < 32)
{
// Obtain one input item per thread
int thread_data = ...
// Compute warp-wide prefix sums
WarpScan(temp_storage).ExclusiveSum(thread_data, thread_data);
Suppose the set of input thread_data across the warp of threads is {1, 1, 1, 1, ...}. The corresponding output thread_data will be {0, 1, 2, 3, ..., 31}.

Classes

struct  TempStorage
 The operations exposed by WarpScan require a temporary memory allocation of this nested type for thread communication. This opaque storage can be allocated directly using the __shared__ keyword. Alternatively, it can be aliased to externally allocated memory (shared or global) or union'd with other storage allocation types to facilitate memory reuse. More...
 

Public Methods

Collective constructors
__device__ __forceinline__ WarpScan (TempStorage &temp_storage)
 Collective constructor using the specified memory allocation as temporary storage. Logical warp and lane identifiers are constructed from threadIdx.x. More...
 
Inclusive prefix sums
__device__ __forceinline__ void InclusiveSum (T input, T &inclusive_output)
 Computes an inclusive prefix sum across the calling warp. More...
 
__device__ __forceinline__ void InclusiveSum (T input, T &inclusive_output, T &warp_aggregate)
 Computes an inclusive prefix sum across the calling warp. Also provides every thread with the warp-wide warp_aggregate of all inputs. More...
 
Exclusive prefix sums
__device__ __forceinline__ void ExclusiveSum (T input, T &exclusive_output)
 Computes an exclusive prefix sum across the calling warp. The value of 0 is applied as the initial value, and is assigned to exclusive_output in thread0. More...
 
__device__ __forceinline__ void ExclusiveSum (T input, T &exclusive_output, T &warp_aggregate)
 Computes an exclusive prefix sum across the calling warp. The value of 0 is applied as the initial value, and is assigned to exclusive_output in thread0. Also provides every thread with the warp-wide warp_aggregate of all inputs. More...
 
Inclusive prefix scans
template<typename ScanOp >
__device__ __forceinline__ void InclusiveScan (T input, T &inclusive_output, ScanOp scan_op)
 Computes an inclusive prefix scan using the specified binary scan functor across the calling warp. More...
 
template<typename ScanOp >
__device__ __forceinline__ void InclusiveScan (T input, T &inclusive_output, ScanOp scan_op, T &warp_aggregate)
 Computes an inclusive prefix scan using the specified binary scan functor across the calling warp. Also provides every thread with the warp-wide warp_aggregate of all inputs. More...
 
Exclusive prefix scans
template<typename ScanOp >
__device__ __forceinline__ void ExclusiveScan (T input, T &exclusive_output, ScanOp scan_op)
 Computes an exclusive prefix scan using the specified binary scan functor across the calling warp. Because no initial value is supplied, the output computed for warp-lane0 is undefined. More...
 
template<typename ScanOp >
__device__ __forceinline__ void ExclusiveScan (T input, T &exclusive_output, T initial_value, ScanOp scan_op)
 Computes an exclusive prefix scan using the specified binary scan functor across the calling warp. More...
 
template<typename ScanOp >
__device__ __forceinline__ void ExclusiveScan (T input, T &exclusive_output, ScanOp scan_op, T &warp_aggregate)
 Computes an exclusive prefix scan using the specified binary scan functor across the calling warp. Because no initial value is supplied, the output computed for warp-lane0 is undefined. Also provides every thread with the warp-wide warp_aggregate of all inputs. More...
 
template<typename ScanOp >
__device__ __forceinline__ void ExclusiveScan (T input, T &exclusive_output, T initial_value, ScanOp scan_op, T &warp_aggregate)
 Computes an exclusive prefix scan using the specified binary scan functor across the calling warp. Also provides every thread with the warp-wide warp_aggregate of all inputs. More...
 
Combination (inclusive & exclusive) prefix scans
template<typename ScanOp >
__device__ __forceinline__ void Scan (T input, T &inclusive_output, T &exclusive_output, ScanOp scan_op)
 Computes both inclusive and exclusive prefix scans using the specified binary scan functor across the calling warp. Because no initial value is supplied, the exclusive_output computed for warp-lane0 is undefined. More...
 
template<typename ScanOp >
__device__ __forceinline__ void Scan (T input, T &inclusive_output, T &exclusive_output, T initial_value, ScanOp scan_op)
 Computes both inclusive and exclusive prefix scans using the specified binary scan functor across the calling warp. More...
 
Data exchange
__device__ __forceinline__ T Broadcast (T input, unsigned int src_lane)
 Broadcast the value input from warp-lanesrc_lane to all lanes in the warp. More...
 

Constructor & Destructor Documentation

template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
__device__ __forceinline__ cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::WarpScan ( TempStorage temp_storage)
inline

Collective constructor using the specified memory allocation as temporary storage. Logical warp and lane identifiers are constructed from threadIdx.x.

Parameters
[in]temp_storageReference to memory allocation having layout type TempStorage

Member Function Documentation

template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::InclusiveSum ( input,
T &  inclusive_output 
)
inline

Computes an inclusive prefix sum across the calling warp.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide inclusive prefix sums within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute inclusive warp-wide prefix sums
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).InclusiveSum(thread_data, thread_data);
Suppose the set of input thread_data across the block of threads is {1, 1, 1, 1, ...}. The corresponding output thread_data in each of the four warps of threads will be 1, 2, 3, ..., 32}.
Parameters
[in]inputCalling thread's input item.
[out]inclusive_outputCalling thread's output item. May be aliased with input.
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::InclusiveSum ( input,
T &  inclusive_output,
T &  warp_aggregate 
)
inline

Computes an inclusive prefix sum across the calling warp. Also provides every thread with the warp-wide warp_aggregate of all inputs.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide inclusive prefix sums within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute inclusive warp-wide prefix sums
int warp_aggregate;
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).InclusiveSum(thread_data, thread_data, warp_aggregate);
Suppose the set of input thread_data across the block of threads is {1, 1, 1, 1, ...}. The corresponding output thread_data in each of the four warps of threads will be 1, 2, 3, ..., 32}. Furthermore, warp_aggregate for all threads in all warps will be 32.
Parameters
[in]inputCalling thread's input item.
[out]inclusive_outputCalling thread's output item. May be aliased with input.
[out]warp_aggregateWarp-wide aggregate reduction of input items.
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::ExclusiveSum ( input,
T &  exclusive_output 
)
inline

Computes an exclusive prefix sum across the calling warp. The value of 0 is applied as the initial value, and is assigned to exclusive_output in thread0.

  • This operation assumes the value of obtained by the T's default constructor (or by zero-initialization if no user-defined default constructor exists) is suitable as the identity value zero for addition.
  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide exclusive prefix sums within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute exclusive warp-wide prefix sums
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).ExclusiveSum(thread_data, thread_data);
Suppose the set of input thread_data across the block of threads is {1, 1, 1, 1, ...}. The corresponding output thread_data in each of the four warps of threads will be 0, 1, 2, ..., 31}.
Parameters
[in]inputCalling thread's input item.
[out]exclusive_outputCalling thread's output item. May be aliased with input.
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::ExclusiveSum ( input,
T &  exclusive_output,
T &  warp_aggregate 
)
inline

Computes an exclusive prefix sum across the calling warp. The value of 0 is applied as the initial value, and is assigned to exclusive_output in thread0. Also provides every thread with the warp-wide warp_aggregate of all inputs.

  • This operation assumes the value of obtained by the T's default constructor (or by zero-initialization if no user-defined default constructor exists) is suitable as the identity value zero for addition.
  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide exclusive prefix sums within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute exclusive warp-wide prefix sums
int warp_aggregate;
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).ExclusiveSum(thread_data, thread_data, warp_aggregate);
Suppose the set of input thread_data across the block of threads is {1, 1, 1, 1, ...}. The corresponding output thread_data in each of the four warps of threads will be 0, 1, 2, ..., 31}. Furthermore, warp_aggregate for all threads in all warps will be 32.
Parameters
[in]inputCalling thread's input item.
[out]exclusive_outputCalling thread's output item. May be aliased with input.
[out]warp_aggregateWarp-wide aggregate reduction of input items.
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
template<typename ScanOp >
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::InclusiveScan ( input,
T &  inclusive_output,
ScanOp  scan_op 
)
inline

Computes an inclusive prefix scan using the specified binary scan functor across the calling warp.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide inclusive prefix max scans within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute inclusive warp-wide prefix max scans
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).InclusiveScan(thread_data, thread_data, cub::Max());
Suppose the set of input thread_data across the block of threads is {0, -1, 2, -3, ..., 126, -127}. The corresponding output thread_data in the first warp would be 0, 0, 2, 2, ..., 30, 30, the output for the second warp would be 32, 32, 34, 34, ..., 62, 62, etc.
Template Parameters
ScanOp[inferred] Binary scan operator type having member T operator()(const T &a, const T &b)
Parameters
[in]inputCalling thread's input item.
[out]inclusive_outputCalling thread's output item. May be aliased with input.
[in]scan_opBinary scan operator
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
template<typename ScanOp >
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::InclusiveScan ( input,
T &  inclusive_output,
ScanOp  scan_op,
T &  warp_aggregate 
)
inline

Computes an inclusive prefix scan using the specified binary scan functor across the calling warp. Also provides every thread with the warp-wide warp_aggregate of all inputs.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide inclusive prefix max scans within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute inclusive warp-wide prefix max scans
int warp_aggregate;
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).InclusiveScan(
thread_data, thread_data, cub::Max(), warp_aggregate);
Suppose the set of input thread_data across the block of threads is {0, -1, 2, -3, ..., 126, -127}. The corresponding output thread_data in the first warp would be 0, 0, 2, 2, ..., 30, 30, the output for the second warp would be 32, 32, 34, 34, ..., 62, 62, etc. Furthermore, warp_aggregate would be assigned 30 for threads in the first warp, 62 for threads in the second warp, etc.
Template Parameters
ScanOp[inferred] Binary scan operator type having member T operator()(const T &a, const T &b)
Parameters
[in]inputCalling thread's input item.
[out]inclusive_outputCalling thread's output item. May be aliased with input.
[in]scan_opBinary scan operator
[out]warp_aggregateWarp-wide aggregate reduction of input items.
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
template<typename ScanOp >
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::ExclusiveScan ( input,
T &  exclusive_output,
ScanOp  scan_op 
)
inline

Computes an exclusive prefix scan using the specified binary scan functor across the calling warp. Because no initial value is supplied, the output computed for warp-lane0 is undefined.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide exclusive prefix max scans within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute exclusive warp-wide prefix max scans
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).ExclusiveScan(thread_data, thread_data, cub::Max());
Suppose the set of input thread_data across the block of threads is {0, -1, 2, -3, ..., 126, -127}. The corresponding output thread_data in the first warp would be ?, 0, 0, 2, ..., 28, 30, the output for the second warp would be ?, 32, 32, 34, ..., 60, 62, etc. (The output thread_data in warp lane0 is undefined.)
Template Parameters
ScanOp[inferred] Binary scan operator type having member T operator()(const T &a, const T &b)
Parameters
[in]inputCalling thread's input item.
[out]exclusive_outputCalling thread's output item. May be aliased with input.
[in]scan_opBinary scan operator
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
template<typename ScanOp >
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::ExclusiveScan ( input,
T &  exclusive_output,
initial_value,
ScanOp  scan_op 
)
inline

Computes an exclusive prefix scan using the specified binary scan functor across the calling warp.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide exclusive prefix max scans within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute exclusive warp-wide prefix max scans
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).ExclusiveScan(thread_data, thread_data, INT_MIN, cub::Max());
Suppose the set of input thread_data across the block of threads is {0, -1, 2, -3, ..., 126, -127}. The corresponding output thread_data in the first warp would be INT_MIN, 0, 0, 2, ..., 28, 30, the output for the second warp would be 30, 32, 32, 34, ..., 60, 62, etc.
Template Parameters
ScanOp[inferred] Binary scan operator type having member T operator()(const T &a, const T &b)
Parameters
[in]inputCalling thread's input item.
[out]exclusive_outputCalling thread's output item. May be aliased with input.
[in]initial_valueInitial value to seed the exclusive scan
[in]scan_opBinary scan operator
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
template<typename ScanOp >
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::ExclusiveScan ( input,
T &  exclusive_output,
ScanOp  scan_op,
T &  warp_aggregate 
)
inline

Computes an exclusive prefix scan using the specified binary scan functor across the calling warp. Because no initial value is supplied, the output computed for warp-lane0 is undefined. Also provides every thread with the warp-wide warp_aggregate of all inputs.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide exclusive prefix max scans within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute exclusive warp-wide prefix max scans
int warp_aggregate;
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).ExclusiveScan(thread_data, thread_data, cub::Max(), warp_aggregate);
Suppose the set of input thread_data across the block of threads is {0, -1, 2, -3, ..., 126, -127}. The corresponding output thread_data in the first warp would be ?, 0, 0, 2, ..., 28, 30, the output for the second warp would be ?, 32, 32, 34, ..., 60, 62, etc. (The output thread_data in warp lane0 is undefined.) Furthermore, warp_aggregate would be assigned 30 for threads in the first warp, 62 for threads in the second warp, etc.
Template Parameters
ScanOp[inferred] Binary scan operator type having member T operator()(const T &a, const T &b)
Parameters
[in]inputCalling thread's input item.
[out]exclusive_outputCalling thread's output item. May be aliased with input.
[in]scan_opBinary scan operator
[out]warp_aggregateWarp-wide aggregate reduction of input items.
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
template<typename ScanOp >
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::ExclusiveScan ( input,
T &  exclusive_output,
initial_value,
ScanOp  scan_op,
T &  warp_aggregate 
)
inline

Computes an exclusive prefix scan using the specified binary scan functor across the calling warp. Also provides every thread with the warp-wide warp_aggregate of all inputs.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide exclusive prefix max scans within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute exclusive warp-wide prefix max scans
int warp_aggregate;
int warp_id = threadIdx.x / 32;
WarpScan(temp_storage[warp_id]).ExclusiveScan(thread_data, thread_data, INT_MIN, cub::Max(), warp_aggregate);
Suppose the set of input thread_data across the block of threads is {0, -1, 2, -3, ..., 126, -127}. The corresponding output thread_data in the first warp would be INT_MIN, 0, 0, 2, ..., 28, 30, the output for the second warp would be 30, 32, 32, 34, ..., 60, 62, etc. Furthermore, warp_aggregate would be assigned 30 for threads in the first warp, 62 for threads in the second warp, etc.
Template Parameters
ScanOp[inferred] Binary scan operator type having member T operator()(const T &a, const T &b)
Parameters
[in]inputCalling thread's input item.
[out]exclusive_outputCalling thread's output item. May be aliased with input.
[in]initial_valueInitial value to seed the exclusive scan
[in]scan_opBinary scan operator
[out]warp_aggregateWarp-wide aggregate reduction of input items.
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
template<typename ScanOp >
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::Scan ( input,
T &  inclusive_output,
T &  exclusive_output,
ScanOp  scan_op 
)
inline

Computes both inclusive and exclusive prefix scans using the specified binary scan functor across the calling warp. Because no initial value is supplied, the exclusive_output computed for warp-lane0 is undefined.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide exclusive prefix max scans within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute exclusive warp-wide prefix max scans
int inclusive_partial, exclusive_partial;
WarpScan(temp_storage[warp_id]).Scan(thread_data, inclusive_partial, exclusive_partial, cub::Max());
Suppose the set of input thread_data across the block of threads is {0, -1, 2, -3, ..., 126, -127}. The corresponding output inclusive_partial in the first warp would be 0, 0, 2, 2, ..., 30, 30, the output for the second warp would be 32, 32, 34, 34, ..., 62, 62, etc. The corresponding output exclusive_partial in the first warp would be ?, 0, 0, 2, ..., 28, 30, the output for the second warp would be ?, 32, 32, 34, ..., 60, 62, etc. (The output thread_data in warp lane0 is undefined.)
Template Parameters
ScanOp[inferred] Binary scan operator type having member T operator()(const T &a, const T &b)
Parameters
[in]inputCalling thread's input item.
[out]inclusive_outputCalling thread's inclusive-scan output item.
[out]exclusive_outputCalling thread's exclusive-scan output item.
[in]scan_opBinary scan operator
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
template<typename ScanOp >
__device__ __forceinline__ void cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::Scan ( input,
T &  inclusive_output,
T &  exclusive_output,
initial_value,
ScanOp  scan_op 
)
inline

Computes both inclusive and exclusive prefix scans using the specified binary scan functor across the calling warp.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates four concurrent warp-wide prefix max scans within a block of 128 threads (one per each of the 32-thread warps).
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Compute inclusive warp-wide prefix max scans
int warp_id = threadIdx.x / 32;
int inclusive_partial, exclusive_partial;
WarpScan(temp_storage[warp_id]).Scan(thread_data, inclusive_partial, exclusive_partial, INT_MIN, cub::Max());
Suppose the set of input thread_data across the block of threads is {0, -1, 2, -3, ..., 126, -127}. The corresponding output inclusive_partial in the first warp would be 0, 0, 2, 2, ..., 30, 30, the output for the second warp would be 32, 32, 34, 34, ..., 62, 62, etc. The corresponding output exclusive_partial in the first warp would be INT_MIN, 0, 0, 2, ..., 28, 30, the output for the second warp would be 30, 32, 32, 34, ..., 60, 62, etc.
Template Parameters
ScanOp[inferred] Binary scan operator type having member T operator()(const T &a, const T &b)
Parameters
[in]inputCalling thread's input item.
[out]inclusive_outputCalling thread's inclusive-scan output item.
[out]exclusive_outputCalling thread's exclusive-scan output item.
[in]initial_valueInitial value to seed the exclusive scan
[in]scan_opBinary scan operator
template<typename T , int LOGICAL_WARP_THREADS = CUB_PTX_WARP_THREADS, int PTX_ARCH = CUB_PTX_ARCH>
__device__ __forceinline__ T cub::WarpScan< T, LOGICAL_WARP_THREADS, PTX_ARCH >::Broadcast ( input,
unsigned int  src_lane 
)
inline

Broadcast the value input from warp-lanesrc_lane to all lanes in the warp.

  • A subsequent __syncthreads() threadblock barrier should be invoked after calling this method if the collective's temporary storage (e.g., temp_storage) is to be reused or repurposed.
Snippet
The code snippet below illustrates the warp-wide broadcasts of values from lanes0 in each of four warps to all other threads in those warps.
#include <cub/cub.cuh>
__global__ void ExampleKernel(...)
{
// Specialize WarpScan for type int
// Allocate WarpScan shared memory for 4 warps
__shared__ typename WarpScan::TempStorage temp_storage[4];
// Obtain one input item per thread
int thread_data = ...
// Broadcast from lane0 in each warp to all other threads in the warp
int warp_id = threadIdx.x / 32;
thread_data = WarpScan(temp_storage[warp_id]).Broadcast(thread_data, 0);
Suppose the set of input thread_data across the block of threads is {0, 1, 2, 3, ..., 127}. The corresponding output thread_data will be {0, 0, ..., 0} in warp0, {32, 32, ..., 32} in warp1, {64, 64, ..., 64} in warp2, etc.
Parameters
[in]inputThe value to broadcast
[in]src_laneWhich warp lane is to do the broadcasting

The documentation for this class was generated from the following file: