2012-06-04 41 views
3

我有一個的數組,所有等級的(假設爲10)。數組中的某些值包含處理器的等級。例如...使用MPI合併來自所有等級的陣列

Proc 1: [1 0 0 0 0 1 0 0 0 1] 

Proc 2: [0 2 2 0 0 0 0 2 2 0] 

Proc 3: [0 0 0 3 3 0 3 0 0 0] 

現在什麼是最有效的方式(使用MPI-2),所有處理器具有以下陣列

[1 2 2 3 3 1 3 2 2 1] 

可以被認爲是所有的總和結束數組(分佈在所有級別)。性能非常重要,因爲我想在1K +內核上快速完成此任務。

回答

9

這是可行的MPI_Allreduce()MPI_SUMMPI_MAX運營商。請參閱MPI_Allreduce的文檔。它應該以給定架構的最佳可能方式之一來實現。

int arr_a[LEN], arr_b[LEN]; 
... 
// Fill in arr_a 
MPI_Allreduce(arr_a, arr_b, LEN, MPI_INT, MPI_SUM, MPI_COMM_WORLD); 
// Result is now in arr_b 

或者如果短期內存,你可以使用就地操作,但會傷害性能:

MPI_Allreduce(MPI_IN_PLACE, arr_a, LEN, MPI_INT, MPI_SUM, MPI_COMM_WORLD); 
+0

感謝您的回答。我用sum作爲例子,因爲我想不出任何更好的東西。我猜它是最好的選擇。 – stali