В ядре CUDA мне нужно найти ключ, который отображается в threadIdx.Эффективная оценка функции отображения индексов в CUDA
отображение может выглядеть следующим образом:
ключ -> threadIdx
0 -> {0,1,2,3,4}
1 -> {5,6 , 7}
2 -> {8,9,10}
...
Каждый ключ k_i
отображается на n_i
(различный, произвольный n_i
с n_i>0
) нитками. Ключ будет использоваться для получения соответствующего значения в глобальном массиве. Это значение затем используется в последующих вычислениях в этом ядре.
Отображение может быть построена в виде кусочно-постоянной функции:
Количество клавиш не ограничено 3 (это только пример!), И только известны во время выполнения, а также соответствующей «ширине» каждой клавиши.
Как я могу эффективно узнать соответствующий ключ в ядре CUDA? Я подумал о двух следующих вариантов:
с использованием бинарного поиска внутри ядра (память эффективной)
предварительно рассчитав отображение для каждого threadIDx, то запуск ядра (выполнения эффективной)
0 0 0 0 0 1 1 1 2 2 2 ...
Есть ли лучший способ достичь этого?
Возможно, более эффективно считывать каждый элемент один раз (в общую память). Хотя кеш поможет вам при повторном использовании одних и тех же адресов, общая память, вероятно, будет намного лучше для большого количества чтений. Если есть примерно четное количество значений для каждого ключа, то, вероятно, лучше позволить каждому потоку обрабатывать все значения для своего ключа. – ebarr
Ваше сопоставление похоже просто 'int key = ((int) threadIdx.x-2)/3;' которое легко и эффективно может быть вычислено каждым потоком «на лету». Если делитель является переменной времени выполнения, а не параметром шаблона, для этого потребуется полное 32-разрядное целочисленное деление, но оно должно быть достаточно эффективным. Вы пробовали и приурочили его? – njuffa
@njuffa Как я уже говорил выше: каждая «ширина» может быть разной! –