Forth
http://fforum.winglion.ru/

DO LOOP - hard vs soft
http://fforum.winglion.ru/viewtopic.php?f=3&t=2655
Страница 1 из 1

Автор:  Hishnik [ Пт сен 24, 2010 15:31 ]
Заголовок сообщения:  DO LOOP - hard vs soft

Пытаюсь оценить эксплуатационные свойства софтварного DO LOOP по сравнению с аппаратным. В аппаратной реализации на циклы отдан целый стек, который хранит текущее значение счетчика, конечное значение, и адрес перехода. DO LOOP I - аппаратные примитивы. LOOP выполняется за один машинный цикл (в конвейерных вариантах влечет за собой такт штрафа на перезаполнение конвейера). Однако занимает такая конструкция порядка сотни ячеек, и при общем объеме в 600-700 это уже выглядит существенным довеском.
Софтварная реализация выглядит как-то вроде:

Код:
: LOOP
LDEPTH @ SHL @ 1 + LDEPTH @ SHL !
LDEPTH @ SHL @ LDEPTH @ 1 + SHL @ =
IF
;

Все перечисленное - аппаратные примитивы, кроме LDEPTH, который хранит текущую глубину стека циклов. Вобщем, итого получается 28 тактов на итерацию, и вот тут-то я и задумался, что ценнее - 100 ячеек или 28 тактов...

Автор:  WingLion [ Пт сен 24, 2010 16:14 ]
Заголовок сообщения:  Re: DO LOOP - hard vs soft

Kак только в цикле пойдут примитивы, эти 28 тактов очень быстро умножатся на миллионы и миллиарды... и 100 LCELL покажутся перед ними мизером (который, вдобавок ко всему, не умножается, потому что добавится в процессор всего один раз)

Автор:  Hishnik [ Пт сен 24, 2010 17:50 ]
Заголовок сообщения:  Re: DO LOOP - hard vs soft

Да это понятно, я уж было и настроился на добавление стека циклов (тем более что в той реализации FCPU, которая сейчас в рабочих проектах, это есть). А потом посмотрел, где именно используются циклы, и задумался. Вот, например, задержка 1000 0 DO LOOP. Ну будет 30 0 DO LOOP, разницы нет. В циклах с большим объемом вложенного кода 28 тактов будут незаметны. Остаются циклы с большим количеством итераций, и при этом небольшим телом. Вот и пытаюсь их поймать и как следует представить, чтобы было ясно, ради чего сыр-бор.

Автор:  WingLion [ Пт сен 24, 2010 18:00 ]
Заголовок сообщения:  Re: DO LOOP - hard vs soft

Ну, некоторые операции выглядят иначе...

: CLEAR_SCREEN SCR_ADR 768 0 DO 1024 0 DO DUP 0! 1+ LOOP NEXT_LINE LOOP ;

Вот тут, например, получится почти 28 миллионов тактов лишних, если не придумывать специальные процессорные команды для работы с экраном...

Автор:  Hishnik [ Пт сен 24, 2010 18:46 ]
Заголовок сообщения:  Re: DO LOOP - hard vs soft

WingLion писал(а):
: CLEAR_SCREEN SCR_ADR 768 0 DO 1024 0 DO DUP 0! 1+ LOOP NEXT_LINE LOOP ;

В таких местах я раньше делал наподобие такого:

Код:
: CLEAR_SCREEN 0 BEGIN 0 OVER SCR_ADR + ! 1 + DUP 786432 = UNTIL DROP ;


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

Автор:  dynamic-wind [ Сб сен 25, 2010 10:50 ]
Заголовок сообщения:  Re: DO LOOP - hard vs soft

А зачем, собственно, стек циклов?
Достаточно ведь оптимизировать самый внутренний цикл.
В нек.-рых DSP (vs_dsp, dsp56K) есть пара регистров--адрес начала цикла и счетчик итераций.
Плюс одна команда конец-цикла, которая работает с этими регистрами.

Автор:  mOleg [ Сб сен 25, 2010 11:12 ]
Заголовок сообщения:  Re: DO LOOP - hard vs soft

dynamic-wind писал(а):
А зачем, собственно, стек циклов?

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

Автор:  Hishnik [ Сб сен 25, 2010 12:54 ]
Заголовок сообщения:  Re: DO LOOP - hard vs soft

dynamic-wind писал(а):
В нек.-рых DSP (vs_dsp, dsp56K) есть пара регистров--адрес начала цикла и счетчик итераций.

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

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