2015-12-06 216 views
0

與普通的Sendrecv操作相反,我明白_replace使用相同的內存位置,計數和數據類型。Sendrecv_replace冗餘?

經過一番閱讀,我發現它應該防止緩衝區重疊,但不能Sendrecv也服務於相同的目的?

任何人都可以解釋操作後的數據是怎麼回事?

典型的示例將是很有益

感謝您的MPI_SENDRECV_REPLACE

回答

3

覺得作爲一個方便的功能。 MPI_SENDRECV要求兩個緩衝區不相交 - 它不能在重疊的緩衝區上運行。這意味着需要一個單獨的接收緩衝區,即使當真正想要實現的是將發送緩衝區的內容與另一個等級的內容交換時。爲了實現使用MPI_SENDRECV這樣的交流,人會做這樣的事情(在僞代碼):

populate data buffer "data" 
allocate receive buffer "recv" 
call MPI_SENDRECV(data, count, type, recv, count, type) 
copy "recv" over "data" 
deallocate "recv" 

這可能變得單調乏味,尤其是如果需要在整個程序中的多個位置,更重要的是,如果該數據類型是非連續的(即C/C++中的一列矩陣)。解決方法是使用MPI_SENDRECV_REPLACE,它在內部執行與上述僞代碼等效的操作,並正確處理非連續類型。

我很難想到這種交換的常見用例。在大多數情況下,例如對於光環交換,通常的發送 - 接收操作具有不相交的緩衝區就足夠了。