MPI for C ++,我的MPI_Sendrecv不起作用

时间:2014-01-19 11:03:18

标签: mpi

我遇到了一个大问题。 My_Sendrecv阻塞并且通常程序不起作用。 假设每个进程都有变量

int part_N, part_S, part_E, part_O;
int loc_r[rank], loc_c[rank];

这是我的代码:

std::vector<int> ssx(loc_r[rank],0), rsx(loc_r[rank],0), sdx(loc_r[rank],0), rdx(loc_r[rank],0);
std::vector<int> sup(loc_c[rank],0), rup(loc_c[rank],0), sdwn(loc_c[rank],0), rdwn(loc_c[rank],0);


  MPI_Sendrecv(&ssx[0], loc_r[rank], MPI_INT, part_O, 0, &rsx[0], loc_r[rank], MPI_INT, part_O, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  MPI_Sendrecv(&sdx[0], loc_r[rank], MPI_INT, part_E, 1, &rdx[0], loc_r[rank], MPI_INT, part_E, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  MPI_Sendrecv(&sup[0], loc_c[rank], MPI_INT, part_N, 2, &rup[0], loc_c[rank], MPI_INT, part_N, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  MPI_Sendrecv(&sdwn[0], loc_c[rank], MPI_INT, part_S, 3, &rdwn[0], loc_c[rank], MPI_INT, part_N, 3, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

请注意,合作伙伴变量可以是相同的,即同一过程中的part_O = part_E。 这是问题吗?

希望你能帮助我!

编辑: 问题似乎是内存的分配。这就像我可以分配向量或数组最多5个整数元素;例如,如果loc_r [rank]大于5,则程序崩溃。 它不依赖于进程数。 任何提示?

1 个答案:

答案 0 :(得分:2)

代码阻塞,因为sendrecv没有正确配对。

在我看来,对于您的具体情况,以笛卡尔分布模式实施循环通信的正确方法如下:

MPI_Sendrecv(&ssx[0], loc_r[rank], MPI_INT, part_O, 0, &rdx[0], loc_r[rank], MPI_INT, part_E, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Sendrecv(&sdx[0], loc_r[rank], MPI_INT, part_E, 1, &rsx[0], loc_r[rank], MPI_INT, part_O, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Sendrecv(&sup[0], loc_c[rank], MPI_INT, part_N, 2, &rdwn[0], loc_c[rank], MPI_INT, part_S, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Sendrecv(&sdwn[0], loc_c[rank], MPI_INT, part_S, 3, &rup[0], loc_c[rank], MPI_INT, part_N, 3, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

也就是说,看着第一个sendrecv,“我向WEST发送LEFT帧并从EAST接收右侧帧”。一个注意事项:我建议只使用一个“坐标系统”:左右上下或sx-dx-su-giu :)或W-E-N-S ......

另请注意,如果您不能与给定方向进行任何通信,则可以将part_X分配给特殊值MPI_PROC_NULL