Эксперимент «Тонкости оптимизации»

Независимая группа специалистов в сфере информационных технологий SASecurity gr. проводит открытый эксперимент «Тонкости оптимизации». Промежуточные результаты эксперимента доступны здесь.

Предыстория

В ноябре 2009 года на сайте ГовноКод.ру появилась тема, посвящённая коду, генерируемому компилятором Delphi 7 для округления вещественных чисел. По словам автора темы TarasB, этот код даёт значительное падение быстродействия программ. Для округления Delphi создаёт функцию-обёртку _Round() над инструкцией сопроцессора FRNDINT. По сути, претензия автора обращена к тому, что лишняя пара CALL-RET при выполнении этой операции недопустима и расточительна. Предлагаемый автором вариант — подстановка инструкции FRNDINT на место каждого из этих вызовов.

Официальная документация по Intel-процессорам, посвящённая оптимизации (в частности, «Intel® Architecture Optimization. Reference Manual»), сообщает о том, что вызовы подпрограмм (благодаря branch prediction) не создают большой нагрузки на процессор и не вызывают существенного падения производительности. Наоборот, "это избавляет от необходимости использования inline-процедур". Кроме того, потенциальное падение производительности от Delphi-версии округления сглаживается тем, что в такой реализации смешиваются инструкции общего назначения и инструкции FPU, которые (согласно той же документации) могут выполняться параллельно.

Вышеприведённые факты, со ссылками на первоисточники, были предложены для рассмотрения автору темы пользователем DimonSoft (по совместительству являющимся бессменным администратором сайта DimonSoft и членом группы SASecurity gr.). Реакция TarasB оказалась довольно агрессивной — и тема быстро разрослась за счёт многочисленных комментариев. Несмотря на то, что авторитетность упомянутого ресурса весьма сомнительна (в чём читатель, при желании, может убедиться самостоятельно), затронутая его пользователями тема вместе со ссылками на достоверные источники, оказалась полезной как случайным прохожим, так и зарегистрированным пользователям. В конце июля 2010 года пользователь SharpRazor обратился с предложением оформить результаты обсуждения в виде статьи с изложением основных фактов по теме.

Группой SASecurity gr. данная идея была принята к рассмотрению. Для получения статьи надлежащего качества группой было принято решение о проведении массового тестирования с привлечением компьютеров различных конфигураций аппаратного и программного обеспечения. Для проведения тестирования был подготовлен набор тестовых программ для сбора статистической информации.

Краткое описание сравниваемых алгоритмов

Код, генерируемый Delphi, выделяет память для приёма результата в стеке, округляет число инструкцией FRNDINT, извлекает результат в зарезервированную область стековой памяти, затем копирует результат в пару регистров EDX:EAX и возвращает управление вызывающей программе.

DelphiRound:
     sub     esp, 8
     fistp   qword [esp]
     wait
     pop     eax
     pop     edx
     ret

Альтернативный алгоритм предполагает непосредственное использование инструкции FRNDINT.

     frndint

Таким образом, подача округляемого числа на вход обоих алгоритмов осуществляется одинаково: загрузкой аргумента в вершину FPU-стека.

После округления результат помещается в 4-байтовый участок ОЗУ, что полностью соответствует наиболее употребимому в Delphi-программах округлению к типу Integer. Для альтернативного варианта это соответствует следующему коду:

     fistp   dword [I]

Для Delphi-версии код был получен по аналогии с листингом дизассемблирования реальной программы:

     mov     dword [I], eax

Следует обратить внимание на то, что для Delphi-реализации данный способ приёма результата является невыгодным, поскольку предполагает 2-кратное обращение к памяти против 1-кратного для альтернативной реализации. Delphi-реализация, возвращая резальтат в регистрах, похоже, в большей степени предназначена для использования в реальных программах, где результаты округления обычно сразу же участвуют в дальнейших вычислениях.

Цели эксперимента

Этапы проведения эксперимента

  1. Подготовка тестовых программ для выполнения измерений
  2. Выработка рекомендаций по сбору результатов тестирования участниками
  3. Подготовка онлайн-ресурсов к размещению результатов тестирования
  4. Отправка наборов тестовых программ участникам тестирования
  5. Сбор результатов измерений и сведений об использованных при тестировании системах
  6. Систематизация результатов и их публикация на онлайн-ресурсах
  7. Выявление основных закономерностей в результатах тестирования
  8. Объяснение выявленных закономерностей на основе информации в официальной документации разработчиков процессоров
  9. Публикация и обсуждение итогов тестирования

Описание эксперимента

Подготовка эксперимента началась с написания минимального оконного Win32-приложения с использованием FASM 1.69. Выбор языка программирования и компилятора обусловлен необходимостью минимизировать влияние на результаты измерений посторонних факторов (например, таких, как детали реализации библиотеки VCL), обеспечить максимальную прозрачность и минимизировать общий размер пакета тестовых программ.

Выбор типа приложения (оконное Win32, с циклом обработки сообщений на основе API-функции GetMessage()) позволяет приблизить условия выполнения тестируемых алгоритмов к реальным условиям выполнения программ, компилируемых в среде Delphi. Кроме того, для минимизации влияния побочных факторов единственное окно программы не содержит визуальных элементов управления, как в заголовке, так и в клиентской области.

Функция-обёртка, генерируемая компилятором Delphi без изменений перенесена в тестовые программы. Код функции был согласован с TarasB в ходе обсуждения и полностью соответствует заявленному в теме. Код альтернативного способа округления также записан в строгом соответствии с сообщениями данного пользователя.

При каждом тестовом запуске для каждого из алгоритмов выполняется запуск цикла из 100'000'000 итераций. Таким образом, даже на сравнительно мощных пользовательских системах продолжительность измерения оказывается достаточной для того, чтобы минимизировать влияние на результаты побочных факторов.

Выбранный способ сохранения результатов каждой итерации заведомо проигрышен для алгоритма, предлагаемого компилятором Delphi: сохранение результата округления в ОЗУ. Реализация Delphi в этом случае производит 2 обращения к памяти против 1 у альтернативного алгоритма. В реальных программах результаты округления обычно используются в дальнейших преобразованиях, т.е. данный способ использования результатов операции является одним из худших способов по отношению к Delphi-реализации.

Описание тестового набора программ

Тестовый набор программ включает в себя 12 EXE-файлов, полученных на основе исходной тестовой программы путём варьирования ряда условий.

Программы представляют собой оконные Win32-приложения. При запуске отображается окно размером 800x100. Запуск теста осуществляется одиночным щелчком левой кнопкой мыши в клиентской области окна. При этом последовательно запускаются циклы для обеих реализаций и измеряется затраченное время. По окончании теста информация выводится в заголовок окна и в текстовый файл с именем, совпадающим с именем EXE-файла. Завершение работы с программами осуществляется путём закрытия окна комбинацией клавиш Alt+F4.

Тестовые программами работают с файлами-отчётами в режиме дозаписи. Таким образом, возможно выполнение нескольких запусков тестовой программы для получения требуемого количества результатов.

Имя файла тестового приложения имеет следующий формат:

(номер) X_T_W
где номер — порядковый номер приложения в пакете тестовых программ, X — тип приложения (S — с привязкой потока к одному ядру, M — без привязки), T — способ измерения времени выполнения (GTC — посредством API-функции GetTickCount(), RDTSC — с помощью инструкции процессора RDTSC, RDTSCCPUID — с использованием пары инструкций CPUID-RDTSC), W — наличие или отсутствие инструкции WAIT перед инструкцией FRNDINT в альтернативном алгоритме (W — с инструкцией WAIT, NW — без неё).

Ход эксперимента

Для получения комплекта результатов следует скачать пакет тестовых программ (размер в несжатом виде составляет 37 КБ). После этого выполняется запуск каждого из 12 приложений, входящих в состав пакета, и для каждого из них средствами тестового приложения формируется файл-отчёт, содержащий 12 (двенадцать) измерений. Для получения результатов одного измерения следует выполнить щелчок по клиентской области окна тестового приложения и дождаться изменения текста в заголовке окна. Момент выполнения щелчка (т.е. запуска измерения) определяется участником тестирования произвольным образом.

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

Из полученных 12 результатов измерения по каждой из программ пакета исключаются по 2 результата — с наименьшим и наибольшим разрывом в результатах — для снижения влияния случайных факторов. Исключённые из рассмотрения результаты включаются в отчёты, но не учитываются при анализе результатов.

Требования к комплектам результатов

По окончании тестирования участник оставляет сообщение на форуме группы SASecurity gr. с прикреплённым к сообщению RAR- или ZIP-архивом. Архив должен содержать один или несколько комплектов результатов тестирования. В случае, если комплектов несколько, каждый из них помещается в отдельную папку.

Комплект результатов тестирования представляет собой 12 текстовых файлов, полученных при запуске тестовых приложений. В каждом из текстовых файлов должно быть по 12 строк с результатами измерений.

Кроме того, в архиве с комплектом(-ами) результатов должен содержаться текстовый файл ReadMe.txt с информацией о конфигурации тестового компьютера и условиях его эксплуатации в момент тестирования для КАЖДОГО из комплектов. Данная информация записывается в свободной форме, но должна отражать следующие параметры тестирования:

  1. Процессор: производитель, модель, тактовая частота, количество ядер, поддержка технологии HyperThreading.
  2. RAM (ОЗУ, оперативная память): объём.
  3. Тип компьютера: стационарный/нетбук/ноутбук, если портативный - то наличие/отсутствие питания от сети, режим энергопотребления.
  4. Операционная система: версия, сервис-паки.
  5. Установленное ПО: антивирус (включая режим работы при тестировании), пакеты 3D-моделирования, видеомонтажа и др. "тяжёлое" ПО. Следует также указать режим работы данных программных пакетов во время тестирования: например, режим сканирования, используемый антивирусом, и т.п.

Имя файла архива должно совпадать с именем пользователя на форуме SASecurity gr.. При необходимости отправки нескольких архивов имя айла может дополняться порядковым номером отправляемого файла с предшествующим символом нижнего подчёркивания. Например: DimonSoft_3.rar

Редактирование файлов-отчётов участниками вручную НЕДОПУСТИМО. Вероятность проникновения дезинформации минимизируется за счёт проведения большого количества измерений на большом количестве платформ с различными конфигурациями.

Порядок предоставления доступа к пакету тестовых программ

Участники тестирования выбираются организационным комитетом группы SASecurity gr. таким образом, чтобы обеспечить максимальное разнообразие программно-аппаратных платформ, принимающих участие в тестировании. Участником тестирования может быть выбран любое лицо, имеющее доступ к одному или нескольким компьютерам различных конфигураций, способное самостоятельно управлять тестовыми приложениями либо согласное предоставить имеющиеся в его/её распоряжении программно-аппаратные ресурсы для проведения эксперимента.

Соглашаясь стать участником тестирования, данное лицо принимает на себя обязательство по предоставлению максимально полной и неискажённой информации о конфигурации тестовой системы, а также результатах измерений.

Состав участников эксперимента формируется до 9 августа 2010 года включительно. Участники эксперимента получают пакет тестовых программ любым удобным для них способом и осваивают работу с тестовыми программами до начала проведения эксперимента, т.е. до 9 августа 2010 года включительно.

Все желающие провести измерения на своём компьютере, но не получившие приглашения в состав участников, получают доступ к пакету тестовых программ после проведения основного тестирования и публикации его результатов. Пакет тестовых программ вместе с исходными текстами программ будет доступен для скачивания в день публикации. Включение результатов тестирования, полученных добровольцами, в общий отчёт выполняется на основании решения членов группы SASecurity gr. и (при необходимости) состава участников, принимаемого в индивидуальном порядке.

Пакет тестовых программ поставляется «как есть», т.е. его разработчик снимает с себя ответственность за последствия его применения надлежащим или ненадлежащим образом. Разработчик также гарантирует, что в исходном коде программы отсутствует вредоносный код, а также любой другой код, способный нанести вред программному или аппаратному обеспечению тестового компьютера.

Общие сведения об эксперименте

Участники эксперимента приступают к тестированию 9 августа 2010 года.

Эксперимент является некоммерческим мероприятием и является исключительно исследовательским. Группа SASecurity gr. выступает в роли независимого сообщества аналитиков.

Результаты эксперимента подводятся на онлайн-ресурсах, а также в белорусском печатном издании «Компьютерная газета».

Краткая информация о SASecurity gr.

SASecurity gr. — независимая группа специалистов в сфере информационных технологий. Активно сотрудничает с печатными изданиями Беларуси и стран СНГ, предоставляя качественные текстовые материалы на самые разнообразные околокомпьютерные темы. Имеет контакты с рядом компаний, работающих в сфере IT, в основном связанных с вопросами информационной безопасности.

Члены группы SASecurity gr. — это граждане Беларуси, России и Украины, имеющие богатый опыт в различных сферах информационных технологий. Группа является открытым сообществом, вступление в группу осуществляется по согласованию с руководством группы на основе наличия знаний и навыков, а также достижений в той или иной сфере деятельности группы.

В 2009 — 2010 гг. группа является организатором первого в Беларуси некоммерческого фестиваля информационных технологий SAS IT Battles, не имеющего аналогов в истории Республики Беларусь. В рамках фестиваля проводится ряд бесплатных семинаров и вебинаров с представителями компаний, работающих в сфере информационной безопасности: SoftSphere Technologies, Sun Microsystems, калифорнийской Zscaler, Inc., российской антивирусной компанией ООО «Доктор Веб».

Контактная информация

По всем вопросам, касающимся проведения эксперимента, можно обращаться к следующим представителям группы:

Должность в группеОбязанности в рамках экспериментаФИОE-mail 
Руководитель группыКонтакты со СМИ, общая организацияКучук Евгений Александровичspideragent@sa-sec.orgпо общим вопросам
Заместитель руководителя группыРешение технических вопросов, подготовка текстовых материалов для СМИ; инициатор экспериментаОношко Дмитрий Евгеньевичdimonsoft@sa-sec.orgпо техническим вопросам

При обращении по e-mail форма письма свободная.

Ссылки по теме

Free Web Hosting