#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 необходимо обслужить два запроса в первом примере.
Во втором примере каждый банк должен обслуживать только один запрос.