[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Руководство по настройке производительности


Способы обращения к таймеру в архитектуре POWER

Примечание: Приведенная ниже информация относится только к архитектурам POWER и POWER2 (и процессору 601). Приведенная программа будет работать и в системе PowerPC, но некоторые из команд будут эмулированы. Однако цель обращения к таймеру процессора заключается в получении точной информации о времени с минимальным влиянием на скорость выполнения программы, а эмуляция снижает точность получаемых результатов.

В процессорах POWER и POWER2 есть два специализированных регистра (верхний и нижний), в которых содержится сигнал таймера с высокой точностью. В верхнем регистре содержится время в секундах, а в нижнем регистре - доли секунды, выраженные в наносекундах. Точность времени в нижнем регистре зависит определяется частотой обновления регистра и зависит от модели процессора.

Программы на ассемблере для обращения к регистрам таймера процессоров POWER

Приведенный ниже модуль на ассемблере (timer.s) содержит функции (rtc_upper и rtc_lower) для обращения к верхнему и нижнему регистрам таймера:

           .globl  .rtc_upper
.rtc_upper: mfspr   3,4         # копирование RTCU в регистр возврата
            br
 
           .globl  .rtc_lower
.rtc_lower: mfspr   3,5         # копирование RTCL в регистр возврата
            br

Функция на языке C для получения значения времени в секундах

Приведенный ниже модуль (second.c) содержит функцию на языке C, вызывающую функции timer.s для получения значений из верхнего и нижнего регистров. Эта функция возвращает значение времени в секундах в виде действительного числа с двойной точностью.

double second()
{
  int ts, tl, tu;
 
  ts = rtc_upper();     /* секунды */
  tl = rtc_lower();     /* наносекунды */
  tu = rtc_upper();     /* Проверка переноса разряда из */
  if (ts != tu)         /* нижнего регистра в верхний */
    tl = rtc_lower();   /* Возврат в исходное состояние. */
  return ( tu + (double)tl/1000000000 );
}

Функцию second() можно вызывать из программ на языке C или FORTRAN.

Примечание: Точность результата, возвращаемого программой second.c, может зависеть от того, сколько времени прошло с момента последней перезагрузки системы. Чем оно больше, тем большее количество значащих разрядов может быть потрачено на представление целой части времени в секундах. Способ, описанный в первой части данного приложения, позволяет обойти эту проблему путем вычисления разности двух значений времени до преобразования в формат с плавающей точкой.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]