为什么MPI_Barrier不会同时停止跨不同节点的工作人员?

时间:2013-09-17 01:35:56

标签: mpi

我使用以下代码来同步不同盒子上的工作节点:

MPI_Barrier(MPI_COMM_WORLD); 

gettimeofday(&time[0], NULL); 
printf("RANK: %d starts at %lld sec, %lld usec\n",rank, time[0].tv_sec, time[0].tv_usec);

当我在同一节点中运行两个任务时,开始时间非常接近:

RANK: 0 starts at 1379381886 sec, 27296 usec
RANK: 1 starts at 1379381886 sec, 27290 usec

但是,当我在两个不同的节点上运行两个任务时,我得到了更多不同的开始时间:

RANK: 0 starts at 1379381798 sec, 720113 usec
RANK: 1 starts at 1379381798 sec, 718676 usec

以下不同是否合理?或者它意味着节点之间存在一些通信问题?

1 个答案:

答案 0 :(得分:5)

屏障意味着不同的节点将同步。他们通过交换消息来做到这一点。然而,一旦节点从所有其他节点接收到它们到达屏障的消息,该节点将继续。没有理由等待执行代码,因为障碍主要用于保证所有节点都有处理过的数据,而不是及时同步节点......

永远不能及时同步节点。只有使用像简单时间协议(STP)这样的严格协议,才能保证时钟设置大致相等。

在节点开始执行其他操作之前,在屏障执行之前引入了一个屏障来保证代码。

例如,假设所有节点都执行以下代码:

MethodA();
MPI_Barrier();
MethodB();

然后您可以确定,如果某个节点执行MethodB,则所有其他节点都已执行MethodA,但您不知道他们已经处理了多少MethodB

延迟对执行时间有很大影响。比如说,例如machineA比machineB更快(我们假设有WORLD有两台机器,并且缓存可能导致时差,...) 如果机器A到达屏障,它将向机器B发送消息并等待机器B的消息,其中机器B也已到达屏障。在下一个时间帧中,机器B也到达屏障并向machineA发送消息。但是,machineB可以立即继续处理数据,因为它已经收到了machineA的消息。但是,必须等到消息到达。当然这条消息很快就会到来,但会造成一些时间差异。此外,不保证第一次正确接收消息。如果machineA没有确认它收到了消息,机器B会在一段时间后重新发送它,导致越来越多的延迟。但是在局域网中,丢包的可能性很小。

因此可以声称传输时间(延迟)对时间差异有影响。