2012-04-11 55 views
0

我希望在使用OpenMPI的不同處理器上擁有相同的陣列hist(1:1000),以便當一個處理器修改hist時,此修改在其餘處理器中得到更新。如何在使用MPI的不同處理器上使用相同陣列

我已經寫了一個代碼並宣佈爲hist(1:1000),但問題是hist在每個處理器上獨立更新,那麼我所做的就是將數據發送到「主節點」以基於信息更新另一個直方圖的奴隸,但這是我不想要的。我想要在每個處理器上更新相同的直方圖。

是否可以使用OpenMPI做到這一點?

+0

您是否嘗試將hist聲明爲共享變量? – Neo 2012-04-11 22:44:56

+0

我怎麼能這樣做?問候。 – armando 2012-04-11 22:55:45

+0

哎呀..我的錯誤..我誤解爲OpenMP ..只是注意到它是openmpI ..就像mgilson在下面的答案中所述,如果你可以使用OpenMP,你可以有一個共享變量。但是,OpenMP影響可伸縮性。所以如果你打算繼續使用MPI,你必須使用像MPI_Gather這樣的收集操作。沒有其他方法! – Neo 2012-04-11 23:44:50

回答

6

據我所知,MPI不可能做到這樣的事情。 MPI的目的是實現從一個進程到另一個進程的消息傳遞(因此名稱爲Message Passing Interface)。如果你想使用共享內存,最好的辦法是使用像OpenMP(我認爲它可能在那裏?),至少由gcc/gfortran支持,可能還有其他一些編譯器。你可以使用線程......但最終,這些都不能像MPI那樣擴展到1000個處理器。根據你在做什麼,你可以嘗試MPI的集體操作 - 正如你所提到的,hist是存儲一個直方圖,所以你可能只想要你使用的所有hists的總和,而你的計算實際上並不依賴於HIST。 MPI可以總結爲你所有的陣列,他們已經改變了之後......

看到這個例如

http://mpi.deino.net/mpi_functions/MPI_Allreduce.html

(你想要的操作可能是MPI_SUM)

1

我不t完全瞭解您的應用程序,但您可能對MPI_Bcast函數感興趣,它會將數組廣播到您的所有處理器。但是,使用大量的MPI_Bcast通常不是一個好主意,因爲長時間用於通信而不是處理。

+0

MPI_Allreduce可以被認爲是一個MPI_Reduce後跟一個MPI_Bcast(儘管我希望它可以更高效地實現) – mgilson 2012-04-12 00:05:46

0

您可以通過one-sided通信與其他人共享一個進程上的陣列。然而,這被許多人認爲是次優解決方案。也許你會變得更好,重新思考你的算法,並嘗試在消息傳遞範式中進行更多的闡述。

+0

斷開鏈接「單向」。 – 2015-11-29 12:02:35

+0

@ bogdan.rusu謝謝,修復它。 – haraldkl 2015-11-29 21:49:27

相關問題