Что такое конфликт? (Выполнение программирования Cuda / OpenCL)
Я читал руководство по программированию для CUDA и OpenCL, и я не могу понять, что такое банковский конфликт. Они просто погружаются в то, как решить проблему, не вдаваясь в подробности самой темы. Кто-нибудь может помочь мне понять это? У меня нет предпочтений, если помощь находится в контексте CUDA/OpenCL или просто банковских конфликтов в целом в информатике.
5 ответов:
для графических процессоров nvidia (и amd, если на то пошло) локальная память разделена на банки памяти. Каждый банк может одновременно обращаться только к одному набору данных, поэтому, если halfwarp пытается загрузить/сохранить данные из/в один и тот же банк, доступ должен быть сериализован (это банковский конфликт). Для графических процессоров gt200 есть 16 банков (32banks для fermi), 16 или 32 банка для графических процессоров AMD (57xx или выше: 32, все ниже: 16)), которые чередуются с гранулой 32bit (так байт 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 |... ...поэтому, если каждый поток в halfwarp обращается к последовательным 32-битным значениям, нет конфликтов банков. Исключением из этого правила (каждый поток должен иметь доступ к своему собственному банку) являются широковещательные передачи: Если все потоки обращаются к одному и тому же адресу, значение считывается только один раз и транслируется во все потоки (для GT200 это должны быть все потоки в halfwarp, обращающиеся к одному и тому же адресу, 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. Теперь некоторый код (как показано ниже) начинает доступ к данным в столбце major 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такие проблемы, как правило, избегаются компиляторами путем буферизации массива или использования простого числа элементов в массиве.
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.../
надеюсь, что это помог бы
Comments