Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отмерить кол-во тактов, затраченных на выполнение 
V
    Опции темы
Rickert
Дата 29.4.2007, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Как отмерить кол-во тактов процессора, которые потребовались на выполнение функции или блока кода?
Можно конкретно под VS


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
W4FhLF
Дата 29.4.2007, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



Код

int main(int argc, char* argv[]) 
{

    unsigned __int64 a, result;
    int b = 2;

    __asm {
        push eax
        push edx
        push esi

        lea esi,a
        rdtsc
        mov [esi],eax
        mov [esi+4],edx

        pop esi
        pop edx
        pop eax
    };
    for (int i = 0; i < 1000000000; i++)
        b = b << 2 ^ i >> 4;
    __asm {
        push eax
        push edx
        push esi
        push edi

        rdtsc
        lea esi,a
        sub eax,[esi]
        lea edi,result
        mov [edi],eax
        sbb edx,[esi+4]
        mov [edi+4],edx
        
        pop edi
        pop esi
        pop edx
        pop eax
    };

    char ch;
    std::cin >> ch;
    return 0; 
}


Ну тут ещё под будет погрешность в кол-во тиков, которые занимают вот эти команды:

Код

...
        mov [esi],eax
        mov [esi+4],edx

        pop esi
        pop edx
        pop eax
...
...
        push eax
        push edx
        push esi
        push edi
...


Можешь отдельно посчитать за сколько тиков они выполняются и искусственно отнимать это значение.

Это сообщение отредактировал(а) W4FhLF - 29.4.2007, 09:11


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
MAKCim
Дата 29.4.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



конкретно на ассемблере
Код

    rdtsc
    mov ecx, eax
...
    rdtsc
    sub eax, ecx ; eax contains count of CPU's clock ticks

в WinAPI есть по-моему функции
QueryPerformanceCounter(), GetTicksCount()

Добавлено через 1 минуту и 24 секунды
W4FhLF
зачем так сложно?


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

PM MAIL   Вверх
W4FhLF
Дата 29.4.2007, 09:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



MAKCim, что именно тебе показалось сложным? rdtsc читает 64х разрядный счётчик из MSR10h и возвращает его в edx:eax, поэтому если между вызовами rdtsc проходит больше FFFFFFFFh тиков("тактов"), твой код работает неправильно. 

Это сообщение отредактировал(а) W4FhLF - 29.4.2007, 09:24


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GremlinProg
Дата 29.4.2007, 10:44 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



rdtsc и QueryPerformanceCounter() - это одно и то же. Одна проблема у них, не считают они время ядра, обе возвращают только время вне ядра(пользовательское). Чтобы посчитать фактическое время выполнения любого кода, нужно использовать функцию GetTicksCount, но она вернет сразу количество милисекунд, т.е., чтобы перевести в тики, нужно получить текущую частоту перфоманс-счетчика(QueryPerformanceFrequency/1000) и умножить на неё, полученное время, и то, это будет не точным значением, но позволит замерить относительную производительность. Частоту делим на 1000, чтобы получить число тиков в милисекунду.

Добавлено через 9 минут и 5 секунд
кстати, если кто-то сомневается, вызовите Sleep на пару секунд внутри блока замера. При слипе происходит переключение задач, все время, которое уходит на слип - это время работы ядра, а не программы, оно учтено не будет. Это простой пример. В основе любой программы время ядра распределено по-разному, поэтому мерить его необходимо тоже.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
W4FhLF
Дата 29.4.2007, 11:08 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



GremlinProg, что за бред ты несёшь? Ботай умные книги и впредь не неси такой ахинеи. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GremlinProg
Дата 29.4.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Во первых, за бред ты уже получил минус, во вторых, ближе к сути.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
W4FhLF
Дата 29.4.2007, 11:36 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



GremlinProg, хаха... Парень, ну если ты так в себе самоуверен, хотя не понимаешь элементарных вещей, то я даже не знаю с чего начать... В каждом твоём утверждении есть ошибки, причём настолько глупые, что зная ты то, что знаю, посмеялся бы над ними вместе со мной. Я думаю рейтинг мой тебе лучше исправить, а сообщение своё удалить, автора темы оно только запутает и никакой пользы не принесёт, в личку я дам тебе информацию и некоторые объяснения, ты всё сразу поймёшь. Или я могу в этой теме легко доказать твою дисскуссионную несостоятельность, только потом без обид. Что выбираешь?smile 

Это сообщение отредактировал(а) W4FhLF - 29.4.2007, 11:37


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GremlinProg
Дата 29.4.2007, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Ты уж поверь мне, я проверил сей факт на реальных задачах, а не на высказываниях, подобных твоим, так что менять я ни чего не собираюсь.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Tectoder
Дата 29.4.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 7
Всего: 8



Цитата(GremlinProg @  29.4.2007,  10:44 Найти цитируемый пост)
Одна проблема у них, не считают они время ядра, обе возвращают только время вне ядра(пользовательское). 
Ты даже не представляешь, насколько технически сложно это реализовать так что бы производительность системы не упала при этом в несколько раз.
W4FhLF, молодец, но плюс поставить не могу, не дорос еще.

Это сообщение отредактировал(а) Tectoder - 29.4.2007, 11:46
PM   Вверх
MAKCim
Дата 29.4.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GremlinProg @  29.4.2007,  11:42 Найти цитируемый пост)
Ты уж поверь мне, я проверил сей факт на реальных задачах, а не на высказываниях, подобных твоим, так что менять я ни чего не собираюсь. 

ты крайне не прав
для начала бы посмотрел, что такое Time Stamp Counter, и не говорил глупостей
изменение значения этого счетчика вообще говоря не зависит от CPL (user mode, kernel mode)
процессор увеличивает значение этого счетчика при каждом clock cycle

Добавлено через 2 минуты и 43 секунды
W4FhLF
ну да, все верно
просто для небольших фрагментов кода я не думаю, что количество циклов системных часов будет больше 0xFFFFFFFF 


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

PM MAIL   Вверх
W4FhLF
Дата 29.4.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



GremlinProg, ну тогда запасайся терпением пареньsmile

Ну во-первых, если бы ты знал архитектуру процессора хотя бы на среднем уровне, то был бы в курсе, что rdtsc считывает значение одного из MSR регистров процессора(под номером 10h), этот регистр есть ни что иное, как внутрипроцессорный счётчик, который инкрементируется самим процессором, это целиком и полностью внутрипроцессорный механизм. На WinXP и выше(вроде даже на Win2k, но на память сказать не могу) QueryPerformanceCounter использует HPIT таймер, если он аппратано поддерживает, в противном случае используется PM таймер. Оба таймера располагаются на материнской плате. 
Оба эти механизма реализованы аппаратно и на этом уровне абсолютно всё равно на каком кольце привелегий выполняется код, счётчик в процессоре будет инкрементироваться, а таймер на мат.плате генерировать прерывания. 

Сможешь опровергнуть то, что я написал выше - будем вести беседу дальше. 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GremlinProg
Дата 29.4.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Хорошо, спорить не буду, сейчас не могу повторить свой прошлый эксперимент, работаю в другом проекте. Минус не исправлю, просто потому, что было оскорбление. Но поставлю плюс, если мои слова не подтвердятся. Скажу лишь, что замеры производились при разреженном по потокам рисовании в дибы, каждый отдельный диб - это слой конечного образа, которые при рисовании собирались в один, путем прозрачного наложения, вычислений было много, каждый поток реализовывал свой метод, каждый поток имел свою нагрузку, тратил различное время. Замеры вычилялись перфоменсом и тиком. При больших нагрузках перфоменс считал только время потока, без учета простоя при конкуренции, тик считал све стабильно и правильно.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MAKCim
Дата 29.4.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Tectoder
Цитата(Tectoder @  29.4.2007,  11:43 Найти цитируемый пост)
Ты даже не представляешь, насколько технически сложно это реализовать так что бы производительность системы не упала при этом в несколько раз.

это уже реализовано на уровне архитектуры (Performance Monitoring (см. IA-32 System Programming Manual))

Добавлено через 2 минуты и 43 секунды
Цитата(W4FhLF @  29.4.2007,  12:09 Найти цитируемый пост)
HPIT таймер

что это?
знаю APIC таймер, внешний 8252 совместимый таймер, а о таком не слышал


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

PM MAIL   Вверх
W4FhLF
Дата 29.4.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



Цитата(GremlinProg @  29.4.2007,  12:10 Найти цитируемый пост)
Минус не исправлю, просто потому, что было оскорбление.


Где было оскробление? Где? Покажи! Я лишь констатировал факт. Твоё незнание архитектуры системы и процессора - это твоя проблема, а не моя, вот и разбирайся в ней сам, а не метай стрелки. А если будут вопросы - создавай тему, помогу, чем смогу. В пределах данного топика твоего сообщение смотрелось бредово, потому, что твои рассуждения неверный и в любом случае ни GetTickCount, ни QueryPerformanceCounter не дают возможность !!!ИЗМЕРИТЬ КОЛ-ВО ТАКТОВ!!!!, именно это было нужно автору и именно rdtsc с некоторой степенью точности решает эту проблему!

Добавлено через 1 минуту и 43 секунды
Цитата(MAKCim @  29.4.2007,  12:14 Найти цитируемый пост)
что это?знаю APIC таймер, внешний 8252 совместимый таймер, а о таком не слышал


Пардон, HPET(High Precision Event Timers).

http://en.wikipedia.org/wiki/High_Precision_Event_Timer


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

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


 




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


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

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