我遇到了一个大问题。 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,则程序崩溃。 它不依赖于进程数。 任何提示?
答案 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。