我有类似
的东西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;并看看有人已经回答了吗?
答案 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
是阻塞函数。由于您不包含发送函数,因此很难分辨出导致阻塞的原因(但鉴于错误消息可能就是这种情况)。我建议看(他似乎在这里活跃)Hristo Ilieve。 MPI中最困难的事情之一就是阻塞。一种可以确保所有内容都被捕获的方法是使用MPI_Recv
,尽管我主要使用它进行调试。如果您关心速度,那么传递单个整数并不是一个好主意,除非您使用它进行索引。如果您希望发送不均匀的块,也可以使用MPI_Barrier
。如果您要发送MPI_Scatterv
的相同部分,您可能会尝试buffer
。
我发现写下代码的某些部分有助于确保它们不会相互阻塞。