![]()
Резюмируя все вышесказанное, можно сказать, что максимальная действительная ПСП на чтение/запись для рассматриваемой платформы K7 составляет 1647 МБ/с (77% от теоретического максимума 2133 МБ/с). Предельная реальная ПСП на чтение на Opteron равна 5150 МБ/с (98% от теоретического максимума, равного 5250 МБ/с), а на запись несколько ниже, 4880 МБ/с (93% от теоретического максимума). Латентность кэша данных/памяти
Для оценки средней латентности каждого из уровней кэша данных/памяти воспользуемся вторым тестом, выбрав пресет D-Cache/RAM Latency.
AMD Athlon XP 1800+
AMD Opteron 244
Латентность кэша L1 для обоих платформ составляет 3 такта во всех случаях доступа (прямой, обратный, случайный). В то же время, латентность кэша L2 процессора Athlon XP составляет 24 такта при прямом доступе (причина этого связана с появлением накладных расходов на организацию алгоритма Hardware Prefetch) и 20 тактов при обратном/случайном доступе. Соответствующие величины на Opteron составляют в среднем 17 тактов (во всех случаях доступа). В обоих случаях она оказывается несколько выше, чем заявленная в документации величина минимальной латентности. Ее мы попытаемся достичь в следующем тесте. А сейчас рассмотрим среднюю латентность доступа к памяти. На платформе K7 она составляет величину порядка 205 тактов (133 нс) при прямом доступе и примерно 300 тактов (195 нс) при обратном/случайном доступе, что говорит о наличии относительно хорошего механизма Hardware Prefetch, работающего в случае прямого последовательного обращения к памяти. Тем не менее, картина латентности памяти на K8 куда лучше. Первое, что бросается в глаза это наличие превосходного алгоритма Hardware Prefetch, причем работающего как при прямом, так и при обратном обходе (величины латентности памяти составляют всего 50 тактов, т.е. 28 нс!). Латентность при случайном доступе несколько выше 144 такта (80 нс). Плавное увеличение последней в обоих случаях (при размере блока 1 МБ и выше на K7, 2 МБ и выше на K8) связано с увеличением количества промахов L2 D-TLB, размер которого может обеспечить эффективную случайную адресацию именно таких объемов данных, но не более.
Минимальная латентность L2 кэша данных/памяти
Для оценки минимальной латентности L2 воспользуемся пресетом с очевидным названием Minimal L2 Cache Latency.
AMD Athlon XP 1800+
AMD Opteron 244 Интересно отметить, что в обоих случаях минимальная латентность L2 (11 тактов, AMD K7; 12 тактов, AMD K8), во всех режимах доступа, наблюдается при вставке 24-х «NOP»-ов. Поскольку каждый «NOP» = or eax, edx на процессорах AMD K7/K8 исполняется ровно один такт, это соответствует 24-тактной разгрузке шины L1-L2 между каждыми последующими обращениями к ней. Довольно интересные «скачки» в области 33 (K7) и 38 (K8) «NOP»-ов, а также особенности ее «разгрузки» в области до 24-х «NOP»-ов пока что остаются необъяснимыми.
Оценим минимальную латентность памяти. Для этого за основу возьмем пресет Minimal RAM Latency, 4M Block. Далее, учитывая полученную выше картину латентности, уменьшим размер блока до 1 МБ для системы K7 и до 2 МБ для K8. Это позволит минимизировать потери, связанные с промахом L2 TLB.
AMD Athlon XP 1800+
AMD Opteron 244 Рассмотрим вид кривых на платформе K7. Увеличение разгрузки шины L2-RAM ведет к плавному уменьшению величины латентности прямого последовательного доступа к памяти. По результатам данного теста нельзя сказать о достижении минимальной величины. Тем не менее, отдельный тест показывает, что она достигается при вставке порядка 380 «NOP»-ов между каждыми последующими обращениями и составляет величину 25-26 тактов процессора. В то же время, кривые обратного последовательного и случайного доступа имеют принципиально иной вид они характеризуются наличием «зубчиков» со вполне определенной периодичностью. Латентность обратного доступа к памяти находится в интервале 280 304 такта (183 198 нс), а латентность случайного доступа оказывается лишь незначительно выше (284 305 тактов, 185 199 нс), поскольку, как было сказано выше, мы измеряли ее в условиях практически полного отсутствия промахов L2 TLB. Заслуживает внимания вид кривых обратного и случайного доступа. Возникновение «зубчиков» связано с тем, что новый цикл обмена с памятью может стартовать/заканчиваться только на целом числе тактов системной шины. Как можно видеть, в данном случае «зубчики» расположены с интервалом в 23 «NOP»-а. Это означает, что цикл обмена с памятью в рассматриваемой системе (с коэффициентом умножения, равным 1533.3/133.3 = 11.5) может осуществляться только на каждом четном (либо нечетном) такте шины памяти. Причина такого поведения некоторых платформ AMD K7 пока что остается невыясненной. Отметим лишь, что это не связано с двухпроцессорной конфигурацией тестируемой системы, а также не зависит от типа используемой памяти (DDR или SDRAM) и является, по всей видимости, особенностью реализации того или иного чипсета.
Картина минимальной латентности памяти на Opteron существенно отличается. Прежде всего следует упомянуть достижение минимального значения латентности прямого/обратного последовательного доступа уже при 39 «NOP»-ах (что почти в 10 раз меньше по сравнению с Athlon XP), которая составляет всего 21 такт процессора (11.7 нс). Латентность случайного доступа оказывается гораздо выше (по-видимому, именно ее следует считать объективной характеристикой латентности памяти в системах, где реализован алгоритм Hardware Prefetch). Она находится в интервале 139 148 тактов (77 82 нс) и характеризуется в точности такой же «зубчатой» кривой с периодичностью в 11 «NOP»-ов, что соответствует возможности осуществления цикла обмена с памятью на каждом такте ее 166 МГц шины.
Ассоциативность кэша данных
Для определения ассоциативности кэша данных используем пресет D-Cache Associativity.
AMD Athlon XP 1800+
AMD Opteron 244 Оба процессора AMD Athlon XP и Opteron характеризуется очень четкими кривыми, на которых можно выделить область, соответствующую двухнаборно-ассоциативному L1 кэшу (при кол-ве цепочек 1-2), латентность которого так и остается равной 3 тактам во всех случаях доступа. Область 3-18 цепочек соответствует ассоциативности кэша L2, которая в нашем случае получилась как бы завышенной (18, против документированной степени ассоцитивности L2, равной 16). Причина этого явления связана с эксклюзивной архитектурой кэша процессоров семейства AMD K7/K8. Поскольку такая архитектура кэша не предполагает дублирование данных, содержащихся в кэше L1 кэшем L2, величина 18 соответствует как бы «суммарной» ассоциативности L1+L2 кэшей данных. Процессоры с инклюзивной архитектурой кэша, как мы увидим в последующих исследованиях, характеризуются иным видом кривых, перегибы на которых строго соответствуют ассоциативности L1 и L2 кэшей. Обратим внимание на то, что величина латентности L2 и RAM в обоих случаях получилась несколько завышенной в этом тесте, особенно при последовательном режиме доступа. Такое увеличение латентности, по всей видимости, связано с возрастанием накладных расходов на постоянную переассоциацию строк кэша со строками памяти по схеме LRU (Least Recently Used), что позволяет «удерживать» в иерархии кэшей процессора все данные, считываемые с «нехороших» адресов с точки зрения организации кэша данных процессора. Реальная пропускная способность шины L1-L2
Для определения этой величины вновь воспользуемся третьим тестом (D-Cache Bandwidth), но выберем пресет L1-L2 Cache Bus Bandwidth.
AMD Athlon XP 1800+
AMD Opteron 244 На первой системе (Athlon XP) мы получили величину реальной ПС шины L1-L2, равную 3.2 байт/такт во всех случаях доступа. Напомним, что каждый акт доступа в L2 (загрузка одной строки кэша L2 в кэш L1) в эксклюзивной архитектуре кэша сопровождается дополнительным сбросом вытесненной строки из L1 в L2, то есть, один акт доступа вызывает пересылку удвоенного объема данных по шине L1-L2. В связи с этим, эффективная ПС шины L1-L2 составляет, в нашем случае, величину 6.4 байт/такт, что в соответствует 64-битной шине данных между L1 и L2 кэшем процессора. На второй тестовой системе (Opteron) реальная пропускная способность шины L1-L2 гораздо выше (10.9 байт/такт с учетом эксклюзивности), что соответствует заявленной в документации AMD 128-битной шине обмена между L1 и L2 кэшем. Отметим и другую интересную особенность эксклюзивной архитектуры кэша, которая проявляется в том, что эффективность шины L1-L2 на запись оказывается не хуже ее эффективности на чтение строк кэш из L2 в L1. Это особенно заметно в архитектуре AMD K7 (реальная ПС шины L1-L2 как на чтение, так и на запись составляет 3.2 (6.4) байт/такт), в то время как AMD K8 характеризуется несколько меньшей эффективностью шины L1-L2 на запись, соответствующая величина реальной ПС которой составляет 4.9 (9.8) байт/такт.
Попытаемся получить некоторые дополнительные характеристики шины L1-L2 кэша, воспользовавшись специально разработанным для этой цели тестом прибытия данных (D-Cache Arrival), измеряющим суммарную латентность двух обращений к одной и той же строке кэша данных. В нашем случае будем использовать пресет L1-L2 Bus Data Arrival, 64 bytes.
AMD Athlon XP 1800+
AMD Opteron 244 На рисунках изображена зависимость суммарной латентности двойного обращения от смещения второго обращения (в байтах) относительно первого. Видно, что в данном случае (при достаточной разгрузке шины введением 64 «NOP»-ов между двумя последующими обращениями к соседним строкам кэша) кривые последовательного прямого, обратного и случайного доступа оказываются вырожденными. При смещениях 2-го элемента строки в пределах 4-20 байт относительно первого суммарная латентность двух обращений составляет 14/15 тактов (для K7/K8, соответственно), что в точности соответствует доступу в L2 кэш (11/12 тактов) с последующим доступом в L1 кэш (3 такта). В то же время, возрастание общей латентности при величине смещения 24 байт и выше, связано с тем, что предельная теоретическая пропускная способность двунаправленной 64-битной шины L1-L2 процессора AMD Athlon XP на чтение, составляет величину 8 байт/такт (за 3 такта обращения, связанных с доступом в L1, из L2 может прибыть не более, чем 8x3 = 24 байт данных). Довольно неожиданным является такое же поведение процессора Opteron, означающее, что эффективная разрядность шины L1-L2 на чтение составляет всего 64 бита. Более подробно это рассматривалось в приложении 1 к статье, посвященной детальному исследованию архитектуры AMD64. Легко показать, что введение дополнительной задержки величиной в 1 такт между последующими обращениями к одной и той же строке кэша (путем увеличения количества SyncNOP на единицу) приводит к «сдвигу» границы, наблюдаемой на графике, на величину 8 байт. При количестве SyncNOP-ов больше пяти эта граница исчезает, поскольку за 3 (L1) + 5 (SyncNOPs) = 8 тактов обращения к кэшу L2 по шине L1-L2 успевает прибыть 8x8 = 64 байта, что соответствует целой строке кэша. Наконец, попытаемся оценить, как именно осуществляется считывание строки из кэша L2 в кэш L1 (с ее начала, независимо от смещения первого элемента, или же с запрашиваемой позиции, оборачиваясь на конце строки). Для этого воспользуемся возможностью построения графика суммарной латентности от смещения первого слова относительно начала строки кэша, задав такие пользовательские (Custom) параметры теста D-Cache Arrival:
AMD Athlon XP 1800+
AMD Opteron 244 Отметим, что использование смещения второго слова относительно первого, равного 60 байтам, фактически означает, что его реальное смещение составит -4 байта (за исключением начальной точки, когда смещение действительно равно 60 байтам), т.е. второе слово будет располагаться в строке кэша на одну позицию «левее» первого. Теперь рассмотрим сами рисунки. Прежде всего, опровергнем гипотезу о том, что данные всегда считываются с начала строки, независимо от расположения первого элемента. В этом случае, поскольку считывание 2-го элемента в данном тесте осуществляется в таком порядке: (60, 0, 4, ..., 56), мы имели бы вид кривых, идентичный полученному выше, но со смещением всей картины на 4 байта влево. Таким образом, в рассматриваемых архитектурах (K7 и K8) считывание строки кэша может начинаться с некоторой ненулевой позиции, зависящей от расположения первого элемента. Для ответа на вопрос, как именно связаны эти две величины, рассмотрим сам вид полученных кривых. Легко заметить, что они характеризуется всего двумя значениями суммарной латентности максимумом, равным 26/27 тактам (при смещениях первого слова, кратных восьми, назовем их «четными») и минимумом, равным 14/15 тактам (при «нечетных» смещениях). Иными словами, это означает, что в случае «нечетных» смещений первого слова данные, прибывающие из кэша L2, оказываются в кэше L1 сразу, в то время как считывание данных с «четных» смещений приводит к максимальной задержке прибытия второго слова, отстоящего от первого на -4 байта. На основании полученных результатов сделаем предположение, что считывание строки кэша из L2 в L1 в процессорах семейства AMD K7/K8 может осуществляться с любого смещения, кратного 8 байтам. Далее считывание идет вперед, оборачиваясь на конце строки пока вся строка не считается полностью. Для проверки этого предположения мысленно рассмотрим два примера. Пусть в первом из них данные запрашиваются с «четного» смещения, равного 24 байтам. Тогда считывание данных из L2 в L1, на каждом такте, будет осуществляться в такой последовательности: (24-31, 32-39, 40-47, 48-55, 56-63, 0-7, 8-15, 16-23). Это объясняет, почему задержка чтения второго слова, имеющего фактическое смещение 24 4 = 20 байт, оказывается максимальной (26/27 тактов). Рассмотрим теперь другой случай, когда смещение первого слова оказывается «нечетным», к примеру, 44 байт. Считывание данных, согласно нашему предположению, будет осуществляться так: (40-47, 48-55, 56-63, 0-7, 8-15, 16-23, 24-31, 32-39). Что и объясняет, почему суммарная латентность обращения к элементам, имеющим смещения 44 и 40 байт, соответственно, получилась минимальной (14/15 тактов). А это, в свою очередь, доказывает сделанное выше предположение. Кэш инструкций, эффективность декодирования
Для начала оценим характеристики уровней кэша инструкций (напомним, что L2 кэш обычно может кэшировать как данные, так и исполняемый код) и эффективность декодирования простой 6-байтной команды cmp eax, 0x00000000, которая позволяет достичь максимальной скорости декодирования. С этой целью воспользуемся тестом I-Cache, выбрав пресет L1i Size / Decode Bandwidth, CMP Instructions 3.
AMD Athlon XP 1800+
AMD Opteron 244
Размер первого уровня кэша инструкций (L1i), как и ожидалось, составляет ровно 64 КБ как для K7, так и для K8. Неизменной остается и эксклюзивная организация иерархии L1-L2, которая распространяется и на случай кэширования кода. Действительно, кривые скорости декодирования имеют второй перегиб при 320 КБ (64+256) на K7 и 1088 КБ (64+1024) на K8. Эффективность декодирования/исполнения кода, находящегося в L1i кэше, достигает почти предельного для данных архитектур значения 16 байт/такт, о котором мы говорили выше при рассмотрении реальной ПС L1 кэша данных. Эффективность кэширования этого типа инструкций кэшем L2 намного ниже. Посмотрим, как обстоят дела со скоростью исполнения других типов инструкций из L1i/L2 кэша.
Первое, что бросается в глаза это полная независимость скорости исполнения инструкций из L2 от их типа, в случае обоих архитектур K7 (1.97 байт/такт) и K8 (2.56 байт/такт). Во втором случае эффективность исполнения кода из L2, конечно, несколько возросла (почти на 30%), но оба значения явно далеки от теоретического предела для 64-разрядности шины L1-L2 на чтение. Что касается L1i кэша, видно, что декодирование «крупных» инструкций (вроде 6- и 8-байтных cmp) явно лимитируется предельной пропускной способностью L1 16 байт/такт (2.66 инструкций/такт и ниже). А вот на сравнительно «мелких» (одно-, двух- и четырехбайтных) независимых инструкциях можно достигнуть предельной скорости декодирования/исполнения, которая в архитектуре K7/K8 составляет величину 3 инструкции/такт. Легко увидеть, что в декодер K8 введен ряд улучшений, касающихся декодирования простых операций ALU, позволяющих достичь предельную скорость их исполнения, по сравнению с декодером K7.
Попытаемся оценить ассоциативность L1 кэша инструкций и объединенного L2 кэша кода/данных (ассоциативность последнего, естественно, должна равняться полученной нами ранее при анализе ассоциативности L1/L2 кэша данных). Для этого используем пресет I-Cache Associativity.
AMD Athlon XP 1800+
AMD Opteron 244 Результаты тестирования достаточно четкие, в особенности на платформе Opteron. В обоих случаях видно, что ассоциативность L1 кэша инструкций равна двум, а «общая» ассоциативность L1i+L2 равна 18, что еще раз подтверждает эксклюзивную организацию иерархии уровней кэша в рассматриваемых архитектурах процессоров.
Посмотрим, наконец, насколько эффективно эти процессоры умеют «расправляться» с большим количеством (по сути,
бессмысленных) префиксов, предшествующих одной-единственной осмысленной x86 инструкции. Для этого воспользуемся специальным пресетом Prefixed NOP Decode Efficiency.
AMD Athlon XP 1800+
AMD Opteron 244 Кривая зависимости на K7 характеризуется максимумом при количестве префиксов, равном трем (11.2 байт/такт / 4 = 2.8 операций/такт), а при увеличении количества префиксов эффективность декодирования (в пересчете на количество операций) сильно снижается. У K8 с «отсечением» префиксов дела обстоят несколько лучше, хотя все равно не так хорошо, как хотелось. Вид кривой несколько изменился, имеются дополнительные максимумы, которые, однако, не являются таковыми при пересчете на количество исполняемых операций. А ведь именно такие команды [0x66]nNOP рекомендует AMD в своем руководстве по оптимизации ПО для процессоров семейства K8 в качестве «нейтрального» кода, использующегося например, для выравнивания границы начала цикла. Характеристики уровней D-TLB
Для начала получим общую картину уровней TLB данных, присутствующих в каждом из рассматриваемых процессоров. Для этого выберем тест D-TLB и воспользуемся пресетом D-TLB Size для системы на Athlon XP. Для второй системы (Opteron) мы выбрали ручные настройки теста, увеличив максимальное кол-во измеряемых записей D-TLB до 1024, т.к. размер L2 D-TLB у этого процессора оказался явно больше 512.
AMD Athlon XP 1800+
AMD Opteron 244 Мы видим, что оба рассматриваемых процессора имеют двухуровневую систему D-TLB, с размером L1 D-TLB, равным 32 записям. Размер L2 D-TLB у Athlon XP составляет 256 записей, а в Opteron его увеличили ровно в 2 раза (512 записей). Поскольку второй скачок наблюдается в области, соответствующей размеру L2 D-TLB, а не общему объему L1+L2 D-TLB, можно предположить, что структура D-TLB обоих процессоров имеет «инклюзивную» организацию (к сожалению, обычно детали организации уровней TLB при наличии нескольких таких уровней никак не отражаются в документации). В обоих случаях, промах L1 D-TLB сопровождается увеличением латентности доступа в L1 кэш до 8 тактов. Промах L2 D-TLB сказывается существенно сильнее по мере увеличения количества промахов латентность доступа в L1 кэш плавно возрастает до значений, явно превышающих латентность L2 кэша.
Согласно документации AMD, L1 D-TLB в процессорах семейства K7/K8 является полностью ассоциативным (fully associative). Самое время проверить это утверждение. Для этого выберем пресет D-TLB Associativity, 16 Entries, которые заведомо поместятся в L1 D-TLB.
AMD Athlon XP 1800+
AMD Opteron 244 Проверка подтверждает: латентность доступа в L1 кэш при обращении к 16 страницам памяти у обоих процессоров остается равной 3 тактам при любом количестве зависимых цепочек доступа. Такой же вид кривых можно получить и при максимальном количестве цепочек, равным 32. Это означает, что L1 TLB является полностью ассоциативным (поскольку степень его ассоциативности оказывается не меньшей, чем его собственный размер).
Попробуем оценить степень ассоциативности L2 D-TLB. Для этого возьмем такое количество страниц, которое заведомо выше, чем количество записей в L1 TLB, но ниже, чем в L2 TLB (пресет D-TLB Associativity, 64 Entries для K7; D-TLB Associativity, 128 Entries для K8).
AMD Athlon XP 1800+
AMD Opteron 244 Видно, что латентность доступа в L1 кэш в условиях промаха L1 D-TLB (т.е. использования только L2 D-TLB) резко возрастает при количестве цепочек, большем четырех. Это означает, что L2 D-TLB в рассматриваемых процессорах является четырехнаборно-ассоциативным. Характеристики уровней I-TLB
Измерим характеристики I-TLB точно так же, как и D-TLB. Для определения размеры (структуры уровней) I-TLB воспользуемся пресетом I-TLB Size в тесте I-TLB.
AMD Athlon XP 1800+
AMD Opteron 244 Для платформы Opteron мы вновь немного модифицировали стандартный пресет, увеличив максимальное количество TLB Entries до 1024. Оба процессора, по результатам теста, имеют два уровня I-TLB. Мы видим, что первый уровень (L1 I-TLB) в архитектуре AMD K8 был увеличен вдвое (до 32 записей) по сравнению с архитектурой предыдущего поколения K7. Такие же изменения коснулись и второго уровня L2 I-TLB, размер которого в новой архитектуре был расширен до 512 записей. Тем не менее, оба процессора имеют одинаковую организацию взаимодействия уровней I-TLB, которую, как и в случае с D-TLB, мы условно называем «инклюзивной».
Оценим ассоциативность каждого из уровней I-TLB. За основу возьмем пресет I-TLB Associativity, 16 Entries. При тестировании платформы AMD K7 уменьшим число используемых записей I-TLB до 15, чтобы избежать выход за пределы L1 I-TLB (поскольку одна его запись в нашем случае будет «занята» адресацией страницы собственно тестового кода).
AMD Athlon XP 1800+
AMD Opteron 244
Интерпретация результатов весьма очевидна L1 I-TLB в обоих случаях является полноассоциативным. Нам остается определить ассоциативность второго уровня TLB инструкций. Для этого используем пресет I-TLB Associativity, 32 Entries для K7 и I-TLB Associativity, 128 Entries для K8.
AMD Athlon XP 1800+
AMD Opteron 244 В обоих случаях имеем весьма четкую картину, соответствующую заявленной ассоциативности L2 I-TLB, равной четырем. Заключение
В этой статье мы представили вашему вниманию результаты нашего первого серьезного исследования платформ (на примере платформ AMD K7/K8) на низком уровне с использованием единого универсального тестового пакета RightMark Memory Analyzer. Полученные результаты позволяют сделать вывод о том, что разработанный нами тестовый пакет можно успешно применять для исследования основных важнейших низкоуровневых характеристик платформ. В нашей следующей статье мы продолжим начатые исследования, перейдя к сравнительному тестированию платформ Intel Pentium 4.
|
Обсудить в конференции |
| Комментарии? Поправки? Дополнения? peek@ixbt.com | ![]()
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||