![Шесть причин, почему бизнесу нужно свое мини-приложение в Телеграме](/upload/resize_cache/iblock/d0e/kh1yp9t0dsxr8xp682zjmx3ug23vl7dj/390_260_1619711fa078991f0a23d032687646b21/Frame-1948756451.png)
Когда в Engitex появилась утилита JMP, основной идеей было облегчить создание SPMD (single program, multiple data) и MPMD (multiple programs, multiple data) параллельных программ на Яве. Также было важно иметь возможность явно задавать политику распределения нагрузки как в рамках одной машины («ноды») в кластере, так и между несколькими машинами.
Как будет показано ниже, JMP (Java MultiProcessing) по сути включает в себя несколько утилит для C++, таких как OpenMP и MPI.
Это лишь некоторые из "фич", выигрышно отличающие Яву от компилируемого в машинный код C++ и некоторых других языков:
Все это подсказывает, что было бы актуально иметь утилиты для создания распределенных приложений и распределения нагрузки на Яве.
Хотя ресурсоемкие программы для расчетов, в том числе с параллелизмом на кластере или суперкомпьютере, традиционно создаются на C++, готовой утилиты для создания распределенной архитектуры на C++ нет. Однако современный софт (в том числе enterprise, например, для оптимизации производства) все же больше про SPMD/MPMD параллелизм между несколькими машинами, т.е. "P процессов на Q нодах".
OpenMP - одна из стандартных утилит для компиляции программ с параллелизмом на локальной машине по типу "N нитей на 1 ноде". Ключевая функция OpenMP - простое распараллеливание цикла for. Распределение нагрузки во время исполнения программы происходит по "усмотрению" ОС.
Стандарт MPI облегчает создание распределенных между нодами программ. Библиотеки Microsoft MPI и OpenMPI - распространенные реализации стандарта.
JMP использует доступный в Яве RMI для общения между как локальными, так и удаленными (на других нодах) Ява-машинами. По сути JMP содержит функционал OpenMP для распараллеливания на 1 ноде (локально) и функционал MPI для распараллеливания между нодами, а также позволяет явно задавать политику распределения нагрузки. Такая утилита по типу "все включено" особенно удобна для реализации микросервисных и распределенных архитектур.
JMP объединяет по сути сразу несколько инструментов, доступных на C++
Приведем простой пример запуска процесса на удаленной ноде с помощью JMP. Положим, хотим посчитать квадратный корень с помощью некоторого кастомного численного алгоритма. JMP мог бы использовать заданную политику распределения нагрузки на удаленной ноде, однако мы здесь явно зададим привязку к 1/4 CPU:
// we want to run on remoteIP on CPU 1/4
ProcessInvocator pi = new ProcessInvocator(new customSqrtCalc(2, 0.000000001),
remoteIP, new char[]{'1', '0', '0', '0'});
// start remote calculation asynchronously
pi.start();
// the code gets here immediately, can do other stuff
...
...
...
...
// the code gets here immediately, can do other stuff
...
...
...
...
...
...
...
...