2014-02-14 18 views
2

我正在處理使用MPI並行化Conways的生命遊戲(在C++中)。我必須從輸入中讀取一個(非常大的)矩陣,然後逐行將它分散到各個片中,然後並行處理每個片。我遵循的想法是讓只有一個進程處理I/O的東西。特別是,從文件中讀取進程0並將初始數據保存到所說的RxC矩陣中,以便在(R/P)×C「切片矩陣」中的進程中散佈。 現在,當我執行例程MPI_Scatter時,編譯器的投訴是因爲「大矩陣」僅在第一個進程中分配。爲了使事情順利進行,我必須在整個過程中分配大矩陣,即使這些矩陣仍然是空白的。這是普通的,還是我做錯了什麼?有沒有辦法避免爲每個過程分配一個空白的,無用的矩陣? 謝謝你們!MPI_Scatter:爲什麼我必須在所有進程中分配內存?

+2

將每個單獨的MPI過程想象成一個單獨的程序,它具有自己的變量,地址空間* *等*。如果你需要一個進程內存中的變量(比如數組),那麼你肯定必須在該進程的內存中爲它分配空間。但是,通常情況下,您不應該在每個進程的內存中爲全局數組分配空間,只能爲該數組的本地部分分配空間。用你的非常合理的程序設計,你可以將數組讀入進程0,然後發送(*消息傳遞*)片給每個將要完成工作的進程。 –

回答

2

你不需要在任何地方分配「大矩陣」,但MPI_SCATTER的確需要你在所有的隊伍中分配一些內存。

如果你要撒這樣的數據:

散射之前:

rank 0 - 1 2 3 4 

散射後:

rank 0 - 1 
rank 1 - 2 
rank 2 - 3 
rank 3 - 4 

您需要爲每個級別一個int分配空間(而不是全部4個)。

0

您不必在任何地方分配大矩陣,但需要在任何地方聲明大矩陣變量。試試這個:

int* big_matrix; 
if(process_id == 0) { 
    big_matrix = (int*) malloc(big_number * sizeof(int)); 
    // fill the big matrix with values 
} 
int* part_of_matrix = (int*) malloc(small_number * sizeof(int)); 
MPI_Scatter(big_matrix, small_number, MPI_INT, part_of_matrix, small_number, MPI_INT, 0, MPI_COMM_WORLD); 

至少這是一個辦法做到這一點的C.你可能需要的big_matrix初始化爲0或東西在C++。

+0

對不起,我有疑問,不應該聲明爲'int ** big_matrix'? – Caramelleamare

相關問題