9

マルチプロセッシング プールを使用して Python で並列化されたシミュレーションを実行していますが、複数のコアを備えたコンピューターでうまく機能します。ここで、複数のノードを使用してクラスターでプログラムを実行したいと考えています。マルチプロセッシングは分散メモリには適用できないと思います。しかし、mpi4py は良い選択肢のようです。したがって、これらのコードに相当する最も単純な mpi4py は次のとおりです。

from multiprocessing import Pool

pool = Pool(processes=16)

pool.map(functionName,parameters_list)
4

3 に答える 3

4

ここMPIPoolクラスが実装されています。

これをどのように使用するかの例については、 GitHub のこの要点を確認してください。

于 2014-08-19T15:38:16.603 に答える
0

次のコードを使用して、multiprocessing.Pool と同等にします。まだ広範囲にテストされていませんが、問題なく動作するようです:

from functools import partial
function = partial(...)  # Store all fixed parameters this way if needed

if use_MPI:
    arguments = range(num_runs)
    run_data = None

    # mpi4py
    comm = MPI.COMM_SELF.Spawn(sys.executable, args=['MPI_slave.py'], maxprocs=num_runs)  # Init
    comm.bcast(function, root=MPI.ROOT)     # Equal for all processes
    comm.scatter(arguments, root=MPI.ROOT)  # Different for each process
    comm.Barrier()                          # Wait for everything to finish...
    run_data = comm.gather(run_data, root=MPI.ROOT)  # And gather everything up
else:        
    # multiprocessing
    p = Pool(multiprocessing.cpu_count())
    run_data = p.map(function, range(num_runs))

次に、別のファイル 'MPI_slave.py' を使用します。

from mpi4py import MPI
# import the function you actually pass to this file here!!!
comm = MPI.COMM_SELF.Get_parent()
size = comm.Get_size()
rank = comm.Get_rank()

def runSlaveRun():
    function = None
    options = None
    # print("Process {}/{} reporting for duty!".format(rank, size))

    function = comm.bcast(function, root=0)
    arguments = comm.scatter(options, root=0)
    results = function(arguments)
    comm.Barrier()
    comm.gather(results, root=0)
    comm.Disconnect()

if __name__ == '__main__':
    runSlaveRun()
于 2016-01-05T10:07:03.480 に答える