【问题标题】:MPI_Scatter segmentation fault (signal 11)MPI_Scatter 分段错误(信号 11)
【发布时间】:2015-08-10 02:33:05
【问题描述】:

我正在尝试并行化一些计算矩阵的代码,但我遇到了分段错误错误。我已经调试了代码,但是我找不到问题。

这是我声明矩阵的 sn-p:

double **A, **B, **C, *tmp1,*tmp2,*tmp3;
int N;
int myrank, P, from, to;

N = 100;

tmp1 = (double *) malloc (sizeof(double ) * N * N);
tmp2 = (double *) malloc (sizeof(double ) * N * N);
tmp3 = (double *) malloc (sizeof(double ) * N * N);
A = (double **) malloc (sizeof(double *) * N);
B = (double **) malloc (sizeof(double *) * N);
C = (double **) malloc (sizeof(double *) * N);

from = myrank * N/P;
to = (myrank+1) * N/P;

然后这里是我初始化 MPI 的地方

MPI_Init (&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD, &P);

但不知怎的,我无法分散……

MPI_Bcast(B, N*N, MPI_INT, 0, MPI_COMM_WORLD);

printf("Rank: %d\n", myrank);

MPI_Scatter(A, N*N/P, MPI_INT, &A[from], N*N/P, MPI_INT, 0, MPI_COMM_WORLD);

我不能在这里写所有的代码,因为我不被允许......但问题在于 Scatter it self。我做错了什么?

【问题讨论】:

  • 考虑让其他人尽可能轻松地帮助您。即不要转储看似无关代码的 sn-ps。并且不要在这里倾倒你的整个程序。相反,尝试删除与问题无关的代码块,同时仍然重现您的错误。即尝试生成short, self contained, compilable example。然后粘贴。您在此处粘贴的内容如此脱节,大多数人甚至都不想阅读它。
  • 变量P在没有被初始化的情况下被使用!

标签: c parallel-processing segmentation-fault mpi


【解决方案1】:

您不能直接发送二维矩阵 (double**)。相反,您必须传递实际数据的地址:&A[0][0]。对于接收,您还必须将地址传递到实际存储数据的位置。在您的情况下,这将是:&A[from][0] 而不是 &A[from]

试试这个作为分散:

MPI_Scatter(&A[0][0], N*N/P, MPI_INT, &A[from][0], N*N/P, MPI_INT, 0, MPI_COMM_WORLD);

另一方面,在接收过程中,A 中除接收到的值之外的所有值都将保持无效。您可能需要考虑创建所需大小的单独接收缓冲区:

double* local_A = (double*)malloc(sizeof(double)*N*N/P);
MPI_Scatter(&A[0][0], N*N/P, MPI_INT, local_A, N*N/P, MPI_INT, 0, MPI_COMM_WORLD);

【讨论】:

  • 感谢您的回答。我已经做出了改变,现在它可以工作了,但只适用于 1 个处理器。当我使用 2 个或更多进程时,我仍然有分段错误错误
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 2017-10-24
  • 2016-05-08
  • 2011-08-30
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
相关资源
最近更新 更多