GLOBAL
数据很难在内部使用,PARFOR
因为每个工作人员都是一个单独的 MATLAB 进程,并且全局变量不会从客户端(或任何其他进程)同步到工作人员。如果您从工作人员的单独函数初始化全局数据,它将起作用。(正如 Rody 指出的那样,不允许在 PARFOR 循环的主体中直接global
使用关键字- 但是,单独的函数可以做到这一点)。因此,这样做是合法的:
parfor ii=1:matlabpool('size')
myFcnWhichSetsUpGlobalData(); %# defines global OPTIONS
end
parfor ii=1:N
result(ii) = myFcnWhichUsesGlobalData(); %# reads global OPTIONS
end
我个人会尝试GLOBAL
从您的应用程序中删除数据 - 它会使其更好地与PARFOR
.
另一个值得探索的选项是我的Worker Object Wrapper,它旨在阻止您多次向工作人员传输数据。你可以这样使用它:
options = buildOptions();
w_options = WorkerObjWrapper(options);
parfor ii=1:N
result(ii) = myFcnNeedingOptions(ii, w_options.Value);
end