我有一个适用于简单循环的示例代码:
for i=1:n
y = function1(X(1:i-1))
X(i) = function2(y)
end
我的输出是X.我知道 parfor 清除每个循环迭代的变量。 有人可以帮助我在循环中使用X与 parfor 并行化吗?有没有办法在每次循环迭代时将输出变量X传递给worker?感谢。
答案 0 :(得分:2)
MATLAB并不清除每次迭代中的所有变量,背后有一些智能:查看以下parfor
循环:
parfor k=1:n
x = function1(a(k));
y(k) = function2(a(k));
end
首先,重要的是要知道迭代顺序没有修复,因此没有执行迭代的顺序。这就是为什么你不能知道在这个循环之后x
会有什么价值。所以MATLAB决定清除这个变量,以防止可能出现的问题。另一方面,对于y
来说很明显它在循环之后会有什么价值,所以这将起作用。
在您的情况下,这意味着您无法在循环外使用y
的值,但可以使用X
。问题是别的:
X(i)
取决于X(1:i-1)
。这意味着迭代必须是从1到n的顺序。 parfor
不可能这样做。假设您有一个四核CPU,那么您将拥有4名工作人员。假设迭代1到4同时在一个工人上开始。迭代2到4必须等待迭代1完成,然后迭代3到5将等待2完成,依此类推。
您要么必须使用for
循环,要么找到更改功能的方法,以便他们不依赖于之前的值。