Актуальность конфликтов банков с общей памятью в Ферми и выше
Из того, что я прочитал в документации 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, например, находятся в одном и том же банке, но не в одном месте.
Конфликты банков (в любой архитектуре) могут возникать всякий раз, когда два или более потоков в деформации пытаются получить доступ к данным в одном и том же банке в результате конкретной транзакции деформации (например, чтение из общей памяти).
В случае с pre-fermi, даже если несколько потоков считывали из одного и того же местоположения (то есть адреса), это был конфликт банка, так как эти потоки читали из одного и того же банка.
В случае cc2.x или выше был введен механизм широковещания. Этот механизм не влияет на общий случай банковских конфликтов, за исключением одного конкретного случая. Когда несколько потоков читают из одного местоположения, это больше не является конфликтом банков, и все потоки, читающие из этого местоположения, получат данные в определенном цикле без сериализации.
Однако при любых обстоятельствах, если несколько потоков считывают данные из разных мест в одном и том же банке, это является конфликтом банков при любой текущей архитектуре графического процессора.
На рисунке выше, если поток 0 читает из местоположения / адреса 0, а поток 3 читает из местоположения / адреса 8, это всегда будет конфликтом банков в любой текущей архитектуре (учитывая, что это упрощенный пример только с 4 банками). Если Поток 1 и Поток 2 считывают данные из местоположения / адреса 4, это является конфликтом банков для преферми, но не для всех ферми-устройств и не только.
Для схемы с 32 банками, которая является фактической конфигурацией банка, банк любого местоположения в совместно используемой памяти задается младшими 5 битами индекса или смещением к этому местоположению, независимо от того, принадлежит ли это местоположение к int
или же float
массив.