Forth
http://fforum.winglion.ru/

Наблюдение процесса оптимизации в SPF .
http://fforum.winglion.ru/viewtopic.php?f=18&t=1041
Страница 1 из 1

Автор:  Kopa [ Ср ноя 28, 2007 11:24 ]
Заголовок сообщения:  Наблюдение процесса оптимизации в SPF .

Попробовал запустить процесс наблюдения работы оптимизатора
пересобрав ядро с : M\ ; IMMEDIATE
и подключил devel\~mak\opttr.f

После определения слова наблюдаю трассу из одних нулей.

Вопрос:
Как это правильно делать и имеет ли значение какие версии файлов в src?

Автор:  Mihail [ Ср ноя 28, 2007 12:07 ]
Заголовок сообщения:  Re: Наблюдение процесса оптимизации в SPF .

Kopa писал(а):
После определения слова наблюдаю трассу из одних нулей.


Нужно использовать дизассемблер с ограничением по HERE.
Можно использовать старый.
Но лучше подправить новый:
В http://spf.cvs.sourceforge.net/spf/lib/ext/disasm.f
: REST ( addr -- )
HERE REST-AREA ;

Автор:  Kopa [ Ср ноя 28, 2007 14:00 ]
Заголовок сообщения: 

Теперь понятно где были грабли:)

Трасса есть, но может имеет смысл ее выводить, когда это возможно,
хотя бы в начале в привязке к именам кода сигнатуры примитива.

P.S. Проводится ли перед mасroopt.f оптимизация целевым компилятором, или
это делает только mасroopt.?

Автор:  Mihail [ Ср ноя 28, 2007 20:30 ]
Заголовок сообщения: 

Kopa писал(а):
Трасса есть, но может имеет смысл ее выводить, когда это возможно,
хотя бы в начале в привязке к именам кода сигнатуры примитива.


Не понял, чего, куда и когда выводть?

Kopa писал(а):
Проводится ли перед mасroopt.f оптимизация целевым компилятором, или
это делает только mасroopt.?


Для ЦК оптимизатор загружается в \src\tc_spf.f
Раскоментируй в \src\tc_spf.f
Код:
\ ~mak\listing1.f


В C:\spf4-017\src\spf.f
Замени
S" src\macroopt.f" INCLUDED
на
S" src\macroopt.f" INCLUDED_L

Будет сгенерирован листинг macroopt.f

Автор:  Kopa [ Чт ноя 29, 2007 08:34 ]
Заголовок сообщения: 

Mihail писал(а):
Kopa писал(а):
Трасса есть, но может имеет смысл ее выводить, когда это возможно,
хотя бы в начале в привязке к именам кода сигнатуры примитива.

Не понял, чего, куда и когда выводть?
[/code]

Например: : BOUNDS OVER + SWAP ;
при дизасемблировании, по возможности во входном потоке
распознать OVER в ассемблерном виде и т.д.

В этом примере, SWAP фактически выступает селектором, к какому
элементу на стеке применить операцию + :)

P.S. Анализировались, ли Форт исходники на наличие шаблонных
применений связок примитивов. Например >R 2DROP R>
шаблон для сбрасывания 2-ух ( может быть n ) нижележащих
операндов под вершиной стека.

Автор:  mOleg [ Чт ноя 29, 2007 08:57 ]
Заголовок сообщения: 

вообще, на сколько я понял, манипуляции на стеке возвратов не оптимизировались.
то есть RDROP RDROP RDROP будет выглядеть как три команды, а не как одна 8(
столкнулся с этим когда писал портабельный DO-LOOP.

Автор:  profiT [ Чт ноя 29, 2007 09:15 ]
Заголовок сообщения: 

mOleg писал(а):
вообще, на сколько я понял, манипуляции на стеке возвратов не оптимизировались.
то есть RDROP RDROP RDROP будет выглядеть как три команды, а не как одна 8(

Все эти вещи оптимизируются тогда когда люди с ними сталкиваются. Михаил же пояснял что он улучшает код который видит сам. Если видите неоптимальность -- то так и скажите сразу, предложите сразу решение, а не вылезайте потом, через год, "а-а-а, а я эту бяку ещё го-о-д назад заметил!".

Когда у меня возникают запросы на оптимизацию тех или иных вариантов кода -- я сразу их отправляю Михаилу по почте. По мере своей свободности, он решает такие вопросы. Не скажу точно, но правок и дополнений в макрооптимизатор где-то под пять сделаны по таким моим просьбам.

Автор:  mOleg [ Чт ноя 29, 2007 09:21 ]
Заголовок сообщения: 

я спросил у Михаила.
Он ответил, что оно ему не особо надо ( по крайней мере я так понял )
я отстал

Автор:  Kopa [ Чт ноя 29, 2007 13:34 ]
Заголовок сообщения: 

mOleg писал(а):
вообще, на сколько я понял, манипуляции на стеке возвратов не оптимизировались.
то есть RDROP RDROP RDROP будет выглядеть как три команды, а не как одна 8(
столкнулся с этим когда писал портабельный DO-LOOP.


Наверное
т.к.
Код:
  >R >R 2DROP R> R>   >R >R 2DROP R> R>
в сравнении с
   >R >R 2DROP  2DROP R> R>


дают разный код:)

Автор:  Mihail [ Чт ноя 29, 2007 15:27 ]
Заголовок сообщения: 

Kopa писал(а):
Например: : BOUNDS OVER + SWAP ;


SEE BOUNDS
дает

Код:
58E8A0 034500      ADD     EAX , 0 [EBP]
58E8A3 8B5500      MOV     EDX , 0 [EBP]
58E8A6 894500      MOV     0 [EBP] , EAX
58E8A9 8BC2      MOV     EAX , EDX
58E8AB C3      RET     NEAR


Сделал:

Код:
   MOV     EDX , 0 [EBP]
   ADD     EAX , EDX
   MOV     0 [EBP] , EAX
   MOV     EAX , EDX
   RET     NEAR


Kopa писал(а):
Анализировались, ли Форт исходники на наличие шаблонных
применений связок примитивов.


Зачем анализировать исходники? Достаточно смотреть машинный код.


Kopa писал(а):
Например >R 2DROP R>


Чем NIP NIP не устраивает?

mOleg писал(а):
RDROP RDROP RDROP


http://spf.cvs.sourceforge.net/spf/src/macroopt.f

Автор:  Kopa [ Ср янв 20, 2010 21:56 ]
Заголовок сообщения: 

Попробовал дать spf4 и VFX
Код:
: */ -ROT * SWAP / ;


макрооптимизатор не справился:)

P.S. Михаил Можно описать процедуру для изменения оптимизатора
например на этом примере.
Интересно также какие эвристики и в какой
последовательности отработают на подготовленном n-ом тестовом Форт коде.
Используется или нет информация о количестве параметров слов при их
совместной оптимизации? ( подозреваю что нет )

Автор:  Mihail [ Пт янв 22, 2010 02:00 ]
Заголовок сообщения: 

Kopa писал(а):
Михаил Можно описать процедуру для изменения оптимизатора
например на этом примере.


Исходя из http://wiki.forth.org.ru/optimizer
Создаю верисию с : M\ ( POSTPONE \) ; IMMEDIATE

Создаю файл содержащий

Код:
REQUIRE DoDTST ~mak\OptTr.f
REQUIRE .WOP0 ~mak\dop.f

: */
[ ' DoDTST TO DTST ]
-ROT * SWAP / ;


Нажимая пробел дохожу до
Код:
579DDB 8B5504           MOV     EDX , 4 [EBP]
579DDE 894504           MOV     4 [EBP] , EAX
579DE1 8B4500           MOV     EAX , 0 [EBP]
579DE4 895500           MOV     0 [EBP] , EDX
579DE7 F76D00           IMUL    0 [EBP]


Последняя команда в сочетании с предыдущей может быть заменена на IMUL EDX
Для генерации условия правила создаю скрипт в файле с именем DDD.F
вида:
Код:
CR .( OP1 @ 2+ C@)
CR .( OP0 @ 2+ C@  XOR)  \ индексы двух последних команд должны совпасть

\ .( DUP C@ C3 XOR )

.WOP1  DROP  \ префикс W 2 байта (без индекса)
.WOP0  DROP


При нажатии клавиши 'D' интерпретируется файл с именем DDD.F
получаю
Код:
OP1 @ 2+ C@
OP0 @ 2+ C@  XOR
OP1 @ W@ 6DF7 XOR OR \ 579DE7 F76D00            IMUL    0 [EBP]
OP0 @ W@ 558B XOR OR \ 579DEA 8B5504            MOV     EDX , 4 [EBP]


Добавлять правило в программу-базу OPT-RULES, нужно в определенное
место, в зависимости, от количества обрабатываемых команд.
Новое правило следует добавлять а конец своей группы.
Группу 2-х командных правил завершает строка
OP2 @ :-SET U< IF TRUE EXIT THEN
начинающаяся с начала строки
Код:
OP1 @ 2+ C@
OP0 @ 2+ C@  XOR
OP1 @ W@ 5589 XOR OR \ 895500            MOV     0 [EBP] , EDX
OP0 @ W@ 6DF7 XOR OR \ F76D00            IMUL    0 [EBP]
0= IF  M\ 296 DTST   \ уникальный четный номер правила (вспомогательное средство)
   EAF7 OP0 @ W!   \  IMUL    EDX
       -1 ALLOT  \ удаляем лишний байт
       FALSE  M\ 297 DTST  \ на 1 больше - завершитель
       EXIT
   THEN


Пока думаю, следует разобраться с этим. Затем, можно продолжить.

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/