Приветствую всех в третьей статье посвященной параллельному программированию с помощью библиотеки MPICH. В прошлых сериях мы научились устанавливать MPI в Linux Ubuntu и заставили Eclipse понимать код библиотеки. Наконец пришло время взяться за программирование. А какую программу должен написать каждый уважающий себя программист? Правильно, сегодня мы напишем «Hello World» на MPI, и заодно глянем на самые базовые функции библиотеки. Поехали!
Основные функции MPI
Я сейчас говорю о тех, которые помогут нам грамотно идентифицировать каждый процесс, чтобы управлять общей логикой приложения. Реализовано это следующим образом: все процессы делятся на группы, называемые коммуникаторами, при этом один процесс может находиться сразу в нескольких коммуникаторах. По умолчанию все процессы попадают в коммуникатор MPI_COMM_WORLD. Каждый процесс имеет порядковый номер в коммуникаторе, называемый рангом. Как правило, процесс с рангом 0 назначается главным, он рулит бизнес логикой приложения и раздает команды другим процессам, еще он может отвечать за вывод в консоль, если вывод предусмотрен.
Но прежде чем начать рулить процессами, нужно их инициализировать с помощью функции MPI_Init(int *argc, char ***argv), которая принимает аргументы командной строки и раздает их процессам. А после завершения грамотно оборвать все связи и убить процессы функцией MPI_Finalize().
Перечень основных функций MPI
MPI_Initi(int *argc, char ***argv) — как уже было сказано, инициализирует все процессы и раздает им аргументы командной строки. По умолчанию, все вновь созданные процессы принадлежат стандартному коммуникатору MPI_COMM_WORLD;
MPI_Finalize() — обрывает связи и убивает процессы;
MPI_Comm_size(MPI_Comm comm, int* size) — Функция запишет в переменную size количество процессов в коммуникаторе comm. Для того, чтобы узнать общее число процессов следует первым аргументом передать стандартный коммуникатор MPI_COMM_WORLD;
MPI_Comm_rank(MPI_Comm comm, int* rank) — Функция запишет в переменную rank ранг процесса в коммуникаторе comm. Это и есть способ идентифицировать процесс для того, чтобы отдать ему какую либо логику. Разделение полномочий между процессами осуществляется с помощью условных конструкций, например, if (rank == 0) { … } или switch(rank) { … }.
Простейшая программа с использованием библиотеки MPI
Этих функций нам уже вполне достаточно для того, чтобы написать «Hello World» на MPI. Пусть каждый процесс поздоровается с миром от своего имени, а главный, нулевой процесс в свою очередь расскажет миру о том, сколько процессов у него в подчинении(считая себя, конечно же, контроль над собой терять нельзя).
#include "mpi.h" int main(int argc, char **argv) { int rank, size; MPI_Init(&argc, &argv); //Количество процессов в этом коммуникаторе MPI_Comm_size(MPI_COMM_WORLD, &size); //Ранг процесса MPI_Comm_rank(MPI_COMM_WORLD, &rank); if(rank == 0) { printf("Hello world, I<code>m main process! There are %d processes in my comm.\n", size); } else { printf("Hello world! I</code>m %d process in comm.\n", rank); } MPI_Finalize(); return 0; }
Заключение
Нехитрое дело сделано, в следующей серии будет обмен сообщениями между процессами и какое нибудь задание поинтереснее, но начинать всегда нужно с «Hello world»! А на сегодня у меня все, спасибо за внимание!
Подписывайтесь на рассылку чтобы не пропустить продолжение.