matlab - 并行池不识别全局变量

标签 matlab parallel-processing global-variables parfor

我有一个 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/

相关文章:

python - scipy/numpy 中 matlab interp2 样条线的等效项

用递归值替换零和 NA

javascript - 附加到回调函数时变量未定义(Javascript/Dojo)

python - Django:应用级变量

c - 在 64 位 Windows 7 机器上使用 GCC 作为 MATLAB 2014a 的默认 MEX 编译器

c++ - OpenMP 使用循环和数组缩减

r - 是否可以在 Windows 上获得 R 调查包的 `svyby` 函数 multicore= 参数?

c - MPI:取消非阻塞发送

perl - 如何在 Perl 中的不同包之间共享全局值?

python - 将元胞数组(.mat 文件)加载到 Python 中