Python多进程转为二进制性能不佳
我需要同时运行多个二进制文件的实例。为此,我使用了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负载过高了。当你把nCPU设置为1,并且使用OMP_NUM_THREADS=12
时,你实际上是在启动一个进程,这个进程使用了12个线程,这样就把所有的CPU都用满了。当你把nCPU设置为7,依然使用OMP_NUM_THREADS=12
时,你启动了7个进程,每个进程又用12个线程,这样就有12 * 7 = 84
个线程在同时运行,而这些线程要争抢12个CPU的使用权。我猜这会让操作系统频繁切换任务,从而导致你的速度变慢。
因为你只有12个CPU可用,如果你尝试同时运行超过12个线程或进程,效果会越来越差。(除非你做的工作大部分是输入输出相关的,但在这里似乎不是这种情况。)