Vtune и тест команды loop

Тема в разделе "WASM.BEGINNERS", создана пользователем deadly83, 8 июн 2008.

  1. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    Доброго времени суток!
    Решил ради спортивного интереса протестировать работу циклов на Vtune.
    Наваял вот такую мини прогу на асме:
    Код (Text):
    1.     call proc1
    2.     call proc2 
    3.     invoke ExitProcess,NULL
    4.  
    5. proc1 proc
    6.     mov ecx,1000000000
    7.     xor eax,eax
    8. ee1:   
    9.     inc eax
    10.     loop ee1
    11.     ret
    12. proc1 endp
    13. proc2 proc
    14.     mov ecx,1000000000
    15.     xor eax,eax
    16. cc1:
    17.     inc eax
    18.     dec ecx
    19.     jne cc1
    20.     ret
    21. proc2 endp
    И был удивлен результатом работы Vtune
    ee1 48,33%
    cc1 48,13%
    Если мне не изменят память здесь неоднократно упоминалось что команда loop очень медленная для организации циклов, однако на деле оказывается что выигрыш ничтожен, почему так получается?
     
  2. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Может быть, дело в том, что в первом случае INC и LOOP спариваются на конвеерах, а во втором остаётся "лишний" JNE (INC и DEC тож могут спариться)? Впрочем, инк и дек, опять же, более тормознутые нежели ADD/SUB 1 на процах класса Pentium и далее.
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    DEEP
    Строго говоря INC и LOOP не могут "спариваться", поскольку и INC и тем более LOOP сложные инструкции состоящие из нескольких микроопераций (мопов), поэтому могут спариваться только отдельные мопы этих инструкций. А вот замечание насчет INC и DEC совершенно верное - если заменить их на ADD и SUB, то второй код станет быстрее первого
     
  4. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    Честно признаться не думал что inc медленнее чем add для меня это новость, где можно читнуть про то какая команда быстрее другой? (еще бы и в виде таблички :))
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    ADD переписывает весь регистр флагов и поэтому не зависит от его пред.состояния. Inc должна сохранить предыдущее значение флага CF => зависит по флагам от пред.инструкции и => состоит из двух микроопераций - одна делает ADD, вторая комбинирует новые флаги со старым CF

    Для разных процев в "полном собрании сочинений" А.Фога instruction_tables.pdf
    Конкретно для AMD и Intel в их официальных Optimization manual-ах (у AMD подробно, у Intel выборочно)