8

我一直在尝试使用 python 多处理包来通过利用计算机的多个内核来加速我正在做的一些物理模拟。

我注意到,当我运行模拟时,最多使用 12 个内核中的 3 个。事实上,当我开始模拟时,它最初使用了 3 个内核,然后过了一会儿就使用了 1 个内核。有时从一开始就只使用一两个内核。我一直无法弄清楚为什么(我基本上什么都没做,除了关闭几个终端窗口(没有任何活动进程))。(操作系统为 Red Hat Enterprise Linux 6.0,Python 版本为 2.6.5。)

我通过改变将工作拆分成的块数(2 到 120 之间)(即创建的进程数)进行了实验,但这似乎没有效果。

我在网上查找了有关此问题的信息,并阅读了该站点上的大多数相关问题(例如,),但找不到解决方案。

(编辑:我刚刚尝试在 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在此处的回答。)

编辑 2:最终问题自行解决了,而我并不理解。我没有更改代码,也不知道更改了与操作系统相关的任何内容。尽管如此,当我运行代码时,现在所有内核都被使用了。也许这个问题稍后会再次出现,但现在我选择不进一步调查,因为它有效。感谢大家的帮助。

4

1 回答 1

1

我在处理器上Ubuntu 12.04 x64 (kernel 3.2.0-32-generic)使用 Python 版本运行了您的示例,系统报告的所有 8 个内核都完全过载(基于观察),所以先生,您的问题是基于操作系统实现的,并且代码很好。2.7.3 x64i7htop

于 2012-10-06T06:25:17.493 回答