MPI和OpenMP实现蒙特卡罗算法

这篇具有很好参考价值的文章主要介绍了MPI和OpenMP实现蒙特卡罗算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MPI和OpenMP实现蒙特卡罗算法

一、蒙特卡洛算法介绍

  1. 基本思想

    当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。

  2. 数学应用:

    通常蒙特·卡罗方法通过构造符合一定规则的随机数来解决数学上的各种问题。对于那些由于计算过于复杂而难以得到解析解或者根本没有解析解的问题,蒙特·卡罗方法是一种有效的求出数值解的方法。一般蒙特·卡罗方法在数学中最常见的应用就是蒙特·卡罗积分。

  3. 案例:

    通过在正方形内随机撒点,落在圆内的点 / 落在正方形内的点,就约等于圆的面积 / 正方形的面积 = π 4 \frac{\pi}{4} 4π,随着撒点的数量增多, π \pi π的数值越来越接近真实值
    N 圆 N 正 方 形 ≈ S 圆 S 正 方 形 = π 4 ( N 为 点 的 数 量 , S 为 面 积 ) \frac{N_圆}{N_{正方形}}\approx \frac{S_圆}{S_{正方形}}=\frac{\pi}{4}\quad (N为点的数量,S为面积) NNSS=4π(NS)

MPI和OpenMP实现蒙特卡罗算法

二、MPI实现蒙特卡罗算法计算 π \pi π值

  1. 首先要配置要MPI多节点集群环境,没有配置好的可以参考我的前几篇博客

  2. 原理

    1. 生成0-1内的随机数 x , y x,y x,y记为 ( x , y ) (x,y) (x,y),总共生成的点数为 N N N
    2. 计算每一个 ( x , y ) (x,y) (x,y)是否满足 x 2 + y 2 ≤ 1 x^2+y^2 \le 1 x2+y21,将符合条件的点数记为 C C C
    3. π \pi π的近似值可以看作 4 C N \frac{4C}{N} N4C
  3. 运行

    1. 编写profile文件,与上一节一样
    node01:2
    node02:2
    
    1. 编写源代码文件mpimc.cpp,两个虚拟机都需要

    2. 编译mpimc.cpp文件,两个虚拟机都需要编译

    mpic++ mpimc.cpp -o mpimc
    
    1. mpi多节点运行,-n参数推荐为2,只有main节点运行
    mpiexec -f profile -n 2 ./mpimc
    
  4. 运行结果

MPI和OpenMP实现蒙特卡罗算法

  1. 代码
#include <iostream>
#include "mpi.h"

using namespace std;
const int maxn = 1e6; //随机点数量

MPI_Status status;
int main(int argc, char *argv[]) {
    int pCnt, pId, slaves, source, dest;
    int cnt, n, offset;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &pId);
    MPI_Comm_size(MPI_COMM_WORLD, &pCnt);

    slaves = pCnt - 1;
    offset = maxn / slaves;
    if(pId == 0) {
        for(dest = 1; dest <= slaves; dest++) {
            MPI_Send(&offset, 1, MPI_INT, dest, 1, MPI_COMM_WORLD);
            MPI_Send(&n, 1, MPI_INT, dest, 1, MPI_COMM_WORLD);
        }
        cnt = 0;
        for(int i = 1; i <= slaves; i++) {
            source = i;
            MPI_Recv(&offset, 1, MPI_INT, source, 2, MPI_COMM_WORLD, &status);
            MPI_Recv(&n, 1, MPI_INT, source, 2, MPI_COMM_WORLD, &status);
            cnt += n;
        }

        double pi = 4.0 * cnt / maxn;
        cout << "PI is " << pi << endl;
    }

    if(pId > 0) {
        source = 0;
        MPI_Recv(&offset, 1, MPI_INT, source, 1, MPI_COMM_WORLD, &status);
        MPI_Recv(&n, 1, MPI_INT, source, 1, MPI_COMM_WORLD, &status);
        n = 0;
        srand(time(NULL));
        for(int i = 0; i < offset; i++) {
            // 生成0-1内的随机数
            double x = (double)rand() / RAND_MAX;
            double y = (double)rand() / RAND_MAX;
            if(x * x + y * y <= 1)
                n++;
        }
        MPI_Send(&offset, 1, MPI_INT, 0, 2, MPI_COMM_WORLD);
        MPI_Send(&n, 1, MPI_INT, 0, 2, MPI_COMM_WORLD);
    }

    MPI_Finalize();
    return 0;
}

三、OpenMP实现蒙特卡罗算法计算 π \pi π值

  1. 不需要MPI集群环境,只需要一个节点就行
  2. 原理(同上)
  3. 编译运行
g++ ompmc.cpp -fopenmp -o ompmc
./ompmc
  1. 运行结果

MPI和OpenMP实现蒙特卡罗算法文章来源地址https://www.toymoban.com/news/detail-449870.html

  1. 代码
#include <iostream>
#include <pthread.h>
#include <omp.h>
using namespace std;
const int maxn = 1e6; //随机点数量


double dis(double x, double y) {
    return x * x + y * y;
}

int main(int argc, char *argv[]) {
    int cnt = 0;
    double x, y;
    int i;

    omp_set_num_threads(omp_get_num_procs());
    srand48(time(NULL));

    #pragma omp parallel for private(i)
    for(i = 0; i < maxn; i++) {
        // 生成0-1内的随机数
        x = (double)rand() / RAND_MAX;
        y = (double)rand() / RAND_MAX;
        if(dis(x, y) <= 1) cnt++;
    }
    double pi = 4.0 * cnt / maxn;
    cout << "Pi is " << pi << endl;
    return 0;
}

到了这里,关于MPI和OpenMP实现蒙特卡罗算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 强化学习中的动态规划与蒙特卡罗方法

    强化学习(Reinforcement Learning,RL)是一种机器学习方法,它通过与环境的互动来学习如何做出最佳决策。强化学习的目标是找到一种策略,使得在长期内累积最大化奖励。强化学习的一个关键特点是它需要在环境中探索和利用,以找到最佳的行为策略。 动态规划(Dynamic Programmi

    2024年02月19日
    浏览(9)
  • 蒙特卡罗(洛)模拟——手把手教你数学建模

    蒙特卡罗(洛)模拟——手把手教你数学建模

    蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问

    2024年02月09日
    浏览(11)
  • 蒙特卡罗方法:当丢失确定性时的处理办法

    蒙特卡罗方法:当丢失确定性时的处理办法

    蒙特卡罗(Monte Carlo),也可翻译为蒙特卡洛,只是不同的音译选词,比较常用的是蒙特卡罗。是摩洛哥的一片城区,以拥有豪华赌场闻名,蒙特卡罗方法是基于概率的。基本思想:如果你想预测一件事情的结果,你只要把随机生成的各种输入值,把这件事模拟很多遍,根据

    2023年04月10日
    浏览(10)
  • 关于蒙特卡罗方法及其在信号处理中的应用

    关于蒙特卡罗方法及其在信号处理中的应用

        最近想探讨一下毫米波雷达测量准确度及其改善的问题,这个话题下可供讨论的问题有很多,蒙特卡罗方法(或者说基于蒙特卡罗方法对测量准确度以及精度的评估)是其中之一,该方法是一个十分有效的工具,在科研(发paper)上也是不可少的。在探讨测量的准确度之前,我

    2024年02月05日
    浏览(7)
  • 随机游走任务中时间差分(0)和常数α蒙特卡罗方法的比较

    随机游走任务中时间差分(0)和常数α蒙特卡罗方法的比较

            在这篇文章中,我们讨论了常α MC 方法和 TD(0) 方法之间的区别,并比较了它们在随机游走任务中的性能。TD方法在本文的所有测试中都覆盖了MC方法,因此将TD视为强化学习任务的方法是更可取的选择。         蒙特卡洛(MC)和时间差分(TD)方法都是强化

    2024年02月10日
    浏览(9)
  • MATLAB运动学之蒙特卡罗法求积分与机器人工作域分析

    MATLAB运动学之蒙特卡罗法求积分与机器人工作域分析

    蒙特卡罗法又叫做统计模拟法、随机抽样技术,是一种随机模拟方法以概率和统计理论方法为基础的一种计算方法,通俗来说是可以使用随机数来解决很多计算问题的一种方法,很直观简单,尤其对于一些求解积分无解的情况,非常好使且简单粗暴。 以 y = x² 为例,我们需要

    2024年02月04日
    浏览(11)
  • R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列

    R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列

    本文详细介绍了如何使用R语言进行随机波动模型SV的模拟和估计,包括马尔可夫蒙特卡罗法(MCMC)、正则化广义矩估计法和准最大似然估计法。

    2024年02月10日
    浏览(12)
  • Windows 中使用 VS Code 编译 MPI 和 OpenMP 程序

    Windows 中使用 VS Code 编译 MPI 和 OpenMP 程序

    Win10下Microsoft MPI(MSMPI)的下载安装 - 知乎 (zhihu.com) (34条消息) Dev配置MPI运行环境(msmpi)和OpenMP环境(运行通过)_devc++ mpi配置_一点年羊的博客-CSDN博客 (39条消息) ubuntu下mpich的安装与使用_乌班图 可执行程序cpi_Wu_uuuu的博客-CSDN博客 检查gcc版本:gcc --version (GCC从4.2.0版本开始

    2024年02月06日
    浏览(21)
  • 蒙特卡洛算法详解

    蒙特卡洛算法详解

    蒙特卡洛算法是20世纪十大最伟大的算法之一,阿法狗就采用了蒙特卡洛算法。 蒙特卡洛方法也称为 计算机随机模拟方法,它源于世界著名的赌城——摩纳哥的Monte Carlo(蒙特卡洛)。 它是基于对大量事件的统计结果来实现一些确定性问题的计算。其实质就是将问题转化为一个

    2024年02月02日
    浏览(11)
  • 蒙特卡洛算法

    蒙特卡洛算法

    定义 :蒙特卡洛算法是以概率和统计的理论、方法为基础的一种数值计算方法,将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解,故又称随机抽样法或统计实验法。 适用范围 :可以较好的解决多重积分计算、微分方程求解、积

    2024年02月11日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包