DataFlow_Компилятор с ЯВУ в ориентированный ациклический граф(2_пример)

Аватар пользователя Rutel

Предварительные пояснения.

Любая команда или мультиплексор выполняются (генерируют результат на выход) только если на ВСЕ входы поданы (существуют) требуемые объекты. Если нет объекта с требуемым уникальным идентификатором, то нет срабатывания и генерации результирующего объекта с уникальным идентификатором. Различные команды могут генерировать объекты с одинаковым идентификатором только при гарантии невозможности создать два объекта с одинаковым идентификатором (примерно как оператор IF, где или в одну сторону или в другую и никогда в обе стороны).

По вопросу доступа к обрабатываемым данным.

Данные передаются по ССИ сети и уже находятся в отдельных FIFO (каждый символ текста в своем буфере) и доступ ко всем данным возможен параллельно. В реальности невозможно получить бесконечное число буферов, соответственно строка при передаче будет разбита (автоматически при генерации ассемблера) на куски размером (N) равным числу буферов. Соответственно следующим элементом для буфера с S[0] будет S[N] (S[1]-S[N+1]). Преобразованием из последовательной формы в двумерную (да и вообще в любой Data Set занимаются механизмы сети ССИ). Число N можно считать числом одновременно исполняемых команд (числом нитей). Для DataFlow число N может достигать миллиона на один кристалл (для современных тех. процессов), что соответствует миллиону команд за такт. Производительность в 10Е15 операций в секунду на кристалл очень даже неплохо. Если учесть плотность упаковки до 10.000 процессоров в одном кубическом метре (определяется возможностью отвода тепла), то и вообще до 10E19 операций в секунду на стойку.

Коды исполняемых команд, это тоже данные передаваемые сетью ССИ и исполнение какого либо объекта происходит методом передачи его данных из памяти в «процессор». Взаимодействие двух объектов выглядит как передача данных объектов в один «процессор», где они «взаимодействуют» с генерацией новых объектов (если это нужно).

В процессоре происходит взаимодействие двух потоков, содержащих разные объекты. После взаимодействия исчезают старые (исходные) объекты и появляются новые.

Нет даже теоретической возможности одному и тому же объекту взаимодействовать с другими объектами одновременно, для этого нужно сначала создать копию (но это будет самостоятельный объект).

Звучит все сложно, но в реальности достаточно просто (будет описываться в статьях посвященных архитектуре DataFlow вычислителя)

Применение:

Меня такая машина интересует для моделирования биологической клетки как целого объекта (виртуальная биологическая клетка). При размере клетки в 5мкм, примерно получается (для вычислителя 10Е20) 10Е8 операций в секунду на каждый атом. Сколько операций требуется для моделирования одного шага моделирования не знаю, потому не могу сказать отношение модельного времени к реальному.

Исходная программа :

int strlen(const char* s)

{

int i = 0;

while (s[i]) i++;

return i;

}

После разворачивания цикла и приведения к однократным присваиваниям переменных

{Инициализация цикла}

0.i.0=0, (превратится в команду для АЛУ или инициализацию переменной)

{Проверка на конец строки}

BranchTrue.0=Boolean(s[0]==0), (превратится в команду для АЛУ)

BranchTrue.1=Boolean(s[1]==0), (превратится в команду для АЛУ)

BranchTrue.2=Boolean(s[2]==0), (превратится в команду для АЛУ)

{повторяем до бесконечности}

{Проверка на наличие символа}

BranchFalse.0=Boolean(s[0]!=0), (превратится в команду для АЛУ)

BranchFalse.1=Boolean(s[1]!=0), (превратится в команду для АЛУ)

BranchFalse.2=Boolean(s[2]!=0), (превратится в команду для АЛУ)

{повторяем до бесконечности}

{Если не конец строки то генерируем следующую итерацию цикла, но не генерируем результат исполнения}

if (BranchFalse.0) 0.i.1=0.i.0, (суммарно превратится в мультиплексор)

if (BranchFalse.1) 1.i.1=1.i.0, (суммарно превратится в мультиплексор)

if (BranchFalse.2) 2.i.1=2.i.0, (суммарно превратится в мультиплексор)

1.i.0= 0.i.1+1, (превратится в команду для АЛУ)

2.i.0= 1.i.1+1, (превратится в команду для АЛУ)

3.i.0= 2.i.1+1, (превратится в команду для АЛУ)

{повторяем до бесконечности}

{Если конец строки то генерируем результат, но не генерируем новый цикл}

if (BranchTrue.0) 0.i.2=0.i.0,(суммарно превратится в мультиплексор)

if (BranchTrue.1) 0.i.2=1.i.0,(суммарно превратится в мультиплексор)

if (BranchTrue.2) 0.i.2=2.i.0, (суммарно превратится в мультиплексор)

{повторяем до бесконечности}

{Передача результата исполнения функции}

strlen=0.i.2, (превратится в мультиплексор)

 

Выполнение графа автоматически остановится или по концу строки (нет символа или символ равен нулю) или по отсутствию следующей итерации.

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

Описывать стадию ассемблера без описания архитектуры DataFlow смысла нет. Следующая статья будет с описанием архитектуры и только потом ассемблер.

Авторство: 
Авторская работа / переводика
Комментарий автора: 

Все идеи и алгоритмы, описываемые в данной статье, являются результатом
моей независимой и полностью самостоятельной интеллектуальной
деятельности. Как автор, разрешаю свободно использовать, изменять,
дополнять все идеи и алгоритмы любому человеку или организации в любых
типах проектов при обязательном указании моего авторства.
© Балыбердин Андрей Леонидович 2019 Rutel@Mail.ru

Комментарии

Аватар пользователя stop
stop(3 года 2 месяца)

"моделирования биологической клетки"

-- а чем обычное программирование не устроило? 

(Нет не про Эксель с питоном)

Нужно моделирование конкретной клетки в реальном времени ?(вот с этого места поподробнее)

"на каждый атом." 

-- ожидается расхождение между молекулярной и атомарной физикой клетки ? (в условиях жёсткого излучения, с вариативностью воздействия -(?) )

Аватар пользователя Rutel
Rutel(8 лет 11 месяцев)

Производительностью исплнения и производительностью программирования.

Сегодня моделирование клетки не продвинулось дольше миллионов атомов, а нужно 10Е12 минимум.

(те в миллион раз больше)

-- ожидается расхождение между молекулярной и атомарной физикой клетки ?

сейчас основной тип моделирования  (если не ошибаюсь) инерционное физическое моделирование 

моделирование учитывающее квантовые эффекты только для небольших молекул.

Аватар пользователя stop
stop(3 года 2 месяца)

Если это прокариоты - то конечно, можно рассмотреть только как единую систему.

Если все(!) остальные - то это уже блоки-митохондрии. Вполне самостоятельные и адекватные условиям образования(и с упрощёным функционалом)

Вот и вопрос - какие квантовые эффекты вызвали неопределенность? Насколько разнообразны и количественны эти эффекты, чтоб потребовалось массивные вычисления?

(статья сильно вырвана из контекста)

И наконец, если интересует физическое моделирование, как эффект квантового воздействия, может есть для начала химическое моделирование(без квантового воздействия). Чисто для выявления эффекта.

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

Аватар пользователя Rutel
Rutel(8 лет 11 месяцев)

По образованияю я не молекулярный биолог.

Моя специальность Вычислительные комплексы Системы Сети, но мне

очень хочется что бы при моей была реализована вот эта технология :

https://habr.com/ru/post/489068/

Аватар пользователя stop
stop(3 года 2 месяца)

Это какраз просто.(;-))

Потренируйтесь для начала на "кошечках".

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

И вот оттуда -- по следам эволюции.

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

Вот этот общий энтерфейс -- какраз и даёт не замороженный слепок сознания, а новый виток эволюции(обход ограничения срока жизни- бонусом)

Аватар пользователя Rutel
Rutel(8 лет 11 месяцев)

Математическая модель мухи это совсем круто.

В настоящее время такая модель даже фантастикой не считается и находится в области сказок.

Аватар пользователя stop
stop(3 года 2 месяца)

Количество входных и выходных сигналов - (?).

Да там в разы меньше, чем у клетки на атомарном уровне в условиях квантовой неопределенности.

Размер процессора обработки сигнала меньше, чем любая из микросхем.

Скорость обработки сигнала на уровне химических рецепторов - в разы меньше чем тактовая частота дешёвых ширпотребных девайсов.

Метод обработки - ну, да, не знает муха математики, так что все на глазок, на удачу, на накопление опыта, на "право на ошибку" -- все как у человека обычного.

Эмуляция несвойственно железу программного обеспечения всегда будет убого и даже неработоспособна.

Вот попробуйте на андроид Винду поставить, а ведь это на единых программных и конструкционных принципах.

Но вывод на единый интерфейс вполне обеспечивает интернет(и кажется даже большее).

Нет у биологии единой математической модели !

Зато есть адаптивная, обучаемая, индивидуальная модель поведения(в рамках процессорной мощности и в условиях среды)

Аватар пользователя Александр Мичуринский

Навскидку.

int i это что? Что будет, если длина строки, скажем 4Гб + 1 байт?

Или, наоборот, что будет, если длина строки 1 байт. Обращение s[2] не вызовет ошибки?

Аватар пользователя Rutel
Rutel(8 лет 11 месяцев)

int i

Эту часть кода прислали как тест, в ней есть ошибки и выход за пределы массива тоже

Да если размер строки будет больше, да выполнение прекратится после передачи всей строки и будет получен некорректный результат длина строки равна 0.

Если длина строки 1 байт, то вместо S2 будет служебный символ нет данных (данные формирует сеть ССИ, а там при отсутствии данных происходит передача символа нет данных).

Еще момент, если запустить исполнение программы раньше чем появятся данные, то результат тоже будет "нет данных", а вычисления остановятся там где "некомплект" данных для команды. Повторный запуск произойдет при изменении данных на входе программы. 

Завершение вычислений это тоже отсутствие "комплектных" данных.

 

Смотрится все необычно, но это не командная последовательность вычислений, а потоковая.