Что такое банковский конфликт? (Выполнение программирования Cuda/OpenCL)

Я читал руководство по программированию для CUDA и OpenCL, и я не могу понять, что такое конфликт в банке. Они просто погружаются в то, как решить проблему, не разрабатывая сам предмет. Может ли кто-нибудь помочь мне понять это? Я не хочу, чтобы помощь была в контексте CUDA/OpenCL или только банковских конфликтов в целом в области компьютерных наук.

Ответ 1

Для nvidia (и amd в этом отношении) gpus локальная память делится на память. Каждый банк может обращаться только к одному набору данных за раз, поэтому, если полумавр пытается загрузить/сохранить данные из/в один и тот же банк, доступ должен быть сериализован (это конфликт банков). Для gt200 gpus имеется 16 банков (32 банка для ферми), 16 или 32 банка для AMD gpus (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 могут делать это для любого количества потоков, то же значение).

Ответ 2

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

Ответ 3

Простыми словами, конфликт в банке - это случай, когда любой шаблон доступа к памяти не может распространять IO по всем банкам, доступным в системе памяти. В следующих примерах описывается концепция: -

Предположим, что у нас есть двумерный массив целых чисел 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 постоянным, тогда конечный результат будет заключаться в том, что весь последовательный доступ к памяти достигнет того же банка - следовательно, конфликт банка.

int arr[512][512];
  for ( j = 0; j < 512; j++ ) // outer loop
    for ( i = 0; i < 512; i++ ) // inner loop
       arr[i][j] = 2 * arr[i][j]; // column major processing

Такие проблемы, как правило, избегаются компиляторами путем буферизации массива или использования простого числа элементов в массиве.

Ответ 5

http://en.wikipedia.org/wiki/Memory_bank
а также http://mprc.pku.cn/mentors/training/ISCAreading/1989/p380-weiss/p380-weiss.pdf

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

bank 1 2 3

адрес | 0, 3, 6... | | 1, 4, 7... | | 2, 5,8... |

надеюсь, что это поможет