· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Можно ли сделать Miracl еще круче? :)

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июн 2, 2004 18:43:51

Мне тут RElf присоветовал поиграться с MIRACL - одной из самых быстрых математических библиотек в сети (поддерживает x86, IA-64, SPARC, ARM и т.д).
Библиотека доступна с http://indigo.ie/~mscott/.
Ребята написали ее на С/С++ с inline-овыми ассемблерными вставками на необходимом ассемблере. Меня заинтересовало качество некоторых таких функций. В файле mrmuldv.any в дистрибутиве расположены наиболее часто используемые, и, соответственно, теоретически, наиболее оптимизированные куски кода. Критерий оптимизации - максимальная скорость. Размер - не суть важно. Использование инструкций MMX/SSE/SSE2 - мммм... Не знаю. На ваше усмотрение.
Код функций:
;
;  Intel-80386 pseudo-32 bit version - for Microsoft C V5.0+
;  Written for MS macro-assembler V5.0+ by Andrej Sauer 
;  with 'mr_utype' defined as 'long' (32 bit). See mirdef.hpc
;  Same comments apply as above (except for 8087 requirement)   
;  Note that this version will also work with the latest Zortech and
;  Borland 16-bit compilers, specifically Borland C++ V3.1+
;
;  For large code models (e.g. medium)
;
;           change    _TEXT    to    mrmuldv_TEXT  (in three places)
;           change    NEAR     to    FAR
;           change    [bp+4]   to    [bp+6]
;           change    [bp+8]   to    [bp+10]
;           change    [bp+12]   to   [bp+14]
;           change    [bp+16]  to    [bp+18]
;           change    [bp+20]  to    [bp+22]
;           etc
;
        .386
        ASSUME CS:_TEXT
_TEXT   SEGMENT USE16 PUBLIC 'CODE'

        PUBLIC _muldiv
_muldiv PROC  NEAR
        push  bp                    ;standard C linkage
        mov   bp,sp

        mov   eax,[bp+4]            ;get a
        mul   DWORD PTR [bp+8]      ;multiply by b
        add   eax,DWORD PTR [bp+12] ;add c to low word
        adc   edx,0h                ;add carry to high word
        div   DWORD PTR [bp+16]     ;divide by m
        mov   bx,WORD PTR [bp+20]  ;get address for remainder
        mov   [bx],edx             ;store remainder
        shld  edx,eax,16            ;shift higher half of quotient
                                    ;into lower half of edx

        pop   bp                    ;standard C return
        ret                         ;quotient: high bits in dx, lows in ax

_muldiv endP

        PUBLIC _muldvm
_muldvm PROC  NEAR
        push  bp                    ;standard C linkage
        mov   bp,sp

        mov   edx,[bp+4]            ;get a
        mov   eax,[bp+8]            ;add in c
        div   DWORD PTR [bp+12]     ;divide by m
        mov   bx,WORD PTR [bp+16]   ;get address for remainder
        mov   [bx],edx              ;store remainder
        shld  edx,eax,16            ;shift higher half of quotient
                                    ;into lower half of edx
        pop   bp                    ;standard C return
        ret                         ;quotient: high bits in dx, lows in ax

_muldvm endP


        PUBLIC _muldvd
_muldvd PROC  NEAR
        push  bp                    ;standard C linkage
        mov   bp,sp

        mov   eax,[bp+4]            ;get a
        mul   DWORD PTR [bp+8]      ;multiply by b
        add   eax,DWORD PTR [bp+12] ;add c to low word
        adc   edx,0h                ;add carry to high word
        mov   bx,WORD PTR [bp+16]   ;get address for remainder
        mov   [bx],eax              ;store remainder
        mov   eax,edx
        shld  edx,eax,16            ;shift higher half of quotient
                                    ;into lower half of edx

        pop   bp                    ;standard C return
        ret                         ;quotient: high bits in dx, lows in ax

_muldvd endP


        PUBLIC _muldvd2
_muldvd2 PROC  NEAR
        push  bp                    ;standard C linkage
        mov   bp,sp
        push si

        mov   eax,[bp+4]            ;get a
        mul   DWORD PTR [bp+8]      ;multiply by b
        les   bx,DWORD PTR [bp+12]
        add   eax,DWORD PTR es:[bx]
        adc   edx,0h                ;add carry to high word
        les   si,DWORD PTR [bp+16]
        add   eax,DWORD PTR es:[si]
        adc   edx,0h                ;add carry to high word

        mov   DWORD PTR es:[si],eax              ;store remainder
        les   bx,DWORD PTR [bp+12]
        mov   DWORD PTR es:[bx],edx
        pop   si
        pop   bp                    ;standard C return
        ret           

_muldvd2 endP

_TEXT   ENDS
END



Дата: Июн 2, 2004 19:03:49

Мдя, а я и не посмотрел на такое когда миракл смотрел :) Это, конечно, верх оптимизации по скорости shld использовать :)


Дата: Июн 2, 2004 19:20:58

Сишный и сиплюсплюсный код написаны достаточно чисто. А вот к подобным ассемблерным вставкам у мя изначально недоверие. В особенности после постоянных постов наших корифеев и выпендрежей на win32.asmcommunity. Когда я увидел div, то тоже не порадовался. Да и вообще, bp они используют. Мда :(


Дата: Июн 2, 2004 21:55:25

Может лучше посмотреть мат.библиотеки от AMD & intel и работать с ними.
Тока там сильная заточка под расширения идёт и всякие арктангенсы считаются в основном.


Дата: Июн 2, 2004 22:35:00

MIRACL - это не только ценный мех но и три-четыре килограмма _легкоусваиваимого_ мяса :)
Там же и криптография есть! SHA/RSA и т.д. Интеловская библиотека рулит, само-собой, но и MIRACL ничего! А интел только для интела пишет! :(


Дата: Июн 3, 2004 08:09:55

Гм.. как всегда я натупил с превой попытки =)
Чего-то плохо понял, что значит Intel-80386 pseudo-32 bit version. И les bx,DWORD PTR [bp+12] наводят на сомнения.
Да и без этого, imho, код какой-то странный.
Во-первых, можно обойтись без организации стекового кадра через ebp - это уже сэкономит пару команд.
Во-вторых, размер этих подпрограмм наводит на мысль, что их лучше-бы не вызывать через call, а делать inline.
Ты пишешь, что это так и сделано, но в данном примере что-то не похоже :(

Про amdшные либы я имел ввиду - надёргать оттуда ассемблерную реализацию и прикрутить заместо этого ^^.
Но я тут глянул какую-то библу - там сплошные матрицы и тригонометрия - простых операций и нет :(
Хотя да, с такими библиотеками есть пороблемы - их сильно затачивают под соответствующие процы.
Я как-то смотрел что-то от интела, там местами используют SSE2, когда можно и MMX обойтись. Видимо - чтобы не работало на атлонах :(


Дата: Июн 3, 2004 10:37:32

Я SHA + RSA за неделю с нуля написал :) По RSA посмотрел литературу и пару реализаций, а по SHA rfc прочитал и одной функцией сделал :)
А код тут и вправду похож на выдернутый из дизассемблера :)


Дата: Июн 3, 2004 11:21:23

В защиту bp

Если сегмент стека и данных не совпадают, то обойтись без использования bp нельзя, так как байты сэкономленные на push bp/pop bp будут с лихвой компенсированны байтами съеденными префиксом ss. Но в четвертой процедуре один les bx,DWORD PTR [bp+12] точно лишний.


Дата: Июн 3, 2004 12:00:04

Интересно используеться ли код из mrmuldv.* для факторизации RSA


Дата: Июн 3, 2004 13:54:40

Ага используеться . В factor.exe нашёл код , вот например процедура muldiv :
0040D080            sub_40D080      proc near      ; CODE XREF: sub_4073B0+178p
0040D080                                           ; sub_407670+C3p ...
0040D080
0040D080            arg_0           = dword ptr  8
0040D080            arg_4           = dword ptr  0Ch
0040D080            arg_8           = dword ptr  10h
0040D080            arg_C           = dword ptr  14h
0040D080            arg_10          = dword ptr  18h
0040D080
0040D080 55                         push    ebp
0040D081 8B EC                      mov     ebp, esp
0040D083 53                         push    ebx
0040D084 8B 45 08                   mov     eax, [ebp+arg_0]
0040D087 F7 65 0C                   mul     [ebp+arg_4]
0040D08A 03 45 10                   add     eax, [ebp+arg_8]
0040D08D 83 D2 00                   adc     edx, 0
0040D090 F7 75 14                   div     [ebp+arg_C]
0040D093 8B 5D 18                   mov     ebx, [ebp+arg_10]
0040D096 89 13                      mov     [ebx], edx
0040D098 5B                         pop     ebx
0040D099 5D                         pop     ebp
0040D09A C3                         retn
0040D09A            sub_40D080      endp

Интересно сравнивал ли кто factor.exe с другими программами (ppsiqs,rsa tool,cryptool ...) по
скорости . Я имею ввиду на одном PC под виндой при факторизации небольших чисел , просто в качестве теста .


Дата: Июн 3, 2004 17:06:23

[ Black_mirror : Если сегмент стека и данных не совпадают, то обойтись без использования bp нельзя, так как байты сэкономленные на push bp/pop bp будут с лихвой компенсированны байтами съеденными префиксом ss ]

Что-то я уже и сам начал сомневаться. Разве при адресации к стеку через sp нужно будет добавлять префикс ss?
Размер опкода, конечно, увеличится на байт из-за sp, но количество команд сократится, => скорость будет выше.



imho в коде, который привёл bogrus можно убрать все push/pop:
ebp меняем на esp, соответственно скорректировав arg_XX.
ebx меняем на ecx - его вроде как можно менять по стандарту.
Хотя во всех доках пишут, что такие небольшие по размеру ф-ции надо inline делать.
Тогда размер ещё сократится, и возможно станет меньше чем код нужный для вызова такой ф-ции :)
К тому же избавимся от очень медленных операций push перед вызовом - их операнды наверняка уже и так в регистрах, call/ret - просто не нужно.


Дата: Июн 3, 2004 18:11:50

S_T_A_S_
В реальном режиме через sp адресоваться нельзя. Можно только так: [si],[di],[bx],[bp],[bx+si],[bx+di],[bp+si],[bp+di]. Ну еще конечно смещение может быть. Хотя все это вы и без меня знаете.


Дата: Июн 3, 2004 18:40:20 · Поправил: volodya

DOS, слава богу, сдох. Поэтому отказ от bp - это нормально. Так и надо.


Дата: Июн 11, 2004 23:59:03


Мне тут RElf присоветовал поиграться с MIRACL - одной из самых быстрых математических библиотек в сети (поддерживает x86, IA-64, SPARC, ARM и т.д).

Как раз в результате разговора с ним о скоростях различных библиотек вырисовалась такая линка:
http://cr.yp.to/speed/mult.html

Данные, конечно, несколько несвежи, но реальное положение дел все-таки показывают....


Дата: Июн 12, 2004 00:18:56 · Поправил: volodya

GMP, получается, основательно быстрее...
Было бы любопытно погонять под профилировщиком...

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.047