我需要并行运行多个二进制实例 . 为此,我使用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 回答
看起来你的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绑定的,这似乎不是这种情况 . )