【问题标题】:MPI - Asynchronous Broadcast/GatherMPI - 异步广播/收集
【发布时间】:2012-10-10 00:40:52
【问题描述】:

我有一个项目需要“n”个进程才能工作,直到问题得到解决。每个从属进程执行相同的代码。当出现某种情况时,该进程需要以非阻塞的方式通知所有其他进程。其他进程也需要以非阻塞方式接收此消息。

有没有办法不用线程单独循环?

【问题讨论】:

    标签: c++ process mpi


    【解决方案1】:

    我已经有一段时间没有使用 MPI 了。但是 I 函数是非阻塞的。也许是这样的:

    int comm_size = comm.Get_size();
    int comm_rank = comm.Get_rank();
    
    int* data = new int[comm_size];
    
    while (some_condition)
    {
        //During each iteration, check for messages from other nodes
        for (int node = 0; node < comm_size; node++)
        {
            if (node != comm_rank)
            {
                if (comm.Iprobe(node, TAG_NUM))
                {
                    comm.Irecv(data[node], 1, MPI_INT, node, TAG_NUM);
                }
            }
        }
    
        if (some_other_condition)
        {
            //Send the message to every node
            for (int node = 0; node < comm_size; node++)
            {
                if (node != comm_rank)
                {
                    comm.Isend(data[node], 1, MPI_INT, node, TAG_NUM);
                }
            }
        }
    
        //do normal work here.
    }
    
    delete [] data;
    

    【讨论】:

    • 是的,这正是我最终所做的。我不认为这是真正的异步,因为它仍然必须循环并发送所有消息,但对于我正在做的事情来说已经足够了。谢谢。
    • 我遇到了类似的问题:以异步方式广播数据(所有核心的数据都是最新的并不重要)。我提出的实现的一个问题是它使用了大量带宽:每条消息都发送 p-1 次。他们是否没有办法(使用位掩码或其他东西)通过网络尽可能便宜地发送消息(例如,如果我们使用交换机,交换机可以完成复制工作)。我正在使用 MPJ Express。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2020-04-01
    • 1970-01-01
    • 2019-09-22
    • 2011-12-31
    • 2013-09-27
    相关资源
    最近更新 更多