MPI_Reduce阻塞(或天然屏障)?

时间:2012-02-14 21:27:38

标签: mpi parallel-processing

我在C ++中有下面的代码片段,基本上使用经典的monte carlo技术来计算pi。

    srand48((unsigned)time(0) + my_rank);

    for(int i = 0 ; i < part_points; i++)
    {
            double x = drand48();

            double y = drand48();

            if( (pow(x,2)+pow(y,2)) < 1){ ++count; }
    }

    MPI_Reduce(&count, &total_hits, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

    MPI_Barrier(MPI_COMM_WORLD);

    if(my_rank == root)
    {
            pi = 4*(total_hits/(double)total_points);

            cout << "Calculated pi: "  <<  pi << " in " << end_time-start_time <<  endl;
    }

我只是想知道是否需要MPI_Barrier呼叫。 MPI_Reduce是否确保if语句的主体在reduce操作完成之前不会被执行?希望我很清楚。感谢

3 个答案:

答案 0 :(得分:10)

是的,所有集体通信呼叫(减少,分散,收集等)都是阻塞的。没有障碍。

答案 1 :(得分:3)

阻止是,障碍,没有。在紧密循环中执行时,为MPI_Barrier()调用MPI_Reduce()非常重要。如果不调用MPI_Barrier(),则还原过程的接收缓冲区将最终运行完毕,应用程序将中止。虽然其他参与过程只需要发送和继续,但减少过程必须接收和减少。 如果my_rank == root == 0(可能是真的),上面的代码不需要障碍。无论如何...... MPI_Reduce()不会执行障碍或任何形式的同步。 AFAIK甚至MPI_Allreduce()也不保证同步(至少不符合MPI标准)。

答案 2 :(得分:1)

问问自己是否需要这种障碍。假设你不是根;你打电话给Reduce,它发送你的数据。有没有理由坐下来等到根有结果?答:不,所以你不需要障碍。

假设你是根。您发出reduce调用。在语义上你现在被迫坐下来等待结果完全组装。那障碍为何呢?同样,不需要障碍调用。

一般来说,你几乎不需要障碍,因为你不关心时间同步。语义保证在reduce调用之后你的本地状态是正确的。