Количество тактов на команду

Тема в разделе "WASM.ZEN", создана пользователем Hunter, 21 фев 2005.

  1. Hunter

    Hunter New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    47
    Может кто-нибудь знает, где можно взять соответствие количества тактов каждой команде для процессоров Pentium 4 ? В книге Зубкова, в конце, приводится подобный список, но для первого Pentium, к тому же, даже для MMX-команд такты не указаны. Буду очень признателен за помощь !



    P.S. пожалуйста, можно указать конкретный линк на источник, а не ссылку типа: intel.com - там довольно сложно бывает, найти нужную инфу, т.к. навигация по сайту не очень хорошо продумана.
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
  3. Hunter

    Hunter New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    47
    Спасибо за подсказку, уже просмотрел все материалы. У Фога классная книжка, там есть инфа по тактам, но, к сожалению, только по 3-й Pentium. Т.е. по командам SSE2 и SSE3 ничего нет. Да и выполнение некоторых команд на 4-х отличается по тактам (некоторые целочисленные инструкции выполняются вообще за пол-такта), к примеру если взять процессор на ядре Prescott, то там есть отличия даже по сравнению с Northwood'ом.

    Инфа по событиям полностью изложена в 3-й части, таблица с номерами регистров прилагается, большое спасибо :))

    И еще одна особенность насчет тактов, которую заметил: скачал с сайта intel'а старый мануал по первым Pentium'ам, так там есть описание количества тактов на каждую команду, да еще и в зависимости от используемых операндов (регистр/память). А в новых есть описание всех инструкций, включая SSE3, но нет ни слова о тактах, за которые они выполняются. Можно ли где-нибудь получить такую информацию ?
     
  4. Icebp

    Icebp New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2003
    Сообщения:
    39
    Hunter

    Число тактов можешь получить эмпирически с использованием инструкции RDTSC.
     
  5. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    Hunter

    в "IA-32 Intel Architecture Optimization Reference Manual" есть табличка, в которой указаны latency/throughput для всех инструкций (включая SSE2/SSE3) для различных семейств Pentium-4.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Hunter

    > "У Фога классная книжка, там есть инфа по тактам, но, к сожалению, только по 3-й Pentium"



    Ты что-то путаешь. См. предпоследний раздел pentopt.pdf под названием "23. List of instruction timings and uop breakdown for P4". Там все такты для Northwood'а расписаны, включая SSE2,SSE3.



    Ну а Prescott, ИМХО может оказаться тупиковой ветвью развития: 1МБ кэш в обмен на 2-х кратное увеличение задержек ALU и L1 и 3-х кратное L2. Для чего это - проталкивание HT или замена Ксеону ?



    Icebp

    > "Число тактов можешь получить эмпирически с использованием инструкции RDTSC"

    Можно, но для этого нужно быть доктором Фогом. А на шару на PIII,PIV можно только примерно и косвенно. На PIV RDTSC дает результаты с дискретом в 4 такта на Northwood и 8 тактов на Prescott (см. тему)



    flankerx

    Где это ты нашел все инструкции ?

    Может у меня устаревшая версия, т.к. в ней представлены далеко не все инструкции, особенно общего назначения (general purpose).
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Hunter




    Фог расписывал такты только для PPlain и PMMX, при этом обязательно указывая на спариваемость команды, т.к. в этих процессорах (грубо говоря) два конвеера (u,v) имеющие свои исполнительные устр-ва, например любой из них может выполнить [mov r,m], но [adc r,i] может выполнить только u-конвеер.
    Код (Text):
    1. ;======================================
    2. Инструкции Операнды Такты Спариваемость
    3. ;======================================
    4. mov    r,m      1     uv
    5. adc    r,i      1     u
    6. ;======================================
    Т.е. один и тот-же код, может выполнятся то за 1, то за 2 такта и это будет зависить от того, какая инструкция и в каком конвеере выполнялась до этого кода. Если [mov r,m] пойдет по v-конвееру, то эти две команды отработают за такт, иначе [adc r,i] будет ждать следующего такта. И это только пример двух простых команд по зависимостям конвеера, а ещё зависимости по данным, выравнивание, задержки AGI и т.д.

    А с усложнением архитектуры PPro, PII и PIII (один конвеер, 3 декодера, много исполнительных устройств (execution units), ROB, RAT, reservation station, retirement station) ещё труднее сказать, какая команда сколько тактов будет выполнятся, для этого нужно проанализировать как декодировались предыдущие команды, сколько они имеют микроопераций и в каких из 5-ти портов (execution units) выполнялись и ещё много т.д. По-этому Агнер справедливо приводит только мопы, порты, задержки исполнения команд и учит считать такты своего кода нас самих. Таблица p4 и архитектура ещё в два раза шире и сложнее, каждая колонка призвана помочь в подсчете тактов, но кол-во времени которое на это уйдет ... я не встречал задач, где бы это было экономически целесообразно, особенно учитывая, что смена одной инстр-ции в алгоритме, приведет к полному пересчету всего кода. Т.ч. мы (негласно) решили, считать примерно с RDTSC, старатся избегать много-uop-ных, много-latency, много-throughput и vector-path (для AMD) инструкций
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Как было установлено следствием, цифры приводимые Фогом, могут отличаться от официальных (интересно, кто прав?)

    Вообще, подробная инфа по пням засекречена производителем :) который рекомендует использовать их компилятор.

    А вот amd предлагает бесплатную тулзу для анализа pipeline (почему такого нет в платном vtune?) использование которой показывает, что для некоторых команд на практике время выполнение меньше указаного в 22007.pdf
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Да посмотреть в 24512701.pdf, интеловцы для rdtsc не пишут кол-во мопов или тактов, просто ставят "complex", как и для всех других "мощных" инструкций, а в RDTSCPM1.pdf они даже не советуют очищать регистр eax перед вызовом cpuid, хотя время выполнения этой инструкции прямо зависит от его значения, Фог же это все вычислил, посчитал 31 такт rdtsc для PIII (у меня на таком камне тест показывает точно 31 такт). Может какие-то цифры у него и отличаются от официальных, но на это можно забить, т.к. и ему и интелу скорее влом расписывать цифры для каждой Family
     
  10. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    leo

    у меня бумажная версия, которую Интел осенью раздавал..

    там есть SSE3/2/1, MMX, FPU и _некоторые_ genral puprose... ошибся маленько ) скажи какие инструкцие тебе нужны -- гляну )
     
  11. Hunter

    Hunter New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    47
    leo ты прав, просто я скачал старую версию Фога. В новой есть такты на SSE2, но в целом, на некоторые инструкции инфы нет. Откуда он взял такую информацию ? Как я понимаю, добыл опытным путем. А тут уже могут возникнуть расхождения с действительностью.



    flankerx, посмотрел мануал "IA-32 Intel Architecture Optimization Reference Manual", в той табличке далеко не полный список инструкций, как и сказал leo.



    Как было все хорошо в старых мануалах, все расписано, приведен подробный и полный список. Что-то с 4-ми Pentium'ами Intel утаивает подробную информацию :dntknw:(

    Никто не пробовал посылать запрос к самому Intel ?
     
  12. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Может надо занести в FAQ что на суперскалярных архитектурах понятие "скорость выполнения инструкции" теряет смысл - за один такт процессор може выполнить и три простых операции а может на них же конекретно прососать и потерять два десятка тактов.
     
  13. Hunter

    Hunter New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    47
    Dr.Golova, ну тогда Intel следует выпустить мануалы, где были бы приведены таблицы, содержащие информацию о том, какие комбинации команд могут выполняться за один такт, а на каких будет ощутимая потеря. Intel располагает такой информацией, и применила ее в своих компиляторах Intel C++ Compiler. Вот только как достать эту информацию.

    Кстати, кто-нибудь знает, сколько конвейеров на Pentium 3/4 ? Я читал только об их длине.
     
  14. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Hunter




    Тебе же Dr.Golova четко сказал, что на одних и тех же комбинациях могут быть огромные потери, даже независящие от этих самых команд, практически...



    Hunter




    А теоретически таблицы смотри у Фога и Intel, когда догадаешся, почему там нет тактов, а только мопы, порты, задержки, тогда тебе откроется информация, которую Intel
    :)
     
  15. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Hunter >




    Дык зачем им это? мануалы бесплатные, а компилер стОит денег? ;)
     
  16. Hunter

    Hunter New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    47
    bogrus "на одних и тех же комбинациях могут быть огромные потери, даже независящие от этих самых команд, практически..."

    Конкретный пример ? Разные результаты на одной и той же комбинации команд ?
     
  17. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Одна и таже комбинация может быть (не)выровняна. Или окружена разными другими комбинациями команд.
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Hunter



    Судя по вопросам, ты мягко говоря недостаточно знаком с архитектурой P6 Family и NetBurst (P4). Почитав Фога, ты поймешь, что "выпустить мануалы, где были бы приведены таблицы..." - дело бессмысленное. Процессор разбивает все команды на микрооперации (мопы) и направляет их на исполнительные устройства по нескольким портам (5 портов в P6 Family и 4 порта в NetBurst, два из которых DoubleSpeed). В целях оптимизации и распараллеливания порядок исполнения независимых мопов может изменяться. В итоге все превращается в кашу, в которой невозможно однозначно сказать где начало и конец каждой исходной команды. Теоретически в пиковой ситуации могут одновременно исполняться до 5 мопов на P3 и до 4+2=6 мопов на P4, принадлежащих разным командам. В итоге последующие команды могут выполниться одновременно, с перекрытием или даже раньше предыдущих.

    Какая тут может быть таблица ? Только та, что приводит Фог - число мопов, порты и исполнительные блоки. Дальше, если не лень, берешь и прикидываешь сам как примерно будет выглядеть исполнение последовательности команд. Добрые дяди из AMD предоставляют бесплатный эмулятор, наглядно показывающий как вся эта каша будет вариться для заданной последовательности команд. Нехорошие дяди из Intel все скрывают и недоговаривают, поэтому хороший дядя Фог пытается хоть как-то восполнить этот пробел.





    > "Конкретный пример ? Разные результаты на одной и той же комбинации команд ?"



    Для P6 family можно привести много примеров зависимости от выравнивания и окружения. Многие вещи понятны и расписаны у Фога. Но встречаются и более хитрые вещи. Вот недавно обнаружился фокус на P3 с потерей 2 тактов при встраивании куска кода в цикл.



    На P4 совершенно разные результаты могут получиться при первом и при повторных проходах куска кода. При первом проходе скорость ограничивается декодером (одна команда за такт), а при последующих проходах декодированные мопы извлекаются из трейс-кэша со скоростью 3 шт.за такт => для простых одномоповых инструкций пиковая скорость может отличаться до 3 раз. Еще пример - запись в секцию кода на расстоянии мене 1Кб от исполняемого куска. На первом проходе это практически не сказывается, а вот на повторных да - процессор подозревает модификацию кода, сбрасывает трейс-кэш и начинает декодировать инструкции заново как при первом проходе.
     
  19. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Hunter




    Я тебе уже привел пример с [mov r,m\adc r,i], читай внимательнее, а если ещё и m не будет в кеше, то на mov'е потеряешь тысячи тактов и более



    leo




    При цикле только одно очевидно, что он (даже пустой) не может выполнятся быстрее 2 тактов, dec может пойти в порт 0 или 1, jnz только в порт 1, т.ч. можно заполнить цикл несколькими одно-двух мопными инструкциями, не использующие эти порты на втором такте и это никак не отразится на скорости



    Ты видимо имеешь ввиду фокус, что наоборот, вставка одной лишней инструкции (nop, xor eax,eax) тогда сократила цикл на 2 такта, это скорее он выполнялся с задержками, а ноп перегрупировал использование портов так, что задержки пропали



    Кстати, если в wintest на Р3 нужно посчитать группу инсрукций с точностью до такта, то надо закомментировать (там в двух местах) xor eax,eax где они между двух cpuid, но при этом нельзя использовать (вернее изменять) в тестируемых инструкциях eax, а то этот xor считается и в оверхеде, получается результат всегда меньше на такт, т.е. если мерять инстр-ции выполняющиеся до такта, то результат 0, хотя может логичнее брать 1
     
  20. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Hunter Вот небольшой пример (только для PIII)



    imul r,r,i - одномопная инструкция, выполняется в порту 0 (ALU), её latency - 4 такта, throughput - 1 такт



    1 моп говорит о том, что использует только один порт, т.е. и выполняется за 1 такт, в этом такте с ней может ещё выполнится два мопа (использующие 2 разных порта, кроме 0-го), например:
    Код (Text):
    1. imul ecx,ecx,5 ; p0
    2. mov  edx,2     ; p01
    3. mov  ebx,[mem] ; p2
    latency - 4 такта обозначает задержку, которую прийдется ждать зависимым инструкциям, пример:
    Код (Text):
    1. imul ecx,ecx,5
    2. imul ecx,[b]ecx[/b],5
    Второй imul ждет (4 такта) результата выполнения первого



    throughput - 1 такт подразумевает, что два imul'а не могут выполнятся одновременно, второй пойдет на следующем (1) такте, пример:
    Код (Text):
    1. imul ecx,ecx,5
    2. imul ecx,[b]edx[/b],5
    Из-за throughput будет выполнятся 2 такта (хотя все-равно не сможет выполнится за такт, потому что один порт 0), т.к. зависимости нет, latency не учитываем

    Вот 12 тактов с цепочкой зависимостей и 4 без них
    Код (Text):
    1. imul ecx,ecx,5 ; 1         imul edx,ecx,5 ; 1
    2. imul ecx,ecx,5 ; 4         imul edx,ecx,5 ; 2
    3. imul ecx,ecx,5 ; 8         imul edx,ecx,5 ; 3
    4. imul ecx,ecx,5 ; 12        imul edx,ecx,5 ; 4