Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вс апр 21, 2024 14:23

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 408 ]  На страницу Пред.  1 ... 24, 25, 26, 27, 28
Автор Сообщение
 Заголовок сообщения: Re: Как сделать форт-процессор 2022
СообщениеДобавлено: Ср мар 20, 2024 17:38 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
В системе команд можно делать специальные поля, которые будут одновременно с расчетами выполнять переход. Литерал в такую команду трудно добавить, а RET или LOOP вполне можно. Но это уже получится упражнение "расставьте поля команды, чтобы было и полезно, и не слишком громоздко". В тестах понятно, что по сути работает только тело вложенного цикла, а накладные расходы идут параллельно с выполнением стековых манипуляций. Ну, оно тоже имеет право на жизнь.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сделать форт-процессор 2022
СообщениеДобавлено: Чт мар 21, 2024 01:25 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 466
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
Глянул их код чуть повнимательнее.
Код:
address opcode label comment
001000  5715C INNER n push n push         1000 0 DO
001001  003E8       1000
001002  00000       0
001003  57D58 IN1   n drop n pop          34 DROP
001004  00022       34
001005  00001       1
001006  BE37B       + pop over over    INC loop counter
001007  A080A       xor  T0  IN2       COMPARE
001008  FF39E       drop push push nop
00100A  FFFFE IN2   drop drop drop ;       FINISH
00100B  5715C BENCH n push n push           1000 0 DO
00100C  003E8       1000
00100D  00000       0
00100E  20000 BE1   call INNER
00100F  563DE       n pop nop nop
001010  00001       1
001011  BE37B       + pop over  over  INC counter
001012  A0815       xor T0  BE2 COMPARE
001013  FF39E       drop push push nop
001014  00003       jmp  BE1                LOOP
001015  FFFBA BE2   drop drop drop n      FINISH
001016  00007       7
001017  57020       n push  ; long call and return
001018  03987       lit'  EMIT
Там много опечаток, например, отсутствует строка с адресом 001009 (там должен быть jmp IN1), по адресу 001014 адрес прыжка неправильный (должен быть прыжок по адресу XXXE, а не XXX3, видимо, неправильно распозналось при сканировании :) ), да и формат команды вызывает некоторые сомнения. На глаз там во внутреннем цикле 15-20 команд, но сложно в таком варианте оценивать, если не знать, сколько тактов выполняется каждая команда, выполняются ли они параллельно и т.д. С другой стороны у нас есть тактовая частота и время выполнения миллиона итераций. Смело перемножаем одно на другое - получаем количество тактов на итерацию во внутреннем цикле: 200*0.17=34 такта на итерацию цикла в INNER. Для сравнения 68040 и R4000 тратят вполне достойные 9 и 12 тактов соответственно, да даже 68030 с его 18 тактами на итерацию не так уж и плох.
Создатели F21 пытются выйти из положения и разворачивают внутренний цикл, убирая тем самым накладные расходы на организацию цикла, в результате в общем-то простой код жиреет аж до 400 байт, но количество тактов на итерацию уменьшается всего лишь до 15. И лишь когда они задействуют вместо честного литерала свой внутренний регистр А (вручную или компилятор сам сообразил?), то получают космические 2 такта на итерацию. :)
А у меня, например, в базовом варианте с 6-битными командами литерал весит 2 команды (и такта), еще такт на drop, ну и еще один на loop. В результате итерация весит 3 байта и длится 4 такта. А в продвинутом варианте (4- и 6-битном) всего два такта: первый на 34+drop, а второй на loop. При желании, наверное, можно и в один такт уложиться.
И да, команды для реализации аппаратных циклов - это (с оговорками) условные call и ret. Например, while и do вполне можно обозвать условным call, а repeat и loop - условными ret. Разница лишь в том, что одни проверяют и меняют счетчик цикла, а другие проверяют условие. Условным call необходим полный литерал (адрес, по которому прыгать при невыполнении условия), но они выполняются лишь раз в качестве пролога перед входом в тело цикла, а условные ret литералов не требуют (адрес начала цикла берут из стека возвратов) и выполняются за такт.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сделать форт-процессор 2022
СообщениеДобавлено: Сб мар 23, 2024 22:27 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Игры с внутренними регистрами в целях улучшить показатели в синтетических тестах в конечном итоге не дают практической пользы. Если разобраться, в итоге это приводит к добавлению аппаратного ядра, которое и выполняет основную работу, и тут его стоит аккуратно "отцепить" от процессора, чтобы не делать из универсального устройства компонент, который по сути будет крутиться в цикле CMD1 CMD2. В принципе есть варианты ускорения циклов и часто встречаются дополнительные флаги "одновременно с этой командой делать ret". Но такие флаги начинают расползаться по системе команд, портя ее внутреннюю согласованность.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 408 ]  На страницу Пред.  1 ... 24, 25, 26, 27, 28

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB