以下代码根据向量v计算A的矩阵元素。由于parfor
的维数很大,我尝试使用v
来加快计算速度。我收到错误消息“ A
中的变量parfor
无法分类。”。关于如何解决问题有什么建议吗?
A = zeros(n,n);
for kk = 1:D
% sk = <expressions...>
% ek = <expressions...>
parfor ll = 1:D
% sl = <expressions...>
% el = <expressions...>
if (ek == el)
A(sk,sl) = A(sk,sl) + v(kk) * v(ll);
end
end
end
答案 0 :(得分:0)
问题是您将A
分布在不同的内核上,但自行调整了其值。核心应如何知道条目A(sk,sl)
在其他核心上未更改?它需要检查这一点,与所有其他内核通信,消除任何并行计算,这就是MATLAB抱怨的原因:
您可以通过在A
循环之外创建parfor
的副本来避免此问题
A = zeros(n,n);
B = A;
for kk = 1:D
% sk = <expressions...>
% ek = <expressions...>
parfor ll = 1:D
% sl = <expressions...>
% el = <expressions...>
if (ek == el)
B(sk,sl) = A(sk,sl) + v(kk) * v(ll);
end
end
end
答案 1 :(得分:0)
您可以这样将其表示为A
上方的"reduction":
parfor ll 1:D
% compute stuff...
% Make a new matrix for the increment
Aincrement = zeros(n, n);
% Fill out the element of the increment
Aincrement(sk, sl) = v(kk) * v(ll);
% Increment the whole of A so that parfor can
% treat A as a reduction variable
A = A + Aincrement;
end
如果n
大,则效率可能很低。