8

私は、python multiprocessing パッケージを使用して、コンピューターの複数のコアを利用して行っている物理シミュレーションを高速化しようとしています。

シミュレーションを実行すると、12 個のコアのうち多くても 3 個しか使用されていないことに気付きました。実際、シミュレーションを開始すると、最初は 3 つのコアが使用され、しばらくすると 1 つのコアになります。最初から 1 つまたは 2 つのコアしか使用されない場合もあります。理由を理解できませんでした(アクティブなプロセスなしでいくつかのターミナルウィンドウを閉じることを除いて、基本的に何も変更しません)。(OSはRed Hat Enterprise Linux 6.0、Pythonのバージョンは2.6.5です。)

作業が分割されるチャンクの数 (つまり、作成されるプロセスの数) を 2 から 120 の間で変化させて実験しましたが、これは効果がないようです。

この問題に関する情報をオンラインで探し、このサイトで関連するほとんどの質問 (例: onetwo ) を読みましたが、解決策が見つかりませんでした。

(編集: Windows 7 でコードを実行しようとしたところ、利用可能なすべてのコアを問題なく使用しています。ただし、RHEL 用にこれを修正したいと考えています。)

これが私のコードです(物理学は省略されています):

from multiprocessing import Queue, Process, current_process

def f(q,start,end): #a dummy function to be passed as target to Process
    q.put(mc_sim(start,end))

def mc_sim(start,end): #this is where the 'physics' is 
    p=current_process()
    print "starting", p.name, p.pid        
    sum_=0
    for i in xrange(start,end):
        sum_+=i
    print "exiting", p.name, p.pid
    return sum_

def main():
    NP=0 #number of processes
    total_steps=10**8
    chunk=total_steps/10
    start=0
    queue=Queue()
    subprocesses=[]
    while start<total_steps:
        p=Process(target=f,args=(queue,start,start+chunk))
        NP+=1
        print 'delegated %s:%s to subprocess %s' % (start, start+chunk, NP)
        p.start()
        start+=chunk
        subprocesses.append(p)
    total=0
    for i in xrange(NP):
        total+=queue.get()
    print "total is", total
    #two lines for consistency check:    
    # alt_total=mc_sim(0,total_steps)
    # print "alternative total is", alt_total
    while subprocesses:
        subprocesses.pop().join()

if __name__=='__main__':
    main()

(実際、コードはAlex Martelli の回答hereに基づいています。)

編集 2: 最終的には、方法を理解せずに問題が解決しました。私はコードを変更していませんし、OS に関連するものを変更したことも認識していません。それにもかかわらず、コードを実行するとすべてのコアが使用されるようになりました。後で問題が再発する可能性がありますが、今のところ、これ以上調査しないことにしました。助けてくれてありがとう。

4

1 に答える 1

1

Ubuntu 12.04 x64 (kernel 3.2.0-32-generic)プロセッサでPythonバージョン2.7.3 x64を使用して例を実行しましたi7が、システムによって報告された8つのコアすべてが完全に過負荷でした(観察に基づくhtop)ので、問題はOSの実装に基づいており、コードは良好です。

于 2012-10-06T06:25:17.493 に答える