Что такое банковский конфликт? (Делая программирование CUDA / OPENCL)

StackOverflow https://stackoverflow.com/questions/3841877

Вопрос

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

Это было полезно?

Решение

Для NVIDIA (и AMD в этом отношении) GPUS локальная память разделена на MemoryBanks. Каждый банк может обратиться только к одному набору данных одновременно, поэтому, если Halfwarp пытается загрузить / хранить данные из / к тому же банку, доступ должен быть сериализован (это банковский конфликт). Для GT200 GPU GPU находятся 16 банков (32 куранца для Ферми), 16 или 32 банками для AMD GPU (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 GPU могут сделать это для любого количества потоков, доступа к тому же значению).

Другие советы

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

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

Допустим, у нас есть двумерные 512x512 массив целых чисел и наша система DRAM или памяти имеет в нем 512 банка. По умолчанию данные массива будут расположены таким образом, что ARR [0] [0] переходит в банк 0, ARR [0] [1] переходит в банк 1, ARR [0] [2] к банку 2 .... Arr [0] [511] идет в банк 511. Чтобы обобщить ARR [x] [Y] занимает номер банка y. Теперь какой-то код (как показано ниже) начинает доступа к данным в Column Caid Fashion IE. Изменение 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

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

(CUDA Bank Conflict) Я надеюсь, что это поможет. Это очень хорошее объяснение ...

http://www.youtube.com/watch?v=czgm3debple

http://en.wikipedia.org/wiki/memory_bank.
а такжеhttp://mprc.pku.cn/ justors/training/iscareading/1989/p380-weiss/p380-weiss.pdf.

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

Банк 1 2 3

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top