MATLAB parfor和变量的分类/使用

时间:2015-03-15 22:08:24

标签: matlab classification temporary parfor

我对MATLAB中的并行化经验不多(&#2周自己动手),我仍然有一个parfor循环工作,类似于:

N = 11;
var1 = zeros(N, 2);

parfor n=1:N
  a = zeros(3, 3);
  b = zeros(3, 3);

  [a, b] = myfun(<arguments>);

  var1(n, :) = [sum(sum(a,1),2) sum(sum(b,1),2);]

end

<portion of non parallelized code that makes use of var1 contents>

如果我理解到目前为止的文档/示例,&#39; var1&#39;被归类为切片变量和&#39; a&#39;和&#39; b&#39;作为临时变量。我正在使用&#39; var1&#39;这样,因为我需要在执行parfor循环后使用它的内容。

我也想使用&#39; a&#39;和&#39; b&#39;变量作为切片变量,以避免重新初始化/不必要的内存重新分配(?)/增加并行性能。

我尝试了类似这样的变量&#39; a&#39;:

N = 11;
var1 = zeros(N, 2);
**a = zeros(3, 3, N);**

parfor n=1:N
  b = zeros(3, 3);

  [**a(:,:,n)**, b] = myfun(<arguments>);

  var1(n, :) = [sum(sum(**a(:,:,n)** ,1),2) sum(sum(b,1),2);]

end

<another portion of non parallelized code that makes use of var1 contents>

目的是让工人在内存中使用相同区域的部分,但是我得到错误&#34; parfor中的变量a不能被分类。&#34;

那么......为什么它不能被分类并用作切片变量,比如var1?

谢谢。

1 个答案:

答案 0 :(得分:0)

你要做的不是一个好主意。切片变量意味着通信,因为主实例将其发送给工作者并从那里接收它。它还意味着双内存使用,因为主实例保留变量和(在切片中)工作者。

你的第一个版本很好。您可以删除行a = zeros(3, 3);b = zeros(3, 3);

这是切片变量a

的样子
N = 11;
var1 = zeros(N, 2);
a = zeros(3, 3,N);
parfor n=1:N

  [a(:,:,n), b] = myfun(2);

  var1(n, :) = [sum(sum(a(:,:,n),1),2) sum(sum(b,1),2);]
end

这是我建议的代码:

N = 11;
var1 = zeros(N, 2);
parfor n=1:N

  [a, b] = myfun(2);

  var1(n, :) = [sum(a(:)) sum(b(:))]
end