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


95

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

Ответы:


105

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


3
Приятное спасибо за визуализацию и объяснение. Я не знал о трансляциях, и это похоже на важную информацию :) Как мне проверить, что мои загрузки и хранилища не вызывают конфликтов банков в общей памяти? Мне нужно как-то добраться до кода сборки или есть другие способы?
контрабандой

3
поскольку возникновение банковского конфликта - это что-то, что будет определяться во время выполнения (то есть компилятор не знает об этом, ведь большинство адресов генерируются во время выполнения), получение скомпилированной версии не очень поможет. Обычно я делаю это старым изощренным способом, беря ручку и бумагу и начинаю думать о том, где где хранится мой код. В конце концов, правила, регулирующие возникновение банковских конфликтов, не так уж и сложны. В противном случае вы можете использовать профилировщик nvidia OpenCL (должен быть в комплекте с sdk, iirc). Я думаю, у него есть счетчик для сериализации деформации.
Grizzly

1
Спасибо, что указали на сериализацию деформации. В одном из текстовых файлов readme, который поставляется с профилировщиком вычислений, говорится об этом,
контрабандой

1
Ок, извините за комментарий выше, я почему-то не могу его повторно редактировать. В любом случае, я нашел это в файле readme профилировщика вычислений: «warp_serialize: количество деформаций потоков, которые сериализуются при конфликтах адресов в разделяемую или постоянную память». Это здорово, что я могу легко увидеть, есть ли конфликты, просто взглянув на выходные данные профилировщика. Как понять, есть ли конфликты банков на бумаге? Вы узнали из каких-либо примеров или руководств?
контрабандой

1
Как я уже сказал, сопоставление адресов с банками относительно просто, поэтому нетрудно выяснить, какие обращения идут к какому банку и, следовательно, есть ли конфликты банков. Эта статья предназначена только для дополнительных шаблонов конфликтного доступа, без которых я не могу обойтись.
Grizzly,

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 Bank) Надеюсь, это поможет .. это очень хорошее объяснение ...

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


1
Обратите внимание, что ответы только на ссылки не приветствуются, ответы SO должны быть конечной точкой поиска решения (по сравнению с еще одной остановкой ссылок, которые со временем устаревают). Пожалуйста, подумайте о добавлении здесь отдельного синопсиса, сохранив ссылку в качестве ссылки.
kleopatra

Пожалуйста, уточните ссылку, чтобы лучше помочь OP.
Питер Фоти

1
Это видео действительно полезно! И я не знаю, почему голосование против! Это очень хороший отзыв! +1
Gabriel

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.