zoukankan      html  css  js  c++  java
  • MPI多进程问题记录

    1.MPI多进程协同

    MPI多进程运行的时候,每个进程的访问空间是独立的。例如对于一个全局变量sum==0。不能同时调用多个进程修改这个值,这样达不到你想要的效果。因为不同进程的执行顺序不确定,而且不同进程的存储空间相互独立。进程之间的沟通只能使用通信函数。

    2.我的实际问题(视觉测量算法局部并行)

    24个相同的任务,24个任务计算的结构都要保存到map里面。所以我的task是并行化这一段代码提速。当然提速的前提是要知道代码的时间消耗在哪。
    如果简单使用不同进程不断更新map,那样就存在1中说的问题。
    解决办法1:
    使用通信,0号进程接收其他进程的计算结构,全部用0号进程保存。我感觉这是正解,但是自定义结构数据和string数据不太会send和recv。
    解决办法2:
    暴力。例如我有4个进程,每个进程的计算结构保留在自己对应的txt文件,最后统一读取txt文件内容,保存到我的map中。这是我采用的方法。
    解决办法3(OpenMP):
    最简单的方向,对map设置进程单独访问,因为OpenMP内存共享,这一点和MPI巨大不同。

    3.MPI_Finalize()之后

    在我实验过程中,MPI_Finalize()之后的代码也会执行多次,感觉十分奇怪,而我只想后面的代码串行执行就行。多方方法不行,我用的如下代码,退出其他进程,只保留一个进程。感觉应该不是标准方法,希望知道的读者可以指点我。

    MPI_Barrier();//进程同步
    if (myid!=0){
        MPI_Finalize();
        exit(1);//退出
    }
    MPI_Finalize();
    

    stackoverrun网址上看到一些大牛的回答,发现MPI会并行化全部代码,包括MPI_Init()之前的代码。所以结论是MPI会并行整个MPI代码,所以写MPI code最先可执行的代码应该是 MPI_Init()这个函数(当然也可以包括初始化函数)。如果想要使用MPI并行一个工程的部分函数,其他串行代码都需要用if(rank_id==0)判断,以免被执行多次。因为这个因素,强烈建议使用OpenMP,可以很快上手,上手难与低于MPI十倍,配置也超级方便,IDE一般自带。而且OpenMP使用更加灵活,如果没有多机并行的要求,强烈建议OpenMP。

  • 相关阅读:
    从Dojo1.6到Dojo1.8(二)—— 基本模块,事件,约定,DOM操作
    从Dojo1.6到Dojo1.8(三)—— Parser,Dijit,DojoX
    在Node.js上使用dojo库进行面向对象web应用开发
    JavaScript事件代理和委托(Delegation)
    介绍一款神级API接口神器,高效工作,告别加班!
    sqlserver备份存储过程
    WSGI原理与简单实现
    从Python看Web架构的发展
    Celery:小试牛刀
    Flask:用户角色与权限管理
  • 原文地址:https://www.cnblogs.com/gzr2018/p/13470849.html
Copyright © 2011-2022 走看看