确保 parfor
循环或 spmd
语句的透明度
parfor
循环或 spmd
代码块的主体必须是透明的。透明度意味着对变量的所有引用都必须在代码文本中可见。
在下面的例子中,变量 X
没有转移给工作进程。只有字符向量 'X'
被传递给 eval
,并且 X
在循环或块体中不可见为输入变量。结果,MATLAB® 在运行时发出错误。
X = 5; parfor ii = 1:4 eval('X'); end | X = 5; spmd eval('X'); end |
类似地,您不能通过在 parfor
或 spmd
语句内执行 clear
来清除工作区中的变量:
parfor ii = 1:4 <statements...> clear('X') % cannot clear: transparency violation <statements...> end | spmd; clear('X'); end |
或者,当不再需要变量时,可以通过将其值设置为空来释放变量所使用的内存。
parfor ii = 1:4 <statements...> X = []; <statements...> end
对于 spmd
代码块,您可以从客户端工作区中清除其复合块。
一般来说,透明度的要求限制了对变量的所有动态访问,因为整个变量可能不会出现在任何给定的工作进程中。在透明工作区中,如果您没有在代码中明确指定这些变量,则您无法创建、删除、修改、访问或查询变量。
在 parfor
循环中违反透明度的其他操作或函数的示例包括:
注意
透明度仅适用于 parfor
或 spmd
构造的直接主体,而不适用于从那里调用的任何函数。解决 save
和 load
问题的一种方法是在函数内部隐藏对 save
和 load
的调用。另一种解决方法是使用 "-fromstruct"
选项调用 save
。有关详细信息,请参阅在 parfor 循环中保存变量。
MATLAB 确实成功执行了从 parfor
主体调用的函数中出现的 eval
和 evalc
语句。
并行 Simulink 仿真
您可以使用 parsim
命令并行运行 Simulink® 模型,而不是使用 parfor
-loops。有关并行使用 Simulink 的更多信息和示例,请参阅 Running Multiple Simulations (Simulink)。
如果您的 Simulink 模型需要访问
.mat
文件中包含的变量,则必须在每个工作进程的工作区中加载这些参数。您必须在parfor
循环之前和打开parpool
之后执行此操作。为了实现这一点,您可以使用spmd
或parfevalOnAll
,如示例所示。spmd evalin('base', 'load(''path/to/file'')') end
parfevalOnAll(@evalin, 0, 'base', 'load(''path/to/file'')')
如果您的模型还需要在 MATLAB 脚本主体中定义的变量,则必须在每个
parfor
迭代中使用assignin
或evalin
将这些变量移动到每个工作进程的基础工作区。
另请参阅
相关主题
- 排除 parfor-循环中的变量故障
- 在多个数据集上运行单个程序
- 运行并行仿真 (Simulink)