【发布时间】:2012-12-17 05:57:03
【问题描述】:
我的问题很简单。当使用 MPI_Sendrecv 时,它会系统地生成一个段错误。我之前在使用 2D 数组和基本的 MPI_Send 时遇到了同样的问题,但最终解决了。当我尝试在最后一种情况下使用相同的解决方案时,这并没有改变任何东西。因此,我正在寻求帮助!
所以基本上,我通过这段代码分配我的所有矩阵:
double**
allocateMatrix(int rows, int cols)
{
double **M; // Row pointer
double *Mdata; // Where data will be actually storde
M = calloc(rows, sizeof *M);
Mdata = calloc(rows*cols, sizeof(double));
int i;
for (i = 0; i < rows; ++i)
M[i] = Mdata+ i*rows;
return M;
}
我这样做是因为我读到 MPI_Sendrecv 不应该处理非连续数据...
这是我得到错误的地方:
double **submtx;
submtx = allocateMatrix(submtx_dim, submtx_dim);
/*
...
*/
MPI_Sendrecv(&(submtx[0][0]), 1, left_col, neighbours[0], LEFT_COL,
&tmp_rcol, SUB_MTX_SIZE, MPI_DOUBLE, neighbours[0], RIGHT_COL,
my_grid, MPI_STATUS_IGNORE);
我知道它测试错误来自给 MPI_Sendrecv 的第一个参数的语法。我使用 MPI 子数组和一个网格加上一个 shift 来让我的邻居在网格上,但是这个代码已经在一个基本版本上工作,分别使用 Send/Recv。唯一的变化是用 MPI_Sendrecv 调用替换了 Send/recv 调用,以简化代码......所以我认为不需要整个代码。
有什么想法吗?
我试过了:
MPI_Sendrecv(&submtx, ...
MPI_Sendrecv(submtx, ...
这些都不起作用,我仍然在这条线上遇到分段错误。
【问题讨论】:
-
M = calloc(rows, sizeof *M);(但在您的特定平台上,指针和双精度值的大小可能相同。 -
哦,是的,确实是的...好吧,它没有改变任何东西,因为它们的大小相同,但无论如何这是一个相当大的错误,所以谢谢=)
-
我的答案中的表格不太容易出错。 (因为 *M 直接从预期对象获取 sizeof 信息)它适用于任何类型。
-
是的,你是对的,这就是我想在上面的评论中说的,即使它在这种情况下有效,也是一个错误。
标签: c multidimensional-array segmentation-fault mpi