2016-05-15 26 views
1

我想知道哪個是確保獨佔訪問MPI中n個進程之間共享資源(如內存窗口)的最佳方式。我試過MPI_Win_lock & MPI_Win_fence,但它們看起來並不像預期的那樣工作,即:我可以看到多個進程同時進入關鍵區域(MPI_Win_lock & MPI_Win_unlock包含MPI_Get和/或MPI_Put)之間的代碼。MPI:確保獨佔訪問共享內存(RMA)

我希望你的建議。謝謝。

回答

1

在MPI 2中,您無法真正做到原子操作。這是在MPI 3中使用MPI_Fetch_and_op引入的。這就是您的關鍵數據被修改的原因。

此外,請注意'MPI_Win_lock'。如上所述here

此例程的名稱是誤導性的。特別是,這個例程不需要阻塞,除非目標進程是調用進程。

實際阻塞的進程是MPI_Win_unlock,也就是說只有從這個過程返回後,你可以肯定的是,從putget的值是否正確。也許這是更好地描述here

MPI被動目標操作被組織到由MPI Win鎖和MPI Win解鎖呼叫括起來的訪問時期。聰明的MPI實現[10]將所有的數據移動操作(放置,獲取和累積)合併到解鎖時發生的一個網絡事務中。

這同樣的文件也可以爲您的問題提供解決方案,即關鍵數據不是原子寫入。它通過使用互斥體來實現,這是一種確保當時只有一個進程可以訪問數據的機制。

我建議您閱讀本文:他們提出的解決方案並不難實現。