MPI+T++ Hybrid Programming for T-system with Open Architecture

Research article
DOI:
https://doi.org/10.23670/IRJ.2024.139.74
Issue: № 1 (139), 2024
Suggested:
23.11.2023
Accepted:
25.12.2023
Published:
24.01.2024
99
1
XML
PDF

Abstract

Nowadays, there are many high-performance computing systems consisting of nodes with multicore processors and accelerators from different hardware manufacturers. A convenient programming model in such systems is the MPI+X model. Hybrid MPI+X programmes often have higher performance compared to programmes on "pure" MPI. Scientific results obtained while developing such programs are used for creating new versions of MPI (Message Passing Interface) standard. The hybrid method of parallel programming involves using the shared memory model inside a node and MPI message passing model for data exchange between nodes. Examples of hybrid models: MPI+OpenMP, MPI+Posix Threads, MPI+CUDA, MPI+T++ and others. Programming in mixed mode gives a developer an opportunity to achieve higher performance and scalability of an application. In some cases, mixed code can be executed slower than code written in "pure" MPI. This article describes some aspects associated with the hybrid MPI+T++ programming model in the OpenTS environment. T-system (OpenTS) is a system for parallel programming supporting dynamically loaded libraries for communication layer. The OpenTS system implements C++ language for parallel calculations, which is an extension of C++ programming language. C++ syntax differs from C++ syntax by adding several keywords to it. The work presents the results of performance tests of MPI+T++ applications from Mantevo package (CoMD, HPCCG, MiniAero, phdMesh) and examples from LAMMPS package developed in OpenTS environment. The Mantevo package includes several parallel applications in which algorithms for solving some partial differential equations are implemented. An estimation of efficiency of such implementation in comparison with original MPI-versions of applications is presented. The article gives a simple example of a hybrid MPI+T++ application in T++ language.

1. Введение

Интерфейс передачи сообщений MPI (Message Passing Interface) является стандартом для межузловой связи. Он определяет семантику и синтаксис коммуникационных функций. Он был разработан научным сообществом и промышленностью для стандартизации программирования передачи сообщений. На сегодняшний день есть две основные реализации MPI: OpenMPI

и MPICH
. Существует также несколько других реализаций MPI
.

Архитектуры узлов HPC (High-Performance Computing) имеют тенденцию к увеличению количества ядер в одном процессоре, а также используют ускорители, например, графические процессоры. Чтобы лучше использовать общие ресурсы внутри узла и программировать ускорители, пользователи обратились к гибридному программированию, которое сочетает в себе MPI с моделями параллельного программирования на уровне узла.

Параллельные многопоточные программы становятся все более распространенными. Параллельные вычисления становятся все более популярными, и создание эффективных моделей параллельного программирования является приоритетной задачей. Модели с общей памятью и распределенной памятью – это две хорошо известные классификации модели параллельной аппаратной архитектуры. Использование ресурсов всех ядер и снижение временных затрат является основной целью модели многоядерного программирования

.

Гибридное параллельное программирование в модели MPI+X стало нормой в высокопроизводительных вычислениях

. Этот подход к параллельному программированию отражает иерархию параллелизма в современных высокопроизводительных системах, в которых высокоскоростное соединение объединяет множество узлов.

Последние тенденции в области высокопроизводительных вычислений (HPC) – использовать ускорители (графические процессоры), программируемые пользователем вентильные матрицы (FPGA), сопроцессоры, ‑‑ привели к значительной неоднородности в вычислительных подсистемах и подсистемах памяти.

Разработчики приложений обычно используют модель интерфейса передачи сообщений MPI на вычислительных узлах кластера, и внутриузловую модель, такую как OpenMP или библиотеку для ускорителя (например: CUDA, OpenACC).

Гибридный метод параллельного программирования состоит в использовании модели общей памяти внутри узла и модели передачи сообщений для обмена данными между узлами

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

Т‑система (OpenTS) является средой программирования для разработки высокопроизводительных и хорошо масштабируемых приложений

. Она поддерживает язык T++, который дополняет стандартный язык C++ включением в него нескольких ключевых слов.

Ключевые слова необходимы для определения T‑переменных и T‑функций в теле T-программы, которая будет выполняться параллельно на вычислительной установке или суперкомпьютере.

Динамическая библиотека OpenTS DMPI является неотъемлемой частью T-системы.

T‑система является самодостаточной системой в том смысле, что программисту нет необходимости использовать в своей программе MPI‑вызовы. Однако, если есть необходимость использовать вызовы MPI, например, для достижения более высокой производительности программы, то это можно делать.

Гибридное программирование MPI+T+ в среде OpenTS предполагает, что основная часть кода реализуется на языке T++, при этом в теле T‑программы используется библиотека MPI.

Цель статьи – познакомить читателя с приложениями MPI+T++, которые занимают свое место среди гибридных приложений. В статье рассматривается простой пример гибридного MPI+T++ приложения на языке T++. Приводятся результаты тестирования четырех MPI+T++ реализаций приложений из пакета Mantevo и четырех примеров из пакета LAMMPS в сравнении с их оригинальными MPI‑версиями.

Испытание происходило в несколько этапов, на каждом этапе определялось среднее значение производительности приложения.

2. Простой пример гибридного MPI+T++ приложения на языке программирования T++

Рассмотрим простой пример гибридного MPI+T++ приложения на языке T++.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

#define USRTAG 1024

#define MSGSIZE 128

 

static int root_rank = 0;

static int worker_rank = 1;

 

tfun int tworker() {

  printf("I am node %d of %d.\n", ts::myRank, ts::realsuperSize);

  tval int tx;

  char msg[MSGSIZE];

  MPI_Status stat;

  memset(msg, '\0', sizeof(msg));

  MPI_Recv(msg, sizeof(msg) - 1, MPI_BYTE, root_rank, USRTAG, MPI_COMM_WORLD, &stat);

  printf("node=%d, msg=\"%s\"\n", ts::myRank, msg);

  tx = 1;

  return (int) tx;

}

 

tfun int main(int argc, char *argv[]) {

  static char *MSG = (char *) "This is a message from the root T-process!";

  if (ts::realsuperSize != 2) {

      printf("\n\nSorry, this program works correctly only for the two ranks!\n\n");

      exit(0);

  } 

  printf("I am node %d of %d.\n", ts::myRank, ts::realsuperSize);

  tval int tv;

  tct(atRank(worker_rank % ts::realsuperSize));

  tv = tworker();

  MPI_Send(MSG, strlen(MSG), MPI_BYTE, worker_rank, USRTAG, MPI_COMM_WORLD);

  (int) tv;

  return 0;

}

В приведенном примере создаются два процесса на двух узлах (рангах) вычислительной установки: первый – основной процесс – создается на нулевом узле, а второй ‑ рабочий процесс – на первом узле. Основной процесс представлен в виде Т-функции main(), а рабочий процесс – в виде Т-функции tworker(). Т-функция main() создает рабочий процесс на первом ранге вычислительной установки с помощью операторов:

tval int tv;

tct(atRank(worker_rank % ts::realsuperSize));

tv = tworker();

В теле T‑программы определяется T‑переменная tv. Выход Т-функции tworker() присваивается Т-переменной tv. Далее, основной процесс посылает данные ‑‑ сообщение: "This is a message from the root T-process!"‑‑ рабочему процессу с помощью вызова MPI-функции MPI_Send(). После этого основной процесс ждет завершения работы рабочего процесса (готовности Т-переменной tv) с помощью оператора:

(int) tv;

В теле Т-функции tworker() выполняется вызов MPI-функции MPI_Recv() для приема сообщения от основного процесса. После этого рабочий процесс производит печать полученного сообщения и завершает свою работу.

3. Приложение CoMD

CoMD – простое приложение молекулярной динамики проекта Mantevo. Имитирует реализацию SPaSM (Scalable Parallel Short-Range Molecular Dynamics).

Реализация приложения CoMD (и других приложений) на MPI+T++ происходила следующим образом. Функцию С++ main пакета CoMD мы переименовали в worker. В пакет мы добавили файл на языке программирования Т++, который параллельно запускает столько задач, сколько в текущей вычислительной системе вычислительных узлов, по одной задаче на каждом вычислительном узле. Каждая из этих задач вызывает функцию worker. Обеспечивается передача параметров командной строки в каждый из экземпляров функции worker. Все вхождения файла <mpi.h> заменяются на заголовочный файл, необходимый для корректной работы Т‑системы. Происходит сборка исполняемого файла с использованием компилятора Т++.

Были проведены сравнительные испытания приложения CoMD с использованием OpenMPI и CoMD с использованием MPI+T++. Результаты испытания представлены на рисунке 1.
На рисунке представлены два графика: среднее время выполнения CoMD с использованием OpenMPI и среднее время выполнения CoMD с использованием MPI+T++

Рисунок 1 - На рисунке представлены два графика: среднее время выполнения CoMD с использованием OpenMPI и среднее время выполнения CoMD с использованием MPI+T++

Отклонение среднего времени работы приложения составило -3.5%, то есть производительность приложения CoMD MPI+T++ приблизительно совпадает с производительностью приложения CoMD OpenMPI.

4. Приложение HPCCG

Приложение HPCCG из проекта Mantevo является решателем линейной системы уравнений с частными производными на области, которая имеет форму пучка лучей (beam shaped). Для решения системы уравнений используется метод сопряжённых градиентов с предобусловливанием.

Были проведены сравнительные испытания оригинального MPI‑приложения HPCCG и приложения HPCCG, реализованного на платформе MPI+T++. Для проведения испытаний использовался OpenMPI. Результаты испытания представлены на рисунке 2.
На рисунке представлены два графика: средняя производительность HPCCG с использованием OpenMPI и средняя производительность HPCCG с использованием MPI+T++

Рисунок 2 - На рисунке представлены два графика: средняя производительность HPCCG с использованием OpenMPI и средняя производительность HPCCG с использованием MPI+T++

Отклонение среднего значения производительности приложения составило 0.3%, то есть производительность приложения HPCCG MPI+T++ приблизительно совпадает с производительностью приложения HPCCG OpenMPI. Производительность приложения HPCCG определялась исходя из статистики, выдаваемой этим приложением

5. Приложение MiniAero

В приложении MiniAero из проекта Mantevo строится решение уравнения Навье-Стокса для сжимаемой жидкости методом Рунге-Кутта четвертого порядка.

Было проведено сравнительное тестирование приложений MiniAero OpenMPI и MiniAero MPI+T++. Испытывался один из тестов miniAero FlatPlate_Parallel на 8 процессорах. Проводилось 10 испытаний. Отклонение среднего значения производительности приложения составило 0.1%., то есть производительность приложения miniAero MPI+T++ приблизительно совпадает с производительностью приложения miniAero OpenMPI.

6. Приложение phdMesh

Пакет phdMesh проекта Mantevo поддерживает параллельные гетерогенные вычисления с использованием динамической неструктурированной сетки.

Было проведено сравнительное тестирование приложений phdMesh OpenMPI и phdMeshMPI+T++ на 8 процессорах. Отклонение среднего значения времени работы приложения составило 1%., то есть производительность приложения phdMeshMPI+T++ приблизительно совпадает с производительностью приложения phdMesh OpenMPI.

7. Модель погруженного иона

Пример eim LAMMPS. Модель погруженного иона для хлористого натрия

Рисунок 3 - Пример eim LAMMPS. Модель погруженного иона для хлористого натрия

Для метода погруженного иона (Embedded Ion Method)
энергия E системы атомов задается формулой

img,

где N – количество атомов, ϕij – функция парного потенциала, rij – расстояние между i-м и j-м атомами, i1, ..., i– соседние атомы атома i, E– энергия погружения атома i, q– заряд, σi – электрический потенциал.

img,

img,

img,

Где ηji – парная функция, описывающая поток электронов от атома i к атому j,

Ψij – парная функция, связанная с кулоновским взаимодействием.

В пакете LAMMPS

модель применялась к системе из 1000 молекул хлористого натрия (рисунок 3).

Было проведено сравнительное тестирование примера eim пакета LAMMPS на платформах OpenMPI и MPI+T++. Отклонение среднего значения времени работы приложения составило 0.2%., то есть производительность приложения eim LAMMPS MPI+T++ приблизительно совпадает с производительностью приложения eim LAMMPS OpenMPI.

8. Связанные наностержни (tethered nanorods)

В пакете LAMMPS
представлена симуляция модели наностержней со связями (tethered nanorods
). В модели описывается композит длинноцепочного полимера и наностержней. Длинноцепочный полимер в композите играет роль лиганда. Длинноцепочный полимер моделируется с использованием потенциала FENE (Finitely Extensible Nonlinear Elastic model). FENE означает конечно растяжимую нелинейную упругую модель длинноцепочечного полимера. Он упрощает цепочку мономеров, соединяя последовательность бусинок с нелинейными пружинами. На рисунке 4 представлен снимок одного из моментов симуляции модели.
Пример rigid LAMMPS. Наностержни со связями (tethered nanorods)

Рисунок 4 - Пример rigid LAMMPS. Наностержни со связями (tethered nanorods)

Было проведено сравнительное тестирование примера rigid пакета LAMMPS на платформах OpenMPI и MPI+T++. Отклонение среднего значения времени работы приложения составило 3.7%., то есть производительность приложения rigid LAMMPS MPI+T++ приблизительно совпадает с производительностью приложения rigid LAMMPS OpenMPI.

9. Симуляция деформации сдвига металла

На рисунке 5 отображается симуляция деформации металла в пакете LAMMPS. Нижняя часть куска металла неподвижна, верхняя часть сдвигается вправо. На рисунке 6 иллюстрируется симуляция деформации куска металла, имеющего внутри пустоту (пузырь). При сдвиге нижняя часть образца остается неподвижной, верхняя часть сдвигается вправо.
Пример shear LAMMPS. Симуляция деформации сдвига куска металла

Рисунок 5 - Пример shear LAMMPS. Симуляция деформации сдвига куска металла

Пример shear LAMMPS. Симуляция деформации сдвига куска металла с пузырем внутри

Рисунок 6 - Пример shear LAMMPS. Симуляция деформации сдвига куска металла с пузырем внутри

Было проведено сравнительное тестирование примера shear пакета LAMMPS на платформах OpenMPI и MPI+T++. Отклонение среднего значения времени работы приложения составило 1.4%., то есть производительность приложения shear LAMMPS MPI+T++ приблизительно совпадает с производительностью приложения shear LAMMPS OpenMPI.

10. Динамика многочастичных взаимодействий

Динамика многочастичных взаимодействий (Multi-particle collision dynamics), также известная как стохастическая динамика вращения (Stochastic rotation dynamics), представляет собой метод мезомасштабного моделирования сложных жидкостей на основе частиц, который полностью включает в себя тепловые флуктуации и гидродинамические взаимодействия. Связь внедренных частиц с крупнозернистым растворителем достигается с помощью молекулярной динамики. Модель может использоваться для изучения поведения микроэмульсий или растворенных гибкоцепных полимеров.

В пакете LAMMPS

растворитель моделируется в виде набора N частиц массы m с непрерывными координатами ri и скоростями vi. Алгоритм симуляции состоит из шагов моделирования движения и столкновения частиц. На шаге моделирования движения координаты ri всех частиц растворителя в момент времени t одновременно обновляются в соответствии с

img.

При моделировании взаимодействий частицы группируются по ячейкам, и они взаимодействуют только с частицами из той же ячейки, обычно для этого строится решетка. Как правило, количество частиц в каждой ячейке – от 3 до 20. Скорости частиц в каждой ячейке обновляются в соответствии с правилом столкновения

img,

Где u – средняя скорость всех частиц в ячейке, R – матрица вращения. В трехмерном пространстве вращение осуществляется на угол α вокруг случайной оси вращения. Одно и то же вращение применяется ко всем частицам в пределах данной ячейки. Рисунок 7 иллюстрирует модель многочастичных взаимодействий.
Пример LAMMPS srd. Большие частицы находятся в крупнозернистом растворителе

Рисунок 7 - Пример LAMMPS srd. Большие частицы находятся в крупнозернистом растворителе

Примечание: модель динамики многочастичных взаимодействий

Было проведено сравнительное тестирование примера srd пакета LAMMPS на платформах OpenMPI и MPI+T++. Отклонение среднего значения времени работы приложения составило 2.2%., то есть производительность приложения srd LAMMPS MPI+T++ приблизительно совпадает с производительностью приложения srd LAMMPS OpenMPI.

11. Заключение

Приложения MPI+X занимают важное место среди приложений для высокопроизводительных вычислений. Приложения MPI+T++ – это приложения, написанные на языке для параллельных вычислений T++ с добавлением вызовов функций MPI. В статье приводится пример простого приложения MPI+T++ на языке программирования T++ и описываются результаты тестирования производительности восьми приложений MPI+T++. По результатам тестирования можно сделать вывод, что производительность MPI+T++ реализаций приложений из пакета Mantevo незначительно отличается от производительности соответствующих OpenMPI реализаций.

Article metrics

Views:99
Downloads:1
Views
Total:
Views:99