Когда программа ограничена пропускной способностью памяти? - PullRequest
13 голосов
/ 01 июня 2010

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

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 02 июня 2010

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

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

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

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

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

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

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

7 голосов
/ 02 июня 2010

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

  1. Скорость оперативной памяти вне процессора
  2. Скорость кеша внутри процессора
  3. Количество объектов, совместно использующих шина памяти
  4. Виртуальная память

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

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

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

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

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

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

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

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


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

3 голосов
/ 01 июня 2010

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

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

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

1 голос
/ 20 апреля 2011

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

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

...