Скорость+оптимизация

Тема в разделе "WASM.A&O", создана пользователем Sonic, 19 май 2005.

  1. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Да, надо ещё какой-то тест, а то атлон показывает себя в плохом свете :)



    В аттаче алго шифрования TEA, намного медленне RC4 из-за кол-ва раундов и оперирует только двордами, тоже для 10Кб (PIII ~770000 \ P4 ~830000 тактов)

    [​IMG] _1002906394__xtea.zip
     
  2. Sonic

    Sonic New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2004
    Сообщения:
    77
    Адрес:
    Днепропетровск
    bogrus я просто убрал всё выравнивание и вот что получил( ты без нопов пробовал ?). Камень - Duron 900

    dr_dred понятно что твой код гораздо приемлемей использовать т.к скорость не зависит от степени, но всё же

    у меня работает медленней (твой 267 тиков, мой 252). И я не смеюсь !



    [​IMG] 1012556557__Untitled_1.gif
     
  3. Sonic

    Sonic New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2004
    Сообщения:
    77
    Адрес:
    Днепропетровск
  4. Sonic

    Sonic New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2004
    Сообщения:
    77
    Адрес:
    Днепропетровск
    bogrus надо просто выводить среднее число тактов,

    увеличить кол-во проходов (1000-2000),

    т.к. неудобно сравнивать
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    TEA для 10Кб (AXP2000+ @1666MHz)

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

    00404490 / 109 bytes / 10 passes

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

    000000000000000000720217

    000000000000000000656676

    000000000000000000666861

    000000000000000000656656

    000000000000000000656656

    000000000000000000674645

    000000000000000000656669

    000000000000000000667777

    000000000000000000656656

    000000000000000000656656

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



    ЗЫ: зачем аттачить картинки? В XP можно сделать Ctrl+C
     
  6. bogrus

    bogrus Active Member

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




    На дюроне это может не страшно, убрав нопы перед циклом ты сократишь результат всего на несколько тактов, а убрав их в PIII ты можешь увеличить весь результат в несколько раз! из-за постоянных пенальти, конечно это зависит от тестируемого кода и камня, но лучше перестраховатся (данных это тоже касается), мы ведь хотим при тестах максимально снизить погрешность а выжать максимум







    Имхо не надо, меня например часто интересует результат первого прохода (когда данные ещё не в кеше), остальные проходы почти одинаковы и полезны для определения как та или иная инструкция поведет себя в конвеере (без учета промахов кеша и т.д.), вообще обычно достаточно 3-5 проходов для определения картины



    S_T_A_S_




    В w2ksp4 тоже кстати, короче Intel\AMD ничья :)
     
  7. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Извини, Sonic, я по соим результатам писал.

    267, 252? У меня сейчас челюсть упадет. У меня 1120(мое), 3017(твое (_Math)) при подсчете 2<sup>32</sup>. Это же разница в 5-15 раз! Какой у тебя процессор?



    А rdtsc вообще что считает - число тактов на 1 процесс или сколько вообще тактов совершил процессор? Может эта команда вообде не считает такты FPU, или наоборот только их? Или это у разных процессоров по-своему?
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Вот ещё AES. Фактически измеряется режим ECB, но режимы с обратной связью не должны сильно отличаться. Точность теста невысокая и измеряются не такты, а скорость, поэтому результаты будут зависить от частоты CPU.
    Код (Text):
    1.    key   | key expansions/sec | encryption, bytes/sec | decryption, bytes/sec
    2.  128 bit |       1157368      |         63072240      |         63310249
    3.  192 bit |        972705      |         51150048      |         53601329
    4.  256 bit |        818560      |         46603377      |         46733192
    5.  
    [​IMG] 474487223__aes.exe
     
  9. Sonic

    Sonic New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2004
    Сообщения:
    77
    Адрес:
    Днепропетровск
    dr_dred я ошибалься процедурка отличная, я думал она возводит только в целые степени, буду всячески использовать. А такты такие как есть 267 на Duron 900

    [​IMG] _884847055__Math.exe
     
  10. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
  11. leo

    leo Active Member

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



    > "log2(1/value) используется т.к. вроде при использовании FYL2X -2*sqrt(2)<=ST(0)<=2*sqrt(2)"



    Логарифм орицательного числа - это нечто новое ;) ST(0) должно быть просто положительным числом (non-zero psitive number), поэтому никакого деления тут не нужно.





    > "А такты такие как есть 267 на Duron 900"

    > "Сколько тактов занимает его выполнение на вашей машине ? "


    Ты откуда такие цифры взял, для niter = один-два-три или ты уже нечто другое изобрел :))

    А получаемую точность при малых niter смотрел ?



    А у нас вот что получается:
    Код (Text):
    1. Метод         P3      P4      1234567890123456 < число знаков, qword дает 15-16
    2. -----        ----    -----    -----------------------
    3. calc.exe                      48.5029301283327386 = 2^(5.6)
    4. std+agner    217     812      48.5029301283327<font color="red]266</font><!--color-->
    5. std          239     824      48.5029301283327<font color="red]266</font><!--color-->
    6. Sonic32      1360    2384     48.5029301283327<font color="red]266</font><!--color-->
    7. Sonic28      1217    2196     48.5029301283327<font color="red]110</font><!--color-->
    8. Sonic24      1045    1984     48.502930128<font color="red]2925078</font><!--color-->
    9. Sonic20      873     1874     48.502930<font color="red]0728178969</font><!--color-->
    10. Sonic16      701     1512     48.502<font color="red]8933136016717</font><!--color-->
    11. где
    12.     std - стандартный метод вычисления
    13.     std+agner - стандартный метод с заменой FSCALE на целочисленное вычисление 2^i по Агнеру Фогу
    14.     Sonic32 и т.д. - "супер" метод _QPower c соответствующим значением niter
    15. P3 - Pentium III Coppermine (CPUID 6.8.6) 800MHz
    16. P4 - Pentium 4 Northwood (CPUID 15.2.7) 1.8 GHz


    > "Как можно оптимизировать прилогаемый код ?"



    Выбросить в корзину и использовать стандартный алгоритм ;)))

    Если вооружиться табличкой латентностей от А.Фога, то увидим что якобы большие задержки FRNDINT и FSCALE на самом деле не такие большие по сравнению с FDIV\FIDIV, поэтому уже пара-тройка делений сводит на нет все старания что-то "оптимизировать"
     
  12. Sonic

    Sonic New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2004
    Сообщения:
    77
    Адрес:
    Днепропетровск
    Ты всё перепутал 267 для проги, что прилогается.

    Sonic32 у меня отработал за 1140

    [​IMG] _1918312627__Math.exe
     
  13. Sonic

    Sonic New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2004
    Сообщения:
    77
    Адрес:
    Днепропетровск
    Признаю, кажись спутал fyl2x с FYL2XP1,

    теперь процедурка dr_dred занимает 235 тиков.
     
  14. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Сейчас-то уж точно у меня челюсть выпадет.

    Провел небольшой эксперимент. В начале процедуры убрал finit, а в конце добавил

    ffree st(1)

    ffree st(2)



    Получилось , что процедура стала работать в 4 раза быстрее (теперь 405 тактов вместо 1500). Не знаю, прокатит-ли это с втоим процессором. Попробуй, но, так как ты еще используешь st(3) (в _math) и st(4) (в math), то их тоже освободи перед ret'ом.



    В аттаче то, что получилось у меня.

    p.s. все же незачем делать -power и 1/value. Результат тот же, но тактов меньше.

    [​IMG] _523635404__Math.zip
     
  15. S_T_A_S_

    S_T_A_S_ New Member

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

    пожалуйста, не прицепляйте аттачи с русскими буквами в названиях - броузеры вроде IE и Opera их не качают

    [/offtop]
     
  16. leo

    leo Active Member

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



    > "В аттаче то, что получилось у меня"



    Ну, молодец, наконец то ты пришел к стандарному коду (у меня в табличке он значится как std). Садись, пять ;)))



    PS: А чтобы "челюсти не выпадали" загляни в таблички латентностей FPU в IA-32 и pentopt.pdf от Агнера Фога. Тогда будешь иметь представление: что оносительно быстро, а что медленно на PII/PIII и P4 и на сколько ;)



    Sonic



    Ну а тебе, милый, следует трояк влепить :)))

    1) Ты водишь общественность за нос, меняя на ходу алгоритмы,

    да еще не прилагаешь исходники - одни "супер" ехе-хе

    2) В итоге все равно получась фигня, и dr_dred тебе уже указал на ошибки - до стандартного метода ты не дотянул и используешь дурной стиль: вместо нормального освобождения стека fpu суешь finit где не надо (я, кстати, в своем тесте эти твои выкрутасы выкинул для чистоты эксперимента).



    ================

    И вообще я не понял смысл этого топика - думал какой-то супербыстрый метод возведения в степень изобрели или вычитали, а тут какие-то контрольные работы :dntknw:((



    Вот если "изобрести" быстрый метод определения того, что степень целая и перескакивать на быстрый метод умножения, то было бы интересно для общего развития :)
     
  17. Sonic

    Sonic New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2004
    Сообщения:
    77
    Адрес:
    Днепропетровск
    Мне кажется очищать регистры надо в начале, по этому поводу вопрос можно ли использовать для этого вместо finit emms ? Скорость реально растёт и ошибок вроде нет.

    И ещё, в прилагаемом примере результат записывается в t, если же записывать результат в x, скорость возрастает в 2 раза – 103 такта !!!, почему так ?



    [​IMG] _1608906440__Math.zip
     
  18. leo

    leo Active Member

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



    > "если же записывать результат в x, скорость возрастает в 2 раза – 103 такта !!!, почему так ? "



    А ты в Math_t возьми x = 1.0 и получишь такой же результат :)))

    Тебе уже объясняли ситуацию, только тогда у тебя cтепень была > 1 и число Х нарастало до бесконечности. А теперь ты взял степень = 0.5 и пытаешься крутить цикл аж 16348 раз. Но X "быстро" становится 1й и логарифм в fyl2x вычисляется "мгновенно" (ты же не считаешь Intel и AMD идиотами ;)))



    > "Мне кажется очищать регистры надо в начале"



    Ага, а как такие суперфункции использовать - только для вывода числа на экран или в файл ? А если надо вызвать функцию внутри кода для последующих FPU вычислений, то после call еще и finit\emms вызывать чтобы не нарваться на исключение ?

    Все таки по нормальному каждая функция должна сама убирать за собой мусор перед возвратом, чтобы не загадить последубщий код, а finit делается в проге один раз при инициализации.



    > "можно ли использовать для этого вместо finit emms ? Скорость реально растёт и ошибок вроде нет"



    Ну если тебе в лом использовать ffree\fstp, то тогда конечно лучше emms, чем finit.

    EMMS просто помечает все регистры FPU как свободные.

    FINIT еще сбрасывает control и status регистры.

    А control-word между прочим управляет точностью, округлением и маскировкой исключений. А маскировать три важных исключения (инвалидная операция, деление на 0 и переполнение) не рекомендуется - хлопот не оберешься при поиске возможных глюков. А вот FINIT их старательно маскирует. Поэтому в "серьезных" прогах FINIT делают один раз и затем устанавливают свое значение Control Word. Поэтому запихивать finit внутрь функции - имхо нонсенс, если эта функция не только для баловства :)))



    PS: А зачем ты в очередном варианте frndint на fistp+fild заменил - думаешь так быстрее ?
     
  19. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    После всех include и includelib добавьте



    include \masm32\include\debug.inc

    includelib \masm32\lib\debug.lib



    Задайте edi значение 40h. Потом shr speed,6. Перед ret'ом в qpower'е пропишите



    DumpFPU



    Запустите скомпилированную программу и сообщите результаты. Поэксперементируйте с emms, finit, fstp st(1).

    Судя по дампу, нужно в начале ставить finit, в конце одну инструкцию fstp st(1) (в моей программе). Но скорость больше, когда finit отсутствует, а в конце две команды fstp st(1). Что-то до меня никак не допрет, почему так происходит.



    p.s. о возможности отладки я знал, но никогда не пользовался. Если такие файлы (debug.inc и debug.lib) отсутствуют, в masm32 есть папка vkdebug, в ней setup.

    math_x 1500 ticks

    math_t 1100 ticks
     
  20. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia