Почему в Cuda / OpenCL отсутствуют глобальные банковские конфликты? - PullRequest
16 голосов
/ 02 октября 2010

Одна вещь, которую я не понял, и Google не помогает мне, почему это может привести к конфликтам банков с общей памятью, но не с глобальной памятью?Могут ли быть конфликты банков с регистрами?

ОБНОВЛЕНИЕ Ух, я действительно ценю два ответа от Тиббита и Гризли.Кажется, что я могу поставить только зеленую галочку на один ответ.Я новичок в стек переполнения.Я думаю, я должен выбрать один ответ как лучший.Могу ли я сделать что-то, чтобы сказать спасибо за ответ, на который я не дам зеленый чек?

Ответы [ 3 ]

34 голосов
/ 02 октября 2010

Краткий ответ: Нет конфликтов банков ни в глобальной памяти, ни в регистрах.

Пояснение:

Ключ к пониманию того, почему нужно понимать гранулярность операций. Один поток не имеет доступа к глобальной памяти. Глобальные обращения к памяти "слиты". Поскольку глобальная память слишком медленная, любой доступ к потокам внутри блока группируется, чтобы сделать как можно меньше запросов к глобальной памяти.

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

Регистры не могут быть доступны ни одному потоку, кроме того, которому он назначен. Поскольку вы не можете читать или писать в мои реестры, вы не можете заблокировать мне доступ к ним - следовательно, нет никаких банковских конфликтов.

Кто может читать и записывать в глобальную память?

Only blocks. Один поток может сделать доступ, но транзакция будет обрабатываться на уровне блока (на самом деле уровень деформации / половины деформации, но я пытаюсь не усложнять). Если два блока обращаются к одной и той же памяти, я не верю, что это займет больше времени и может ускориться за счет кэша L1 в новейших устройствах, хотя это не очевидно.

Кто может читать и записывать в общую память?

Any thread within a given block. Если у вас есть только 1 поток на блок, у вас не может быть конфликта с банком, но у вас не будет разумной производительности. Конфликты банков происходят из-за того, что блоку выделяется несколько, скажем, 512 потоков, и все они борются за разные адреса в одном и том же банке (не совсем один и тот же адрес). В конце «Руководства по программированию CUDA C» есть отличные изображения этих конфликтов - рис. G2 на стр. 167 (фактически стр. 177 в pdf). Ссылка на версию 3.2

Кто может читать и писать в регистры?

Only the specific thread to which it is allocated. Следовательно, только один поток обращается к нему за один раз.

22 голосов
/ 03 октября 2010

Возможны ли банковские конфликты для данного типа памяти, очевидно, зависит от структуры памяти и, следовательно, от ее цели.

Так почему общая память спроектирована таким образом, что допускает банковские конфликты?

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

А как же регистры?

Регистры предназначены для доступа к ним в качестве операндов для инструкций ALU, то есть к ним нужно обращаться с очень низкой задержкой.Поэтому они получают больше транзисторов / бит, чтобы сделать это возможным.Я не уверен, как именно регистры доступны в современных процессорах (не та информация, которая вам нужна часто и которую не так легко найти).Однако, очевидно, было бы крайне непрактично организовывать регистры в банках (для более простых архитектур вы обычно видите, что все регистры висят на одном большом мультиплексоре).Так что нет, для регистров не будет банковских конфликтов.

Глобальная память

Прежде всего, глобальная память работает с другой гранулярностью, чем разделяемая память.Доступ к памяти осуществляется в 32, 64 или 128-байтовых блоках (для GT200 по крайней мере, для fermi он всегда 128B, но кэшируется, AMD немного отличается), где каждый раз, когда вы хотите что-то из блока, осуществляется доступ / передача всего блока.Вот почему вам необходим объединенный доступ, поскольку, если каждый поток обращается к памяти из другого блока, вы должны перенести все блоки.

Но кто сказал, что в банке нет конфликтов?Я не совсем уверен в этом, потому что я не нашел ни одного фактического источника для поддержки этого для оборудования NVIDIA, но это кажется логичным:Глобальная память обычно распределяется между несколькими чипами оперативной памяти (что легко проверить, посмотрев на видеокарту).Было бы разумно, если бы каждый из этих чипов походил на банк локальной памяти, поэтому вы могли бы столкнуться с конфликтами банков, если в одном и том же банке есть несколько одновременных запросов.Однако эффекты будут гораздо менее выражены с одной стороны (поскольку большая часть времени, затрачиваемого на доступ к памяти, в любом случае представляет собой задержку при получении данных от A до B), и это не будет заметным эффектом «внутри» одной рабочей группы.(поскольку за один раз выполняется только одна полуверсия, и если эта полуверсия выдает более одного запроса, у вас есть несвязанный доступ к памяти, поэтому вы уже получаете удар, затрудняющий измерение последствий этого конфликта. Таким образом, вы получите конфликты только в том случае, еслинесколько рабочих групп пытаются получить доступ к одному и тому же банку. В вашей типичной ситуации для gpgpu у вас есть большой набор данных, лежащий в последовательной памяти, поэтому эффекты на самом деле не должны быть заметны, так как есть достаточно других рабочих групп, одновременно получающих доступ к другим банкам, но этодолжна быть возможность построить ситуации, когда набор данных сосредоточен только на нескольких банках, что может привести к снижению пропускной способности (поскольку максимальная пропускная способность будет зависеть от равномерного распределения доступа по всем банкам, поэтому каждый банк будеттолько часть этой полосы пропускания).Опять же, я ничего не читал, чтобы доказать эту теорию для аппаратного обеспечения NVIDIA (в основном все сосредоточено на объединении, что, конечно, более важно, так как делает это проблемой для естественных наборов данных).Однако, согласно руководству по вычислениям ATI Stream, такова ситуация с картами Radeon (для 5xxx: банки разнесены на 2 КБ, и вы хотите убедиться, что вы распределяете свои доступы (то есть из всех воргрупп, симулирующих активные) равными по всем банкам), поэтомуМожно предположить, что карты NVidia ведут себя аналогично.

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

  • Следите заобъединение при доступе к глобальной памяти
  • Отслеживать конфликты банков при доступе к локальной памяти
  • Нет проблем с доступом к регистрам
3 голосов
/ 13 февраля 2011

несколько потоков, обращающихся к одному и тому же банку, не обязательно означают конфликт банков.Возникает конфликт, если потоки хотят одновременно читать из РАЗНОГО СТРОКА в одном и том же банке.

...