终于等到你

众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

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。

posted @ 2020-08-10 17:11  gzr2018  阅读(1185)  评论(0编辑  收藏  举报