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

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


person smuggledPancakes    schedule 01.10.2010    source источник


Ответы (5)


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

person Grizzly    schedule 01.10.2010
comment
Сладкое спасибо за визуал и объяснение. Я не знал о широковещательных рассылках, и это кажется важной информацией :) Как мне проверить, что мои загрузки и сохранения не вызывают конфликтов банков в общей памяти? Должен ли я как-то добраться до ассемблерного кода или есть другие способы? - person smuggledPancakes; 02.10.2010
comment
поскольку возникновение конфликта банков - это то, что будет определено во время выполнения (это означает, что компилятор не знает об этом, ведь большинство адресов генерируется во время выполнения), получение скомпилированной версии не сильно поможет. Обычно я делаю это по старинке, то есть беру ручку и бумагу и начинаю думать о том, что и где хранит мой код. В конце концов, правила, регулирующие возникновение банковских конфликтов, не так уж сложны. В противном случае вы можете использовать профилировщик nvidia OpenCL (должен быть в комплекте с sdk, iirc). Я думаю, что у него есть счетчик для сериализации деформации. - person Grizzly; 03.10.2010
comment
Спасибо за указание на сериализацию деформации. В одном из текстовых файлов readme, поставляемых с профилировщиком вычислений, сказано следующее: - person smuggledPancakes; 04.10.2010
comment
Акк, извините комментарий выше, я почему-то не могу его перередактировать. В любом случае, я нашел это в файле readme профилировщика вычислений, warp_serialize: количество деформаций потоков, которые сериализуются при конфликтах адресов либо в разделяемую, либо в постоянную память. Это здорово, что я могу легко увидеть, есть ли конфликты, просто взглянув на вывод профилировщика. Как понять, есть ли конфликты между банками на бумаге и на бумаге. Вы учились на каких-либо примерах или учебниках? - person smuggledPancakes; 04.10.2010
comment
Как я уже сказал, сопоставление адресов с банками относительно простое, поэтому не так уж сложно выяснить, какие обращения относятся к какому банку и, следовательно, есть ли конфликты банков. Бумага предназначена только для большего количества шаблонов доступа к конфликту, без которых я не могу обойтись. - person Grizzly; 04.10.2010

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

person belwood    schedule 01.10.2010
comment
Так это связано с тем, когда полуварп хочет сохранить или загрузить память? 16 потоков будут пытаться выполнить транзакцию с памятью и, таким образом, доступ к одному и тому же банку с более чем одним потоком вызовет сериализованную обработку? Кроме того, как убедиться, что вы не храните/загружаете данные в том же банке? - person smuggledPancakes; 01.10.2010

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

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

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

person Nitin Kunal    schedule 15.07.2012

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

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

person Prashant M.    schedule 16.11.2013
comment
Обратите внимание, что ответы только по ссылкам не рекомендуются, ответы SO должны быть конечной точкой поиска. для решения (по сравнению с еще одной остановкой ссылок, которые со временем устаревают). Пожалуйста, рассмотрите возможность добавления здесь отдельного синопсиса, оставив ссылку в качестве ссылки. - person kleopatra; 16.11.2013
comment
Пожалуйста, уточните по ссылке, чтобы лучше помочь ОП. - person Peter Foti; 16.11.2013
comment
Это видео действительно полезно! И я не знаю, почему голосование против! Это очень хороший вклад! +1 - person Gabriel; 10.06.2014

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

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

person city    schedule 23.11.2012