Могут ли быть конфликты банков для данного типа памяти, очевидно, зависит от структуры памяти и, следовательно, от ее назначения.
Так почему же общая память спроектирована таким образом, что допускает конфликты банков?
Это относительно просто, непросто разработать контроллер памяти, который может обрабатывать независимый доступ к одной и той же памяти одновременно (доказывается тем фактом, что большинство из них не могут). Таким образом, чтобы позволить каждому потоку в полуварпе получить доступ к отдельно адресуемому слову, память разделяется на банки с независимым контроллером для каждого банка (по крайней мере, так можно думать об этом, не уверен насчет фактического оборудования). Эти банки чередуются, чтобы последовательные потоки могли быстро обращаться к последовательной памяти. Таким образом, каждый из этих банков может обрабатывать один запрос за раз, что в идеале позволяет одновременно выполнять все запросы в полуварпе (очевидно, что эта модель теоретически может поддерживать более высокую пропускную способность из-за независимости этих банков, что также является плюсом).
Что насчет регистров?
Регистры предназначены для доступа в качестве операндов для инструкций ALU, что означает, что доступ к ним должен осуществляться с очень малой задержкой. Поэтому они получают больше транзисторов на бит, чтобы сделать это возможным. Я не уверен, как именно осуществляется доступ к регистрам в современных процессорах (не та информация, которая вам нужна часто, и ее не так просто найти). Однако, очевидно, было бы крайне непрактично организовывать регистры в банки (для более простых архитектур вы обычно видите, что все регистры висят на одном большом мультиплексоре). Так что нет, конфликтов с банками из-за реестров не будет.
Глобальная память
Во-первых, глобальная память работает с другой степенью детализации, чем разделяемая память. Доступ к памяти осуществляется блоками по 32, 64 или 128 байт (по крайней мере, для GT200, для fermi всегда 128 байт, но кэшируется, у AMD немного по-другому), где каждый раз, когда вы хотите что-то из блока, осуществляется доступ/передача всего блока. Вот почему вам нужен объединенный доступ, поскольку, если каждый поток обращается к памяти из другого блока, вам придется передавать все блоки.
Но кто сказал, что банковских конфликтов не бывает? Я не совсем уверен в этом, потому что я не нашел никаких фактических источников, подтверждающих это для оборудования NVIDIA, но это кажется логичным: глобальная память обычно распределяется между несколькими микросхемами оперативной памяти (что можно легко проверить, посмотрев на видеокарта). Было бы разумно, если бы каждый из этих чипов был чем-то вроде банка локальной памяти, поэтому вы могли бы получить конфликты банков, если есть несколько одновременных запросов к одному и тому же банку. Однако для одной вещи эффект будет гораздо менее выраженным (поскольку большая часть времени, затрачиваемого на доступ к памяти, в любом случае является задержкой для получения данных из A в B), и это не будет заметным эффектом «внутри» одной рабочей группы. (поскольку одновременно выполняется только один халфварп, и если этот халфварп выдает более одного запроса, у вас есть необъединенный доступ к памяти, поэтому вы уже получаете удар, что затрудняет измерение последствий этого конфликта. Таким образом, вы получите конфликты, только если несколько рабочих групп пытаются получить доступ к одному и тому же банку.В вашей типичной ситуации для gpgpu у вас есть большой набор данных, лежащий в последовательной памяти, поэтому эффекты на самом деле не должны быть заметны, поскольку есть достаточно других рабочих групп, обращающихся к другим банкам в то же время, но это Должна быть возможна ситуация, когда набор данных сосредоточен всего в нескольких банках, что приведет к удару по пропускной способности (поскольку максимальная пропускная способность будет получена при равном распределении доступа по всем банкам, поэтому каждый банк будет имеют лишь часть этой пропускной способности). Опять же, я не читал ничего, чтобы доказать эту теорию для оборудования nvidia (в основном все сосредоточено на объединении, что, конечно, более важно, поскольку делает это не проблемой для естественных наборов данных). Однако, согласно руководству по вычислениям ATI Stream, это ситуация для карт Radeon (для 5xxx: банки находятся на расстоянии 2 КБ друг от друга, и вы хотите убедиться, что вы распределяете свои доступы (имеется в виду от всех симуляционно активных рабочих групп) одинаково по всем банкам), поэтому я можно предположить, что карты NVidia ведут себя аналогично.
Конечно, для большинства сценариев возможность конфликтов банков в глобальной памяти не является проблемой, поэтому на практике вы можете сказать:
- Следите за объединением при доступе к глобальной памяти
- Следите за конфликтами банков при доступе к локальной памяти
- Нет проблем с доступом к регистрам
person
Grizzly
schedule
02.10.2010