Чтобы получить хорошую производительность (избежать банковских конфликтов), достаточно лишь, чтобы каждый поток считывал / записывал с / на другой адрес разделяемой памяти, но каждый поток мог обращаться к этой памяти не последовательно без штрафа ?
конфликты банков возможны только между потоками в одной деформации, которые осуществляют доступ к общей памяти, и тогда возможны только для каждой инструкции (выданной). Инструкции, о которых я здесь говорю, являются инструкциями SASS (кода сборки GPU), но, тем не менее, должны быть непосредственно идентифицированы по ссылкам на совместно используемую память в исходном коде CUDA C ++.
Нет такой идеи, как конфликты банков:
- между потоками в разных перекосах
- между обращениями к совместно используемой памяти, возникающими из разных (выпущенных) инструкций
Данный поток может обращаться к разделяемой памяти в любом шаблоне, без беспокойство или возможность конфликтов с общей памятью из-за собственной активности. Банковские конфликты возникают только в результате 2 или более потоков в одной деформации, в результате определенной инструкции или доступа к совместно используемой памяти, выданных по всей деформации .
Более того, это не достаточно, чтобы каждый поток считывал / записывал с / на свой адрес . Грубо говоря, для данной выданной инструкции (т. Е. Данного доступа) каждый поток в варпе должен читать из другого банка , иначе он должен читать с адреса, который совпадает с другим адресом в варпе. (широковещание).
Предположим, что мы имеем в виду 32-битные банки и схему из 32 банков. Совместно используемую память можно легко представить в виде 2D-схемы:
Addr Bank
v 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
32 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
64 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
96 96 97 98 ...
Мы видим, что адреса / индекс / смещение / местоположения 0, 32, 64, 96 и c. находятся в одном банке. Адреса 1, 33, 65, 97 и др. c. находятся в одном банке и т. д. для каждого из 32 банков. Банки похожи на столбцы местоположений, когда адреса общей памяти визуализируются в этой двумерной схеме
Требование небанковского доступа к данной инструкции (загрузить или сохранить), выданной деформации, равно:
- никакие 2 нити в деформации не могут получить доступ к местоположениям в одном банке / столбце.
- существует особый случай, если местоположения в одном и том же столбце фактически совпадают. Это вызывает правило широковещания и не приводит к конфликтам в банке.
И повторять некоторые приведенные выше заявления несколько другим способом:
- Если у меня есть все oop в коде CUDA нет возможности возникновения банковских конфликтов между отдельными итерациями этого l oop
- Если у меня есть две отдельные строки кода CUDA C ++, то между банками не может возникнуть конфликт между банками. две отдельные строки кода CUDA C ++.