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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM