ТЕХНОЛОГИЯ ФРАГМЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

Аннотация: Для моделирования с высокой точностью необходимы огромные вычислительные ресурсы, поэтому для большинства задач разрабатываются параллельные программы, позволяющие выполнять моделирование на суперкомпьютерах. С повсеместным распространением многоядерных процессоров задача разработки параллельной программы ещё более усложняется, поскольку эффективно распределить доступные ресурсы между крупными взаимодействующими последовательными процессами затруднительно, поскольку программа должна обладать рядом динамических свойств, которые существующими системами программирования в полной мере не обеспечиваются. Одним из новых подходов, альтернативных программированию на основе параллельно-последовательной модели вычислений, является фрагментированное программирование. В данной статье производится сравнительный анализ параллельного программирования и фрагментированного программирования на примере  СЛАУ.

Ключевые слова: фрагментированное программирование, параллельное программирование, СЛАУ, LuNA, MPI.

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

Под параллельной программой в рамках MPI понимается множество одновременно выполняемых процессов. Все процессы порождаются один раз, образуя параллельную часть программы. Каждый процесс работает в своем адресном пространстве, никаких общих переменных или данных в MPI нет. Процессы могут выполняться на разных процессорах, но на одном процессоре могут располагаться и несколько процессов (в этом случае их исполнение осуществляется в режиме разделения времени). В предельном случае для выполнения параллельной программы может использоваться один процессор – как правило, такой способ применяется для начальной проверки правильности параллельной программы.

Интерфейс MPI  поддерживает создание параллельных программ в стиле MIMD (Multiple Instruction Multiple Data), что подразумевает объединение процессов с различными исходными текстами. Однако писать и отлаживать такие программы очень сложно, поэтому на практике программисты гораздо чаще используют SPMD-моделъ (Single Program Multiple Data) параллельного программирования, в рамках которой для всех параллельных процессов используется один и тот же код. В настоящее время все больше и больше реализаций MPI поддерживают работу с нитями

Каждый процесс параллельной программы порождается на основе копии одного и того же программного кода (модель SPMP - Single Program Multiple Processes). Данный программный код, представленный в виде исполняемой программы, должен быть доступен в момент запуска параллельной программы на всех используемых процессорах. Исходный программный код для исполняемой программы разрабатывается на алгоритмических языках C или Fortran с использованием той или иной реализации библиотеки MPI.

Количество процессов и число используемых процессоров определяется в момент запуска параллельной программы средствами среды исполнения MPI-программ и в ходе вычислений меняться не может (в стандарте MPI-2 предусматривается возможность динамического изменения количества процессов). Все процессы программы последовательно перенумерованы от 0 до p-1, где p есть общее количество процессов. Номер процесса именуется рангом процесса.

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

Это позволяет загружать ту или иную подзадачу в зависимости от “номера” процессора. При этом исходная задача разбивается на подзадачи (декомпозиция). Обычная техника состоит в следующем: каждая из подзадач оформляется в виде отдельной структурной единицы (функции, модуля), на всех процессорах запускается одна и та же программа “загрузчик”, которая, в зависимости от “номера” процессора загружает ту или иную подзадачу.

Шаги разработки фрагментированной программы. Фрагментированная программа разрабатывается в несколько последовательных этапов.