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

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

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

int nnz_col = indirectJ2[MAX_SUPER_SIZE - 1];

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

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


person piyush_sao    schedule 08.03.2015    source источник


Ответы (1)


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

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

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

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

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

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

person Robert Crovella    schedule 08.03.2015