litceysel.ru
добавить свой файл
  1 ... 2 3 4 5 6 7 8

4. Тестирование

4.1. Перечень проводимых экспериментов

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

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

4.2. Область применимости

Проведено первичное тестирование профайлеров, которое определяло область применимости каждого из них.

4.2.1. Результат

Ниже приведена таблица результатов тестирования области применимости профайлеров:




Intel VTune

AMD CodeAnalyst

AQTime

Метод подсчета инструкций

Процессоры Intel

Все функции доступны

Функциональность частично ограничена

Все функции доступны

Функциональность не зависит от версии и модели процессора

Процессоры AMD

Профайлинг недоступен

Все функции доступны

Все функции доступны


Единицы измерения производительности

unhalted cycles

CPU clocks,

Timer samples

секунды

сумма взвешенных инструкций

4.2.2. Комментарии к результатам

Как упоминалось ранее, профайлер Intel VTune не работает корректно на процессорах фирмы AMD. Действительно, проведя запуск на элементарной программе, можно в этом убедиться: при любых конфигурациях профайлер выдает сообщение об ошибке «The CPU architecture can't be identified properly; data collection is not available» (осуществлялась проверка версии 9.1 на процессоре AMD Turion 64 TL-60).

И наоборот, профайлер AMD CodeAnalyst на процессорах семейства Intel имеет ограниченную функциональность [8]. Большая часть функциональности недоступна. Одна из функций, которая продолжает работать это Time-Based Sampling. Этого нам будет достаточно, чтобы осуществлять тестирование.

Рассмотрим единицы измерения, которыми оперируют соответствующие профайлеры. AQTime в этом отношении выглядят более привлекательно, чем Intel VTune и AMD CodeAnalyst, потому что заявляемые секунды это более естественная величина, чем CPU clock и unhalted cycles. Естественные величины – секунды или другие единицы, строго пропорциональные им, хороши тем, что именно их стремятся уменьшить в процессе оптимизации приложения.

4.3. Порядок проведения экспериментов

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

Каждый эксперимент проводится несколько раз. Это нужно для того, чтобы для каждой неровности в графике знать, является ли это некоторым “шумом” многозадачной системы или какой-то особенностью работы процессора, памяти, операционной системы или других факторов. Многократные замеры и усреднения позволят сгладить получаемые графики измерений.


4.4. Единые единицы измерений

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

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

4.4.1. AMD CodeAnalyst. Timer Samples в миллисекунды

Из документации [3] можно узнать, что при Timer-Based профайлинге профайлером делаются замеры состояния системы через определенный интервал времени. По умолчанию, используя команду “caprofile /s”, замеры будут производиться каждые 100мкс. То есть секунда равна 10000 timer samples.

4.4.2. Intel VTune. Unhalted cycles в миллисекунды

Профайлер Intel VTune измеряет производительность методом семплирования. Основные единицы измерения профайлера Intel VTune это количество семплов для событий CPU_CLK_UNHALTED.CORE и INST_RETIRED.ANY – количество unhalted циклов процессора и количество выполненных инструкций соответственно [16]. Работать будем с первым из них.

Часто в работе процессора возникают ситуации, когда ему приходится ожидать некоторые данные извне. Это может быть обращение к оперативной памяти, чтение данных от внешних устройств. В это время процессор совершает холостые циклы. Профайлер Intel VTune не учитывает такие циклы, хотя реальное время при этом продолжает идти.

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


На самом деле этот коэффициент зависит от тактовой частоты процессора и от количества unhalted циклов на семпл. Первая величина постоянна для процессора, и ее нетрудно узнать. Вторая настраивается непосредственно в профайлере.

4.4.3. Калибровка метода подсчета инструкций

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

4.5. Эксперимент “Использование оперативной памяти”

Проведем серию экспериментов, в которых попытаемся разнообразить использование оперативной памяти. Будет три типа тестов:


  1. оперативная память минимально используется,

  2. оперативная память активно используется,

  3. неоптимальное использование оперативной памяти (многочисленные промахи кеша памяти).

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

4.5.1. Использование ”нагрузки”

Одновременно с обычными измерениями будем производить измерения с параллельно работающей “нагрузкой” – программой, которая активно использует оперативную память и процессор. Такие измерения необходимы для того, чтобы симулировать систему, на которой полноценно работают другие приложения.


4.5.2. Минимальное использование оперативной памяти

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

В качестве тестируемой программы можно выбрать программу, которой в качестве параметра передается некоторое число, и которая должна посчитать и вывести сумму от единицы до этого числа. Код программы представлен в Приложении 1 “Минимальное использование оперативной памяти”.

4.5.3. Активное использование оперативной памяти

Здесь мы будем тестировать программу, которая активно использует оперативную память.

Тестируемая программа создаст массив, который заполнится числами. Потом эти числа будут складываться в некоторой переменной. Сложение будет происходить несколько раз, количество определяется вторым постоянным параметром. Код программы представлен в Приложении 2 “Активное использование оперативной памяти”.

4.5.4. Использование оперативной памяти с частыми промахами кеша

В этой программе, как и в предыдущем тесте, будем создавать массив и производить сложение элементов, предварительно заполнив его произвольными числами. Только в этом тесте массив должен быть двумерным, и сложение будет происходить поперек выделенной памяти (внутренний цикл перебирает строчки в массиве). В этом случае промахи кеша будут происходить настолько часто, насколько это возможно. Код программы представлен в Приложении 3 “Использование оперативной памяти с частыми промахами кеша”.

4.6. Эксперимент “Предсказания ветвлений”

Вторая серия экспериментов будет относиться к предсказаниям ветвлений. Они, как и кеш памяти, вносят определенную неоднородность в процесс исполнения машинного кода.


4.6.1. Эксперимент “Вариация длины цикла”

Суть программы-теста будет такая: фиксируются N операций и разделяются на M групп по K операций (M * K = N). Программа состоит из двух вложенных циклов: внутренний цикл – K итераций, внешний – M итераций. Одна итерация вложенного цикла – одна операция.

Зафиксировав N операций и варьируя K, можно наблюдать некоторые неоднородности во времени исполнения теста. Совершенно очевидно, что они вызваны конвейерностью обработки инструкций. Ключевая инструкция в этой программе – инструкция условного перехода внутреннего цикла. Именно на ней процессор чаще всего обращается к предсказателю ветвлений. Для очень маленьких значений K процессор будет знать, что, скорее всего, повторять цикл не придется. Для больших K – скорее всего, цикл повторится. Код программы представлен в Приложении 4 “Вариация длины цикла”.

4.6.2. Эксперимент “Периодически выполняемые операции”

В этом тесте мы упростим подход и будем просто выполнять некоторые действия периодически, в нашем случае действия будут выполняться, когда некоторый счетчик будет делиться на некоторое число K, которое будет варьироваться. Поэтому программа структурно будет содержать лишь цикл и одно условие. Код программы представлен в Приложении 5 “Периодически выполняемые операции”.

4.7. Эксперимент “Потеря контекста”

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

В качестве входных данных тесту передается одно число – оно будет определять количество операций между принудительными потерями контекста. Потеря контекста будет осуществляться посредством API функции Sleep с параметром 1. Количество итераций “Операции-Sleep” фиксировано. Код программы представлен в Приложении 6 “Вынужденная потеря контекста”.


4.8. Эксперимент “Выравнивание данных”

Еще одна из проблем производительности, которая может возникать в программе – ошибка выравнивания данных [37]. Некоторые из профайлеров отслеживают такого рода проблемы.

Этот тест похож на тест “4.5.2. Активное использование оперативной памяти”. Отличие заключается в том, что четырехбайтные значения для сложения будут извлекаться из массива с шагом один байт.

Код программы представлен в Приложении 7 “Выравнивание данных”.

4.9. Эксперимент “Вызовы процедур”

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

Тест содержит в себе процедуру, которая принимает четырехбайтное число, производит с ним некоторые простые операции и возвращает получившийся результат – также четырехбайтное число. Во время исполнения этого теста процедура исполняется большое количество раз. Если перед исполнением каждой процедуры происходит выполнение вспомогательных инструкций, то исполнение программы должно несколько замедлиться. Код программы представлен в Приложении 8 “Вызовы процедур”.



<< предыдущая страница   следующая страница >>