Что такое кэш память процессора. Галерея эффектов кэшей процессоров. Понятие и виды кэш-памяти

Подписаться
Вступай в сообщество «vityazevo-pizz-and-roll.ru»!
ВКонтакте:

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

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

Что такое кэш-память и её структура

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

Кэш-память построена на триггерах, которые, в свою очередь, состоят из транзисторов. Группа транзисторов занимает гораздо больше места, нежели те же самые конденсаторы, из которых состоит оперативная память . Это тянет за собой множество трудностей в производстве, а также ограничения в объёмах. Именно поэтому кэш память является очень дорогой памятью, при этом обладая ничтожными объёмами. Но из такой структуры, вытекает главное преимущество такой памяти – скорость. Так как триггеры не нуждаются в регенерации, а время задержки вентиля, на которых они собраны, невелико, то время переключения триггера из одного состояния в другое происходит очень быстро. Это и позволяет кэш-памяти работать на таких же частотах, что и современные процессоры.

Также, немаловажным фактором является размещение кэш-памяти. Размещена она, на самом кристалле процессора, что значительно уменьшает время доступа к ней. Ранее, кэш память некоторых уровней, размещалась за пределами кристалла процессора, на специальной микросхеме SRAM где-то на просторах материнской платы. Сейчас же, практически у всех процессоров, кэш-память размещена на кристалле процессора.


Для чего нужна кэш-память процессора?

Как уже упоминалось выше, главное назначение кэш-памяти – это хранение данных, которые часто используются процессором. Кэш является буфером, в который загружаются данные, и, несмотря на его небольшой объём, (около 4-16 Мбайт) в современных процессорах , он дает значительный прирост производительности в любых приложениях.

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

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

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

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

Уровни кэш-памяти процессора

Современные процессоры, оснащены кэшем, который состоит, зачастую из 2–ух или 3-ёх уровней. Конечно же, бывают и исключения, но зачастую это именно так.

В общем, могут быть такие уровни: L1 (первый уровень), L2 (второй уровень), L3 (третий уровень). Теперь немного подробнее по каждому из них:

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

Мы будем рассматривать объёмы на процессоре высокого уровня производительности Intel Core i7-3770K. Данный процессор оснащен 4х32 Кб кэш-памяти первого уровня 4 x 32 КБ = 128 Кб. (на каждое ядро по 32 КБ)

Кэш второго уровня (L2) – второй уровень более масштабный, нежели первый, но в результате, обладает меньшими «скоростными характеристиками». Соответственно, служит буфером между уровнем L1 и L3. Если обратиться снова к нашему примеру Core i7-3770 K, то здесь объём кэш-памяти L2 составляет 4х256 Кб = 1 Мб.

Кэш третьего уровня (L3) – третий уровень, опять же, более медленный, нежели два предыдущих. Но всё равно он гораздо быстрее, нежели оперативная память. Объём кэша L3 в i7-3770K составляет 8 Мбайт. Если два предыдущих уровня разделяются на каждое ядро, то данный уровень является общим для всего процессора. Показатель довольно солидный, но не заоблачный. Так как, к примеру, у процессоров Extreme-серии по типу i7-3960X, он равен 15Мб, а у некоторых новых процессоров Xeon, более 20.

Насколько важен кэш L3 для процессоров AMD?

Действительно, имеет смысл оснащать многоядерные процессоры выделенной памятью, которая будет использоваться совместно всеми доступными ядрами. В данной роли быстрый кэш третьего уровня (L3) может существенно ускорить доступ к данным, которые запрашиваются чаще всего. Тогда ядрам, если существует такая возможность, не придётся обращаться к медленной основной памяти (ОЗУ, RAM).

По крайней мере, в теории. Недавно AMD анонсировала процессор Athlon II X4 , представляющий собой модель Phenom II X4 без кэша L3, намекая на то, что он не такой и необходимый. Мы решили напрямую сравнить два процессора (с кэшем L3 и без), чтобы проверить, как кэш влияет на производительность.

Нажмите на картинку для увеличения.

Как работает кэш?

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

Попадания и промахи

Эффективность архитектуры кэшей измеряется процентом попаданий. Запросы данных, которые могут быть удовлетворены кэшем, считаются попаданиями. Если данный кэш не содержит нужные данные, то запрос передаётся дальше по конвейеру памяти, и засчитывается промах. Конечно, промахи приводят к большему времени, которое требуется для получения информации. В результате в вычислительном конвейере появляются "пузырьки" (простои) и задержки. Попадания, напротив, позволяют поддержать максимальную производительность.

Запись в кэш, эксклюзивность, когерентность

Политики замещения диктуют, как в кэше освобождается место под новые записи. Поскольку данные, записываемые в кэш, рано или поздно должны появиться в основной памяти, системы могут делать это одновременно с записью в кэш (write-through) или могут маркировать данные области как "грязные" (write-back), а выполнять запись в память тогда, когда она будет вытесняться из кэша.

Данные в нескольких уровнях кэша могут храниться эксклюзивно, то есть без избыточности. Тогда вы не найдёте одинаковых строчек данных в двух разных иерархиях кэша. Либо кэши могут работать инклюзивно, то есть нижние уровни кэша гарантированно содержат данные, присутствующие в верхних уровнях кэша (ближе к процессорному ядру). У AMD Phenom используются эксклюзивный кэш L3, а Intel следует стратегии инклюзивного кэша. Протоколы когерентности следят за целостностью и актуальностью данных между разными ядрами, уровнями кэшей и даже процессорами.

Объём кэша

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

Ассоциативность

Записи в оперативной памяти могут привязываться к кэшу напрямую (direct-mapped), то есть для копии данных из оперативной памяти существует только одна позиция в кэше, либо они могут быть ассоциативны в n-степени (n-way associative), то есть существует n возможных расположений в кэше, где могут храниться эти данные. Более высокая степень ассоциативности (вплоть до полностью ассоциативных кэшей) обеспечивает наилучшую гибкость кэширования, поскольку существующие данные в кэше не нужно переписывать. Другими словами, высокая n-степень ассоциативности гарантирует более высокий процент попаданий, но при этом увеличивается задержка, поскольку требуется больше времени на проверку всех этих ассоциаций для попадания. Как правило, наибольшая степень ассоциации разумна для последнего уровня кэширования, поскольку там доступна максимальная ёмкость, а поиск данных за пределами этого кэша приведёт к обращению процессора к медленной оперативной памяти.

Приведём несколько примеров: у Core i5 и i7 используется 32 кбайт кэша L1 с 8-way ассоциативностью для данных и 32 кбайт кэша L1 с 4-way для инструкций. Понятно желание Intel, чтобы инструкции были доступны быстрее, а у кэша L1 для данных был максимальный процент попаданий. Кэш L2 у процессоров Intel обладает 8-way ассоциативностью, а кэш L3 у Intel ещё "умнее", поскольку в нём реализована 16-way ассоциативность для максимизации попаданий.

Однако AMD следует другой стратегии с процессорами Phenom II X4, где используется кэш L1 с 2-way ассоциативностью для снижения задержек. Чтобы компенсировать возможные промахи ёмкость кэша была увеличена в два раза: 64 кбайт для данных и 64 кбайт для инструкций. Кэш L2 имеет 8-way ассоциативность, как и у дизайна Intel, но кэш L3 у AMD работает с 48-way ассоциативностью. Но решение выбора той или иной архитектуры кэша нельзя оценивать без рассмотрения всей архитектуры CPU. Вполне естественно, что практическое значение имеют результаты тестов, и нашей целью как раз была практическая проверка всей этой сложной многоуровневой структуры кэширования.

Каждый современный процессор имеет выделенный кэш, которых хранит инструкции и данные процессора, готовые к использованию практически мгновенно. Этот уровень обычно называют первым уровнем кэширования или L1, впервые такой кэш появился у процессоров 486DX. Недавно процессоры AMD стали стандартно использовать по 64 кбайт кэша L1 на ядро (для данных и инструкций), а процессоры Intel используют по 32 кбайт кэша L1 на ядро (тоже для данных и инструкций)

Кэш первого уровня впервые появился на процессорах 486DX, после чего он стал составной функцией всех современных CPU.

Кэш второго уровня (L2) появился на всех процессорах после выхода Pentium III, хотя первые его реализации на упаковке были в процессоре Pentium Pro (но не на кристалле). Современные процессоры оснащаются до 6 Мбайт кэш-памяти L2 на кристалле. Как правило, такой объём разделяется между двумя ядрами на процессоре Intel Core 2 Duo, например. Обычные же конфигурации L2 предусматривают 512 кбайт или 1 Мбайт кэша на ядро. Процессоры с меньшим объёмом кэша L2, как правило, относятся к нижнему ценовому уровню. Ниже представлена схема ранних реализаций кэша L2.

У Pentium Pro кэш L2 находился в упаковке процессора. У последовавших поколений Pentium III и Athlon кэш L2 был реализован через отдельные чипы SRAM, что было в то время очень распространено (1998, 1999).

Последовавшее объявление техпроцесса до 180 нм позволило производителям, наконец, интегрировать кэш L2 на кристалл процессора.


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


Впервые кэш L2 стал использоваться совместно двумя вычислительными ядрами на процессорах Core 2 Duo. AMD пошла дальше и создала свой первый четырёхъядерный Phenom "с нуля", а Intel для своего первого четырёхъядерного процессора вновь использовала пару кристаллов, на этот раз уже два двуядерных кристалла Core 2, чтобы снизить расходы.

Кэш третьего уровня существовал ещё с первых дней процессора Alpha 21165 (96 кбайт, процессоры представлены в 1995) или IBM Power 4 (256 кбайт, 2001). Однако в архитектурах на основе x86 кэш L3 впервые появился вместе с моделями Intel Itanium 2, Pentium 4 Extreme (Gallatin, оба процессора в 2003 году) и Xeon MP (2006).

Первые реализации давали просто ещё один уровень в иерархии кэша, хотя современные архитектуры используют кэш L3 как большой и общий буфер для обмена данными между ядрами в многоядерных процессорах. Это подчёркивает и высокая n-степень ассоциативности. Лучше поискать данные чуть дольше в кэше, чем получить ситуацию, когда несколько ядер используют очень медленный доступ к основной оперативной памяти. AMD впервые представила кэш L3 на процессоре для настольных ПК вместе с уже упоминавшейся линейкой Phenom. 65-нм Phenom X4 содержал 2 Мбайт общего кэша L3, а современные 45-нм Phenom II X4 имеют уже 6 Мбайт общего кэша L3. У процессоров Intel Core i7 и i5 используется 8 Мбайт кэша L3.

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


Оказался у меня на руках процессор i5 2400. И так как у меня есть 2600k, у которого L3 кэш 8mb против 6mb у i5 - захотел сравнить их в играх и приложениях. Время было ограничено, поэтому тестов будет не так много. Но чтобы добавить еще больше информации, я поигрался с памятью и смоделировал три ситуации с i5 2400.

1. Конфиг с самой дешевой материнской платой на чипсете с индексом «H», где отсутствует возможность разгона и частота всех ядер будет 3200MHz. Оперативная память будет работать на частоте 1333MHz при таймингах 9:9:9:27

2. Конфиг с материнской платой на чипсете с индексами «P» и «Z» у которых есть возможность поднять множитель процессоров с поддержкой турбобуста на четыре пункта. В моем случае с процессором i5 2400 множитель с 32 можно поднять до 36, тем самым получив частоту в 3600MHz. Разогнав еще и шину, я получил 3800MHz, что на 600MHz больше чем в первом конфиге. Оперативная память в данном случае будет работать на частоте 2252MHz при таймингах 9:9:9:27

3. Конфиг точно такой же как и второй, но с частотой оперативной памяти в 1689MHz на таймингах 9:9:9:27

4. Конфиг с процессором 2600k на частоте 3,80GHz, отключенным HT и оперативной памятью 2252MHz с таймингами 9:9:9:27.

Тестовые комплектующие:
Intel Core i7 2600K
Intel Core i5 2400
Материнская плата: ASUS P8Z77-V Deluxe
Оперативная память: 16GB DDR3 CRUCIAL Ballistix Elite
Видеокарта: GTX 780 Ti 1279|7800 Драйвера: 381.89
Блок питания: APS-850C 850W
Операционная система: Windows 8.1 x64 чистая (35 процессов после запуска системы)

i5 2400 3200MHz DDR3 1333MHz

i5 2400 3800MHz DDR3 1689MHz

i5 2400 3800MHz DDR3 2252MHz

i7 2600k 3800MHz 2252MHz

NVIDIA GTX 780 Ti 1279|7800

Результаты тестирования:

3DMark 2013 CPU Score




Прирост как от кэша так и от оперативной памяти минимальный.

_________________________________________________________________________________________________

Cinebench R15




В Cinebench R15 наблюдаем аналогичную картину.

_________________________________________________________________________________________________

LinX 0.6.5 Объем задачи: 25000




В LinX также прирост дает только разгон процессора

_________________________________________________________________________________________________

x264 FHD Benchmark




И снова прирост на уровне погрешности.

_________________________________________________________________________________________________

Winrar v4.20



И вот наконец получаем прирост от кэша порядка 6% и от памяти около 15%

_________________________________________________________________________________________________

Battlefield 1 SinglePlayer


Разрешение: 1280x720
Шкала разрешения: 100%
Качество текстур: низ. / сред. / выс. / ультра
Фильтрация текстур: низ. / сред. / выс. / ультра
Качество освещения: низ. / сред. / выс. / ультра
Качество эффектов: низ. / сред. / выс. / ультра
Качество постобработки: низ. / сред. / выс. / ультра
Качество сетки: низ. / сред. / выс. / ультра
Качество ландшафта: низ. / сред. / выс. / ультра
Качество травы: низ. / сред. / выс. / ультра
Качество сглаживания: нет / FXAA (среднее) / FXAA (высокое) / TAA
Объемный свет: нет / SSAO / HBAO


Небольшой прирост от L3 кэша есть.

_________________________________________________________________________________________________

Crysis 3 Добро пожаловать в джунгли


Разрешение: 1280x720
Сглаживание: откл.
Разрешение текстур: низк. / средн. / высок. / макс.
Эффекты: низк. / средн. / высок. / макс.
Объект: низк. / средн. / высок. / макс.
Частицы: низк. / средн. / высок. / макс.
Постобработка: низк. / средн. / высок. / макс.
Затенение: низк. / средн. / высок. / макс.
Тени: низк. / средн. / высок. / макс.
Вода: низк. / средн. / высок. / макс.
Анизотропный фильтр: 1x / 2x / 4x / 8x / 16x
Степень размытости: откл
Блики: да / нет


Одна из самых требовательных к процессору сцен в игре. Прирост только от частоты процессора. Загрузка 780Ti в этой сцене даже на i7 не превысила 50%

_________________________________________________________________________________________________

Grand Theft Auto V Встроенный бенчмарк (Последняя сцена)


Разрешение: 1280x720
Версия DirectX: 11
Сглаживание FXAA: выкл / вкл
Сглаживание MSAA: выкл / x2 / x4 / x8
Населенность города: max
Разновидность населения: max
Фокусировочная шкала: max
Качество текстур: стандарт / высокое / оч.высокое
Качество шейдеров: стандарт / высокое / оч.высокое
Качество теней: стандарт / высокое / оч.высокое
Качество отражений: высшая степень
MSAA для отражений: выкл / x2 / x4 / x8
Качество воды: стандарт / высокое / оч.высокое
Качество частиц: стандарт / высокое / оч.высокое
Качество травы: стандарт / высокое / оч.высокое / высшая степень
Мягкие тени: резко / мягко / мягче / макс.мягко / AMD CHS / NVIDIA PCSS
Настройка спецэффектов: стандарт / высокая / оч.высокая / высшая степень
Степень размытия при движении: min
Эффект глубины резкости: выкл / вкл
Анизотропная фильтрация: x16
Затенение AO: выкл / стандарт / высокое
Тесселяция: выкл / стандарт / высокая / оч.высокая

Дополнительные настройки:
Длинные тени: выкл / вкл
Тени высокого разрешения: выкл / вкл
Подгрузка более детализированных текстур во время полета: выкл / вкл
Увеличение расстояния подгрузки более детализированных объектов: max
Длина теней: max


В этой игре определенно есть прирост и от памяти и от кэша. Очень хороший прирост i5 2400 3,80GHz относительно стока 3,20GHz.

_________________________________________________________________________________________________

Mass Effect Andromeda


Разрешение: 1280x720
Сглаживание: откл.
Зернистость: выкл / вкл
Хроматические аберрации: выкл / вкл
Качество текстур: ультра
Рассеянное затенение: выкл / SSAO / HBAO / полное HBAO
Качество постобработки: низкое / среднее / высокое / ультра
Качество текстур: низкое / среднее / высокое / ультра
Качество освещения: низкое / среднее / высокое / ультра
Качество теней: низкое / среднее / высокое / ультра
Качество эффектов: низкое / среднее / высокое / ультра
Качество моделей: низкое / среднее / высокое / ультра
Качество шейдеров: низкое / высокое
Качество ландшафта: низкое / среднее / высокое / ультра
Качество растений: низкое / среднее / высокое / ультра


В этой сцене ни один не раскрыл полностью 780Ti.
_________________________________________________________________________________________________

World Of Tanks 0.9.18
Карта: Перевал

Сглаживание: отк / вкл
Графика: стандартная / улучшенная
Качество текстур: низко / средне / высоко / максимум
Качество освещения: максимум
Качество теней: выключено / средне / высоко / максимум
Трава в снайперском режиме: выкл / вкл
Качество доп. эффектов: выключено / низко / средне / высоко / максимум
Доп.эффекты в снайперском режиме: высоко
Количество растительности: выключено / низко / средне / высоко / максимум
Постобработка: выключено / низко / средне / высоко / максимум
Эффекты из-под гусениц: выкл / вкл
Качество ландшафта: минимум / низко / средне / высоко / максимум
Качество воды: низко / средне / высоко / максимум
Качество декалей: выключено / низко / средне / высоко / максимум
Детализация объектов: низко / средне / высоко / максимум
Детализация деревьев: низко / средне / высоко / максимум
Дальность прорисовки: низко / средне / высоко / максимум
Качество размытия в движении: выключено / низко / средне / высоко
Д инамическое изменение качества эффектов: выкл / вкл
Следы гусениц: выкл / вкл

Вывод: Некоторые обзорщики с Youtube просто отключают HT, делая из I7 «искусственный» i5, но с большим кэшом... и говорят что разницы нет. Но все же в некоторых играх дополнительный кэш дает прирост.

И в целом разгон стокового i5 2400 дает очень сильный прирост, но тогда придется потратится на материнскую плату.

Почти все разработчики знают, что кэш процессора - это такая маленькая, но быстрая память, в которой хранятся данные из недавно посещённых областей памяти - определение краткое и довольно точное. Тем не менее, знание «скучных» подробностей относительно механизмов работы кэша необходимо для понимания факторов влияющих на производительность кода.

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

Habracut - - -

Пример 1: доступ к памяти и производительность

Как вы думаете, насколько второй цикл быстрее первого?
int arr = new int ;

// первый
for (int i = 0; i < arr.Length; i++) arr[i] *= 3;

// второй
for (int i = 0; i < arr.Length; i += 16) arr[i] *= 3;


Первый цикл умножает все значения массива на 3, второй цикл только каждое шестнадцатое значение. Второй цикл совершает только 6% работы первого цикла, но на современных машинах оба цикла выполняются примерно за равное время: 80 мс и 78 мс соответственно (на моей машине).

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

Пример 2: влияние строк кэша

Копнём глубже - попробуем другие значения шага, не только 1 и 16:
for (int i = 0; i < arr.Length; i += K /* шаг */ ) arr[i] *= 3;

Вот время работы этого цикла для различных значений шага K:

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

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

Из-за того, что 16 значений типа int занимают 64 байта, циклы с шагами от 1 до 16 обращаются к одинаковому количеству строк кэша, точнее говоря, ко всем строкам кэша массива. При шаге 32, обращение происходит к каждой второй строке, при шаге 64, к каждой четвёртой.

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

Пример 3: размеры кэшей первого и второго уровня (L1 и L2)

Современные процессоры, как правило, имеют два или три уровня кэшей, обычно их называют L1, L2 и L3. Для того, чтобы узнать размеры кэшей различных уровней, можно воспользоваться утилитой CoreInfo или функцией Windows API GetLogicalProcessorInfo . Оба способа так же предоставляют информацию о размере строки кэша для каждого уровня.

На моей машине CoreInfo сообщает о кэшах данных L1 объёмом по 32 Кбайт, кэшах инструкций L1 объёмом по 32 Кбайт и кэшах данных L2 объёмом по 4 Мбайт. Каждое ядро имеет свои персональные кэши L1, кэши L2 общие для каждой пары ядер:

Logical Processor to Cache Map: *--- Data Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64 *--- Instruction Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64 -*-- Data Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64 -*-- Instruction Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64 **-- Unified Cache 0, Level 2, 4 MB, Assoc 16, LineSize 64 --*- Data Cache 2, Level 1, 32 KB, Assoc 8, LineSize 64 --*- Instruction Cache 2, Level 1, 32 KB, Assoc 8, LineSize 64 ---* Data Cache 3, Level 1, 32 KB, Assoc 8, LineSize 64 ---* Instruction Cache 3, Level 1, 32 KB, Assoc 8, LineSize 64 --** Unified Cache 1, Level 2, 4 MB, Assoc 16, LineSize 64
Проверим эту информацию экспериментально. Для этого, пройдёмся по нашему массиву инкрементируя каждое 16-ое значение - простой способ изменить данные в каждой строке кэша. При достижении конца, возвращаемся к началу. Проверим различные размеры массива, мы должны увидеть падение производительности когда массив перестаёт помещаться в кэши разных уровней.

Код такой:

int steps = 64 * 1024 * 1024; // количество итераций
int lengthMod = arr.Length - 1; // размер массива -- степень двойки

for (int i = 0; i < steps; i++)
{
// x & lengthMod = x % arr.Length, ибо степени двойки
arr[(i * 16) & lengthMod]++;
}


Результаты тестов:

На моей машине заметны падения производительности после 32 Кбайт и 4 Мбайт - это и есть размеры кэшей L1 и L2.

Пример 4: параллелизм инструкций

Теперь давайте взглянем на кое-что другое. По вашему мнению, какой из этих двух циклов выполнится быстрее?
int steps = 256 * 1024 * 1024;
int a = new int ;

// первый
for (int i = 0; i < steps; i++) { a++; a++; }

// второй
for (int i = 0; i < steps; i++) { a++; a++; }


Оказывается, второй цикл выполняется почти в два раза быстрее, по крайней мере, на всех протестированных мной машинах. Почему? Потому, что команды внутри циклов имеют разные зависимости по данным. Команды первого имеют следующую цепочку зависимостей:

Во втором цикле зависимости такие:

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

Пример 5: ассоциативность кэша

Один из ключевых вопросов, на который необходимо дать ответ при проектировании кэша - могут ли данные из определённой области памяти храниться в любых ячейках кэша или только в некоторых из них. Три возможных решения:
  1. Кэш прямого отображения , данные каждой строки кэша в оперативной памяти хранятся только в одной заранее определённой ячейке кэша. Простейший способ вычисления отображения: индекс_строки_в_памяти % количество_ячеек_кэша. Две строки, отображённые на одну и ту же ячейку, не могут находится в кэше одновременно.
  2. N-входовый частично-ассоциативный кэш , каждая строка может храниться в N различных ячейках кэша. Например, в 16-входовом кэше строка может храниться в одной из 16-ти ячеек составляющих группу. Обычно, строки с равными младшими битами индексов разделяют одну группу.
  3. Полностью ассоциативный кэш , любая строка может быть сохранена в любую ячейку кэша. Решение эквивалентно хеш-таблице по своему поведению.
Кэши прямого отображения подвержены конфликтам, например, когда две строки соревнуются за одну ячейку, поочерёдно вытесняя друг-друга из кэша, эффективность очень низка. С другой стороны, полностью ассоциативные кэши, хотя и лишены этого недостатка, очень сложны и дороги в реализации. Частично-ассоциативные кэши - типичный компромисс между сложностью реализации и эффективностью.

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

Так как кэш L2 имеет 65 536 ячеек (4 * 2 20 / 64) и каждая группа состоит из 16 ячеек, всего мы имеем 4 096 групп. Таким образом, младшие 12 битов индекса строки определяют к какой группе относится эта строка (2 12 = 4 096). В результате, строки с адресами кратными 262 144 (4 096 * 64) разделяют одну и ту же группу из 16-ти ячеек и соревнуются за место в ней.

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

public static long UpdateEveryKthByte(byte arr, int K)
{
const int rep = 1024 * 1024; // количество итераций

Stopwatch sw = Stopwatch.StartNew();

int p = 0;
for (int i = 0; i < rep; i++)
{
arr[p]++;

P += K; if (p >= arr.Length) p = 0;
}

Sw.Stop();
return sw.ElapsedMilliseconds;
}


Метод инкрементирует каждый K-ый элемент массива. По достижении конца, начинаем заново. После довольно большого количества итераций (2 20), останавливаемся. Я сделал прогоны для различных размеров массива и значений шага K. Результаты (синий - большое время работы, белый - маленькое):

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

Разберёмся с синими областями:

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

    Некоторые из плохих значений шага - степени двойки: 256 и 512. Для примера рассмотрим шаг 512 и массив в 8 Мбайт. При этом шаге, в массиве имеются 32 участка (8 * 2 20 / 262 144), которые ведут борьбу друг с другом за ячейки в 512-ти группах кэша (262 144 / 512). Участка 32, а ячеек в кэше под каждую группу только 16, поэтому места на всех не хватает.

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

  2. Почему вертикальные линии обрываются на границе в 4 Мбайт? При размере массива в 4 Мбайт или меньше, 16-входовый кэш ведёт себя так же как и полностью ассоциативный, то есть может вместить все данные массива без конфликтов. Имеется не более 16-ти областей ведущих борьбу за одну группу кэша (262 144 * 16 = 4 * 2 20 = 4 Мбайт).
  3. Почему слева вверху находится большой синий треугольник? Потому, что при маленьком шаге и большом массиве кэш не в состоянии уместить все необходимые данные. Степень ассоциативности кэша играет тут второстепенную роль, ограничение связано с размером кэша L2.

    Например, при размере массива в 16 Мбайт и шаге 128, мы обращаемся к каждому 128-му байту, таким образом, модифицируя каждую вторую строку кэша массива. Чтобы сохранить каждую вторую строку в кэше, необходим его объём в 8 Мбайт, но на моей машине есть только 4 Мбайт.

    Даже если бы кэш был полностью ассоциативным, это не позволило бы сохранить в нём 8 Мбайт данных. Заметьте, что в уже рассмотренном примере с шагом 512 и размером массива 8 Мбайт, нам необходим только 1 Мбайт кэша, чтобы сохранить все нужные данные, но это невозможно сделать из-за недостаточной ассоциативности кэша.

  4. Почему левая сторона треугольника постепенно набирает свою интенсивность? Максимум интенсивности приходится на значение шага в 64 байта, что равно размеру строки кэша. Как мы увидели в первом и во втором примере, последовательный доступ к одной и той же строке практически ничего не стоит. Скажем, при шаге в 16 байт, мы имеем четыре обращения к памяти по цене одного.

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

Обнаруженные эффекты сохраняются и при больших значениях параметров:

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

Пример 6: ложное разделение кэша

На многоядерных машинах можно столкнуться с другой проблемой - согласование кэшей. Ядра процессора имеют частично или полностью раздельные кэши. На моей машине кэши L1 раздельны (как и обычно), так же имеются два кэша L2, общие для каждой пары ядер. Детали могут различаться, но в целом современные многоядерные процессоры имеют многоуровневые иерархические кэши. Причём самые быстрые, но и самые маленькие кэши, принадлежат индивидуальным ядрам.

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

Продемонстрируем эту проблему на следующем коде:

private static int s_counter = new int ;

private void UpdateCounter(int position)
{
for (int j = 0; j < 100000000; j++)
{
s_counter = s_counter + 3;
}
}


Если на своей четырёхядерной машине я вызову этот метод с параметрами 0, 1, 2, 3 одновременно из четырёх потоков, то время работы составит 4.3 секунды . Но если я вызову метод с параметрами 16, 32, 48, 64, то время работы составит только 0.28 секунды .

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

Пример 7: сложность железа

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

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

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

Вот другой пример странных причуд железа:

private static int A, B, C, D, E, F, G;

private static void Weirdness()
{
for (int i = 0; i < 200000000; i++)
{
<какой-то код>
}
}


Если вместо <какой-то код> подставить три разных варианта, можно получить следующие результаты:

Инкрементирование полей A, B, C, D занимает больше времени, чем инкрементирование полей A, C, E, G. Что ещё страннее, инкрементирование полей A и C занимает больше времени, чем полей A, C и E, G. Не знаю точно каковы причины этого, но возможно они связаны с банками памяти (да-да, с обычными трёхлитровыми сберегательными банками памяти, а не то, что вы подумали ). Имеющих соображения на этот счёт, прошу высказываться в комментариях.

У меня на машине вышеописанного не наблюдается, тем не менее, иногда бывают аномально плохие результаты - скорее всего, планировщик задач вносит свои «коррективы».

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

Заключение

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

Первым процессором, который производился с кэшем L2, стал Pentium Pro в 1995 году. У него было 256 или 512 кбайт кэша второго уровня на кристалле, что давало существенное преимущество над обычными процессорами Pentium, чей кэш располагался на материнской плате. С появлением Pentium II в модуле Slot 1 выделенная кэш-память "поселилась" рядом с процессором. Но только у второго поколения Pentium III для Socket 370 кэш-память перешла на кристалл процессора. Так продолжается и по сей день, но есть процессоры с небольшим количеством кэша, а есть с большим. Стоит ли тратить деньги на модель с большим кэшем? В прошлом дополнительная кэш-память не всегда ощутимо влияла на производительность.

Хотя всегда можно найти измеряемые различия между двумя процессорами с разными размерами кэша, для экономии средств вполне можно было покупать процессоры с меньшим кэшем. Но ни один процессор до появления Core 2 Duo не был доступен с тремя разными вариантами кэша.

Pentium 4 в своём первом поколении (Willamette, 180 нм) оснащался 256 кбайт кэша, а в более успешном втором поколении (Northwood, 130 нм) - уже 512 кбайт кэша. В то время дешёвые процессоры Celeron с меньшим кэшем производились на тех же вычислительных ядрах. Celeron относятся к первому поколению продуктов с одной технологической базой для high-end и дешёвых моделей, различающихся только доступным размером кэша и частотами FSB/ядра. Позднее была добавлена и разница в функциях, чтобы заметнее разделить сегменты рынка.

С выпуском 90-нм ядра Prescott объём кэша L2 вырос до 1 Мбайт, и этот процессор стал основой линейки настольных процессоров Intel до появления 2-Мбайт 65-нм Cedar Mill. Intel даже использовала два таких ядра для создания процессоров Pentium D 900 второго поколения. Впрочем, более быстрые тактовые частоты и больший объём кэша даже тогда не значили очень много. Сегодня ситуация изменилась: лучшая производительность Core 2 Duo (Conroe, 65 нм) и меньшее энергопотребление немало обязаны размеру кэша.

AMD весьма сдержанно относилась к увеличению объёма кэша. Скорее всего, это связано с площадью кристалла (бюджетом транзисторов), поскольку количество 65-нм процессоров не может удовлетворить спрос на рынке, а у менее выгодных 90-нм моделей этот вопрос стоит ещё острее. У Intel, с другой стороны, есть преимущество в виде производства всех массовых процессоров по 65-нм техпроцессу, да и ёмкость кэша L2 будет ещё расти. Например, следующее поколение Core 2 на 45-нм ядре Penryn будет оснащаться до 6 Мбайт кэша L2. Можно ли рассматривать это как маркетинговый шаг, или увеличение ёмкости L2 действительно даст прирост производительности? Давайте посмотрим.

Большой кэш L2: маркетинг или рост производительности?

Кэши процессора играют вполне определённую роль: они уменьшают количество обращений к памяти, буферизуя часто используемые данные. Сегодня ёмкость ОЗУ составляет от 512 Мбайт до 4 Гбайт, а объём кэша - от 256 кбайт до 8 Мбайт, в зависимости от модели. Впрочем, даже небольшого объёма кэша в 256 или 512 кбайт достаточно, чтобы обеспечить высокую производительность, которую сегодня воспринимают само собой разумеющейся.

Есть разные способы организации иерархии кэша. В большинстве современных компьютеров установлены процессоры с небольшим кэшем первого уровня (L1, до 128 кбайт), который обычно разделяется на кэш данных и кэш инструкций. Кэш L2 большего размера обычно используется для хранения данных, он является общим для двух процессорных ядер Core 2 Duo, хотя Athlon 64 X2 или Pentium D имеют раздельные кэши на ядро. Кэш L2 может работать эксклюзивно или инклюзивно, то есть он может либо хранить копию содержимого кэша L1, либо нет. AMD вскоре представит процессоры с третьим уровнем кэша, который будет общим для четырёх ядер в процессорах AMD Phenom. То же самое ожидается и для архитектуры Nehalem, которую Intel представит в 2008 году на замену текущим Core 2.

Кэш L1 всегда был в составе процессора, но поначалу кэш L2 устанавливался на материнские платы, как было в случае многих компьютеров 486DX и Pentium. Для кэш-памяти первого уровня использовались простые чипы статической памяти (SRAM, Static RAM). Они вскоре были заменены конвейерным пакетным кэшем (pipelined burst cache) у процессоров Pentium, пока не появилась возможность устанавливать кэш на кристалл. Pentium Pro на 150 - 200 МГц стал первым процессором, содержащим 256 кбайт кэш-памяти L2 на кристалле, побив рекорд по размеру керамической упаковки для настольных ПК и рабочих станций. Pentium III для Socket 370, работающий на частотах от 500 МГц до 1,13 ГГц, стал первым процессором с 256 кбайт кэш-памяти на кристалле L2, что давало преимущество по снижению задержек, поскольку кэш работает на частоте CPU.

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

Однако кэш-память влияет не только на производительность. Она стала мощным инструментом, позволяющим создавать разные модели процессоров для low-end, массового и high-end сегментов, поскольку производитель может гибко отбирать процессоры по отбраковке и тактовым частотам. Если на кристалле нет дефектов, то можно включить весь кэш L2, да и частоты получаются высокие. Если же желаемых тактовых частот достичь не удастся, то кристалл может стать моделью начального уровня в high-end линейке, например, Core 2 Duo 6000 с 4 Мбайт кэша и низкими частотами. Если дефекты присутствуют в кэше L2, то производитель имеет возможность отключить его часть и создать модель начального уровня с меньшим объёмом кэша, например, Core 2 Duo E4000 с 2 Мбайт кэша L2 или даже Pentium Dual Core всего с 1 Мбайт кэша. Всё это действительно так, но вопрос заключается в следующем: насколько различие в объёме кэша влияет на производительность?

Варианты Core 2 Duo

Intel выпустила на рынок большой ассортимент настольных процессоров. Сегодня ещё можно найти Pentium 4 и Pentium D, но большинство моделей построено на микро-архитектуре Core. Мы не рекомендуем брать процессоры Pentium 4 или Pentium D, хотя их тактовые частоты до 3,8 ГГц могут выглядеть привлекательно. Но любой процессор Core 2 на частоте 2,2 ГГц и выше способен победить даже самые быстрые модели Pentium D (собственно, как и Athlon 64 X2), поскольку Core 2 даёт намного лучшую производительность на такт .

Благодаря меньшим тактовым частотам процессоры Core 2 более эффективны по энергопотреблению. Если топовые модели Pentium D 800 "съедают" до 130 Вт, то лишь Core 2 Extreme с четырьмя ядрами преодолевает порог 100 Вт. Все двуядерные процессоры потребляют не больше 65 Вт. Кроме того, энергопотребление в режиме бездействия процессоров Core 2 Duo ещё ниже, поскольку рабочая частота в режиме бездействия меньше (максимум 1,2 ГГц для Core 2 Duo/Quad против 2,8 ГГц для Pentium D/4). На снижение энергопотребления повлиял улучшенный дизайн транзисторов с уменьшенными токами утечки.

Сегодня доступны модели E и X. Модели E предназначены для массового рынка, а X относятся к классу Extreme Edition. Q обозначает четыре ядра, которые Intel создаёт, размещая два двуядерных кристалла в одной физической упаковке. Процессоры E6000 оснащены 4 Мбайт кэша L2, если их модельный номер выше E6400 или заканчивается на 20 (например, E6320). Модели, заканчивающиеся на 00 (например, E6600) работают с FSB 266 МГц (FSB1066), а модели, заканчивающиеся на 50 (E6750), работают с FSB 333 МГц (FSB1333). Последняя требует чипсета P35 или X38 и даёт чуть более высокую производительность. E4000 работает с FSB 200 МГц (FSB800) и имеет всего 2 Мбайт кэша L2. Версии с 1 Мбайт кэша продаются как Pentium Dual Core E2140, E2160 и E2180 с частотами от 1,6 до 2,0 ГГц. Кроме названия и некоторых функций, которые Intel отключает у дешёвых процессоров, упомянутые модели Pentium Dual Cores идентичны Core 2 Duo.

Характеристики процессоровCore 2 Duo
Номер 65-нм процессора Кэш Тактовая частота FSB Технология виртуализации Технология Trusted Execution
E6850 4 Мбайт L2 3 ГГц 333 МГц X X
E6750 4 Мбайт L2 2,66 ГГц 333 МГц X X
E6700 4 Мбайт L2 2,66 ГГц 266 МГц X
E6600 4 Мбайт L2 2,40 ГГц 266 МГц X
E6550 4 Мбайт L2 2,33 ГГц 333 МГц X X
E6540 4 Мбайт L2 2,33 ГГц 333 МГц X
E6420 4 Мбайт L2 2,13 ГГц 266 МГц X
E6400 2 Мбайт L2 2,13 ГГц 266 МГц X
E6320 4 Мбайт L2 1,86 ГГц 266 МГц X
E6300 2 Мбайт L2 1,86 ГГц 266 МГц X
E4600 2 Мбайт L2 2,40 ГГц 200 МГц
E4500 2 Мбайт L2 2,20 ГГц 200 МГц
E4400 2 Мбайт L2 2 ГГц 200 МГц
E4300 2 Мбайт L2 1,80 ГГц 200 МГц


Платформа
CPU I Intel Pentium Dual Core E2160 (65 нм; 1 800 МГц, 1 Мбайт кэша L2) на частоте 2,4 ГГц (266 МГц x9)
CPU II Intel Core 2 Duo E4400 (65 нм; 2 000 МГц, 2 Мбайт кэша L2) на частоте 2,4 ГГц (266 МГц x9)
CPU III Intel Core 2 Duo X6800 (65 нм; 3 000 МГц, 4 Мбайт кэша L2) на частоте 2,4 ГГц (266 МГц x9)
Материнская плата ASUS Blitz Formula, Rev: 1.0
Чипсет: Intel P35, BIOS 1101
Память Corsair CM2X1024-888C4D, 2x 1024 Мбайт DDR2-800 (CL 4-4-4-12 2T)
Жёсткий диск Western Digital Raptor WD1500ADFD, 150 Гбайт, 10 000 об/мин, кэш 16 Мбайт, SATA/150
DVD-ROM Samsung SH-S183
Видеокарта Zotac GeForce 8800 GTS, GPU: GeForce 8800 GTS (500 МГц), память: 320 Мбайт GDDR3 (1 600 Мгц)
Звуковая карта Встроенная
Блок питания Enermax EG565P-VE, ATX 2.01, 510 Вт
Системное ПО и драйверы
ОС Windows XP Professional 5.10.2600, Service Pack 2
Версия DirectX 9.0c (4.09.0000.0904)
Драйверы платформы Intel Version 8.3.1013
Графический драйвер nVidia Forceware 162.18

Тесты и настройки

3D-игры
Call Of Duty 2 Version: 1.3 Retail
Video Mode: 1280x960
Anti Aliasing: off
Graphics Card: medium
Timedemo demo2
Prey Version: 1.3
Video Mode: 1280x1024
Video Quality: game default
Vsync = off
Benchmark: THG-Demo
Quake 4 Version: 1.2 (Dual-Core Patch)
Video Mode: 1280x1024
Video Quality: high
THG Timedemo waste.map
timedemo demo8.demo 1 (1 = load textures)
Аудио
Lame MP3 Version 3.98 Beta 5
Audio CD "Terminator II SE", 53 min
wave to mp3
160 kbps
Видео
TMPEG 3.0 Express Version: 3.0.4.24 (no Audio)
fist 5 Minutes DVD Terminator 2 SE (704x576) 16:9
Multithreading by rendering
DivX 6.7 Version: 6.6 (4 Logical CPUs)
Profile: High Definition Profile
1-pass, 3000 kbit/s
Encoding mode: Insane Quality
Enhanced multithreading
no Audio
XviD 1.1.3 Version: 1.1.3
Target quantizer: 1.00
Mainconcept H.264 v2 Version 2.1
260 MB MPEG-2 source (1920x1080) 16:9
Codec: H.264
Mode: NTSC
Audio: AAC
Profile: High
Stream: Program
Приложения
WinRAR Version 3.70
(303 MB, 47 Files, 2 Folders)
Compression = Best
Dictionary = 4096 kB
Autodesk 3D Studio Max Version: 8.0
Characters "Dragon_Charater_rig"
rendering HTDV 1920x1080
Cinebench Version: R10
1 CPU, x CPU run
PCMark05 Pro Version: 1.2.0
CPU and Memory Tests
Windows Media Player 10.00.00.3646
Windows Media Encoder 9.00.00.2980




Заключение

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

Ответ прост: размер кэша очень важен для современных процессоров с микро-архитектурой Core 2 Duo. Мы использовали 4-Мбайт Core 2 Extreme X6800, 2-Мбайт Core 2 Duo E4400 и Pentium Dual Core E2160, который является процессором Core 2 Duo с кэшем L2 всего 1 Мбайт. Все процессоры работали на одинаковой системной шине 266 МГц и с множителем 9x, чтобы частота составила 2 400 МГц. Единственная разница заключается в размере кэша, поскольку все современные двуядерные процессоры, за исключением старого Pentium D, производятся из одинаковых кристаллов. Чем станет ядро, Core 2 Extreme Edition или Pentium Dual Core, определяется выходом годных кристаллов (дефектами) или спросом рынка.

Если вы сравните результаты 3D-шутеров Prey и Quake 4, являющих типичными игровыми приложениями, разница в производительности между 1 и 4 Мбайт составляет примерно один шаг по частоте. То же самое касается тестов кодирования видео для кодеков DivX 6.6 и XviD 1.1.2, а также архиватора WinRAR 3.7. Однако, такие интенсивно нагружающие CPU приложения, как 3DStudio Max 8, Lame MP3 Encoder или H.264 Encoder V2 от MainConcept не слишком сильно выигрывают от увеличения размера кэша.

Впрочем, подход Intel, а именно, использование всего доступного бюджета транзисторов, который увеличился при переходе с 65-нм техпроцесса на 45-нм, имеет для микро-архитектуры Core 2 Duo определённую значимость. Кэш L2 у этих процессоров работает очень эффективно, особенно, если учесть, что он общий для двух ядер. Поэтому кэш нивелирует влияние разных частот памяти и предотвращает "узкое место" в виде FSB. И делает он это замечательно, поскольку тесты наглядно показывают, что производительность процессора с одним мегабайтом кэш-памяти невысокая.

С этой точки зрения увеличение размера кэша L2 с 4 Мбайт до, максимум, 6 Мбайт у грядущих 45-нм двуядерных процессоров Penryn (линейка Core 2 Duo E8000) имеет смысл. Уменьшение техпроцесса с 65 до 45 нм позволяет Intel увеличить бюджет транзисторов, и благодаря увеличению объёма кэша мы вновь получим рост производительности. Впрочем, Intel получит выгоду из-за разных вариантов процессоров с 6, 4, 2 или даже 1 Мбайт кэша L2. Благодаря нескольким вариантам Intel может использовать большее число кристаллов с пластины, несмотря на наличие случайных дефектов, которые в противном случае приводили бы к попаданию кристалла в мусорную корзину. Большой размер кэша, как видим, важен не только для производительности, но и для прибыли Intel.

← Вернуться

×
Вступай в сообщество «vityazevo-pizz-and-roll.ru»!
ВКонтакте:
Я уже подписан на сообщество «vityazevo-pizz-and-roll.ru»