Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: DO LOOP - hard vs soft |
|
|
dynamic-wind писал(а): В нек.-рых DSP (vs_dsp, dsp56K) есть пара регистров--адрес начала цикла и счетчик итераций. Это же не некоторый, это конкретный форт-процессор, который в предыдущей итерации был с аппаратным стеком циклов, а в теперешней - пока без нее, с возможностью программной эмуляции.
[quote="dynamic-wind"]В нек.-рых DSP (vs_dsp, dsp56K) есть пара регистров--адрес начала цикла и счетчик итераций.[/quote] Это же не некоторый, это конкретный форт-процессор, который в предыдущей итерации был с аппаратным стеком циклов, а в теперешней - пока без нее, с возможностью программной эмуляции.
|
|
|
|
Добавлено: Сб сен 25, 2010 12:54 |
|
|
|
|
|
Заголовок сообщения: |
Re: DO LOOP - hard vs soft |
|
|
dynamic-wind писал(а): А зачем, собственно, стек циклов? удобно, например, можно легко получать параметры вложенных циклов (сколько надо) без оглядки на то, положил ли кто на стек возвратов чего-нить лишнего или нет. Правда, со стека возвратов параметры снимать автоматически легче. меньше мороки с исключениями.
[quote="dynamic-wind"]А зачем, собственно, стек циклов?[/quote] удобно, например, можно легко получать параметры вложенных циклов (сколько надо) без оглядки на то, положил ли кто на стек возвратов чего-нить лишнего или нет. Правда, со стека возвратов параметры снимать автоматически легче. меньше мороки с исключениями.
|
|
|
|
Добавлено: Сб сен 25, 2010 11:12 |
|
|
|
|
|
Заголовок сообщения: |
Re: DO LOOP - hard vs soft |
|
|
А зачем, собственно, стек циклов? Достаточно ведь оптимизировать самый внутренний цикл. В нек.-рых DSP (vs_dsp, dsp56K) есть пара регистров--адрес начала цикла и счетчик итераций. Плюс одна команда конец-цикла, которая работает с этими регистрами.
А зачем, собственно, стек циклов? Достаточно ведь оптимизировать самый внутренний цикл. В нек.-рых DSP (vs_dsp, dsp56K) есть пара регистров--адрес начала цикла и счетчик итераций. Плюс одна команда конец-цикла, которая работает с этими регистрами.
|
|
|
|
Добавлено: Сб сен 25, 2010 10:50 |
|
|
|
|
|
Заголовок сообщения: |
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).
[quote="WingLion"]: CLEAR_SCREEN SCR_ADR 768 0 DO 1024 0 DO DUP 0! 1+ LOOP NEXT_LINE LOOP ;[/quote] В таких местах я раньше делал наподобие такого:
[code]: CLEAR_SCREEN 0 BEGIN 0 OVER SCR_ADR + ! 1 + DUP 786432 = UNTIL DROP ;[/code]
Но не всегда удобно оперировать счетчиком, лежащим на стеке, а распихивать его по памяти тоже как-то некрасиво. Потому я и пошел на добавление стека циклов, который по размеру даже больше основного стека (за счет ширины, а глубина ввиду наличия распределенной памяти в LUT и так 16).
|
|
|
|
Добавлено: Пт сен 24, 2010 18:46 |
|
|
|
|
|
Заголовок сообщения: |
Re: DO LOOP - hard vs soft |
|
|
Ну, некоторые операции выглядят иначе...
: CLEAR_SCREEN SCR_ADR 768 0 DO 1024 0 DO DUP 0! 1+ LOOP NEXT_LINE LOOP ;
Вот тут, например, получится почти 28 миллионов тактов лишних, если не придумывать специальные процессорные команды для работы с экраном...
Ну, некоторые операции выглядят иначе...
: CLEAR_SCREEN SCR_ADR 768 0 DO [b]1024 0 DO DUP 0! 1+ LOOP[/b] NEXT_LINE LOOP ;
Вот тут, например, получится почти 28 миллионов тактов лишних, если не придумывать специальные процессорные команды для работы с экраном...
|
|
|
|
Добавлено: Пт сен 24, 2010 18:00 |
|
|
|
|
|
Заголовок сообщения: |
Re: DO LOOP - hard vs soft |
|
|
Да это понятно, я уж было и настроился на добавление стека циклов (тем более что в той реализации FCPU, которая сейчас в рабочих проектах, это есть). А потом посмотрел, где именно используются циклы, и задумался. Вот, например, задержка 1000 0 DO LOOP. Ну будет 30 0 DO LOOP, разницы нет. В циклах с большим объемом вложенного кода 28 тактов будут незаметны. Остаются циклы с большим количеством итераций, и при этом небольшим телом. Вот и пытаюсь их поймать и как следует представить, чтобы было ясно, ради чего сыр-бор.
Да это понятно, я уж было и настроился на добавление стека циклов (тем более что в той реализации FCPU, которая сейчас в рабочих проектах, это есть). А потом посмотрел, где именно используются циклы, и задумался. Вот, например, задержка 1000 0 DO LOOP. Ну будет 30 0 DO LOOP, разницы нет. В циклах с большим объемом вложенного кода 28 тактов будут незаметны. Остаются циклы с большим количеством итераций, и при этом небольшим телом. Вот и пытаюсь их поймать и как следует представить, чтобы было ясно, ради чего сыр-бор.
|
|
|
|
Добавлено: Пт сен 24, 2010 17:50 |
|
|
|
|
|
Заголовок сообщения: |
Re: DO LOOP - hard vs soft |
|
|
Kак только в цикле пойдут примитивы, эти 28 тактов очень быстро умножатся на миллионы и миллиарды... и 100 LCELL покажутся перед ними мизером (который, вдобавок ко всему, не умножается, потому что добавится в процессор всего один раз)
Kак только в цикле пойдут примитивы, эти 28 тактов очень быстро умножатся на миллионы и миллиарды... и 100 LCELL покажутся перед ними мизером (который, вдобавок ко всему, не умножается, потому что добавится в процессор всего один раз)
|
|
|
|
Добавлено: Пт сен 24, 2010 16:14 |
|
|
|
|
|
Заголовок сообщения: |
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 тактов...
Пытаюсь оценить эксплуатационные свойства софтварного DO LOOP по сравнению с аппаратным. В аппаратной реализации на циклы отдан целый стек, который хранит текущее значение счетчика, конечное значение, и адрес перехода. DO LOOP I - аппаратные примитивы. LOOP выполняется за один машинный цикл (в конвейерных вариантах влечет за собой такт штрафа на перезаполнение конвейера). Однако занимает такая конструкция порядка сотни ячеек, и при общем объеме в 600-700 это уже выглядит существенным довеском. Софтварная реализация выглядит как-то вроде:
[code]: LOOP LDEPTH @ SHL @ 1 + LDEPTH @ SHL ! LDEPTH @ SHL @ LDEPTH @ 1 + SHL @ = IF ;[/code] Все перечисленное - аппаратные примитивы, кроме LDEPTH, который хранит текущую глубину стека циклов. Вобщем, итого получается 28 тактов на итерацию, и вот тут-то я и задумался, что ценнее - 100 ячеек или 28 тактов...
|
|
|
|
Добавлено: Пт сен 24, 2010 15:31 |
|
|
|
|