zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
1

Замер количества тактов исполнения через rdtsc()

14.10.2014, 16:49. Показов 9656. Ответов 11
Метки нет (Все метки)

по идее rdtsc(); выдает кол-во тактов, т.е. т2-т1 выдаст затраченное кол-во тактов на том или ином участке кода, но ...
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
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <limits>
typedef unsigned long long ull;
 
inline ull rdtsc()
{
    unsigned int lo, hi;
    asm volatile ( "rdtsc\n" : "=a" (lo), "=d" (hi) );
    return ((ull)hi << 32) | lo;
}
using namespace std;
int main()
{
    int f=1;
    ull t1 = rdtsc();
    f+=5; // 33
    ull t2 = rdtsc();
    printf("%lld\n%lld\n%lld\n",t1 ,t2 , t2 - t1);
    t1 = rdtsc();
    //cout<<f; // тоже 33
    t2 = rdtsc();
    printf("%lld\n%lld\n%lld\n",t1 ,t2 , t2 - t1);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2014, 16:49
Ответы с готовыми решениями:

RDTSC или как замерять количество тактов CPU на некоторые вычисления?
пока мерю так. но что-то мне подсказывает 677 тактов на вычисление простой длины вектора слишком...

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

Неверный вывод количества тактов
template&lt;typename iterator&gt; std::pair&lt;int, std::pair&lt;iterator, iterator&gt;&gt;...

Необходим подсчёт количества тактов в сети фейстеля
дан исходник http://file.qip.ru/file/Rc7F-xO9/jetcrypt.html нужно посчитать количество тактов в...

11
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
14.10.2014, 18:13 2
Так в чём проблема-то? Какие результаты получаются?
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
14.10.2014, 18:17  [ТС] 3
Цитата Сообщение от nmcf Посмотреть сообщение
Так в чём проблема-то? Какие результаты получаются?
я написал там - 33 в обоих случаях, хотя это странно
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
14.10.2014, 21:13 4
Что, всегда 33? А если побольше операций между замерами поставить?
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
14.10.2014, 23:53  [ТС] 5
Цитата Сообщение от nmcf Посмотреть сообщение
Что, всегда 33? А если побольше операций между замерами поставить?
если ставлю поток - к примеру cout<<".."; то меняется на пару десятков тысяч, а в др вариантах нету эффекта ..
0
6042 / 2157 / 753
Регистрация: 10.12.2010
Сообщений: 6,007
Записей в блоге: 3
15.10.2014, 10:11 6
dzrkot, если я вас правильно понял, то вам непонятно почему число тактов на первом и втором участке совпадает и на втором оно != 0?

Добавлено через 15 минут
Я вам предлагаю попробовать учесть еще число тактов, затрачиваемое на непосредственно вызов rdtsc. Попробуйте как-то так обыграть:
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
#include <iostream>
#include <intrin.h>
 
#pragma intrinsic(__rdtsc)
 
void Command1(void)
{
  int a = 4;
  for(int i = 0; i < 14; i++) a += i;
}
 
int Command2(void)
{
  int a = 4;
  int b = a + 2;
  return b;
}
 
int main()
{
    unsigned __int64 a, b, delta, res;
    int k = 0;
    int l = 0;
 
    a = __rdtsc();
    delta = __rdtsc() - a;
    a = __rdtsc();
    Command1();
    b = __rdtsc();
    if (b - a >= delta)
    {
      res = b - a - delta;
    }
    else 
    {
      res = b - a;
    }
    std::cout<<"Tacts of execution: "<<res<<std::endl;
 
    a = __rdtsc();
    delta = __rdtsc() - a;
    a = __rdtsc();
    //Command2();
    k = 1;
    b = __rdtsc();
    if (b - a >= delta) 
    {
      res = b - a - delta;
    }
    else
    {
      res = b - a;    
    }
    std::cout<<"Tacts of execution: "<<res<<std::endl;
    return 0;
}
Добавлено через 4 минуты
Еще по ходу пишут, что для точности надо калибровать дельту на интервале в 50 тактов, а потом уже с ней считать.
1
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
15.10.2014, 12:39  [ТС] 7
Цитата Сообщение от HighPredator Посмотреть сообщение
dzrkot, если я вас правильно понял, то вам непонятно почему число тактов на первом и втором участке совпадает и на втором оно != 0?
больше интересует почему на 1ом участке чтобы я ни добавлял - результат неизменен
0
6042 / 2157 / 753
Регистрация: 10.12.2010
Сообщений: 6,007
Записей в блоге: 3
15.10.2014, 13:10 8
Цитата Сообщение от dzrkot Посмотреть сообщение
больше интересует почему на 1ом участке чтобы я ни добавлял - результат неизменен
К сожалению не могу вам ответить на этот вопрос поскольку я измерял по-другому. И к тому же я почти не разбираюсь в таких вещах на уровне процессора и прочего. Могу только включить голову, если вы пришлете пару кейсов с совпадающими у вас результатами.
0
Ушел с форума
Эксперт С++
16449 / 7413 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
15.10.2014, 20:07 9
Цитата Сообщение от dzrkot Посмотреть сообщение
C++
1
2
3
4
int f=1;
ull t1 = rdtsc();
f+=5; // 33
ull t2 = rdtsc();
А что мешает компилятору сразу вычислить f ?
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
15.10.2014, 20:15  [ТС] 10
Цитата Сообщение от Убежденный Посмотреть сообщение
А что мешает компилятору сразу вычислить f ?
а как ему помешать сразу вычислить f? допустим мне необходимо узнать сколько тактов этот займёт ...
0
Ушел с форума
Эксперт С++
16449 / 7413 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
15.10.2014, 20:38 11
Помешать-то можно - volatile, _ReadWriteBarrier, pragma optimize off и т.п.
Но ведь и код после этого изменится. Для таких экспериментов лучше
сразу использовать ассемблер.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
15.10.2014, 21:56 12
Убеждённый ещё не сказал про многозадачные ОС типа Windows, в которых rdtsc нельзя полностью доверять.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2014, 21:56
Помогаю со студенческими работами здесь

Сколько будет всех бактерий через k тактов времени?
Имеется n бактерий красного цвета. Через 1 такт времени красная бактерия меняется на зелёную, затем...

Замер времени работы функции через clock()
Имеется некая функция, требуется замерить время её выполнения. Накидал такой код : #include...

Через случайное количество тактов движения изменять направление движения
Помогите пожалуйста. Движение вдоль периметра экрана. Через случайное количество тактов движения...

Выбрать продолжение исполнения сценария через диалоговое окно
Никак не могу решить проблему! Проблема в вставке в область &quot;Спрашиваем об объеме копируемых...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru