ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
61
. . .
if(rank == B)
{
. . .
for(i=0; i < n; i++)
{
MPI_Recv(matr[i], m, MPI_DOUBLE, A, 0, MPI_COMM_WORLD, &st);
}
}
. . .
Естественно, если мы сможем свести пересылку матрицы к одному вызову
MPI_Send/MPI_Recv, то это будет работать еще быстрее. Однако, скорее всего, по-
добные усилия не будут оправданы, так как в случае матриц большой размерности
накладные расходы по выделению/освобождению временного буфера размером с
матрицу также будут очень велики.
При разработке параллельных алгоритмов стоит следовать «золотому
правилу»:
Чем меньше различные процессы знают друг о друге, тем лучше.
Стандартные ошибки и общие замечания
Множество ошибок происходит от недостаточного понимания механизма ра-
боты MPI. Среда MPI запускает практически одновременно столько процессов,
сколько укажет программист. Некоторые из них могут выполняться физически на
одном компьютере (хосте). Эти процессы ничего не знают друг о друге до вызова
MPI_Init() и MPI_Comm_rank(). В случае, если два или более процессов пытаются
захватить один ресурс (например, файл), поведение программы становится непред-
сказуемым. Рассмотрим пример:
#include <stdlib.h>
#include <mpi.h>
FILE *input;
int main(int argc, char *argv[])
{
input = fopen(“input.txt”, “r”);
if( !input )
{
printf(“Error opening file.\n”);
exit(1);
}
MPI_Init(&argc, &argv);
. . .
MPI_Finalize();
return 0;
}
1...,53,54,55,56,57,58,59,60,61,62 64,65,66,67,68,69,70,71,72,73,...180