- PVSM.RU - https://www.pvsm.ru -
Завтрак с Чарльзом Уэзереллом, автором культовой книги «Этюды для программистов», затянулся на четыре часа. В конце-концов официантка попросила нас из ресторана в Пало-Альто, сказав что в ресторан большая очередь, а мы тут с восьми утра заседаем. За это время мы обсудили массу интересных вещий: работу Чарльза в Ливерморской лаборатории и Оракле, объектно-ориентированное и функциональное программирование, компиляторы и языки описания аппаратуры, закладки в процессоры, неэффективность нейронных сетей и незаслуженно забытый Пролог, посещение Чарльзом России, обработка текста конечным автоматом в аппаратном сопроцессоре и создание школьниками видеоигр на ПЛИС.
Содержания четырех часов с Чарльзом Уэзереллом хватит для пятидесяти статей на Хабре, поэтому перечислю в основном темы, после чего приведу некоторые детали про три из них:
Вот мы разбирали недавние споры на Хабре про ООП. Чарльз агитирует и за ООП, и за функциональное программирование, где оно применимо. Я показал Чарльзу увиденный мною в двух проектах пример неудачного дизайна классов для представления узлов дерева синтаксического разбора и оптимизаций на этом дереве [2], после чего Чарльз сказал, что конечно же алгоритмы транформации дерева разбрасывать по мелким классам таком образом не стоит, а вместо этого дерево разбора нужно быстро перекинуть в control flow graph, на котором использовать table driven transformations на основе static single assignment, с небольшим количеством исключений. Чарльз просветил меня про работы Мучника, Боба Моргана и Рэнди Аллена по векторизации:
Потом я рассказал Чарльзу, что послезавтра мы в компании будем проводить семинар в Лас-Вегасе на конференции автоматизации проектирования электроники [3], и мне нужен его совет по хорошему примеру сопроцессора на основе протокола CorExtend / UDI — User Defined Instructions. Это протокол используется в ядрах MIPS. CorExtend/UDI позволяет встроить в процессор блок, который декодирует и выполняет дополнительные к основной системе команд инструкции, которые может определить разработчик системы на кристалле. Блок может быть синтезирован и стать частью микросхемы или быть сконфигурирован в ПЛИС/FPGA.
Дополнительные инструкции двигаются по конвейеру процессора вместе с основными. Они получают данные из видимых программистом регистров общего назначения и могут вернуть результат в регистр. Эти инструкции также могут сохранять в сопроцессоре некое состояние. Их можно убить исключениями, если исключение произойдет например в следующей за данной инструкцией в конвейере:
Послезавтра в презентации на семинаре [4] я собираюсь использовать пример с инструкцией простой конволюции для нейросети. Но достигаемое при этом ускорение не впечатляет — всего в два раза. Нельзя ли сделать пример получше?
Чарльз тут же придумал гораздо более удачный пример: аппаратный лексический анализ. В сопроцессор можно поместить конечный автомат, который будет определять числа, идентификаторы и комментарии в потоке текста. Он будет сохранять сохранением состояния между индивидуальными командами, которые передают текст из регистров в автомат. Результат текущего анализа (размеченный текст) будет возвращаться тоже в регистр.
Чарльз также рассказал мне историю вопроса инструкций для парсирования текста со времен IBM/360 translate test и CDC STAR. Еще он сказал мне, что такой сопроцессор можно использовать для машинного обучения, для предварительной очистки потока данных перед применением к нему алгоритмов машинного обучения.
Потом я рассказал Чарльзу сагу, как группа инженеров и преподавателей перевела и внедрила в различных российских вузах учебник Дэвида Харриса и Сары Харрис «Цифровая схемотехника и архитектура компьютера» [5] (см. посты на Хабре 1 [6], 2 [7], 3). Сейчас объединенными усилиями МИЭТ, РОСНАНО, преподавателей МИФИ и других вузов мы планируем летнюю школу в МИЭТ [8] на которой продвинутые школьники проектируют на ПЛИС видеоигры с выводом на графический экран (секция Между физикой и программированием [9]). Для того используются идеи из книжки Designing Video Game Hardware in Verilog by Steven Hugg, December 15, 2018:
Игры можно разрабатывать как в виде чисто аппаратных конечных автоматов, так и в комбинации аппаратной графики на ПЛИС с программами на простом процессорном ядре schoolMIPS, которое описано в см. постах Станислава Жельнио на Хабре [10] и wiki по schoolMIPS на GitHub [11]. На ПЛИС можно довольно просто сделать генерацию развертки для VGA [12], выводить на экран карту из памяти и движущиеся спрайты c фигурками:
Чарльз предложил помимо игр с танчиками и гонками сделать соревнование конечных автоматов (зверьков), которые перемещают игрока к цели по карте (глобусу). Объекты на карте имеют «запах» — положительный (еда) или отрицательный (электричество которое может ударить). Школьники могут писать на верилоге конечные автоматы, которые видят окружение, встраивать их в код, который делает вывод графики и поддерживает карту, после чего соревноваться, у кого такой код лучше:
Для генерации элементов псевдослучайного поведения можно использовать аппаратные блоки LFSR:
Под конец Чарльз оставил два автографа — для русских читателей (русскую книгу я одолжил у Сергея Вакуленко [13]) и читателей в нашей компании Wave Computing, из внутренней библиотеки которой я одолжил исходную книгу на английском:
Автор: YuriPanchul
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/319622
Ссылки в тексте:
[1] Летняя Школа Юных Программистов в Новосибирске: https://ssyp.ru/
[2] пример неудачного дизайна классов для представления узлов дерева синтаксического разбора и оптимизаций на этом дереве: https://habr.com/ru/post/452462/#comment_20171598
[3] семинар в Лас-Вегасе на конференции автоматизации проектирования электроники: http://bit.ly/mips-open-at-dac-2019
[4] презентации на семинаре: http://www.silicon-russia.com/wp-content/uploads/2019/06/mipsopen_developer_day_dac_2019_05_31.pdf
[5] учебник Дэвида Харриса и Сары Харрис «Цифровая схемотехника и архитектура компьютера»: https://dmkpress.com/catalog/electronics/circuit_design/978-5-97060-522-6/
[6] 1: https://habr.com/ru/post/259505/
[7] 2: https://habr.com/ru/post/317558/
[9] Между физикой и программированием: http://bit.ly/miet-summer-school-2019
[10] постах Станислава Жельнио на Хабре: https://habr.com/ru/users/sparf/posts/
[11] wiki по schoolMIPS на GitHub: https://github.com/MIPSfpga/schoolMIPS/wiki
[12] генерацию развертки для VGA: https://github.com/yuri-panchul/2019-examples/blob/master/02_tank_game/hvsync_generator.v
[13] Сергея Вакуленко: https://ru.wikipedia.org/wiki/%D0%92%D0%B0%D0%BA%D1%83%D0%BB%D0%B5%D0%BD%D0%BA%D0%BE,_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B9_%D0%92%D0%B8%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2%D0%B8%D1%87
[14] Источник: https://habr.com/ru/post/454512/?utm_campaign=454512
Нажмите здесь для печати.