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/ |