parfor循环或spmd块的主体必须是透明的。透明性意味着所有对变量的引用必须在代码的文本中可见。
在下面的例子中,变量X没有转移到workers。只有字符向量’X’被传递给eval,并且X在循环或块体中不作为输入变量可见。因此,MATLAB®在运行时出现错误。
X = 5;
parfor ii = 1:4eval('X');
end
X = 5;
spmdeval('X');
end
类似地,您不能通过在parfor或spmd语句中执行clear来清除工作空间中的变量:
parfor ii &#61; 1:4<statements...>clear(&#39;X&#39;) % cannot clear: transparency violation<statements...>
end
spmd; clear(&#39;X&#39;); end
或者&#xff0c;可以在不再需要变量时将其值设置为空&#xff0c;从而释放该变量所使用的内存。
parfor ii &#61; 1:4<statements...>X &#61; [];<statements...>
end
对于spmd块&#xff0c;可以从客户机工作区中清除它的组合。
一般来说&#xff0c;透明性的要求限制了对变量的所有动态访问&#xff0c;因为在任何给定的worker中可能不存在整个变量。在透明工作区中&#xff0c;如果没有在代码中显式地指定变量&#xff0c;则不能创建、删除、修改、访问或查询变量。
其他违反parfor循环透明性的行为或函数的例子包括:
谁和谁
evalc、evalin和assignin与工作区参数指定为“caller”
保存并加载&#xff0c;除非加载的输出被分配给变量
如果一个脚本试图读取或写入父工作区的变量&#xff0c;那么运行这个脚本可能会导致透明性冲突。为了避免这个问题&#xff0c;可以将脚本转换为函数&#xff0c;并使用必要的变量作为输入或输出参数来调用它。
请注意
透明性只应用于parfor或spmd构造的直接体&#xff0c;而不应用于从那里调用的任何函数。保存和加载的解决方法是在函数中隐藏保存和加载的调用。
MATLAB确实成功地执行了出现在parfor主体中调用的函数中的eval和evalc语句。
并行仿真软件模拟
您可以使用parsim命令并行运行Simulink®模型&#xff0c;而不是使用parfor循环。有关并行使用Simulink的更多信息和示例&#xff0c;请参见运行多个模拟(Simulink)。
如果您的Simulink模型需要访问包含在.mat文件中的变量&#xff0c;则必须将这些参数加载到每个worker的工作空间中。您必须在parpool打开之前和之后执行此操作。要实现这一点&#xff0c;可以使用spmd或parfevalOnAll&#xff0c;如示例所示。
spmd evalin(&#39;base&#39;, &#39;load(&#39;&#39;path/to/file&#39;&#39;)&#39;)
end
parfevalOnAll(&#64;evalin, 0, &#39;base&#39;, &#39;load(&#39;&#39;path/to/file&#39;&#39;)&#39;)
如果您的模型还需要在MATLAB脚本主体中定义的变量&#xff0c;则必须在每个parfor迭代中使用assignin或evalin将这些变量移动到每个worker的基本工作空间。