почему поток, обращающийся к двум смежным элементам, вызывает «банковский конфликт»?

#cuda #conflict

#cuda #конфликт

Вопрос:

банковский конфликт

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

отсутствие банковского конфликта

спасибо за ваш ответ!!!

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

1. Я понял, что на первом снимке есть некоторые ошибки. Эти потоки имеют неправильный идентификатор, эти ThreadId должны быть 0,1,2,3, …… не 0,2,4,6……..

Ответ №1:

https://developer.nvidia.com/blog/using-shared-memory-cuda-cc/

Конфликты банка общей памяти

Для достижения высокой пропускной способности памяти для одновременного доступа общая память разделяется на модули памяти (банки) одинакового размера, к которым можно обращаться одновременно. Следовательно, любая загрузка памяти или хранилище из n адресов, охватывающее b разных банков памяти, могут обслуживаться одновременно, что обеспечивает эффективную пропускную способность, которая в b раз превышает пропускную способность одного банка.

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

Давайте предположим, что существует 8 банков памяти размером 4 байта для вашего примера параллельного сокращения. Элемент i обслуживается банком i % 8.

Затем банкам 0,2,4,6 необходимо обслужить два запроса в первом примере.

Во втором примере каждый банк должен обслуживать только один запрос.