matlab全局变量与并行池

matlab全局变量与并行池,matlab,parallel-processing,global-variables,Matlab,Parallel Processing,Global Variables,我希望我的脚本运行得更快,所以目的是同时使用我的内核。问题是我不知何故错过了一层全球性。我希望我的全局变量在某些函数中是持久的,但我希望它们在每个循环调用中是不同的 我想做的是: parfor i:T createData() % global variables are being created useData() % several functions need access to global vars end 我感谢任何想法,使这个循环同时工作,

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

我想做的是:

 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
注意:缺点是如果全局变量真的为空,则无法检测到它。您可以通过在并行循环之后删除.mat文件来解决这个问题


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

通常不建议使用全局变量,因为它们会降低计算效率,除非您确实需要它们。一些讨论可以发现这是不可能的。由于parfor迭代是同时执行的,并且以任何顺序执行,所以不能在其中使用全局变量。您必须更改代码以使用局部变量,没有其他方法。不幸的是,我需要全局变量来解决最小化问题。没有它,目标函数就不知道要最小化什么。@通常可以避免使用全局变量。但是如果你不能,那么你可以;不要使用并行编码。通常可以使用匿名函数()将数据添加到要优化的函数中。也许这样可以避免
全局
数据-另请参见