zoukankan      html  css  js  c++  java
  • mpi

    使用MPI,计算cos x 函数的积分值,积分区间为(0,2PI)
    这里写图片描述
    基本思路:


    把积分区间,分为相等若干块(此处起多少个线程,分多少块),每个线程分得一块积分区域,每块在分若干小块(此处定义分10块)。每个线程计算每个小块的面积之和,返回给0号线程。
    所得,即为cos(x )在积分域上的值。

    代码实现:

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #include<math.h>
    #include"mpi.h"
    #define PI 3.1415
    int main(int argc,char** argv)
    {
            int rank,p,i;     //
        double* sbuf;     //
        double rbuf[10];
        double add;       //
    
            double  h;            //
        int a;            //
        double sum ;      //
        double* ssum;
        double asum    ;
        int n=10;         
            //初始化
            MPI_Init(&argc,&argv);
            //从命令行获取开启的线程数
            MPI_Comm_size(MPI_COMM_WORLD,&p);
            //获取本线程的线程号
            MPI_Comm_rank(MPI_COMM_WORLD,&rank);
        add= (2*PI)/p;
            if(rank==0)
            {
            ssum=(double*)malloc(sizeof(double)*p);
                sbuf=(double*)malloc(sizeof(double)*p);
    
           printf("Process's begin x is ");
          for(i=0;i<p;i++)
          {
          //计算各块起始x
           sbuf[i]=add*(i);
          printf(" %lf ",sbuf[i]);
             }
              printf("
    ");
             }
            //向各个线程分发起始x值
            MPI_Scatter(sbuf,1,MPI_DOUBLE,rbuf,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
    
        h=(add)/n;
        for(i=0;i<n;i++)    
        {
        double x=rbuf[0]+h*i+h/2;
        sum=sum+cos(x)*h;
         }
        printf("Process %d 's sum is %.2lf
    ",rank,sum);
        //收集各线程计算结果
        MPI_Gather(&sum,1,MPI_DOUBLE,ssum,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
        if(rank==0)
        {
          for(i=0;i<p;i++)
          {
    
           asum=asum+ssum[i];
           }
          printf("cos x 0~2PI de ji fen shi %.2lf
    ",asum);
          }        
        MPI_Finalize();
        return 0;
    }



     
    程序主要是通过计算出各个积分域块的起始x值,向各个线程分发,这样各个线程就可以负责一个单独的积分域。
    代码很简单,很容易看懂。

    结果:


    ---------------------
    作者:热血小码哥
    来源:CSDN
    原文:https://blog.csdn.net/mmayanshuo/article/details/72853324
    版权声明:本文为博主原创文章,转载请附上博文链接!



  • 相关阅读:
    [01] 异常的概念和处理
    [03] 节点流和处理流
    [02] 输入/输出流 和 字节/字符流
    [01] File类
    Apache的https协议配置
    Apache的虚拟主机配置
    Apahce的虚拟用户认证及server-status页
    Apache配置日志功能
    Apache脚本路径别名(CGI接口)
    Apache配置站点根目录、用户目录及页面访问属性
  • 原文地址:https://www.cnblogs.com/taogao3364/p/10642539.html
Copyright © 2011-2022 走看看