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

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

  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Привет, 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.708
    murder,
    огромное спасибо! :thank_you2:
     
  4. murder

    murder Member

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

    Intro Active Member

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

    Indy_ Well-Known Member

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

    murder Member

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

    Вложения:

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

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

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

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    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 КБ
      Просмотров:
      236
    • fp.png
      fp.png
      Размер файла:
      19,4 КБ
      Просмотров:
      222
    Mikl___ нравится это.
  11. TermoSINteZ

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

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

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    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 нравится это.
  13. UbIvItS

    UbIvItS Well-Known Member

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

    Indy_ Well-Known Member

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

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

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

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

    p.222

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

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

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

    Вложения:

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

    UbIvItS Well-Known Member

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

    Indy_ Well-Known Member

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

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

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

    UbIvItS Well-Known Member

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

    M0rg0t Well-Known Member

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

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    M0rg0t,
    не секрет, для OpenGL. Там практически все расчеты в вещественных числах и передача параметров через XMM0-XMM3. И да, быстрее :yes3: OpenGL in masm64
     
    M0rg0t и UbIvItS нравится это.
  20. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Всё к этому и идёт. В VisualStudio уже нельзя сгенерить код для long double 80 bit (только на асме).