首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效使用parfor

高效使用parfor
EN

Stack Overflow用户
提问于 2016-05-18 15:41:33
回答 1查看 196关注 0票数 0

我有一个主循环,其中包含parfor循环。

我想确保我从使用parfor中获益。

以下从概念上解释了我在做什么:

代码语言:javascript
复制
   % parameters
    iterate = [1e0 1e2 1e3 1e4 1e5];

   % main loop
    for k=1:5

       % parfor 
       parfor j=1:iterate(k)
          *calculations*
           m(j)= *calculations*
       end

     %using the result of parfor in the main loop
     vector(k)= m/iterate(k);

    end

我假设matlab将使用一些工作人员分别填充数组doing_smth,这将导致比通常更快地填充该数组。然后,该数组将用于对主循环中的某个内容进行操作。

这样的安排会否更快产生效果呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-18 15:45:59

我可能会让您的外部循环成为parfor,这样每个员工都有一个相对较长的工作要运行,而且您将花费更少的时间等待其他工作人员完成。

有了它的内部,你必须等待所有的工人完成每一次循环。

代码语言:javascript
复制
for main = 1:N

    doing_smth = zeros(N1,1);

    parfor pal = 1:2N
        %// This task may not be very long-running
        doing_smth(pal) = whatever;
    end

    %// Have to wait for all runners to complete before we can continue
    %// Obviously we have to do this waiting N times (each time through the loop)
    act(main)= doing_smth/2
end

如果将其移动到外部循环,则发送给工作人员的作业执行时间将更长(由于与工作人员之间的来回通信量减少,效率更高),并且不会等待所有工作人员在循环中完成任务。

代码语言:javascript
复制
parfor main = 1:N

    doing_smth = zeros(N1, 1);

    for pal = 1:2N
        doing_smth(pal) = whatever;
    end

    %// No waiting anymore!
    act(main) = doing_smth / 2;
end

%// Now wait here for all workers to finish

更新

基于您为代码提供的更新,我实际上认为最好让parfor在内部循环上,假设该循环中的计算需要足够长的时间。这将更好地利用工作人员,因为如果外部循环是一个parfor,因为您只有4个工作人员和5个外部循环迭代,那么它将比5个工作人员长2倍,因为这4个工作人员将完成4个迭代,然后3个工作人员将空闲,而1个工作人员将完成第五个迭代。在内部使用parfor,您将充分利用所有员工。您确实希望确保内部循环的内部需要相当多的时间来减少通信开销。否则,您将需要手动将数据分割成块,并在parfor中处理这些块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37304321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档