Новости

30.08.2017

Российская компания Positive Technologies анонсировала ...

  • Все новости (36)
  • Разделы новостей

    Публикации

    Майнеру на заметку

    Утилиты

    Реклама

    Обзоры компьютерных гаджетов, которые должны быть всегда под рукой

        Яндекс.Метрика
    Главная » Статьи » На что влияет Fast Strings?

    На что влияет Fast Strings?

    В ранее опубликованной статье «Программные и аппаратные циклы: кто быстрее?» мы анонсировали детальное исследование влияния опции Fast Strings на производительность аппаратных циклов, реализуемых строковыми инструкциями центрального процессора.

    Исследуемая операция

    Максимальная разрядность строковых инструкций в архитектуре x64 - 64 бита. Для инструкции REP MOVS, выполняющей копирование блока в памяти, 64-битной форме соответствует мнемоника REP MOVSQ (Repeat Move String as Quad Words). Вспомним, что AVX-расширения позволяют оперировать данными разрядностью до 256 и даже 512 бит. Чтобы избавить программиста от душевных страданий, связанных с необходимостью делать выбор между аппаратными циклами и данными большой разрядности при блоковых операциях, компания Intel ввела в своих процессорах поддержку режима Fast Strings, обеспечивающего аппаратное объединение последовательности 64-битных операций в операции большей разрядности. Эта увеличенная разрядность, также как и условия ее увеличения, оговаривающие кратность адресов и размеров блоков заданным константам, являются параметрами, зависящими от модели процессора.

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

    Исследуемая платформа

    Объект экспериментов — ноутбук ASUS N750JK c процессором Intel Core i7-4700HQ. Тактовая частота 2.4GHz, повышаемая в режиме Intel Turbo Boost до 3.4GHz. Установлено 16 гигабайт оперативной памяти DDR3-1600 (PC3-12800), работающей в двухканальном режиме. К сожалению, CMOS Setup данного ноутбука не богат низкоуровневыми настройками, поэтому возможности управления производительностью минимальны. Опция Fast Strings, которую мы собрались исследовать, отсутствует. Поэтому для управления режимом работы процессора будем использовать непосредственную запись в Model-Specific регистры (MSR).

    Почему UEFI?

    Тестовый пример был реализован в виде UEFI-приложения, запускаемого в среде UEFI без операционной системы. Во-первых манипуляции с Model-Specific регистрами из ОС требуют перехода на уровень привилегий Ring0 для выполнения системных инструкций, каковыми являются RDMSR (Read MSR) и WRMSR (Write MSR). Сам по себе этот факт является несложной проблемой, разрешаемой установкой собственного драйвера, но планируемые манипуляции с системными ресурсами могут нарушить работу операционной системы. Кроме того, и операционная система может повлиять на результаты экспериментов. Поэтому, будем использовать UEFI и все преимущества, которые дает монопольное владение оборудованием. Тем более, что восстановление ОС Windows 8 после сбоя требует несравнимо больше времени и психологической устойчивости, чем программирование на ассемблере в 64-битном режиме.

    Эксперименты

    Для процессора исследуемой платформы, режим Fast Strings управляется битом Fast Strings Enable в системном регистре IA32_MISC_ENABLE MSR. При нулевом значении бита, строковые инструкции выполняются обычным образом, без увеличения разрядности. При единичном — разрядность увеличивается с 64 бит, до значений, достижимых и оптимальных для данного процессора и конфигурации платформы.

    Fast-Strings Enable — нулевой бит регистра IA32_MISC_ENABLE MSR
    Рис 1. Фрагмент документации Intel. Адрес регистра IA32_MISC_ENABLE MSR равен 1A0h.
    Бит Fast-Strings Enable — это нулевой бит регистра

    Для проведения экспериментов написано два 64-битных UEFI приложения на ассемблере. Их трансляция осуществляется с помощью FASM 1.71.17.

    Приложение sample1.efi (исходный текст sample1.asm) выполняет копирование блока, размером 16 килобайт с повтором 10000000 раз. Визуализируется текущее (установленное в UEFI при старте) значение регистра IA32_MISC_ENABLE MSR а также количество процессорных тактов, затраченных на операцию. Для подсчета количества тактов применяется регистр TSC (Time Stamp Counter), интерпретируя показания которого следует помнить, что при активации технологии Intel Turbo Boost, тактовые частоты TSC и процессора могут не совпадать.

    Приложение sample2.efi (исходный текст sample2.asm) выполняет ту же операцию, предварительно инвертируя бит Fast Strings Enable. Таким образом, операция выполняется в режиме, противоположном установленному Firmware.

    Пример №1

    Запустив sample1.efi в среде UEFI Shell, получаем:

    IA32_MISC_ENABLE MSR = 0000000000850089h
    Delta TSC = 00000000FBA48E8Eh

    Переведя в двоичный код значение MSR, видим, что нулевой бит установлен, что означает, Firmware платформы активировало режим Fast Strings. Значение приращения TSC равно 00000000FBA48E8Eh = 4,221,865,614 тактов.

    Количество перемещенных байтов, это константа, заданная в программе, она равна:
    16384 * 10,000,000 = 163,840,000,000 байт

    Вычислим условное количество байтов на такт (округляем до целого):
    163,840,000,000 / 4,221,865,614 = 39 байт на такт

    Аккуратно предположим, что разрядность увеличена до 256 бит, это 32 байта за один такт. Полученный результат — 39 байт по всей видимости связан с отличиями тактовых частот TSC и процессора в различных ACPI-состояниях (проще говоря, работает Intel Turbo Boost).

    Пример №2

    Запустив sample2.efi в среде UEFI Shell, получаем:

    IA32_MISC_ENABLE MSR = 0000000000850088h
    Delta TSC = 000000039A6A6EB0h

    Нулевой бит MSR обнулен нашей программой, таким образом мы выключили режим Fast Strings. Значение приращения TSC равно 000000039A6A6EB0h = 15,475,568,304 тактов.

    Количество перемещенных байтов, также как и в первом опыте, равно:
    16384 * 10,000,000 = 163,840,000,000 байт

    Вычислим условное количество байт на такт (округляем до целого):
    163,840,000,000 / 15,475,568,304 = 11 байт на такт

    Ожидаемая разрядность равна 64 битам, это 8 байт за один такт. Увеличение до 11 байт, как мы предполагаем, связано с функционированием технологии Intel Turbo Boost.

    Резюме

    Приращение производительности строковой инструкции копирования блока при включении режима Fast Strings очевидно. Получит ли аналогичную прибавку коммерческое программное обеспечение? В каждом конкретном случае, это определяется спецификой приложения: используются ли строковые инструкции и какую долю рабочего времени приложения составляют операции с блоками данных. В свою очередь, UEFI исследуемого ноутбука от AMI, в данном аспекте не вызвало нареканий: по умолчанию установлен производительный режим, в соответствии с рекомендациями Intel. А вот наш диагностический инструмент предстоит научить измерять «истинную» тактовую частоту процессора в режиме Turbo Boost



    24.09.2017