0

我有类似的东西

while(j<nOSlaves)
        {
            //Iterate through all the slaves.
            for(int i=1;i<nOSlaves && j<nOSlaves;i++)
            {
                //Create a taskMessage which contains length and distance.
                MPI_Status st;
                MPI_Recv(&buffer, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &st);

                if (buffer > 0)
                { //Handle the message.... }
            }
        }

现在的问题是我必须等待每个人直到消息到达,我希望它更快并尝试异步。

MPI_Irecv(&buffer, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &rq);

            int flag = 0;
            MPI_Test(&rq, &flag, &st);

            //If the asynchronous message has been received advance, else try again later.
            if (flag)
            { //Handle the message.... }

但是在 for 的每次迭代之后,我都会丢失请求。有没有办法遍历所有“奴隶”并查看是否有人已经回答?

4

1 回答 1

0

有了这个错误,你就有了一些障碍。您的发送和接收不是同时发生的。

MPI_Irecv非阻塞接收函数也是MPI_Recv阻塞函数。由于您不包含发送功能,因此很难判断是什么导致了此处的阻塞(但鉴于该错误消息,这很可能是这种情况)。我建议查看Hristo Ilieve的(他似乎在这里很活跃)教程。MPI 中最困难的事情之一就是阻塞。MPI_Barrier尽管我主要使用它进行调试,但可以确保一切都赶上的一种方法是使用它。如果您关心速度,那么传递单个整数不是一个好主意,除非您将它用于索引。MPI_Scatterv如果您想发送不均匀的块,也可以使用。如果您要发送相同的部分buffer,看起来像你,你可以试试MPI_Bcast

我发现写下代码的某些部分以确保它们不会相互阻塞会有所帮助。

于 2016-06-30T02:47:10.013 回答