2011-11-08 86 views

回答

1

不,MPI本身不能在單個調用中爲您做到這一點。

每個MPI進程都有自己的內存狀態,每個MPI進程中的值都可能不同。

發送/接收數據的唯一方法是使用MPI的顯式調用,如Send或Recv。您可以將大部分數據打包到某個內存空間中,並將該內存區域發送給每個MPI進程,但該區域不會包含「每個聲明的變量」,只有手動將這些變量放入該區域。

更新:

每個節點運行該程序的副本。每個副本將根據需要初始化變量(它可以是基於MPI進程號的相同初始化或個人,稱爲Rank;從MPI_Comm_Rank函數獲得)。所以每個變量都存在於N個副本中;每個MPI過程一套。每個進程都會看到變量,但只能看到它所擁有的集合。變量的值是自動非同步的。

因此,程序員的任務是同步節點(mpi進程)之間的變量值。 例如這裏是小MPI程序來計算裨:

http://www.mcs.anl.gov/research/projects/mpi/usingmpi/examples/simplempi/cpi_c.htm

它將發送從第一處理中「n」變量的值與所有其它(MPI_Bcast);並且每個進程在計算後將自己的'mypi'發送到第一個進程的'pi'變量(通過MPI_Reduce函數添加各個值)。

只有第一個進程能夠從用戶(通過scanf)讀取N,並且該代碼是基於進程的等級有條件地執行的;其他進程必須從第一個獲取N,因爲它們沒有直接從用戶那裏讀取它。

Update2(對於遲到的答案抱歉): 這是MPI_Bcast的語法。程序員應該給這個函數一個變量的地址。每個MPI進程都會給出自己的'n'變量的地址(它可以不同)。並且MPI_Bcast將

  • 檢查當前進程的等級並與其他參數比較,「廣播者」的等級。
  • 如果當前進程是廣播者,MPI_Bcast將讀取存放在給定地址的值(它將讀取'Broadcaster'上'n'變量的值);那麼值將通過網絡發送。
  • 否則,如果當前進程不是廣播公司,它是一個「接收器」。接收器的MPI_Bcast將從「廣播器」(使用MPI庫內部,通過網絡)獲取值,並將該值存儲在當前進程的內存中給定地址。

所以,地址是給這個函數的,因爲在某些節點上函數會寫入變量。只有值是通過網絡發送的。

+0

謝謝! 所以程序員必須完全控制哪個變量對哪個節點可見。對 ? –

+0

從代碼 - MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD); 在這裏,MPI_BCast是發送'n'的地址還是'n'的值? 如果是正在發送的地址,那麼從屬進程如何知道'n'的值是什麼? –

+0

如果我的問題太簡單,不好意思。我只是想清除我的疑惑 –