Для графических процессоров nvidia (и amd в этом отношении) локальная память разделена на банки памяти. Каждый банк может обращаться только к одному набору данных за раз, поэтому, если halfwarp пытается загрузить / сохранить данные из / в один и тот же банк, доступ должен быть сериализован (это конфликт банков). Для gt200 gpus имеется 16 банков (32 банка для fermi), 16 или 32 банка для графических процессоров AMD (57xx или выше: 32, все ниже: 16)), которые чередуются с размером 32 бита (так что байты 0-3 находятся в банк 1, 4-7 в банке 2, ..., 64-69 в банке 1 и так далее). Для лучшей визуализации это выглядит примерно так:
Bank | 1 | 2 | 3 |...
Address | 0 1 2 3 | 4 5 6 7 | 8 9 10 11 |...
Address | 64 65 66 67 | 68 69 70 71 | 72 73 74 75 |...
...
Таким образом, если каждый поток в полувиске обращается к последовательным 32-битным значениям, конфликты банков отсутствуют. Исключением из этого правила (каждый поток должен иметь доступ к своему собственному банку) являются широковещательные рассылки: если все потоки обращаются к одному и тому же адресу, значение считывается только один раз и транслируется всем потокам (для GT200 это должны быть все потоки в полувиске, обращающиеся к один и тот же адрес, iirc fermi и AMD gpus могут сделать это для любого количества потоков, обращающихся к одному и тому же значению).
Общая память, к которой можно обращаться параллельно, делится на модули (также называемые банками). Если две ячейки памяти (адреса) встречаются в одном банке, возникает конфликт банков, во время которого доступ осуществляется последовательно, теряя преимущества параллельного доступа.
источник
Проще говоря, конфликт банков - это случай, когда какой-либо шаблон доступа к памяти не может распределять ввод-вывод между банками, доступными в системе памяти. Следующие примеры развивают эту концепцию: -
Предположим, у нас есть двумерный массив целых чисел 512x512, а наша система DRAM или памяти имеет 512 банков. По умолчанию данные массива будут размещены таким образом, что arr [0] [0] идет в банк 0, arr [0] [1] идет в банк 1, arr [0] [2] - в банк 2 .... arr [0] [511] переходит в банк 511. Для обобщения arr [x] [y] занимает банк номер y. Теперь некоторый код (как показано ниже) начинает доступ к данным в режиме основного столбца, т.е. изменяя x, сохраняя y постоянным, конечным результатом будет то, что все последующие обращения к памяти будут попадать в один и тот же банк - отсюда конфликт банков.
Компиляторы обычно избегают таких проблем путем буферизации массива или использования простого числа элементов в массиве.
источник
(Конфликт CUDA Bank) Надеюсь, это поможет .. это очень хорошее объяснение ...
http://www.youtube.com/watch?v=CZgM3DEBplE
источник
http://en.wikipedia.org/wiki/Memory_bank
и http://mprc.pku.cn/mentors/training/ISCAreading/1989/p380-weiss/p380-weiss.pdf
на этой странице вы можете найти подробную информацию о банке памяти. но это немного отличается от того, что говорит @Grizzly. на этой странице банк такой
банк 1 2 3
адрес | 0, 3, 6 ... | | 1, 4, 7 ... | | 2, 5,8 ... |
надеюсь, это поможет
источник