Как замерить точно сколько тактов тратится на Операцию. НО НЕ ПРОСТО

Тема в разделе "WASM.A&O", создана пользователем locki, 19 июл 2005.

  1. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    Проблема такая:



    function add32:real;

    begin

    takt1:=1;

    asm

    rdtsc

    push eax

    mov ecx, 0



    @Loop:

    // цикл start

    add eax,edx

    add eax,edx

    add eax,edx

    add eax,edx

    add eax,edx

    add eax,edx

    add eax,edx

    add eax,edx

    // цикл end

    inc ecx

    cmp ecx,1

    jl @Loop



    rdtsc

    pop ecx

    sub eax,ecx

    mov takt,eax



    end;

    add32:= takt / 8; //8 повторений в цикле (получается => затрачено тактов на операцию)

    end;



    если я увеличиваю размер цикла и уменьшаю тело цикла, то количество тактов на операцию растет (ПРОИЗВЕДЕНИЕ НЕ МЕНЯЕТСЯ)

    если я увеличиваю тело цикла, и уменьшаю размер цикла то количестео тактов на операцию падает (ПРОИЗВЕДЕНИЕ НЕ МЕНЯЕТСЯ)

    Короче че когда растет, а когда падает я может и перепутал (мозг уже отказывает), но факт , что значение НЕПОСТОЯННО!!!

    И изменяется ЗАКОНОМЕРНО в 1 и 2 случаях.

    Получается если:

    1хADD eax,edx =84 такта на одну инструкцию

    2хADD eax,edx =44 такта на одну инструкцию

    4хADD eax,edx =22 такта на одну инструкцию

    8хADD eax,edx =11 тактов на одну инструкцию

    16хADD eax,edx =5 тактов на одну инструкцию

    32хADD eax,edx =3,125 такта на одну инструкцию

    64хADD eax,edx =от 8 до 1,8 такта на одну инструкцию

    (постоянно разные значения в этих пределах)

    При этом все это делается с приоритетом РИАЛ ТАЙМ!

    Тут рождается мысль, что для Селерона 32хАdd оптимально, но например для того же пня4 это может быть не так, не говоря уже об AMD.

    Тут рождается вопрос: как написать универсальную прогу которая бы показывала СКОЛЬКО ТАКТОВ ТРАТИТ ПРОЦЕССОР НА ТУ ИЛИ ИНУЮ ОПЕРАЦИЮ, при этом чтобы никто не кричал: "ОНА ОПТИМИЗИРОВАНА ПОД AMD или Intel!" ?
     
  2. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    >все это делается с приоритетом РИАЛ ТАЙМ!

    к команде процессора rdtsc приоритеты потоков Windows отношения не имеют.

    >СКОЛЬКО ТАКТОВ ТРАТИТ ПРОЦЕССОР НА ТУ ИЛИ ИНУЮ ОПЕРАЦИЮ

    это зависит от предыдущих операция (кеш и загрузка АЛУ), т.к. архитектура процессора распаривает вычисления.

    Так что для точного вычисления надо сперва все сбросить или проверить в цикле побольше.

    >
    Код (Text):
    1.  
    2. inc ecx
    3. cmp ecx,1
    4. jl @Loop
    5.  


    цикл надо по нормальному писать (у тебя конечно правильно, но по HLL, т.е. так пишут психически нездоровые люди, которые программируют не процессоры, а собственные бредовые идеи, типа "структурное программирование", ООП и пр.)
    Код (Text):
    1.  
    2. mov ecx, 55
    3. @@loop:
    4. ....
    5.  
    6. dec ecx
    7. jnz @@loop
    8.  




    Ну и наконец:

    ты на ассемблере пишешь или на хреновне какой?

    Не считая того, что компилятор может впихнуть в код любую лажу, которая пришла в голову программистам, его писавшим; изучать ассемблер вызывая его из HLL, все равно что спорить какая вермишель быстрого приготовления вкусней- с "ароматом" того или иного. Аромат он и есть аромат- вони много, толко мало.
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Для AMD такая прога существует - AMD CodeAnalyst. Для Intel нет, и видимо никогда не будет ;)
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Товарищ locki, кроме того, что не совсем точно меряешь такты (из-за чего могут быть погрешности), ты не воспользовался поиском по форуму, там есть и проги для тестирования (как простые-универсальные, так и ссылки на профессиональные пакеты от конкретно Intel\AMD) и ответы на твои вопросы есть в статьях\доках по оптимизации (на wasm.ru), значение действительно НЕПОСТОЯННО!!! НО НЕ ПРОСТО так
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Замерять количество тактов на выполнение имхо вообще не возможно с помощью подобного теста - процессор ведь не только выполнением занимается, но еще и выборкой, декодированием, диспетчеризацией и прочими полезными делами. Так-что выбрось эту блажь из головы, и займись изучением AMD CodeAnalyst по части Pipeline Simulation (на что потребуется их же процессор, желательно Athlon) - очень полезная иллюстрация как выполняется (и когда) код.
     
  6. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Время жизни нейтрона - тоже непостоянная величина, но ведь ее как-то меряют :derisive:
     
  7. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Chingachguk

    Программным способом ???
     
  8. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    alpet



    с т а т и с т и ч е с к и м ;)
     
  9. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    _BC_

    Ах ну да, этот способ везде пригоден. Но автору сабжа как-никак требуется точно замерить кол-во тактов чисто программным способом (и видимо при разрешенных аппаратных прерываниях).
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Можно программно замерить код с погрешностью максимум 1 такт, и то, только из-за того, что не ясно как учитывать инструкцию выполняющуюся 0.5 такта (округлять в большую или меньшую после rdtsc), тот код (что он привел) можно вообще посчитать в уме (для PIII так точно) благодаря Фогу, его табличкам и тестилкам. Единственное что не стоит брать результат первого(одного) прохода из-за погрешностей на загрузку кода в кеш и т.д. Таким макаром можно мерять код успевающий выполнится между прерываниями и не на камнях с HT, а иначе конечно точно не получится
     
  11. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    Ну и че единого мнения решения проблеммы нет!

    Идея такой программы не реальна? (прога тест которая при запуске на том или ином процессоре показывала бы ссколько тактов он тратит на НАБОР команд типа add, div и т. д)???
     
  12. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    locki НАБОРом команд процессор не занимается, объясняй тогда, что ты под этим словом понимаешь, ты смотрел AMD CodeAnalyst, wtest у Фога? Что они по твоему показывают, не такты?