⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 my.c

📁 利用MPI_SEND 和mpi_recv来模拟mpi_Bcast和mpi_reduce.
💻 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 + -