Я читаю детёныш документацию и примеры:Выполнение полной блокировки блока CUB blockixixsort?
#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» будет выделен в глобальной локальной памяти. Если у меня есть только 1 ключ на поток, могу ли я объявить «int thread_key»? и сделать эту переменную только в регистре?
BlockRadixSort (temp_storage) .Sort() принимает указатель на ключ в качестве параметра. Означает ли это, что ключи должны находиться в глобальной памяти?
Я хотел был бы использовать этот код, но я хочу, чтобы каждый поток удерживал один ключ в регистре и сохранял его на чипе в регистровой/разделяемой памяти после их сортировки. Спасибо заранее!
Что произойдет, если у меня есть 1024 thread block, но сообщите BlockRadixSort, что TPB - 512? Будет ли использоваться только первые 512 потоков для сортировки данных? – yidiyidawu
Не работает этот код. Это не было бы одним ключом для каждой темы, что и указывал ваш вопрос. Второй параметр настройки для «BlockRadixSort» - «BLOCK_THREADS», который представляет собой количество потоков на блок. –
Btw, просто быстрый вопрос: нужно ли здесь использовать два «__syncthreads»? Похоже, функция сортировки принимает только значения, полученные самим потоком? – shaoyl85