Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с asm 
:(
    Опции темы
ChihPih
Дата 6.1.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

Репутация: нет
Всего: 22



Привет всем.
Мне нужно узнать частоту процессора. Делаю так:

Код

#define rdtsc(a,d)\
  asm("rdtsc": "=A" (a), "=d" (d));

double GetCPUFreq()
{
    unsigned long eax, edx, TimerLo, TimerHi;

    if (setpriority(PRIO_PROCESS, 0, -20) == -1){ printf("error setpriority #1\n"); }
    
    usleep(10);
    rdtsc(eax, edx);
    TimerLo = eax; TimerHi = edx;
    usleep(500);
    rdtsc(eax, edx);
    TimerLo = eax - TimerLo;

    printf("%f\n", TimerLo/(1000.0 * 500));
    
    if (setpriority(PRIO_PROCESS, 0, 0) == -1){ printf("error setpriority #2\n"); }
    return 0;
}


Но толковоко ничего не получается. Как правильно надо?


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
MAKCim
Дата 6.1.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



1.
Код

#define rdtsc(value) \
  asm("rdtsc" : "=A" (value))
...
__u64 start, stop;
rdtsc(start);
...
rdtsc(stop);

2. 0.5 мс - слишком маленький период ожидания
3. используй /sys/devices/system/cpu/cpu0/cpufreq/{cpuinfo_cur_freq, cpuinfo_min_freq, cpuinfo_max_freq}


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
ChihPih
Дата 6.1.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

Репутация: нет
Всего: 22



Цитата(MAKCim @ 6.1.2009,  22:42)
3. используй /sys/devices/system/cpu/cpu0/cpufreq/{cpuinfo_cur_freq, cpuinfo_min_freq, cpuinfo_max_freq}

3. Это не подходит, т.к. я на FreeBSD сижу.


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
ChihPih
Дата 6.1.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

Репутация: нет
Всего: 22



Сделал так:

Код

#define rdtsc(a)\
  asm("rdtsc": "=A"(a));

double GetCPUFreq()
{
    const int delay_time = 1000000;
    int64_t start, stop, freq;

    rdtsc(start);
    usleep(delay_time);
    rdtsc(stop);
    freq = stop - start;

    //printf("%d\n", freq/1000000);
        printf("%jd-MHz\n", (int64_t)freq/delay_time);
    
    return 0;
}


Результат не правильный(ошибается на 700-800 MHz), выдает 1800-1900Mhz, а у меня Athlon X2 2600 MHz.

Это сообщение отредактировал(а) ChihPih - 6.1.2009, 23:23


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
ChihPih
Дата 6.1.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

Репутация: нет
Всего: 22



Все! Разобрался, работает этот код. Просто у меня powerd был включен.


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.