JIT-Сompiler

14 messages Options
Embed this post
Permalink
Ruvim Pinka

JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
Привет!

On 12/18/06, Dmitry Yakimov <[hidden email]> wrote:
> >> Я же предлагаю нормальный JIT - с
> >> субоптимальным распределением регистров.

Т.е., основная его цель — это замена (альтернатива) обычному оптимизатору?


> >> И примитивы SPF5 будут совсем другими нежели в SPF4, и просто будет
> >> меньше гораздо, всего 10-15.

А для чего тут стремится к уменьшению числа примитивов, мне не понятно.

Портируемость-то системы это не упростит, т.к. зависимая от проца
часть JITC наверняка будет больше сэкономленных примитивов (сужу по
соотношению исходников макроподстановщика и остальной системы в SPF4).


--
Ruvim
Dmitry Yakimov-2

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
Привет,

Ruvim Pinka wrote:

> Привет!
>
> On 12/18/06, Dmitry Yakimov <[hidden email]> wrote:
>  
>>>> Я же предлагаю нормальный JIT - с
>>>> субоптимальным распределением регистров.
>>>>        
>
> Т.е., основная его цель — это замена (альтернатива) обычному оптимизатору?
>  

Да

>
>  
>>>> И примитивы SPF5 будут совсем другими нежели в SPF4, и просто будет
>>>> меньше гораздо, всего 10-15.
>>>>        
>
> А для чего тут стремится к уменьшению числа примитивов, мне не понятно.
>
> Портируемость-то системы это не упростит, т.к. зависимая от проца
> часть JITC наверняка будет больше сэкономленных примитивов (сужу по
> соотношению исходников макроподстановщика и остальной системы в SPF4).
>  

Да, но кто будет сразу портировать JIT? Наверное сначала просто
портируют быстренько 10 примитивов и VM чтобы запустить и работало, и
надо ли JIT портировать на новую платформу - еще встанет вопрос - нужен
ли он там или скорости достаточно.

И потом - для уменьшения JIT лучше чтобы примитивов было меньше, при том
же качестве оптимизации.

Но небольшое количество примитивов в ядре не проблема.
Потом мы просто делаем так:

Например мы в ядре определили:

: R@ R> R> DUP SWAP >R SWAP >R ;

(это из наметков к spf5 )

А потом когда мы делаем полноценную форт систему из ядра мы делаем так:
?CODE R@ \ 94
     LEA EBP, -4 [EBP]
     MOV [EBP], EAX
     MOV EAX, 4 [ESP]
     RET
END-CODE  

где слово ?CODE компилирует R@ и заменяет им существующий R@ в
компилируемом кодофайле.

то есть ядро у нас получается максимально независимым.

а еще в ядро можно вынести состав словарной статьи и слова : ; CREATE
тогда проще делать ядра с разными моделями шитого кода.

мы все таки форт делаем, а определяющие слова есть в любом форт
стандарте и в любой форт системе.

Best Regards,
Dmitry Yakimov


Ruvim Pinka

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
Привет!

On 12/21/06, Dmitry Yakimov <[hidden email]> wrote:
> > Т.е., основная его цель — это замена (альтернатива) обычному оптимизатору?
> Да

Предполагается же, что он сможет дать лучший результат? — т.к. в
"руках" у него  целиком определение в шитом коде, которое он
разворачивает и оптимизирует, в отличии от подстановщика, который
имеет только начало определения (целиком на последнем шаге только), и
оно в маш-коде, и с ограничениями из-за ветвлений (когда есть
неразрешенные ссылки вперед и т.п.). Вообще, это вопрос к Михаилу,
сильно ли мешают оптимизатору перечисленные особенности.

[...]
> Да, но кто будет сразу портировать JIT? Наверное сначала просто
> портируют быстренько 10 примитивов и VM чтобы запустить и работало, и
> надо ли JIT портировать на новую платформу - еще встанет вопрос - нужен
> ли он там или скорости достаточно.

понял :)

[...]

> Например мы в ядре определили:
>
> : R@ R> R> DUP SWAP >R SWAP >R ;
>
> (это из наметков к spf5 )
>
> А потом когда мы делаем полноценную форт систему из ядра мы делаем так:
> ?CODE R@ \ 94
>      LEA EBP, -4 [EBP]
>      MOV [EBP], EAX
>      MOV EAX, 4 [ESP]
>      RET
> END-CODE

А перед использованием этого слова в ядро еще надо загрузить ассемблер
(и допустимо загрузить его во временное хранилище).

> где слово ?CODE компилирует R@ и заменяет им существующий R@ в
> компилируемом кодофайле.

Т.е., как я понимаю: оно патчит существующий бинарный образ; или же, в
процессе JIT-компиляции (даже лучше сказать, трансляции), берется
новое определение вместо старого.

А чем это лучше новой целевой сборки ядра из исходников, в процессе
которой вместо высокоуровневого определения слова "R@" используется
низкоуровневое?


--
Ruvim
Dmitry Yakimov-2

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
Привет,

Ruvim Pinka wrote:

> Привет!
>
> On 12/21/06, Dmitry Yakimov <[hidden email]> wrote:
>  
>>> Т.е., основная его цель — это замена (альтернатива) обычному оптимизатору?
>>>      
>> Да
>>    
>
> Предполагается же, что он сможет дать лучший результат?

Более того утверждается это.
Зная информацию о форт словах мы можем провести макроподстановку и
constant folding прямо в форт коде, и это будет платформонезависимо.
А также произвести другие платформонезависимые оптимизации, например
замена медленного DO LOOP на быстрый и естественный для машины FOR NEXT.
А зная стековую нотацию всех слов (достаточно знать стековую нотацию
примитивов и winapi слов чтобы рассчитать стековую нотацию
высокоуровневых слов) мы можем разложить не верхние два элемента стека
по регистрам, как сейчас в SPF, а 4, 5, 6, сколько нужно.

Смотри какие оптимизации можно провести на уровне платфоронезависимого
форта:

Оптимизации (в таком порядке):

0. Сделаем макроподстановку вызываемых слов.
   Уровень вложения и размер подставляемого слова.

1. Constant propagation
   Константы переводим в литералы, затем применяем Constant folding

2. Constant folding
   10 10 * -> 100

3. Оптимизация деления на константу.
   Заменит деление на константы сдвигами и умножениями, например:
        x/9 -> (x*57)>>9
        x/2 -> x << 1

4. Dead code elimination
   0 IF THEN или BEGIN 0 WHILE ... REPEAT

5. Замена циклов DO LOOP где не используется I J циклом FOR NEXT
   (LEAVE эмулируется R> DROP)

6. Loop unrolling.
   До определенного предела делаем LOOP unrolling, если в цикле не
   используется I J и параметры цикла константы

Data flow analysis

7. Исключим циклы типа SWAP SWAP, OVER OVER 2DROP и т.п.

8. Сделаем замену более оптимальными конструкциями, например
      OVER OVER NIP -> DUP

      \ если справа примитивы!
      DUP + -> 2*
      SWAP OVER -> TUCK
      >R DROP R> -> NIP
      ROT ROT -> -ROT
      DROP DROP -> 2DROP
      OVER OVER -> 2DUP
      >R SWAP R> SWAP -> ROT
      >R DUP R> SWAP -> OVER
      >R ROT ROT R> ROT ROT -> 2SWAP
      2>R 2DUP 2R> 2SWAP -> 2OVER
      NEGATE + -> -
      XOR 0= -> =
      DUP >R @ + R> ! -> +!
      DUP 0< -> S>D

8. По возможности объединим литералы в группы, это даст более оптимальный
   код на стадии щелевого оптимизатора

Даже если после всего этого не делать распределение регистров а просто
сделать тупую макроподстановку примитивов, это уже будет неплохо, и это
опять будет почти платформо независимо.
> — т.к. в
> "руках" у него  целиком определение в шитом коде, которое он
> разворачивает и оптимизирует, в отличии от подстановщика, который
> имеет только начало определения (целиком на последнем шаге только), и
> оно в маш-коде, и с ограничениями из-за ветвлений (когда есть
> неразрешенные ссылки вперед и т.п.). Вообще, это вопрос к Михаилу,
> сильно ли мешают оптимизатору перечисленные особенности.
>  

Это дополнительные трудности, типа декомпиляции асм кода, что сейчас
делается, и компиляция его обратно в асм код.

> [...]
>  
>> Да, но кто будет сразу портировать JIT? Наверное сначала просто
>> портируют быстренько 10 примитивов и VM чтобы запустить и работало, и
>> надо ли JIT портировать на новую платформу - еще встанет вопрос - нужен
>> ли он там или скорости достаточно.
>>    
>
> понял :)
>
> [...]
>  
>> Например мы в ядре определили:
>>
>> : R@ R> R> DUP SWAP >R SWAP >R ;
>>
>> (это из наметков к spf5 )
>>
>> А потом когда мы делаем полноценную форт систему из ядра мы делаем так:
>> ?CODE R@ \ 94
>>      LEA EBP, -4 [EBP]
>>      MOV [EBP], EAX
>>      MOV EAX, 4 [ESP]
>>      RET
>> END-CODE
>>    
>
> А перед использованием этого слова в ядро еще надо загрузить ассемблер
> (и допустимо загрузить его во временное хранилище).
>  
Это будет при сборке форт системы и там асм точно будет.

>  
>> где слово ?CODE компилирует R@ и заменяет им существующий R@ в
>> компилируемом кодофайле.
>>    
>
> Т.е., как я понимаю: оно патчит существующий бинарный образ; или же, в
> процессе JIT-компиляции (даже лучше сказать, трансляции), берется
> новое определение вместо старого.
>
> А чем это лучше новой целевой сборки ядра из исходников, в процессе
> которой вместо высокоуровневого определения слова "R@" используется
> низкоуровневое?
>  
Тем что у нас тогда будет два R@, и одно из них медленное, потому что
старое точно будет где-то использоваться.

Вопрос в том как элегантно заменить слово. Если у нас прямой шитый, то
next может выглядеть так:


_NEXT:

lodsd
jmp eax

_EXIT:
pop esi
lodsd
jmp eax

IP находится в ESI. (это все на уровне предположим, регистры не факт что
будут именно такими).
Но надо учесть что нам нужна быстрая VM.

То есть по адресу слова находится jmp ENTER
Ну мы заменим его на JMP R@ в нашем примере с R@, а оптимизатор поймет
что если первая команда примитива JMP ... то значит это редирект на
другой примитив.

Best Regards,
Dmitry Yakimov.


Ruvim Pinka

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
On 12/21/06, Dmitry Yakimov <[hidden email]> wrote:

>
> Более того утверждается это.
> Зная информацию о форт словах мы можем провести макроподстановку и
> constant folding прямо в форт коде, и это будет платформонезависимо.
[...]
Проясняется, спасибо.  Да, немалая работа реализовать это все :)


> >> Например мы в ядре определили:
> >>
> >> : R@ R> R> DUP SWAP >R SWAP >R ;

> >> А потом когда мы делаем полноценную форт систему из ядра мы делаем так:
> >> ?CODE R@ \ 94
> >>      LEA EBP, -4 [EBP]
> >>      MOV [EBP], EAX
> >>      MOV EAX, 4 [ESP]
> >>      RET
> >> END-CODE
> >
> Это будет при сборке форт системы и там асм точно будет.

Давай эту сборку обозначать целевой, чтобы не путалось.

Значит, хочу понять, допустимо ли в твоей модели сделать при целевой
сборке так: если есть низкоуровневое определение, используется оно (и
высокоуровневое вообще в целевую систему не попадает), если нету,
используется высокоуровневое?  Или же, что-то мешает так сделать?
(пример бы :)

> Вопрос в том как элегантно заменить слово.
Вот я и думаю, может совсем обойтись без этой замены.

Еще, у меня была идея делать "двухпроходную компиляцию": на первой
фазе определение слова откладывается в очень простую цепочку, а по
завершении определения идет вторая фаза — эта цепочка транслируется в
реальный код.

--
Ruvim
Dmitry Yakimov-2

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
Привет,

Ruvim Pinka wrote:

> On 12/21/06, Dmitry Yakimov <[hidden email]> wrote:
>
>  
>> Более того утверждается это.
>> Зная информацию о форт словах мы можем провести макроподстановку и
>> constant folding прямо в форт коде, и это будет платформонезависимо.
>>    
> [...]
> Проясняется, спасибо.  Да, немалая работа реализовать это все :)
>  

Это все технически легко формализуемо, поэтому имхо это проще чем работа
по оптимизации SPF4.

>
>  
>>>> Например мы в ядре определили:
>>>>
>>>> : R@ R> R> DUP SWAP >R SWAP >R ;
>>>>        
>
>  
>>>> А потом когда мы делаем полноценную форт систему из ядра мы делаем так:
>>>> ?CODE R@ \ 94
>>>>      LEA EBP, -4 [EBP]
>>>>      MOV [EBP], EAX
>>>>      MOV EAX, 4 [ESP]
>>>>      RET
>>>> END-CODE
>>>>        
>> Это будет при сборке форт системы и там асм точно будет.
>>    
>
> Давай эту сборку обозначать целевой, чтобы не путалось.
>
> Значит, хочу понять, допустимо ли в твоей модели сделать при целевой
> сборке так: если есть низкоуровневое определение, используется оно (и
> высокоуровневое вообще в целевую систему не попадает), если нету,
> используется высокоуровневое?  Или же, что-то мешает так сделать?
> (пример бы :)
>  

Можно сделать вот так:
Сдвинуть кодофайл, вставить примитив, и пофиксить адреса JMP ENTER и
адреса высокоуровневых слов после примитива.

А можно сделать компиляцию в два прохода, как ты упоминаешь, можно в
некоторую промежуточную форму - например двухсвязный список слов в
котором можно менять nodes, то есть байткод но высокого уровня.
А потом эту промежуточную форму переведем в байткод VM.

Вообще это интересно, потому что здесь всплывает одна проблема  - вопрос
- будут ли у нас адреса высокоуровневых слов абсолютны или относительны.
Если относительны тогда легко делать dll, если абсолютны тогда dll
делать плохо, но в VM надо использовать регистр, которых итак мало.

А еще есть вариант - когда относительны, но мы на этапе загрузки делаем
их абсолютными небольшой асм функцией. И это даже может подойти для ROM,
мы просто заранее делаем fixup перед прошивкой. (правда неясно как быть
с xt сохраненными например в VECT переменных).

В другой стороны если из spf4 умудрялись делать dll то из spf5 будет
легче, даже и со всеми абсолютными адресами, и может быть стоит все
адреса сделать абсолютными и не мудрить здесь.

>> Вопрос в том как элегантно заменить слово.
>>    
> Вот я и думаю, может совсем обойтись без этой замены.
>  
> Еще, у меня была идея делать "двухпроходную компиляцию": на первой
> фазе определение слова откладывается в очень простую цепочку, а по
> завершении определения идет вторая фаза — эта цепочка транслируется в
> реальный код.
>
>  

Best Regards,
Dmitry Yakimov


Ruvim Pinka

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
On 12/21/06, Dmitry Yakimov <[hidden email]> wrote:

> >>>> А потом когда мы делаем полноценную форт систему из ядра мы делаем так:
> >> Это будет при сборке форт системы и там асм точно будет.
(вот, а то я тут твою фразу "полноценную форт систему из ядра" понял
как обычное инкрементное расширение работающей системы).


[...]
> Можно сделать вот так:
> Сдвинуть кодофайл, вставить примитив, и пофиксить адреса JMP ENTER и
> адреса высокоуровневых слов после примитива.

А если так:

1. Целевая сборка с минимальным числом примитивов, фрагмент:
INCLUDE forthproc-1-low-level  \ минимальное число примитивов
INCLUDE forthproc-2-hi-level  \ доведение до базового уровня, на форте
   \ ^ в нем определено : R@ 2R> OVER >R >R ;
INCLUDE forthproc-3-hi-level  \ остальное тоже на форте

2. После того, как поигрались, проверили, и дописали примитивов,
делаем новую целевую сборку со средним числом примитивов, фрагмент:
INCLUDE forthproc-1-low-level \ тот же минимальный набор примитивов
INCLUDE forthproc-2-low-level \ дополнительный набор примитивов
   \ ^ а в этом определено CODE R@ ... END-CODE
INCLUDE forthproc-3-hi-level   \ это осталось на форте, как и было

Т.е., тут мы второй уровень реализовали на асме, а вначале
использовался вариант на форте. По моему, это проще, чем двигать
кодофайл :)  Не понимаю, где здесь несовместимость с твоей моделью
JITC.  Правда, тут дискретность деления не слово, а набор слов, целый
файл, но это вполне допустимо в нашем случае.


> Вообще это интересно, потому что здесь всплывает одна проблема  - вопрос
> - будут ли у нас адреса высокоуровневых слов абсолютны или относительны.
> Если относительны тогда легко делать dll, если абсолютны тогда dll
> делать плохо, но в VM надо использовать регистр, которых итак мало.

Наиболее сильный аргумент в пользу реальных адресов — удосбство
взаимодействие с OS и другими DLL. В меж-интерфейсах ходят абсолютные
адреса. Каждый раз делать REL>ABS, ABS>REL напрягает, и код засоряет.


--
Ruvim
Dmitry Yakimov-2

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
Ruvim Pinka wrote:

> On 12/21/06, Dmitry Yakimov <[hidden email]> wrote:
>
>  
>>>>>> А потом когда мы делаем полноценную форт систему из ядра мы делаем так:
>>>>>>            
>>>> Это будет при сборке форт системы и там асм точно будет.
>>>>        
> (вот, а то я тут твою фразу "полноценную форт систему из ядра" понял
> как обычное инкрементное расширение работающей системы).
>
>
> [...]
>  
>> Можно сделать вот так:
>> Сдвинуть кодофайл, вставить примитив, и пофиксить адреса JMP ENTER и
>> адреса высокоуровневых слов после примитива.
>>    
>
> А если так:
>
> 1. Целевая сборка с минимальным числом примитивов, фрагмент:
> INCLUDE forthproc-1-low-level  \ минимальное число примитивов
> INCLUDE forthproc-2-hi-level  \ доведение до базового уровня, на форте
>    \ ^ в нем определено : R@ 2R> OVER >R >R ;
> INCLUDE forthproc-3-hi-level  \ остальное тоже на форте
>
> 2. После того, как поигрались, проверили, и дописали примитивов,
> делаем новую целевую сборку со средним числом примитивов, фрагмент:
> INCLUDE forthproc-1-low-level \ тот же минимальный набор примитивов
> INCLUDE forthproc-2-low-level \ дополнительный набор примитивов
>    \ ^ а в этом определено CODE R@ ... END-CODE
> INCLUDE forthproc-3-hi-level   \ это осталось на форте, как и было
>
> Т.е., тут мы второй уровень реализовали на асме, а вначале
> использовался вариант на форте. По моему, это проще, чем двигать
> кодофайл :)  Не понимаю, где здесь несовместимость с твоей моделью
> JITC.  Правда, тут дискретность деления не слово, а набор слов, целый
> файл, но это вполне допустимо в нашем случае.
>
>  
Да, согласен. Надо будет только четко прописать какие слова в каком файле.

>  
>> Вообще это интересно, потому что здесь всплывает одна проблема  - вопрос
>> - будут ли у нас адреса высокоуровневых слов абсолютны или относительны.
>> Если относительны тогда легко делать dll, если абсолютны тогда dll
>> делать плохо, но в VM надо использовать регистр, которых итак мало.
>>    
>
> Наиболее сильный аргумент в пользу реальных адресов — удосбство
> взаимодействие с OS и другими DLL. В меж-интерфейсах ходят абсолютные
> адреса. Каждый раз делать REL>ABS, ABS>REL напрягает, и код засоряет.
>
>  
Здесь тоже согласен, абсолютные адреса сильно упростят общение с ОС и
резко повысят скорость VM.
Ну а dll в принципе можно будет сделать как и в SPF4, даже проще, потому
что кодофайл имеет четко определенный формат.


Best Regards,
Dmitry Yakimov


Mihail Maksimov-2

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
In reply to this post by Ruvim Pinka
Hi Ruvim!

> Предполагается же, что он сможет дать лучший результат?

  При условии добавления правил, систему подъмены маш-кода
никто не превзойдет.

> "руках" у него  целиком определение в шитом коде, которое он
> разворачивает и оптимизирует, в отличии от подстановщика, который
> имеет только начало определения (целиком на последнем шаге только), и
> оно в маш-коде, и с ограничениями из-за ветвлений (когда есть
> неразрешенные ссылки вперед и т.п.).

  Ограничений нет. Можно обработать программу целиком, когда все
ссылки уже указывают на требуемый код.

Dmitry Yakimov-2

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
Привет,

А для GForth еще три года назад JITC написали :)
http://www.complang.tuwien.ac.at/anton/vmgen/html-docs/index.html#Top

Mihail wrote:
> Hi Ruvim!
>
>  
>> Предполагается же, что он сможет дать лучший результат?
>>    
>
>   При условии добавления правил, систему подъмены маш-кода
> никто не превзойдет.
>  
Да, при условии что количество правил бесконечно большое число :)

Речь идет о том чтобы малой кровью, то есть вполне понятными алгоритмами
распределить регистры почти оптимально. Это будет в 10 раз дешевле
аналогичной системы подмены маш. кода (имхо).

>  
>> "руках" у него  целиком определение в шитом коде, которое он
>> разворачивает и оптимизирует, в отличии от подстановщика, который
>> имеет только начало определения (целиком на последнем шаге только), и
>> оно в маш-коде, и с ограничениями из-за ветвлений (когда есть
>> неразрешенные ссылки вперед и т.п.).
>>    
>
>   Ограничений нет. Можно обработать программу целиком, когда все
> ссылки уже указывают на требуемый код.
>
>  

Пока не будет registry allocation да, можно использовать имеющийся
оптимизатор от SPF4.

Best Regards,
Dmitry Yakimov.


Mihail Maksimov-2

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
 Привет,
From: "Dmitry Yakimov" <[hidden email]>

>>   При условии добавления правил, систему подъмены маш-кода
>> никто не превзойдет.
>>
> Да, при условии что количество правил бесконечно большое число :)

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

> Речь идет о том чтобы малой кровью, то есть вполне понятными алгоритмами
> распределить регистры почти оптимально. Это будет в 10 раз дешевле
> аналогичной системы подмены маш. кода (имхо).

  За счет чего?  На уровне маш-кода правил будет меньше т.к.
машинных команд меньше чем шытых кодов. И те можно объединять
в группы  и абстрагироваться от применяемых регистров.
Без уровня маш-кода все равно необойтись.

>
> Пока не будет registry allocation да, можно использовать имеющийся
> оптимизатор от SPF4.

  На сколько я понимаю этот  термин, я это использую, когда
ячейки стека заменяю регистром.

Ruvim Pinka

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
In reply to this post by Dmitry Yakimov-2
On 12/22/06, Dmitry Yakimov <[hidden email]> wrote:

> А для GForth еще три года назад JITC написали :)
> http://www.complang.tuwien.ac.at/anton/vmgen/html-docs/index.html#Top

Там слово JIT употребляется один раз, да и то по отношению к JVM. Вобчем, не обнаружил...  пальцем ткни пожалста :)

> Речь идет о том чтобы малой кровью, то есть вполне понятными алгоритмами
> распределить регистры почти оптимально. Это будет в 10 раз дешевле
> аналогичной системы подмены маш. кода (имхо).

А  EXECUTE, EVALUATE и т.п. останутся по старинке, на стеке.

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

Что бы мне хотелось в оптимизаторе — простоту представления и добавления правил.

--
Ruvim

PS  /track/spf/ недоступен чего-то.
Dmitry Yakimov-2

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
Ruvim Pinka wrote:

> On 12/22/06, Dmitry Yakimov <[hidden email] <mailto:[hidden email]>>
> wrote:
>
> > А для GForth еще три года назад JITC написали :)
> > http://www.complang.tuwien.ac.at/anton/vmgen/html-docs/index.html#Top
>
> Там слово JIT употребляется один раз, да и то по отношению к JVM.
> Вобчем, не обнаружил...  пальцем ткни пожалста :)
>
> > Речь идет о том чтобы малой кровью, то есть вполне понятными
> алгоритмами
> > распределить регистры почти оптимально. Это будет в 10 раз дешевле
> > аналогичной системы подмены маш. кода (имхо).
>
> А  EXECUTE, EVALUATE и т.п. останутся по старинке, на стеке.
>
> Как я понимаю, после in-line подстановки нескольких примитивов, для
> дальнейшей оптимизации надо все-равно на уровне маш-кода срабатывать
> границу.
Да нет же :)

Между двумя высокоуровневыми вызовами, которые мы не можем инлайнить (по
причине того что они большие, либо не критичные к скорости), мы вообще
примитивы не подставляем. Раз мы знаем стековую нотацию примитивов, мы
сразу делаем register allocation.
Конечно всякие + - потребуют спец. обработки в JITC - он должен о них
знать. А те о которых он не знает  мы будем рассматривать как
высокоуровневые слова и просто их заинлайним. Вот в этом случае можно
пройтись peephole optimizer от spf4.
>
> Что бы мне хотелось в оптимизаторе — простоту представления и
> добавления правил.
>
> --
> Ruvim
>
> PS  /track/spf/ недоступен чего-то.

Да, починю, maintenance на сервере производил и затер конфиг.

Best Regards,
Dmitry Yakimov


Dmitry Yakimov-2

Re: JIT-Сompiler

Reply Threaded More More options
Print post
Permalink
In reply to this post by Mihail Maksimov-2
Привет,

Mihail wrote:

>  Привет,
> From: "Dmitry Yakimov" <[hidden email]>
>
>  
>>>   При условии добавления правил, систему подъмены маш-кода
>>> никто не превзойдет.
>>>
>>>      
>> Да, при условии что количество правил бесконечно большое число :)
>>    
>
>   Не нужно бесконечно большое, т.к. комбинаций обрабатываемого
> маш-кода конечное число.  К тому-же меня интересует только оптимизация
> реальных, критических по быстродействию программ.
>
>  
>> Речь идет о том чтобы малой кровью, то есть вполне понятными алгоритмами
>> распределить регистры почти оптимально. Это будет в 10 раз дешевле
>> аналогичной системы подмены маш. кода (имхо).
>>    
>
>   За счет чего?  

За счет того что сейчас в текущей системе оптимизации очень сложно
добавлять правила.
Фактически это библиотека одного человека и мало кто понимает как это
вообще работает.
> На уровне маш-кода правил будет меньше т.к.
> машинных команд меньше чем шытых кодов. И те можно объединять
> в группы  и абстрагироваться от применяемых регистров.
> Без уровня маш-кода все равно необойтись.
>  
Да, не обойтись, согласен, вернее можно, но это будет не 100% что можно
выжать. Мы можем применить подстановку маш. кодов после высокоуровневых
оптимизаций, и для тех примитивов о которых не знает JITC - там где JITC
не сможет раскидать стек по регистрам.
>  
>> Пока не будет registry allocation да, можно использовать имеющийся
>> оптимизатор от SPF4.
>>    
>
>   На сколько я понимаю этот  термин, я это использую, когда
> ячейки стека заменяю регистром.
>  
Да. Однако какая у тебя глубина стека раскидывается по регистрам,
максимум два-три верхних значения, ручная оптимизация, а можно 5,6,
сколько нужно автоматически, и не в eax только а используя все свободные
регистры.

Но, как я говорил - пока не будет register allocation по data flow, то
есть считай по громадному количеству правил, заданному алгоритмически -
можно успешно использовать текущий оптимизатор для оптимизации все кода.

Best Regards,
Dmitry Yakimov