我使用以下代码来同步不同盒子上的工作节点:
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
以下不同是否合理?或者它意味着节点之间存在一些通信问题?
答案 0 :(得分:5)
屏障意味着不同的节点将同步。他们通过交换消息来做到这一点。然而,一旦节点从所有其他节点接收到它们到达屏障的消息,该节点将继续。没有理由等待执行代码,因为障碍主要用于保证所有节点都有处理过的数据,而不是及时同步节点......
永远不能及时同步节点。只有使用像简单时间协议(STP)这样的严格协议,才能保证时钟设置大致相等。
在节点开始执行其他操作之前,在屏障执行之前引入了一个屏障来保证代码。
例如,假设所有节点都执行以下代码:
MethodA();
MPI_Barrier();
MethodB();
然后您可以确定,如果某个节点执行MethodB
,则所有其他节点都已执行MethodA
,但您不知道他们已经处理了多少MethodB
延迟对执行时间有很大影响。比如说,例如machineA比machineB更快(我们假设有WORLD
有两台机器,并且缓存可能导致时差,...)
如果机器A到达屏障,它将向机器B发送消息并等待机器B的消息,其中机器B也已到达屏障。在下一个时间帧中,机器B也到达屏障并向machineA发送消息。但是,machineB可以立即继续处理数据,因为它已经收到了machineA的消息。但是,必须等到消息到达。当然这条消息很快就会到来,但会造成一些时间差异。此外,不保证第一次正确接收消息。如果machineA没有确认它收到了消息,机器B会在一段时间后重新发送它,导致越来越多的延迟。但是在局域网中,丢包的可能性很小。
因此可以声称传输时间(延迟)对时间差异有影响。