2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 C/C++. Измерение времени работы кода с точностью до такта.
Сообщение01.10.2011, 16:07 
Заслуженный участник
Аватара пользователя


28/07/09
1178
Здравствуйте! С/С++, компилятор GCC (ubuntu 11.04). Требуется измерить время работы участка кода средствами самого языка. Функция clock_t clock(void) из библиотеки <time.h> не подходит ввиду слишком малой точности. Насколько мне удалось установить из опыта, точность измерения не превышает 10000 тактов, т.е. на достаточно быстрых программах она выдает просто 0. Также значения функции clock кратны 10000. Нужен другой способ.
Знаю, что ассемблерные вставки позволяют измерить время с точностью до одного такта (и даже как-то сам писал подобную программу на семинаре), но сейчас написать самому не получилось (уровень владения asm почти нулевой). Кто-нибудь подскажет, как это сделать? И еще такой вопрос. Возможно ли измерить количество тактов, потраченных процессором именно на эту программу, а не на всю систему в целом за время выполнения программы? Ведь планировщик не стоит на месте, и процессор занят не только моей программой, но и множеством других. Может быть нужно как-то повысить приоритет процесса, чтобы процессор был занят только им? И как это сделать?
Спасибо.

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение01.10.2011, 17:51 
Аватара пользователя


31/10/08
1244
Мне тут недавно порекомендовали.
Performance Application Programming Interface
Может и вам подойдёт.
А вообще для анализа кода есть огромное количество разношёрстного инструмента.
http://en.wikipedia.org/wiki/List_of_performance_analysis_tools

По поводу ассемблера достаточно выполнить команду
RDTSC
Она вернёт EDX:EAX-число тактов с момента запуска. Такты считаются счётчиком который связан с частотой соизмеримой с частотой процессора.
В многоядерных системах на разных ядрах будут разные показания, а могут быть и одинаковые.
В любом случае поведение зависит от процессора.

Цитата:
И еще такой вопрос. Возможно ли измерить количество тактов, потраченных процессором именно на эту программу, а не на всю систему в целом за время выполнения программы? Ведь планировщик не стоит на месте, и процессор занят не только моей программой, но и множеством других. Может быть нужно как-то повысить приоритет процесса, чтобы процессор был занят только им? И как это сделать?

Советую всё-таки обратить внимание на wiki. Ну можно приоритет поднять. Только вот всё равно большинство ОС не являются ОС РВ и ОС ЖРВ.

Цитата:
точность измерения не превышает 10000 тактов, т.е. на достаточно быстрых программах она выдает просто 0. Также значения функции clock кратны 10000.
Есть поговорка про танцора.
Делаешь свой код в цикле. А вообще наверно надо почитать книжке по метрологии (наука об измерениях).

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение01.10.2011, 18:12 
Заслуженный участник
Аватара пользователя


07/01/10
2015
В man clock_getcpuclockid есть пример (измеряется время, затраченное процессором на процесс).

Но смысла в этом особого нет. Точность больше миллисекунды излишня: тут уже сказываются случайные факторы и время выполнения самого участка измерения времени (а до миллисекунд время измеряет bash'евская команда time; есть ещё GNU time, которую (наверное) можно использовать и под виндовсами). Лучше выполнить тестируемый участок много-много раз. А если вам всё это нужно для оценки оптимизированности участка кода, то не стоит забывать про правило 90/10: 10% кода выполняются 90% времени; оптимизировать нужно на уровне алгоритмов, а низкоуровневая оптимизация была важна только во времена килогерцных процессоров.

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение01.10.2011, 19:21 
Аватара пользователя


31/10/08
1244
caxap
Точность до такта позволяет определить нижнюю границу оптимизации.
Цитата:
а низкоуровневая оптимизация была важна только во времена килогерцных процессоров

Не согласен. До сих пор важна. Во-первых, важна там где задачи должны работать в реальном времени.

Во-вторых по моей теории информации. Она ещё важна. Дело в том что если на 1Гц обрабатывались простые данные: конечные счётные, или же одномерные. То сейчас мы находимся на стадии когда развитее информации от одномерных данных перешло к изображениям и видео информации, а это простите второе и третье измерения. А процессоры способны обрабатывать только 2D информацию с приемлемой скоростью. А видео карты 3D но тоже ели-ели.
Тем более ждать 15 минут или 1 минуту разница есть. К примеру БПФ от картинке столько занимает. Оптимизированная на низком уровне библиотека такая как FFTW даёт 50 кратный прирост(цифра с сайта FFTW).

Причём часто 1D данные пишутся час или несколько. А тут гигабайты данных.

По поводу алгоритмов согласен. Изменив алгоритм можно поднять скорость очень существенно причём при такой оптимизации зачастую меняется асимптотика.

Кстати. Есть такая вещь как блочные алгоритмы. Применяются много где. Прирост осуществляется за счёт более рационального использования кэша. Так что такая оптимизация на стыке с одной стороны она алгоритмическая с другой стороны низкоуровневая.

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение03.10.2011, 21:27 


30/12/09
95
clock_gettime(CLOCK_MONOTONIC) дает вам с точностью до наносекунд

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение20.10.2011, 16:54 
Заслуженный участник
Аватара пользователя


28/07/09
1178
Спасибо всем, всё прочитал!
Решение оказалось таким:
Используется синтаксис C
 #include <stdint.h>
 extern __inline__ uint64_t rdtsc() {
   uint64_t x;
  __asm__ volatile ("rdtsc\n\tshl $32, %%rdx\n\tor %%rdx, %%rax" : "=a" (x) : : "rdx");
   return x;
 }
 

Источник - Wikipedia

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение20.10.2011, 17:56 
Заблокирован


20/07/11

169
Legioner93 в сообщении #494506 писал(а):
Источник - Wikipedia

С проблемами использования не сталкивались?

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение20.10.2011, 23:10 
Заслуженный участник
Аватара пользователя


28/07/09
1178
С Википедией вообще или с данным примером? Не понимаю, в чём вопрос. Если бы код не работал, я бы его сюда не написал.

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение20.10.2011, 23:25 
Заблокирован


20/07/11

169
Legioner93 в сообщении #494641 писал(а):
С Википедией вообще или с данным примером? Не понимаю, в чём вопрос. Если бы код не работал, я бы его сюда не написал.

Дело в том, правильно ли он работает (процессор и не только (например, ось) - штуки хитрые): тесты (лучше ассемблерные, т.к. в этом случае число тактов легко на пальцах посчитать, используя справочные данные производителя процессора) пропускали?

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение21.10.2011, 01:10 
Заслуженный участник
Аватара пользователя


28/07/09
1178
А, вы это имеете ввиду. Нет, таких тестов я не приводил.

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение21.10.2011, 12:58 
Заслуженный участник


11/05/08
32166
А можно ли в принципе отследить количество тактов по таймеру?... Это хорошо было, когда была DOS; современные же ОС -- они мультизадачные, притом шибко мультизадачные.

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение21.10.2011, 22:32 
Заслуженный участник
Аватара пользователя


28/07/09
1178
Можно искусственно повысить приоритет процесса в планировщике.

 Профиль  
                  
 
 Re: C/C++. Измерение времени работы кода с точностью до такта.
Сообщение21.10.2011, 23:05 
Заслуженный участник
Аватара пользователя


07/01/10
2015
Legioner93 в сообщении #494932 писал(а):
Можно искусственно повысить приоритет процесса в планировщике.

И при этом гнаться за точностью до такта...

(Кстати, POSIX'ная clock_gettime измеряет именно время, затраченное процессором на определённый процесс.)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group