首页 文章

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

提问于
浏览
0

我需要并行运行多个二进制实例 . 为此,我使用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 回答

  • 1

    看起来你的CPU过载了 . 使用 OMP_NUM_THREADS=12 将nCPU设置为1时,'re spawning one process that uses twelve threads, which means you'将使所有CPU完全饱和 . 当您使用 OMP_NUM_THREADS=12 将nCPU设置为7时,'re spawning seven processes that use twelve threads each, which means you'已经并行运行了 12 * 7 = 84 个线程,并且在12个CPU上运行 . 我的猜测是这会为操作系统创建一个高的上下文切换开销,而这会减慢你的速度 .

    只有12个CPU可以使用,如果您尝试并行运行12个以上的线程进程,您将获得递减的回报 . (除非正在进行的一系列工作是I / O绑定的,这似乎不是这种情况 . )

相关问题