CUDA: трансляция на уровне блоков потоков на K40 с использованием инструкций Shuffle

indirectJ2[MAX_SUPER_SIZE] это общий массив.

Ядро моего устройства cuda содержит следующий оператор (выполняется всеми потоками в блоке потоков):

int nnz_col = indirectJ2[MAX_SUPER_SIZE - 1];

Я подозреваю, что это приведет к банковским конфликтам.

Можно ли как-то эффективно реализовать вышеприведенную трансляцию на уровне блоков потоков, используя новые инструкции shuffle для графических процессоров kepler? Я понимаю, как это работает на уровне деформации. Также приветствуются другие решения, которые выходят за рамки случайного порядка (например, использование CUB и т. Д.).

1 ответ

Для этой строки кода на K40 нет конфликта банков. Доступ к общей памяти уже предлагает механизм вещания. Цитирование из руководства по программированию

"Запрос на совместную память для деформации не приводит к конфликту банков между двумя потоками, которые обращаются к любому подслову в одном и том же 32-битном слове или в двух 32-битных словах, индексы которых i и j выровнены в одном и том же 64 словах сегмент (т. е. сегмент, первый индекс которого кратен 64) и такой, что j=i+32 (даже если адреса двух подслов находятся в одном и том же банке): в этом случае для доступа на чтение 32-битные слова транслируются в запрашивающие потоки

Не существует такого понятия, как конфликты банка совместно используемой памяти на уровне блоков потоков. Банковские конфликты относятся только к шаблону доступа, сгенерированному запросом на совместную память, исходящим из одной деформации, для одной инструкции в этой деформации.

При желании вы можете написать простое тестовое ядро ​​и использовать метрики профилировщика (например, shared_replay_overhead) для проверки на конфликты банка совместно используемой памяти.

Механизмы перетасовки основы не выходят за пределы одной деформации; поэтому не существует короткой последовательности только для тасования, которая может транслировать одно количество на несколько перекосов в блоке потоков. Общая память может использоваться для обеспечения прямого доступа к одному количеству для всех потоков в деформации; Вы уже делаете это.

глобальная память, __constant__ Память и параметры ядра также могут быть использованы для "трансляции" одного и того же значения всем потокам в блоке потоков.

Другие вопросы по тегам