Когда программа ограничена пропускной способностью памяти?

Я хочу знать, если программа, которую я использую и которая требует много памяти ограничена пропускной способностью памяти.

когда вы ожидаете, что это произойдет? Случалось ли это с вами в реальной жизни?

Я нашел несколько статей, обсуждающих этот вопрос, в том числе:

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

Как я могу измерить пропускную способность памяти, которую использует данная программа, и как я могу измерить (пиковую) пропускную способность, которую может предложить моя система?

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

4 ответов


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

чтобы выяснить производительность памяти вашей программы:

  1. измерьте время выполнения для ряда размеров проблемы.
  2. вычислить вручную, сколько данных ваша программа читает и записывает из и в память для того же диапазона размеров проблемы.
  3. деление памяти по времени.

предупреждение: это грубый подход и должен использоваться только для выяснения, следует ли обращать внимание на проблемы с пропускной способностью памяти. Если ваше грубое вычисление говорит вам, что ваша программа использует менее 50% доступной пропускной способности памяти (цифры, которые вы получили от затем STREAM benchmark), то вы не должны больше думать об этом.

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

Если ваша программа использует виртуальную память или если она выполняет ввод-вывод, то пропускная способность памяти не является проблемой, пока вы не отсортируете диск полосы пропускания.

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


приложения с интенсивной памятью или приложения, требующие много памяти, ограничены:

  1. скорость оперативной памяти вне процессора
  2. скорость кэширования внутри процессора
  3. количество субъектов обмена автобус памяти
  4. Виртуальный

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

1. Скорость оперативной памяти вне процессора
Процессор должен выйти за пределы своей оболочки и захватить инструкции и данные из ОЗУ. ОЗУ имеет разные скорости, с которыми он может получить доступ к ячейкам и вернуть биты обратно в процессор. Как правило, это отмечается в единицах Гц. Чем быстрее память, тем меньше времени ваш процесс тратит на загрузку инструкции и данные, и тем быстрее ваша программа выполняется.

Примечание: увеличение скорости памяти за пределами возможностей процессора не приведет к повышению производительности. Это изменяет узкое место от ОЗУ к процессору. См. также #3.

2. Скорость кэширования внутри процессора Кэш-память находится внутри корпуса процессора. Это один из самых быстрых типов памяти. Процессоры будут искать это память перед поиском ОЗУ. Улучшение скорости и количества этой памяти улучшит производительность вашего процессора,если другие ядра также не обращаются к этой памяти. Для нескольких ядер, обращающихся к памяти, необходимо разрешение конфликтов, что может замедлить производительность приложений.

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

3. Количество сущностей, совместно использующих шину памяти
Шина памяти похожа на шоссе, которое сущности используют, чтобы добраться до ОЗУ. Как и на шоссе, больше полос означает более высокую пропускную способность (например, 16-разрядная ширина против 32-разрядной). Многие автобусы также имеют ограничение скорости, опять же, чем выше предел, тем быстрее доступ. Вероятно, наиболее заметной концепцией является количество объектов, подключенных к шине. Как с шоссе, больше пользователей замедляет движение. В большинстве шин памяти только один объект может использовать его одновременно; другие объекты должны ждать. Уменьшение количества объектов, которые должны использовать шину памяти, ускорит вашу программу.

некоторые общие объекты, разделяющие шину памяти: CPU, контроллеры DMA, видеопроцессоры, звуковые процессоры и сетевые или процессоры ввода-вывода.

4. виртуальная память. Многие современные компьютеры используют виртуальный. Если программа требует больше памяти, чем доступно в ОЗУ, операционная система заменит разделы памяти областями на жестком диске. Это стоит больше времени, чем снижение скорости работы памяти. Программа с интенсивной памятью более эффективна, только используя выделенную ей память, чем вся необходимая ей память. Сокращение этих свопов виртуальной памяти ускорит работу программы.


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


широкий и общий объем на ваш вопрос почти невозможно ответить в более широком смысле.

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

как могу ли я измерить пропускную способность памяти, которую использует данная программа, и как измерить (пиковую) пропускную способность, которую может предложить моя система? Первый может быть измерен только (в программном обеспечении), если процессор поддерживает какой-то счетчик производительности, который подсчитывает количество циклов, когда процессор застопорился, потому что он должен ждать завершения доступа к памяти.
Второй может быть легко измерен, как правило, заполнение / копирование больших областей памяти. Существует бесчисленное множество тестовых программ, доступных вы можете использовать (я не использовал один из них в течение многих лет, но Сандра и пакета PCMark приходят на ум. Должно быть много бесплатных утилит,которые тоже это делают).


программы, ограниченные пропускной способностью памяти, имеют более высокие ссылки на память (операции загрузки и/или хранения ) для арифметических/логических операций. Пример-процедуры BLAS1, такие как daxpy, ddot и т. д.

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