Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Измерение временных характеристик программ в ЭВМ IBM PC программным измерительным монитором «Sampler»

..rtf
Скачиваний:
21
Добавлен:
01.05.2014
Размер:
281.5 Кб
Скачать

2

Измерение временных характеристик программ в ЭВМ IBM PC

программным измерительным монитором Sampler.

Почему пришлось разрабатывать программный измерительный монитор (ПИМ) и чем нас не устраивал монитор фирмы Borland Turbo Profiler?.

1. Управление выполнением программ в TurboProfiler’e осуществляется по шагам (пользователь этого может не замечать). TurboProfiler интерпретирует выполнение строки, собирает статистику, запоминает её и переходит к следующей строке (и т.д).

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

3. Минимальный шаг измерения по времени - 55 мс (F =18,2 Гц) из-за использования встроенного таймера. На практике часто требуется измерение более коротких временных интервалов, т.к. время выполнения отдельных команд имеет меньшее значение.

4. Turbo Profiler некорректно работает на старших моделях IBM PC, начиная с PentiumII, из-за конфликтов при обработке прерываний.

Требования при разработке Samplera.

1. Снижение временного кванта при выполнении измерений.

2. Минимизация вносимых в выполнение программ искажений.

3. Выполнение программ естественным образом, а не по шагам и без отладочной информации.

Обоснование методики измерения времени.

На данный момент в ПИМ Sampler используются 2 варианта регистрации измерений моментов времени, соответствующих выполнению фрагментов программы.

А). Измерения проводятся через 0 канал таймера с использованием портов ввода-вывода.

Для задания временных интервалов и формирования сигналов с различными временными параметрами в компьютерах IBM PC используется программируемый таймер 8253. Таймер работает независимо от процессора и считает реальное время. Формирование времени суток в компьютерах IBM PC можно пояснить схемой, показанной на рис.1. Микросхема таймера имеет три канала, основным из которых с точки зрения измерения времени, является канал 0. Импульсы с частотой 1.19 МГц с системных частот поступают на микросхему таймера, где происходит деление частоты на 64 К и на выходе канала 0 мы получаем импульсы с частотой 18,2 Гц ( с периодом следования 55 мс). Эти импульсы поступают на контроллер прерываний в виде запроса аппаратного прерывания на уровне 0 и, если разрешены прерывания, вырабатывается сигнал INT8. В результате обработки прерывания INT8 накапливаются данные в двойном слове с адресом 0040:006Сh, расположенном в области данных BIOS. В результате обработки этого слова получаем время суток, которое индицируется ЭВМ.

Более подробно возможность измерения временных характеристик программ с использованием микросхемы таймера можно пояснить с помощью рис.2.

IRQ0

Рис.1

Рис.2

Микросхема таймера содержит три канала с адресами 40h, 41h, 42h. Каждый канал содержит три регистра, два из которых 2-х байтные - задвижка и счетчик и один - однобайтный - регистр ввода-вывода. Регистр ввода-вывода связан шиной с аккумулятором (регистром процессора AL) для считывания информации.

Канал 0 таймера выполняет две функции

1. Осуществляет контроль времени суток

2. Синхронизирует дисковые операции (запись и считывание информации с магнитных носителей).

Если изменять заносимые в счетчик данные (не 0FFFF, а другие числа), то можно увеличить частоту выдачи импульсов на выходе таймера, но при этом будут наблюдаться сбои при выполнении дисковых операций.

Канал 1 таймера обеспечивает прямой доступ к памяти (DMA).

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

Управление работой таймера осуществляется регистром команд по адресу 43h.

Структура команд порта по адресу 43h

Канал

7 - 6

Операция

5 - 4

Режим

3-1

0

0 - бит указывает какая система счисления используется - двоичная или BCD - или двоично-кодированная десятичная.

Биты 1 - 3 задают режим работы таймера

  • 000 - запись данных счетчика в задвижку

  • 011 - выполнение основных операций по считыванию информации канала 0 и других каналов и подсчета поступивших импульсов.

Биты 4 - 5 определяют возможные операции

  • 00 - передача данных из счетчика в задвижку или наоборот

  • 01 - чтение или запись старшего байта

  • 10 - чтение или запись младшего байта

  • 11 - чтение или запись последовательно младшего и старшего байтов.

При снятии измерений данные обнуляются. Регистр задвижки загружается кодом (0FFFFh), который потом перемещается в счетчик. Счетчик считает поступающие тактовые импульсы в убывающем порядке. После того как счетчик обнулится, вырабатывается сигнал контроллера прерывания INT-8. Содержимое счетчика переместиь в задвижку, считать его в аккумулятор AL. После этого восстановить содержимое задвижки и продолжить работу. Т.К. счетчик считает в обратном направлении, то при его загрузке и при считывании надо брать дополнение до FFFFFh. Интервал времени в 1/18.2 сек (55 мс) получил название “тик”, аппаратно-программно получаемый интервал равный 1/FFFF “тика” получил название “минитик” = 0.84 мкс.

Напишем процедуру однократного измерения времени с помощью канала 0.

Измерение состоит из двух частей DX : AX.

DX - младшее слово (измерение времени в минитиках)

AX - старшее слово из ячейки памяти 0040: 006Ch - время суток.(В тиках - 55 мс.).

Все двойное слово - 1 час времени, что в большинстве случаев вполне достаточно.

TIM_MEAS PROC - Название процедуры.

PUSH

BX,

;

Сохранение изменяемого регистра

; читаем содержимое счетчика в ВХ

XOR

AL,

AL;

0-канал копируем в счетчик содержимое задвижки

OUT

43h,

AL;

MOV

AL,

00110110 B;

(36h) Загрузка аккумулятора кодом

OUT

43h,

AL;

Чтение содержимого задвижки

IN

AL,

40h;

Младший байт

MOV

AL,

AL;

IN

AL,

40h

Старший байт

MOV

BH,

AL;

Восстанавливаем задвижку

MOV

AL;

36h;

OUT

43h,

AL;

MOV

AL,

0FFh;

OUT

40h,

AL;

OUT

40h,

AL;

;Читаем отсчет времени суток (40:06Ch)в DX

PUSH

ES

MOV

AX,

40h;

MOV

ES,

AX;

MOV

DX,

[ES: 06Ch];

POP

ES;

Формируем измерение в АХ

MOV

AX,

0FFFFh;

SUB

AX,

BX;

POP

BX;

RET

TIME_MEAS END PROC

Таким образом, можно считать, что наиболее точное и полное значение промежутков времени можно получить, используя совместно значение переменной области данных BIOS (0040:006С) и внутреннего счетчика таймера. Это позволяет измерять промежутки времени длительностью от 0,84 мсек и (без использования каких-либо коррекций на переход через сутки) до 24 часов.

Достроинства:

- возможность применения практически на машинах любого класса.

Недостатки:

- низкая точность измерений;

- большая погрешность функций измерений, обусловленная медленными методами снятия их результатов (ввод-вывод осуществляется через порты)

Б). Измерения для старших моделей, начиная с Pentium, проводятся через счетчик Time Stamp Counter.

У Pentium есть внутренний, 64 битный таймер, который может быть прочитан в EDX:EAX при использовании инструкции RDTSC (Read Time Stamp Counter). Каждый такт этот счетчик увеличивает свое значение на 1. Это очень полезно для замера точного количества тактов, потребовавшихся на исполнение части кода.

К сожалению, имеются некоторые проблемы чтения содержимого счетчика Time Stamp Counter. В Pentium добавлен внутренний регистр CR4, флаг TSD которого управляет возможностью чтения счетчика Time Stamp Counter. При CR4.TSD, равном 0, читать счетчик можно в любом случае. При CR4.TSD равном 1 содержимое счетчика можно прочитать только на 0 уровне привелегий. В общем случае флаг CR4.TSD установлен. Поэтому, инструкция RDTSC не может выполняться в режиме виртуального 8086 (3-й уровень привилегий).

При использовании EMM386 или Windows процессор находится в защищенном режиме и Dos - приложения типа Sampler запускаются в виртуальном режиме и имеют 3 уровень привелегий. Поэтому, если запускать программу под DOS, необходимо закомментировать EMM386 (или любой друго менеджер памяти) в CONFIG.SYS и не запускать программу в режиме DOS из под Windows.

Достроинства данного способа измерений:

- высокая точность измерений (до 1 такта).

- малая погрешность функций измерений:

- требуется только команда RDTSC и сохранение EAX:EDX (20-30 тактов)

Недостатки:

- возможность применения только на машинах класса Pentium и выше.

- возможность полноценной работы только под DOS и в отсутствие драйверов памяти типа EMM386 (QEMM).

Процесс измерения с помощью ПИМ Sampler состоит из этапов

1. Ручная расстановка контрольных точек (КТ).

2. Инициализация и калибровка монитора (для минимизации искажений вносимых в измерения).

3. Выполнение программы под управлением монитора со снятием замеров в КТ.

4. Формирование отчета о выполнении измерений в виде таблицы и в графической форме.

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

Временная диаграмма снятия замера в КТ.

1 - вход в функцию

2 - замер времени t1

3 - передача управления монитору, снятие отсчета t1 и фиксация места в программе, где производится измерение

4 - замер времени t2

5 - выход из функции и возврат в программу.

Как видно из диаграммы, общая картина времени выполнения программы искажается на время выполнения функции контрольных точек. Также невозможно заранее предсказать длительность участка 3. Это следует из того, что получив управление, монитор выполняет операции различной длительности. Участки 1, 2, 4 и 5 не содержат ветвлений, имеют фиксированную длительность и могут быть измерены заранее (причем, 2 = 4).

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

T0 = 1+ 2+ 3+4 + 5 = 1+ 2 +( t2 - t1 -4 ) + 4 + 5 = 1+ 2 +5 +( t2 - t1 )

В полученном соотношении участвуют только компоненты фиксированной длительности, а также значения t2 и t1. Интервал времени, равный сумме 1+ 2 +5 следует считать временем коррекции функции контрольных точек или просто временем коррекции. Время коррекции можно определить путем калибровки монитора.

tпр = t1k+1 - t2k - (1+2+5)

tпр - интервал времени, который прошел в программе между соседними измерениями.

Диаграмма калибровки монитора.

Выполнив 2 измерения подряд, мы можем определить расходы на передачу значений измерений (T2 - T1). Далее проведем последовательность измерений T3 - T4. Из справедливости равенства

1+ 2+ 3+4 + 5 = (T3 - T4) - (T2 - T1)

вытекает выражение для определения времени коррекции

tкорр= 1 + 2 + 5 = [T4 - T3] - (t2 - t1) + [T2 - T1]

Один раз определив время коррекции, в дальнейшем можно многократно его использовать для уточнения полученных результатов измерения путем калибровки самого ПИМ. Рассмотренный случай является идеализированным. На практике имеется еще ряд факторов, влияющих на результаты измерения. Если автоматически точно подобрать время коррекции не удается (это видно по большим значениям измерений времени для коротких фрагментов программы, если время коррекции недостаточно, либо по большому количеству нулевых отсчетов, если время коррекции слишком велико ), то следует подобрать подходящее время коррекции ручным способом. Коррекция ошибки измерения времени исполнения программы осуществляется в “минитиках”

ПИМ. Sampler имеет разные функции фиксации КТ при использовании программ на разных языках Ассемблере, Паскале, Си. В Паскале при расстановке КТ необходимо указывать номер КТ и имя файла. В Си эта процедура проще. При выполнении лабораторных работ необходимо сравнить результаты полученные при профилировании на ПИМ TurboProfiler и на ПИМ Sampler, результаты не должны сильно различаться.