2011-10-19 207 views
1

我們已經開發了一個C++算法庫,它允許用戶實現自己的數據類型以在各個算法之間共享數據(也由用戶實現)。 這可以正常工作,但我們希望在庫級別提供並行化。各個算法應該在分佈式內存機器的不同節點上並行執行。MPI如何發送和接收未知數據類型

我們決定使用MPI進行並行化,因爲它可以用於分佈式和共享內存機器而無需更改代碼。 不幸的是,我們現在要解決的問題是如何在節點之間分配用戶實現的數據類型。我們有以下問題:

  • 我們不知道數據可能有多大,它甚至可能會隨着運行而改變。
  • 我們不知道數據結構中有什麼數據。
  • 數據量可能非常大,最高可達1GB(這應該與MPI沒有問題)
  • 用戶在實現並行執行的數據類型或算法時應該看不到任何區別(對於算法實際上沒有問題)

是否有可能使用MPI在節點之間共享這些數據,或者有可用的方法,這可能更適合這類問題。 我們希望有一個至少可以在共享內存機器上工作的解決方案,但是我們希望有一個可以在共享和分佈式內存機器上無需更改代碼的解決方案。

+0

你有沒有遇到過boost.mpi?除非我誤解,否則應該按照你的要求去做。 – Tom

+0

Boost.mpi是一個圍繞MPI的C++包裝器,但我仍然存在這樣的問題,即:「具有映射到MPI數據類型的類型」可以被傳輸,而這可能不是這種情況,因爲我沒有定義數據類型。 – tune2fs

+0

你問MPI是否可以發送任意數據結構,只要給它們一個指針(或類似的構造)? – PlasmaHH

回答

3

是的,你可以用MPI做到這一點,但不是,MPI不能爲你自己做。

無論您是將此數據發送到另一個節點還是寫入磁盤,在某些時候您需要明確描述內存中的數據結構佈局,以便它可以是serialized。如果你通過MPI(或任何其他通信庫)的指針,它不知道該指針的另一端是什麼,所以它無法遍歷數據結構來複制其內容。

您可以將參數編組爲簡單的舊數據(手動或MPI_PACK等),也可以創建一個MPI數據類型,它描述該特定實例在內存中的數據佈局,並將數據複製。另外,你需要重定向數據結構中的指針。 Boost serialization可以幫助你解決所有這些問題。

+0

感謝您的回覆,但我不知道數據結構如何,因爲我沒有自己實現它。這也是我們爲什麼開發這個庫的原因,以允許用戶使用他自己的數據結構。是否有可能用MPI_PACK打包未知數據? – tune2fs

+0

不,只有使用fwrite()才能將任意數據結構寫入文件。一路上,有人需要能夠溝通如何序列化數據結構。 –

+0

所以這意味着我們不能使用MPI。希望有一些共享內存機器的方法,可以交換指針。 – tune2fs