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

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

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

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

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

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

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

Ответ 1

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

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

  • Измерьте время выполнения для ряда проблемных размеров.
  • Рассчитайте, сколько данных ваша программа читает и записывает из и в память для одного и того же диапазона размеров проблем.
  • Разделить использование памяти по времени.

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

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

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

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

Ответ 2

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

  • Скорость ОЗУ вне процессора
  • Скорость кэширования внутри процессора
  • Число объектов, разделяющих шина памяти
  • Виртуальная память

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

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

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

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

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

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

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

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


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

Ответ 3

Широкая и общая область вашего вопроса делает почти невозможным ответить в более широком смысле.

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

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

Ответ 4

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

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