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);

同じノードで 2 つのタスクを実行すると、開始時間が非常に近くなります。

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

ただし、2 つの異なるノードで 2 つのタスクを実行すると、開始時間がさらに異なります。

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

次の違いは合理的ですか?それとも、ノード間の通信の問題を暗示していますか?

4

1 に答える 1

5

バリアは、異なるノードが同期することを意味します。彼らはメッセージを交換することによってこれを行います。ただし、ノードが他のすべてのノードからバリアに到達したというメッセージを受信すると、そのノードは続行します。バリアは主に、たとえばすべてのノードがデータを処理したことを保証するために使用され、時間内にノードを同期するためではなく、コードの実行を待機する理由はありません...

ノードを時間内に同期することはできません。Simple Time Protocol (STP) のような厳密なプロトコルを使用することによってのみ、クロックがほぼ等しく設定されることを保証できます。

ノードが何か他の実行を開始する前に、バリアが実行される前にコードを保証するために、バリアが導入されました。

たとえば、すべてのノードが次のコードを実行するとします。

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

次に、ノードが実行された場合、MethodB他のすべてのノードが実行されたことを確認できますがMethodA、それらがすでに処理した量については何もわかりませんMethodB

レイテンシーは実行時間に大きく影響します。たとえば、machineA が machineB よりも何らかの形で高速だったとします (WORLDマシン A がバリアに到達すると、マシン A はマシン B にメッセージを送信し、マシン B もバリアに到達したことを示すマシン B のメッセージを待ちます。次のタイムフレームでは、machineB もバリアに到達し、machineA にメッセージを送信します。しかし、machineB はすでに machineA のメッセージを受信して​​いるため、すぐにデータの処理を続行できます。ただし、machineA はメッセージが到着するまで待機する必要があります。もちろん、このメッセージはすぐに届きますが、多少の時間差が生じます。さらに、メッセージが最初に正しく受信されるという保証はありません。machineA がメッセージを受信したことを確認しない場合、machineB はしばらくしてからメッセージを再送信し、ますます遅延が発生します。ただし、LAN ネットワークでは、パケット損失が発生する可能性はほとんどありません。

したがって、送信時間(レイテンシ)が時間差に影響を与えると主張できます。

于 2013-09-17T01:40:24.117 に答える