MPI_Scatter - 无法按预期工作(MPI_Scatter - not working a

2019-10-19 04:14发布

我使用MPI写我的第一个程序,我有困难时期试图发送正确使用MPI_Scatter数据到其它进程,修改它们和接收使用MPI_Gather值。 代码如下:

int** matrix;
int m = 2, n = 2;
int status;

// could have been int matrix[2][2];

matrix = malloc(m*sizeof(int*));

for(i = 0; i < m; i++) {
  matrix[i] = malloc(n*sizeof(int));
}

matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[1][0] = 2;
matrix[1][1] = 3;

MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank ); 
MPI_Comm_size( MPI_COMM_WORLD, &size );

printf("My name is %d out of %d\n", rank, size);

MPI_Scatter(&matrix, 1, MPI_INT, &status, 1, MPI_INT, 0, MPI_COMM_WORLD);

printf("My name is %d and my status is %d\n", rank, status);

status += 1;

MPI_Gather(&status,1,MPI_INT,&matrix,1,MPI_INT,0,MPI_COMM_WORLD);

结果如下:

My name is 0 out of 4
My name is 1 out of 4
My name is 1 and my status is 0
My name is 2 out of 4
My name is 2 and my status is 120
My name is 0 and my status is 17773264
My name is 3 out of 4
My name is 3 and my status is 0

MPI_Gather后,当我尝试打印矩阵的内容,我得到段错误...

这是不是我所期望......我怀疑,这个问题是我有一个二维数组,并要送单值。 这是正确的吗? 如何纠正呢?

Answer 1:

究其原因,段错误是,你分配一个二维数组,但有它使用连续的内存不能保证。 因此,分配一维数组和分散/集中它。 这也解释了为什么一些节点得到错误的数据。

您指定的接收变量status ,我觉得误导性,因为它会保存接收到的值(一个或多个)。 所以,你必须正确地分配它当一个节点接收到一个以上的值的情况。 另外我建议将其重命名为如local_matrix或相似。

侧节点:你分配matrix所有节点上,但你应该只在单个节点上分配。 这可以通过检查目前的排名和检查后放置障碍来完成。 此外,我认为你也打印所有节点上,但是这个代码是不可见的。 至于配置,打印应该只在一个节点上要做的事。

也看看如何MPI_Scatter和MPI_Gather从C中? 这也解释了它相当不错。



文章来源: MPI_Scatter - not working as expected
标签: c mpi openmpi