Main Content

本页采用了机器翻译。点击此处可查看英文原文。

确保 parfor 循环或 spmd 语句的透明度

parfor 循环或 spmd 代码块的主体必须是透明的。透明度意味着对变量的所有引用都必须在代码文本中可见。

在下面的例子中,变量 X 没有转移给工作进程。只有字符向量 'X' 被传递给 eval,并且 X 在循环或块体中不可见为输入变量。结果,MATLAB® 在运行时发出错误。

X = 5;
parfor ii = 1:4
    eval('X');
end
X = 5;
spmd
    eval('X');
end

类似地,您不能通过在 parforspmd 语句内执行 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 循环中违反透明度的其他操作或函数的示例包括:

  • whowhos

  • evalcevalinassignin,其中 workspace 参量指定为 'caller'

  • saveload,除非 load 的输出被赋值给变量

  • 如果脚本尝试读取或写入父工作区的变量,则运行该脚本可能会导致透明度冲突。为了避免此问题,请将脚本转换为函数,并使用必要的变量作为输入或输出参量来调用它。

注意

透明度仅适用于 parforspmd 构造的直接主体,而不适用于从那里调用的任何函数。解决 saveload 问题的一种方法是在函数内部隐藏对 saveload 的调用。另一种解决方法是使用 "-fromstruct" 选项调用 save。有关详细信息,请参阅在 parfor 循环中保存变量

MATLAB 确实成功执行了从 parfor 主体调用的函数中出现的 evalevalc 语句。

并行 Simulink 仿真

您可以使用 parsim 命令并行运行 Simulink® 模型,而不是使用 parfor-loops。有关并行使用 Simulink 的更多信息和示例,请参阅 Running Multiple Simulations (Simulink)

  • 如果您的 Simulink 模型需要访问 .mat 文件中包含的变量,则必须在每个工作进程的工作区中加载这些参数。您必须在 parfor 循环之前和打开 parpool 之后执行此操作。为了实现这一点,您可以使用 spmdparfevalOnAll,如示例所示。

    spmd 
        evalin('base', 'load(''path/to/file'')') 
    end
    parfevalOnAll(@evalin, 0, 'base', 'load(''path/to/file'')')

  • 如果您的模型还需要在 MATLAB 脚本主体中定义的变量,则必须在每个 parfor 迭代中使用 assigninevalin 将这些变量移动到每个工作进程的基础工作区。

另请参阅

|

相关主题