在使用Matlab parfor
时,我遇到了以下行为
parpool(2)
parfor j=1:100
v = j+1;
clear v
end
> Error in ==> parallel_function>make_general_channel/channel_general at 886
> Transparency violation error.
我looked into it,确实不允许在clear
内使用parfor
。
我的问题就是为什么。 v
是在每个特定工作者中创建的,因此不会干扰其他工作人员。
答案 0 :(得分:2)
Matlab使用静态代码分析器来了解parfor循环体如何与主工作区交互,即哪些变量需要传递给工人和返回。许多函数,例如eval
,evalc
,evalin
,assignin
(工作空间参数指定为'caller'
),load
(除非将输出分配给变量),save
和clear
可以以静态分析器无法预测的方式修改工作空间。当多个工作人员在其上操作时,无法确保工作空间的完整性,并且使用了这些功能。
要实现的重要一点是,当您使用命令语法来调用函数时,例如clear v
,the argument is passed as a string literal,这意味着静态分析器无法理解您正在尝试哪个变量清除,因此无法确定命令对工作区的影响。
根据建议in documentation,释放parfor中变量使用的大部分内存的解决方法是:v = [];