BFS与OpenMPI

时间:2017-01-03 21:32:02

标签: c++ graph-theory breadth-first-search openmpi

我尝试使用OpenMPI实现广度优先搜索(如果相关的话,在C ++上)我几乎可以运行任何东西,除了最后。我不知道何时/如何停止执行。

我使用2D数组跟踪图中的所有边,如下所示:

graph[start][finish] - there is an edge from vertex start to vertex finish

我目前的算法是:

  1. Root的距离为0,其他的则为INT_MAX
  2. Root向所有邻居发送距离并停止
  3. 每个其他节点都会收到一段距离
  4. 如果新距离比当前距离更好(更小),则更新距离并向所有其他邻居发送新距离
  5. 从第3步开始永远重复
  6. 我真的不知道如何改变第五步,以便一切都停止。我在一个小图上测试(所以我可以很容易地跟踪发生的事情)并且它很快就会停止,这意味着所有非根进程都会在第3步停留,因为已找到每个最小距离并且没有进程正在发送更新

    我没有包含我的代码,因为算法应该很容易理解,我的问题与算法有关,而不是代码本身。

1 个答案:

答案 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
    }
}