matlab全局变量和并行池

时间:2015-07-11 20:55:39

标签: matlab parallel-processing global-variables

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

我想做什么:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

% 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变量的函数中:

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

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

第二警告:我不建议存储大变量(无论如何不要将它们作为全局变量),因为这可能会大大降低每个循环的速度。通常,存储和加载变量是不好的做法。相反,请尝试仅存储常量或某些参数之类的东西。就我而言,我存储的是带有当前路径扩展名的字符串(小于1kb)。