2

我有一个使用 mpi 的 C++ 程序,它遵循典型的客户端服务器模型。客户端的每个 mpi 实例都连接到服务器的相应 mpi 实例。在我不得不进行一些增加延迟的测试(准确地说是增加了 1 秒的延迟)之前,这种方法的效果相对较好。

问题:有时服务器进程之一认为客户端未连接,但客户端认为它已连接。即使用gdb 后,服务器在accept() 处等待,但客户端在过去的connect() 处继续。因此,当服务器认为它没有连接时,客户端似乎认为它已经连接。

我最好的猜测是我需要在某处设置一个 sock-option,但是与其他程序员交谈和谷歌搜索并没有产生任何有用的结果。

编辑:有两组 MPI 进程(因此对 mpirun 的两个不同调用),accept() 和 connect() 调用用于套接字,它们位于两组 MPI 进程之间。它是openmpi。

代码(实际上来自别人的代码)[减少]:

客户端(连接代码):(m_socket 是实际的套接字)

    if (-1 == m_socket)
    {
            perror("cannot create socket");
            exit(EXIT_FAILURE);
    }


    memset(&addr, 0, sizeof(addr));

    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    res = inet_pton(AF_INET, host_ip, &addr.sin_addr);


    if (0 > res)
    {
            perror("error: first parameter is not a valid address family");
            close(m_socket);
            exit(EXIT_FAILURE);
    }
    else if (0 == res)
    {
            perror("error: second parameter does not contain valid IP address");
            close(m_socket);
            exit(EXIT_FAILURE);
    }

    //backoff 
    for (int sec = 1; sec < 20000; sec++ )
    {
            int ret;

            if (0 == (ret = connect(m_socket, (struct sockaddr *)&addr, sizeof(addr))))
            {

                    return;
            }

            sleep(1);

            close(m_socket);
            m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    }

    perror("connect failed");
    close(m_socket);
    exit(EXIT_FAILURE);

服务器:(m_socket 是实际的套接字)

    int socket = ::accept(m_socket, NULL, NULL);

    if(socket < 0)
    {
            fprintf(stderr, "accept() failed: %s\n", strerror(errno));
            close(m_socket);
            exit(EXIT_FAILURE);
    }
4

1 回答 1

0

看起来您正在尝试手动进行连接/接受,而不是使用 MPI。如果您尝试使用 MPI 进行连接,您可以查看 Deino ( http://mpi.deino.net/mpi_functions/MPI_Comm_accept.html ) 上的示例。

或者,您可能只需要查看 MPI 的更通用的教程(一些可在此处获得:http ://www.mcs.anl.gov/research/projects/mpi/tutorial/ )来了解通信的工作原理。大多数时候和应用程序不使用 Connect/Accept 进行通信,而是使用 MPI Communicators 来建立进程之间的通信机制。这是一个不同的模型(SPMD 与 MPMD 相对)。

于 2013-06-14T18:01:12.573 回答