Скорость работы программы

Тема в разделе "WASM.BEGINNERS", создана пользователем ActioN, 22 янв 2006.

  1. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    В каком случае программа будет работать быстрее.

    #1:
    Код (Text):
    1. .IF ax == button1ID
    2.     shr eax,16
    3.     ...
    4. .ELSEIF ax == button2ID
    5. ...




    #2:
    Код (Text):
    1. .IF ax == button1ID
    2.     shr eax,16
    3.     ...
    4. .IF ax == button2ID
    5. ...




    Таких случаев много встречается. Знаю, что даже если в одном из случаев скорость выполнения программы увеличится, то она будет совсем незначительна, но все таки интересно было бы узнать.
     
  2. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    Если представить эти masm32-макросы в виде чистого ассемблера, то получится примерно так:

    (кстати, во втором случае перед вторым .IF надо написать .ENDIF)

    -------------------------------
    Код (Text):
    1.  
    2. #1
    3. ..
    4. if:
    5.    cmp ax,button1ID
    6.    jne button2
    7.    shr eax,16
    8. ...
    9. elseif:
    10.    cmp ax,button2ID
    11.    jne exit
    12. ...
    13. -------------------------------
    14. #2
    15. ..
    16. if1:
    17. cmp ax,button1ID
    18.    jne endif1
    19.    shr eax,16
    20. ...
    21. endif1:
    22.    jmp if2
    23. if2:
    24.    cmp ax,button2ID
    25.    jne exit
    26. ...


    -------------------------------

    т.е в конечном счёте макросы .if-.elseif-.endif просто делают приблизительно такую конструкцию:

    -------------------------------

    .if p1==p2

    ...

    .endif

    =

    if:

    cmp p1,p2

    jneq endif

    ...

    endif:

    -------------------------------

    .if p1==p2

    ...

    .elseif p1==p3

    ...

    .endif

    =

    cmp p1,p2

    jne elseif

    ...

    elseif:

    cmp p1,p3

    jne endif

    ...

    endif:

    -------------------------------

    и это значит, что первый код более быстрый т.к там не генерируется дополнительная инструкция jmp. Вроде так.
     
  3. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    DPX, я так сразу и подумал. Спасибо!
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Только все наоборот - дополнительный jmp будет именно в первом варианте, а во втором его не будет
    Код (Text):
    1. #1
    2.   cmp eax,button1ID
    3.   jne _elseif
    4.   shr eax,16
    5.   jmp _endif ;тут из-за elseif мы должны идти сразу на endif
    6. _elseif:
    7.   cmp eax,button2ID
    8.   jne _endif
    9.   ...
    10. _endif:
    11. #2
    12.   cmp eax,button1ID
    13.   jne _endif_1
    14.   shr eax,16  ;т.к. elseif нет, то в любом сл.идем на  второй if
    15. _endif_1:
    16.   cmp eax,button2ID
    17.   jne _endif_2
    18.   ...
    19. _endif_2:
    Но именно первый вариант с безусловным jmp и является потенциально более быстрым ;)

    При первом проходе кода рулит статическое предсказание переходов. В варианте #1 процессор обнаруживает jmp на выходе декодера и перескакивает на _endif, сбрасывая всего 5-6 стадий конвеера (от фетча блока инструкций до выхода декодера). В варианте #2 вместо jmp стоит условный переход jne вперед, который по правилам статического предсказания предполагается не выполняющимся и проц идет не в ту степь, продолжая спекулятивно декодировать и выполнять следующие инструкции. Пройдя весь конвеер (~10 стадий на P3,PM,атлонах, ~20 на P4 и ~30 на P4E) второй cmp и jne добираются до исполнительного блока и тут выясняется, что условие jne выполняется (т.к.eax=button1ID), проц.сбрасывает все стадии конвеера и начинает грузить код по адресу _endif_2. Т.е. при первом проходе вариант #1 платит штраф только 5-6 тиков, а вариант #2 все 10,20,30 тиков в завис-ти от проца.

    При повторных проходах рулит динамическое предсказание, поэтому на безусловном jmp теряется от силы 1 тик (на P4 м.б. 0 - смотря как посторена трасса в Т-кэше). А в варианте #2 все зависит от статистики выполнения перехода jne _endif_2 (т.е. от чередования eax = button1ID или 2ID). Если проц угадывает, то будет также не более 1 тика, если не угадывает, то опять получим штраф 10,20,30 тиков на сброс всего конвеера

    Вот такие пироги :)
     
  5. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    leo я даже некоторых таких слов незнаю%))). Углубленные познания. А что надо читать, в какую сторону копать, чтобы тоже так детально уметь разбираться? Наверное знание дизассемблирования(отлаживания)+архитектуру процессоров...?
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Насчет дизассемблирования трудно сказать, т.к. дизассемблировать код, имея исходник на ассемблере - это что-то типа масло масляное ;) ИМХО лучше не пользоваться .if\.elseif, а писать самому ручками на чистом асме, тогда и вопросов не будет. Тем более, что для проверки на == 0 masm по непонятной причине использует OR EAX,EAX вместо TEST EAX,EAX, рекомендуемой Intel и AMD. На первый взгляд разницы никакой, а на самом деле OR переписывает содержимое регистра EAX, т.е. с точки зрения тупого процессора "изменяет" EAX и тем самым вносит ненужную зависимость по данным для следующих операций, использующих EAX



    Что касается переходов и вообще низкоуровневой оптимизации, то лучше всего изучать аглицкие мануалы по оптимизации от Intel и AMD, а также pentopt.pdf by Agner Fog. Правда, на wasm.ru в разделе Статьи\Оптимизация есть русский перевод предыдущего издания А.Фога (by Aquila). Но загвоздка в том, что большая часть первого издания посвящена устаревшим процам PPlain и PMMX, про которые вообще лучше не вспоминать, т.к. современные процы устроены совершенно иначе. Поэтому при недостаточно внимательном и критическом прочтении в башку может засесть ненужная каша и устаревшие представления о U и V-конвеерах, "спариваниях" и т.п.