我正在使用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 %dn", 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 %dn", 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之后,当我尝试打印矩阵的内容时,我得到分段错误…
这不是我的期望…我怀疑问题是我有一个二维数组,并希望发送单个值。 这是正确的吗? 怎么纠正这个?
分段错误的原因是,您正在分配2Darrays,但无法保证它使用连续内存。 因此,分配一维数组并分散/收集它。 这也解释了为什么有些节点会得到错误的数据。
您将接收变量status
命名为我发现误导,因为它将保留接收的值。 因此,当节点收到多个值时,您必须正确分配它。 另外我建议将其重命名为例如local_matrix
或类似的。
侧节点:您在所有节点上分配matrix
,但您应该只在单个节点上分配。 这可以通过检查当前等级并在检查后放置障碍来完成。 此外,我假设您还在所有节点上打印,但此代码不可见。 与分配一样,打印也应仅在一个节点上完成。
另请参阅如何使用C中的MPI_Scatter和MPI_Gather? 这很好地解释了它。
以上就是c/c++开发分享MPI_Scatter – 未按预期工作相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/523256.html