在運行MPI代碼的集羣中,是所有聲明變量的副本,發送到所有節點,以便所有節點都可以在本地訪問它,並且不執行遠程內存訪問?MPI代碼中的變量內存分配
0
A
回答
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庫內部,通過網絡)獲取值,並將該值存儲在當前進程的內存中給定地址。
所以,地址是給這個函數的,因爲在某些節點上函數會寫入變量。只有值是通過網絡發送的。
相關問題
- 1. MPI內存分配
- 2. FORTRAN MPI內存分配
- 3. MPI中的動態內存分配
- 4. MPI程序中的內存分配
- 5. 變量的內存分配
- 6. 變量的內存分配
- 7. 變量內存分配
- 8. 實例變量的Java內存分配
- 9. 靜態變量的內存分配
- 10. 變量的塊結構內存分配
- 11. 私有變量的內存分配
- 12. JSON對象內存分配vs變量
- 13. 靜態變量內存分配
- 14. 將內存分配給已分配的變量?
- 15. 本地變量的C++內存管理內存分配
- 16. 在C++內存錯誤中的並行MPI代碼
- 17. C++可變內存分配
- 18. 內存Swift類以外的變量和常量的分配
- 19. 向量C++內存分配
- 20. 分配常量內存
- 21. 內存分配碼錯誤
- 22. c變量在內存中的分配,指針
- 23. 如何爲類中的值類型變量分配內存
- 24. 內存在C#中未分配的變量
- 25. 類中的靜態變量和內存分配及其使用
- 26. 爲類中的靜態變量動態分配內存
- 27. 如何'釋放'分配給外殼中變量的內存
- 28. Java中初始化變量的內存分配
- 29. 在本地代碼中使用由sun.misc.Unsafe.allocateMemory()分配的內存
- 30. C++代碼中的內存分配錯誤
謝謝! 所以程序員必須完全控制哪個變量對哪個節點可見。對 ? –
從代碼 - MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD); 在這裏,MPI_BCast是發送'n'的地址還是'n'的值? 如果是正在發送的地址,那麼從屬進程如何知道'n'的值是什麼? –
如果我的問題太簡單,不好意思。我只是想清除我的疑惑 –