【问题标题】:MATLAB Parallel Computing. Parfor: can I use the output inside the loop?MATLAB 并行计算。 Parfor:我可以在循环内使用输出吗?
【发布时间】:2014-12-20 16:35:05
【问题描述】:
我有这个与简单循环配合得很好的示例代码:
for i=1:n
y = function1(X(1:i-1))
X(i) = function2(y)
end
我的输出是 X。我知道 parfor 会在每次循环迭代时清除变量。
有人可以帮助我在循环中使用 X 将它与 parfor 并行化吗?有没有办法在每次循环迭代时将输出变量 X 传达给工作人员?谢谢。
【问题讨论】:
标签:
matlab
parallel-processing
parfor
【解决方案1】:
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 循环,要么找到一种方法来更改您的函数,使它们不依赖于以前的值。