08class

学号:2019301110060 姓名:刘振平 院系:植物科学技术学院

混和模式,MPI和openMP求pi

  • export OMP_NUM_THREADS=2定义每个进程的线程数

  #include "mpi.h"
  #include "omp.h"
  #include <math.h>
  #include <stdio.h>
  #define N 1000000000
  int main(int argc, char *argv[])
  {
    int rank, nproc;
    int i, low, up;
    double local = 0.0, pi, w, temp, t0, t1;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nproc); //进程数
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); //进程身份
    t0 = MPI_Wtime();
    w = 1.0 / N;
    low = rank * (N / nproc); //每个进程计算的范围
    up = low + N / nproc - 1;
  #pragma omp parallel for reduction(+ : local) private(i,tmp) //线程间通信计算
    for (i = low; i < up; i++)
    {
      temp = (i + 0.5) * w;
      local = local + 4.0 / (1.0 + temp * temp);
    }
    MPI_Reduce(&local, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); //进程间通信获取结果,发送给0号进程的pi
    if (rank == 0)
      printf("pi = %.20f\n", pi * w); //0号进程获取最终结果
    t1 = MPI_Wtime();
    if (rank == 0)
      printf("time used = %.2f\n", t1 - t0); //打印时间
    MPI_Finalize();
  }

求数组最大值

  #include "mpi.h"
  #include "omp.h"
  #include <malloc.h>
  #include <unistd.h>
  #include <stdio.h>
  #include <stdlib.h>
  int main(int argc, char *argv[])
  {
    float *Array;
    int rank,numprocess,dimension;
    struct{
      double value;
      int index;
    } in,out;
    double startTime,endTime;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&numprocess);
    MPI_Barrier(MPI_COMM_WORLD);
    startTime=MPI_Wtime();
    if(rank==0){
      printf("请输入一个数组长度:\n");
      scanf("%d",&dimension);
    }
    MPI_Bcast(&dimension,1,MPI_INT,0,MPI_COMM_WORLD);//发送每个进程维度
    //初始化数组
  //根据每个进程设置种子
    Array=(float*)malloc(dimension*sizeof(float));

    for(int i=0;i<dimension;i++){
        // srand(rank*i+1);
      Array[i]=100.0 * rand() / RAND_MAX;
      }
    //初始化结构体的值
    in.value=0.0;
    for(int i=0;i<dimension;i++){
      if(Array[i]>in.value){
        in.value=Array[i];
        in.index=rank*dimension+i;
      }
    }
    MPI_Reduce(&in,&out,1,MPI_DOUBLE_INT,MPI_MAXLOC,0,MPI_COMM_WORLD);
    MPI_Barrier(MPI_COMM_WORLD);
    endTime = MPI_Wtime() ;
    if(rank==0){
      printf("maxrank= %d, maxindex=%d, maxvalue= %g, time= %g(s)\n", out.index/dimension,out.index%dimension, out.value, endTime-startTime);
    }
    free(Array);
    MPI_Finalize();
    return 0;
  }

Last updated