首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何‘`parfor`’嵌套循环?

如何‘`parfor`’嵌套循环?
EN

Stack Overflow用户
提问于 2014-05-05 03:23:54
回答 2查看 1.2K关注 0票数 1

原始代码如下所示:

代码语言:javascript
复制
for i = 1 : size(H, 1)
    for j = 1 : size(H, 2)
        H{i,j} blabla

我试着把它改编成并行代码,如下所示:

代码语言:javascript
复制
parfor ind = 1 : numel(H)
    [i, j] = ind2sub(ind);
    H{i,j} blabla

这将生成一个错误,说明parfor由于H{i,j}而无法运行。

,那么这里的错误是什么?如何将嵌套的循环调整为parfor?

是一个可能的解决方案

代码语言:javascript
复制
for i = 1 : size(H, 1)
    parfor j = 1 : size(H, 2)
        H{i,j} blabla

但是,我怀疑在另一个循环中使用parfor会增加parfor的开销,从而导致额外的计算时间

EN

回答 2

Stack Overflow用户

发布于 2014-05-05 09:47:13

我认为使用parfor的错误是Matlab无法通过循环检测[i,j]是唯一的,因为它是函数的结果。因此,对于引擎来说,您可以多次访问H{i,j},迭代不会被分析为相互独立。

编辑:正如patrik所提到的,您必须确保两个迭代之间不存在依赖关系,也就是说,在这里,H{i,j}不依赖于H{k,l}i!=k and j!=l,或者迭代中的变量的值在另一个迭代中使用。除了来自约简分配之外,这个要求是允许parfor的基本要求。

此外,如果您想并行地运行独立的计算,并且值得的话,始终选择parfor最外层的循环。此外,要提醒parfor;相反,如果要并行内部for-循环,则必须创建一个运行parfor的函数。内部循环的并行化可能不会带来速度的提高(取决于共享池中有多少工作人员)。

根据我的经验,不建议运行并行内环。作为一个例子(Matlab外),我会引用LibSVM,它建议只使用openmp并行最外层的循环,如果您想要加快计算速度,而不是其他内部循环。

此建议的原因是您的工作人员池有限,工作人员可能被视为线程;如果添加线程,由于线程之间切换时间的关系,计算运行速度会有所限制。Matlab可以很好地管理这一部分,但重点是,您将有一个有限的工人池的规模。如果每个最外层的迭代都需要大量的时间,如果有很多迭代,那么您将没有时间并行内部循环,因为每个工作人员都会忙于运行整个迭代(包括内部循环)。

尽管如此,测试每个选项总是一件好事,其中一些可能会反直觉地更适合您的问题!

票数 2
EN

Stack Overflow用户

发布于 2014-05-06 06:50:00

为什么不简单地使用线性指数来赋值给H?例如:

代码语言:javascript
复制
H = cell(4, 4);
parfor idx = 1:16
  [i, j] = ind2sub([4, 4], idx);
  H{idx} = rand(i, j); % or whatever
end

否则,最好将最外层的循环设置为PARFOR循环。下列措施也有效:

代码语言:javascript
复制
H = cell(4, 4);
parfor r = 1:4
  for c = 1:4
    H{r, c} = rand(r, c);
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23464294

复制
相关文章

相似问题

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