2016-04-12 23 views
2

MPI標準,3.0表示約mpi_scatterv:MPI,蟒,Scatterv,和重疊的數據

計數,類型和位移的說明書不應根造成任何位置被讀取多於一旦「

然而,在代碼蟒蛇我mpi4py的測試下方並不表明存在與從根讀取數據的問題不止一次。

import numpy as np 
from sharethewealth import sharethewealth 

comm = MPI.COMM_WORLD 
nprocs = comm.Get_size() 
rank = comm.Get_rank() 

counts = [16, 17, 16, 16, 16, 16, 15] 
displs = [0, 14, 29, 43, 57, 71, 85] 

if rank == 0: 
    bigx = np.arange(100, dtype=np.float64) 
else: 
    bigx = None 

my_size = counts[rank] 
x = np.zeros(my_size) 

comm.Scatterv([bigx, counts, displs, MPI.DOUBLE], x, root = 0) 

print x 

命令

> mpirun -np 7 python mycode.py 

產生

[ 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72.] 

[ 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99.] 

[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.] 

[ 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.] 

[ 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58.] 

[ 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86.] 

[ 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.] 

輸出顯然是正確的,並從根的數據(處理0)已經清楚地被引用不止一次在每個邊界點的更多。我不理解MPI標準嗎?或者這是一種普遍不可靠的偶然行爲?

FWIW,我在OSX上運行python 2.7。

回答

2

你不能依賴這個。

這個假設直接來自MPI標準。由於mpi4py大寫函數只是MPI之上的一個薄層,所以這很重要。該標準還規定:

理由。儘管不需要,但是最後的限制被施加以致 與MPI_GATHER實現對稱,其中對應的限制 (多寫限制)是必要的。 (基本原理結束)

考慮到它在標準中,一個MPI實現可以利用的是:侵犯時

  • 忽略違反
  • 發出一個警告違反
  • 失敗時
  • 使用此假設進行任何類型的優化,當違反時可能導致未定義的行爲

最後一點是最可怕的,因爲它可能會引入微妙的錯誤。考慮到發送緩衝區的只讀屬性,很難想象這樣的優化,但這並不意味着它/不存在。正如一個想法考慮strict aliasing optimizations。另請注意,MPI的實現非常複雜 - 它們的行爲在版本,配置,數據大小或其他環境變化之間看似不穩定。

memcpy還有一個臭名昭着的例子:該標準禁止重疊內存輸入,並且在某些時候,glibc的實現使用它來進行微小的有爭議的優化。不符合要求的代碼開始失敗,用戶開始聽到strange sound on mp3 flash websites,然後是涉及Linus Torvalds和Ulrich Drepper的heated debate

故事的精神在於:遵循標準強加的要求,即使它現在正常工作,而且這個要求對你沒有任何意義。也很高興有這樣一個詳細的標準。

2

MPI標準包含許多要求,這些要求通常不會被實施嚴格檢查,主要是出於性能原因。理由是,根據標準,任何正確的程序在給定一系列寬鬆約束的情況下也是正確的。依賴這種特定於實現的行爲會導致不可移植的代碼並違背標準。

有很多合理的理由要求不相交的發送段。立即可見的是與MPI_Gatherv對稱。對於後者,段必須是不相交的,否則聚集之後的內存內容將取決於底層接收操作的順序。由於在典型的MPI程序中,散點通常通過聚集進行鏡像,如果相同的約束適用於聚集和散點,則可以重新使用計算出的偏移量和計數數組。一個不太明顯的原因是,在某些體系結構中,網絡設備可能不允許從重疊內存區域同時讀取數據。

由於非標準MPI行爲很容易在開發過程中蔓延到程序代碼中,因此可能需要使用像我們的MUST這樣的工具來檢查程序的正確性。

+0

感謝您的洞察力。 –