Исследование эффективности совместного использования общего и разделенного L2-кэша современных двухъядерных процессоров


Известно, что достаточно существенным микроархитектурным отличием современных двухъядерных процессоров Intel, основанных на усовершенствованной микроархитектуре «P6+» и новой микроархитектуре Intel Core — процессоров семейства Intel Core Duo/Core Solo и Intel Core 2, по сравнению с решениями конкурентов — двухъядерными процессорами семейства AMD Athlon 64 X2, является наличие общего для обоих ядер L2-кэша, динамически распределяемого по объему между индивидуальными ядрами процессора в зависимости от их потребностей в кэшируемом пространстве памяти. В то же время, двухъядерные процессоры AMD характеризуются наличием индивидуального L2-кэша фиксированного размера у каждого из ядер процессора.

Можно предположить, что «объединенная» архитектура L2-кэша в ряде случаев может оказаться менее выигрышной по сравнению с традиционной архитектурой «выделенных» L2-кэшей для каждого из ядер (при условии равенства их суммарных объемов — например, 2 МБ объединенного L2-кэша против 1+1 МБ выделенного) вследствие использования общей шины данных и общей системы запросов к L2-кэшу обоими ядрами. Очевидно, что, если это действительно так, наиболее эффективным способом выявить подобный недостаток будет создание ситуации максимальной нагрузки на L2-кэш процессора (со стороны обоих ядер), которую намного проще выявить с помощью специального тестового приложения, нежели реальных задач, требовательность которых к L2-кэшу процессора напрямую неизвестна.

Поэтому, чтобы проверить сделанное выше предположение и вообще сравнить эффективность совместного обращения двух ядер процессора к L2-кэшу в случае изолированного (AMD) и объединенного (Intel) L2-кэша, мы именно так и поступили. Для этого мы воспользовались недавно разработанной вспомогательной утилитой RightMark Mutli-Threaded Memory Test, входящей в состав последней официальной версии тестового пакета RightMark Memory Analyzer 3.70.

Напомним, что идея этого теста следующая: создаются два потока, каждый из которых по умолчанию жестко «привязан» к своему ядру (для предотвращения «перекидывания» этих потоков с ядра на ядро операционной системой). Каждый из потоков выделяет себе собственное пространство памяти заданного объема и способен осуществлять следующие операции: чтение, запись, чтение с программной предвыборкой (software prefetch, дистанция предвыборки может варьироваться пользователем) и запись методом прямого сохранения (non-temporal store). Суммарный объем данных, подлежащих чтению и записи, задается пользователем отдельно для каждого из потоков. В программе предусмотрена возможность запуска и остановки каждого из потоков в любой момент времени, а также синхронного запуска и синхронной остановки обоих потоков. Результатом теста, выдаваемым непосредственно в процессе работы, является моментальная (усредненная по секундному интервалу) и средняя (усредненная по всему времени работы теста) пропускная способность, выраженная в МБ/с. В зависимости от выбранного размера данных, приложение позволяет исследовать обращение одного или двух ядер процессора, как к его кэш-памяти, так и к оперативной памяти. При этом очевидно, что для исследования L2-кэша процессора разумно использовать первые два реализованных варианта доступа (чтение и запись), тогда как два последних варианта (чтение с программной предвыборкой и запись методом прямого сохранения данных) могут быть полезны для исследования характеристик подсистемы памяти.

Конфигурации тестовых стендов

Тестовый стенд №1

  • Процессор: AMD Athlon 64 X2 3800+, 2.0 ГГц (Manchester rev. E6, CPUID 20F32h, 512+512KB L2)
  • Материнская плата: ASUS A8N-E, версия BIOS 1013 от 04.07.2006
  • Оперативная память: 2 x 1ГБ Corsair XMS4400PRO, DDR-400, тайминги 2-3-2-5

Тестовый стенд №2

  • Процессор: Intel Core 2 Extreme X6800 (Conroe rev. B1, CPUID 6F5h, 4 MB L2)
  • Материнская плата: Intel D975XBX rev. 304, версия BIOS BX97510J.86A.1209.2006.0601.1340 от 01.06.2006
  • Оперативная память: 2 x 1ГБ Corsair XMS2-6400, DDR2-800, тайминги 5-5-5-15

Изолированный L2-кэш, процессор AMD Athlon 64 X2 3800+

Разработка и отладка приложения RightMark Multi-Threaded Memory Test проводились на процессоре AMD Athlon 64 X2 3800+ (стенд №1) с 512-КБ раздельным L2-кэшем для каждого из ядер, поэтому логично начать изучение поведения именно этого типа L2-кэша на этом процессоре.

Таблица 1. AMD Athlon 64 X2, данные в L2-кэше

Тип обращения Пропускная способность (ГБ/с), поток 1 Пропускная способность (ГБ/с), поток 2 Суммарная пропускная способность (ГБ/с)
Чтение 512 КБ 9.67
Запись 512 КБ 9.34
Чтение 512 КБ +
Чтение 512 КБ
9.66
(99.9%)
9.66
(99.9%)
Запись 512 КБ +
Запись 512 КБ
9.34
(100.0%)
9.33
(99.9%)
Чтение 512 КБ +
Запись 512 КБ
9.66
(99.9%)
9.33
(99.9%)

Результаты исследований с 512-КБ размером блока (максимальным объемом L2-кэша) приведены в таблице 1. С достаточно очевидным подходом, тестирование проводилось в пяти режимах: чтение одним потоком, запись одним потоком, чтение двумя потоками, запись двумя потоками и, наконец, одновременное чтение и запись двумя потоками. В таблице 1 отсутствуют данные о суммарной пропускной способности общего интерфейса данных по той причине, что таковой в данном случае отсутствует — каждый из L2-кэшей ядер имеет собственный, независимый интерфейс.

Заметим, что абсолютные показатели пропускной способности (в ГБ/с) в рамках нашего исследования не столь важны, поскольку зависят от конкретного экземпляра процессора (прежде всего, его тактовой частоты). Нам важны относительные показатели, наблюдаемые при совместном обращении обоих ядер к данным, рассчитанные по отношению к соответствующему одиночному обращению. Легко заметить, что эти относительные показатели во всех трех случаях совместного обращения на данном процессоре (AMD Athlon 64 X2) при выбранном объеме данных (512 КБ) в пределах погрешности измерений составляет 100%. Ничего удивительного здесь нет — это лишь подтверждает полную независимость L2-кэшей ядер процессора.

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

Таблица 2. AMD Athlon 64 X2, данные в оперативной памяти

Тип обращения Пропускная способность, поток 1 (ГБ/с) Пропускная способность, поток 2 (ГБ/с) Суммарная пропускная способность (ГБ/с)
Чтение 32 МБ 3.28
Запись 32 МБ 2.23
Чтение 64 МБ 3.28
Запись 64 МБ 2.23
Чтение 32 МБ +
Чтение 32 МБ
2.50
(76.2%)
2.50
(76.2%)
5.00
(152.4%)
Запись 32 МБ +
Запись 32 МБ
1.14
(51.1%)
1.14
(51.1%)
2.28
(102.2%)
Чтение 32 МБ +
Запись 32 МБ
1.56
(47.6%)
1.54
(69.1%)
3.10
(112.5%)

В данном случае (см. таблицу 2), общее количество измерений увеличено до семи в связи с увеличением количества «опорных» однопоточных измерений — первые два из них проводились с 32-МБ размером блока данных, а два остальных — с 64-МБ блоком данных. Связано это с тем, что при совместном обращении к общей шине данных общий объем оперируемых данных возрастает вдвое. Для получения относительных величин для каждого из ядер (так сказать, фактора замедления) индивидуальные абсолютные величины необходимо сравнивать с результатами однопоточных обращений в аналогичных условиях (32-МБ блок данных), тогда как для относительной оценки суммарной пропускной способности интерфейса его результат необходимо сравнивать с однопоточным обращением ко всему (удвоенному) объему данных (64-МБ блок). Тем не менее, как бы там ни было, в рассматриваемом случае результаты однопоточного чтения/записи 32-МБ и 64-МБ блоков данных оказались практически идентичными.

Совместное чтение данных из разных областей памяти (см. табл. 2) приводит к некоторому замедлению пропускной способности на одно ядро (76.2% по сравнению с однопоточным доступом), тем не менее, суммарная пропускная способность шины памяти при одновременном доступе двух ядер достигает 152.4% в сравнении с однопоточным доступом.

Совместная запись данных сопровождается гораздо более заметным замедлением скорости доступа к памяти для каждого из ядер — соответствующие относительные величины снижаются до 51.1% по сравнению с однопоточной записью. Вместе с тем, суммарная пропускная способность на запись вновь оказывается не хуже, и даже несколько выше по сравнению с однопоточным обращением (102.2%).

Наиболее интересный случай — одновременное чтение данных из памяти первым ядром и запись данных в память вторым ядром. Он интересен тем, что результирующая пропускная способность памяти на чтение и на запись здесь практически выравниваются (до уровня ~1.55 ГБ/с). Поскольку однопоточное чтение данных характеризуется заметно более высокой пропускной способностью памяти (3.28 ГБ/с) по сравнению с однопоточной записью (2.23 ГБ/с), замедление доступа к памяти оказывается гораздо более выраженным для первого ядра, читающего данные из памяти (снижение пропускной способности до 47.6%), по сравнению со вторым ядром, записывающим данные в память (снижение до 69.1%). Общая пропускная способность в этом режиме составляет 3.1 ГБ/с, что, в пересчете на «усредненную» операцию чтения-записи (3.28 / 2 + 2.23 / 2 = 2.755 ГБ/с) составляет 112.5%, т.е. даже в этом режиме совместная утилизация шины памяти по-прежнему оказывается более эффективной по сравнению с однопоточным обращением.

Объединенный L2-кэш, процессор Intel Core 2 Extreme X6800

Второй процессор, оказавшийся в нашем распоряжении и подлежащий рассмотрению, — Intel Core 2 Extreme X6800 (стенд №2), обладающий сравнительно большим, 4-МБ объединенным L2-кэшем данных. Попытаемся оценить эффективность совместного обращения обоих ядер к данным в условиях достатка L2-кэша (общий объем данных — не более 4 МБ), его частичного недостатка (объем данных 5 МБ, варьируемое соотношение объемов на каждое ядро), а также при обращении к данным, содержащимся в оперативной памяти (размер блока данных 32 МБ).

Таблица 3. Intel Core 2 Extreme, данные в L2-кэше

Тип обращения Пропускная способность, поток 1 (ГБ/с) Пропускная способность, поток 2 (ГБ/с) Суммарная пропускная способность (ГБ/с)
Чтение 2 МБ 23.09
Запись 2 МБ 19.05
Чтение 4 МБ 22.11
Запись 4 МБ 17.65
Чтение 2 МБ +
Чтение 2 МБ
19.14
(82.9%)
19.28
(83.5%)
38.42
(173.8%)
Запись 2 МБ +
Запись 2 МБ
10.94
(57.4%)
11.36
(59.6%)
22.30
(126.3%)
Чтение 2 МБ +
Запись 2 МБ
19.91
(86.2%)
12.17
(63.9%)
32.08
(161.4%)

Исследование поведения общего интерфейса объединенного L2-кэша ядер процессора Intel Core 2 Extreme, по существу, аналогично проведенному выше исследованию общего интерфейса данных интегрированного контроллера памяти процессора AMD Athlon 64 X2.

В таблице 3 представлены результаты, полученные в условиях максимальной утилизации L2-кэша процессора, но не выхода за его пределы (суммарный объем данных — 4 МБ, по 2 МБ на каждое ядро). Одновременное чтение данных из L2-кэша приводит к некоторому снижению его пропускной способности, «достающейся» каждому из ядер, но нельзя сказать, что очень значительному (до 82.9% от первоначального уровня, соответствующего одиночному обращению), особенно если учесть, насколько высоки абсолютные показатели пропускной способности L2-кэша даже в этих условиях (порядка 19 ГБ/с на ядро). Вместе с этим, суммарная пропускная способность L2-кэша при таком обращении возрастает значительно и составляет 173.8% по сравнению с «одноядерным» доступом к 4-МБ блоку данных.

Более заметно снижение эффективности L2-кэша в случае совместной записи данных — в этом случае, величины пропускной способности снижаются в среднем до 58% относительно записи 2-МБ блока данных одним ядром процессора. Тем не менее, суммарная пропускная способность на запись также оказывается в 1.26 раз выше по сравнению с записью того же объема данных в L2-кэш лишь одним ядром.

Наиболее «жесткий» режим доступа к общему L2-кэшу представляет собой одновременное чтение и запись данных. Как видно из данных таблицы 3, объединенный L2-кэш процессора Intel Core 2 Extreme справляется с этой задачей весьма эффективно — пропускная способность на чтение снижается лишь до 86.2% от номинала, пропускная способность на запись — до 63.9% (т.е. остается даже выше, чем при одновременной записи данных двумя потоками). Суммарная пропускная способность интерфейса L2-кэша, пересчитанная относительно одной «усредненной» операции чтения-записи, составляет 161.4%.

Таблица 4. Intel Core 2 Extreme, данные в оперативной памяти

Тип обращения Пропускная способность, поток 1 (ГБ/с) Пропускная способность, поток 2 (ГБ/с) Суммарная пропускная способность (ГБ/с)
Чтение 32 МБ 6.48
Запись 32 МБ 1.64
Чтение 64 МБ 6.48
Запись 64 МБ 1.64
Чтение 32 МБ +
Чтение 32 МБ
3.56
(54.9%)
3.59
(55.4%)
7.15
(110.3%)
Запись 32 МБ +
Запись 32 МБ
1.04
(63.4%)
1.07
(65.2%)
2.11
(128.7%)
Чтение 32 МБ +
Запись 32 МБ
2.65
(40.9%)
1.48
(90.2%)
4.13
(101.7%)

Рассмотрим теперь вариант совместного доступа исключительно к оперативной памяти посредством ее контроллера, расположенного в северном мосту чипсета, выбрав сравнительно большой размер блока данных (32-64 МБ).

Совместное обращение двух ядер к оперативной памяти по общей системной шине приводит к вполне ощутимому снижению ее пропускной способности на одно ядро — до уровня примерно 55% относительно одноядерного обращения (см. табл. 4). Заметим, что и в этом случае пропускная способность памяти распределяется равномерно между ядрами, а ее общая величина составляет 110% от номинальной величины, полученной при одноядерном обращении, т.е. общий прирост оказывается весьма незначительным.

Что интересно, более высокие результаты наблюдаются при записи данных в память — в этом случае, пропускная способность на одно ядро снижается до уровня примерно 63-65%, а суммарная пропускная способность интерфейса, соответственно, достигает уровня 129% относительно записи данных одним ядром.

При одновременном чтении и записи данных наблюдается несколько иная картина по сравнению с той, которая наблюдалась выше на процессоре AMD Athlon 64 X2. А именно, выравнивания показателей пропускной способности на чтение и на запись в данном случае не наблюдается, хотя снижение пропускной способности на чтение по-прежнему оказывается более выраженным (до уровня 40.9%) по сравнению со снижением пропускной способности на запись (до 90.2% от номинала).

Напоследок, оценим наиболее интересный режим работы объединенного L2-кэша процессоров семейства Intel Core 2, который можно назвать конкуренцией ядер за этот ресурс в условиях его частичной нехватки. Исследование в таком режиме ставит своей целью получение ответов на два вопроса: насколько сильно снижается пропускная способность при совместном доступе двух ядер к L2-кэшу в условиях его частичного «исчерпывания», и насколько эффективно распределяется объем общего L2-кэша между индивидуальными ядрами в зависимости от их реальных потребностей в нем? Чтобы ответить на оба эти вопроса, недостаточно провести лишь одно измерение в условиях равного обращения обоих потоков (например, когда каждый поток требует под свои нужды 2.5 МБ L2-кэша), как мы делали выше. Для этого необходимо провести серию измерений, в каждом из которых общий объем данных остается одинаковым (например, 5 МБ), а доля этого объема, приходящаяся на одно из ядер, постепенно возрастает.


Рис.1. Intel Core 2 Extreme, пропускная способность на чтение, объем данных 5 МБ

Результат такого эксперимента при одновременном чтении данных представлен графически на рисунке 1. Кривая пропускной способности на чтение вторым ядром («Core1 Read»), фактически, представляет собой инвертированную кривую пропускной способности на чтение первым ядром («Core0 Read»), тогда как кривая общей пропускной способности («Full Read») отражает сумму значений пропускной способности первого и второго ядер. Таким образом, эффективность распределения L2-кэша между ядрами процессора и кэширования данных в условиях этого эксперимента легко отследить по любой из этих кривых — например, по кривой пропускной способности на чтение первым ядром («Core0 Read»). Она остается на уровне, типичном для L2-кэша рассматриваемого процессора при объеме данных, приходящихся на первое ядро, порядка 1.0-1.25 МБ. При достижении объема в 1.5 МБ пропускная способность резко снижается, после чего остается на минимальном уровне вплоть до объема в 3.5 МБ — при котором, соответственно, на второе ядро процессора приходится 1.5 МБ. По мере дальнейшего увеличения объема данных, считываемых первым ядром она возрастает до значений, типичных для пропускной способности оперативной памяти.


Рис.2. Intel Core 2 Extreme, пропускная способность на запись, объем данных 5 МБ

Практически аналогичные кривые, с точностью до меньших абсолютных значений пропускной способности, наблюдаются и в случае совместной записи данных общим объемом 5 МБ (рис. 2).


Рис.3. Intel Core 2 Extreme, пропускная способность на чтение+запись, объем данных 5 МБ

Наконец, не является исключением и случай одновременного чтения данных одним ядром и записи данных другим ядром процессора (рис. 3). Характерная особенность этого случая заключается лишь в некоторой несимметричности кривых по оси ординат, связанной с различиями в пропускной способности L2-кэша и оперативной памяти на чтение и на запись данных.

Таким образом, объединенный 4-МБ L2-кэш данных процессоров семейства Intel Core 2 в условиях конкуренции за этот ресурс со стороны двух ядер при любом типе обращения (только чтение, только запись, или одновременное чтение и запись) способен эффективно кэшировать данные, объем которых не превышает всего 1.25 МБ, т.е. примерно четверть объема L2-кэша (!). В этих условиях (когда на одно из ядер приходится указанный объем данных, а остальная, большая часть данных запрашивается вторым ядром) наблюдается максимальная эффективность утилизации как шины данных L2-кэша одним из ядер, так и шины данных оперативной памяти вторым ядром, в результате чего в этой области наблюдается максимум суммарной пропускной способности. В случае же примерно равного распределения объема данных, не помещающихся в L2-кэш, между ядрами процессора, пропускная способность, приходящаяся на каждое из ядер, оказывается ниже даже пропускной способности оперативной памяти при однопоточном обращении. Таким образом, эффективность кэширования данных в этой «конфликтной» области оказывается минимальной — можно сказать, что кэширование данных и вовсе отсутствует.

Выявленный недостаток присущ исключительно архитектуре объединенного L2-кэша, по крайней мере — ее текущей реализации в процессорах семейства Intel Core 2. Идеализированная картина обращения двух потоков к данным суммарным объемом 5 МБ либо при наличии выделенного L2-кэша объемом 2 МБ на каждое ядро, либо при более эффективном распределении общего 4-МБ L2-кэша могла бы выглядеть так, как представлено на рисунке 4.


Рис.4. Идеализированный процессор с 2+2 МБ объемом L2-кэша, пропускная способность на чтение, объем данных 5 МБ

В этом идеальном случае «проблемная область» сведена к минимуму — собственно, ее размер составляет 1 МБ, т.е. тот самый объем данных, который не помещается в L2-кэш процессора. Минимальная эффективность L2-кэша здесь обнаруживается лишь при условии, что оба ядра процессора оперируют с данными, объем которых превышает 2 МБ (либо половину объема объединенного кэша, либо объем индивидуального кэша). Однако при одновременном обращении первым ядром, скажем, к 2-МБ блоку данных и вторым ядром к 3-МБ блоку данных первое ядро будет иметь скорость обмена с данными, равную пропускной способности L2-кэша, тогда как второе ядро выйдет за его пределы и ему заслуженно «достанется» скорость обмена, приближенная к пропускной способности оперативной памяти. В то же время, как можно убедиться по графику, представленному на рис. 1, в текущей реализации объединенного L2-кэша в процессорах семейства Intel Core 2 расклад оказывается совсем иной: и первое, и второе ядро получат вполне посредственную, примерно равную скорость обмена с данными, даже меньшую по сравнению с  пропускной способностью оперативной памяти.

Заключение

Проведенные исследования показали полную независимость изолированных L2-кэшей ядер процессора AMD Athlon 64 X2. Снижение пропускной способности L2-кэша при совместном доступе к данным обоими ядрами у этого процессора отсутствует.

Объединенный L2-кэш процессора Intel Core 2 Extreme при совместном доступе в условиях достатка L2-кэша для нужд обоих ядер снижает свою пропускную способность в пересчете на одно ядро до уровня 57-83% от первоначальной, в зависимости от типа операции (наибольшее снижение наблюдается при операциях записи, наименьшее — при чтении данных). Хотя такое снижение может показаться довольно существенным, абсолютные показатели пропускной способности L2-кэша этого процессора в этих условиях остаются на весьма высоком уровне в 10-19 ГБ/с. То есть, если и можно допустить некоторое снижение производительности при одновременном запуске двух реальных однопоточных приложений, объем данных которых целиком помещается в L2-кэш процессора, то лишь в том случае, что эти приложения окажутся чрезвычайно требовательным к пропускной способности L2-кэша (примерно в той же степени, что и наш синтетический тест).

Гораздо хуже обстоит дело в условиях конкуренции ядер за общий L2-кэш процессора, т.е. когда суммарный объем данных, приходящихся на два потока (или два однопоточных приложения) превышает объем объединенного L2-кэша процессора. При этом скорость обмена ядра с данными существенно зависит от самого объема данных, к которому обращается это ядро. Когда объем данных сравнительно невелик и не превышает примерно 1/4 общего объема L2-кэша (1.0 — 1.25 МБ в условиях нашего эксперимента), эффективность обмена ядра с данными остается весьма высокой и сравнима с пропускной способностью L2-кэша при одиночном обращении. Можно сказать, такое приложение просто «не увидит» каких-либо остальных приложений, потенциально конкурирующих за L2-кэш процессора. Резкое снижение скорости обмена данных — до уровня пропускной способности оперативной памяти и ниже — наблюдается при возрастании требовательности потока/приложения к кэшу процессора, т.е. увеличении объема оперируемых данных. В наших условиях, такое наблюдается при объеме данных, приходящихся на один поток, от 1.5 МБ и выше. При этом вполне реалистичной может оказаться следующая ситуация: ни о чем не подозревающее приложение, использующее всего половину объема общего L2-кэша (2 МБ), может значительно потерять в скорости обмена с данными лишь потому, что параллельно оказалось запущенным некое постороннее приложение, пусть и не столь требовательное к пропускной способности, но оперирующее с большим, 3-МБ объемом данных. На процессорах семейства Intel Core 2 с общим L2-кэшем такое «приложение-агрессор» не только будет выполняться неэффективно (т.к. его данные не помещаются в доставшуюся ему часть L2-кэша процессора), но и значительно снизит эффективность первого приложения, которому, казалось бы, своей части L2-кэша должно быть более чем достаточно.

Таким образом, на наш взгляд, система распределения общего L2-кэша в процессорах Intel Core 2 Duo / Core 2 Extreme обладает не самой высокой эффективностью в «конфликтной» области, когда требования каждого из ядер к используемому объему L2-кэша оказываются более-менее сопоставимыми между собой. Собственно, неэффективность заключается в сравнительно большой ширине «конфликтной» области, на которую незаслуженно приходится примерно 2 МБ, т.е. половина объема L2-кэша процессора. Будем надеяться, что последующие реализации объединенного L2-кэша в процессорах Intel будут характеризоваться лучшими показателями эффективности распределения объема L2-кэша процессора между ядрами в зависимости от их потребностей.




Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.