0

以下は、私が求めている質問に関連するコードです。13 の計算ノードと 1 つのトップ ノード (別名メイン ノード) を持つクラスターを使用しています。最上位ノードはすべてのユーザーを接続するノードであるため、より多くのメモリが割り当てられるため、より高速に実行できます。ただし、他のノードの速度を上げたいと考えています。これは、トップ ノードに比べて実行速度が非常に遅いためです。また、サーバーやハードウェアの調整を行わずに速度を上げたいと考えています。これらの制約を考慮すると、計算ノードでシミュレーションを開始する方法に基づいて、より高速な計算を実現する方法があるかどうか疑問に思っています。現在、特定の初期条件でシミュレーションの一部を開始するには (これは以下で確認できます)、計算ノードに ssh 接続して、シミュレーションを開始するだけです。これを実行して計算速度を上げるより良い方法はありますか (ssh よりも高速な方法があるのではないかと考えています)。どんな助けでも大歓迎です....MPIと呼ばれるものがあることは理解していますが、私が取り組んでいるプロジェクトでは、sshされたノードの計算速度を上げることができれば、MPIの実装が必要になるとは思いません... ありがとう。

./NodeHopper.sh

#!/bin/sh
#NodeHopper uses shell script to run psuedo-parallel computing over a cluster

#The top node is not named sequentially, so its not in the proceeding loop.
#Instead, it is given the node value 13 for computations later

export PROG=13
nohup ./ParaCage.sh & #Runs ParaCage.sh on the main node for the cluster

#Does other nodes sequentially #0 through 12
for i in {0..12}
do
  export PROG=$i 
  #PROG is passed into ./ParaCage.sh and tells ./ParaKeet.sh which initial conditions  
  #to use for the simulation.
  ssh compute-0-$i PROG=$PROG ./ParaCage.sh &
  sleep 1
done

./ParaCage.sh

#!/bin/sh
echo "Tunneling to Node:"
echo $PROG
echo "Complete"

cd multichmoII/multichmo$PROG/chmo/
./ParaKeet.sh

ParaKeet.sh

ParaKeet.sh は、使用しているノードに基づいて異なる初期条件でシミュレーションを実行するプログラムです。

4

3 に答える 3

0

実行しているシミュレーションの性質によっては、シミュレーション自体を分割して並列処理する方がよい場合があります。これは、各ノードがプログラムを効果的に実行するのに十分なほど強力でない場合に当てはまります。一方、シミュレーションが簡単に並列スレッドに分解される場合 (それぞれが使用するメモリやプロセッサの処理能力がはるかに少ない場合)、各ノードは、割り当てた各コンポーネントを処理するのに適している可能性があります。

于 2013-01-03T18:14:30.710 に答える
0

計算ノードでシミュレーションを開始する方法に基づいて、より高速な計算を実現する方法があるかどうか疑問に思っています。

さて、SSH キックオフ スクリプトには が含まsleepれています。それを削除してみてください。

SSH にはいくらかのオーバーヘッドがあります (すべての「メッセージ」に対して新しいプロセスを生成します。必要がない場合でも、暗号化された接続のみを行います)。したがって、SSH を適切な分散タスク キューに置き換えることができます。CeleryResqueなど、多くの代替手段があります。実際、Redis または 0MQ を使用して簡単に独自のものを作成できます。

ただし、仕事が短命でない限り、わざわざ SSH を置き換える必要はありません。(つまり、1 分間の作業から 100 ミリ秒を削っても、それほど役に立ちません。)

他のノードの速度を上げたい

特効薬はありません。最善の策は、探偵の帽子をかぶって、ボトルネックがどこにあるかを突き止めることです。

1) 他のノードの「トップ」を見てください。すべての CPU が使い果たされていますか? (そうでない場合は、ボックスごとに 1 つのタスクではなく、CPU ごとに 1 つのタスクを生成するか、タスクを書き直して複数のスレッドを使用することをお勧めします。)

2) 各ノードは中央の (過負荷の) NFS サーバーからファイルをプルしていますか? (そうであれば、ファイルをローカルにコピー/キャッシュするか、複数のサーバーからデータを取得するか、bittorrent を使用するなどした方が速いかもしれません..)

3) CPU が限界に達していても、それはスクリプト言語で書いたからですか? まず、アルゴリズムを最適化してから、golangのような高速な言語で書き直してみてください。(そして無料でマルチスレッドを取得します。)

時期尚早の最適化は諸悪の根源であることを忘れないでください。常に測定し、各パーツをどれだけ速く作成できるかを見積もる必要があります。最初に簡単に達成できるものを選び、最後に最小の利益を残します。(より重要な何かがポップアップするため、小さな利益を得ることができない場合があります。)

于 2014-04-06T05:57:18.793 に答える
0

たぶん、bash から python に移行して、そこでマルチスレッドを使用する必要がありますか? 次に、ノードに並行して ssh を実行すると、速度が向上します。

于 2012-12-22T20:11:49.473 に答える