有没有办法向parpool的工人发送一些变量?
例如,我可能想告诉每个工人parpool中的工人总数。或者我可能只进行一次计算,并在特定工作人员或所有工作人员之间共享。我觉得每个工人只需要进行一次计算就是浪费资源和时间。
例如
*Some calculations processed and a number of variables generated
NumWorkers = 32;
ParallelPool = parpool(NumWorkers);
*Pass the just variables generated to the workers
pctRunOnAll NumWorkers = 32;
pctRunOnAll ParallelScript
目前,我告诉每个工人使用pctRunOnAll命令功能的工人总数,但我不喜欢这样,因为我必须改变两个地方的工人数量,这很可能如果我陷入困境会导致错误。我还想扩展它,以便我可以传递一些变量。
由于
答案 0 :(得分:0)
我会做这样的事情:
%Some calculations processed and a number of variables generated
NumWorkers = 32;
ParallelPool = parpool(NumWorkers);
parfor ixWorker = 1:NumWorkers
ParrallelFunction(NumWorkers, otherVariable, stillMoreVariables)
end
一些注意事项:
我总是后悔运行脚本而不是函数。无论您在脚本中执行什么操作,一旦将其转换为函数,许多事情(并行化就是其中之一)变得更容易。
parfor
命令是运行N
次的简单方法,其中大小不一定与工作池相同。例如,如果您运行包含100个样本的蒙特卡洛样式运行,则使用parfor ix = 1:100
,并且Matlab将使所有工作人员忙碌,直到100次执行完成。
答案 1 :(得分:0)
我的解决方案是使用eval。这是一个非常简单的解决方案,我不知道为什么我之前没有想到它。我一直在寻找替代解决方案,但我似乎无法找到任何东西。它不是一个优雅的解决方案,但它有效。
EG。
*Some calculations to obtain the following variables
Variable1 = 12;
Variable2 = 65;
Variable3 = 1205;
Variable4 = 16542;
cmd = ['pctRunOnAll Variable1 = ' num2str(Variable1) ';'];
eval(cmd)
cmd = ['pctRunOnAll Variable2 = ' num2str(Variable2) ';'];
eval(cmd)
cmd = ['pctRunOnAll Variable3 = ' num2str(Variable3) ';'];
eval(cmd)
cmd = ['pctRunOnAll Variable4 = ' num2str(Variable4) ';'];
eval(cmd)