我需要并行运行二进制的多个实例。为此,我使用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个处理器上运行它。
答案 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限制的,这似乎不是这里的情况。)