我读CUB文档和例子:完全在片上制作CUB blockradixsort?
#include <cub/cub.cuh> // or equivalently <cub/block/block_radix_sort.cuh>
__global__ void ExampleKernel(...)
{
// Specialize BlockRadixSort for 128 threads owning 4 integer items each
typedef cub::BlockRadixSort<int, 128, 4> BlockRadixSort;
// Allocate shared memory for BlockRadixSort
__shared__ typename BlockRadixSort::TempStorage temp_storage;
// Obtain a segment of consecutive items that are blocked across threads
int thread_keys[4];
...
// Collectively sort the keys
BlockRadixSort(temp_storage).Sort(thread_keys);
...
}
在该示例中,每个线程有4个键。它看起来像'thread_keys'将被分配在全局本地内存中。如果我每个线程只有一个键,我可以声明“int thread_key;”并只在这个变量中注册?
BlockRadixSort(temp_storage).Sort()将指向该键的指针作为参数。这是否意味着密钥必须位于全局内存中?
我想使用此代码,但我希望每个线程在寄存器中保存一个密钥,并在排序后将它保存在寄存器/共享内存中。 在此先感谢!
,会发生什么,如果我有一个1024线程阻塞,但是告诉BlockRadixSort TPB是512?它只会使用前512个线程来排序数据吗? – yidiyidawu
这不是这个代码的工作原理。这不会是每个线程的一个关键,这就是你的问题所指出的。 “BlockRadixSort”的第二个自定义参数是“BLOCK_THREADS”,它是每个块的线程数。 –
顺便说一句,只是一个简单的问题:我们必须在这里使用两个“__syncthreads”吗?它看起来像排序功能只是作为输入由线程本身准备的值? – shaoyl85