Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
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
Пока думаю, следует разобраться с этим. Затем, можно продолжить.
[quote="Kopa"]Михаил Можно описать процедуру для изменения оптимизатора например на этом примере. [/quote]
Исходя из http://wiki.forth.org.ru/optimizer
Создаю верисию с : M\ ( POSTPONE \) ; IMMEDIATE
Создаю файл содержащий
[code] REQUIRE DoDTST ~mak\OptTr.f REQUIRE .WOP0 ~mak\dop.f
: */ [ ' DoDTST TO DTST ] -ROT * SWAP / ; [/code]
Нажимая пробел дохожу до [code] 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][/code]
Последняя команда в сочетании с предыдущей может быть заменена на IMUL EDX Для генерации условия правила создаю скрипт в файле с именем DDD.F вида: [code] CR .( OP1 @ 2+ C@) CR .( OP0 @ 2+ C@ XOR) \ индексы двух последних команд должны совпасть
\ .( DUP C@ C3 XOR )
.WOP1 DROP \ префикс W 2 байта (без индекса) .WOP0 DROP [/code]
При нажатии клавиши 'D' интерпретируется файл с именем DDD.F получаю [code]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][/code]
Добавлять правило в программу-базу OPT-RULES, нужно в определенное место, в зависимости, от количества обрабатываемых команд. Новое правило следует добавлять а конец своей группы. Группу 2-х командных правил завершает строка OP2 @ :-SET U< IF TRUE EXIT THEN начинающаяся с начала строки [code] 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 [/code]
Пока думаю, следует разобраться с этим. Затем, можно продолжить.
|
|
|
|
Добавлено: Пт янв 22, 2010 02:00 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Попробовал дать spf4 и VFX
Код: : */ -ROT * SWAP / ;
макрооптимизатор не справился:)
P.S. Михаил Можно описать процедуру для изменения оптимизатора
например на этом примере.
Интересно также какие эвристики и в какой
последовательности отработают на подготовленном n-ом тестовом Форт коде.
Используется или нет информация о количестве параметров слов при их
совместной оптимизации? ( подозреваю что нет )
Попробовал дать spf4 и VFX
[code] : */ -ROT * SWAP / ; [/code]
макрооптимизатор не справился:)
P.S. Михаил Можно описать процедуру для изменения оптимизатора
например на этом примере.
Интересно также какие эвристики и в какой
последовательности отработают на подготовленном n-ом тестовом Форт коде.
Используется или нет информация о количестве параметров слов при их
совместной оптимизации? ( подозреваю что нет )
|
|
|
|
Добавлено: Ср янв 20, 2010 21:56 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
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
[quote="Kopa"]Например: : BOUNDS OVER + SWAP ; [/quote]
SEE BOUNDS дает
[code] 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 [/code]
Сделал:
[code] MOV EDX , 0 [EBP] ADD EAX , EDX MOV 0 [EBP] , EAX MOV EAX , EDX RET NEAR [/code]
[quote="Kopa"]Анализировались, ли Форт исходники на наличие шаблонных применений связок примитивов.[/quote]
Зачем анализировать исходники? Достаточно смотреть машинный код.
[quote="Kopa"]Например >R 2DROP R> [/quote]
Чем NIP NIP не устраивает?
[quote="mOleg"]RDROP RDROP RDROP[/quote]
http://spf.cvs.sourceforge.net/spf/src/macroopt.f
|
|
|
|
Добавлено: Чт ноя 29, 2007 15:27 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): вообще, на сколько я понял, манипуляции на стеке возвратов не оптимизировались. то есть RDROP RDROP RDROP будет выглядеть как три команды, а не как одна 8( столкнулся с этим когда писал портабельный DO-LOOP.
Наверное
т.к.
Код: >R >R 2DROP R> R> >R >R 2DROP R> R> в сравнении с >R >R 2DROP 2DROP R> R>
дают разный код:)
[quote="mOleg"]вообще, на сколько я понял, манипуляции на стеке возвратов не оптимизировались. то есть RDROP RDROP RDROP будет выглядеть как три команды, а не как одна 8( столкнулся с этим когда писал портабельный DO-LOOP.[/quote]
Наверное
т.к.
[code] >R >R 2DROP R> R> >R >R 2DROP R> R> в сравнении с >R >R 2DROP 2DROP R> R> [/code]
дают разный код:)
|
|
|
|
Добавлено: Чт ноя 29, 2007 13:34 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
я спросил у Михаила.
Он ответил, что оно ему не особо надо ( по крайней мере я так понял )
я отстал
я спросил у Михаила.
Он ответил, что оно ему не особо надо ( по крайней мере я так понял )
я отстал
|
|
|
|
Добавлено: Чт ноя 29, 2007 09:21 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): вообще, на сколько я понял, манипуляции на стеке возвратов не оптимизировались. то есть RDROP RDROP RDROP будет выглядеть как три команды, а не как одна 8(
Все эти вещи оптимизируются тогда когда люди с ними сталкиваются. Михаил же пояснял что он улучшает код который видит сам. Если видите неоптимальность -- то так и скажите сразу, предложите сразу решение, а не вылезайте потом, через год, "а-а-а, а я эту бяку ещё го-о-д назад заметил!".
Когда у меня возникают запросы на оптимизацию тех или иных вариантов кода -- я сразу их отправляю Михаилу по почте. По мере своей свободности, он решает такие вопросы. Не скажу точно, но правок и дополнений в макрооптимизатор где-то под пять сделаны по таким моим просьбам.
[quote="mOleg"]вообще, на сколько я понял, манипуляции на стеке возвратов не оптимизировались. то есть RDROP RDROP RDROP будет выглядеть как три команды, а не как одна 8([/quote]
Все эти вещи оптимизируются тогда когда люди с ними сталкиваются. Михаил же пояснял что он улучшает код который видит сам. Если видите неоптимальность -- то так и скажите сразу, предложите сразу решение, а не вылезайте потом, через год, "а-а-а, а я эту бяку ещё го-о-д назад заметил!".
Когда у меня возникают запросы на оптимизацию тех или иных вариантов кода -- я сразу их отправляю Михаилу по почте. По мере своей свободности, он решает такие вопросы. Не скажу точно, но правок и дополнений в макрооптимизатор где-то под пять сделаны по таким моим просьбам.
|
|
|
|
Добавлено: Чт ноя 29, 2007 09:15 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
вообще, на сколько я понял, манипуляции на стеке возвратов не оптимизировались.
то есть RDROP RDROP RDROP будет выглядеть как три команды, а не как одна 8(
столкнулся с этим когда писал портабельный DO-LOOP.
вообще, на сколько я понял, манипуляции на стеке возвратов не оптимизировались.
то есть RDROP RDROP RDROP будет выглядеть как три команды, а не как одна 8(
столкнулся с этим когда писал портабельный DO-LOOP.
|
|
|
|
Добавлено: Чт ноя 29, 2007 08:57 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Mihail писал(а): Kopa писал(а): Трасса есть, но может имеет смысл ее выводить, когда это возможно, хотя бы в начале в привязке к именам кода сигнатуры примитива.
Не понял, чего, куда и когда выводть?
[/code]
Например: : BOUNDS OVER + SWAP ;
при дизасемблировании, по возможности во входном потоке
распознать OVER в ассемблерном виде и т.д.
В этом примере, SWAP фактически выступает селектором, к какому
элементу на стеке применить операцию +
P.S. Анализировались, ли Форт исходники на наличие шаблонных
применений связок примитивов. Например >R 2DROP R>
шаблон для сбрасывания 2-ух ( может быть n ) нижележащих
операндов под вершиной стека.
[quote="Mihail"][quote="Kopa"]Трасса есть, но может имеет смысл ее выводить, когда это возможно, хотя бы в начале в привязке к именам кода сигнатуры примитива.[/quote][/quote]
Не понял, чего, куда и когда выводть?
[/code]
Например: : BOUNDS OVER + SWAP ;
при дизасемблировании, по возможности во входном потоке
распознать OVER в ассемблерном виде и т.д.
В этом примере, SWAP фактически выступает селектором, к какому
элементу на стеке применить операцию + :)
P.S. Анализировались, ли Форт исходники на наличие шаблонных
применений связок примитивов. Например >R 2DROP R>
шаблон для сбрасывания 2-ух ( может быть n ) нижележащих
операндов под вершиной стека.
|
|
|
|
Добавлено: Чт ноя 29, 2007 08:34 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
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
[quote="Kopa"]Трасса есть, но может имеет смысл ее выводить, когда это возможно, хотя бы в начале в привязке к именам кода сигнатуры примитива.[/quote]
Не понял, чего, куда и когда выводть?
[quote="Kopa"]Проводится ли перед mасroopt.f оптимизация целевым компилятором, или это делает только mасroopt.?[/quote]
Для ЦК оптимизатор загружается в \src\tc_spf.f
Раскоментируй в \src\tc_spf.f
[code] \ ~mak\listing1.f [/code]
В C:\spf4-017\src\spf.f
Замени
S" src\macroopt.f" INCLUDED
на
S" src\macroopt.f" INCLUDED_L
Будет сгенерирован листинг macroopt.f
|
|
|
|
Добавлено: Ср ноя 28, 2007 20:30 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Теперь понятно где были грабли:)
Трасса есть, но может имеет смысл ее выводить, когда это возможно,
хотя бы в начале в привязке к именам кода сигнатуры примитива.
P.S. Проводится ли перед mасroopt.f оптимизация целевым компилятором, или
это делает только mасroopt.?
Теперь понятно где были грабли:)
Трасса есть, но может имеет смысл ее выводить, когда это возможно,
хотя бы в начале в привязке к именам кода сигнатуры примитива.
P.S. Проводится ли перед mасroopt.f оптимизация целевым компилятором, или
это делает только mасroopt.?
|
|
|
|
Добавлено: Ср ноя 28, 2007 14:00 |
|
|
|
|
|
Заголовок сообщения: |
Re: Наблюдение процесса оптимизации в SPF . |
|
|
Kopa писал(а): После определения слова наблюдаю трассу из одних нулей.
Нужно использовать дизассемблер с ограничением по HERE.
Можно использовать старый.
Но лучше подправить новый:
В http://spf.cvs.sourceforge.net/spf/lib/ext/disasm.f
: REST ( addr -- )
HERE REST-AREA ;
[quote="Kopa"] После определения слова наблюдаю трассу из одних нулей. [/quote]
Нужно использовать дизассемблер с ограничением по HERE.
Можно использовать старый.
Но лучше подправить новый:
В http://spf.cvs.sourceforge.net/spf/lib/ext/disasm.f
: REST ( addr -- )
HERE REST-AREA ;
|
|
|
|
Добавлено: Ср ноя 28, 2007 12:07 |
|
|
|
|
|
Заголовок сообщения: |
Наблюдение процесса оптимизации в SPF . |
|
|
Попробовал запустить процесс наблюдения работы оптимизатора
пересобрав ядро с : M\ ; IMMEDIATE
и подключил devel\~mak\opttr.f
После определения слова наблюдаю трассу из одних нулей.
Вопрос:
Как это правильно делать и имеет ли значение какие версии файлов в src?
Попробовал запустить процесс наблюдения работы оптимизатора
пересобрав ядро с : M\ ; IMMEDIATE
и подключил devel\~mak\opttr.f
После определения слова наблюдаю трассу из одних нулей.
Вопрос:
Как это правильно делать и имеет ли значение какие версии файлов в src?
|
|
|
|
Добавлено: Ср ноя 28, 2007 11:24 |
|
|
|
|