Python多处理到二进制会给出错误的缩放

时间:2014-06-23 16:47:33

标签: python multiprocessing

我需要并行运行二进制的多个实例。为此,我使用python多处理模块。二进制本身具有并行化,可以使用OMP_NUM_THREADS环境变量进行设置。我的代码的极简主义示例如下

import sys
import os
from numpy import *
import time
import xml.etree.ElementTree as ET
from multiprocessing import Process, Queue

def cal_dist(filename):

    tic = time.time()
    ################################### COPY THE INPUP FILE ########################################
    tree = ET.parse(inputfilename+'.feb')
    tree.write(filename+'.feb',xml_declaration=True,encoding="ISO-8859-1")

    ##################################### SUBMIT THE JOB ###########################################
    os.system('export OMP_NUM_THREADS=12')
    os.system('$HOME/febiosource-2.0/bin/febio2.lnx64 -noconfig -i ' + filename + '.feb -silent')

    toc = time.time()
    print "Job %s completed in %5.2f minutes" %(filename,(toc-tic)/60.);
    return

# INPUT PARAMETERS
inputfilename="main-step1"
tempfilename='temp';
nCPU=7;

for iter in range(0,1):

    ################################### PARALLEL PROCESSING STARTS ########################################

    # CREATE ALL THE PROCESSES,
    p=[];
    maxj=nCPU;
    for j in range(0,nCPU):
        p.append(Process(target=cal_dist, args=(tempfilename+str(j),)))

    # START THE PROCESSES,
    for j in range(0,nCPU):
        p[j].start();
        time.sleep(0.2);

    # JOIN THEM,
    for j in range(0,nCPU):
        p[j].join();

    ################################### PARALLEL PROCESSING ENDS ########################################

如果我设置OMP_NUM_THREADS = 1,那么增加nCPU会提供良好的缩放。也就是说,

表示nCPU = 1,工作时间= 3.5分钟

表示nCPU = 7,工作时间= 4.2分钟

但是,如果我设置OMP_NUM_THREADS = 12,那么增加nCPU会产生非常糟糕的缩放。也就是说,

表示nCPU = 1,工作时间= 3.4分钟

表示nCPU = 5,工作时间= 5.7分钟

表示nCPU = 7,工作时间= 7.5分钟

关于如何解决这个问题的任何想法?我真的需要使用大量的CPU和OMP_NUM_THREADS来解决我的实际问题(我知道计算机的架构是每个节点有12个处理器,我在nCPU * 12个处理器上运行它。

1 个答案:

答案 0 :(得分:1)

看起来你的CPU过载了。将nCPU设置为1并使用OMP_NUM_THREADS=12,您将产生一个使用12个线程的进程,这意味着您将保持所有CPU完全饱和。当您使用OMP_NUM_THREADS=12将nCPU设置为7时,您将生成七个每个使用十二个线程的进程,这意味着您已经并行运行12 * 7 = 84个线程,并且可以使用12个CPU。我的猜测是,这会为操作系统创建一个高上下文切换开销,而这会减慢你的速度。

只有12个CPU可以使用,如果你尝试并行运行12个以上的线程+进程,你将获得越来越少的回报。 (除非一堆正在进行的工作是I / O限制的,这似乎不是这里的情况。)