gpt4 book ai didi

error-handling - 在不同的通信器中收到 MPI 消息 - 错误的程序或 MPI 实现错误?

转载 作者:行者123 更新时间:2023-12-03 07:50:22 24 4
gpt4 key购买 nike

这是 this previous question of mine 的后续行动,其结论是程序是错误的,因此预期的行为是未定义的。

我在这里尝试创建的是一个简单的错误处理机制,为此我使用对空消息的 Irecv 请求作为“中止句柄”,将其附加到我的正常 MPI_Wait调用(并将其转换为 MPI_WaitAny ),以便在进程 0 发生错误并且无法再到达应该发布匹配 MPI_Recv 的情况下允许我解除阻塞进程 1 .

发生的事情是,由于内部消息缓冲,MPI_Isend可能会立即成功,而其他进程无法发布匹配的 MPI_Recv .所以没有办法取消它了。

我希望一旦所有进程调用 MPI_Comm_free我可以一劳永逸地忘记这条信息,但事实证明,情况并非如此。相反,它被传送到 MPI_Recv在下面的通讯器中。

所以我的问题是:

  • 这也是一个错误的程序,还是 MPI 实现(英特尔 MPI 4.0.3)中的一个错误?
  • 如果我把我的MPI_Isend调用MPI_Issend ,该程序按预期工作-至少在这种情况下我可以放心该程序是正确的吗?
  • 我在这里重新发明轮子吗?有没有更简单的方法来实现这一点?

  • 再次,非常感谢任何反馈!

    #include "stdio.h"
    #include "unistd.h"
    #include "mpi.h"
    #include "time.h"
    #include "stdlib.h"

    int main(int argc, char* argv[]) {
    int rank, size;
    MPI_Group group;
    MPI_Comm my_comm;

    srand(time(NULL));
    MPI_Init(&argc, &argv);

    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_group(MPI_COMM_WORLD, &group);

    MPI_Comm_create(MPI_COMM_WORLD, group, &my_comm);
    if (rank == 0) printf("created communicator %d\n", my_comm);

    if (rank == 1) {
    MPI_Request req[2];
    int msg = 123, which;

    MPI_Isend(&msg, 1, MPI_INT, 0, 0, my_comm, &req[0]);
    MPI_Irecv(NULL, 0, MPI_INT, 0, 0, my_comm, &req[1]);

    MPI_Waitany(2, req, &which, MPI_STATUS_IGNORE);

    MPI_Barrier(my_comm);

    if (which == 0) {
    printf("rank 1: send succeed; cancelling abort handle\n");
    MPI_Cancel(&req[1]);
    MPI_Wait(&req[1], MPI_STATUS_IGNORE);
    } else {
    printf("rank 1: send aborted; cancelling send request\n");
    MPI_Cancel(&req[0]);
    MPI_Wait(&req[0], MPI_STATUS_IGNORE);
    }
    } else {
    MPI_Request req;
    int msg, r = rand() % 2;
    if (r) {
    printf("rank 0: receiving message\n");
    MPI_Recv(&msg, 1, MPI_INT, 1, 0, my_comm, MPI_STATUS_IGNORE);
    } else {
    printf("rank 0: sending abort message\n");
    MPI_Isend(NULL, 0, MPI_INT, 1, 0, my_comm, &req);
    }

    MPI_Barrier(my_comm);

    if (!r) {
    MPI_Cancel(&req);
    MPI_Wait(&req, MPI_STATUS_IGNORE);
    }
    }

    if (rank == 0) printf("freeing communicator %d\n", my_comm);
    MPI_Comm_free(&my_comm);

    sleep(2);

    MPI_Comm_create(MPI_COMM_WORLD, group, &my_comm);
    if (rank == 0) printf("created communicator %d\n", my_comm);

    if (rank == 0) {
    MPI_Request req;
    MPI_Status status;
    int msg, cancelled;

    MPI_Irecv(&msg, 1, MPI_INT, 1, 0, my_comm, &req);
    sleep(1);

    MPI_Cancel(&req);
    MPI_Wait(&req, &status);
    MPI_Test_cancelled(&status, &cancelled);

    if (cancelled) {
    printf("rank 0: receive cancelled\n");
    } else {
    printf("rank 0: OLD MESSAGE RECEIVED!!!\n");
    }
    }

    if (rank == 0) printf("freeing communicator %d\n", my_comm);
    MPI_Comm_free(&my_comm);

    MPI_Finalize();
    return 0;
    }

    输出:
    created communicator -2080374784
    rank 0: sending abort message
    rank 1: send succeed; cancelling abort handle
    freeing communicator -2080374784
    created communicator -2080374784
    rank 0: STRAY MESSAGE RECEIVED!!!
    freeing communicator -2080374784

    最佳答案

    正如@kraffenetti 的上述评论之一所述,这是一个错误的程序,因为发送的消息与接收不匹配。即使消息被取消,它们仍然需要在远程端有一个匹配的接收,因为对于已发送的消息,取消可能不会成功,因为它们在取消完成之前已经发送(即这里的情况)。

    这个问题在 MPICH 的票上启动了一个线程,你可以找到 here有更多细节。

    关于error-handling - 在不同的通信器中收到 MPI 消息 - 错误的程序或 MPI 实现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23867637/

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