📄 my.c
字号:
#include <stdlib.h>#include <stdio.h>#include <mpi.h>const int dimension = 20000;void generateNumbers(int seed, double *A){ int i, j; srand(100*seed); for(i = 0; i < dimension; i++) for(j = 0; j < dimension; j++) A[dimension*i+j] = (rand()/(RAND_MAX + 1.0));}void maxMatrix(double *A, double *Amax){ int i, j; for(i = 0; i < dimension; i++) { Amax[i] = -1.0; for(j = 0; j < dimension; j++) if(A[dimension*i+j] > Amax[i]) Amax[i] = A[dimension*i+j]; }}double maxVector(double *A){ int i; double Amax = -1.0; for(i = 0; i < dimension; i++) if(A[i] > Amax) Amax = A[i]; return Amax;}int main(int argc, char **argv){ int rank, size; int i; double *A, *Amax, *rootMax; double tick, tock, maxVal = -1.0; MPI_Status status; A = (double*)malloc(dimension*dimension*sizeof(double)); Amax = (double*)malloc(dimension*sizeof(double)); rootMax = (double*)malloc(dimension*sizeof(double)); MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); generateNumbers(rank, A); tick = MPI_Wtime(); maxMatrix(A, Amax); tock = MPI_Wtime(); printf("Processor %d, find local max took %f sec\n", rank, tock-tick); tick = MPI_Wtime(); if (rank != 0) { MPI_Send(Amax, dimension, MPI_DOUBLE, 0, rank, MPI_COMM_WORLD); } else { memcpy(A, Amax, dimension); for (i=1;i<size;i++) { MPI_Recv(Amax,dimension,MPI_DOUBLE,i,i,MPI_COMM_WORLD,&status); memcpy(&A[i*dimension],Amax,dimension); } maxMatrix(A, rootMax); }// MPI_Reduce(Amax, rootMax, dimension, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD); tock = MPI_Wtime(); if(rank == 0) { printf("The modified reducsion with send took: %f sec\n", tock-tick); tick = MPI_Wtime(); maxVal = maxVector(rootMax); tock = MPI_Wtime(); printf("find max took %f sec\n", tock-tick); } tick = MPI_Wtime(); if (rank == 0) { for (i=1;i<size;i++) MPI_Send(&maxVal, 1, MPI_DOUBLE, i, i, MPI_COMM_WORLD); } else { MPI_Recv(&maxVal,1,MPI_DOUBLE,0,rank,MPI_COMM_WORLD,&status); }// MPI_Bcast(&maxVal, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); tock = MPI_Wtime(); if(rank == 0) printf("the modified broadcast with send took: %f sec\n", tock-tick); printf("Processor %d, max %f\n", rank, maxVal); MPI_Finalize(); return EXIT_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -