1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Портирование FPU на SSE

Тема в разделе "WASM.ASSEMBLER", создана пользователем Mikl___, 14 июл 2020.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.181
    Привет, All!
    1. Какая инструкция заменила FPU-шную FCHS? Я использую
      Код (Text):
      1. xorps xmm0,xmm0
      2. subss xmm0,xmm1; в  регистре xmm1 значение у которого нужно сменить знак
      3. movss xmm1,xmm0
      или так
      Код (Text):
      1. xorps xmm0,const80000000h
      Но правильно ли это?
    2. В FPU было полно тригонометрических инструкций (FSIN, FCOS, FSINCOS, FPTAN, FPATAN) чем их заменять в SSE?
     
  2. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    1. В принципе через xor правильно я считаю. Для целых чисел есть PSIGND.
    2. Тригонометрические функции вычисляются в цикле через ряды Тейлора (если не ошибаюсь). Это легко гуглится. И по скорости может выйти даже быстрее чем на FPU если вычислять сразу 4 функции.
     
    Mikl___ нравится это.
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.181
    murder,
    огромное спасибо! :thank_you2:
     
  4. omne999666

    omne999666 Member

    Публикаций:
    0
    Регистрация:
    13 июл 2019
    Сообщения:
    130
    Адрес:
    Украина
    1. До этого использовал это
    Код (Text):
    1. xorps xmm0,const80000000h
    2. Заменял отладкой после компиляции на С, выходила такая же инструкции как обычном наборе команд без плавающих инструкции, открытыми но заполненными установками флага регистров под работой расширения поддержки набора дополнительных инструкций. Флаги в общем только стеком установились и все.
     
    Mikl___ нравится это.
  5. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Вот ещё ссылочка на синус - https://sourceware.org/legacy-ml/glibc-cvs/2017-q4/msg00609.html. Там даже описание алгоритма есть, вроде бы используется интерполяция полиномом эээ... 11 степени (не многовато ли) по таблицам Брадиса. Код не проверял.
     
    Mikl___ нравится это.
  6. maalchemist

    maalchemist New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    6
    Имеет смысл заглянуть в http://www.moshier.net/#Cephes
    Когда я рисовал свой простенький компилятор, то для SSE-версий функций использовал алгоритмы именно из этой замечательной библиотеки.

    Если интересует пример моей реализации на fasm, то можно посмотреть на https://maalchemist.ru/SICx/SICx06.01.01.zip
    Тригонометрические функции лежат в ...\SIC64(32)FuAX_TG.ASM и в ...
    \SIC64(32)FuAXu_TG.ASM

    Скорость вычисления синуса будет раза в три выше, чем у процессорного fsin (даже без использования SSE-инструкций).
     
    Mikl___ нравится это.
  7. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    291
    Ещё не плохо сделать команду(макрос) sinps, sinpd чтобы одновременно 4 или 2 результата вычисляла, в игровых движках некоторые функции можно ускорить.
     
  8. omne999666

    omne999666 Member

    Публикаций:
    0
    Регистрация:
    13 июл 2019
    Сообщения:
    130
    Адрес:
    Украина
    Инструкция x87 становится при использовании макросов инструкцией x86 без возможности использования FPU исключение команды ниже XORPS
    Код (Text):
    1. xorps xmm0,const80000000h
     
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.500
    Mikl___ нравится это.
  10. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Ну вот скачал - там куча функций, заточенных под определённый случай. Циклы развёрнуты. Реверсить эту простыню как-то долго...
     

    Вложения:

    • mkl_vml_p4m2.7z
      Размер файла:
      2,6 МБ
      Просмотров:
      159
    Indy_ и Mikl___ нравится это.
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.181
  12. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.500
    Mikl___,

    Довольно странно, модуль по математике от хард вендора.

    Между тем эти функции используют fpu. vmlcSinh():

    Код (Text):
    1. .text:103414B2                 fld     dword ptr [edx+ebp*8]
    2. .text:103414B5                 fstp    [esp+0B4h+var_94]
    3. .text:103414B9                 fld     dword ptr [edx+ebp*8+4]
    4. .text:103414BD                 lea     edx, [esp+0B4h+var_2C]
    5. .text:103414C4                 fstp    qword ptr [edx]
    6. .text:103414C6                 fld     dword ptr [ebx+ebp*8+4]
    7. .text:103414CA                 fstp    qword ptr [edx+8]
    8. .text:103414CD                 fld     dword ptr [ecx+ebp*8]
    etc.

    Что интересно в модуле нет непосредственно fsin. Не могу предположить зачем это сделано(вычислять через тот же проц блок если есть хард инструкция, даже не учитывая всякие расширения), но очевидно что не с проста, ясно что не обратная совместимость. Видимо есть какой то не известный нам нюанс.
    --- Сообщение объединено, 23 июл 2020 ---
    murder,

    Действительно, это уже не реверс а хз что. Нужно вручную разбирать плавающую математику, при это понимая сам матан в прямом смысле. Код конечно жесть, это не всякие вирты с протекторами :sad:
    --- Сообщение объединено, 23 июл 2020 ---
    ..
     

    Вложения:

    • sine.png
      sine.png
      Размер файла:
      7,4 КБ
      Просмотров:
      123
    • fp.png
      fp.png
      Размер файла:
      19,4 КБ
      Просмотров:
      120
    Mikl___ нравится это.
  13. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.475
    Адрес:
    Russia
    Скорее всего просто табличный синус
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.181
    TermoSINteZ,
    табличный синус это как-то так
    Код (ASM):
    1. .data
    2. Sin dd 0,175,349,523,698,872; 0-5
    3. dd 1045,1219,1392,1564,1736; 6-10
    4. dd 1908,2079,2250,2419,2588; 11-15
    5. dd 2756,2924,3090,3256,3420; 16-20
    6. dd 3584,3746,3907,4067,4226; 21-25
    7. dd 4384,4540,4695,4848,5000; 26-30
    8. dd 5150,5299,5446,5592,5736; 31-35
    9. dd 5878,6018,6157,6293,6428; 36-40
    10. dd 6561,6691,6820,6947,7071; 41-45
    11. dd 7193,7313,7431,7547,7660; 46-50
    12. dd 7771,7880,7986,8090,8191; 51-55
    13. dd 8290,8387,8480,8572,8660; 56-60
    14. dd 8746,8829,8910,8988,9063; 61-65
    15. dd 9135,9205,9272,9336,9397; 66-70
    16. dd 9455,9511,9563,9613,9659; 71-75
    17. dd 9703,9744,9781,9816,9848; 76-80
    18. dd 9877,9903,9926,9945,9962; 81-85
    19. dd 9976,9986,9994,9998,10000;86-90
    20. .code
    21. proc find_sin
    22.     cmp eax,181
    23.     jb a2
    24.     sub eax,180
    25.     cmp eax,91
    26.     jb @f
    27.     neg eax
    28.     add eax,180
    29. @@: mov eax,sin[eax*4]
    30.     neg eax
    31.     jmp a4
    32. a2: cmp eax,91
    33.     jb @f
    34.     neg eax
    35.     add eax,180
    36. @@: mov eax,sin[eax*4]
    37. a4: retn
    38. endp find_sin
     
    Indy_, q2e74 и TermoSINteZ нравится это.
  15. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    5.443
    для тестов скорей всего написали.
     
  16. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.500
    TermoSINteZ,

    Если граф посмотреть, то там цикл и множество вложенных процедур, в первых ссылок на талицы данных нет. Можно выяснить, но для этого нужно визором прокрутить(там x32) что бы найти все данные, те необходимы прототипы для этих функций. Гугл про vmlcSin_11() ничего не знает. Либа есть, вот бы есчо документацию на неё, либо вызывающий код отладить что бы прототип узнать.
    --- Сообщение объединено, 25 июл 2020 ---
    Mikl___,

    > табличный синус

    На спекки тригонометрия вычислялась через полиномы(ряды Чебышёва), крайне эффективно и с достаточной для любых расчётов точностью. Я пытался как то на пик портировать, но там косяк был с отладочным софтом так что я это забросил :)
    --- Сообщение объединено, 25 июл 2020 ---
    Могу точную инфу дать.

    p.222

    Ниже есть ссылка на матчасть откуда взяты коэфф:

    Это самый эффективный алго.
    --- Сообщение объединено, 25 июл 2020 ---
    UbIvItS,

    Да какие тесты это же билд готовый по математике от вендора. Либо это работает быстрее чем сам fsin(что маловероятно), либо это закрытие хард errata, наиболее вероятно.
     

    Вложения:

    TermoSINteZ и Mikl___ нравится это.
  17. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    5.443
    такие ошибки обычно закрываются обновлением микрокода. правда, у софтварной версии мб погрешности меньше.
     
  18. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.500
    UbIvItS,

    Нельзя всё обновить микрокодом, для этого нужен хард сброс. Проще решить софтом налету. Почему не используются более производительные блоки(mmx/sse etc) это есчо одна загадка. Я не помню точно, формат sse поддерживает fpu, те формат чисел с плз ?

    Короче нужны прототипы что бы снять профайл и вообще посмотреть как оно работает. Откуда это было загружено ?
     
  19. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    5.443
    по-хорошему, фпу вообще нужно выкинуть, но для обратной совместимости его держат.
     
  20. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.318
    Mikl___, если не секрет, а зачем это нужно? Неужели фпу могут отключить/удалить, или новые инструкции просто во много раз быстрее?