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


95

Я читав керівництво з програмування для CUDA та OpenCL, і не можу зрозуміти, що таке банківський конфлікт. Вони просто занурюються в те, як вирішити проблему, не детально розглядаючи саму тему. Хтось може допомогти мені це зрозуміти? Я не маю переваг, якщо допомога стосується контексту CUDA / OpenCL або просто банківських конфліктів взагалі в галузі інформатики.

Відповіді:


105

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


3
Мила подяка за візуальне та пояснення. Я не знав про трансляції, і це здається важливою інформацією :) Як би я перевірив, що мої завантаження та магазини не спричиняють банківських конфліктів у спільній пам'яті? Чи потрібно мені якось отримувати код збірки, чи є інші способи?
контрабанда млинців

3
оскільки випадки виникнення банківських конфліктів є чимось, що визначатиметься під час виконання (мається на увазі, що компілятор не знає про це, адже всі адреси генеруються під час виконання), отримання скомпільованої версії не допоможе. Зазвичай я роблю це по старому, загрожуючи, беру ручку і папір і починаю думати про те, де мій код зберігається. Крім того, усі правила, що регулюють виникнення банківських конфліктів, не такі складні. В іншому випадку ви можете використовувати профайлер nvidia OpenCL (повинен бути в комплекті з sdk, iirc). Я думаю, що в ньому є лічильник для серіалізації деформації.
Грізлі

1
Дякуємо, що вказали на деформацію, яка серіалізується. Один із текстових файлів readme, який постачається разом із комп’ютерним профілістом, сказав це,
контрабанда млинців

1
Так, вибачте за наведений вище коментар, чомусь я не можу його повторно відредагувати. У будь-якому випадку, я знайшов це в readme профайлера обчислювальної машини, "warp_serialize: Кількість перекосів потоків, які серіалізуються при конфліктах адрес у спільну або постійну пам'ять". Це чудово, що я можу легко зрозуміти, чи є конфлікти, просто подивившись вихідні дані профілі. Як зрозуміти, чи є банківські конфлікти на ручці та папері. Чи ви вчилися на будь-яких прикладах чи навчальних посібниках?
контрабандні млинці

1
Як я вже говорив, зіставлення з адрес до банків є відносно простим, тому не так важко зрозуміти, який доступ до якого банку надходить, а отже, якщо є банківські конфлікти. Документ призначений лише для більш конфліктних моделей доступу, без яких я не можу цього зробити.
Грізлі

13

Спільна пам’ять, до якої можна отримати паралельний доступ, розділена на модулі (їх також називають банками). Якщо два місця (адреси) пам'яті трапляються в одному банку, ви отримуєте банківський конфлікт, під час якого доступ здійснюється послідовно, втрачаючи переваги паралельного доступу.


То чи це пов’язано з тим, коли напівдеформа де хоче зберігати чи завантажувати пам’ять? 16 потоків намагатимуться здійснити транзакцію пам'яті, і, таким чином, доступ до одного банку з кількома потоками спричиняє серіалізовану обробку? Крім того, як зробити так, щоб ви не зберігали / не завантажували дані в одному банку?
контрабандні млинці

10

Простими словами, конфлікт банків - це випадок, коли будь-який шаблон доступу до пам'яті не може розподілити введення-виведення між банками, доступними в системі пам'яті. Наступні приклади розробляють концепцію:

Припустимо, у нас є двовимірний масив цілих чисел 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

Зазвичай таких проблем компілятори уникають шляхом буферизації масиву або використання простої кількості елементів у масиві.


7

(Конфлікт з банком CUDA) Сподіваюсь, це допоможе .. це дуже гарне пояснення ...

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


1
Зауважте, що відповіді, що стосуються лише посилань, не відштовхують, відповіді SO повинні бути кінцевою точкою пошуку рішення (проти ще однієї зупинки посилань, яка, як правило, затягується з часом). Будь ласка, розглянути можливість додавання сюди окремого конспекту, зберігаючи посилання як орієнтир.
kleopatra

Будь ласка, детальніше розгляньте посилання, щоб краще допомогти ОП.
Пітер Фоті,

1
Це відео дуже корисне! І я не знаю, чому голосування проти! Це дуже хороший вхід! +1
Габріель

1

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 ... |

сподіваюся, це допоможе

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.