我正在使用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
答案 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);
}
肯定会提供类似输出的内容。但如果障碍不适合,我没有其他猜测,只能给流程更多的工作,这样他们就没有多少时间相互沟通。