4

我使用以下代码在不同盒子上的工作节点之间进行同步:

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

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

4

1 回答 1

5

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

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

引入了屏障以保证在节点开始执行其他操作之前执行屏障之前的代码。

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

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

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

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

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

于 2013-09-17T01:40:24.117 回答