在MATLAB中考虑以下代码:
function parallelProblem
N = 10;
A = rand(N);
parfor i=1:N
for k=2:N
A(i,k) = f(A(i,k-1));
end
end
end
function y=f(x)
y = x;
end
这是我正在处理的有问题的代码的摘要。基本上这个想法如下:我必须使用变量i
和k
,我可以执行我的计算,不同i
之间没有通信,但k
的不同值之间的通信是必需的。
因此,我希望将循环并行化i
。但是,对于上面的代码,我得到了错误
parallelProblem
Error: File: parallelProblem.m Line: 6 Column: 9
The variable A in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".
将鼠标悬停在parfor(带下划线)字样上
The PARFOR loop can not run due to the way the variable 'A' is used.
并将鼠标悬停在f(A(i,k-1))
上
Valid indices for 'A' are restricted in PARFOR loops
和
In PARFOR loop, variable 'A' is indexed in different ways, potentially causing dependencies between iterations.
从直观的角度来看,我认为没有理由为什么代码应该并行工作。有什么办法,我可以修改我的代码以获得所需的结果吗?
答案 0 :(得分:1)
问题是你要覆盖A
。 parfor
中的循环不按顺序执行,MATLAB会发现您正在覆盖A的值,然后使用它们。您可以使用辅助变量轻松解决此问题:
function parallelProblem
N = 5;
A = magic(N);
Aresult=[];
parfor i=1:N,N
b=[];
for k=2:N
b(k) = f(A(i,k-1));
end
Aresult(i,:)=b;
end
end