Насколько дорогие барьеры памяти на ARM64? -- Стоимость инструкции DMB

В документации ARM говорится, что инструкции барьера памяти «очень дорогие», но нет реального указания на то, насколько они дороги. Я имею в виду конкретно инструкции ARM DMB.

Насколько они дороги? Сотни циклов процессора или тысячи циклов процессора?

Ужасы, которые я могу себе представить:

  • Что барьер чтения памяти полностью делает недействительным кеш L1 на текущем ядре.

  • Что барьер записи должен ждать, пока все грязные строки кэша L1 не будут записаны обратно в L2 (однопроцессорный/многоядерный) или в основную память (многопроцессорный).

Разве это не может быть тысячами циклов процессора? например время записи 8192 грязных строк кэша L1 в кэш L2 при ~7 циклах ЦП каждая.

Для контекста меня беспокоит взаимодействие между БПФ свертки, работающими в фоновом потоке (который определенно загрязняет весь кеш L1), и меньшими очередями без блокировки, отправляющими пакеты данных в аудиопоток реального времени и из него. Мне интересно, стоит ли использовать атомарные инструкции для чтения и записи данных в очереди вместо использования барьеров памяти DMB.

Мне интересно, происходит ли следующее: большой FFT выполняется в фоновом потоке, полностью загрязняя кеш L1; звуковой поток пробуждается, выдает инструкцию барьера записи DMB и теперь должен ждать, пока полностью грязный кэш L1 не запишет обратно в L2.

Речь идет о процессоре Raspberry Pi 4, ARM 8.1a. В ARM 8.1a есть атомарные инструкции для «улучшения производительности многопоточных приложений», которые позволяют полностью избежать инструкций DMB в аудиопотоке.

Превентивно: да, я использую 20 операций С++ для создания барьеров чтения и записи. Не решил, использую ли я мьютексы или нет, но тот же вопрос актуален, поскольку у мьютексов тоже есть барьеры памяти. Я проверил. GCC генерирует правильные инструкции 8.1a для атомарных операций и компилирует в инструкции DMB для барьеров памяти.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

FYI Raspberry Pi не содержит процессор ARMv8.1. Это Cortex-A72, он очень похож на семейство ARMv8.0 и поэтому не имеет этих атомарных инструкций. Атомарность С++ должна быть реализована здесь с монопольными операциями, хотя это будет зависеть от вашей библиотеки С++.

Чтобы ответить на общий вопрос, насколько дорогой DMB, это зависит от загрузки системы. Фактическая инструкция не требует реального времени для выполнения (небольшое однозначное число циклов здесь или там), но барьер предотвратит загрузку и/или сохранение после нее, в программном порядке, от отправки в систему. И обслуживание кэша, и естественная активность кэша считаются хранилищами. Запросы когерентности кэша от текущего ядра или к нему также могут препятствовать завершению работы барьера. На Raspberry Pi это четырехъядерный кластер Cortex-A72, использующий одну шину AXI для системы памяти, поэтому активность трех других ядер будет играть роль в том, как долго этот барьер заставляет текущий процессор ждать.

В этом смысле предсказать довольно сложно, поскольку вам нужно целостное представление о том, что происходит в системе, но очень легко рассуждать и сравнивать. Если у вас есть особенно вопиющий барьер, он может отображаться рядом с ним в процентах в отчете о «производительности» в Linux — это просто указание на то, что когда производительность замерила состояние приложения, на котором задержался счетчик программ. эта инструкция, чем это производительность барьера.

Существуют ли значительные очереди между контроллерами когерентности кэшей L1 на каждом ядре? В какой степени грязные строки кэша L1 удерживаются от кэша L2 (если вообще)? Рассуждая в целом, кэши L1 настолько грязны, насколько это возможно, потому что три фоновых потока специально настроены для выполнения операций, которые оптимальным образом используют кэш L1 во время операций БПФ. В целом, я ожидаю, что все будет настолько плохо, насколько это возможно, когда аудиопотоки выполняют DMB. Вопрос, я думаю, в том, что является наихудшим случаем для достижения когерентности кэша?

Robin Davies 25.04.2023 18:47

И мониторинг производительности сложен, потому что меня гораздо больше беспокоит наихудшая производительность в одном конкретном потоке, чем средняя производительность в нескольких потоках. Я полагаю, я мог бы это инструментировать. :-/

Robin Davies 25.04.2023 18:53

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