Исследование изменения скорости выполнения программ из-за промахов кэша процессора | Статья в журнале «Молодой ученый»

Отправьте статью сегодня! Журнал выйдет 28 декабря, печатный экземпляр отправим 1 января.

Опубликовать статью в журнале

Автор:

Рубрика: Информационные технологии

Опубликовано в Молодой учёный №23 (365) июнь 2021 г.

Дата публикации: 08.06.2021

Статья просмотрена: 140 раз

Библиографическое описание:

Лобашевская, В. А. Исследование изменения скорости выполнения программ из-за промахов кэша процессора / В. А. Лобашевская. — Текст : непосредственный // Молодой ученый. — 2021. — № 23 (365). — С. 100-102. — URL: https://moluch.ru/archive/365/81319/ (дата обращения: 18.12.2024).



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

Ключевые слова: кэш процессора, кэш L1, кэш L2, эффективная разработка, бенчмарк.

Введение

Внимательно посмотрев на таблицу 1 «Задержки, которые должен знать каждый программист» [1], можно заметить, что скорость обращения к различной памяти сильно отличается. Нетрудно догадаться, что при составлении программ программисту необходимо как можно реже обращаться к «долгой» памяти и как можно чаще работать с «быстрой» памятью.

Таблица 1

Задержки, которые должен знать каждый программист (часть)

L1 cache reference

0.5 ns

Branch mispredict

5 ns

L2 cache reference

7 ns

Mutex lock/unlock

25 ns

Main memory reference

100 ns

...

...

Не все программисты работают с «очень долгой» памятью, например, огромными базами данных на магнитных лентах, и скорее всего эти разработчики знают, что прочитать один блок данных может занимать время, которое может ощутить человек (порядок нескольких секунд). Однако чаще всего ведется работа с более мелкими участками памяти (порядок нескольких мегабайт). И в этом случае незначительная вольность в работе с памятью становится не так заметна, хотя она может присутствовать.

В этой статье будет рассмотрены медленный и быстрый способ работы с памятью. Будет наглядно показано, насколько быстрее начинает работать программа, если свести количество обращений к медленной памяти к минимуму.

Кэш процессора

Согласно иерархической концепции организации компьютерной памяти [2], память компьютера может быть представлена в виде следующих уровней: регистры процессора, кэши процессора, оперативная память, и некоторые другие уровни (см. рис. 1).

Иерархическая организация компьютерной памяти

Рис. 1. Иерархическая организация компьютерной памяти

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

Обращение к разным уровням кэша занимает разное количество времени. Чтение какой-либо ячейки памяти происходит очень приближенно следующим образом (подробнее про порядок записи/чтения в кэшах рассказано в [3]):

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

Наличие необходимых данных в каком-либо уровне кэша называется попаданием в кэш. Отсутствие данных в кэше называется промахом.

Пример программы с большим и маленьким количеством промахов кэша

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

Идея заключается в суммировании элементов двумерного массива, представленного в виде линейного участка памяти [4]. Параметр «size» — размер смещения в таком массиве, т. е. номер строки/столбца к которой мы обращаемся.

В первом случае мы чаще обращаемся к соседним участкам памяти:

for (int i = 0; i < size; ++i)

for (int j = 0; j < size; ++j)

sum += array [i * size + j];

Во втором — мы чаще обращаемся к отдаленным участкам памяти (различия в строке с обращением к элементу массива):

for (int i = 0; i < size; ++i)

for (int j = 0; j < size; ++j)

sum += array [i + size * j];

Запустим тест для разных значений size и построим график полученных зависимостей (рис. 2).

Зависимость времени выполнения программы от размера смещения в линейно-двумерном массиве

Рис. 2. Зависимость времени выполнения программы от размера смещения в линейно-двумерном массиве

Из графика видно, что начиная с размера смещения примерно 1250 байт влияние промахов кеша на скорость работы программы становится значительным. Из-за промахов тратится примерно в 2 раза больше времени на выполнение задачи. 1250 байт примерно соответствуют размеру кэша уровня L2 на компьютере, на котором проводилось тестирование — 1 Мб.

Выводы

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

Литература:

  1. Jonas Bonér Latency Numbers Every Programmer Should Know — Текст: электронный // Текстовый документ на гит репозитории — URL: https://gist.github.com/jboner/2841832 (дата обращения 28.04.2021)
  2. Branch misprediction. — Текст: электронный // Академик — интернет словарь. — URL: https://ru.wikipedia.org/wiki/Иерархия_памяти (дата обращения 29.04.2021)
  3. Кэш процессора. — Текст: электронный // Википедия свободная энциклопедия. — URL: https://ru.wikipedia.org/wiki/Кэш_процессора (дата обращения 29.04.2021)
  4. Динамическое выделение памяти, динамические массивы. — Текст электронный // Сообщество программистов С/С++. — URL: https://prog-cpp.ru/c-alloc/ (дата обращения 29.04.2021)
Основные термины (генерируются автоматически): кэш процессора, кэш, промах кэша, размер смещения, блок данных, компьютерная память, оперативная память, программа, скорость работы программы.


Ключевые слова

бенчмарк, кэш процессора, кэш L1, кэш L2, эффективная разработка

Похожие статьи

Рекомендации по оптимизации потребления памяти в Java

В статье описаны часто используемые способы по оптимизации потребления памяти Java приложений. Стоит понимать, что эти рекомендации несут информационный характер, зависящие от конкретной ситуации; использовав в одном случае, нет полной гарантии, что ...

Оптимизация работы программы по скорости методами программирования без условных операторов

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

Использование сети Хемминга для автоматической коррекции ошибок

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

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

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

Динамическое управление структурой распределенной базы данных

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

Защита корпоративных сетей от внутренних атак

В данной статье исследуется разработка корпоративной сети на базе технологии Multiprotocol Label Switching (MPLS) и стратегии защиты от атак типа Address Resolution Protocol (ARP) spoofing и троянских программ [1]. Основой стратегии безопасности служ...

Работа с баг-трекером: эффективное управление ошибками в разработке программного обеспечения

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

Построение процессов в мини-команде

В статье рассматривается один из вариантов планирования работы команды, состоящей из 3 человек, в контексте разработки программного обеспечения. В данном случае рассматривается планирование длиной в 1 год.

Повышение эффективности логистического планирования за счет использования искусственного интеллекта

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

Применение искусственных нейронных сетей для прогнозирования DoS атак

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

Похожие статьи

Рекомендации по оптимизации потребления памяти в Java

В статье описаны часто используемые способы по оптимизации потребления памяти Java приложений. Стоит понимать, что эти рекомендации несут информационный характер, зависящие от конкретной ситуации; использовав в одном случае, нет полной гарантии, что ...

Оптимизация работы программы по скорости методами программирования без условных операторов

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

Использование сети Хемминга для автоматической коррекции ошибок

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

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

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

Динамическое управление структурой распределенной базы данных

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

Защита корпоративных сетей от внутренних атак

В данной статье исследуется разработка корпоративной сети на базе технологии Multiprotocol Label Switching (MPLS) и стратегии защиты от атак типа Address Resolution Protocol (ARP) spoofing и троянских программ [1]. Основой стратегии безопасности служ...

Работа с баг-трекером: эффективное управление ошибками в разработке программного обеспечения

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

Построение процессов в мини-команде

В статье рассматривается один из вариантов планирования работы команды, состоящей из 3 человек, в контексте разработки программного обеспечения. В данном случае рассматривается планирование длиной в 1 год.

Повышение эффективности логистического планирования за счет использования искусственного интеллекта

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

Применение искусственных нейронных сетей для прогнозирования DoS атак

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

Задать вопрос