Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
0 / 0 / 1
Регистрация: 30.07.2013
Сообщений: 3
1

Таймер для замера времени выполнения операции на основе hpet

30.07.2013, 18:00. Показов 3467. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Собственно, необходимо вычислить временной интервал выполнения некоторой функции. Основное требование - максимальная точность.
Посоветовали использовать HPET. Поискав нашел всего один пример использования HPET, ну и собственно спецификации.
Разобраться с использованием таймеров HPET в Linux никак не получается, поэтому прошу вашей помощи.


Пример найденный мной
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>
#include <time.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/time.h>
#include <linux/hpet.h>
 
extern void hpet_fasync(int, const char **);
 
#include <sys/poll.h>
#include <sys/ioctl.h>
#include <signal.h>
 
 
int main(int argc, const char ** argv)
{
 
    argc--;
    argv++;
 
    if (!argc) {
        fprintf(stderr, "-hpet: requires command\n");
        return -1;
    }
 
    hpet_fasync(argc, argv);
 
    return 0;
}
 
static int hpet_sigio_count;
 
static void hpet_sigio(int val)
{
    fprintf(stderr, "hpet_sigio: called\n");
    hpet_sigio_count++;
}
 
void hpet_fasync(int argc, const char **argv)
{
    unsigned long       freq;
    int         iterations, i, fd, value;
    sig_t           oldsig;
    struct hpet_info    info;
 
    hpet_sigio_count = 0;
    fd = -1;
    
    oldsig = signal(SIGIO, hpet_sigio);
    
    if (oldsig == SIG_ERR) {
        fprintf(stderr, "hpet_fasync: failed to set signal handler\n");
        return;
    }
 
    fd = open(argv[0], O_RDONLY);
 
    if (fd < 0) {
        fprintf(stderr, "hpet_fasync: failed to open %s\n", argv[0]);
        return;
    }
 
 
    if ((fcntl(fd, F_SETOWN, getpid()) == 1) ||
        ((value = fcntl(fd, F_GETFL)) == 1) ||
        (fcntl(fd, F_SETFL, value | O_ASYNC) == 1)) {
        fprintf(stderr, "hpet_fasync: fcntl failed\n");
        goto out;
    }
 
    freq = atoi(argv[1]);
    iterations = atoi(argv[2]);
 
    if (ioctl(fd, HPET_IRQFREQ, freq) < 0) {
        fprintf(stderr, "hpet_fasync: HPET_IRQFREQ failed\n");
        goto out;
    }
 
    if (ioctl(fd, HPET_INFO, &info) < 0) {
        fprintf(stderr, "hpet_fasync: failed to get info\n");
        goto out;
    }
 
    fprintf(stderr, "hpet_fasync: info.hi_flags 0x%lx\n", info.hi_flags);
 
    if (info.hi_flags && (ioctl(fd, HPET_EPI, 0) < 0)) {
        fprintf(stderr, "hpet_fasync: HPET_EPI failed\n");
        goto out;
    }
 
    if (ioctl(fd, HPET_IE_ON, 0) < 0) {
        fprintf(stderr, "hpet_fasync, HPET_IE_ON failed\n");
        goto out;
    }
 
    for (i = 0; i < iterations; i++) {
        (void) pause();
    //  fprintf(stderr, "hpet_fasync: count = %d\n", hpet_sigio_count);
    }
 
out:
    fprintf(stderr, "hpet_fasync: count = %d\n", hpet_sigio_count);
    signal(SIGIO, oldsig);
 
    if (fd >= 0)
        close(fd);
 
    return;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2013, 18:00
Ответы с готовыми решениями:

Использовать таймер для замера времени работы программы
Нужно сделать таймер для проги. Чтобы зафиксировать за какой период прога обработала инфу. Как...

Программа для замера времени выполнения запроса
Я тут прогу написал, она замеряет время выполнения SQL...Вроде работает, но то ли время она выдает?...

API для замера времени на VB.
Тут на сайте когдато был примерчик замеров времени на VB через API. Скачал ... но сейчас к...

Точное измерние времени выполнения операции
Подскажите как точно измерить время выполнения некоторой операции. С точностью ~1..10 ms Заранее...

2
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
03.08.2013, 09:55 2
Тут хороший пример: http://aufather.wordpress.com/... -in-linux/
Используешь как-то так:
C++
1
2
3
4
5
6
7
8
9
    timespec ts0, ts1, *pts;
    InitRdtsc();
    GetRdtscTime( &ts0 );
    ...
    func_to_measure();
    ...
    GetRdtscTime( &ts1 );
    pts = TimeSpecDiff( &ts1, &ts0 );
    ...
Добавлено через 3 минуты
P.S.: https://github.com/petersenna/rdtscbench
0
0 / 0 / 1
Регистрация: 30.07.2013
Сообщений: 3
16.08.2013, 17:01  [ТС] 3
Спасибо за помощь, но реализовал я это несколько по другому.
Если кому будет интересно, вот моя реялизация на Си под Linux:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
#include <unistd.h>
#include <stdint.h> 
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <inttypes.h>
#include <time.h>
#include <math.h>
 
uint64_t time_in_fsec;
uint64_t *hpet_mmap_addr = 0;
uint64_t fsec_in_tick = 0;
int hpet_fd;
 
extern int hpet_open() {
    
    int offset = 0xf0, 
        pg_offset,
        length = 0x3ff, 
        m_length;
        
        
    pg_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
    m_length = length + offset - pg_offset;
    
    hpet_fd = open("/dev/hpet", O_RDONLY);
    if (hpet_fd < 0) { 
        perror("hpet_open()->open()");
        return 1;
    }
 
    hpet_mmap_addr = (uint64_t *) mmap(NULL, m_length, PROT_READ, MAP_SHARED, hpet_fd, pg_offset);
    if (hpet_mmap_addr < 0) {
        perror("hpet_open()->mmap()");
        return 1;
    }
    
    fsec_in_tick = *hpet_mmap_addr >> 32;                       
    hpet_mmap_addr = (uint64_t *)((uint64_t)hpet_mmap_addr + offset);
    
    time_in_fsec = *hpet_mmap_addr * fsec_in_tick;
    
    return 0;
}
 
extern int hpet_close() {
    
    int offset = 0xf0, 
        pg_offset,
        length = 0x3ff, 
        m_length;
        
    pg_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
    m_length = length + offset - pg_offset;
 
    munmap(hpet_mmap_addr, m_length); 
    close(hpet_fd); 
    
    return 0;
}
 
extern int hpet_gettime(struct timespec *ts) {
 
    struct timespec t;
 
    t.tv_sec = time_in_fsec / 1000000000000000;
    t.tv_nsec = (time_in_fsec % 1000000000000000) / 1000000;
    
    *ts = t;
 
    return 0;
}

это предварительный вариант, которвый требует доработки... но работает))))
0
16.08.2013, 17:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2013, 17:01
Помогаю со студенческими работами здесь

Определение среднего времени выполнения обобщенной элементарной операции методом тестовых прогонов
Нужно написать две программы и определить время выполнения операторов и/или операций), которые...

Как собрать данные о времени выполнения технической операции при проведении эксперимента Монте-Карло
Подскажите как собрать все данные по времени выполнения технической операции в модели при...

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

Что изучить для выполнения ТЗ(в основе анализ скриншота)
Добрый день, уважаемые гуру! Подскажите пожалуйста, какую литературу и статьи/темы форума, мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru