<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>C.В. Єршов</string-name>
        </contrib>
      </contrib-group>
      <fpage>99</fpage>
      <lpage>108</lpage>
      <abstract>
        <p>Розроблено програмну архітектуру для системи ієрархічного нечіткого логічного виведення на основі алгоритмічних моделей нечіткого логічного виведення та окремих технологій паралельних обчислень, таких як MPI та CUDA. Представлено ключові рішення при проектування архітектури для забезпечення гнучкості та продуктивності паралельної системи нечіткого виведення. Проаналізовано шаблони проектування та програмування різного рівня абстракції, а також основні програмні модулі та інтерфейси програмної системи нечіткого виведення. Побудовано метод контейнеризації застосунків для GPU з метою їх повторного використання та розгортання на обраній програмній платформі високопродуктивних паралельних обчислень. Ключові слова: архітектура програмної системи, шаблони паралельного проектування, технологія паралельних обчислень, нечітке логічне виведення. Разработана программная архитектура для систем иерархического нечеткого логического вывода на основе алгоритмических моделей нечеткого логического вывода и отдельных технологий параллельных вычислений, таких, как MPI и CUDA. Представлены ключевые решения при проектировании архитектуры для обеспечения гибкости и продуктивности параллельной системы нечеткого вывода. Проанализировано шаблоны проектирования разного уровня абстракции, а также основные программные модули и интерфейсы программной системы нечеткого вывода. Создан метод контейнеризации приложений для GPU с целью их повторного использования и развертывания на выбранной программной платформе высокопродуктивных параллельных вычислений. Ключевые слова: архитектура программной системы, шаблоны параллельного программирования, технология параллельных вычислений, нечеткий логический вывод. A software architecture for hierarchical fuzzy logic hierarchy based on fuzzy logic algorithmic models and separate parallel computing technologies such as MPI and CUDA has been developed, as well as key architectural design solutions to provide the flexibility and performance of a parallel fuzzy system. The patterns of designing and programming of different levels of abstraction, as well as the main software modules and interfaces of the fuzzy software system are analyzed. The method of containerization of applications for the GPU for their reuse and deployment on the selected software platform of high-performance parallel computing is presented.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>4) на основі технології CUDA для графічних прискорювачів NVIDIA.
Рис. 1. Узагальнена архітектура програмної системи ієрархічного нечіткого логічного виведення
Користувач</p>
      <p>Інтерфейс користувача
Кластер СКІТ-4</p>
    </sec>
    <sec id="sec-2">
      <title>Docker</title>
      <p>Послідовна схема
Ярусно-параллельна схема
Динамічна схема</p>
    </sec>
    <sec id="sec-3">
      <title>Data.txt СPU GPU</title>
      <p>ПРЕДСТАВЛЕННЯ
БІЗНЕС-ЛОГІКА
ШАР ДАНИХ
Представлена на рис.1 архітектура містить наступні чотири шари:
1) представлення – містить графічний інтерфейс користувача, який взаємодіє як з суперкомп’ютером
СКІТ-4 [8], так і з програмно-апаратною частиною персонального комп’ютера;</p>
      <p>2) шар сервісу – представлений системою команд для запуску задач на кластері СКІТ-4, а також на
платформі Docker;</p>
      <p>3) бізнес-логіка – архітектурний шар, який реалізує структурну та алгоритмічну складову
обчислювального процесу програмної системи ІНЛВ, та підтримує дві апаратні платформи, що забезпечують
обчислення на центральному процесорі, та обчислення на основі графічних прискорювачів. Також на
центральному процесорі реалізована послідовна схема обчислень ієрархічних нечітких систем;</p>
      <p>На рис. 2. показана модель ярусно-паралельної схеми обчислень, що ґрунтується на декомпозиції по
задачам (Functional decomposition) зі статичним плануванням [9]. Кожен процес відповідає за окрему
елементарну нечітку систему, тобто композиція відбувається по задачам. Планування декомпозиції
виконується перед початком роботи для всіх ярусів обчислень. Як планувальник зазвичай виступає процес з
молодшим індексом (у даному випадку процес 1). Ярус – це кількість систем, у яких може бути паралельно
здійснено нечітке логічне виведення, враховуючи кількість наявних процесів. Показана на рис. 2. модель
застосовується для розподіленого виведення у паралельних ієрархічних нечітких системах на основі CPU.
Стрілками показано напрям передачі даних. Процеси можуть обмінюватися даними, в залежності від
інформаційних залежностей між нечіткими системами.</p>
      <p>Планувальник
Рис. 2. Ярусно-паралельна модель обчислень на основі декомпозиції по задачам (Functional decomposition) зі
статичним плануванням
1
1
1</p>
      <p>………………...
...
...
...</p>
      <p>Процес</p>
      <p>N
Розроблено модель паралельних обчислень ієрархічних систем нечіткого логічного виведення, яка
базується на основі шаблону (патерну) паралельного проектування Master-Slave (Майстер-Робітники) [9] та
показана на рис. 3. На відміну від ярусно-паралельної моделі, динамічна модель містить динамічний
планувальник робіт, що виступає як «Майстер». Слід зазначити, що «Майстер» не бере участі в безпосередніх
обчисленнях. Його головні обов’язки полягають у швидкому розподілі задач по процесам, а також у виконанні
комунікативних функцій, передачі вхідних даних та прийманні отриманих результуючих та проміжних даних,
які акумулюються зазначеним процесом «Майстер».
Процес
5
В
хідні дані
Процес</p>
      <p>3
Процес
4
.
.
.</p>
      <p>Процес
6
т
а
т
ь
ул
з
е
Р
Рис. 3. Динамічна модель паралельних обчислень на основі шаблону паралельного проектування Master-Slave
Модель обчислень для графічних прискорювачів базується на моделі ярусно-паралельної форми [10], але
має два рівні паралелізації (рис. 4). Планування для всіх рівнів здійснюється на початку обчислень загальним
планувальником. Таким чином, обчислення кожної елементарної нечіткої системи здійснюється паралельно, що
позначено на рис. 4 великими кружками.</p>
      <p>...
1 2 3 4 5 ... N
1 2 3 4 5 ... N</p>
      <p>………………...
1 2 3 4 5 ... N</p>
      <p>Тіло класу GPU містить метод setData() що є аналогом однойменного методу в класі CPU, але також
містить метод loadDataToGPU(), призначення якого – копіювання вхідних даних на графічний пристрій. Метод
gpuParallel() моделює метод паралельного ієрархічного нечіткого логічного виведення на графічному
прискорювачі.
Слід зазначити, що класи CPU та GPU містять всю інформацію стосовно ієрархії нечітких елементарних
систем. Робота кожної елементарної нечіткої системи моделюється інтерфейсом FuzzySystem та його
похідними класами FuzzySystemCPU (для техногогії на основі центральних процесорів) та FuzzySystemGPU
(для технології на основі графічних прискорювачів). Розглянемо основні абстрактні методи інтерфейсу
FuzzySystem, всі які перевизначаються в похідних класах:
- метод addInputVariables() – додати вхідну змінну;
- метод addOuputVariables() – додати вихідну змінну;
- метод addRuleBlock() – додати блок нечітких правил;
- метод run() – запустити систему на виконання.</p>
      <p>hierarchicalFuzzySystem
fuzzyNet
loadDataFromFile()
createHierarchicalSystem()
Рис. 5. Діаграма класів для системи ієрархічного нечіткого логічного виведення</p>
      <sec id="sec-3-1">
        <title>RuleCPU</title>
        <p>antecedent()
consequent()
load()
1..n</p>
      </sec>
      <sec id="sec-3-2">
        <title>Rule antecedent() consequent() load()</title>
        <p>RuleGPU
antecedent()
consequent()
load()</p>
        <p>1..n
Аналогічно розглянемо класи RuleBlock (моделює блок нечітких правил) та Rule (моделює об’єкт
нечіткого правила), які також є інтерфейсами, з можливістю перевизначення всіх методів. Методи класу
RuleBlock наступні:
- метод load() – задає завантаження блоку нечітких правил;
- метод () – визначає активацію всієї множини правил блоку.
Методи класу Rule:
- метод load() – надає завантаження нечіткого правила;
- метод antecedent() – забезпечує оцінювання лівої частини нечіткого правила (антецедента);
- метод consequent() – застосовує праву частини правила (консеквента).</p>
        <p>Зазначимо, що широке використання поліморфізму уніфікує доступ до методів класів та сприяє
розширенню програмної системи з мінімальними змінами викликаючих функцій. Існує можливість додавання
як нових моделей паралельного ієрархічного нечіткого логічного виведення, так і нових апаратних технологій
(шляхом розширення класу hierarchicalFuzzySystem).</p>
        <p>Контейнеризація застосунків
При проектуванні GPU-застосунків існує проблема, що пов’язана зі складністю їх подальшого
розгортання, тобто налагодження супутніх програм, драйверів, бібліотек, системних залежностей тощо.
Особливо це стосується випадків, коли програмне чи апаратне забезпечення відрізняється від забезпечення,
що використовувалося при проектуванні, у випадку конфлікту версій. Для подолання цієї проблеми було
розроблено метод контейнеризації GPU-застосунків для швидкого їх розгортання на обраній програмній
платформі для паралельних обчислень [13]. Іншими словами, «запакувавши» додаток у контейнер, можна у
подальшому запускати такий застосунок як на локальному хості, так і на хмарних платформах, які
підтримують технологію контейнеризації. Слід зазначити, що на сьогоднішній час майже всі основні хмарні
платформи, такі як Microfoft Azure, IBM Cloud, Google Cloud Platform, Oracle Cloud Infrastruction тощо
підтримують одночасно контейнеризацію та обчислення на GPU.
Контейнерізація GPU-прискореної інтелектуальної системи оцінювання якості стартапів в середовищі
Docker. Для здійснення контейнеризації нечітких систем було встановлено програмне середовище Docker.
Docker-застосунок складається з наступних основних компонент: образи (ще називають зображення) та
контейнери. Контейнери складаються з одного або декількох образів, та служать для запуску застосунків.
Образи можна як створити власноруч (наприклад, за допомогою програми Dockerfile), так і взяти з
Dockerреєстру [14], або взяти за основу будь-які образи, створені іншими розробниками. Образи створюються
тільки для читання, властивість запису в них відсутня. Як правило, при створенні образів, беруться за основу
образи вже створені (наприклад, з репозиторію), та вже на основі них методом накладання шарів створюють
інші образи, відмінні від основного (рис. 6). Такий підхід дозволяє по-перше, користуватися вже готовими
програмними рішеннями, а по-друге, створювати нове програмне забезпечення з мінімальними витратами
часу.</p>
        <p>Контейнер
Образ 3
Образ 2
Образ 1
Рис. 6. Графічне зображення шарів при контейнеризації застосунку
При роботі з програмою Docker з підтримкою Nvidia CUDA, всі команди передуються ключовим словом
nvidia-docker: nvidia-docker [КОМАНДА].</p>
        <p>Наведемо приклад створення образу для інетелектуальної системи оцінки якості стартапів:
ARG VERSION_ID
FROM ubuntu:${VERSION_ID}
LABEL "STARTUPS"
RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends \
dh-make \
fakeroot \
build-essential \
devscripts \
lsb-release &amp;&amp; \
rm -rf /var/lib/apt/lists/*
………………………………………………….</p>
        <p>COPY fuzzy_system ./ fuzzy_system
WORKDIR ./ fuzzy_system
RUN nvcc sturtups.cu
Завершальна стадія створення образу була визначена командою build:
nvidia-docker build -t startups .</p>
        <p>Команда запуску контейнеру Docker є run: nvidia-docker run [ОПЦІЇ] ОБРАЗ [КОМАНДА]
[АРГУМЕНТИ].</p>
        <p>Для запуску контейнеризованої інтелектуальної системи оцінки якості стартапів застосована наступна
команда:
nvidia-docker run --rm -ti startups
Як бачимо з наведеного вище прикладу, інтерактивно запускається контейнер з ім’ям startups, з
видаленням після закінчення роботи. Також до основних команд можна віднести наступні команди: images
(перегляд репозиторію), rmi (видалення образу), rm (видалення контейнеру), stop (зупинити роботу
контейнера), ps (відобразити список працюючих контейнерів) та ін. Повний список команд та їх опис можна
отримати в [15].</p>
        <p>Архітектура мікросервісів як основа контейнеризації інтелектуальної системи для нечіткого
виведення. Поява архітектури мікросервісів пов’язана з розв’язанням проблем супроводження та
масштабування додатків. При проектуванні монолітних програм (декомпозиція системи проводиться на рівні
класів, компонентів, просторів імен, тощо) внесення змін у будь-яку частину будь-якого елемента вимагає
перезбирання всієї системи заново, навіть у тому випадку, коли зміни не стосуються власне модульних
інтерфейсів. Використання бібліотек також не вирішує проблему, оскільки програмний модуль збирається
разом з бібліотеками, і внесення змін в бібліотеку також призводить до необхідності повторного збирання
застосунку. Масштабування ж монолітних додатків, в тому числі на основі CUDA вимагає створення нової
версії продукту.</p>
        <p>Успішно вирішує проблеми масштабування та супроводження організація архітектури програмної
системи у вигляді сукупності мікросервісів, кожен з яких реалізує роботу окремої бізнес-задачі. Мікросервіси
можуть взаємодіяти на різних машинах, різних програмно-апаратних платформах. Модифікація одного модулю
(сервісу) не потребує жодних змін інших компонентів системи, модулі можуть бути запроектовані різними
інструментальними засобами, різними мовами. Кожний сервіс може працювати окремо від інших та виконує
окрему функцію системи. Використання хмарних технологій дозволяє поставити компонент 1 раз,
завантаживши його на сервер.</p>
        <p>Як мікросервіси платформи Docker виступають контейнери. Контейнер фактично є «чорною скринькою»
з власним інтерфейсом. Узагальнюючи, мікросервісну Docker архітектуру можна вважати як таку, в якій
реалізовано патерн проектування низького рівня Фасад (Facade) [12], основна задача якого полягає в
забезпеченні єдиного інтерфейсу для підсистеми, забезпечуючи єдину вхідну точку (точку доступу до
функціоналу) та ізоляцію змін в межах підсистеми.</p>
        <p>В цілому можна стверджувати, що контейнеризація програмних систем ІНЛВ забезпечує високу ступінь
гнучкості та досить високу простоту розгортання застосунків. Архітектура на основі мікросервісів створює
можливість модифікації окремих модулів та механізмів нечіткого виведення окремо від всієї системи ІНЛВ.
Необхідно ще зазначити такий момент при використанні контейнеризації, пов’язаний з продуктивністю
контейнеризованих програм. Будь-який контейнер можна розгорнути на хмарних сервісах, що підтримують
GPU-обчислення, та отримати в розпорядження потужні графічні прискорювачі останнього покоління. Таким
чином, проектування програм для GPU на основі контейнеризації є ефективним з точки зору гнучкості
розгортання, зручності модифікації та супроводження, а також дозволяє значно підвищити прискорення
контейнерів за рахунок хмарних платформ з потужною підтримкою GPU-прискорених контейнеризованих
програм.
10.
11.
12.
13.
14.
15.
16.
10.
11.
Таким чином, розроблено програмну архітектуру для здійснення ієрархічного нечіткого логічного
виведення. Зазначена архітектура надає в межах єдиного програмного комплексу цілу низку алгоритмічних
схем паралельних обчислень для нечіткого логічного виведення на основі високопродуктивних
програмноапаратних технологій. Представлено архітектурні рішення, які застосовані в інтелектуальній програмній
системі для оцінювання привабливості стартапів, та забезпечують гнучкість та продуктивність нечіткого
виведення, що реалізовані на основі архітектурних шаблонів проектування та патернів низькорівневого
проектування. Продемонстровано методи та підходи до побудови ієрархічних систем нечіткого логічного
виведення у їх архітектурному контексті, а також контексті паралельного програмування. Представлено метод
контейнеризації застосунків для GPU для їх повторного використання та розгортання на обраній програмній
платформі високопродуктивних паралельних обчислень.
Література</p>
        <p>
          Bass L., Clements P., Kazman R. Software architecture in practice. Addison Wesley
          <xref ref-type="bibr" rid="ref11">Professional. 2012</xref>
          . 640 с.
        </p>
        <p>Єршов С.В., Пономаренко Р.М. Паралельні моделі багаторівневих нечітких систем Такагі-Сугено. Проблеми програмування.
2016.
№ 1. С. 141–149.</p>
        <p>Єршов С.В., Пономаренко Р.М. Ярусно-паралельна модель обчислень для логічного виведення у нечітких багаторівневих
системах. Комп’ютерна математика. 2016. № 1. С. 28–36.</p>
        <p>Єршов С.В., Пономаренко Р.М. Метод побудови паралельних систем нечіткого логічного виведення на основі графічних
прискорювачів. Проблеми програмування. 2017. № 4. С. 3–15.</p>
        <p>Пономаренко Р.М. Моделі паралельних ієрархічних систем для нечіткого логічного виведення. Комп’ютерна математика. 2017.
№ 2. С. 28–36.</p>
        <p>Ершов С.В. Модель интеллектуальных агентов, основанная на нечеткой логике высшего типа. Компьютерная математика.</p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          № 1. C.
          <volume>10</volume>
          -
          <fpage>16</fpage>
          . Ершов С.В.
          <article-title>Принципы построения нечетких мультиагентных систем в распределенной среде</article-title>
          .
          <source>Компьютерная математика</source>
          .
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          № 2. C.
          <volume>54</volume>
          -
          <fpage>61</fpage>
          .
          <article-title>Суперкомпьютеры ИК НАН Украины</article-title>
          . http:// /icybcluster.org.ua. Timothy G. Mattson, Beverly Sanders,
          <string-name>
            <given-names>Berna</given-names>
            <surname>Massingill</surname>
          </string-name>
          .
          <article-title>A pattern language for parallel programming</article-title>
          .
          <source>Addison-Wesley Professional,</source>
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          <year>2004</year>
          .
          <article-title>534 с. Воеводин В</article-title>
          .В., Воеводин Вл.В.
          <article-title>Параллельные вычисления</article-title>
          . СПб.:
          <string-name>
            <surname>БХВ-Петербург</surname>
          </string-name>
          ,
          <year>2002</year>
          .
          <volume>608</volume>
          с. Miner D.,
          <string-name>
            <surname>Shook</surname>
            <given-names>A. MapReduce Design</given-names>
          </string-name>
          <string-name>
            <surname>Patterns. O'Reilly Media</surname>
          </string-name>
          ,
          <year>2012</year>
          . 251 c. Гамма Э.,
          <string-name>
            <surname>Хелм</surname>
            <given-names>Р.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Джонсон</surname>
            <given-names>Р.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Влиссидес</surname>
            <given-names>Д</given-names>
          </string-name>
          .
          <article-title>Приемы объектно-ориентированного проектирования</article-title>
          .
          <source>Паттерны проектирования.</source>
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          СПб.: Питер,
          <year>2015</year>
          .
          <volume>368</volume>
          с.
          <article-title>Контейнер Docker с поддержкой GPU</article-title>
          . Nvidia. http://www.nvidia.com.ua/object/docker-container-ru.html. Docker Hub. https://hub.docker.com. Wagner B.,
          <string-name>
            <surname>Rousos</surname>
            <given-names>M. .</given-names>
          </string-name>
          <article-title>NET Microservices: Architecture for Containerized</article-title>
          .
          <source>NET Applications. Microsoft Corporation</source>
          ,
          <year>2018</year>
          . 302 c. Документація платформи Докер. https://docs.docker.com. Bass L.,
          <string-name>
            <surname>Clements</surname>
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kazman</surname>
            <given-names>R.</given-names>
          </string-name>
          (
          <year>2004</year>
          )
          <article-title>Software architecture in practice</article-title>
          .
          <source>Addison Wesley Professional</source>
          .
          <volume>452</volume>
          p. Yershov
          <string-name>
            <given-names>S.V.</given-names>
            ,
            <surname>Ponomarenko</surname>
          </string-name>
          <string-name>
            <surname>R.M.</surname>
          </string-name>
          (
          <year>2016</year>
          )
          <article-title>Parallel models multilevel fuzzy Takagi-Sugeno systems</article-title>
          .
          <source>Problems of programming. N 1.</source>
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          P.
          <fpage>141</fpage>
          -
          <lpage>149</lpage>
          . Yershov
          <string-name>
            <given-names>S.V.</given-names>
            ,
            <surname>Ponomarenko</surname>
          </string-name>
          <string-name>
            <surname>R.M.</surname>
          </string-name>
          (
          <year>2016</year>
          )
          <article-title>Tiered parallel calculating model for inference in fuzzy multilevel systems</article-title>
          .
          <source>Computer</source>
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          N 1,
          <string-name>
            <surname>K.</surname>
          </string-name>
          :
          <article-title>Institute of Cybernetics Glushkov National Academy of Sciences of Ukraine</article-title>
          . P.
          <volume>28</volume>
          -
          <fpage>36</fpage>
          . Yershov
          <string-name>
            <given-names>S.V.</given-names>
            ,
            <surname>Ponomarenko</surname>
          </string-name>
          <string-name>
            <surname>R.M.</surname>
          </string-name>
          (
          <year>2017</year>
          )
          <article-title>Method of constructing parallel fuzzy inference systems based on graphical accelerator.</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          <article-title>Problems of programming, N 4</article-title>
          . P. 3-
          <fpage>15</fpage>
          .
          <string-name>
            <surname>Ponomarenko</surname>
            <given-names>R.M.</given-names>
          </string-name>
          (
          <year>2017</year>
          )
          <article-title>Models of parallel hierarchical systems for fuzzy inference</article-title>
          .
          <source>Computer mathematics, N 2</source>
          ,
          <string-name>
            <surname>K.</surname>
          </string-name>
          : Institute of
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          <source>Cybernetics Glushkov National Academy of Sciences of Ukraine</source>
          . P.
          <volume>28</volume>
          -
          <fpage>36</fpage>
          . Yershov
          <string-name>
            <surname>S.V.</surname>
          </string-name>
          (
          <year>2012</year>
          )
          <article-title>Model of intelligent agents based on highest type fuzzy logic</article-title>
          .
          <source>Computer mathematics, N 1</source>
          ,
          <string-name>
            <surname>K.</surname>
          </string-name>
          : Institute of
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          <source>Cybernetics Glushkov National Academy of Sciences of Ukraine</source>
          . P.
          <volume>10</volume>
          -
          <fpage>16</fpage>
          . Yershov
          <string-name>
            <surname>S.V.</surname>
          </string-name>
          (
          <year>2009</year>
          )
          <article-title>Principles of construction of fuzzy multi-agent systems in a distributed environment</article-title>
          .
          <source>Computer mathematics, N 2</source>
          ,
          <string-name>
            <surname>K.</surname>
          </string-name>
          :
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          <source>Institute of Cybernetics Glushkov National Academy of Sciences of Ukraine</source>
          . P.
          <volume>54</volume>
          -
          <fpage>61</fpage>
          .
          <article-title>Supercomputers of IC NAS of Ukraine</article-title>
          . http://icybcluster.org.ua. Timothy G. Mattson, Beverly Sanders, Berna Massingill. (
          <year>2004</year>
          )
          <article-title>A pattern language for parallel programming</article-title>
          .
          <source>Addison-Wesley</source>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          <string-name>
            <surname>Professional. 534 p. Voevodin V.V.</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Voevodin</given-names>
            <surname>Vl</surname>
          </string-name>
          .V.
          <article-title>(2002) Parallel computing</article-title>
          .
          <source>SPb.: BHV-Petersburg</source>
          .
          <volume>608</volume>
          p. Miner
          <string-name>
            <given-names>D.</given-names>
            ,
            <surname>Shook</surname>
          </string-name>
          <string-name>
            <surname>A.</surname>
          </string-name>
          (
          <year>2012</year>
          )
          <string-name>
            <given-names>MapReduce</given-names>
            <surname>Design Patterns. O'Reilly Media</surname>
          </string-name>
          .
          <volume>251</volume>
          p.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          <string-name>
            <given-names>Gamma E.</given-names>
            ,
            <surname>Helm</surname>
          </string-name>
          <string-name>
            <given-names>R.</given-names>
            , Johnson R.,
            <surname>Vlissides</surname>
          </string-name>
          <string-name>
            <surname>J</surname>
          </string-name>
          . (
          <year>2015</year>
          )
          <article-title>Methods of object-oriented design</article-title>
          .
          <source>Design patterns</source>
          . - SPb.: Peter. 368 p.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          <string-name>
            <surname>Wagner</surname>
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rousos</surname>
            <given-names>M.</given-names>
          </string-name>
          (
          <year>2018</year>
          ) .
          <article-title>NET Microservices: Architecture for Containerized</article-title>
          .
          <source>NET Applications. Microsoft Corporation</source>
          .
          <volume>302</volume>
          p.
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          http://orcid.org/0000-0002-
          <fpage>9895</fpage>
          -777X
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>http://orcid.org/0000-0001-9681-2297</mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>