0

私は python にかなり慣れていないので、分散クラスターにマルチスレッド/マルチプロセス コードを実装する最良の方法がわかりません。

PBS キューイング システムを使用して大規模なクラスターで実行されている外部 MPI プログラムを呼び出すラッパー スクリプトを Python を使用して作成しようとしています。私が取り組んできたタイプのスクリプトの (非常に) 単純化されたバージョンを以下に示します。ここでは、コードが特定のディレクトリに移動し、外部 MPI プログラムを実行し、結果をチェックして大きな変更があったかどうかを確認します。

#!/local/python-2.7.1/bin/python2.7

import os
import subprocess as sp
import coordinate_functions as coord_funcs

os.chdir('/usr/work/cmurray/SeachTest/')
print os.getcwd()

# Gets nodefile and num procs (NP)
cat_np = sp.Popen('cat $PBS_NODEFILE | wc -l', shell = True, stdout=sp.PIPE)
NP = int(cat_np.communicate()[0])
sp.call('cat $PBS_NODEFILE > nodefile', shell = True)

def run_mpi(np, nodefile):
        mpi_cmd = 'mpirun -machinefile %s -np %d mpipg > calc.out' % (nodefile, np)
        sp.call(vasp_cmd, shell = True)


def search_loop(calc_dir, t_total, nodefile, num_procs):

    os.chdir(calc_dir)
    no_events = True
    while no_events or t < t_total:
        run_mpi(mynodefile, NP)
        num_events = coord_funcs.change_test('OUTFILE', 'INFILE', 0.01)
        if num_events > 0:
            event = True
        else:
            t += 1

search_loop('/usr/work/cmurray/SeachTest/calc_1/', 10, mynodefile, NP)

これは、次を使用してキューに送信されます。

qsub -l nodes=4 -N SeachTest ./SearchTest

私がやりたいことはsearch_loop、リストから読み取った異なるディレクトリ (たとえば、異なる開始位置を含む) で関数の複数のバージョンを並行して実行することです。プロセスは、呼び出されるたびに MPI 計算の実行に数分かかるため、非常に IO 負荷が高くなります。

threadingモジュールはこの目的に適していますか、それともモジュールmultiprocessingの方が適していますか? おそらくevent、上記の例のブール値のような単純なメッセージをスレッド/プロセス間で渡す必要があります。

また、Python スクリプトが、MPI 実行に割り当てたプロセッサを使用していないことを確認するにはどうすればよいですか?

4

1 に答える 1

0

私がやりたいことは、リストから読み取ったさまざまなディレクトリ (たとえば、さまざまな開始位置を含む) で複数のバージョンの search_loop 関数を並行して実行することです。プロセスは、呼び出されるたびに MPI 計算の実行に数分かかるため、非常に IO 負荷が高くなります。

スレッド化モジュールはこの目的に適していますか、それともマルチプロセッシング モジュールの方が適していますか? おそらく、上記の例のイベント ブール値のような単純なメッセージをスレッド/プロセス間で渡す必要があります。

実際に I/O を並列化するのに十分な帯域幅があると仮定して、I/O 集約型プログラムのマルチスレッド化を最初に試みます。

また、Python スクリプトが、MPI 実行に割り当てたプロセッサを使用していないことを確認するにはどうすればよいですか?

マルチプロセッシングを使用しない場合、グローバル インタープリター ロックにより、スクリプトは単一の CPU のみを使用します。

于 2011-11-15T16:04:08.137 に答える