x86 - Время выполнения

Тема в разделе "WASM.ZEN", создана пользователем exst, 11 янв 2009.

  1. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Доброго времени суток!
    Где можно найти информацию о количестве тактов на исполнение x86 инструкция? Смотрел сайт Интела: не нашел.
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    А однозначного ответа на этот вопрос попросту нет, уж очень от многих факторов зависит время выполнения в зависимости от обстоятельств.
     
  3. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Хм... возможно,но в сети я находил эту информацию для 8086-486. Сейчас интересуют современным модели. Хотелосьбы знать сколько тактов требуется для SSE, переходов и целочисленного деления в ALU на процессорах поколения Intel Core 2.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    exst
    Латентности инструкций приводятся в мануалах по оптимизации - у АМД подробно (практически для всех команд и вариаций операндов), а у Интел выборочно. Поэтому дополнительно можно юзать instruction_tables.pdf Агнера Фога (http://www.agner.org/optimize/)
     
  5. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Спасибо.
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    exst
    А вот для этих процов сказать как раз вполне возможно: они не выполняют несколько инструкций параллельно (первыми такими стали Пни-1), поэтому нет проблем с зависимостью по данным и прочими прелестями. Поэтому скорость выполнения одной отдельной инструкции уже на просто Пнях не имеет особого смысла, надо всегда смотреть, в какой обстановке ей приходится выполняться (грубо говоря, команды MOV EAX, EBX и MOV ECX, EDX могут быть выполнены параллельно, а вот MOV EAX, EBX и MOV ECX, EAX -- нет, потому что возникает зависимость по данным).
     
  7. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    А FPU не суперскалрен? Просто ожидаю от SSE более быстрое деление чем от FPU. С переходами уже разобрался - муторно это).
     
  8. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    А деление быстрым быть не может по определению... В отличие от прочих арифметических операций.
     
  9. exst

    exst New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2009
    Сообщения:
    91
    Ну это то понятно)

    оффтоп: Пробовал программное деление на AVRках...
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    exst
    Латентность веществ.деления зависит от требуемой точности (single,double,extended).
    В SSE точность определяется типом операции и соотв-но divss\ps выполняется быстрее divsd\pd. FPU по умолчанию работает с макс.точностью extended, однако ее можно понизить до single или double установкой поля PC в control-word (FSTCW,FLDCW). При одинаковой точности SSE и FPU деления выполняются примерно за одно время, поэтому заметный выигрыш SSE может дать только на векторных операциях divps\pd (причем pd только на Core2 и AMD K10, т.к. в других процах 128-бит xmm обрабатываются за два приема по 64 бита)

    PS: За счет суперскалярности\внеочередности во время деления могут выполняться другие независимые операции. Это позволяет например оптимизировать вычисление сложных выражений вида X/Y, первым делом вычисляя Y и запуская деление Z=1/Y, на фоне которого производить расчет сложного выражения X (см.коммент к статье).
    Ну и ес-но везде, где это возможно, лучше заменять деление на умножение, т.е. если нужно все значения в массиве X поделить на одно значение Y, то лучше перед циклом вычислить Z=1/Y и затем в цикле умножать X*Z