Библиотека сайта rus-linux.net
Что каждый программист должен знать о памяти.
Часть 2: Кэш-память процессора
Оригинал: "Memory part 2: CPU caches"Автор: Ulrich Drepper
Дата публикации: October 1, 2007
Перевод: Н.Ромоданов
Дата перевода: апрель 2012 г.
Назад | Оглавление | Вперед |
3.5.3 Место размещения кэш-памяти
То, где относительно гиперпотоков, ядер и процессоров размещается кэш-память, выходит за рамки контроля программиста. Но программисты могут определить, где выполняются потоки, а затем, а это становится важным, как кэш-память соотносится с используемыми процессорами.
Здесь мы не будем вдаваться в подробности о том, как выбрать, какие ядра будут запускать потоки. Мы опишем только архитектурные детали, которые при настройке потоков программист должен принимать во внимание.
Гиперпотоки, по определению, использую совместно все ресурсы, кроме набора регистров. К этим ресурсам также относится кэш-память L1. Здесь об этом мало что можно сказать. Самое интересное начинается с отдельными ядрами процессора. Каждое ядро имеет, по крайней мере, свою собственную кэш-память L1. На сегодняшний день других конкретных особенностей, кроме этой, вообще не так много:
- Первые многоядерные процессоры имели отдельную кэш-память L2 и не имели кэш-память более высокого уровня.
- Более поздние модели Intel имели общую кэш-память L2, используемую в двухядерных процессорах. Для четырехядерных процессоров мы имеем дело с отдельной кэш-памятью L2 для каждой пары из двух ядер. Кэш-памяти более высокого уровня нет.
- Процессоры AMD серии 10 имеют отдельную кэш-память L2 и единую кэш-память L3.
Поставщиками процессоров было написано много пропагандистских материалов о преимуществе своих моделей. Отдельная кэш-память L2 дает преимущество в случае, если рабочие наборы, обрабатываемые отдельными ядрами, не перекрываются. Это хорошо работает в однопоточных программах. Поскольку однопоточные программы являются реалиями сегодняшнего дня, такой подход не слишком плох. Но некоторые перекрытия есть всегда. В кэш-памяти всегда находятся наиболее активно используемые части общих библиотек времени выполнения, что означает, что некоторое пространство кэш-памяти расходуется впустую.
Вся кэш-память, уровень которой ниже L1, является полностью разделяемой, что дает двухядерным процессорам фирмы Intel действительно большое преимущество. Если рабочий набор в потоках, работающих на двух ядрах, существенно перекрывается, то общий объем доступной кэш-памяти становится большим и рабочие наборы могут быть большего размера без потери производительности. Если рабочие наборы не не перекрываются, то интеллектуальная система управления кэш-памятью Advanced Smart Cache фирмы Intel должна предотвращать ситуацию, когда одно ядро может монополизировать всю кэш-память.
Но если оба ядра используют для своих рабочих наборов около половины кэш-памяти, то имеются некоторые потери. Кэш-память должна постоянно оценивать использование кэш-память двумя ядрами и освобождение, осуществляемое как часть такого балансирования, может выбираться неудачно. Чтобы рассмотреть проблему, мы посмотрим на результаты работы еще одной тестовой программы.
Рис.3.31: Пропускная способность при наличии двух процессов
В тестовой программе имеется один процесс, который постоянно читает или записывает с помощью инструкций SSE блоки памяти размером в 2MB. Размер в 2MB был выбран потому, что это в два раза меньше размера кэш-памяти L2 процессора Core 2. Процесс выполняется одним ядром, а за вторым ядром закреплен второй процесс. Этот второй процесс читает и записывает области памяти произвольного размера. На графике показано, сколько байтов за цикл читается или записывается. Изображены четыре различных графика — по одному для каждой комбинации чтения и записи. Для графика чтения / записи фоновый процесс, который всегда использует рабочий набор размером 2MB, всегда выполняет запись, а измеряемый процесс, использующий рабочие наборы переменного размера, выполняет чтение.
Интересной является часть графика, расположенная между байтами 220 и 223. Если бы кэш-память L2 обоих ядер была бы полностью отдельной, то мы могли бы ожидать, что производительность всех четырех тестов упала между байтами 221 и 222, что означало бы, что кэш-память L2 исчерпана. Как видно на рис.3.31 это не так. Лучше всего это видно, когда фоновый процесс выполняет запись. Производительность начинает ухудшаться раньше, чем размер рабочего набора достигает 1MB. Эти два процесса не используют совместную память, поэтому не должны генерироваться сообщения RFO. Это проблемы исключительно освобождения кэш-памяти. В интеллектуальной системе управления кэш-памятью есть свои проблемы, с эффектом, который, как видно на примере, проявляется ближе к значению 1MB, а не к 2MB, которое доступно в каждом ядре. Можно только надеяться, что, если в будущих процессорах останется совместное использование кэш-памяти несколькими ядрами, алгоритм, применяемый в интеллектуальной системе управления кэш-памятью, будет исправлен.
Четырехядерный процессор с двумя кэшами уровня L2 был всего лишь временным решением, использовавшимся прежде, чем был введен кэш более высокого уровня. Такая конструкция не дает существенных преимуществ по сравнению с процессорами с отдельными подключениями и двумя ядрами. Два ядра взаимодействуют через ту же шину, которая, если смотреть извне, является шиной FSB. Какой-либо специальный механизм ускоренного обмена данными отсутствует.
Будущее дизайна кэш-памяти для многоядерных процессоров будет представлять собой добавление уровней. Старт был дан серией 10 процессора AMD. Еще предстоит выяснить, увидим ли мы кэш-память еще более низкого уровня, которая будет совместно использоваться некоторым подмножеством ядер процессора. Дополнительные уровни кэш-памяти необходимы, поскольку высокоскоростная и часто используемая кэш-память не может совместно использоваться большим количеством ядер. Это повлияет на производительность. Для этого также потребуется кэш-память очень большого размера с высокой ассоциативностью. Оба значения, размер кэш-памяти и ассоциативность, должны увеличиваться вместе с увеличением числа ядер, совместно использующих кэш-память. Разумным компромиссом является использование кэш-памяти L3 большого размера и кэш-памяти L2 разумного размера. Кэш-память L3 работает медленнее, но, в идеале, она используется не так часто, как кэш-память L2.
Для программистов все эти различия в дизайне усложняют принятие решений. Чтобы достичь наилучшей производительности, нужно знать, какова будет нагрузка, а также нужно знать особенности архитектуры машины. К счастью, у нас есть возможность определения архитектуры машины. Интерфейсы будут представлены в следующих разделах.
Назад | Оглавление | Вперед |