Помогите с подсчётом колличества тактов процессора

Тема в разделе "WASM.BEGINNERS", создана пользователем ulcigor, 8 янв 2009.

  1. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Pavia
    Правильно. Поэтому:
    Что померить ? Правильно, среднее число тактов на одну итерацию цикла с учетом 1) возможного перекрытия итераций, 2) "накладных расходов" на организацию цикла (декремент счетчика, переход, влияние выравнивания метки цикла). Поэтому, строго говоря, замерить "с точностью до такта" в цикле можно только сам цикл (т.е.код, предназначенный для работы в цикле). В противном случае при "загоне" кода в цикл нужно подумать "что мы хотим померить" и возможно заюзать доп.хитрости (типа введения искусственной зависимости между итерациями), иначе можно ошибиться не то что на единицы тактов, а в разы. Например, на тормозных P4 независимые умножения в цикле могут выполняться c большим перекрытием и в итоге средняя задержка в пересчете на итерацию будет много меньше латентности самого умножения (latency = 14 или 10, throughput = 1)
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Немного офтопа: имхо задачи "померять с точностью до такта", и "померять время 1-5 простых комманд" это чисто бегиннерское желание получить то не знаю что :)) С точки зрения практической оптимизации полезно мерять такты в куске кода от ~500 тактов до нескольких миллионов тактов. Если кусок оптимизируемого кода существенно короче 500 тактов и не находится в цикле то нечего и загоняться на его "оптимизацию", а если он в цикле то ничего не мешает взять нужное количество итераций и получить вполне достаточную и при этом стабильную для данного типа процессора точность ~5%. Слишком большой кусок кода или слишком много раз повторяющийся цикл не получится корректно померять из-за вытесняющей многозадачности, непредсказуемо прерывающей его работу, но если счёт на единицы миллионов тактов, то переключение задачи маловероятно и если оно всё таки произойдёт то его сразу станет видно по аномально большому времени этого замера.
    Замерять обязательно несколько раз и смотреть все замеры, чтобы отбрость аномальные и увидеть время первого, второго и "типичного" выполнения. Отбрасывать ли первый/второй замеры или нет зависит от того насколько часто выполняется данный блок кода в реальной программе - если часто то он будет работать на "типичном" времени, а если редко, то как раз первый замер и даст реальную картину времени его выполнения.
    Применение cpuid перед rdtsc тоже конечно условность, поскольку в реальной программе вместо преждевременно выполненной rdtsc будут другие "преждевременные" команды :) Но для "стандартизации" измерения лучше всё-таки её использовать чем не использовать ;)
     
  3. ulcigor

    ulcigor New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2009
    Сообщения:
    5
    Огромное спасибо за содержательные ответы.
    Хотя у меня возник ещё один вопросик по этому же поводу.
    команда rdtsc возвращает 64 битное число в паре регистров EDX:EAX, как мне теперь можно это самое число переписать в переменную типа QWORD Регистры являются типами DWORD, и обычная операция mov тут не поможет. Если такое возможно, помогите пожалуйста. Заранее спасибо... .
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    .data?
    result dq ?
    .code
    mov dword ptr [result], eax
    mov dword ptr [result + 4], edx
     
  5. ulcigor

    ulcigor New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2009
    Сообщения:
    5
    Огромное спасибо Y_Mur. Всё оказалось на столько просто... . Удивляюсь как сам до этого не додумался... . :) Ещё раз спасибо... .