私は、python multiprocessing パッケージを使用して、コンピューターの複数のコアを利用して行っている物理シミュレーションを高速化しようとしています。
シミュレーションを実行すると、12 個のコアのうち多くても 3 個しか使用されていないことに気付きました。実際、シミュレーションを開始すると、最初は 3 つのコアが使用され、しばらくすると 1 つのコアになります。最初から 1 つまたは 2 つのコアしか使用されない場合もあります。理由を理解できませんでした(アクティブなプロセスなしでいくつかのターミナルウィンドウを閉じることを除いて、基本的に何も変更しません)。(OSはRed Hat Enterprise Linux 6.0、Pythonのバージョンは2.6.5です。)
作業が分割されるチャンクの数 (つまり、作成されるプロセスの数) を 2 から 120 の間で変化させて実験しましたが、これは効果がないようです。
この問題に関する情報をオンラインで探し、このサイトで関連するほとんどの質問 (例: one、two ) を読みましたが、解決策が見つかりませんでした。
(編集: 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 に関連するものを変更したことも認識していません。それにもかかわらず、コードを実行するとすべてのコアが使用されるようになりました。後で問題が再発する可能性がありますが、今のところ、これ以上調査しないことにしました。助けてくれてありがとう。