Почему нет банковских конфликтов в глобальной памяти для CUDA / OPENCL?

StackOverflow https://stackoverflow.com/questions/3843032

Вопрос

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

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

Это было полезно?

Решение

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

Объяснение:

Ключ к пониманию Почему заключается в том, чтобы понять гранулярность операций. Одно нить не доступа к глобальной памяти. Глобальные доступа к памяти «объединены». Поскольку Global Memory Soo Slow, любой доступ по потокам в блоке сгруппирован вместе, чтобы сделать как можно меньше запросов к глобальной памяти.

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

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

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

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

Кто может прочитать и писать для общей памяти?

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

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

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

Другие советы

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

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

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

Как насчет регистров?

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

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

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

Но кто говорит, что нет банковских конфликтов? Я не совсем уверен в этом, потому что я не нашел никаких фактических источников для поддержки этого оборудования NVIDIA, но это кажется логичным: глобальная память обычно распространяется на несколько частей RAM (которые могут быть легко проверены, глядя на видеокарта). Это имеет смысл, если каждая из этих чипсов похоже на банк местной памяти, поэтому вы получите банковские конфликты, если на одном банке есть несколько одновременных запросов. Однако эффекты будут намного менее произнесены за одну вещь (так как большую часть времени, потребляемого доступами к памяти, является задержкой, чтобы получить данные от A до B в любом случае), и это не будет заметным «внутри» одной рабочей группы. (Поскольку только один полуварп выполняется одновременно, и если этот полуварп возникает больше, чем один запрос, у вас есть бесчисленный доступ памяти, поэтому вы уже принимаете удар, что усердно измерить эффекты этого конфликта. Так что вы только получите конфликты только Несколько рабочих групп пытаются получить доступ к одному и тому же банку. В вашей типичной ситуации для GPGPU у вас есть большой набор данных, лежащий в последовательной памяти, чтобы эффекты не были действительно бы ошеломлены, так как есть достаточно других рабочих групп, получающих другие банки одновременно, но это Должно быть возможным построить ситуации, когда набор данных сосредоточен всего на нескольких банках, что приведет к удару полосы пропускания (поскольку максимальная пропускная способность придет от равных распределительных доступов на всех банках, поэтому каждый банк будет Ныри имеют долю этой пропускной способности). Опять же, я ничего не читал, чтобы доказать эту теорию для аппаратного обеспечения NVIDIA (в основном все сосредоточивается на коалицевину, что, конечно, важнее, поскольку она делает это неблагоприятной для натуральных данных). Однако, согласно руководству по вычислению потока ATI, это ситуация для карт RADEON (для 5xxx: банки находятся на расстоянии 2 кБ, и вы хотите убедиться, что вы распространяете свои доступы (смысл от всех беспроводных средств), так что я Представь, что карты NVIDIA ведут себя Similary.

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

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

Несколько потоков, доступа к одному банку не обязательно означает, что есть банковский конфликт. Существует конфликт, если нитки хотят прочитать одновременно из другого ряда в одном банке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top