问题描述
我需要知道使用集体通信bcast而不从根进程发送消息时,系统核心将会发生什么。要提供更多详细信息:
我已经用2个机器人对系统进行了编程(模拟)。每个机器人都是一个MPI进程。由于机器人需要多次计算耗时的函数,因此我决定使用更多的MPI流程。
每个机器人都被视为一个主进程,并被分配了一些从属进程(例如15个从属)。
从站的代码是如此简单;每个从站都有一个while循环,该循环始终存在(而True循环):
def run_slave(communicator,offset):
while True:
data = np.empty(2,dtype=int)
data = communicator.bcast(data,root=0)
s = data[0]
a = data[1]
if s == -1: # means termination
break
else:
my_array = compute_heavy_function(s,a)
receive_buf = None
communicator.Gatherv(sendbuf=my_array,recvbuf=(receive_buf,offset),root=0)
在主要功能中,MPI.COMM_WORLD通信器是拆分的,因此每个机器人及其从属都有自己的通信器,并且每个机器人都是集体通信的基础。 我的整个代码是如此之大。以下是我的主代码的一部分:
def get_output_with_slaves(s,a,communicator,offset,array_size):
data = [s,a]
data = communicator.bcast(data,root=0)
prob_array = np.empty(array_size,dtype=float)
send_buf = np.zeros(1)
communicator.Gatherv(sendbuf=send_buf,recvbuf=(prob_array,root=0)
return prob_array
我不确定此设计是否正确。我通过使用从属设备加快了速度,但是我不知道为什么在我的Linux的系统监视器中,所有内核(80个线程)都可以达到99%或100%的运行速度。我怀疑在奴隶的代码中使用True时是正确的决定,但我不知道其他解决方案。没有从根进程发送的繁忙的等待循环或bcast命令会使内核处于挂起状态吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)