на главную страницуна главную страницуна главную страницу

Новости | 3D-Видео, тюнеры и LCD | iT-Среда | MacLife | Мобильные устройства | Ноутбуки | Носители информации | Платформа ПК | Приложения и утилиты | Принтеры и периферия | ProAudio | Проекторы и ТВ | Сети и серверы | Цифровой звук | Цифровое видео | Цифровое фото | Карта сайта | Поиск


RightMark Memory Analyzer 3.0 — новая версия универсального теста подсистемы CPU/Chipset/RAM


Вот прошло уже почти два месяца с момента официального анонса первой версии универсального тестового пакета RightMark Memory Analyzer 2.4, которая очень хорошо зарекомендовала себя для детального исследования важнейших низкоуровневых характеристик различных платформ. Но время идет, прогресс не стоит на месте — как в области железа, так и ПО. И RightMark Memory Analyzer в этом плане — не исключение. Вслед за первой версией этого тестового пакета вскоре вышла вторая, улучшенная (RightMark Memory Analyzer 2.5), причем основное внимание было сосредоточено, скорее, на доработке ряда недостаточно хорошо реализованных ранее моментов, нежели развитии теста — введении в него новых возможностей. При этом нельзя не отметить, что все изменения, внесенные во второй официальный релиз тестового пакета, никак нельзя было назвать какой-либо «заточкой», скажем, под процессоры конкретного производителя, или же просто под их новые модели — заложенные изначально универсальные принципы реализованных тестов остались теми же самыми. С новым, предлагаемым вашему вниманию третьим релизом RMMA 3.0, все получилось несколько иначе — количество нововведений гораздо больше, чем доработок тонкостей в реализации ряда тестов. Что, несомненно, характеризует его самым лучшим образом. Итак, самое время приступить к рассмотрению основных возможностей новой версии тестового пакета RightMark Memory Analyzer 3.0.

Информация о процессоре (CPU Info)

Для начала, обратим внимание на окно приложения, открываемое при запуске теста.

Привычный с предыдущих версий вид окна несколько изменился — на первый взгляд, стало меньше закладок. Тем не менее, просим не пугаться — все прежние возможности теста остались на месте, просто произошла некоторая реорганизация — разбиение тестов по отдельным категориям, о которых мы поговорим позже. А сейчас рассмотрим первую закладку (CPU Info / CPU), которая открывается по умолчанию при запуске теста. Из ее названия и внешнего вида легко понять, что это — подробная информация о системном процессоре (процессорах, если таковых несколько). Многие, наверное, знакомы с подобными характеристиками — они очень похожи на те, что выдаются популярными программами идентификации процессоров, вроде WCPUID или CPU-Z. Поэтому, вместо того, чтобы подробно останавливаться на рассмотрении этих параметров, скажем об управлении, реализованном на этой закладке.

CPU Index — номер активного процессора (физического или логического), при наличии в системе нескольких физических (SMP) или логических (Hyper-Threading) процессоров. При смене индекса процессора происходит автоматическое обновление информации о выбранном процессоре. Этот параметр также задает номер активного CPU (физического или логического), на котором будет исполняться главный поток теста.

В то время как данная опция довольно бесполезна для обычных SMP (и уж тем более, HT) систем, ее можно с интересом применять для изучения различий в поведении системы при обращении CPU к «своей» и «чужой» памяти, в системах с раздельной архитектурой последней (яркий тому пример — двухпроцессорные платформы AMD K8 (Opteron), в которых каждый процессор «наделен» собственной памятью).

Save — сохранение «дампа» идентификационной информации (CPUID) процессора в файл в бинарном формате. Поскольку эта информация используется для идентификации процессора в базе данных (о ней мы расскажем чуть позже), мы активно призываем пользователей нашего теста сохранять эту информацию наряду с результатами тестирования платформы, что обеспечит возможность расширить нашу базу данных по процессорам. В свою очередь, для пользователей нашего теста это означает возможность регулярно получать обновления этой базы данных.

Refresh — обновление информации о процессоре, выбранном в CPU Index, для данной и последующих закладок (Cache/TLB).

Перейдем к рассмотрению следующей закладки CPU Info / Cache.

Здесь представлена максимально полная информация о различных уровнях кэша процессора. Большинство параметров имеет два значения — так называемые, «заявленное» (Featured) и «действительное» (Actual) значения. Первые извлекаются путем расшифровки значений, выдаваемых функцией CPUID процессора, а вторые подставляются из нашей базы данных, являющейся неотъемлемой частью тестового пакета.

Самое время поговорить об этой базе данных. Основа ее функционирования очень проста. Не секрет, что каждая модель процессора имеет некий уникальный, присущий только ей набор данных, предоставляемых инструкцией CPUID с различными входными параметрами. Так сказать — «отпечатки пальцев» модели процессора. Что же включают в себя эти данные? Прежде всего, это 12-буквенный идентификатор производителя процессора (скажем, GenuineIntel или AuthenticAMD). Второй важнейший параметр — так называемая сигнатура процессора (номер семейства, модели и степпинга процессора, взятые в виде единого 32-битного значения). Следующий параметр — набор «фич» процессора (вроде различных SIMD-расширений) и, наконец, последний — характеристики кэша и TLB. Этих параметров оказывается вполне достаточно для идентификации данной модели процессора (не каждого конкретного экземпляра, а именно модели). В этой связи было бы бессмысленно, скорее, даже «вредно» включать в набор «отпечатков пальцев» процессора специфическую информацию, вроде его серийного номера (таковым обладают процессоры Intel Pentium III и Transmeta Crusoe), или же его «имени» (Brand String), которое часто содержит в т.ч. и частоту процессора ( или, если быть точным, для будущих моделей процессоров Intel — Processor Number). В связи со всем вышесказанным, принцип поиска модели системного процессора очень прост — если все указанные значения CPUID этого процессора совпадают с таковыми для n-го процессора базы — то наш процессор им и является, и можно подставить все «действительные» значения прямо из базы. В противном случае, если процессор не найден в базе, эти значения недоступны, за исключением длины строк L1/L2 процессора, которые (теперь лишь в этом случае) определяются автоматически, с помощью самого теста на старте приложения.

Возвращаясь к самим характеристикам уровней кэша процессора, отметим, что дополнительными параметрами, предоставляемыми здесь (и, очевидно, недоступными в CPUID), являются латентность (Latency) доступа в данный уровень кэша, разрядность шины (Bus Width) и ее организация (Hierarchy) — эксклюзивная или инклюзивная.

Следующая закладка (CPU Info / TLB) вполне аналогична предыдущей — это информация о буферах TLB процессора.

В этой закладке все реализовано аналогично — первые (Featured) значения извлечены из данных CPUID процессора, вторые (Actual) — из нашей базы данных. Данные по размерам и ассоциативности TLB с использованием больших страниц памяти (LP Entries/Associativity) в настоящее время в базе данных отсутствуют — напомним, что в современных ОС по-прежнему используются малые 4-КБ страницы памяти, в связи с чем объективная оценка указанных параметров (путем прямого измерения) для больших 4-МБ страниц пока невозможна. В то же время, вполне можно оценить такую величину, как штраф промаха (Miss Penalty) для каждого уровня TLB — величину, на которую возрастает латентность доступа в L1 кэш процессора при промахе соответствующего уровня TLB. Именно эти величины и подставляются из нашей базы данных.

Наконец, вот как выглядит информация о самой базе данных процессоров.

Названия полей очевидны — версия базы данных (первые две цифры, 3.0 соответствуют версии самой программы, следующая цифра — номер ревизии базы данных, который будет увеличиваться с каждым последующим ее обновлением, наконец, последняя цифра — количество записей в этой базе данных). Количество записей в базе (в настоящее время их относительно немного) представляется также в отдельной строке, наряду со статусом идентификации системного процессора — в нашем примере он, естественно, найден в базе данных, поскольку был помещен в нее под самым первым номером (ID=0).

Общие настройки (General)

В этом разделе программы находятся настройки, являющиеся общими для всех подтестов, реализованных в RMMA 3.0.

Memory Allocation

Выбор метода размещения памяти, необходимой для выполнения тестов.

Standard — стандартный метод выделения блока памяти в «куче» (heap) с помощью malloc, работающий практически на любых ОС.

VirtualLock — метод, использующий процедуры работы с виртуальной памятью, реализованные в ОС класса Windows NT. Блок памяти необходимого размера резервируется вызовом VirtualAlloc, после чего по адресу выделенного региона памяти вызывается функция VirtualLock, гарантирующая, что все данные этой области будут находиться в физической памяти, т.е., последующие обращения к этому региону не вызовут ситуации «сбоя страницы» (page fault).

AWE — метод, использующий расширения Address Windowing Extensions, доступные в операционных системах класса Windows 2000/XP/2003 Server. Данный метод выделения памяти является более надежным для ряда тестов, например, таких как тест ассоциативности кэша. Использование расширений AWE требует наличия у пользователя привилегии Lock Pages in Memory, которая, недоступна по умолчанию. Для получения данной привилегии необходимо выполнить следующие действия:

  1. Войти в систему с административным уровнем доступа;
  2. Запустить Local Security Policy из Administrative Tools;
  3. Выбрать Security Settings —> Local Policies —> User Rights Assignment;
  4. Выбрать политику Lock pages in memory и добавить имя пользователя или группы (например, Administrators).
  5. Чтобы данная политика вступила в силу, достаточно просто выйти из системы и войти в нее заново.

Data Set Size

Общий объем данных, который будет прочитан/записан при измерении каждой последующей точки. Само измерение в каждой точке повторяется четыре раза, после чего выбирается минимальный (по количеству тактов процессора) результат, что позволяет достичь большей воспроизводимости. Таким образом, например, если вы измеряете пропускную способность памяти на чтение с размером блока 1MB, величина Data Set Size = 128 MB означает, что в этом случае будет осуществлено 4 измерения с 32 итерациями чтения в каждом. Большие значения Data Set Size приводят к более достоверным результатам (более гладким кривым), но увеличивают время исполнения теста в соответствующее число раз.

Thread Lock

В общем случае, каждый тест запускается в главном потоке, которому присваивается наивысший возможный приоритет (realtime), что гарантирует практически полное отсутствие влияния на результаты тестирования других процессов, которые могут быть запущены в операционной системе. Однако это утверждение справедливо далеко не всегда, а именно — только в случае с однопроцессорными системами, каковыми, правда, и является большинство пользовательских систем. В случае мультипроцессорных систем (SMP или Hyper-Threading) посторонние процессы могут оказывать существенное влияние на результаты тестов. В связи с этим, данная опция введена с целью блокирования исполнения других процессов на мультипроцессорных системах класса SMP, что ведет к повышению точности и стабильности измерений. В то же время, использование данной опции крайне не рекомендуется в системах с технологией Hyper-Threading, поскольку в этом случае оно начинает сильно влиять на результаты тестирования. Оптимальным режимом тестирования систем с Hyper-Threading является условие по возможности максимально полного отсутствия загрузки операционной системы. Настоятельно рекомендуется закрыть все приложения, в т.ч. работающие в фоновом режиме и имеющие минимальный приоритет.

Logarithmic Y Scale

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

White Background

Использование белого фона в графическом представлении результатов теста, как по мере тестирования, так и в отчетном (BMP) файле. По умолчанию используется черный фон. Эта опция введена для удобства распечатки полученных результатов теста.

Create Test Report

Эта опция определяет, будет ли создан отчет после завершения теста. Отчет включает в себя два файла, с текстовым (MS Excel CSV) и графическим (BMP) представлением результатов теста.

Последовательность исполнения тестов (Batch)

Возможность последовательного исполнения тестов введена, прежде всего, из соображений удобства, в частности, для «потокового» тестирования большого количества разнообразных систем одним и тем же набором тестов. RMMA позволяет осуществлять следующие действия с набором тестов (Batch):

  • Delete — удаление выбранного теста из набора;
  • Clear — очистка всего набора;
  • Load — загрузка сохраненного набора из файла;
  • Save — сохранение текущего набора в файл.

Добавление индивидуальных тестов в набор осуществляется нажатием кнопки Add to Batch при нахождении в любом из подтестов программы.

Характер тестов, реализованных в RMMA 3.0

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

Измерительные тесты

Итак, теперь мы имеем право заявить — реализованные в RMMA 3.0 тесты можно вполне четко разделить на «измерительные» и «состязательные». К первым, почти без исключения, относятся все те тесты, которые уже знакомы вам по предыдущим версиям тестового пакета. Да-да, они именно измеряют величины, которые, порою, трудно сопоставить между собой. Напомним, что такими величинами являются:

  • Средняя и максимальная реальная пропускная способность памяти (ПСП);
  • Средняя и минимальная латентность L1/L2 кэша данных и оперативной памяти;
  • Ассоциативность L1/L2 кэша данных;
  • Реальная пропускная способность шины L1-L2 кэша данных;
  • Размер и ассоциативность каждого (при наличии нескольких) уровня D-TLB;
  • Размер (в т.ч. «эффективный») и ассоциативность L1 кэша инструкций;
  • Эффективность декодирования различных наборов инструкций ALU/FPU/MMX;
  • Размер и ассоциативность каждого (при наличии нескольких) уровня I-TLB.

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

Для точности, сформулируем напоследок принципы, по которым мы относим эти величины к измеряемым, а не сравнимым между собой.

  • В зависимости от используемых для замера команд и алгоритмов, значения таких характеристик могут быть получены совсем разные.
  • Алгоритмы и команды, подходящие для получения наилучших возможных значений результатов тестирования этих характеристик, не всегда можно назвать «часто употребляемыми» при программировании реального ПО. Кроме того, при этом данные «чисто теоретические» характеристики далеко не всегда проявляют себя в реальных приложениях (так, большие латентности в реальности «маскируются», и т.п.).
  • Алгоритмы и команды, подходящие для получения наилучших значений на одной архитектуре CPU, не всегда являются таковыми для процессоров другой архитектуры.

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

Тест №1: Тест реальной пропускной способности памяти (ПСП) (Memory Bandwidth)

Первый тест предназначен для оценки реальной пропускной способности L1/L2/L3 кэша данных и оперативной памяти (RAM). Принцип этого теста предельно прост: замеряется время (в тактах процессора), потраченное на полное чтение/запись/копирование блока данных определенного размера (который может быть как переменным, так и фиксированным) с использованием тех или иных регистров процессора (MMX, SSE или SSE2).

Применение большого фактора «раскручивания» циклов позволяет оптимизировать режим работы процедур в области малых размеров блока (в области L1 кэша данных) и увеличить достигаемые значения реальной пропускной способности этого уровня кэша.

В случае операций чтения и копирования тест также позволяет использовать различные оптимизации, направленные на достижение максимальной реальной пропускной способности при операциях чтения (Maximal Real Read Bandwidth) — методы Software Prefetch или Block Prefetch. Результат представляется в виде количества байт, переданных процессору (процессором) за один такт, а также в MB/s. Ниже перечислены настройки первого теста.

Variable Parameter

Variable Parameter — выбор одного из трех режимов тестирования:

Block Size — построение зависимости реальной ПСП от размера блока;

PF Distance — построение зависимости реальной ПСП от длины префетча в методе Software Prefetch. Поскольку этот режим ориентирован на достижение максимальной действительной пропускной способности памяти на чтение, он рекомендуется только для больших размеров блока (заведомо больших, чем общий размер кэша данных);

Block PF Size — построение зависимости реальной ПСП от размера префетч-блока в одном из двух методов Block Prefetch. Аналогично случаю PF Distance, рекомендуется только для больших размеров блока данных.

Minimal Block Size

Min Block Size, KB — минимальный размер блока данных, в килобайтах, в случае Variable Parameter = Block Size; размер блока данных в остальных случаях.

Maximal Block Size

Max Block Size, KB — максимальный размер блока данных в случае Variable Parameter = Block Size.

Minimal PF Distance

Min PF Distance — минимальная длина Software Prefetch, в байтах, в случае Variable Parameter = PF Distance; длина Software Prefetch в остальных случаях. Величина 0 означает, что режим Software Prefetch не используется.

Maximal PF Distance

Max PF Distance — максимальная длина Software Prefetch в случае Variable Parameter = PF Distance.

Minimal Block PF Size

Min Block PF Size — минимальная величина Prefetch-блока, в килобайтах, в случае Variable Parameter = Block PF Size; величина Prefetch-блока в остальных случаях. Данный параметр имеет смысл только в случае использования методов Block Prefetch (1, 2), описанных ниже.

Maximal Block PF Size

Max Block PF Size — максимальная величина Prefetch-блока, в килобайтах, в случае Variable Parameter = Block PF Size.

Stride Size

Stride Size — размер шага при чтении данных в кэш в методах Block Prefetch (1, 2), в байтах. Для получения достоверных результатов этот параметр должен соответствовать длине строки кэша. Поэтому здесь и в остальных подтестах этот параметр выставлен по умолчанию, как L1 Cache Line, что означает, что будет использоваться величина размера строки кэша L1, подставленная из базы данных либо автоматически определенная программой при ее запуске.

CPU Register Usage

CPU Register Usage — выбор используемых регистров для осуществления операций чтения/записи. Возможными вариантами являются 64-bit MMX, 128-bit SSE и 128-bit SSE2.

Read Prefetch Type

Read Prefetch Type — тип используемых инструкций для метода Software Prefetch (PREFETCHNTA/T0/T1/T2), а также включение одного из режимов Block Prefetch. Последние необходимы для измерения в режиме Variable Parameter = Block PF Size. Метод Block Prefetch 1 использует «начитку» строк из памяти в кэш в префетч-блок заданного размера с использованием инструкций MOV и рекомендуется для процессоров семейства AMD K7 (Athlon/Athlon XP/MP). В то же время, «начитка» данных в методе Block Prefetch 2 осуществляется с помощью одной из инструкций Software Prefetch (PREFETCHNTA). Этот метод рекомендован AMD для процессоров семейства K8 (Opteron/Athlon 64/FX).

Non-Temporal Store

Non-Temporal Store — использование режима прямого доступа в память (протокола write combining) при осуществлении операций записи. Данный режим доступа осуществляет запись данных в память без предварительного считывания старых данных в систему кэш-уровней процессора (т.е., не используя режим write allocate), что минимизирует «засорение» кэша процессора ненужными данными, в частности, при операции копирования данных.

Copy-to-Self Mode

Copy-to-Self Mode — использование режима «копирования на себя». В этом случае копирование блока данных осуществляется в ту же область памяти, где находится сам копируемый блок, т.е. фактически содержимое памяти не изменяется. По умолчанию эта опция не выбрана, и копирование осуществляется со смещением, равным длине перемещаемого блока данных. В связи со 100% попаданиями операций записи в кэш в режиме Copy-to-Self, в основном, тестируется способность памяти к чтению после записи (read around write). В этом случае утилизация кэш-памяти оказывается значительно выше, и тест является более «легким» для подсистемы памяти. Важно отметить, что режимы Non-Temporal Store и Copy-to-Self не совместимы друг с другом.

Selected Tests

Selected Tests — выбор одного или нескольких способов доступа к памяти.

Read Bandwidth — реальная пропускная способность памяти при операциях чтения;

Write Bandwidth — реальная пропускная способность памяти при операциях записи;

Copy Bandwidth — реальная пропускная способность памяти при операциях копирования.

Тест №2: Тест латентности/ассоциативности L1/L2 кэша данных (D-Cache Latency)

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

Variable Parameter

Variable Parameter — выбор одной из четырех разновидностей теста:

Block Size — построение зависимости латентности кэша данных/памяти от размера блока. Данный режим теста позволяет получить общую картину латентности различных областей подсистемы памяти — L1, L2, L3 (при наличии такового) кэша данных или оперативной памяти (RAM). Принцип его работы следующий: в выделенной области памяти создается цепочка зависимого доступа, каждый элемент которой содержит в себе адрес последующего элемента. При этом соблюдается условие, что на каждой полной итерации чтения к каждому элементу цепочки будет осуществлено строго одно обращение. Количество элементов цепочки берется равное размеру блока, деленному на величину шага по цепочке (Stride Size, см. ниже). В случае если размер шага соответствует длине строки кэша, размер блока является истинной характеристикой количества прочитанных данных (поскольку считывание данных из оперативной памяти в L2 кэш или из L2 кэша в L1 кэш осуществляется «построчно»). Таким образом, использование размеров блока, меньших или равных размеру L1 кэша позволяет оценить латентность доступа (load-use latency) к первому уровню кэша; размер блока в интервале (L1..L1+L2) или (L1..L2), в зависимости от архитектуры кэша (эксклюзивной и инклюзивной, соответственно) даст нам оценку латентности второго уровня (L2) кэша, и, наконец (поскольку L3 кэш является сравнительно редким явлением), размер блока, заведомо больший, чем сумма объемов L1+L2 кэша позволяет нам оценить латентность доступа к оперативной памяти (RAM). Порядок обхода цепочки зависит от выбранного метода тестирования (см. ниже).

В случае прямого последовательного доступа (Forward Read Latency) обход осуществляется строго с первого элемента по последний, при этом последний элемент цепочки содержит указатель на первый, что позволяет многократно повторять операцию обхода. Для примера, на рисунке изображен прямой последовательный обход цепочки из 8 элементов.

В случае обратного последовательного доступа (Backward Read Latency) первый элемент цепочки содержит адрес последнего элемента, после чего чтение осуществляется от последнего элемента к первому. Случайный доступ (Random Read Latency), как следует из его названия, характеризуется случайной последовательностью элементов в цепочке, однако условие выборки каждого из элементов строго по одному разу за один обход сохраняется. Существенным дополнением этого теста, начиная с версии 2.5, является введение нового режима обхода памяти, названного псевдослучайным (Pseudo-Random Read Latency) и разработанного с целью уменьшения величин латентности случайного доступа к памяти.

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

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

Walk Step Size — построение зависимости латентности кэша от размера шага. Количество шагов является фиксированным (не зависящим от размера шага, границы которого задаются параметрами Min Walk Step Size и Max Walk Step Size) и определяется, как размер блока, деленный на «базовую» величину шага (Stride Size, которая по умолчанию берется равной длине строки L1 кэша). Использование этой процедуры позволяет определить размер сегмента кэша (характеристику, напрямую связанную с его ассоциативностью).

Segments Count — построение зависимости латентности кэша от количества задействованных сегментов L1/L2 кэша данных, что позволяет оценить ассоциативность последнего. В этом варианте теста реально осуществляется обход одной и той же цепочки зависимого доступа. Единственное отличие «многосегментного» варианта от «односегментного» заключается в том, что в этом случае чтение данных осуществляется не в пределах одной и той же области памяти, а из разных областей (количество которых равно числу сегментов), расположенных друг относительно друга со смещением, кратным истинному размеру сегмента кэша. Чтобы все это выглядело менее запутанно, проиллюстрируем, как осуществляется прямой последовательный обход массива при количестве сегментов, равном четырем.

Для определения такого важного параметра кэша процессора, как степень его ассоциативности, достаточно последовательно увеличивать число задействованных сегментов кэша, сохраняя размер блока данных минимальным. Последний факт доказывает, что «испортить жизнь» кэшу процессора очень легко — для этого вовсе не обязательно «засорять» весь его объем. На деле, для того, чтобы «пробить» ассоциативность n-входового наборно-ассоциативного кэша, достаточно прочитать всего лишь n строк кэша по строго определенным адресам, имеющим относительное смещение, кратное размеру сегмента кэша. Именно это обстоятельство и эксплуатирует данный подтест. Для примера, чтобы показать «полную несостоятельность» кэша L2 процессора Pentium 4 размером 512K, имеющего степень ассоциативности n = 8 и размер строки 64 байт, достаточно будет прочитать всего лишь 8 x 64 = 512 байт данных, т.е. занять меньше 0.1% его объема(!). В качестве минимального размера сегмента кэша в текущей реализации теста выбрано значение, равное 1MB. Столь большое значение гарантирует, что тест будет корректно определять степень ассоциативности L2/L3 кэша данных даже в системах с большим объемом последнего (отметим, что сегмент кэша, равный 1MB, соответствует, например, 8MB кэшу данных третьего уровня со степенью ассоциативности, равной 8).

NOP Count — построение зависимости латентности выбранной области (L2 кэша или памяти) от количества «пустых» операций, вставленных между двумя последующими обращениями к выбранной области (L2 кэшу или памяти). Эти операции, называемые для краткости «NOP»-ами, не связаны с доступом в кэш, но приводят к появлению фиксированного временного промежутка между двумя последующими обращениями к разным строкам кэша/памяти, что позволяет «разгрузить» шину данных, соответствующую коммуникации между L1-L2 или L2-RAM, соответственно, и достичь таким образом минимального значения латентности доступа к выбранной подсистеме памяти. В текущей реализации RMMA в качестве такой «пустой» операции используется команда x86 ALU or eax, edx (при этом в eax хранится адрес элемента цепочки, а edx инициализирован нулем), которая, как показывает практика, одинаково хорошо подходит для тестирования большинства современных процессоров.

Stride Size

Stride Size — величина шага, в байтах, по зависимой цепочке доступа.

Minimal Block Size

Min Block Size, KB — минимальный размер блока данных, в килобайтах, в случае Variable Parameter = Block Size; размер блока данных в остальных случаях.

Maximal Block Size

Max Block Size, KB — максимальный размер блока данных в случае Variable Parameter = Block Size.

Minimal NOP Count

Min NOP Count — минимальное количество вставленных «пустых» операций в случае Variable Parameter = NOP Count; количество вставленных «пустых» операций в остальных случаях.

Maximal NOP Count

Max NOP Count — максимальное количество вставленных «пустых» операций в случае Variable Parameter = NOP Count.

Minimal Segments Count

Min Segments Count — минимальное количество задействованных сегментов кэша в случае Variable Parameter = Segments Count; количество используемых сегментов кэша в остальных случаях.

Maximal Segments Count

Max Segments Count — максимальное количество используемых сегментов кэша в случае Variable Parameter = Segments Count.

Minimal Walk Step Size

Min Walk Step Size — минимальная величина шага, в байтах, по зависимой цепочке доступа в случае Variable Parameter = Walk Step Size.

Maximal Walk Step Size

Max Walk Step Size — максимальная величина шага, в байтах, по зависимой цепочке доступа в случае Variable Parameter = Walk Step Size.

Latency Measurement

Latency Measurement — используемая методика определения минимальной латентности (параметр доступен для конфигурирования только в режиме Variable Parameter = NOP Count). В методе №1 (Method 1) для определения минимальной латентности используется обычная цепочка зависимого доступа со вставкой переменного количества «пустых» операций, рассмотренных выше (edx = 0):

// загрузка следующего элемента цепочки
mov eax, [eax]
// разгрузка шины, переменное количество «пустых» операций
or eax, edx
...
or eax, edx

Тем не менее, в ряде случаев (если эффективно работает спекулятивная загрузка) минимальная латентность кэша может не достигаться таким способом. Для достижения минимальной латентности в подобных случаях в RMMA реализована альтернативная методика (Method 2), в которой используется несколько иной код обхода цепочки (ebx = edx = 0):

// разгрузка шины, фиксированное количество «пустых» операций
add ebx, edx
...
add ebx, edx
// загрузка следующего элемента цепочки
mov eax, [eax+ebx]
and ebx, eax
// разгрузка шины, переменное количество «пустых» операций
add ebx, edx
...
add ebx, edx

Selected Tests

Selected Tests — выбор способов обхода цепочки при тестировании латентности.

Forward Read Latency — латентность прямого последовательного доступа;

Backward Read Latency — латентность обратного последовательного доступа;

Random Read Latency — латентность случайного доступа.

Pseudo-Random Read Latency — латентность псевдослучайного доступа.

Тест №3: Тест реальной пропускной способности шины L1/L2 кэша данных (D-Cache Bandwidth)

Третий тест предназначен для оценки реальной пропускной способности шины L1-L2 кэша (с таким же успехом его можно использовать для оценки ПС шины L2-RAM). Он является, пожалуй, наиболее простым из реализованных в RMMA тестов в плане его конфигурирования. В сущности, в его основе лежит тот же метод, что и в тесте реальной пропускной способности L1/L2/RAM (тест №1). Отличие заключается в том, что чтение/запись блока памяти в этом тесте осуществляется «построчно», т.е. с шагом, равным длине строки кэша и использованием ALU регистров процессора. Поддерживается, как прямой, так и обратный режим доступа. Параметрами этого теста являются:

Variable Parameter

Variable Parameter — выбор одного из двух режимов работы теста:

Block Size — построение зависимости реальной ПС шины данных от размера блока данных;

Stride Size — построение зависимости реальной ПС шины L1-L2 или L2-RAM от величины шага. Данный режим является одним из возможных способов определения размера длины строки L1/L2 кэша.

Minimal Block Size

Min Block Size, KB — минимальный размер тестируемого блока, в килобайтах, в случае Variable Parameter = Block Size; размер блока данных в остальных случаях. Задание величины, меньшей чем (по крайней мере) полуторный размер кэша L1 приведет к бессмысленным результатам. Действительно, данный тест не позволяет оценить пропускную способность связки L1-LSU-registers, потому что загрузка данных из L1 в LSU (Load-Store Unit) и, далее, в регистры процессора осуществляется отнюдь не «построчно». Для оценки ПС L1-LSU гораздо лучше использовать первый тест (Memory BW) в области размеров блока, попадающих в L1 кэш.

Maximal Block Size

Max Block Size, KB — максимальный размер тестируемого блока, в килобайтах. Указание величины, меньшей, чем размер L2 (инклюзивная архитектура кэша) или L1+L2 (эксклюзивная архитектура кэша) позволяет оценить реальную ПС шины L1-L2. При задании интервала значений Block Size от L1+L2 до некоторого заведомо большего значения с помощью данного теста можно оценить максимальную действительную пропускную способность памяти (ПСП) при операциях чтения/записи целых строк кэша, которая в ряде случаев оказывается выше, чем максимальная реальная ПСП при операциях тотального чтения/записи данных.

Minimal Stride Size

Min Stride Size — минимальная величина шага доступа к кэшу при осуществлении операций чтения/записи в случае Variable Parameter = Stride Size; величина шага доступа к кэшу в остальных случаях.

Maximal Stride Size

Max Stride Size — максимальная величина шага доступа к кэшу при осуществлении операций чтения/записи в случае Variable Parameter = Stride Size.

Selected Tests

Selected Tests — выбор вида измерений.

Forward Read Bandwidth — прямое последовательное чтение строк кэш;

Backward Read Bandwidth — обратное последовательное чтение строк кэш;

Forward Write Bandwidth — прямая последовательная запись строк кэш;

Backward Write Bandwidth — обратная последовательная запись строк кэш;

Тест №4: Тест прибытия данных по шине L1/L2 (D-Cache Arrival)

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

Кроме того, четвертый тест можно использовать для определения размера строки кэша L1/L2 (именно этот тест используется для ее измерения при запуске программы в том случае, если данная модель процессора не найдена в базе данных). Параметры четвертого теста таковы:

Variable Parameter

Variable Parameter — выбор одной из пяти разновидностей теста:

Block Size — построение зависимости суммарной латентности от размера блока.

NOP Count — построение зависимости суммарной латентности от количества «пустых» операций, вставленных между двумя последующими обращениями к разным строкам кэша.

SyncNOP Count — построение зависимости суммарной латентности от количества «пустых» операций, вставленных между двумя последующими обращениями к одной и той же строке кэша.

1st DW Offset — построение зависимости суммарной латентности от смещения первого слова в пределах строки кэша.

2nd DW Offset — построение зависимости суммарной латентности от смещения второго слова в пределах строки кэша.

Minimal Block Size

Min Block Size, KB — минимальный размер блока данных, в килобайтах, в случае Variable Parameter = Block Size; общий размер блока данных в остальных случаях.

Maximal Block Size

Max Block Size, KB — максимальный размер блока данных в случае Variable Parameter = Block Size.

Minimal NOP Count

Min NOP Count — минимальное количество вставленных «пустых» операций между двумя последующими обращениями к соседним строкам кэша в случае Variable Parameter = NOP Count; количество вставленных «пустых» операций между двумя последующими обращениями к соседним строкам кэша в остальных случаях.

Maximal NOP Count

Max NOP Count — максимальное количество вставленных «пустых» операций между двумя последующими обращениями к соседним строкам кэша в случае Variable Parameter = NOP Count.

Minimal SyncNOP Count

Min SyncNOP Count — минимальное количество вставленных «пустых» операций между двумя последующими обращениями к одной и той же строке кэша в случае Variable Parameter = SyncNOP Count; количество вставленных «пустых» операций между двумя последующими обращениями к одной и той же строке кэша в остальных случаях.

Maximal SyncNOP Count

Max SyncNOP Count — максимальное количество вставленных «пустых» операций между двумя последующими обращениями к одной и той же строке кэша в случае Variable Parameter = SyncNOP Count.

Stride Size

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

Minimal 1st Dword Offset

Min 1st Dword Offset — минимальная величина смещения первого слова в пределах строки кэша, в байтах, в случае Variable Parameter = 1st DW Offset; величина смещения первого слова в пределах строки кэша в остальных случаях.

Maximal 1st Dword Offset

Max 1st Dword Offset — максимальная величина смещения первого слова в пределах строки кэша в случае Variable Parameter = 1st DW Offset.

Minimal 2nd Dword Offset

Min 2nd Dword Offset — минимальная величина смещения второго слова в пределах строки кэша, в байтах, в случае Variable Parameter = 2nd DW Offset; величина смещения второго слова в пределах строки кэша в остальных случаях. Смещение второго слова вычисляется относительно смещения первого слова, по модулю величины шага (размера строки кэша):

2nd_Dword_Offset = (2nd_Dword_Offset + 1st_Dword_Offset) % Stride_Size

Maximal 2nd Dword Offset

Max 2nd Dword Offset — максимальная величина смещения второго слова в пределах строки кэша в случае Variable Parameter = 2nd DW Offset.

Selected Tests

Selected Tests — выбор способов тестирования латентности двойного доступа.

Forward Two-Dword Read Latency — латентность двойного обращения при прямом последовательном доступе;

Backward Two-Dword Read Latency — латентность двойного обращения при обратном последовательном доступе;

Random Two-Dword Read Latency — латентность двойного обращения при случайном доступе.

Pseudo-Random Two-Dword Read Latency — латентность двойного обращения при псевдослучайном доступе.

Тест №5: Тест конвейера и кэша инструкций
(Decode Bandwidth)

Пятый тест позволяет оценить эффективность декодирования/исполнения ряда простых команд процессором (ALU/FPU/MMX), а также эффективность работы L1 кэша инструкций. Он представляет особый интерес для оценки эффективного объема Trace Cache процессоров семейства Pentium 4 при декодировании/исполнении различных инструкций. Параметры этого теста перечислены ниже.

Variable Parameter

Variable Parameter — выбор одного из двух типов данного теста:

Block Size — построение зависимости скорости декодирования от размера блока кода (здесь и далее под «скоростью декодирования» (Decode Bandwidth) будем понимать скорость последовательности операций считывания, декодирования и исполнения инструкций процессором). Методика тестирования заключается в создании блока кода заданного размера «на лету» (в runtime) и измерении количества тактов процессора, потраченных на его исполнение. Последней инструкцией в блоке кода во всех случаях является инструкция возврата контроля вызывающей процедуре (ret).

Prefixes Count — построение зависимости скорости декодирования инструкций вида [pref]nNOP от количества используемых префиксов (pref = 0x66, operand-size override prefix).

Minimal Block Size

Min Block Size, KB — минимальный размер блока кода, в килобайтах, в случае Variable Parameter = Block Size; размер блока кода в остальных случаях.

Maximal Block Size

Max Block Size, KB — максимальный размер блока кода в случае Variable Parameter = Block Size.

Minimal Prefixes Count, Maximal Prefixes Count

Min Prefixes Count, Max Prefixes Count — минимальное и максимальное количество префиксов в случае Variable Parameter = Prefixes Count.

Instructions Type

Instructions Type — тип декодируемых/исполняемых инструкций:

ALU — арифметическо-логические целочисленные операции с использованием регистров общего назначения;

FPU — некоторые элементарные и вычислительные операции, осуществляемые блоком вычислений с плавающей точкой (FPU);

MMX — арифметическо-логические целочисленные операции, использующие блок MMX процессора.

Instructions Subtype

Instructions Subtype — подтип декодируемых/исполняемых инструкций. Зависит от выбранного типа инструкций. В скобках указан размер инструкции, - в байтах.

Тип инструкцийПодтип инструкцийОперация
ALU NOP (1)
LEA (2)
MOV (2)
ADD (2)
SUB (2)
OR (2)
XOR (2)
TEST (2)
CMP (2)
SHL (3)
ROL (3)
XOR/ADD (4)
CMP-0 (4)
CMP-0 (6)
CMP-8 (6)
CMP-16 (6)
CMP-32 (6)
CMP-0 (8)
CMP-8 (8)
CMP-16 (8)
CMP-32 (8)
nop
lea eax, [eax]
mov eax, eax
add eax, eax
sub eax, eax
or eax, eax
xor eax, eax
test eax, eax
cmp eax, eax
shl eax, 0
rol eax, 0
xor eax, eax; add eax, eax
cmp ax, 0x00
cmp eax, 0x00000000
cmp eax, 0x0000007f
cmp eax, 0x00007fff
cmp eax, 0x7fffffff
[rep][addrovr]cmp eax, 0x00000000
[rep][addrovr]cmp eax, 0x0000007f
[rep][addrovr]cmp eax, 0x00007fff
[rep][addrovr]cmp eax, 0x7fffffff
FPU WAIT (1)
FADD (2)
FMUL (2)
FSUB (2)
FSUBR (2)
FCHS (2)
FABS (2)
FTST (2)
FXAM (2)
FCOM (2)
FCOMI (2)
FST (2)
FXCH (2)
FDECSTP (2)
FINCSTP (2)
FFREE (2)
FFREEP (2)
wait
fadd st(0), st(1)
fmul st(0), st(1)
fsub st(0), st(1)
fsubr st(0), st(1)
fchs
fabs
ftst
fxam
fcom st(1)
fcomi st(0), st(1)
fst st(0)
fxch
fdecstp
fincstp
ffree st(0)
ffreep st(0)
MMX EMMS (2)
MOVQ (3)
POR (3)
PXOR (3)
PADDD (3)
PSUBD (3)
PCMPEQD (3)
PUNPCKLDQ (3)
PSLLD (4)
emms
movq mm0, mm0
por mm0, mm0
pxor mm0, mm0
paddd mm0, mm0
psubd mm0, mm0
pcmpeqd mm0, mm0
punpckldq mm0, mm0
pslld mm0, 0

Тест №6: Тест латентности кэша инструкций
(I-Cache Latency)

Шестой тест является новым тестом, введенным в настоящую версию тестового пакета RMMA 3.0. Он предназначен для измерения латентности доступа в L1i/L2 кэш/RAM в условиях исполнения кода, а также ассоциативности L1 кэша инструкций и объединенного L2 кэша инструкций/данных. Принцип этого теста следующий: в выделенном блоке памяти конструируется зависимая цепочка, каждый элемент которой содержит в себе инструкцию перехода на следующий элемент (jmp) с шагом, задаваемым величиной Stride Size, а последний элемент такой цепочки содержит инструкцию возврата контроля (ret). В случае теста ассоциативности, при «многосегментном» варианте обхода сначала осуществляется последовательный обход n-го элемента для каждого из сегментов, после чего происходит переход на (n+1)-й элемент главного сегмента.

Представленная иллюстрация, взятая из теста ассоциативности кэша данных, вполне подходит и для этого случая — отличием является лишь использование инструкций перехода (jmp) вместо инструкций зависимой загрузки данных (mov eax, [eax]). Настройки этого теста таковы:

Variable Parameter

Variable Parameter — выбор одного из двух вариантов теста:

Block Size — построение зависимости латентности исполнения инструкции перехода от размера блока;

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

Stride Size

Stride Size — шаг доступа по зависимой цепочке кода, в байтах.

Minimal Block Size

Min Block Size, KB — минимальный размер блока кода, в килобайтах, в случае Variable Parameter = Block Size; размер блока кода в остальных случаях.

Maximal Block Size

Max Block Size, KB — максимальный размер блока кода в случае Variable Parameter = Block Size.

Minimal Segments Count

Min Segments Count — минимальное количество используемых сегментов кэша в случае Variable Parameter = Segments Count; количество задействованных сегментов кэша в остальных случаях.

Maximal Segments Count

Max Segments Count — максимальное количество используемых сегментов кэша в случае Variable Parameter = Segments Count.

Jump Type

Jump Type — тип используемой инструкции перехода:

Near — ближний безусловный переход (jmp near +relative_offset); Far — дальний безусловный переход (mov ecx, absolute_offset; jmp ecx).

Selected Tests

Selected Tests — выбор способов обхода цепочки при тестировании латентности.

Forward Read Latency — латентность прямого последовательного доступа;

Backward Read Latency — латентность обратного последовательного доступа;

Random Read Latency — латентность случайного доступа.

Pseudo-Random Read Latency — латентность псевдослучайного доступа.

Тест №7: Тест трансляционного буфера данных (D-TLB)

Седьмой тест предназначен для определения объема и степени ассоциативности трансляционного буфера данных (Translation Lookaside Buffer, L1/L2 D-TLB). В этом тесте, фактически, измеряется латентность доступа в L1 кэш, но при том условии, что каждая последующая строка кэша загружается не из той же самой, а из следующей страницы памяти.

(В скобках заметим, что размер страницы памяти в реальных операционных системах гораздо больше (для примера, 4096 байт), чем в нашей схеме, где в нее помещается всего 4 строки кэша).

Таким образом, если количество задействованных страниц меньше размера TLB данных, мы определяем собственную латентность кэша L1 (TLB hit). В противном случае измеряется латентность кэша L1 в условиях промаха TLB (TLB miss). Важно отметить, что максимальное количество задействованных страниц памяти (Maximal TLB Entries) не должно превышать количество строк L1 кэша, иначе кривая зависимости будет иметь скачок, связанный с попаданием из области L1 в область L2, но не связанный с размером структуры D-TLB. Следует отметить, что общий размер уровней TLB всегда оказывается заведомо меньшим, чем количество кэш-линий, помещающихся в L1 кэше (чему можно придумать вполне объективное объяснение). Настройки этого теста таковы:

Variable Parameter

Variable Parameter — выбор одного из двух режимов работы теста.

TLB Entries — построение зависимости латентности доступа в L1 кэш от количества задействованных страниц памяти.

Segments Count — построение зависимости латентности доступа в L1 кэш от количества используемых «сегментов TLB» (по аналогии с сегментами кэша) при заданном количестве задействованных страниц, позволяющей оценить степень ассоциативности каждого из уровней D-TLB. Принцип построения «многосегментной» цепочки зависимого доступа аналогичен применяемому в тесте латентности (тест №2), но в этом случае к величине смещения между сегментами добавляется величина, равная размеру шага при обращении к каждому последующему элементу (по умолчанию — длине строки кэша). Для наглядности, изобразим обход четырех элементов TLB в «двухсегментном» режиме доступа.

Stride Size

Stride Size — шаг доступа по зависимой цепочке данных, в байтах.

Minimal TLB Entries

Min TLB Entries — минимальное количество используемых страниц памяти, по которым осуществляется считывание кэш-линий, в случае Variable Parameter = TLB Entries; количество используемых страниц памяти в остальных случаях.

Maximal TLB Entries

Max TLB Entries — максимальное количество используемых страниц памяти в случае Variable Parameter = TLB Entries.

Minimal Segments Count

Min Segments Count — минимальное количество используемых сегментов в зависимой цепочке доступа в случае Variable Parameter = Segments Count; количество сегментов в остальных случаях.

Maximal Segments Count

Max Segments Count — максимальное количество используемых сегментов в случае Variable Parameter = Segments Count.

Selected Tests

Selected Tests — выбор способов тестирования.

Forward Access — прямой последовательный доступ;

Backward Access — обратный последовательный доступ;

Random Access — случайный доступ.

Тест №8: Тест трансляционного буфера инструкций (I-TLB)

Восьмой тест микроархитектуры процессоров предназначен для определения объема и степени ассоциативности трансляционного буфера инструкций (Instructions Translation Lookaside Buffer, L1/L2 I-TLB). Так же, как и в случае теста D-TLB, в данном тесте измеряется латентность доступа в L1 кэш инструкций при том условии, что каждая последующая строка кэша загружается не из той же самой, а из следующей страницы памяти. Настройки этого теста являются абсолютно такими же, как и у теста №7, за исключением одного дополнительного параметра.

Variable Parameter

Variable Parameter — выбор одного из двух режимов работы теста:

TLB Entries — построение зависимости латентности доступа в L1i от количества задействованных страниц памяти.

Segments Count — построение зависимости латентности доступа в L1i от количества используемых сегментов I-TLB при заданном количестве страниц памяти.

Stride Size

Stride Size — шаг доступа по зависимой цепочке данных, в байтах. Шаг по цепочке осуществляется операцией безусловного перехода (jmp). Для примера, на рисунке приведен прямой последовательный обход четырех элементов I-TLB в «двухсегментном» режиме доступа.

Последний элемент цепочки, обозначенный крестиком, содержит в себе инструкцию возврата контроля вызывающей процедуре (ret).

Minimal TLB Entries

Min TLB Entries — минимальное количество используемых страниц памяти, по которым осуществляется обращение к кэш-линиям L1i, в случае Variable Parameter = TLB Entries; количество используемых страниц памяти в остальных случаях.

Maximal TLB Entries

Max TLB Entries — максимальное количество используемых страниц памяти в случае Variable Parameter = TLB Entries.

Minimal Segments Count

Min Segments Count — минимальное количество используемых сегментов в зависимой цепочке доступа в случае Variable Parameter = Segments Count; количество сегментов в остальных случаях.

Maximal Segments Count

Max Segments Count — максимальное количество используемых сегментов в случае Variable Parameter = Segments Count.

Jump Type

Jump Type — тип используемой инструкции перехода:

Near — ближний безусловный переход (jmp near +relative_offset);

Far — дальний безусловный переход (mov ecx, absolute_offset; jmp ecx).

Selected Tests

Selected Tests — выбор способов тестирования:

Forward Access — прямой последовательный доступ;

Backward Access — обратный последовательный доступ;

Random Access — случайный доступ.

Состязательные тесты

В заключительной части нам осталось рассмотреть второй вид тестов — состязательных, позволяющих получать сравнимые между собой величины на различных платформах. В принципе, многое говорить о них не придется — ведь именно таким является подавляющее большинство тестов производительности какого-либо компонента системы (и мы не видим причин, почему оперативная память должна быть тому исключением). К ним, в частности, относится и разрабатываемый нами проект CPU RightMark, с которым мы познакомили вас в отдельной статье. Что касается состязательных тестов памяти — пожалуй, здесь можно сформулировать единственный принцип таких тестов — полную независимость от тех самых «важнейших низкоуровневых характеристик» платформы, которые мы измеряем в первой категории тестов, описанных выше, прежде всего — от длины строки кэша. С точки зрения организации кода такие тесты должен представлять собой нечто вроде «референсного» кода типичной потоковой задачи на C/C++, «имеющей отношение к жизни», написанной без применения каких-либо ассемблерных оптимизаций и просто скомпилированной хорошим компилятором.

Тест №9: Тест производительности памяти
(RAM Performance)

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

Minimal Block Size

Min Block Size, KB — минимальный размер используемого массива.

Maximal Block Size

Max Block Size, KB — максимальный размер используемого массива. Реальный объем памяти, используемой этим тестом, выше, и зависит от выбранной методики измерения (см. ниже).

Selected Tests

Selected Tests — варианты теста производительности.

Float Copy — копирование массива вещественных данных (здесь и далее, тип данных — 64-bit double):
a[i] = b[i];

Float Scale — умножение элемента первого массива на константу, сохранение элемента во втором массиве:
a[i] = b[i] * k;

Float Add — поэлементное сложение двух массивов с сохранением элемента в третьем массиве:
a[i] = b[i] + c[i];

Float TriadFloat Add и Float Scale, вместе взятые. Элемент первого массива складывается с элементом второго, помноженного на константу, и сохраняется в третьем массиве:
a[i] = b[i] + c[i] * k;

Легко видеть, что с точки зрения нагрузки на подсистему памяти два первых (Float Copy, Float Scale) и два последних (Float Add и Float Triad) теста совпадают между собой. Действительно, в первой группе тестов осуществляется два обращения к памяти (чтение, запись), во второй — три обращения (чтение, чтение, запись). Отметим, что результатом этого теста является так называемая «полная» реальная пропускная способность памяти — полученная как раз с учетом того факта, что обращений к ней в цикле ведется несколько. Вторым важным моментом является то, что в конфигурации теста задается именно размер массива, а не всего блока памяти — т.е. реальная утилизация памяти оказывается больше в два (Float Copy, Float Scale) и три (Float Add и Float Triad) раза, соответственно.

Тест №10: Тест стабильности работы памяти
(RAM Stability)

Наш рассказ о новой версии RMMA 3.0 был бы не полным, если бы мы не рассмотрели последнюю закладку, имеющую название RAM Stability.

Как следует из названия этого теста, он предназначен для оценки стабильности работы памяти в данной конфигурации (прежде всего, имеются в виду ее тайминги). Это, наверное, самый простой из всех тестов, реализованных в RMMA 3.0. К тому же, не являющийся принципиально новым — в нем просто измеряется латентность случайного доступа к большому блоку памяти (размер которого задается параметром Block Size, KB). Отличием от стандартного «микроархитектурного» теста латентности является степень продолжительности такой, довольно жесткой нагрузки на подсистему памяти (настройки этого теста — Test Time, minutes — позволяют указать достаточно продолжительный интервал тестирования).

Учитывая, что в тесте латентности памяти адрес каждого последующего элемента цепочки запрашивается именно из оперативной памяти, малейший сбой в ее работе приведет к выдаче неверного значения — что, в свою очередь, приведет к тому, что процессор сгенерирует исключение. Данный тест способен уведомить пользователя об этом, поскольку статус успешного/аварийного завершения теста записывается в отчетный файл. Для «подстраховки» в этом тесте также происходит запись в лог-файл (Stability.log) с интервалом, задаваемым пользователем (Log File Interval, seconds). Значения, записываемые в этот файл, соответствуют измеренной в данный момент времени латентности случайного доступа к памяти.



Дмитрий Беседин (dmitri_b@ixbt.com)

Опубликовано — 7 апреля 2004 г.
 
 
Комментарии? Поправки? Дополнения? peek@ixbt.com



Новости | 3D-Видео, тюнеры и LCD | iT-Среда | MacLife | Мобильные устройства | Ноутбуки | Носители информации | Платформа ПК | Приложения и утилиты | Принтеры и периферия | ProAudio | Проекторы и ТВ | Сети и серверы | Цифровой звук | Цифровое видео | Цифровое фото | Карта сайта | Поиск

Copyright © by iXBT.com, 1997—2012. Produced by iXBT.com