2013-12-11 120 views
3

我必須實現一個MPI程序。有一些全局變量(浮點數的4個數組和其他6個單浮點變量),這些變量首先由主進程從文件中讀取數據來初始化。然後我調用MPI_Init,而當0級進程等待結果時,其他進程(級1,2,3,4)在數組等上工作... 問題是這些數組似乎不會被初始化,全部設置爲0.我嘗試在主函數內部移動全局變量,但結果相同。當調用MPI_Init()時,所有進程都是通過fork創建的嗎?所以每個人都有一個父親的記憶副本,所以他們爲什麼看不到初始化數組?MPI和全局變量

回答

7

我擔心你誤會了。

將每個MPI進程作爲一個獨立的程序來考慮可能是最好的,儘管它與計算中的每個其他進程具有相同的源代碼。處理0對其地址空間中的變量執行的操作不會影響其他進程的地址空間的內容。

我不確定MPI標準甚至要求進程0具有在調用mpi_init之前聲明和初始化的變量值,即在進程0真正存在之前。

無論是否需要編寫代碼以將值存入其他進程的地址空間中的變量中。一種方法是讓進程0將值發送到其他進程,一個接一個或使用廣播。另一種方式是所有進程都從輸入文件讀取值;如果您選擇此選項,請注意爭用I/O資源。

順便說一下,我認爲MPI實現通過在致電mpi_init時分叉創建進程並不常見,分叉更常用於創建線程。我認爲當您撥打mpiexec時,大多數MPI實現實際上會創建這些進程,mpi_init的調用是宣佈您的程序正在開始其並行計算的形式。

+0

您的回答非常有用。我必須將這個練習作爲並行編程課程的一個小項目來實現,並且教師希望我們使用mpi(也許它是更好的openmp)...程序應該計算在三個方向上均勻分佈的100個球體的總體積x,y,z並給出它們的光線並使用Monte Carlo算法(近似值)。所有這些數據都在開始時插入到4個不同的數組中,我認爲每個進程都應該有一個副本......好吧,我會用廣播。謝謝你...對我真的很友善。 –

+0

所以最好的解決方案是進程0初始化數組,然後他把它們交給別人,不是嗎?我很高興這是一個浪費時間的並行計算... –

+2

這可能是一個並行計算機的時間浪費,但很好地利用你的時間,因爲你瞭解這個問題。 –

6

當調用MPI_Init()時,所有進程都是由fork創建的嗎?

錯了。

MPI會產生程序的多個實例。這些實例是獨立的進程,每個進程都有自己的內存空間。每個進程都有自己的每個變量的副本,包括全局變量。 MPI_Init()只初始化MPI環境,以便可以調用其他MPI函數。

+0

所以最好的解決方案是進程0初始化數組,然後他把它們交給別人,不是嗎?我很擔心這是浪費時間進行並行計算...... –

3

正如其他答案所說,這不是MPI的工作方式。數據對於每個進程都是唯一的,並且必須使用MPI規範中提供的API在進程之間進行顯式傳輸。

但是,有編程模型允許這種行爲。如果當你說並行計算時,你的意思是一個處理器上有多個內核,那麼使用OpenMP之類的東西在線程之間共享數據可能會更好。或者,如果你實際上需要使用多個處理器(或者因爲你的數據太大而不能適應一個處理器的內存或其他原因),你可以看一下並行全局地址空間(PGAS)語言。在這些模型中,您擁有全局可用於執行過程中所有進程的內存。

最後,MPI的一部分確實允許您將內存從一個進程暴露給其他進程。這是遠程內存訪問(RMA)或單面章節。它可能很複雜,但功能強大,如果那是您需要的那種計算模型。

所有這些模型將需要改變你的應用程序的工作方式,但它聽起來像他們可能更好地映射到你的問題。

+0

閱讀了一些評論後,我發現這實際上是一個練習,所以改變你的模型不會是一種選擇,但對於後代來說,這是SE的要點,這仍然是件好事。 –

+0

另一個問題請:所有的進程/隊伍應該創建不同的隨機數字之間的最小值和最大值(由我給出),但如果我啓動mpirun -np 5 ./program所有的進程/隊伍產生相同的休閒數字......如何可以避免嗎? –

+0

這應該是一個單獨的問題。無論如何,這不是MPI特有的。 –