【问题标题】:matlab global variables and parallel poolingmatlab全局变量和并行池
【发布时间】:2018-12-06 22:35:31
【问题描述】:

我希望我的脚本运行得更快,所以目的是同时使用我的内核。问题是我不知何故错过了一层全球化。我希望我的全局变量在某些函数中保持不变,但我希望它们在每个循环调用中都不同。

我想做什么:

 parfor i:T
   createData()     % global variables are being created
   useData()        % several functions need access to global vars
 end

我感谢任何想法,让这个循环同时工作,但要保持我的变量是全局的。谢谢你的建议:)

【问题讨论】:

  • 一般不推荐使用全局变量,因为它们会降低计算效率,除非你真的需要它们。一些讨论可以找到here
  • 这是不可能的。由于 parfor 迭代以任何顺序同时执行,您根本不能在其中使用全局变量。您必须更改代码以使用局部变量,没有其他办法。
  • 不幸的是,我需要全局变量来解决最小化问题。没有它,目标函数不知道必须最小化什么。
  • @Antalagor 通常你可以避免使用全局变量。但如果你不能,那么你就不能使用并行编码。
  • 您通常可以使用匿名函数 (mathworks.com/help/matlab/matlab_prog/anonymous-functions.html) 向您尝试优化的函数添加数据。也许这会让您避免使用global 数据 - 另请参阅mathworks.com/help/matlab/math/parameterizing-functions.html

标签: matlab parallel-processing global-variables


【解决方案1】:

有同样的问题;我无法在并行循环中使用全局变量(parfor 或使用spmd),因为它们在触发时为空。

我没有重写整个代码,而是通过将所需的全局变量存储在并行池之前进行了快速修复,然后如果它们为空,则将它们加载到相关函数中。通过这种方式,我保留了全局变量逻辑,并且仅在它们位于并行池中时才加载它们。

% Store global variables to be reused in parallel workers
global Var1
save('temp_global_parallel','Var1');

% Parallel pool functions
parpool(4)
spmd
    someFunctions();
    anotherFunction();
end

% Optionally: delete to avoid the bug as explained below
delete('temp_global_variable');

然后在使用全局变量的函数内部:

global Var1
if isempty(Var1)
    load('temp_global_parallel')
end

注意:缺点当然是如果全局变量确实为空,那么您将无法检测到它。您可以通过在并行循环后删除 .mat 文件来解决此问题。

第二个注意事项:我不建议存储大变量(无论如何不要将它们作为全局变量),因为这可能会显着降低每个循环的速度。一般来说,存储和加载变量是不好的做法。相反,请尝试仅存储常量或某些参数之类的内容。在我的例子中,我存储了一个带有当前路径扩展名的字符串(小于 1kb)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2014-12-13
    相关资源
    最近更新 更多