为什么Matlab的clear会违反透明度?
Why does Matlab's clear violates transparency?
在使用 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,确实是parfor
内不允许使用clear
。
我的问题是为什么。 v
是在每个特定的 worker 内部创建的,因此它不会干扰其他 worker。
Matlab 使用静态代码分析器来了解 parfor 循环的主体如何与主工作区交互,即哪些变量需要传输给工作人员并返回。许多函数,例如 eval
、evalc
、evalin
、assignin
(工作空间参数指定为 'caller'
)、load
(除非将输出分配给变量),save
和 clear
可以以静态分析器无法预测的方式修改工作区。多个worker操作时无法保证workspace的完整性,使用了这样的功能
需要注意的重要一点是,当您使用命令语法调用函数时,例如 clear v
、the argument is passed as a string literal,这意味着静态分析器无法理解您使用的是哪个变量正在尝试清除,因此无法确定该命令对工作区的影响。
如建议的那样in documentation,释放 parfor 内部变量使用的大部分内存的解决方法是:v = [];
在使用 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,确实是parfor
内不允许使用clear
。
我的问题是为什么。 v
是在每个特定的 worker 内部创建的,因此它不会干扰其他 worker。
Matlab 使用静态代码分析器来了解 parfor 循环的主体如何与主工作区交互,即哪些变量需要传输给工作人员并返回。许多函数,例如 eval
、evalc
、evalin
、assignin
(工作空间参数指定为 'caller'
)、load
(除非将输出分配给变量),save
和 clear
可以以静态分析器无法预测的方式修改工作区。多个worker操作时无法保证workspace的完整性,使用了这样的功能
需要注意的重要一点是,当您使用命令语法调用函数时,例如 clear v
、the argument is passed as a string literal,这意味着静态分析器无法理解您使用的是哪个变量正在尝试清除,因此无法确定该命令对工作区的影响。
如建议的那样in documentation,释放 parfor 内部变量使用的大部分内存的解决方法是:v = [];