了解 parfor 循环中的嵌套函数引用
Understanding nested function reference in parfor loop
我在 MATLAB 文档中看到了这句话:
parfor 循环体不能引用嵌套函数。但是,它可以通过函数句柄调用嵌套函数。
谁能解释一下这是什么意思?
parfor
循环与普通循环的不同之处在于,循环体对于每次迭代都有其独立的工作空间。实际上,当您在并行池上 运行 执行 parfor
循环时,需要传输到循环主体的变量会被保存并重新加载(顺便说一句,这就是"variable x cannot be sliced which may lead to communication overhead" 警告:必须保存和重新加载巨大的变量可能会增加相当多的处理时间)。
因此,对嵌套函数的调用将不起作用 - 父函数中的嵌套函数不再与循环体共享其工作区。此外,嵌套函数调用可能会跨循环迭代更改工作区变量,这不会与并行执行相结合。
相比之下,传递函数句柄或调用单独的函数效果很好。函数句柄中定义的函数,以及单独的函数,都有自己的工作区,在 parfor
主体的迭代之间没有任何共享,因此迭代可以 运行 完全独立。
/旁白:为嵌套函数创建函数句柄可能仍然会给您带来问题:实时函数(与存储为字符串的函数句柄相反,您 "activate" 和 str2func
) handle 可以携带相当多的现有工作区,包括 handle 对象。工作区的大小和未被引用传递(因为保存和重新加载)都可能导致不愉快。
我在 MATLAB 文档中看到了这句话: parfor 循环体不能引用嵌套函数。但是,它可以通过函数句柄调用嵌套函数。
谁能解释一下这是什么意思?
parfor
循环与普通循环的不同之处在于,循环体对于每次迭代都有其独立的工作空间。实际上,当您在并行池上 运行 执行 parfor
循环时,需要传输到循环主体的变量会被保存并重新加载(顺便说一句,这就是"variable x cannot be sliced which may lead to communication overhead" 警告:必须保存和重新加载巨大的变量可能会增加相当多的处理时间)。
因此,对嵌套函数的调用将不起作用 - 父函数中的嵌套函数不再与循环体共享其工作区。此外,嵌套函数调用可能会跨循环迭代更改工作区变量,这不会与并行执行相结合。
相比之下,传递函数句柄或调用单独的函数效果很好。函数句柄中定义的函数,以及单独的函数,都有自己的工作区,在 parfor
主体的迭代之间没有任何共享,因此迭代可以 运行 完全独立。
/旁白:为嵌套函数创建函数句柄可能仍然会给您带来问题:实时函数(与存储为字符串的函数句柄相反,您 "activate" 和 str2func
) handle 可以携带相当多的现有工作区,包括 handle 对象。工作区的大小和未被引用传递(因为保存和重新加载)都可能导致不愉快。