Прямая компиляция векторных вызовов

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

Прямая компиляция векторных вызовов

azekeprofit
Administrator
Сейчас векторы компилируются как обычные слова:

VECT a
\ a:
\ CALL _VECT-CODE
\ ' NOOP \ <-- ячейка данных хранящая xt вектора
\ CALL _TOVALUE-CODE

: r a ;
\ r:
\ CALL a

Несколько дней назад захотелось вместо вызова обычного слова (которое выполняет довольно нетривиальные вещи) заставить SPF компилировать:

\ r:
\ CALL DWORD [a+5] \ <-- a+5 окажется выровненным из-за кода выравнивания пересённого в SHEADER

Немного работы, отладки и консультаций с Михаилом и патч готов:

1. Нужно добавить в самый конец src/defkern.f :

' _VECT-CODE VALUE VECT-CODE

2. И в самом src/macroopt.f :


: CON>LIT ( CFA -- CFA TRUE | FALSE )
                  OPT? 0= IF TRUE EXIT THEN ?SET
               MM_SIZE 0= IF TRUE EXIT THEN
                 DUP C@ 0E8 <> IF TRUE EXIT THEN

                 DUP 1+  REL@ CELL+

                 DUP   CREATE-CODE  =
                 IF  DROP OPT_INIT 5 + [>T] FORLIT, FALSE OPT_CLOSE EXIT
                 THEN

                 DUP     USER-CODE  =
                 IF  DROP  OPT_INIT 'DUP _INLINE,
                   SetOP  878D W, 5 + @ , OPT   FALSE  OPT_CLOSE  EXIT
                 THEN

                 DUP     USER-VALUE-CODE  =
                 IF  DROP  OPT_INIT 'DUP _INLINE,
                   SetOP  878B W, 5 + @ , OPT   FALSE  OPT_CLOSE  EXIT
                 THEN

                 DUP  CONSTANT-CODE  =
                 IF  DROP  OPT_INIT 5 + DUP 5 +  REL@
                     TOVALUE-CODE CELL- =
                    IF   'DUP _INLINE, SetOP 0A1 C, [>T] , OPT
                    ELSE    @  FORLIT,
                    THEN   FALSE  OPT_CLOSE  EXIT
                 THEN

                 DUP 1+ REL@ CELL+ DOES-CODE =
                 IF  5 +         \ CFA
                     SWAP 5 + OPT_INIT FORLIT,
                     TRUE     OPT_CLOSE EXIT
                 THEN

                 DUP  TOUSER-VALUE-CODE =
                 IF  DROP  OPT_INIT
                     SetOP  8789 W, CELL- @ , OPT
                     'DROP _INLINE,
                     FALSE  OPT_CLOSE  EXIT
                 THEN

                  DUP TOVALUE-CODE =
                 IF DROP OPT_INIT
                     SetOP  A3 C,  CELL- [>T] ,   OPT
                     'DROP _INLINE,
                     FALSE  OPT_CLOSE  EXIT
                 THEN

                 DUP VECT-CODE  =
                 IF DROP
                   SetOP  0x15FF W, 5 + [>T] , OPT FALSE  OPT_CLOSE EXIT
                 THEN
  DROP
  TRUE
;

Изменённый код -- только в конце слова.

Сегодня днём я патч проверял -- всё работало, все толстые библиотеки и программы. А вечером поймал несовместимость. Дело в том когда вкомпилировываем непосредственный вызов вектора, то эффект от перекрытия потом этого же слова REPLACE-WORD будет непредсказуем, не говоря уж о том что он собственно подмену семантики не сделает.

Чтобы обойти этот предлагаю также "исправить" REPLACE-WORD (lib/ext/patch.f), снабдив его знанием о существовании слов порождённых VECT'ом:

\ from gforth
: REPLACE-WORD ( by-xt what-xt )

    DUP C@ 0xE8 = IF \ if we're replacing defer'red word
        DUP 1+ REL@ CELL+ ['] _VECT-CODE = IF
            >BODY ! EXIT
        THEN
    THEN

    [ HEX ] E9 [ DECIMAL ] OVER C!  \ JMP ...
    1+ DUP >R
    CELL+ -
    R> !
;

Мнения?
Reply | Threaded
Open this post in threaded view
|

Re: Прямая компиляция векторных вызовов

Andrey Cherezov
Добрый день, azekeProfit!

Ваше сообщение от 03.12.2007 21:03:

> Чтобы обойти этот предлагаю также "исправить" REPLACE-WORD
> (lib/ext/patch.f), снабдив его знанием о существовании слов порождённых
> VECT'ом:
>
> \ from gforth
> : REPLACE-WORD ( by-xt what-xt )
>
>     DUP C@ 0xE8 = IF \ if we're replacing defer'red word
>         DUP 1+ REL@ CELL+ ['] _VECT-CODE = IF
>             >BODY ! EXIT
> THEN
>     THEN
>
>     [ HEX ] E9 [ DECIMAL ] OVER C!  \ JMP ...
>     1+ DUP >R
>     CELL+ -
>     R> !
> ;
>
> Мнения?
>  
REPLACE-WORD или JMP всегда был хаком, теперь будет хаком двойной толщины,
что для хака наверное не грех. Поэтому я не против таких изменений. Но
вот смысл
пп.1и2 исходного письма мне не очень понятен.
" Сейчас векторы компилируются как обычные слова" - чем это плохо?

-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell.  From the desktop to the data center, Linux is going
mainstream.  Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Прямая компиляция векторных вызовов

ygrek-3
In reply to this post by azekeprofit
Привет,

> Мнения?

Это даёт прирост в скорости - сколько?

Могут быть другие REPLACE-WORD'ы или аналоги. С другой стороны лучше и
правильней использовать один стандартный хак чем несовместимое их
множество.

--

-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell.  From the desktop to the data center, Linux is going
mainstream.  Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev

attachment0 (196 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Прямая компиляция векторных вызовов

azekeprofit
Administrator
ygrek wrote
> Мнения?
Это даёт прирост в скорости - сколько?
Вакуумно-коне-сферический замер на скорую руку:

http://forth.org.ru/~profit/bench-vect.f

На моих машинах -- в 2-4 раза.

ygrek wrote
Могут быть другие REPLACE-WORD'ы или аналоги.
Ну, теоретически есть ещё ~micro/lib/replace.f , но оно практически уже неприменимо к SPF4.
Reply | Threaded
Open this post in threaded view
|

Re: Прямая компиляция векторных вызовов

Andrey Cherezov
Добрый день, azekeProfit!
> Вакуумно-коне-сферический замер на скорую руку:
> http://forth.org.ru/~profit/bench-vect.f
> На моих машинах -- в 2-4 раза.
>  
У меня тоже 4.
Elapsed time: 00:00:00:758
Elapsed time: 00:00:00:171


-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell.  From the desktop to the data center, Linux is going
mainstream.  Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Прямая компиляция векторных вызовов

Ruvim Pinka
In reply to this post by azekeprofit
Привет!

On Dec 3, 2007 10:03 PM, azekeProfit <[hidden email]> wrote:
Несколько дней назад захотелось вместо вызова обычного слова (которое
выполняет довольно нетривиальные вещи) заставить SPF компилировать:
\ r:
\ CALL DWORD [a+5] \ <-- a+5 окажется выровненным из-за кода выравнивания
пересённого в SHEADER
[...]

Чтобы обойти этот предлагаю также "исправить" REPLACE-WORD
(lib/ext/patch.f), снабдив его знанием о существовании слов порождённых
VECT'ом:
[...]
Мнения?

По идее, REPLACE-WORD по отношению к вектору — достаточно редкое явление, поэтому вряд ли что-то заденет.
С другой стороны, в реальных приложениях ускорение вызов вектора вряд ли что даст, т.к. само вызываемое слово обычно куда дольше работает. Должно быть, у тебя какой-то особый случай, что эта оптимизация заметна на верхнем уровне?

--
Ruvim
-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell.  From the desktop to the data center, Linux is going
mainstream.  Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Прямая компиляция векторных вызовов

azekeprofit
Administrator


On 12/5/07, Ruvim Pinka <[hidden email]> wrote:
Привет!

По идее, REPLACE-WORD по отношению к вектору — достаточно редкое явление, поэтому вряд ли что-то заденет.
lib/ext/caseins.f -- хотя тут ясно что код был написан до того как SEARCH-WORDLIST стал вектором.
С другой стороны, в реальных приложениях ускорение вызов вектора вряд ли что даст, т.к. само вызываемое слово обычно куда дольше работает. Должно быть, у тебя какой-то особый случай, что эта оптимизация заметна на верхнем уровне?

Вообще-то особого случая нет. Просто показалось нелогичным -- VALUE -- обрабатывается, VARIABLE -- обрабатывается, VECT -- нет.

Потому и спрашиваю мнений, т.к. сам в себе не нашёл достаточно мотивов для внедрения.


-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell.  From the desktop to the data center, Linux is going
mainstream.  Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Прямая компиляция векторных вызовов

Ruvim Pinka
On Dec 4, 2007 11:21 PM, Azamadt Smaguloff <[hidden email]> wrote:
Должно быть, у тебя какой-то особый случай, что эта оптимизация заметна на верхнем уровне?

Вообще-то особого случая нет. Просто показалось нелогичным -- VALUE -- обрабатывается, VARIABLE -- обрабатывается, VECT -- нет.

Потому и спрашиваю мнений, т.к. сам в себе не нашёл достаточно мотивов для внедрения.

Т.к. это внутренность оптимизатора, и при возникновении необходимости отключить фичу достаточно поставить 0 в VECT-CODE (?), то ничего не имею против ее включения. И не скажу за, т.к. пока не востребованно :)

--
Ruvim
-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev