matlab 有谁知道如何加速这个并行运行的简单代码(使用parfor)吗?

vi4fp9gy  于 2023-06-23  发布在  Matlab
关注(0)|答案(1)|浏览(129)

我做了耗时的模拟,涉及以下(简化的)代码:

K=10^5; % large number
L=1000; % smaller number

a=rand(K,L);
b=rand(K,L);
c=rand(L,L);
d=zeros(K,L,L);

parfor m=1:L-1
    
    e=zeros(K,L);
    
    for n=m:L-1
        
        e(:,n+1)=e(:,n)+(n==m)+e(:,n).*a(:,n).*b(:,n)+a(:,1:n)*c(n,1:n)';
        
    end
    
    d(:,:,m)=e;
end

有谁知道如何加速这个并行运行的简单代码(使用parfor)吗?
由于每个工作器需要矩阵a和B和c,因此存在较大的并行开销。
如果我只向每个worker发送它需要的矩阵B部分,开销会更小(因为内部循环从m开始),但我认为这并不能使代码更快。
由于开销较大,parfor比串行for循环慢。随着parfor迭代次数的增加(增加L),a、B和c的大小也会增加,开销也会增加。因此,我不期望parfor循环更快,即使L的值很大。还是有人看不一样?

kx5bkwkv

kx5bkwkv1#

使用预计算可能存在性能增益:

tc = tril(c);
ac = a * tc.';
ab = a .* b;
for m=1:L-1
    e = zeros(K,L);
    for n=m:L-1
        e(:, n + 1) = e(:, n) + (n==m) + e(:, n) .* ab(:, n) + ac(:, n);
    end
    d(:,:,m) = e;
end

相关问题