Структура MPI-программы

 

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

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

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

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

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

Рассмотрим минимально необходимый набор функций MPI, достаточный для разработки сравнительно простых параллельных программ.

Ниже приводится параллельный вариант примера широко используемой демонстрационной программы «Hello world». В дополнение к обычному сообщению каждый процесс будет печатать свой номер и общее количество процессов.

#include <stdio.h>
#include "mpi.h"

int main(int argc, char* argv[])
{
int procs_rank, procs_count; // Определяем переменные

MPI_Init(&argc, &argv); // Инициализация MPI-библиотеки

MPI_Comm_size(MPI_COMM_WORLD, &procs_count); // Определяем количество процессов

MPI_Comm_rank(MPI_COMM_WORLD, &procs_rank); // Узнаем ранг процесса

printf ("\n Hello, World from process %3d of %3d", procs_rank, procs_count);

MPI_Finalize(); // Закрываем MPI-библиотеку


return 0;
}

 

Сначала подключается заголовочный файл библиотеки "mpi.h", содержащий определения функций, типов и констант MPI. Этот файл необходимо включать во все модули, использующие MPI.

Первым в каждой MPI программе должен быть вызов MPI_Init, который должен присутствовать в каждой программе MPI и предшествует всем другим вызовам MPI. Он инициализирует «среду» (environment) системы MPI. Функция MPI_Init за время выполнения программы должна вызываться только один раз. Ее аргументами являются количество аргументов командной строки процесса и собственно командная строка процесса.

 

int MPI_Init (int* argc, char*** argv)

 

  • argc – указатель на количество параметров командной строки;
  • argv – параметры командной строки.

 

Функция MPI_Comm_size возвращает в procs_count число запущенных для данной программы процессов. Каким способом пользователь запускает эти процессы – зависит от реализации, но любая программа может определить число запущенных процессов с помощью данного вызова. Значение procs_count – это, по сути, размер группы, связанной с коммуникатором MPI_COMM_WORLD. Процессы каждой группы пронумерованы целыми числами, начиная с 0, которые называются рангами (rank). Каждый процесс определяет свой номер в группе, связанной с данным коммуникатором, с помощью MPI_Comm_rank. Таким образом, каждый процесс получает одно и то же число в procs_count, но разные числа в rank. Каждый процесс печатает свой ранг и общее количество запущенных процессов, затем все процессы выполняют MPI_Finalize. Эта функция должна быть выполнена каждым процессом MPI и приводит к ликвидации «среды» MPI. Никакие вызовы MPI не могут быть осуществлены процессом после вызова MPI_Finalize (повторный MPI_Init также невозможен).

Функция определения числа процессов в области связи MPI_Comm_size:

 

int MPI_Comm_size(MPI_Comm comm, int *size)

 

где comm – коммуникатор, size – число процессов в области связи коммуникатора comm.

 

Функция определения номера процесса MPI_Comm_rank:

 

int MPI_Comm_rank(MPI_Comm comm, int *rank)

 

где comm – коммуникатор, rank – номер процесса, вызвавщего функцию.

 

Функция завершения MPI программ MPI_Finalize не имеет параметров:

 








Дата добавления: 2016-02-02; просмотров: 1694;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.