1

(C)プログラムを再コンパイルした後、一部のノードは古いコンパイルを実行しており(デバッグ情報はまだ含まれています)、一部のノードは新しいコピーを実行しています。サーバーはGentooLinuxを実行しており、すべてのノードが同じストレージからファイルを取得します。ファイルシステムはNFSだと言われています。私が使用しているMPIはMPICHバージョン1.2.7です。一部のノードが新しくコンパイルされたコピーを使用しないのはなぜですか?

いくつかの詳細(睡眠に問題がある場合):

私は最初のMPIプログラムを作成しようとしています(CとLinuxも初めてです)。私のコードには次のものがあります:

#if DEBUG
  {
    int i=9;
    pid_t PID;
    char hostname[256];
    gethostname(hostname, sizeof(hostname));
    printf("PID %d on %s ready for attach.\n", PID=getpid(), hostname);
    fflush(stdout);
    while (i>0) {
      printf("PID %d on %s will wait  for `gdb` to attach for %d more iterations.\n", PID, hostname, i);
      fflush(stdout);
      sleep(5);
      i--;
    }
  }
#endif

次に、(-DDEBUG = 1オプションがないため、上記のコードは除外されます)を使用して再コンパイルしました。

$ mpicc -Wall -I<directories...> -c myprogram.c
$ mpicc -o myprogram myprogram.o -Wall <some other options...> 

プログラムは問題なくコンパイルされます。次に、次のように実行します。

$ mpirun -np 3 myprogram

時々(そしてますます頻繁に)、実行可能ファイルの異なるコピーがクラスターの異なるノードで実行されますか?一部のノードでは、デバッグコードが実行(および出力)され、一部のノードでは実行されません。

現在、クラスターで「クロックスキュー」(またはそのようなもの)が発生していることに注意してください。これが原因である可能性があります。それが問題ですか?

また、これらの提案を実装する時間がまだないため、実際にはMakefileの行にコメント/コメントを外してコンパイルオプションを変更するだけであることに注意してください。

編集:問題が発生すると、問題が発生md5sum myprogramしているノードで別の値を返します。

4

1 に答える 1

2

さまざまなノードがファイルのコピーを保持しており、バイナリを実行するときに最新のものではなくそれを使用しています。これは、Linux (カーネル) キャッシングおよび/または NFS 実装の成果物であるため、Gentoo とはほとんど関係がありません。

つまり、バイナリがキャッシュされます。この回答を読んでください:

NFS キャッシュ クリーニング コマンド?

いくつかの設定を微調整することも役立つ場合があります。


たまたま、同期とフラッシュを行うコマンドがここにあります。

$ cat /home/jaroslav/bin/flush_cache 
sudo sync
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
于 2014-03-10T05:45:01.237 に答える