Опыт разработки статического анализатора кодаAndrey Karpov
Один из основателей проекта PVS-Studio расскажет об опыте разработки статического анализатора кода C++. У инструментов статического анализа кода существует "проблема айсберга". От пользователей скрыты сложные механизмы анализа кода, и иногда им кажется, что статические анализаторы – это просто какие-то утилиты, ищущие опечатки с помощью регулярных выражений. Автор доклада постарается в общих чертах описать, как всё обстоит на самом деле. Он покажет на примерах, почему нормальный анализ с помощью регулярных выражений нереализуем, что такое Data Flow анализ, а также расскажет о других технологиях, применяемых при анализе кода. Вкратце будет затронут вопрос использования нейронных сетей, обсуждение которых сейчас является очень модной темой, и рассказано, почему с точки зрения анализа кода отношение к этому направлению является очень скептическим.
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахYandex
В докладе рассказано о вычислительной модели на графах, в основе которой лежит механизм передачи сообщений между вершинами, а также о реализации в рамках данной модели API для написания алгоритмов на C++.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
В докладе будет рассмотрена генерация кода при компиляции различных языковых конструкций, как простых, так и сложных, на различных платформах, как общераспространённых x86/x64, так и тех, которым уделяется меньше внимания: ARM, AVR. Также будут встречаться примеры для совсем экзотических процессоров вроде PowerPC и даже MicroBlaze. Основной упор будет делаться не на обработку данных, а именно на сопоставление различных конструкций кода с инструкциями целевых платформ.
Опыт разработки статического анализатора кодаAndrey Karpov
Один из основателей проекта PVS-Studio расскажет об опыте разработки статического анализатора кода C++. У инструментов статического анализа кода существует "проблема айсберга". От пользователей скрыты сложные механизмы анализа кода, и иногда им кажется, что статические анализаторы – это просто какие-то утилиты, ищущие опечатки с помощью регулярных выражений. Автор доклада постарается в общих чертах описать, как всё обстоит на самом деле. Он покажет на примерах, почему нормальный анализ с помощью регулярных выражений нереализуем, что такое Data Flow анализ, а также расскажет о других технологиях, применяемых при анализе кода. Вкратце будет затронут вопрос использования нейронных сетей, обсуждение которых сейчас является очень модной темой, и рассказано, почему с точки зрения анализа кода отношение к этому направлению является очень скептическим.
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахYandex
В докладе рассказано о вычислительной модели на графах, в основе которой лежит механизм передачи сообщений между вершинами, а также о реализации в рамках данной модели API для написания алгоритмов на C++.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
В докладе будет рассмотрена генерация кода при компиляции различных языковых конструкций, как простых, так и сложных, на различных платформах, как общераспространённых x86/x64, так и тех, которым уделяется меньше внимания: ARM, AVR. Также будут встречаться примеры для совсем экзотических процессоров вроде PowerPC и даже MicroBlaze. Основной упор будет делаться не на обработку данных, а именно на сопоставление различных конструкций кода с инструкциями целевых платформ.
Докладчик: Данил Руденко
О докладе:
По некоторым оценкам, больше половины профессий будет автоматизировано – это и есть максимальный объём, на который может быть увеличен рынок алгоритмов машинного обучения, ярчайшем представителем которого являются нейронные сети.
В докладе мы поговорим об общей концепции нейронных сетей, рассмотрим основные Python - фреймворки для машинного обучения, а также реализуем решение задачи классификации изображений с применением Keras.
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JSFestUA
Мы так сильно полагаемся на фреймворки, что уже забыли, как работают компьютеры. Когда что-то сильно тормозит и непонятно, как это решить, приходится учиться мыслить алгоритмически. Как анализировать "узкие" места в коде? Выполняет ли код лишнюю работу? Как можно достичь того же результата, делая меньше? Практикуя алгоритмическое мышление, отвечать на подобные вопросы становится гораздо легче, и рано или поздно вы научитесь писать код так, чтобы он был быстрым изначально, по умолчанию. Так что позвольте мне познакомить вас с алгоритмами еще раз, в практичном виде, применимом в вашей повседневной работе.
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
Причины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
Предлагаемый подход позволяет без труда получить параллельную асинхронную обработку данных без явного использования средств синхронизации, по максимуму задействуя доступные вычислительные ресурсы. Использование сопрограмм значительно упрощает написание многопоточного кода. Это дает возможность сконцентрироваться непосредственно на задаче обработки данных, не занимаясь вопросами синхронизации различных операций, включая асинхронную работу с сетью.
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Со времён С++98 стандартные контейнеры и идиома RAII позволяли избегать использования оператора delete, что делало код более безопасным. С приходом С++11 и умных указателей отпала необходимость использовать оператор new, что позволило практически полностью переложить управление памятью на плечи компилятора. В докладе объясняется идеология управления памятью и ресурсами в современном С++.
Pony ORM - маппер нового поколения (Алексей Малашкевич и Александр Козловский)IT-Доминанта
Алексей Малашкевич - Автор и разработчик Pony ORM / Pony ORM / Россия, Санкт-Петербург
Александр Козловский - Автор и разработчик Pony ORM / Pony ORM / Россия, Санкт-Петербург
Pony ORM - маппер, который позволяет работать с базой данных с помощью генераторных выражений языка Питон. С помощью такого подхода Pony позволяет формулировать очень компактные и понятные запросы, которые автоматически транслируются в оптимизированный SQL. Pony обладает графическим редактором ER диаграмм - удобным инструментом для создания и редактирования модели данных.
В докладе разработчики Pony ORM расскажут про процесс перевода объектно-ориентированного запроса в запрос на языке SQL, о том какие оптимизации Pony применяет на каждом этапе обработки запроса, какие сложности стояли при разработке высокопроизводительного ORM и как Pony ORM облегчает и ускоряет разработку приложений.
http://www.it-sobytie.ru/events/2040
Динамика и статика — метрики графов социальных сетей - Cергей ЗефировYandex
Из доклада вы узнаете о графах социальных сетей, их основных характеристиках и о том, где еще встречаются такие графы (число Эрдеша, интернет, биология, семантический анализ), с описанием простой схемы распределенной работы с графами и ее улучшением. Также Сергей расскажет о центральных метриках: количестве соседей, коэффициенте кластеризации, промежуточной центральности, о том, как можно быстро считать центральные метрики для изменяющихся графов, почему важно считать динамически и быстро, и как можно быстро считать промежуточную центральность.
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
2 июля 2011, Я.Субботник в Екатеринбурге
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
О докладе:
Про Python и Django: зачем нужна красота и простота перфекционистам с дедлайнами, на примере Яндекс.Погоды.
Когда число сервисов, которые делаются в Яндексе, стало возрастать, дедлайны — поджимать, а от процесса разработки требовалось стать более гибким, возникла потребность в свежих решениях. В докладе на примере Яндекс.Погоды рассказывается, как в Яндексе делают сервисы с помощью языка Python и веб-фреймворка Django.
Докладчик: Данил Руденко
О докладе:
По некоторым оценкам, больше половины профессий будет автоматизировано – это и есть максимальный объём, на который может быть увеличен рынок алгоритмов машинного обучения, ярчайшем представителем которого являются нейронные сети.
В докладе мы поговорим об общей концепции нейронных сетей, рассмотрим основные Python - фреймворки для машинного обучения, а также реализуем решение задачи классификации изображений с применением Keras.
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JSFestUA
Мы так сильно полагаемся на фреймворки, что уже забыли, как работают компьютеры. Когда что-то сильно тормозит и непонятно, как это решить, приходится учиться мыслить алгоритмически. Как анализировать "узкие" места в коде? Выполняет ли код лишнюю работу? Как можно достичь того же результата, делая меньше? Практикуя алгоритмическое мышление, отвечать на подобные вопросы становится гораздо легче, и рано или поздно вы научитесь писать код так, чтобы он был быстрым изначально, по умолчанию. Так что позвольте мне познакомить вас с алгоритмами еще раз, в практичном виде, применимом в вашей повседневной работе.
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
Причины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
Предлагаемый подход позволяет без труда получить параллельную асинхронную обработку данных без явного использования средств синхронизации, по максимуму задействуя доступные вычислительные ресурсы. Использование сопрограмм значительно упрощает написание многопоточного кода. Это дает возможность сконцентрироваться непосредственно на задаче обработки данных, не занимаясь вопросами синхронизации различных операций, включая асинхронную работу с сетью.
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Со времён С++98 стандартные контейнеры и идиома RAII позволяли избегать использования оператора delete, что делало код более безопасным. С приходом С++11 и умных указателей отпала необходимость использовать оператор new, что позволило практически полностью переложить управление памятью на плечи компилятора. В докладе объясняется идеология управления памятью и ресурсами в современном С++.
Pony ORM - маппер нового поколения (Алексей Малашкевич и Александр Козловский)IT-Доминанта
Алексей Малашкевич - Автор и разработчик Pony ORM / Pony ORM / Россия, Санкт-Петербург
Александр Козловский - Автор и разработчик Pony ORM / Pony ORM / Россия, Санкт-Петербург
Pony ORM - маппер, который позволяет работать с базой данных с помощью генераторных выражений языка Питон. С помощью такого подхода Pony позволяет формулировать очень компактные и понятные запросы, которые автоматически транслируются в оптимизированный SQL. Pony обладает графическим редактором ER диаграмм - удобным инструментом для создания и редактирования модели данных.
В докладе разработчики Pony ORM расскажут про процесс перевода объектно-ориентированного запроса в запрос на языке SQL, о том какие оптимизации Pony применяет на каждом этапе обработки запроса, какие сложности стояли при разработке высокопроизводительного ORM и как Pony ORM облегчает и ускоряет разработку приложений.
http://www.it-sobytie.ru/events/2040
Динамика и статика — метрики графов социальных сетей - Cергей ЗефировYandex
Из доклада вы узнаете о графах социальных сетей, их основных характеристиках и о том, где еще встречаются такие графы (число Эрдеша, интернет, биология, семантический анализ), с описанием простой схемы распределенной работы с графами и ее улучшением. Также Сергей расскажет о центральных метриках: количестве соседей, коэффициенте кластеризации, промежуточной центральности, о том, как можно быстро считать центральные метрики для изменяющихся графов, почему важно считать динамически и быстро, и как можно быстро считать промежуточную центральность.
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
2 июля 2011, Я.Субботник в Екатеринбурге
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
О докладе:
Про Python и Django: зачем нужна красота и простота перфекционистам с дедлайнами, на примере Яндекс.Погоды.
Когда число сервисов, которые делаются в Яндексе, стало возрастать, дедлайны — поджимать, а от процесса разработки требовалось стать более гибким, возникла потребность в свежих решениях. В докладе на примере Яндекс.Погоды рассказывается, как в Яндексе делают сервисы с помощью языка Python и веб-фреймворка Django.
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиковMskDotNet Community
2017-12-16 MskDotNet Субботник
Искусственный интеллект сейчас является одной из самых обсуждаемых тем и главным двигателем цифровой трансформации бизнеса. Стратегия Microsoft в области ИИ включает в себя демократизацию ИИ для разработчиков, т.е. предоставление простых в использовании фреймворков и сервисов для решения интеллектуальных задач. Мы расскажем, как.NET-разработчики могут использовать возможности ИИ в своих проектах: начиная от готовых когнитивных сервисов, работающих в облаке, заканчивая обучением нейросетей на.NET-языках и запуском сложных нейросетевых моделей на компактных устройствах типа Raspberry Pi.
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова. Курс "Алгоритмы интеллектуальной обработки больших объемов данных", Лекция №8 "Методы снижения размерности пространства"
Лектор - Владимир Гулин
Проблема проклятия размерности. Отбор и выделение признаков. Методы выделения признаков (feature extraction). Метод главных компонент (PCA). Метод независимых компонент (ICA). Методы основанные на автоэнкодерах. Методы отбора признаков (feature selection). Методы основанные на взаимной корреляции признаков. Метод максимальной релевантность и минимальной избыточности (mRMR). Методы основанные на деревьях решений.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9pyyrqknouMZbIPf4l3CwUP
RIT++: Hadoop Streaming: простой путь к масштабированию приложений обработки ...Alexey Voropaev
Slides from RIT++2011
Hadoop Streaming: простой путь к масштабированию приложений обработки данных (Hadoop Streaming: simple way to scale data processing applications)
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)AvitoTech
Basis.js - это мощный фреймворк для создания полноценных SPA приложений. Он давно и активно используется в production, в том числе и в Avito. Цель доклада - рассказать об основных возможностях фреймворка и побудить слушателей попробовать данный фреймворк при создании SPA-приложений.
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
"Сеть - это компьютер. Снова" Бахтерев Михаил, ИММ УрО РАН
1. Сеть – это компьютер. Снова
Михаил Бахтерев1
m.bakhterev@imm.uran.ru
Павел Васёв1,2
contact@lact.ru
1Институт Математики и Механики им. Н.Н. Красовского
2Конструктор Сайтов «LineAct»
ДАМП-2017, Екатеринбург
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 1 / 56
2. Часть 1. Познавательная
Или почему тяжело создавать распределённое ПО?
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 2 / 56
10. Э. Таненбаум1
узнаёт о микросервисах
1
Aвтор MINIX, RFID-вируса и спора с Л. Торвальдсом о судьбах операционных систем.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 4 / 56
13. Клиент-серверная архитектура
▶ Легко, когда:
▶ множество изолированных друг от друга сессий;
▶ поддержано решающей все проблемы БД.
▶ Тяжело, если необходимо:
▶ рассчитать выброс гильзы из пушки Су-35;
▶ смоделировать работу сердца;
▶ обучить гигантскую нейронную сеть;
▶ оценить поведение платья на конкретной фигуре;
▶ решить любую другую задачу супервычислений.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 7 / 56
15. 3-й3,4
закон разработки ВП-приложений
О Σ технологий и Π неприятностей:
+
libNUMA
OpenMP
OpenCL
MPI
Web
= ×
Наладка и отладка работы · ×103 процессов
Экспоненциальное усложнение: 2(·×103 разных rip)
Синхронные коллективные операции
Примитивные схемы параллелизма
Барьеры
MPI_Allgather
Перерасход памяти и её утечки
Незаметные взаимные блокировки
Избыточное копирование
Обмен через файлы
Отказы оборудования
Арифметические ошибки (в индексах)
=⇒
Простои оборудования
Неоптимальность
Некорректность.
3
1. Закон Амдала.
4
2. Закон о нехватке специалистов.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 9 / 56
16. Что же нас держит в привязанных к узлам5
циклах?
5
Akka
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 10 / 56
18. λ-исчисление прекрасно
▶ Числа.
▶ Условные операции и ветвления.
▶ Суммы и произведения структур данных.
▶ Рекурсия:
▶ теория семантических доменов и теория категорий;
▶ соответствие Карри-Ховарда-Лэмбэка;
▶ связь программирования с логикой, топологией и, дальше, с физикой;
▶ теория зависимых типов;
▶ системы механического содействия доказательствам;
▶ новые основания математики;
▶ конечно же, Пол Грэм и Y-комбинатор.
▶ Стандартная семантика любого современного ЯП.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 12 / 56
19. β-редукция: сила и слабость λ-исчисления
▶ Простая идея о замене переменной на значение:
[x → h] y =
{
h x = y
y x ̸= y
[x → h] (f g) = ([x → h] f [x → h] g)
[x → h] (λy f) =
{
(λy f) x = y
(λz [x → h] [y → z] f) x ̸= y ∧ z /∈ FZ
где FZ = (FreeVars h) ∪ (FreeVars f) .
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 13 / 56
20. β-редукция: сила и слабость λ-исчисления
▶ Простая идея о замене переменной на значение:
[x → h] y =
{
h x = y
y x ̸= y
[x → h] (f g) = ([x → h] f [x → h] g)
[x → h] (λy f) =
{
(λy f) x = y
(λz [x → h] [y → z] f) x ̸= y ∧ z /∈ FZ
где FZ = (FreeVars h) ∪ (FreeVars f) .
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 13 / 56
21. β-редукция: сила и слабость λ-исчисления
▶ Простая идея о замене переменной на значение:
[x → h] y =
{
h x = y
y x ̸= y
[x → h] (f g) = ([x → h] f [x → h] g)
[x → h] (λy f) =
{
(λy f) x = y
(λz [x → h] [y → z] f) x ̸= y ∧ z /∈ FZ
где FZ = (FreeVars h) ∪ (FreeVars f) .
∦ Эффективная реализация – индексы де Брауна, a.k.a. стек.
∦ Конфлюентность и ленивость не делают β-редукцию коммутативной.
∦ Не к чему «прицепить» обмен данными.
▶ Не помогают даже игровые и трассирующие семантики.
∥ Чистые функции.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 13 / 56
22. λ-исчисление, всё равно, прекрасно
+ Теория, Пол Грэм и Y-комбинатор.
+ Язык ядер для GPU:
▶ Vector Models for Data-Parallel Computing;
▶ λ-исчисление с длинными векторными примитивами.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 14 / 56
23. λ-исчисление, всё равно, прекрасно
+ Теория, Пол Грэм и Y-комбинатор.
+ Язык ядер для GPU:
▶ Vector Models for Data-Parallel Computing;
▶ λ-исчисление с длинными векторными примитивами.
− Асинхронное взаимодействие с GPU – взрыв мозга.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 14 / 56
25. Добро пожаловать в CHAOS CSP-реальности
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 16 / 56
26. CSP Хоара прекрасны и реалистичны
▶ Логика Хоара.
▶ Проверка моделей.
▶ Теморальная логика и линейные типы.
▶ Предтеча изобретению доменов Ершова-Скотта.
▶ Симметричные моноидальные категории.
▶ И связь с тензорными сетями Пенроуза и диаграммами Фейнмана6.
▶ Позволяют описывать вычислительную реальность:
▶ автоматы продажи шоколадок;
▶ ячейки памяти;
▶ процессоры;
▶ сокеты;
▶ операционные системы.
6
Воистину к Дао ведут все пути.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 17 / 56
27. Формулы успеха CSP: события + λ = процессы
▶ Готовность к событиям: a:A ↠ (P a).
7
Частный случай
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 18 / 56
28. Формулы успеха CSP: события + λ = процессы
▶ Готовность к событиям: a:A ↠ (P a).
▶ Умение взаимодействовать7:
a ↠ P ∥ a ↠ Q = a ↠ (P ∥ Q)
P ∥ (Q ∥ R) = (Q ∥ P) ∥ R;
7
Частный случай
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 18 / 56
29. Формулы успеха CSP: события + λ = процессы
▶ Готовность к событиям: a:A ↠ (P a).
▶ Умение взаимодействовать7:
a ↠ P ∥ a ↠ Q = a ↠ (P ∥ Q)
P ∥ (Q ∥ R) = (Q ∥ P) ∥ R;
▶ Рекурсивность: μX. (F X);
7
Частный случай
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 18 / 56
30. Формулы успеха CSP: события + λ = процессы
▶ Готовность к событиям: a:A ↠ (P a).
▶ Умение взаимодействовать7:
a ↠ P ∥ a ↠ Q = a ↠ (P ∥ Q)
P ∥ (Q ∥ R) = (Q ∥ P) ∥ R;
▶ Рекурсивность: μX. (F X);
▶ Маркировка: l:P.
7
Частный случай
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 18 / 56
31. Формулы успеха CSP: события + λ = процессы
▶ Готовность к событиям: a:A ↠ (P a).
▶ Умение взаимодействовать7:
a ↠ P ∥ a ↠ Q = a ↠ (P ∥ Q)
P ∥ (Q ∥ R) = (Q ∥ P) ∥ R;
▶ Рекурсивность: μX. (F X);
▶ Маркировка: l:P.
▶ Например, процесс копирования:
λ[in out]. μC. in?a ↠ out!a ↠ C
7
Частный случай
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 18 / 56
32. Тонкие особенности
+ Можем типизировать:
Q : Proc a → (a → Proc b) → Proc b.8
+ Можем моделировать:
a ↠ P = (λe (if (= e a) P BLEEP)).
8
Монада! Доклад удался!
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 19 / 56
33. Тонкие особенности
+ Можем типизировать:
Q : Proc a → (a → Proc b) → Proc b.8
+ Можем моделировать:
a ↠ P = (λe (if (= e a) P BLEEP)).
− Но не можем выразить на λ-языке.
− Должны сделать процессы примитивами:
▶ процессы Erlang;
▶ изменяемые переменные.
− И должны принять последствия своего выбора.
8
Монада! Доклад удался!
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 19 / 56
35. Цена параллельной реальности
▶ Неопределённость: |A| = · × 103.
▶ Каждое входящее событие «взрывает» домены.
▶ Ячейки памяти как rd/wr-серверы.
▶ Неопределённость: в a ↠ a ↠ P события a – разные.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 20 / 56
36. Цена параллельной реальности
▶ Неопределённость: |A| = · × 103.
▶ Каждое входящее событие «взрывает» домены.
▶ Ячейки памяти как rd/wr-серверы.
▶ Неопределённость: в a ↠ a ↠ P события a – разные.
▶ IO помогает спрятаться, но внешняя логика – CHAOS.
▶ CHAOS – важный для теории СSP процесс, который:
▶ и принимает любое событие,
▶ и отказывается от любого события;
▶ является начальным объектом категории процессов.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 20 / 56
37. CSP продают в разных обёртках
+ Некоторые парни учат математику и делают:
▶ Erlang;
▶ Node.js;
▶ Go;
▶ core.async в Clojure.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 21 / 56
38. CSP продают в разных обёртках
+ Некоторые парни учат математику и делают:
▶ Erlang;
▶ Node.js;
▶ Go;
▶ core.async в Clojure.
− Некоторые парни делают release-fast:
▶ systemd;
▶ Akka:
▶ вместо автоматического обнаружения взаимоблокировок
▶ нелокальная утечка памяти в бесконечные обещания,
▶ с крайними случаями.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 21 / 56
39. Ограничение CHAOS упрощением процессов
Фиксированные графы потоков данных
▶ Gstreamer;
▶ Intel DGFR.
▶ Плюсы:
+ отказоустойчивость;
+ производительность и асинхронность;
▶ Минусы:
− CHAOS уходит в ветвления, задержки и синхронизацию.
− Высокая сложность построения графов.
− Нерекурсивны, некомпонуемы и неполны по Тьюрингу.
− Вычисления закрыты.
− Нет механизмов работы с неопределённость.
− Проблема ветвлений.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 22 / 56
40. Ограничение CHAOS упрощением процессов
Развитие идей MapReduce
▶ Apache Spark;
▶ Elexir Streams.
▶ Плюсы:
+ Отказоустойчивость.
+ Производительность и асинхронность.
+ CHAOS практически побеждён.
± Условная простота программирования.
▶ Минусы:
− Нерекурсивны, некомпонуемы и неполны по Тьюрингу.
− Вычисления закрыты.
− Нет механизмов работы с неопределённостью.
− Проблема ветвлений.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 23 / 56
41. В большой открытой рекурсии нет CHAOS
oi = ANN(wi,j(n); {xd
i })
δk = −ok · (1 − ok) · (tk − ok)
δj = oj · (1 − oj) ·
∑
k∈out(j)
δk · wi,j
Δwi,j(n) = α · Δwi,j(n − 1) + (1 − α) · η · δj · oi
wi,j(n) = wi,j(n − 1) + Δwi,j(n)
Например, в глубогом обучении с подкреплением
▶ xd
i и tk могут поступать извне вычисления;
▶ достаточная точность δk может достигается на неизвестном шаге.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 24 / 56
42. Часть 2. Многообещающая
Или Академия Наук спешит на помощь!
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 25 / 56
43. Академики не дремлют
▶ Т-Система (ИПС им. А.К. Айламазяна РАН)9
▶ Девиз: распределённая машина распределённых обещаний.
+ Быстрая, распределённая с тонким параллелизмом и на Си.
− Не универсальная (?), не безопасная, не ясна работа с массивами и IO.
▶ DVM (ИПМ им. М.В. Келдыша РАН)10
▶ Девиз: Квадриллионы Ваших итераций возмём на себя!
+ Быстрая, распределённая с параллельным дисковым IO и на Си.
+ Автоматическое распараллеливание на NUMA, GPU, кластеры.
− Не универсальная: некоторые (весьма полезные) циклы на массивах.
▶ Oz (Swedish Institute of Computer Science)
▶ Девиз: Recv для слабаков!
+ Тьюринг-полный, асинхронный, лаконичный с тонким параллелизмом.
− Вычисление не применением, а унификацией термов: не очевидный.
− Не быстрый, не ясна работа с IO.
9
1980 г. Зарубежный аналог: SISAL (LLNL, DEC и др.), 1983 г., только SMP
10
1993 г. Зарубежный аналог: OpenMP, 1997 г., только SMP.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 26 / 56
44. Т-Система и числа Фибоначчи
#include <stdio.h>
#include <stdlib.h>
tfun int fib (int n) {
return n < 2 ? n : fib(n-1) + fib(n-2);
}
tfun int main (int argc, char *argv[]) {
if (argc != 2) { printf(”Usage: fib <n>n”); return 1; }
int n = atoi(argv[1]);
printf(”fib(%d) = %dn”, n, (int)fib(n));
return 0;
}
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 27 / 56
45. DVM и метод Якоби
#pragma dvm array distribute[block][block], shadow[1: 1][1: 1]
double A[L][L];
#pragma dvm array align([i][j] with A[i][j])
double B[L][L];
int main(int argc, char * argv[]) {
for (int it = 0; it < ITMAX; it++) {
#pragma dvm region inout (A, B)
{
#pragma dvm parallel([i][j] on A[i][j])
for (int i = 1; i < L - 1; i++)
for (int j = 1; j < L - 1; j++)
A[i][j] = B[i][j];
#pragma dvm parallel([i][j] on B[i][j]), shadow_renew(A)
for (int i = 1; i < L - 1; i++)
for (int j = 1; j < L -1; j++)
B[i][j] = (A[i -1][j] + A[i + 1][j] + A[i][j -1] + A[i][j + 1]) / 4.;
}
}
FILE * f = fopen(”jacobi.dat”, ”wb ”);
#pragma dvm get_actual(B)
fwrite(B, sizeof(double), L * L, f);
fclose(f);
return 0;
}
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 28 / 56
46. Oz и приём данных без Recv
declare Port in
local PortTag NewPort IsPort Send in
PortTag = {NewName}
fun {NewPort FS}
local S C in
C = {NewCell S}
FS = !!S
{NewChunk port(PortTag: C)}
end
end
fun {IsPort ?P}
{Chunk.hasFeature P PortTag}
end
proc {Send P M}
local Ms Mr in
{Exchange P.PortTag Ms Mr}
Ms = M | !!Mr
end
end
Port = port (new: NewPort is: IsPort send: Send)
end
declare NewQueueServer in
fun {NewQueueServer}
local Given GivePort Taken TakePort Join in
GivePort = {Port.new Given}
TakePort = {Port.new Taken}
proc {Join Xs Ys}
local Xr Yr X Y in
Xs = X | Xr
Ys = Y | Yr
X = Y
{Join Xr Yr}
end
end
thread {Join Given Taken} end
queue (
put: proc {$ X} {Port.send GivePort X} end
get: proc {$ X} {Port.send TakePort X} end)
end
end
**
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 29 / 56
47. Идеальное решение должно существовать
ДЗК структур событий11
(E – события, ≤ – причинные связи, ⊢ – конфликты)
Декартово замкнутые категории
▶ Автоматически интуиционистская логика.
▶ Автоматически λ-исчисление.
▶ Пока найдена только CSP12.
11
Glynn Winskel, Event Structures
12
Потому что ДЗК ⊂ СМК.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 30 / 56
48. РАспределёный Интуиционистский Движок
▶ Тьюринг-полные открытые потоки данных.
▶ Ресурсопластичность.
▶ Выразительность и простота:
▶ близость к λ-исчислению;
▶ рекурсивность;
▶ неопределённость только по необходимости;
▶ однородное описание потоков данных между разными подсистемами:
{CPU, GPGPU, MIC, FPGA, host, cluster, web, …}2
.
▶ Высокая производительность:
▶ совмещённые рассчёты и обмены данными;
▶ отсутсвие избыточных копирований;
▶ распределённый рассчёт потока управления.
▶ Независимость от:
▶ языка программирования
▶ и аппаратуры: FPGA, сетевые GPGPU, APU, …
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 31 / 56
50. РАЙД с разных точек зрения
▶ Открытые динамические рекурсивные графы потоков данных.
▶ CSP со стабильными событиями формирования данных.
▶ Λ с распределёнными переменными и коммутативной редукцией.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 33 / 56
51. РАЙД API
▶ Примитивы обмена данными
1. Блок данных.
2. Контакт
▶ (pin :a :b :c ”hello”).
3. Очередь
▶ (zip (str (+ 1 2)) ”kitty”).
▶ Указатели на распределённые структуры
4. Диапазон путей
▶ (! pin :a (span ””) :c)
▶ (? pin (span ”x y z” :Z))
▶ (! zip (str (+ 1 2)) ”kitty”)
▶ (? zip).
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 34 / 56
58. Продолжения
▶ На самом деле, ничего особенного, обычные продолжения.
▶ Но в РАЙД они формируются массово и параллельно.
▶ Активируются асинхронно по готовности аргументов.
▶ (run F ”hello kitty” (pin :p) (zip :z) (! zip :Z))
P Z
Z
Z
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 39 / 56
59. Формирование графа через продолжения
▶ (run F ”hello kitty” (pin :p) (zip :z) (! zip :Z))
P Z
Z
Z
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 40 / 56
60. Формирование графа через продолжения
▶ (run F ”hello kitty” (pin :p) (zip :z) (! zip :Z))
▶ (define (F hk p z z-ref)
P Z
Z
Z
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 40 / 56
61. Формирование графа через продолжения
▶ (run F ”hello kitty” (pin :p) (zip :z) (! zip :Z))
▶ (define (F hk p z z-ref)
▶ (:= z-ref (+ p z))
P Z
Z
Z
Z
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 40 / 56
62. Формирование графа через продолжения
▶ (run F ”hello kitty” (pin :p) (zip :z) (! zip :Z))
▶ (define (F hk p z z-ref)
▶ (:= z-ref (+ p z))
▶ (run h (pin :R) (pin :S))
P Z
Z
Z
Z
R
S
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 40 / 56
63. Формирование графа через продолжения
▶ (run F ”hello kitty” (pin :p) (zip :z) (! zip :Z))
▶ (define (F hk p z z-ref)
▶ (:= z-ref (+ p z))
▶ (run h (pin :R) (pin :S))
▶ (run g (zip z-ref) (pin :P))
P Z
Z
Z
Z
R
S
P
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 40 / 56
64. Формирование графа через продолжения
▶ (run F ”hello kitty” (pin :p) (zip :z) (! zip :Z))
▶ (define (F hk p z z-ref)
▶ (:= z-ref (+ p z))
▶ (run h (pin :R) (pin :S))
▶ (run g (zip z-ref) (pin :P))
▶ (run f (zip z-ref) (pin :Q)))
P Z
Z
Z
Z
R
S
Q ZP
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 40 / 56
66. Диапазоны: распределённый контроль потока
▶ Все pin и zip независимы, работа с ними параллельна.
▶ Необходим механизм работы со структурами данных:
▶ указание на структуры;
▶ передача их в процедуры;
▶ обновление больших распределённых структур;
▶ рекурсия:
▶ кадры активации процедур,
▶ произведение для ДЗК.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 42 / 56
67. Диапазоны: распределённый контроль потока
▶ Все pin и zip независимы, работа с ними параллельна.
▶ Необходим механизм работы со структурами данных:
▶ указание на структуры;
▶ передача их в процедуры;
▶ обновление больших распределённых структур;
▶ рекурсия:
▶ кадры активации процедур,
▶ произведение для ДЗК.
▶ Диапазоны.
▶ 4 варианта: {?-чтение, !-запись} × {pin, zip}.
▶ Просто блок данных, отвечающий на два вопроса.
1. Попадает ли путь в диапазон?
2. Если попадает, от какого он корня идёт?
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 42 / 56
77. Сложность и важность диапазонов
▶ Вычислительно непростые префиксные деревья.
▶ Можно существенно упростить, специализировав под:
▶ многомерные массивы с целочисленными индексами;
▶ одномерные ассоциативные массивы;
▶ записи с фиксированным набором полей.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 44 / 56
78. Сложность и важность диапазонов
▶ Вычислительно непростые префиксные деревья.
▶ Можно существенно упростить, специализировав под:
▶ многомерные массивы с целочисленными индексами;
▶ одномерные ассоциативные массивы;
▶ записи с фиксированным набором полей.
▶ Диапазоны обеспечивают.
1. Корректность потока данных:
▶ простая проверка пересечения диапазонов в порождаемых продолжениях.
2. Произведения в категории потоков и её замкнутость.
3. Сборку мусора:
▶ семантика диапазонов монотонная;
▶ всегда достаточно точно известно, что потребуется;
4. «Бесплатные» следствия из сборки мусора:
▶ обнаружение ошибок потока данных, в том числе взаимоблокировок;
▶ обработку ошибок приложения, например арифметических;
▶ контроль за ресурсами процессов.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 44 / 56
79. ▶ Рассчёты диапазонов параллельны и локальны.
▶ Сборка мусора нелокальный процесс, но:
▶ асинхронный,
▶ фоновый,
▶ мир не нужно останавливать.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 45 / 56
80. Процессы и руление
Процессы
▶ Дополнительный идентификатор для продолжений.
▶ Необходим для ручного завершения вычисления.
▶ Помогает изолировать ошибки: классика UNIX.
Руление
▶ (run … (meta :cluster 2 :node 5 :ram 0 :gpu 1)).
▶ (! pin … (meta :check-point)).
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 46 / 56
81. Результаты на текущий момент
MPI
C99 -1 MPI
C99 -2 MPI
Python
RiDE
C99
RiDE
AST
Hadoop
Java
RiDE
C99 -MR RiDE
AST -MR
209
86
101
46
71
91
35
57 54
21
82
34
Строккода
¬lib/¬load
lib/¬load
lib/load
Рис.: Объём кода параллельного умножения матриц в разных системах. lib –
использование библиотеки для локальных матричных операций; load – работа с
внешними данными.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 47 / 56
82. Синтаксис, безусловно, очень важен13
▶ S-выражение абстрактного синтаксиса
(for-each i (range l)
j (range n)
k (range m)
(run matrix-mul (! zip ’i.j) (pin mat-a ’i.k) (pin mat-b ’k.j)))
▶ Аналогичный код на C99
for (unsigned i = 0; i < L; i++)
for (unsigned j = 0; j < N; j++) {
const int sum_zip = rzip(rfmt(”%u.%u”, i, j));
for (unsigned k = 0; k < M; k++) {
const int aik_pin = rpin(A, rfmt(”%u.%u”, i, k)),
bkj_pin = rpin(B, rfmt(”%u.%u”, k, j));
rrun(”matrix_mul”, rref(WR, sum_zip), aik_pin, bkj_pin); } }
13
И для НИР лучше, когда его нет.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 48 / 56
83. Пример: распределённое умножение матриц
(define block-n 64 l 100 n 200 m 300)
(define (distributed-matrix-mul mat-r mat-a mat-b)
(for-each i (range l)
j (range n)
k (range m)
(run matrix-mul (! zip ’i.j) (pin mat-a ’i.k) (pin mat-b ’k.j)))
(let queue-sum
(lambda result sum-ref blocks n-blocks
(if (= 0 n-blocks)
(run (lambda r s (:= r s)) (! pin result) (pin sum-ref))
(do (run matrix-add (! pin :sum) (pin sum-ref) (zip blocks))
(run queue-sum (! pin result)
(? pin :sum) (? zip block-queue) (- n-blocks 1)))))
(for-each i (range l)
j (range n)
(run queue-sum (! pin mat-r ’i.j) (ref (zero-matrix)) (? zip ’i.j) m))))
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 49 / 56
84. Пример: группы продолжений
(for-each i (range l)
j (range n)
k (range m)
(run matrix-mul (! zip ’i.j) (pin mat-a ’i.k) (pin mat-b ’k.j)))
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 50 / 56
88. Плюсы и минусы в теории
+ РАЙД – это безграничный сетевой компьютер с λ-исчислением:
▶ ДЗК потоков данных и, как следствие, обычный функциональный код;
▶ возможна статическая проверка семантики программ;
▶ сложность программирования ниже уровня MapReduce;
▶ библиотеки функций в распределённом пространстве данных.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 54 / 56
89. Плюсы и минусы в теории
+ РАЙД – это безграничный сетевой компьютер с λ-исчислением:
▶ ДЗК потоков данных и, как следствие, обычный функциональный код;
▶ возможна статическая проверка семантики программ;
▶ сложность программирования ниже уровня MapReduce;
▶ библиотеки функций в распределённом пространстве данных.
+ Живучесть:
▶ нет единых точек отказа;
▶ возможность отслеживать и обрабатывать ошибки;
▶ прозрачная для программиста поддержка контрольных точек.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 54 / 56
90. Плюсы и минусы в теории
+ РАЙД – это безграничный сетевой компьютер с λ-исчислением:
▶ ДЗК потоков данных и, как следствие, обычный функциональный код;
▶ возможна статическая проверка семантики программ;
▶ сложность программирования ниже уровня MapReduce;
▶ библиотеки функций в распределённом пространстве данных.
+ Живучесть:
▶ нет единых точек отказа;
▶ возможность отслеживать и обрабатывать ошибки;
▶ прозрачная для программиста поддержка контрольных точек.
+ Производительность.
▶ руление асинхронными потоками данных;
▶ блоки данных в общей памяти можно не копировать;
▶ децентрализованное хранение данных с параллельным доступом;
▶ все операции управления потоком, кроме сборки мусора – независимые;
▶ все управляющие стркутуры РАЙД – это CRDT (kudos: В. Грищенко).
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 54 / 56
91. Плюсы и минусы на практике
+ Выразительность проверена на компиляторе Си99 для МультиКлет:
▶ проблемно ориентированный язык с моделью RiDE;
▶ сложные обмены данными в процедурах компиляции – отличный тест;
▶ программирование, на удивление, оказалось простым и весёлым.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 55 / 56
92. Плюсы и минусы на практике
+ Выразительность проверена на компиляторе Си99 для МультиКлет:
▶ проблемно ориентированный язык с моделью RiDE;
▶ сложные обмены данными в процедурах компиляции – отличный тест;
▶ программирование, на удивление, оказалось простым и весёлым.
+ Живучесть проверена на прототипной реализации и кластере от РСК.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 55 / 56
93. Плюсы и минусы на практике
+ Выразительность проверена на компиляторе Си99 для МультиКлет:
▶ проблемно ориентированный язык с моделью RiDE;
▶ сложные обмены данными в процедурах компиляции – отличный тест;
▶ программирование, на удивление, оказалось простым и весёлым.
+ Живучесть проверена на прототипной реализации и кластере от РСК.
− Производительность:
▶ работаем над этим;
▶ систему можно строить из простых независимых компонент:
▶ серверы блоков данных,
▶ серверы контактов,
▶ серверы очередей,
▶ серверы диапазонов и сборки мусора,
▶ планировщики,
▶ трамплины;
▶ опыт Hadoop внушает некоторый оптимизм.
Бахтерев, Васёв (ИММ, Lact) RiDE ДАМП-2017 55 / 56