MPI忙等待回应

时间:2016-06-30 02:19:54

标签: c++ asynchronous synchronization mpi busy-waiting

我有类似

的东西
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.... }

但是在每次迭代之后我都会失去请求。 有没有办法迭代所有&#34;奴隶&#34;并看看有人已经回答了吗?

1 个答案:

答案 0 :(得分:0)

有了这个错误你有一些阻止。您的发送和接收不会同时发生。

所以public Boolean nameExists(String name){ if (getUserStatus(name) != null){ return true; } else{ return false; } } public String getUserStatus(String name){ DatabaseReference tmpRef = FirebaseDatabase.getInstance().getReference().child("userStatuses").child(name); ValueEventListener v = new statusesListener(); tmpRef.addValueEventListener(v); tmpRef.removeEventListener(v); return userStatus; } private class statusesListener implements ValueEventListener{ public void onDataChange(DataSnapshot snap){ userStatus = (String) snap.getValue(); } public void onCancelled(DatabaseError error){ } } 是非阻塞接收函数,而MPI_Irecv是阻塞函数。由于您不包含发送函数,因此很难分辨出导致阻塞的原因(但鉴于错误消息可能就是这种情况)。我建议看enter image description here(他似乎在这里活跃)Hristo Ilieve。 MPI中最困难的事情之一就是阻塞。一种可以确保所有内容都被捕获的方法是使用MPI_Recv,尽管我主要使用它进行调试。如果您关心速度,那么传递单个整数并不是一个好主意,除非您使用它进行索引。如果您希望发送不均匀的块,也可以使用MPI_Barrier。如果您要发送MPI_Scatterv的相同部分,您可能会尝试buffer

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