2014-02-14 17 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

相关问题