Актуальность конфликтов банка общей памяти в Fermi и выше

#cuda #gpu-shared-memory #bank-conflict

#cuda #gpu-разделяемая память #банк-конфликт

Вопрос:

Из того, что я прочитал в документации CUDA, конфликты банка общей памяти не имеют значения для sm_20 и выше, потому что значения передаются, когда они запрашиваются одновременно, предотвращая любые задержки сериализации.

Документация:

Аппаратное обеспечение с общей памятью улучшено на устройствах с вычислительными возможностями 2.x для поддержки нескольких широковещательных слов и для генерации меньшего количества конфликтов банка для обращений 8-битным, 16-битным, 64-битным или 128-битным потоком (раздел G.4.3).

Кто-нибудь может подтвердить мое утверждение?

Ответ №1:

Нет, они не «неактуальны».

Я полагаю, что ваша путаница может быть вызвана распространенным заблуждением, связанным с банковскими конфликтами, что «банк» каким-то образом равен «местоположению». Существует взаимосвязь между банком и местоположением, но это не обязательно равенство.

В качестве упрощенного примера предположим, что у нас было 4 банка (и давайте ограничим обсуждение 32-разрядными транзакциями и естественно выровненным 32-разрядным хранилищем, например, int или float ). Взаимосвязь между банками и местоположениями ( int или float индексными «адресами») заключается в следующем:

 address:  bank:
       0      0 <-----------------------Thread 0
       1      1
       2      2     ------Thread 1
       3      3    /
       4      0 <---------Thread 2
       5      1
       6      2 
       7      3
       8      0 <-----------------------Thread 3
...
  

Мы видим, что адреса 1 и 5, например, находятся в одном банке, но они расположены в разных местах.

Конфликты банка (на любой архитектуре) могут возникать всякий раз, когда два или более потоков в warp пытаются получить доступ к данным в одном и том же банке в результате конкретной транзакции warp (например, чтение из общей памяти).

В случае до появления fermi, даже если несколько потоков выполняли чтение из одного и того же местоположения (т. Е. адреса), это был конфликт банка, поскольку эти потоки выполняли чтение из одного банка.

В случае cc2.x или более поздней версии был введен механизм широковещательной передачи. Этот механизм не влияет на общий случай конфликтов банков, за исключением одного конкретного случая. Когда несколько потоков читают из одного и того же местоположения, это больше не конфликт банка, и все потоки, считывающие из этого местоположения, получат данные в определенном цикле без сериализации.

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

На приведенном выше рисунке, если поток 0 считывает данные из местоположения / адреса 0, а поток 3 считывает данные из местоположения / адреса 8, это всегда будет конфликтом банков в любой текущей архитектуре (учитывая, что это упрощенный пример, в котором всего 4 банка). Если поток 1 и поток 2 оба считывают данные из местоположения / адреса 4, это конфликт банка на предферми, но не на всех устройствах fermi и за его пределами.

Для компоновки из 32 банков, которая является фактической конфигурацией банка, банк любого местоположения в общей памяти определяется младшими 5 битами индекса или смещения к этому местоположению, независимо от того, принадлежит ли это местоположение к массиву int or float .

Комментарии:

1. младшие 5 бит «с плавающей точкой»? я думаю, вы имели в виду «целую часть числа с плавающей точкой», возможно! 🙂 кроме того, я «предполагаю», что младшие 5 бит — это та же маска, которая использовалась для определения деформации идентификатора потока. Но я не уверен.

2.младшие 5 бит int или float смещения. Указанные 5 битов имеют смещение к этому местоположению, независимо от того, является ли это int массивом или a float array, то есть индексом массива, который сам по себе не является float величиной. Изменена формулировка.