ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
62
Если этот код откомпилировать и запустить, например, указав MPI создать 10
процессов:
mpirun –np 10 a.out
то все 10 процессов попытаются открыть файл input.txt; у тех из них, что оказались
на одном компьютере с нулевым (главным), это, возможно, получится, остальные же
завершатся с сообщением об ошибке. Еще опаснее открывать файл для записи.
Подобных ошибок можно избежать, если следовать следующим правилам:
•
все операции ввода-вывода должны выполняться после вызовов MPI_Init и
MPI_Comm_rank;
•
все операции ввода-вывода должен совершать
только
нулевой процесс;
•
захват и освобождение соответствующих ресурсов также должен совер-
шать
только
нулевой процесс.
Правильный вариант выглядит следующим образом:
#include <stdlib.h>
#include <mpi.h>
FILE *input;
int rank;
int main(int argc, char *argv[])
{
MPI_Init(&argc, &argv);
MPI_Comm_rank(&rank, MPI_COMM_WORLD);
if(rank == 0)
{
input = fopen(“input.txt”, “r”);
if( !input )
{
printf(“Error opening file.\n”);
exit(1);
}
. . .
fclose(input);
}
. . .
MPI_Finalize();
return 0;}
Коммуникаторы и группы процессов
Область взаимодействия
Область взаимодействия
(область связи)
определяет группу процессов. Все
процессы, принадлежащие одной области взаимодействия, могут обмениваться со-
общениями. Описывает это множество процессов специальная информационная
структура, которая называется
коммуникатором.