【问题标题】:how can I make these four loop compute paralleling?我怎样才能使这四个循环计算并行?
【发布时间】:2017-06-30 08:49:59
【问题描述】:

我在使用 Matlab 中的 MathWorks Parallel Computing Toolbox 时遇到问题。请参阅下面的代码

for k=1:length(Xab)
    n1=length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,n1)=JXab{k};
    MY_j(1,n1)=JYab{k};
    MZ_j(1,n1)=Z;
end
for k=length(Xab)+1:length(Xab)+length(Xbc)
    n2=length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,n2)=JXbc{k-length(Xab)};
    MY_j(1,n2)=JYbc{k-length(Yab)};
    MZ_j(1,n2)=Z;
end

for k=length(Xab)+length(Xbc)+1:length(Xab)+length(Xbc)+length(Xcd)
    n3=length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,n3)=JXcd{k-length(Xab)-length(Xbc)};
    MY_j(1,n3)=JYcd{k-length(Yab)-length(Ybc)};
    MZ_j(1,n3)=Z;
end

for k=length(Xab)+length(Xbc)+length(Xcd)+1:length(Xab)+length(Xbc)+length(Xcd)+length(Xda)

    n4=length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,n4)=JXda{k-length(Xab)-length(Xbc)-length(Xcd)};
    MY_j(1,n4)=JYda{k-length(Yab)-length(Ybc)-length(Ycd)};
    MZ_j(1,n4)=Z;
end

如果我将 for 循环更改为 parfor 循环,matlab 会警告我 MX_j 不是一个有效的变量。我不知道如何解决这个问题以及如何使这些 for 循环并行计算?

【问题讨论】:

  • parfor 不是魔杖。你确定你已经尽可能优化循环了吗?

标签: matlab parallel-processing parfor


【解决方案1】:

对我来说,看起来你可以将它组合成一个循环。创建组合元胞数组。

JX = cat(2,JXab, JXbc, JXcd, JXda);
JY = cat(2,JYab, JYbc, JYcd, JYda);

在此处检查正确的尺寸。如果您的JXcc 数组是列数组,请使用cat(1,...

做完之后,一个循环应该可以做到:

n = length(Xab)+length(Xbc)+length(Xcd)+length(Xda);
for k=1:n
    k2 = length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,k2)=JX{k};
    MY_j(1,k2)=JY{k};
    MZ_j(1,k2)=Z;
end

在并行化任何东西之前,检查这是否仍然有效。我没有测试过。如果一切顺利,你可以切换到parfor

使用parfor 时,必须预先分配数组。以下代码可以工作(由于缺乏测试数据而未经测试):

n = length(Xab)+length(Xbc)+length(Xcd)+length(Xda);
MX_j = zeros(1,n*length(Z));
MY_j = MX_j;
MZ_j = MX_j;
parfor k=1:n
    k2 = length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,k2)=JX{k};
    MY_j(1,k2)=JY{k};
    MZ_j(1,k2)=Z;
end

注意:据我所知,parfor 循环在这里会慢得多。您只需分配一些值......根本不需要计算。工作池的设置将占用总执行时间的 99.9%。

【讨论】:

  • 首先,请接受我发自内心的感谢。至于这里 parfor 循环的效率,真的吗?如果你能给我一个真实的例子来证明这里的parfor循环效率不高,那就太好了!
猜你喜欢
  • 2020-08-14
  • 1970-01-01
  • 2023-03-23
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 2020-06-07
  • 1970-01-01
相关资源
最近更新 更多