Параллельная программа - это множество параллельных процессов, синхронизирующих свою работу и обменивающихся данными посредством передачи сообщений. Средства языка mpC позволяют программисту специфицировать требуемое для параллельного решения задачи число процессов и распределить вычисления между этими процессами. Этих же средств, в принципе, достаточно для описания синхронизации работы процессов при выполнении параллельной программы.
Основным механизмом синхронизации параллельных процессов, взаимодействующих с помощью передачи сообщений, является барьер. Барьер - это точка параллельной программы, в которой процесс ждёт все остальные процессы, с которыми он синхронизирует свою работу. Лишь только после того, как все процессы, синхронизирующие свою работу, достигли барьера, они продолжают дальнейшие вычисления. Если по какой-то причине хотя бы один из этих процессов не достигает барьера, то остальные процессы "зависают" в этой точке программы, а программа в целом уже никогда не сможет завершиться нормально.
Предположим, что нам нужно построить программу таким образом, чтобы сообщения от виртуальных процессоров с нечётными координатами выводились на терминал пользователя только после того, как будут выведены сообщения от всех виртуальных процессоров с чётными координатами. Язык mpC предоставляет для решения этой задачи библиотечную функцию MPC_Global_barrier(void), которая синхронизирует работу всех процессов параллельной программы. Её описание находится в заголовке mpc.h и выглядит следующим образом:
int [*]MPC_Global_barrier(void);
Рассматриваемая далее программа демонстрирует использование этой функции для разделения барьером двух параллельных операторов. Заметим, что в этой программе, на барьере ждут не только процессы, реализующие сеть mynet, но и свободные процессы. Это, естественно, приводит к большему числу сообщений, пересылаемых при выполнении барьера, и, следовательно, к определённому замедлению программы.
#include <mpc.h>
#define N 5
int [*]main()
{
net SimpleNet(N) mynet;
int [mynet]my_coordinate;
my_coordinate = I coordof mynet;
if(my_coordinate%2==0)
[mynet]MPC_Printf("Hello, even world!\n");
MPC_Global_barrier();
if(my_coordinate%2==1)
[mynet]MPC_Printf("Hello, odd world!\n");
}
Литература
1. Вендров А.М. CASE - технологии. Современные методы и средства
проектирования информационных систем. - http://www.citforum.ru
2. Липаев В.В. Качество программного обеспечения. - М.: Финансы и
статистика, 2005. - 263 с.
3. Кнут Дональд Э. Искусство программирования. Т. 3. Сортировка и
поиск: Уч. пос. - М.: Издательский дом «Вильямс», 2005.-832 с.
4. Шилдт Г. Самоучитель С++ - СПб:BHV-Санкт-Петербург, 1998. - 512 с.
5. Ластовецкий А.Л. Программирование параллельных вычислений на
неоднородных сетях компьютеров на языке mpC. - http://parallel.ru