ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
60
в себе много накладных расходов. Если оценивать стоимость одной операции сло-
жения в 1, то вызов одной блокирующей функции, это как минимум, 1000.
Полностью отказаться от пересылки данных мы не можем, однако снизить на-
кладные расходы – вполне посильная задача. Например, нам нужно переслать мат-
рицу от процесса A к B.
Наивная реализация выглядит так:
. . .
if(rank == A)
{
. . .
for(i=0; i < n; i++)
{
for(j=0; j < m; j++)
{
MPI_Send(&matr[i][j], 1, MPI_DOUBLE, B, 0, MPI_COMM_WORLD);
}
}
}
. . .
if(rank == B)
{
. . .
for(i=0; i < n; i++)
{
for(j=0; j < m; j++)
{
MPI_Recv(&matr[i][j], 1, MPI_DOUBLE, A, 0, MPI_COMM_WORLD,
&st);
}
}
}
. . .
Матрица matr в приведенном фрагменте пересылается поэлементно, что
запросто может свести на нет все наши усилия по распараллеливанию алгоритма.
Более быстрый вариант будет выглядеть следующим образом (используем тот факт,
что двумерные массивы в языке С хранятся в памяти построчно):
. . .
if(rank == A)
{
. . .
for(i=0; i < n; i++)
{
MPI_Send(matr[i], m, MPI_DOUBLE, B, 0, MPI_COMM_WORLD);
}
}
1...,52,53,54,55,56,57,58,59,60,61 63,64,65,66,67,68,69,70,71,72,...180