我有一个 MATLAB 程序,我想并行运行它以使其运行得更快。但是,当我这样做时,并行 worker 似乎无法访问预先创建的全局变量。这是我的代码的样子:
createData % a .m file that creates a global variable (Var)
parfor i:j
processData() % a function that is dependent on some global variables
end
但是,我收到一条错误消息 undefined function or variable Var
。我已经在函数 processData()
中包含了对 global
变量 global Var
的调用,但这也不起作用。有什么方法可以使 global
变量在并行循环中可见吗?
这与 here 不是同一个问题因为我在 parfor
循环外声明了全局变量,并希望在循环内访问它们,而不需要在并行循环的 worker 之间修改或更新它的值。
最佳答案
最简单的建议是:不要使用 global
,因为这里已经描述/链接了无数原因。理想情况下,您应该像这样重构您的代码:
Var = createData(); % returns 'Var' rather than creating a global 'Var'
parfor idx = ...
% simply use 'Var' inside the parfor loop.
out(idx) = processData(Var, ...);
end
请注意,parfor
足够聪明,可以在上述循环中恰好向每个 worker 发送一次 Var
。但是,如果您有多个 parfor
循环,那么不多次发送它是不够聪明的。在那种情况下,我建议使用 parallel.pool.Constant
.如何使用它取决于创建 Var
与其大小相比的成本。如果它很小,但创建起来很昂贵 - 这意味着您最好只在客户端创建一次并将其发送给工作人员,如下所示:
cVar = parallel.pool.Constant(Var);
如果它很大,但构建速度相对较快,您可以考虑让每个 worker 独立构建自己的副本,如下所示:
cVar = parallel.pool.Constant(@createData); % invokes 'createData' on each worker
关于matlab - 并行池不识别全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53401372/