#include #include #include #include #include #define SZ 5000 int main(int argc, char** argv) { MPI_Status status; int i, j, np, id; float *b, *c; float **A; time_t sec; struct timeb t1, t2; unsigned short usec; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &np); MPI_Comm_rank(MPI_COMM_WORLD, &id); b = (float *) malloc(sizeof(float) * SZ); c = (float *) malloc(sizeof(float) * SZ); A = (float **) malloc(sizeof(float) * SZ); for(i = 0; i < SZ; i++) { b[i] = i; A[i] = (float *) malloc(sizeof(float) * SZ); for(j = 0; j < SZ; j++) A[i][j] = i*j; } ftime(&t1); for(i = id; i < SZ; i += np) { c[i] = 0; for(j = 0; j < SZ; j++) c[i] += A[i][j] * b[j]; } if(np > 1) { if(id == 0) { for(i = 0; i < SZ; i++) if(i != i%np) MPI_Recv(&c[i], 1, MPI_INT, MPI_ANY_SOURCE, i, MPI_COMM_WORLD, &status); } else for(i = id; i < SZ; i++) MPI_Send(&c[i], 1, MPI_INT, 0, i, MPI_COMM_WORLD); } ftime(&t2); //Calculate time sec = t2.time - t1.time; usec = t2.millitm - t1.millitm; if(t2.millitm - t1.millitm < 0) sec--; printf("Thread %i/%i. Calculation time = %ld.%d.\n", id, np, sec, usec); MPI_Finalize(); return 0; }