Согласно заводской документации модули оперативной памяти IR-3200S464L16S-8G соответствуют спецификации DDR4-2400 (частота тактирования 1200 MHz), но поддерживают и XMP-профиль DDR4-3200, позволяющий поднять частоту тактирования до 1600 MHz. При этом, активация оверклокерского профиля может быть выполнена повышением напряжения питания от штатных 1.2V до 1.35V, что требует наличия на системной плате программируемого источника питания. Инициализация этого схемного решения выполняется UEFI на основании содержимого SPD, состояния опций BIOS Setup и ряда platform-specific факторов. Настройки UEFI для работы с XMP-профилем могут быть недоступны пользователю, как это имеет место почти во всех ноутбуках. Платформа ASUS FX506HM, используемая в нашем эксперименте, — не исключение.

Разобравшись с потенциальными возможностями модулей, рассмотрим фактические параметры инициализации подсистемы DRAM. Как видно из информации, оверклокерский профиль не активирован, частота 1197.3 MHz приближенно равна 1200 MHz, что соответствует режиму DDR4-2400.
Зная эффективную частоту передачи данных: FDDR = F · 2 = 1197.3 · 2 = 2394.6 MHz, а также разрядность одного канала в байтах (W=8 байт или 64 бита) и количество каналов (N=2 или Dual Channel) вычислим теоретическую пропускную способность:
Bandwidth = FDDR · W · N = 2394.6 · 8 · 2 = ~38313.6 MBPS.
Сначала о латентности
Измерение латентности подсистемы оперативной памяти, организованной с помощью пары 8-гигабайтных SO-DIMM модулей DDR4 IR-3200S464L16S, основано на обходе в ОЗУ связанного списка элементов. Каждый из них является псевдослучайным числом — указателем на следующий элемент. Так намеренно подавляются спекулятивные механизмы процессора — для того, чтобы начать следующий цикл чтения памяти, нужно узнать его адрес, для этого требуется завершить текущий цикл. В результате измеряется полная задержка памяти: от подачи адреса до извлечения считанных данных. Non-temporal оптимизация в этом алгоритме не используется, поэтому кэш-память неизбежно является участником событий.
Учитывая значительный объем L3 у исследуемого процессора (24MB), тест латентности требует дифференцированной оценки: в каком случае на результат оказала влияние кэш-память L3, а в каком случае мы видим характеристики DRAM DDR4 от IRDM?

В тесте с одним потоком, где максимальный обрабатываемый объем блока составляет 40 MB, влияние L3 достаточно выражено. Дополнительное подтверждение этого тезиса мы видим на правом скриншоте при переходе в режим Large Pages, где влияние TLB нивелировано. Здесь точка перегиба соответствует объему блока около 22 MB, приближаясь к объему L3-кэш, составляющему у Intel Core i9-11900H ровно 24MB.

В многопоточных тестах, где объем обрабатываемой информации кратно выше, влияние кэширования на латентность IR-3200S464L16S-8G минимально и полученные графики более точно отражают физические характеристики подсистемы оперативной памяти от GOODRAM. Кроме того, сравнивая результаты теста для канонических страниц и Large Pages, можно наблюдать незначительный, но, тем не менее, устойчивый позитивный эффект от применения больших страниц.
Примечание 1.
Разметка оси Х соответствует объему информации, обрабатываемой в каждом потоке, а не суммарному объему блока, разделяемого между потоками. Для исследуемого ноутбука ASUS FX506HM многопоточный тест использует восемь потоков по числу ядер установленного процессора Intel Core i9-11900H, следовательно в точке X=40MB общий обрабатываемый объем составляет 40*8=320MB, что достаточно для уверенного переполнения L3.
Примечание 2.
Графики латентности отражают зависимость задержки получения данных в наносекундах (ось Y) от объема обрабатываемого блока в мегабайтах (ось X). Меньшие значения Y соответствуют большей производительности.
Выделяем главное
В ходе тестирования SO-DIMM модулей IR-3200S464L16S-8G было получено достаточно много результатов, некоторые из них заслуживают отдельных публикаций и станут основанием для модернизации программного обеспечения NCRB. Попробуем выделить измерения, оптимальные для исследуемого ноутбука ASUS FX506HM, и сформулировать критерии такой оптимальности.
О скорости чтения DRAM
Многопоточный тест чтения Модулей GOODRAM на основе 512-битной формы инструкции VMOVNTDQA дает результат, по медианному значению составляющий около 39.5 GBPS, что несколько превышает расчетный лимит, вычисленный в начале статьи. Дело в том, что несмотря на non-temporal статус примененной инструкции, как видно из графика, CPU подавил кэширование далеко не полностью.

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

Программно-инициируемая опережающая выборка (software prefetch hints) не используется в этом тесте. Заблаговременная загрузка данных возложена исключительно на аппаратный префетчер. Практика показала, что для Intel Core i9-11900H такой подход является оптимальным. Переход к использованию prefetch hints значительно снижает производительность, во всяком случае, в данном варианте реализации при протестированных значениях prefetch-дистанции. Заметим, что в 256-битном тесте, оптимизированном для CPU предыдущих поколений, инструкции prefetch hints используются для всех вариантов установки опции Prefetch distance. Именно это, а не различие в 256/512-разрядности, привело к значительному выигрышу 512-битного теста.
О скорости записи DRAM
В подтверждение тезиса о том, что при утилизации пропускной способности DRAM-подсистемы управление потоками данных играет более важную роль, чем различие между AVX256 и AVX512, сравним результаты. Это соответственно 256-битная и 512-битная запись в режиме non-temporal, который в случае записи отрабатывается процессором более строго. Кроме того, в отличие от теста чтения, здесь прочие условия максимально равны. В обоих случаях медиана составляет около 33 GBPS.

Про хорошо забытое старое
Если не принимать во внимание результаты, на которые оказала влияние кэш-память третьего уровня, то наибольшую скорость записи в оперативную память, сформированную SO-DIMM модулями IRDM, показал однопоточный тест с использованием строковых инструкций REP STOS (для 64-битных операндов — это REP STOSQ). С помощью этих инструкций IR-3200S464L16S-8G продемонстрировали скорость, достигающую в медиане 38 GBPS.
Реализованные более четырех десятилетий назад в первых x86-процессорах, строковые инструкции обеспечивали ощутимую прибавку производительности при обработке массивов, поскольку выполнение аппаратного цикла не требовало загрузку из памяти инструкций, составляющих тело программного цикла, — его просто нет. В процессорах семейства 80486 это обстоятельство уже утратило исходное преимущество — загрузка инструкций стала выполняться из внутренней кэш-памяти, а реализуемые оптимизации главным образом коснулись простейших операций, в частности MOV. Строковые инструкции на некоторое время перешли в разряд не рекомендованных к использованию.
Разработчики нескольких поколений современных процессоров вспомнили о преимуществах аппаратных циклов, и полученный результат подтверждает это. При выполнении инструкции REP STOSQ процессор, имея информацию о базовом адресе массива (регистр RDI) и его длине (регистр RCX), может адаптивно выбрать метод выполнения операции, заменив обработку 64-битных элементов обработкой блоков, размер которых оптимизирован в соответствии с разрядностью внутренних и внешних шин. Уровень участия кэш-памяти также может зависеть от соотношения объема обрабатываемого блока и объемов кэш.
Интересно, что в многопоточном режиме преимущество несколько нивелировалось и медианная скорость записи в GOODRAM упала до 32 GBPS.
Возможно, если один поток способен полностью утилизировать пропускную способность DRAM, то затраты на арбитраж в многопоточном режиме не окупаются. Хотя не исключено, что имеет место иная, более тонкая причина, связанная с множеством условий, только при одновременном выполнении которых CPU имеет возможность оптимизировать аппаратный цикл обработки массива. Об окончательных выводах еще говорить рано. Вместе с тем, одно из анекдотичных свойств x86-архитектуры, связанное с медленным выполнением аппаратных циклов в сравнении с программными, возможно уйдет в прошлое.
Заметим, что ускорение выполнения строковых инструкций может зависеть от инициализации процессора процедурами UEFI, в частности, — состояния ряда Model-Specific регистров. Исходя из этого, один и тот же процессор, будучи установленным на разных платформах, либо даже с различными версиями UEFI на одной платформе, может показывать различные результаты.
Вместо послесловия
Автор далек от мысли, что набор инструкций AVX512 не эффективен. Не секрет, что оперативная память работает значительно медленнее CPU, нивелируя различия времени выполнения внутренних операций последнего. Как аргумент в пользу AVX512, можно было бы привести в пример скорость чтения L3-кэш, но это совсем другая история.
Максимальный выигрыш в производительности для AVX512 по сравнению с AVX256 при прочих равных можно зафиксировать при работе с векторными регистрами процессора, количество которых, кстати, удвоилось и составляет 32 (ZMM0-ZMM31), и кэш-памятью L1, но это уже тема отдельной публикации.
В силу ограниченного объема материала, мы акцентировали внимание лишь на элементарных операциях загрузки и сохранения данных, важных в контексте оценки производительности DRAM. Детальная оптимизация с применением менее очевидных преимуществ новых CPU, в частности предикатных масок, позволяющих индивидуально адресовать скалярные значения, упакованные в векторном регистре, также способна дать свои плоды, при условии лояльности со стороны разработчиков программного обеспечения.