我讀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