我尝试使用OpenMPI实现广度优先搜索(如果相关的话,在C ++上)我几乎可以运行任何东西,除了最后。我不知道何时/如何停止执行。
我使用2D数组跟踪图中的所有边,如下所示:
graph[start][finish] - there is an edge from vertex start to vertex finish
我目前的算法是:
我真的不知道如何改变第五步,以便一切都停止。我在一个小图上测试(所以我可以很容易地跟踪发生的事情)并且它很快就会停止,这意味着所有非根进程都会在第3步停留,因为已找到每个最小距离并且没有进程正在发送更新
我没有包含我的代码,因为算法应该很容易理解,我的问题与算法有关,而不是代码本身。
答案 0 :(得分:0)
我找到的解决方案是在4到5之间添加一个中间步骤,从而将更新从进程发送到根目录。
在每次迭代之后,进程p将向根发送消息,告知它是否更新了此迭代的距离。当所有进程“报告”他们没有更新距离时,他们将收到要停止的消息(从根目录)。
所以改变伪代码:
if (rank == 0) // root
{
distance = 0;
for each neighbor
send distance
vector<bool> status(no_processes - 1, true)
while (status contains one true value)
receive update from one process
update status
// status is full of false
send all STOP
}
else
{
distance = INT_MAX;
while (true)
{
receive message
if STOP
stop execution
status = false;
if (recv_distance + 1 < distance)
{
status = true
distance = recv_distance + 1;
for each neighbor
send distance
}
send status to root
}
}