Matlab全局变量和并行池



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

我想做什么:

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

我感谢任何想法,使这个循环同时工作,受制于我的变量全局。谢谢你的建议:)

有同样的问题;我无法在并行循环(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

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

第二个警告:我不建议存储大变量(在任何情况下都不要将它们作为全局变量),因为这可能会大大降低每个循环的速度。存储和加载变量通常是不好的做法。相反,尽量只存储常量或一些参数之类的东西。在我的例子中,我存储了一个具有当前路径扩展名的字符串(小于1kb)。

相关内容

  • 没有找到相关文章

最新更新