MPI.NET如何使进程以任意顺序发送数据?

时间:2012-02-11 08:32:31

标签: c# mpi

我正在使用mpi.net。我希望每个处理器(proc 0除外)以任意顺序将数据发送到进程0。这是一段简化的代码:

            if (rank == 0)
            {
                int all = nTasks-1; //wich is the number of processes -1

                while (all > 0)
                {
                     Communicator.world.Receive<Pixelator>(Communicator.anySource, 1, out pixelus);
                     if (pixelus.x == -1)
                     {
                         all--;
                     }
                }
            }
            else
            {                    
                for (int i = 0; i < 5; i++)
                {
                    Communicator.world.Send<Pixelator>(some_data, 0, 1);
                }                    
                Communicator.world.Send<Pixelator>(-1, 0, 1);
            }

问题是,进程0一次从另一个进程接收所有信息,然后在从另一个进程接收数据时向前移动。例如,进程0得到 1 1 1 1 1 2 2 2 2 2 5 5 5 5 5 4 4 4 4 4 3 3 3 3 3(这些是发送数据的过程的等级)。我希望它是1 5 2 3 1 1 4 3 ...或任意订单......请给我一个建议。 sry for my english

1 个答案:

答案 0 :(得分:0)

看看here。有一种方法可以阻止进程在进入某个计算点时进一步操作,直到所有其他进程到达同一点。 希望,它会有所帮助。您的代码可能如下所示:

if (rank == 0)
{
    int all = nTasks-1; //wich is the number of processes -1

    while (all > 0)
    {
         Communicator.world.Receive<Pixelator>(Communicator.anySource, 1, out pixelus);
         if (pixelus.x == -1)
         {
             all--;
         }
    }
}
else
{                    
    for (int i = 0; i < 5; i++)
    {
        Communicator.world.Send<Pixelator>(some_data, 0, 1);
        //Here's the barrier
        Communicator.Barrier();
    }                    
    Communicator.world.Send<Pixelator>(-1, 0, 1);
}

肯定会提供类似输出的内容。但如果障碍不适合,我没有其他猜测,只能给流程更多的工作,这样他们就没有多少时间相互沟通。