我对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?
谢谢。
答案 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