309
t_compute= MPI_Wtime() - t1;
/* для сравнения время Irecv/Isend/Wait без вычислений */
MPI_Barrier( comm );
t1 = MPI_Wtime();
MPI_Irecv( rbuf, n, MPI_DOUBLE, left_nbr, 5, comm, &r[0] );
MPI_Isend( sbuf, n, MPI_DOUBLE, right_nbr, 5, comm, &r[1] );
MPI_Waitall( 2, r, statuses );
t_comm = MPI_Wtime() - t1;
/* совмещаем вычисления и передачи */
MPI_Barrier( comm );
t1 = MPI_Wtime();
r_recv = MPI_REQUEST_NULL;
for (k=0;k<3;k++)
{ /* ожидаем предыдущий recv */
MPI_Wait( &r_recv, &status );
MPI_Irecv( rbuf, n, MPI_DOUBLE, left_nbr, k, comm, &r_recv );
MPI_Isend( sbuf, n, MPI_DOUBLE, right_nbr, k, comm, &r_send );
Compute( 1, m, databuf );
MPI_Wait( &r_send, &status );
}
MPI_Wait( &r_recv, &status );
t_both = MPI_Wtime() - t1; t_both /= 3.0;
if (rank == 0)
{ printf( "For n = %d, m = %d, T_comm = %f, T_compute = %f, sum = %f,
T_both = %f\n", n, m, t_comm, t_compute, t_comm + t_compute, t_both );
}
MPI_Finalize( );
return 0;
}
Задание 7.1.
#include "mpi.h"
#include <stdio.h>
#include <math.h>
int f(int i,int j,int n) /* функция обращения к элементу i,j матрицы */
{ return n*i+j; }
void main(int argc, char *argv[])
{ int myid, numprocs, i, j,numsent,x, *buffer, *a, *b, *c, master,sender,anstype, ans;
double startwtime, endwtime, t_calc,t_send;
int cols,rows,row,max_cols,max_rows;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);