c - C语言,使用MPI Reduce函数,让进程0求所有进程的秩和
问题描述
我编写这段代码是为了尝试使用 C MPI 找到排名的总和,它在下面给了我这个错误。
我似乎无法找到问题所在,有人知道我做错了什么吗?
我能够将整数 X 从进程 0 传递到 1 并广播它,但是对于 MPI_Sum 它说我有分段错误(11)并给我错误。
我应该如何解决这个问题?
[gauss:31436] *** Process received signal ***
[gauss:31436] Signal: Segmentation fault (11)
[gauss:31436] Signal code: Invalid permissions (2)
[gauss:31436] Failing at address: 0x400960
[gauss:31436] [ 0] /lib64/libpthread.so.0(+0xf370)[0x2aaaaafae370]
[gauss:31436] [ 1] /cm/shared/apps/openmpi/gcc/64/1.10.3/lib64/openmpi/mca_pml_ob1.so(mca_pml_ob1_recv+0xc9)[0x2aaab0e38349]
[gauss:31436] [ 2] /cm/shared/apps/openmpi/gcc/64/1.10.3/lib64/libmpi.so.12(MPI_Recv+0x13c)[0x2aaaaad337bc]
[gauss:31436] [ 3] lab2[0x400b21]
[gauss:31436] [ 4] /lib64/libc.so.6(__libc_start_main+0xf5)[0x2aaaab1dcb35]
[gauss:31436] [ 5] lab2[0x400989]
[gauss:31436] *** End of error message ***
#include <stdio.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char* argv[])
{
int my_rank;
int msgtag = 0;
int x;
int my_rank_n = 0;
int sum_rank;
int p;
MPI_Status *status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
for (int i = 0; i < p; i++)
{
if (my_rank == 0)
{
x = 10;
MPI_Send(&x, 1, MPI_INT, 1, msgtag, MPI_COMM_WORLD);
}
else if (my_rank == 1)
{
MPI_Recv(&x, 1, MPI_INT, 0, msgtag, MPI_COMM_WORLD, status);
}
MPI_Bcast(&x, 1, MPI_INT, msgtag, MPI_COMM_WORLD);
}
if(my_rank == 2)
{
printf("X is %d\n",x);
}
for (int i = 0; i < p; i++)
{
my_rank_n = my_rank;
MPI_Reduce(&my_rank_n, &sum_rank, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
}
if(my_rank == 0)
{
printf("Sum of Rank is %d\n", sum_rank);
}
MPI_Finalize();
return 0;
}
解决方案
错误在MPI_Recv()
,您没有status
正确使用该参数。
它应该是
MPI_Status status;
MPI_Recv(..., &status);
推荐阅读
- angular - 从 Ionic 访问 ASP.NET Core WebApi 时出错
- angular - 带有逗号分隔值的 NgFor
- javascript - NoUISlider 与输入绑定
- android - 反编译签名的 apk,使用与原始签名 apk 不同的密钥库修改和重新编译?
- r - ggplot2 多个绘图,具有共享图例、一种背景颜色、1 个主标题和 3 个副标题以及非标准布局
- javascript - 如何让用户能够按“Enter”来使用 React 进行搜索?
- c# - 如何知道我的项目的某些线程是否正在运行或完成?
- r - ggplot 如何使用箱线图和多个变量对类别进行排序?
- java - 从随机 HashMap 中递减值
- vue.js - vue.js 动态组件状态