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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Многоядерные процессоры
Автор Сообщение
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
Hishnik писал(а):
Скоро 10 лет, как я такое показывал на семинаре у Баранова :) Правильные мысли приходят в умные головы независимо :)
:D Да я пока как та обезьяна из анекдота: и к умным хочется, и к красивым, все никак не определюсь... Чувствую, что впереди меня ожидает куча велосипедов, которые предстоит переизобрести заново. :)

Сегодня времени было мало, но кое-что успел проверить. Например, добавил в бродилку процесс в отдельном ядре, который в цикле делает инкремент цвета стены. Получил разноцветную стену вместо монохромной. И пару-тройку тестов с тремя периферийными ядрами сделал. Назначил каждому отдельное задание (инкркмент, декремент и побитовая инверсия), а потом останавливал процессы и запускал заново, менял адреса "обработчиков", переназначал задачу на другое ядро и т.д и т.п.. Работает, но тест слишком простой, надо что-то более сложное. Радует, что максимальная частота такого монстра просела незначительно (с 72Mhz до 69MHz).
Задания ядрам примерно так раздаются:
Код:
addr core7addr ! \ устанавливаем адрес "обработчика" для ядра 7 и ставим это ядро на паузу \
0 core7addr ! \ запускаем ядро 7 \
В теории на моей плис можно до 20 ядер сделать (по количеству умножителей), если речь о 16-18-битных ядрах, для 32-битных не более 6 получится (по 3 умножителя на брата), ну или пару 64-битных. Блоков BRAM тоже 20 штук, если прошивка небольшая (до 4K команд), то тогда "каждой твари по паре" - 10 блоков BRAM на 20 ядер, а еще 10 остается на RAM, маловато, но должно хватить, тем более, что не всем периферийным ядрам нужно большое количество памяти, где-то можно и несколькими регистрами обойтись. Буду дальше экспериментировать :)

upd. Проверил и 8 ядер (1 основное+7 периферийных), все прекрасно. Правда максимально допустимая частота просела до 55МГц, но не смертельно. И количество RAM в периферийных ядрах пришлось уменьшить до 1 блока BRAM (1K слов, в принципе, за глаза для простых задач), чтобы блоков BRAM на всех потребителей хватило. Сейчас задействовано 15 блоков BRAM: 4 на прошивку (8 ядер поделить на 2), 4 на RAM в основном ядре и по 1 для каждого из 7 периферийных. В резерве осталось 5 блоков, их можно или на более жирную прошивку потратить (сразу уйдет еще 4 блока, если прошивка превысит нынешний лимит 4K команд, бродилка, для сравнения, сейчас весит меньше 2K команд) или пару ядер добавить (1 блок на прошивку плюс 2 блока на RAM), место в ПЛИС еще осталось. Хотя я даже 8 штук ядер не знаю, куда девать :)
Еще забавно, что в таком многоядерном процессоре можно замешивать ядра разной разрядности (допустим, 16/32-битные), но они без проблем будут работать от одной и той же прошивки. :) Такая система команд получилась :)

А еще подумалось, что основное ядро в многоядерной системе лучше сразу делать двухъядерным, RAM у ядер будет общей, раз уж BRAM такие трюки позволяет. А шину данных, которая сейчас представляет из себя длинное кольцо, распилить на два кольца поменьше. Если придумаю как, то и периферийные компоненты тоже сразу двухъядерными сделаю, но пока нет идей. :)

еще upd. Ну и, наконец, сделал основной процессор двухъядерным, максимальная частота так и осталась 72MHz. В бродилке при отрисовке сцены часть работы поручаю второму ядру, если оно в текущий момент времени свободно. В итоге из 80 столбцов второе ядро отрисовывает примерно 40. Но производительность, понятное дело, вырастает не в 2 раза, т.к. помимо отрисовки есть еще другие вычисления, а их (пока) всегда делает основное ядро. Все проверял на втором варианте системы команд, где команда 2/ заменена на rshift.
Цифры примерно такие:
одно ядро - 80 fps @ 20MHz = 4.00 fps/MHz
два ядра - 119 fps @ 20MHz = 5.95 fps/MHz
два ядра + параллельное выполнение нескольких команд в каждом из ядер - 204 fps @ 20MHz = 10.20 fps/MHz
Для сравнения:
одно ядро (1-я версия системы команд) - 74 fps @ 20MHz = 3.70 fps/MHz
одно ядро (3-я версия системы команд) - 98 fps @ 20MHz = 4.90 fps/MHz
ARM - 72 fps @ 64MHz = 1.13 fps/MHz
Thumb - 67 fps @ 48MHz = 1.40 fps/MHz
самодельный 8-битный процессор из видоса, который KPG присылал - 19 fps @ 4 MHz = 4.75 fps/MHz, но т.к. здесь отрисовывается не 25 строк, а 60, то правильнее будет пересчитать 4.75*60/25 = 11.40 fps/MHz
Надо будет сделать двухъядерный вариант процессора с 3-й версией системы команд и посмотреть, ну а пока есть только со 2-й, т.к. она все-таки проще.
Сообщение Добавлено: Вт дек 27, 2022 00:18
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
Ну вот, поехала правильная методология применения ПЛИС :) Много ядер это действительно не только классическая "симметричная мультипроцессорность", тут можно исхитряться и распределять ядра по тем задачам, которые возникли в конкретном проекте. В ПЛИС же нет вот этого ограничения "надо, чтобы пригодилось широкому кругу потребителей".

Total Vacuum писал(а):
В результате периферийный процессор может выполнять код параллельно с центральным процессором. Чем-то похоже на обработчик прерывания с той лишь разницей,

Скоро 10 лет, как я такое показывал на семинаре у Баранова :) Правильные мысли приходят в умные головы независимо :)
Сообщение Добавлено: Сб дек 24, 2022 17:54
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
Зацените, какую штуку придумал. Ну как придумал... Уже даже сделал в простом (2 ядра) варианте, но пока толком не успел проверить, хотя уже видно, что зашевелилось.
У меня самодельный микроконтроллер в ПЛИС организован следующим образом:
- шина данных закольцована, каждое устройство имеет вход и выход, на выход передает либо транзитом со входа (если на шине адреса выставлен адрес какого-то другого устройства), либо запрашиваемые данные (если установлен адрес из адресного пространства текущего устройства):
Код:
+-->[cpu]-->[uart]-->[gpio]-->...-->[timer]--+
|                                            |
+--------------------------------------------+
- также из процессора на все устройства заведен адрес, сигнал разрешения записи и сигнал выбора текущего устройства, кроме того заводится тактовая частота и сигнал сброса;
- все общение с устройствами производится через один или несколько регистров из адресного пространства этих устройств;
Процессор работает, пробовал варианты с параллельным выполнением нескольких команд, но производительность вырастает не более, чем в 2 раза даже в ситуации, когда одновременно выполняется несколько литералов. Это при том, что код более чем наполовину из этих самых литералов и состоит. Все-таки не очень хорошо форт-код на уровне команд распараллеливается, по крайней мере в моей системе команд: все команды хотят поменять глубину стека и его содержимое.

Возникла мысль зайти с другой стороны и добавить в систему другие ядра просто навесив их на шину данных. И работать с ними как с любыми другими периферийными устройствами:
Код:
+-->[cpu]-->[ppu1]-->[ppu2]-->...-->[ppuX]-->[uart]-->[gpio]-->[timer]--+
|                                                                       |
+-----------------------------------------------------------------------+
Периферийные процессоры (ppu) после рестарта спят, но могут быть инициализированы адресом любой подпрограммы, после чего начнут выполнять код начиная с этого адреса. Периферийные процессоры имеют доступ к общей прошивке, на борту есть стеки данных и возвратов нужной глубины и необходимое количество RAM (она будет видна и центральному процессору), в планах добавить к ним функционал всех или некоторых периферийных устройств (UART, GPIO, TIMER, I2C, ...), оставив на шине данных только периферийные процессоры (ppu).
В результате периферийный процессор может выполнять код параллельно с центральным процессором. Чем-то похоже на обработчик прерывания с той лишь разницей, что теперь центральному процессору не требуется прерывать работу основной программы, сохранять текущее состояние, прыгать на код обработчика и выполнять его, а затем восстанавливать состояние. И адреса обработчиков настраиваются и перенастраиваются прямо в процессе работы прошивки, буквально в пару действий. Так что центральному процессору остается навесить максимум работы на своих рабов и подгонять их кнутом :) Понятно, что выигрыш в производительности будет только на тех задачах, которые хорошо распараллеливаются, но сама возможность поручить часть работы кому-то другому греет душу :) Т.е. здесь получается параллелизм на уровне процессов, а не отдельных команд. Ну и наконец никто не запрещает комбинировать варианты, если позволить центральному и периферийным процессорам выполнять несколько команд за такт. Платой за это будет рост потребления блоков BRAM. Но если остаются свободные, то почему бы не задействовать? Ну а пока жду понедельника :)
Сообщение Добавлено: Пт дек 23, 2022 23:34
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
Total Vacuum писал(а):
Кстати, а бывают ли в природе ПЛИС с аналоговыми входами/выходами?
бывают
Сообщение Добавлено: Чт ноя 03, 2022 13:52
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
Total Vacuum писал(а):
Кстати, а бывают ли в природе ПЛИС с аналоговыми входами/выходами?

Бывают ПАИС (аналоговые, да, с переключаемыми конденсаторами). В ПЛИС бывают АЦП. Но вообще подключить АЦП+ЦАП - не такая большая проблема.
Сообщение Добавлено: Ср ноя 02, 2022 03:27
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
Переписал пока сложение произведений (используется при перемножении матриц) на ассемблере... Пардон, на javascript. :) В несколько раз по ощущениям быстрее стало. И пока гиперболический тангенс в качестве функции активации.
Для обучения используется слово n! , а для чтения состояния n@ :) Вот прям просится Форт в нейронный процессор, только входы и выходы нужны аналоговые, а не цифровые :) Кстати, а бывают ли в природе ПЛИС с аналоговыми входами/выходами?

Надо бы теперь какую-нибудь простенькую сверточную сеть родить на пробу. :)
Сообщение Добавлено: Ср ноя 02, 2022 01:55
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
Hishnik писал(а):
Например, вычисление выхода нейрона не изменяется - можно его и зафиксировать внутри низкоуровневого слова.
Безусловно, так и сделаю, перепишу на "низкоуровневом" javascript. Тут узкое место - перемножение матриц, вот его-то и буду оптимизировать в первую очередь. Но сейчас экспериментирую с разными функциями активации, на этом этапе главное, чтобы хоть в каком-то виде работало, а оптимизацииями займусь после того, как все обкатаю и лишнее повыбрасываю :)
Сообщение Добавлено: Пт сен 30, 2022 12:48
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
Для Форта я придерживаюсь простого правила. Он нужен там, где в процессе разработки часто производятся изменения. Где редко - пользуемся возможностями "хост-платформы". Например, вычисление выхода нейрона не изменяется - можно его и зафиксировать внутри низкоуровневого слова.
Сообщение Добавлено: Пт сен 30, 2022 02:33
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
:D Поставил : R 0.1 ; - это так называемый в умных статейках lerning rate. Ждем несколько минут, пока нейросеть перетрахивает ((с) Лукашенко) коэффициенты, в результате видимые глазом ошибки в ответах нейросети остаются преимущественно (можно даже сказать исключительно) на границе тьмы и света, т.е. там, где гигантский перепад значений с минимума на максимум и обратно. Учитывая примитивное устройство (за основу взята нейросеть, которая чуть ли не в 99% случаев описывается в статьях из цикла "нейросети для домохозяек", которая обучается вычислять xor) и небольшое количество нейронов в скрытом слое, можно считать, что вполне нормальный результат. Да и не требовалось изобретать нейросеть, которая идеально бы клонировала изображения. Тут скорее один из многих промежуточных тестов, а в конечном итоге я для себя хотел бы понять, как должен (или мог бы) выглядеть Форт для работы с нейросетями. И какие фишки там были бы удобны.
Изображение
ссылка на изображение
Сообщение Добавлено: Вт сен 27, 2022 19:07
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
Что-то маловато нейронов. При таком подходе оно будет ну очень схематично "учиться".
Сообщение Добавлено: Сб сен 24, 2022 23:49
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
:D Немного дрозофил вам в ленту. 3D-бродилка+примитивная нейросеть:
http://totalvacuum.ru/nn3d.htm
Изображение
(странно, что изображение по прямой ссылке открывается, а на форуме не рисуется)
Бродилка рисует картинку, а нейросеть зубрит и пытается воспроизвести. Там 2 нейрона на входе (x и y), 10 в скрытом слое и 1 на выходе (color), а также 1/(1+exp(-x)) в качестве функции активации. Параметры (скорость обучения, число нейронов в скрытом слое, функцию активации и т.д.) особо не подбирал, поэтому иногда может привирать, а иногда не может выучить новую картинку, т.к., по всей видимости, в локальный минимум сваливается, откуда уже не может выбраться. Впрочем, иногда очень даже похоже получается даже с такими куриными мозгами. :) Даже если 4 нейрона в скрытом слое поставить (параметр H), результат может быть очень симпатичным.

upd. :D Насчет дрозофил я погорячился: у них аж 250000 нейронов, если верить википедии. Скорее уж нематода с ее 302 нейронами.
Вот, какое нашел: https://ru.wikipedia.org/wiki/OpenWorm
Сообщение Добавлено: Пт сен 23, 2022 12:40
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
В каком то топике на местном форуме был вопрос об Форт и Cuda.
Вот один из проектов в этой связке tensorForth - eForth does tensor calculus, implemented in CUDA.

P.S. Тоже где то близко и было упоминание на местном форуме vectorforth - SIMD vectorized Forth compiler with CPU based shader application.

А, этот проект VecForth
Цитата:
Vectrex Forth is a port of Brad Rodriguez' CamelForth/6809 to the Vectrex video game console, with an added Forth to Vectrex BIOS API for easy programming.
:)

Vector + Forth on Github.
Сообщение Добавлено: Чт сен 08, 2022 17:40
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
An alternative Arrayforth toolchain targeting the GA144 multi-processor chip.
Сообщение Добавлено: Сб авг 21, 2021 11:35
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
Видео: Forth Day 2020 - Programming GA144 using GA144 only - Daniel Kalny (Nov 26, 2020)

etherforth.com
Код:
This site is dedicated to etherforth, a variant of colorForth running entirely in GreenArrays' GA144 multi-computer chip. It is a programming language, operating system, and development environment in one.

Charles H. Moore, the inventor of FORTH programming language, and designer of GA144 chip started etherforth development around 2010. He documented progress of this project in his Weblog, and demonstrated system capabilities at SVFIG Forth Day meetings in 2011 and 2012. At the beginning of 2013 he put this project aside.

Chuck gave me the latest version of his source code (dated Jan 9, 2013) in 2017. To fully comprehend his code took some time, and a lot of experimenting. Nevertheless, I gradually added all missing parts, and by mid 2020 I had etherforth development system complete and running.

Presented here is version 1.01a of etherforth. It comes in two variants. One is compiled using a PC (within colorForth environment) and loaded into host chip of GA eval board via USB. Once loaded, the system runs independently of the PC. Other method of using etherforth is to compile and burn system image into an onboard SPI flash memory. Apart from how the system gets booted up (from a PC or from the onboard flash memory) the two variants are the same, except that the latter one makes etherforth a truly standalone system.

Purpose of this web site is to collect all available information about etherforth. You'll find here a detailed description of what is etherforth, what hardware you need, software source code, a manual explaining how to use it and how to write your own code, and tutorials on etherforth and GA144 programming in general. In download section you'll find links to colorForth development environment provided by GreenArrays, and etherforth source files. The site is intended for all those interested in this unusual system either out of curiosity or because of intention to build the system for their own use and entertainment.

Programming GA chips is a wonderful experience but it requires good knowledge of how these chips work. When the tutorials section is finished, there will be a primer on GA144 programming to help novices to get started. Nonetheless, studying GreenArrays' documentation is indispensable if you wish to enjoy working with their chips to the fullest. Unless you are perfectly familiar with GA chips I strongly recommend to study thoroughly GreenArrays' documentation you can find here.

Although the information available on this site is provided "as is" I'll be happy to answer questions pertaining to etherforth and GA144, and help those who wish to implement the system on their own. Feel free to send questions or comments to daniel@etherforth.org.


P.S. Forth Day 2020 - GreenArrays Update - Greg Bailey (Nov 26, 2020)
Сообщение Добавлено: Сб мар 20, 2021 19:11
  Заголовок сообщения:  Re: Многоядерные процессоры  Ответить с цитатой
На ПЛИС, безусловно, можно. Даже сотни умножителей в ПЛИС, не говоря уже о тысячах - огромная производительность, исчисляемая уже в TMAC. GPU, конечно, конкурируют, но регулярно находятся ситуации, когда ПЛИС существенно выигрывают, реализуя нечто, существенно отличающееся от типовых задах GPU. Например, банально уменьшить разрядность или реализовать нестандартную схему соединений нейронов.
Форт для нейросетей распадается на два направления, которые в нейросетях есть. Прогон готовых сетей производится на широком спектре платформ, включая даже МК. Тут особенно ловить нечего, поскольку речь идет о предельной оптимизации - каждый лишний такт на стеке умножится на число нейронов и число циклов сети. А вот процесс обучения связан с большим количеством проб, управлением обучающими наборами, сравнительным анализом результатов и прочим. Здесь уже можно подумать о DSL на базе Форта для организации всего этого процесса.
Сообщение Добавлено: Вт мар 02, 2021 01:53

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


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