【发布时间】:2015-08-24 13:10:36
【问题描述】:
我必须遍历一个二维数组并对它们执行一些操作,这取决于if-statement 的结果。我在这里做了一个循环的小例子:
N=128;
A = rand(N,N);
B = rand(N,N);
sqr = @(x) x.^2;
for xi=1:N
for yi=1:N
a = A(xi,yi);
b = B(xi,yi);
if( abs(a-b)<1 )
result=2.0;
else
result = sqr(a-b);
end
res_matrix(xi,yi) = result;
end
end
我想并行化这个for-loop。我已经阅读了 parfor 上的 MathWorks 页面,我将其并行化的方法是将外循环变成 parfor。
这是我能获得的最佳加速,还是我应该以不同的方式构建循环?
这是我的循环的更详细版本:
for xi= 1:N
for yi= 1:N
a = A(:,xi,yi); %a is a vector
b = B(:,xi,yi); %b is a vector
D = a-b;
if( max(D./a)<1e-3 )
test_var=2.0;
else
F_min = F(a, b, 0); %F is some function, such as a Newton-Raphson solver etc...
F_max = F(a, b, 1); %F is some function, such as a Newton-Raphson solver etc...
if( F_min*F_max>0.0 )
test_var=2.0;
else
test_var = F(a, b, 2);
end
end
var(1, xi,yi) = test_var;
end
end
【问题讨论】:
-
直接将
for循环更改为par-for循环在您想要一次又一次地重复相同的过程(例如在收集统计信息时)时很好。否则,您需要管理对每个不同工作人员的资源分配。 -
您的“详细版本”的minimal reproducible example 带有输入和输出将帮助其他人帮助您
标签: matlab parallel-processing parfor