gpt4 book ai didi

c - MPI_Scatter - 未按预期工作

转载 作者:太空宇宙 更新时间:2023-11-04 02:05:42 30 4
gpt4 key购买 nike

我正在使用 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 之后,当我尝试打印矩阵的内容时出现段错误...

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

最佳答案

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

您将接收变量命名为 status 我认为它具有误导性,因为它将保存接收到的值。因此,当节点接收到多个值时,您必须正确分配它。另外我建议将其重命名为例如local_matrix 或类似的。

侧节点:您在所有节点上分配矩阵,但您应该只在单个节点上分配。这可以通过检查当前等级并在检查后放置障碍来完成。此外,我假设您还在所有节点上打印,但此代码不可见。与分配一样,打印也应该只在一个节点上完成。

另请查看 How are MPI_Scatter and MPI_Gather used from C?这很好地解释了它。

关于c - MPI_Scatter - 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20891830/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com