Параллельное программирование в стандарте MPI. Баканов В.М - 56 стр.

UptoLike

Составители: 

- 56 -
int main(int argc, char *argv[])
{
int i, j, k; /* indexes */
double a[NRA][NCA], /* matrix A to be multiplied */
b[NCA][NCB], /* matrix B to be multiplied */
c[NRA][NCB], /* result matrix C */
t1,t2; // time’s momemts
/* Initialize A, B, and C matrices */
for (i=0; i<NRA; i++)
for (j=0; j<NCA; j++)
a[i][j] = i+j;
for (i=0; i<NCA; i++)
for (j=0; j<NCB; j++)
b[i][j] = i*j;
for(i=0; i<NRA; i++)
for(j=0; j<NCB; j++)
c[i][j] = 0.0;
t1=f_time(); // get start time’s moment
/* Perform matrix multiply */
for(i=0; i<NRA; i++)
for(j=0; j<NCB; j++)
for(k=0; k<NCA; k++)
c[i][j] += a[i][k] * b[k][j];
t2=f_time(); // get ended time’s moment
printf (“Multiplay time= %.3lf sec\n\n”, t2-t1);
printf(“Here is the result matrix:\n”);
for (i=0; i<NRA; i++)
{
printf(“\n”);
for (j=0; j<NCB; j++)
printf(“%6.2f “, c[i][j]);
}
printf (“\n”);
} // end of MM_SER.C program
Теоретически (без учета затрат времени на обмен данными) задача умно-
жения матриц распараллеливается идеально (выходные данные вычисляются
по единому алгоритму на основе исходных и в процессе вычисления не из-
меняют последних), однако при практическом распараллеливании (разработ-
ке программы) необходимо учитывать как задержки времени при обменах,
так и распределение по вычислительным узлам вычислений и блоков дан-
ных. Т.о. стратегия распределения блоков матриц по ВУ должна основывать-
ся на анализе структуры процесса вычисления (т.н. тонкой информационной
структуре алгоритма, [1]); в профессиональных пакетах линейной алгебры
(ScaLAPACK, AZTEC) распределению содержимого обрабатываемых мат-
                                               - 56 -


int main(int argc, char *argv[])
{
int i, j, k; /* indexes */
double a[NRA][NCA],          /* matrix A to be multiplied */
         b[NCA][NCB],        /* matrix B to be multiplied */
         c[NRA][NCB],        /* result matrix C */
         t1,t2; // time’s momemts

/* Initialize A, B, and C matrices */
 for (i=0; i