2014-02-23 54 views
0

如果我們調用MPI_INIT()我們知道,在不同的機器一樣運行可執行文件的多個副本。假設MPI_Init()在函數f()中,那麼main()函數的多個副本是否也存在?查詢在MPI初始化

,我現在面臨的主要問題是服用投入實際上,發生的情況是輸入正在進行一次,但主要功能正在運行幾次等級0的處理器似乎總是有輸入,其餘的都有隨機值。所以要發送這些值,我們必須將來自處理器0的輸入廣播到所有其他處理器?

+0

你應該執行MPI_INIT()只有一次(即,在源代碼中可能正好出現一次)。您的程序的參數應該在所有處理器上都可讀。 – stefan

回答

4

MPI_INIT()不創建多個副本,它只是初始化進程MPI庫。你的程序的多個副本創建在此之前,最有可能以某種mpirun命令(那你是怎麼運行的MPI應用程序)。所有進程都從一開始就是獨立的,因此回答第一部分的問題 - 是的,main()將存在多個副本,即使您不調用MPI_Init,它們也會存在。

回答你關於投入問題取決於輸入性質:如果它是從控制檯輸入了,那麼你要輸入的值只在一個進程(例如等級0),然後進行廣播。如果輸入在某個文件中或被指定爲命令行參數,則所有進程都可以訪問它們。

+0

謝謝。 :) 我還有一個疑問。假設我有一個函數doSomething(int * A),其中doSomething()被某個其他應用程序調用,並且我的MPI代碼位於此函數內,那麼即便我們需要提供廣播機制? –

+0

如果我理解正確,'其他應用程序'是代碼的一部分,即它與您的程序相關聯。然後,在啓動MPI程序後,您將有N個單獨的進程(可能運行在不同的計算機上),每個進程都包含該「應用程序」的副本,並且您將有N次調用doSomething - 每臺機器上都有其本地答案。 想象一下,你編譯你的程序並手動在10臺計算機上啓動 - 進程是孤立的,彼此不知道(除非他們調用MPI庫),這正是mpirun之後發生的情況。 – Inspired

+0

MPI不是多線程的。在多線程中,你可以初始化一些共享變量,然後用它們產生線程(也許你想在你的程序中做同樣的事情);這需要共享內存,因此僅限於一臺機器。 MPI沒有共享內存模型,所以編程進程間通信變得更加困難,但MPI應用程序可以在多臺機器上運行,這是一個巨大的優勢。 – Inspired