1

バックグラウンド

Python では、ごく最近、module を生成するパッケージをserial_procedure.py使用してラップトップの 4 つのコアを利用することで、モジュール name を使用してシリアル プロシージャを高速化する方法を学びました。multiprocessingmulticore_procedure.py

質問

ここで、3 つのノードと各ノードに 4 つのコアを持つコンピューター クラスターを使用しようとしています。multicore_procedure.pyクラスターの 3*4 コアで並列化することにより、どのように速度を上げることができますか?

より具体的なリクエスト

プログラミングとソフトウェア エンジニアリングに関する私の知識はごくわずかであるため、slurm と condor の両方のリソース管理ソフトウェア システムで使用できる Python の明示的なサンプル スクリプトをいくつか提供していただければ幸いです。目標は、利用可能な 3*4=12 コアを自動的に検出し、統一されたコードを記述することです。

詳しくは

サンプルモジュールは以下serial_procdure.pymulticore_procedure.py提供されています。すべての反復ellで集中的な計算が実行され、その結果、totalというラベルの付いた値が得られることに注意してください。ランダムなパラグラフは、ラベルtotalの下で指定されたファイル名に書き込まれます。並列プロセスは段落を混ぜ合わせるべきではありませんが、すべてのプロセスが同じファイルに書き込む必要があります。

mpi4py パッケージを使用して mpi を実装しようとしましたが、serial_procedure.py と同様のパフォーマンスが得られたため、正しく取得できていないようです。

シリアル手順

import numpy as np
import csv
import lorem
import time

# data
high=2**10;
nsamples=2**18;
labels=np.random.randint(0,high,nsamples)

# Serial version
serial_start_time=time.time()
filename='serial.txt'
total=0
with open(filename,'w') as file:
    for ell in labels:
        # supposedly intensive computation:
        for k in range(ell):
            total=total+k; 
        w = csv.writer(file) ;
        w.writerow([total])
        w.writerow(['****'])
        w.writerow(lorem.paragraph())
        total=0;
serial_time=time.time()-serial_start_time;
print('Serial write takes '+ str(serial_time)+' seconds')
# Serial write takes 43.09408092498779 second

マルチコア手順

import numpy as np
import csv
import lorem
import time
from multiprocessing import Pool, Value

# data
high=2**10;
nsamples=2**18;
labels=np.random.randint(0,high,nsamples)
filename='four_cores_parallel.txt'

# supposedly intensive computation
def worker(ell):
    total=0
    for k in range(ell):
        total=total+k;
    return(total)

multicore_start_time=time.time()
pool=Pool(4);

with open(filename,'w') as file:
    for total in pool.map(worker, labels):
        w = csv.writer(file) ;
        w.writerow([total])
        w.writerow(['****'])
        w.writerow(lorem.paragraph())
multicore_time=time.time()-multicore_start_time;
print('Multicore write takes '+ str(multicore_time)+' seconds')
# Multicore write takes 20.171985149383545 seconds
4

0 に答える 0