2014-11-02 66 views
1

我需要使用MPI_Alltoallv,但我的sendcounts(第二個參數)是一個長整型數組。然而,MPI_Alltoallv要求它是一個整數數組。我不確定這是否是一個限制。有什麼辦法可以解決這個問題嗎?MPI_alltoallv與sendcounts作爲long(非整數值)數組

+1

將長整型轉換爲整數?還是你真的發送如此龐大的數據,以至於你只能以長整數表達發送數量?我不認爲在這種情況下MPI可以被說服或被迫正確解釋長整數。 – 2014-11-03 14:38:02

+0

這不是MPI,它可以防止將long int向量轉換爲int向量。這是無效的C.如果int和long相等,你可能會很幸運,但它們往往不是。 – Jeff 2015-12-12 06:00:46

回答

2

通常,如果您的數據太大以至於不適合整數大小,那麼使用普通的MPI庫發送數據可能並不安全。有一些非標準的工作可以讓它成爲可能,但是如果你想堅持官方支持的方法,有幾種方法可以安全地處理它。

  • 使用MPI數據類型。這些將允許您將數據封裝到可以(理論上)任意大的數據類型中。它們使用起來可能有點複雜,但如果你只發送大的連續內存區域,這並不難。
  • 發送您的數據在多個塊。如果您將郵件限制爲尺寸INT_MAX,則可以完全避免該問題。你只需要發送更多的消息。
  • 使用BigMPI,這是一個由Jeff Hammond提供的庫,它封裝了發送大量數據的一些粗糙性。我不認爲他在調用該代碼生產就緒,但你可以看看它是否是你需要的。
+1

我要任命你爲BigMPI拓展總監:-) – Jeff 2015-12-12 06:08:25

2

我喜歡Wes的完整答案。如果你想要的程序可能會如何處理大計數一個具體的例子,這裏就是我如何做到了在ROMIO:

http://git.mpich.org/mpich.git/blob/HEAD:/src/mpi/romio/adio/common/utils.c

值得指出,那就是,如果您要發送數據的多個千兆字節, MPI_ALLTOALLV不會比一堆MPI_Isends和MPI_Irecv調用更有效率。

+2

雖然你最後的陳述是完全有效的,但我仍然建議不要重新實施MPI_Alltoallv或任何其他MPI集體。調試關於InfiniBand驅動程序的神祕消息不能創建新的隊列對(例如,由於同時建立的連接和/或映射的緩衝區太多,導致HCA的內存轉換表中的所有條目吃光了)比嘗試克服參數類型更糟糕問題。 – 2014-11-03 19:30:03

+0

可以使用send-recv重新實現alltoallv,並且不會立即將所有n個消息放入隊列中;-) – Jeff 2015-12-12 06:02:23

0

除了別人出色的回答之外,你可以做的另一件事是使用MPI_Neighbor_alltoallv,它具有MPI_Aint位移。我已經在BigMPI中使用了這個技巧,您可以輕鬆地重新使用我的comm-to-(dist-graph-comm)實用程序功能。

請注意,不保證long和MPI_Aint是等價的。這對我的機器上的MPICH 3.2是正確的,但在編寫可移植代碼時不能依賴它。請複製你的位移矢量,或者如果你使用鄰域v-集體,將它們改爲MPI_Aint。