gpt4 book ai didi

c - 使用带有二维连续数组的 MPI_Sendrecv 的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:52:08 26 4
gpt4 key购买 nike

我的问题很简单。使用 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, ...

这些都不起作用,我仍然在这一行遇到段错误。

最佳答案

MPI_Sendrecv 需要一个指向数据缓冲区的指针作为第一个参数 (void *)

http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Sendrecv.html

所以,试试这个

double* // pointer to double (not pointer to pointer)
allocateMatrix(int rows, int cols)
{
return calloc(rows * cols, sizeof(double));
}

后来

double *submtx;
submtx = allocateMatrix(submtx_dim, submtx_dim);

/*
...
*/

MPI_Sendrecv(submtx,....

我想注释区域在矩阵中写入了一些东西......

要访问 r 行和 c 列中的值,请执行此操作

smbmtx[c + r * submtx_dim] = 1.234;

关于c - 使用带有二维连续数组的 MPI_Sendrecv 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14129297/

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