Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 13:07

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Манул - форт-процессор
СообщениеДобавлено: Вс авг 21, 2022 18:11 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Итак, произведен первый тестовый пуск нового толстенького и серьезного процессора Манул. Почему серьезного - потому что при проектировании было задумано выжать максимум из пропускной способности накристальной памяти. Почему толстенького - манулы толстенькие. К тому же при сравнительном анализе с предыдущим, довольно неплохим и компактным ядром 5-го поколения он оказался даже чуть поменьше.
Итак, что приятного получилось. Пишем код
Код:
BEGIN
1 16384 OUTPORT
0 16384 OUTPORT
AGAIN

Понятно, что он должен выдавать меандр. Теперь берем два процессора и запускаем этот код на каждом. Порт с адресом 16384 у каждого свой. На фотографии можно посмотреть, насколько Манул (красный канал) быстрее по сравнению с тем, что было (хотя был тоже процессор с аппаратным исполнением команд).


Вложения:
manul_kf_floorplan.png
manul_kf_floorplan.png [ 24.86 Кб | Просмотров: 20110 ]
manul_hello.png
manul_hello.png [ 1.27 Мб | Просмотров: 20110 ]
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Вс авг 21, 2022 19:05 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
за счет чего в два с половиной раза быстрее?
Тактовая та же самая?
Ну, и, системы команд можно сравнить (показать для сравнения)?

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Вс авг 21, 2022 19:12 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Тактовая на обоих ядрах 50 МГц. Базовые слова Форта и там, и там. Разница в микроархитектуре - конкретнее, новое ядро активно занимается выборкой команд по широкой шине и забирает литералы одним тактом.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Вс авг 21, 2022 19:46 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Если добавить слово вывода в порт без снятия параметров стека
и нотацией ( addr n -- addr n )
и при наличии ещё слова инверсии бита/бит вершины стека
Код:
16384 1
BEGIN
   OUTPORT!
   INVERT OUTPORT!
AGAIN

возможно ещё быстрее получится. :)

P.S. Можно и добавить слово OUTPORT!~ \ т.е. в самом слове вывода ещё и инвертировать вершину стека
Код:
16384 1
BEGIN
   OUTPORT!~
AGAIN


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Вс авг 21, 2022 20:02 
Не в сети
Administrator
Administrator
Аватара пользователя

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


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

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 463
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
Про него говорили, что он "толстенький", а меандр в 5 раз тоньше :)

Красивое :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Пн июл 17, 2023 03:53 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Вот такое взлетело. Еще, пожалуй, можно подкорректировать немного, но в целом оно выглядит приятно.
Код:
-- 0 stack DEPTH

constant cmdNOP : integer := 0;
constant cmdRET : integer := 1;
constant cmdSWAP : integer := 3;
constant cmdJMP32 : integer := 8;
constant cmdCALL32 : integer := 9;
constant cmdOUT1616 : integer := 10;

constant cmdFETCH : integer := 16; -- 0x10
constant cmdNOT : integer := 17; -- 0x11
constant cmdNEGATE : integer := 18; -- 0x12
constant cmdSHL : integer := 19; -- 0x13
constant cmdSHR : integer := 20; -- 0x14
constant cmdSHRA : integer := 21; -- 0x15
constant cmdINPORT : integer := 22; -- 0x16
constant cmdPICK : integer := 23; -- 0x17

constant cmdPLUS32 : integer := 24; -- 0x18
constant cmdMINUS32 : integer := 25; -- 0x18
constant cmdAND32 : integer := 26; -- 0x18
constant cmdOR32 : integer := 27; -- 0x18
constant cmdXOR32 : integer := 28; -- 0x18

-- +1 stack DEPTH
constant cmdDUP : integer := 32;   -- 0x20
constant cmdOVER : integer := 33;  -- 0x21
constant cmdI : integer := 33;  -- 0x21
constant cmdGETDP : integer := 34;  -- 0x21
constant cmdGETRP : integer := 35;  -- 0x21

constant cmdLIT32 : integer := 40; -- 0x28

-- -1 stack DEPTH

constant cmdPLUS : integer := 64;  -- 0x40
constant cmdMINUS : integer := 65;
constant cmdAND : integer := 66;
constant cmdOR : integer := 67;
constant cmdXOR : integer := 68;
constant cmdEQUAL : integer := 69;
constant cmdLESSER : integer := 70;
constant cmdGREATER : integer := 71;
constant cmdMULT : integer := 72;

constant cmdDROP : integer := 80; -- 0x50
constant cmdJMP : integer := 81; -- 0x51
constant cmdSETDP : integer := 82;
constant cmdSETRP : integer := 83;
constant cmdRIF : integer := 86;
constant cmdUNTIL : integer := 87;
constant cmdCALL : integer := 88;

-- -2 stack depth

constant cmdSTORE : integer := 96;
constant cmdOUTPORT : integer := 97;
constant cmdIF : integer := 98;

constant cmdPLUSSTORE32 : integer := 99;
constant cmdMINUSSTORE32 : integer := 100;

-- +2 stack depth

constant cmdFETCH1616 : integer := 112;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Вс июл 30, 2023 14:03 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 463
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
Hishnik писал(а):
Код:
BEGIN
1 16384 OUTPORT
0 16384 OUTPORT
AGAIN
Хм. Правильно ли я понимаю, что в старом варианте было 15 тактов на итерацию, а в новом стало 3? По такту на каждую из строк:
Код:
1 16384 OUTPORT
0 16384 OUTPORT
AGAIN

Тоже сделал циклы while-repeat и do-loop с накладными расходами 1 инструкция на итерацию, но пока толком не проверял. По команде while/do при ненулевом условии/счетчике в стек возвратов помещается адрес следующей команд (начало тела цикла) и лежит там до скончания цикла. :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Вс июл 30, 2023 18:31 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Total Vacuum писал(а):
Хм. Правильно ли я понимаю, что в старом варианте было 15 тактов на итерацию, а в новом стало 3? По такту на каждую из строк:

Там картину портили литералы. С одной стороны, очень удобно и компактно, поскольку команды 6-битные. Но с другой, чтобы положить литерал, нужно его вдвигать в вершину стека по 5 бит. 16384 - это 14 бит, нужно делать это за 3 такта. До этого нужно еще положить 1 или 0, и "разделить" два литерала хотя бы одной командой nop (иначе процессор так и будет вдвигать биты в текущую вершину, а nop прерывает этот процесс). Ну и AGAIN - это переход, которому тоже нужен литерал.

С другой стороны, 6-битная команда оказалась невероятно полезной в условиях ПЛИС начального уровня с маленькой накристальной памятью. Тут или внешнюю ставить, или продвигаться по линейке ПЛИС. А с 6-битной командой достаточно серьезные программы укладывались в BRAM.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Пн июл 31, 2023 23:13 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 463
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
Тоже вдруг стало интересно, насколько шустрыми окажутся мои процессоры с 4-битными командами.
В самой первой версии процессора с системой команд
Код:
0 1 2 3 push0 jz call ret @ ! swap pick nand - mla rshift
код
Код:
:: begin 1 ( ;
:: again 1 ) ;
:: GPIO 0x8000 ;

begin
   0 GPIO !
   1 GPIO !
again
компилируется в
Код:
4 1               \ 1

                  \ : lFFFE
4 2 1 0           \ lFFFD
5                 \ jz
4                 \ 0
4 2 0 0 0 0 0 0 0 \ 0x8000
9                 \ !
4 1               \ 1
4 2 0 0 0 0 0 0 0 \ 0x8000
9                 \ !
4 1               \ 1
4                 \ 0
4 2               \ lFFFE
5                 \ jz
                  \ : lFFFD
т.е. тело цикла весит 34 инструкции, а на осциллографе (проверял на Tang Nano 9K, частота процессора 50MHz) такое:
http://totalvacuum.ru/IMG/v2.jpg
Изображение
При этом в теории результат может быть и хуже - до 46 тактов, если прошивка жирная, а сам цикл валяется где-то в конце. Т.е. частота в районе мегагерц-полтора.

Для следующей версии системы команд
Код:
zero nibble byte xxx word jz call ret @ ! swap pick nand - mla rshift
получается 25 тактов (до 30 в худшем случае)
Примечательно, что в этой системе команд уже имеется один неиспользуемый слот (команда xxx), более того, можно почти безболезненно убрать еще одну или несколько первых команд и заменить их на что-то другое. Сейчас рожаю 6-битный процессор и планирую полностью заточить его под свой uf \ micro forth \ (да и esoteric forth тоже, чего уж там :) ). Все команды, в т.ч. и циклы (while и со счетчиком и автодекрементом), планируются аппаратными. И такой 4-битный процессор отлично подходит для экскрементов, ибо он самодостаточный даже без части команд :) Буду обкатывать на нем разные вещи и переносить в 6-битный. Например, заменяю byte на begin, а xxx - на again, и для такого кода
Код:
:: begin (( ;
:: again )) ;
:: GPIO 0x8000 ;

begin
   0 GPIO !
   1 GPIO !
again
получается выхлоп
Код:
2         \ begin

0         \ 0
4 8 0 0 0 \ 0x8000
9         \ !
1 1       \ 1
4 8 0 0 0 \ 0x8000
9         \ !
3         \ again
, который на осциллографе уже не так позорно смотрится (3.125MHz)
http://totalvacuum.ru/IMG/again.jpg
Изображение
Здесь тело цикла весит 16 тактов вне зависимости от положения в коде. На этом же процессоре уже обкатал циклы while-repeat и do-loop. Например, для 3d-бродилки скорость в варианте с аппаратными циклами раза в полтора больше, чем в варианте с программными циклами через jz. Пустой цикл со счетчиком молотит одну итерацию за такт вместо 30 с лишним тактов на итерацию в случае программной реализации. :)

Кстати, можно небольшой хак применить, заменив длинный литерал более коротким в связке с @.
Код:
:: [ ] r0 ;
:: begin 0x8000 r0 ! (( ;
:: again )) ;
:: GPIO r0 @ ;

begin
   0 GPIO !
   1 GPIO !
again
транслируется в
Код:
4 8 0 0 0 \ 0x8000
0         \ 0
9         \ !
2         \ begin

0         \ 0
0         \ 0
8         \ @
9         \ !
1 1       \ 1
0         \ 0
8         \ @
9         \ !
3         \ again
, т.е. уже 10 команд на итерацию для всё ещё 4-битного процессора, а на осциллографе выглядит так (5MHz):
http://totalvacuum.ru/IMG/hack.jpg
Изображение
До Манула, безусловно, как до Луны, но тем не менее, уже не так страшно, как в самом начале было :)

На осциллограф, кстати, можно и не смотреть: просто компилируем и делим тактовую частоту 50MHz на число тактов в теле цикла - получаем частоту меандра


upd. Теоретически (теперь и практически, проверил для галочки :) ) код для процессора, который давал 25-30 тактов на итерацию, может без перекомпиляции быть выполнен чуть более жирным процессором, который заглатывает (по возможности) код бОльшими кусками и выполняет литералы и прыжки (вместе с предшествующим литералом) за такт, 25-30 тактов превращает в 10 и выдает меандр 5МГц. Он же почти в 2 раза увеличивает число fps для 3d-бродилки. А если (это уже теория) добавить поддержку литералов за такт в версию ядра с аппаратными begin-again, то будет 7 тактов на итерацию и 7.14MHz на осциллографе. Т.е. способы увеличения производительности могут быть разные: уточнение/улучшение системы команд и/или усложнение реализации ядра на verilog.


Последний раз редактировалось Total Vacuum Вт авг 01, 2023 19:10, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Пн июл 31, 2023 23:27 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Ну кстати, если брать GOWIN, там ситуация как раз ближе к Spartan-6. При маленькой памяти важно использовать ее максимально эффективно, не создавая в системе команд пустот. Конечно, за это придется платить снижением пропускной способности памяти. Но интересно, что даже на 4-битной команде все еще остаются резервы для существенного ускорения.

Манул немного для другого, он уже не на Spartan-6 с 4 или 9к ячеек, он в основном для 7-й серии и дальше, где памяти побольше. К тому же раньше были проекты, в которых в основном работали аппаратные ядра, а процессор занимался неторопливым обслуживанием процесса, а теперь нужно поактивнее работать с регистрами ускорителей, поэтому и требуется быстрая прокачка литералов, вплоть до отказа от их захода в регистры.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Пн июл 31, 2023 23:52 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 463
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
Hishnik писал(а):
Манул немного для другого
Ну все равно надо ж на кого-то равняться :) KPG не хочет свой процессор делать, поэтому приходится на Манул ориентироваться. Путеводный кот :D

Кстати, прикинул сейчас для самого первого процессора. У него есть варианты с выполнением до 8 команд за такт. В таком случае 34-46 команд в теле цикла выполняются за 13-14 тактов, т.е. не так уж и плохо.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Вт авг 01, 2023 01:28 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Total Vacuum писал(а):
Кстати, прикинул сейчас для самого первого процессора. У него есть варианты с выполнением до 8 команд за такт.

Интересно. VLIW?
Кстати, откуда Tang Nano 9k? У меня была 4k, но свежая САПР с лицензией Education ее не поддерживает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Вт авг 01, 2023 11:06 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 463
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
Hishnik писал(а):
VLIW?
Оно не очень-то и very long :) Даже в максимально широком варианте 32 бита в сумме получается. Там буквально 3 строки в коде поменять и получается выполнение нескольких однотипных (формирование литералов) команд за такт, платой за это является рост потребления BRAM (по 1 шт на каждую пару одновременно прочитанных команд) и других ресурсов ПЛИС.
По факту команды очень короткие и могут последовательно выполняться простым до неприличия форт-процессором. Но в то же время команды легко группируются в блоки, которые могут быть выполнены как единое целое уже более сложным процессором. И самое интересное, что система команд остается той же, перекомпиляция прошивки не требуется, она будет работать и на примитивном процессоре и на достаточно сложном, в этом и прелесть таких систем команд для форт-процессоров. Подозреваю, что эта особенность присуща не только моим поделкам, но и большинству существующих в природе форт-процессоров с короткими командами. Т.е. с одной стороны мы имеем достаточно высокую плотность кода, характерную для такого рода системы команд, а с другой стороны имеем возможность выполнять этот код достаточно быстро (при желании).
Уже попробовал за такт: литерал, литерал+jz, литерал+call, 0+pick ("аппаратный" dup) и т.д.. Например, 3d-бродилка в таком исполнении ускоряется в 2 с лишним раза, но и это не предел. Подозреваю, что при большем количестве одновременно прочитанных команд можно и пары литералов за раз обыгрывать, и литерал+действие, и литерал+литерал+действие и т.д. Добавить еще сюда аппаратные циклы - вообще конфетка получится :) Но жирная
Если будет возможность, завтра попробую связку литералы/прыжки/call за такт+аппаратные циклы:
Код:
while repeat do loop word jz call ret @ ! swap pick nand - mla rshift

Hishnik писал(а):
Кстати, откуда Tang Nano 9k? У меня была 4k, но свежая САПР с лицензией Education ее не поддерживает.
Сама плата с алиэкспресса, зимой пришла. Среда Gowin v1.9.8.09 Education (с сайта https://www.gowinsemi.com, там вроде регистрация требовалась), программатор с https://dl.sipeed.com/shareURL/TANG/programmer
Делал по инструкции с сайта https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-Doc/install-the-ide.html


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Манул - форт-процессор
СообщениеДобавлено: Ср авг 02, 2023 19:59 
Не в сети
Administrator
Administrator
Аватара пользователя

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

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


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

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


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

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