【发布时间】:2013-11-30 01:43:27
【问题描述】:
parfor 是一种在多个“工作人员”之间分配独立迭代的密集计算的便捷方式。一个有意义的限制是 parfor-loops 不能嵌套,并且总是可以回答类似问题,例如 there 和 there。
为什么如此需要跨循环边界的并行化
考虑以下一段代码,其中在允许 4 个工作人员的机器上,迭代所花费的时间变化很大。两个循环都迭代了 6 个值,显然很难在 4 个值之间共享。
for row = 1:6
parfor col = 1:6
somefun(row, col);
end
end
为parfor 选择内部循环似乎是个好主意,因为对somefun 的单独调用比外部循环的迭代变化更大。但是,如果每次调用somefun 的运行时间非常相似怎么办?如果运行时有趋势并且我们有三个嵌套循环怎么办?这些问题经常出现,人们去extremes。
组合循环所需的模式
理想情况下,somefun 对所有 row 和 col 对都运行,并且无论迭代哪个迭代,工作人员都应该忙碌起来。解决方案应该是这样的
parfor p = allpairs(1:6, 1:6)
somefun(p(1), p(2));
end
不幸的是,即使我知道哪个内置函数创建了一个包含 row 和 col 的所有组合的矩阵,MATLAB 也会报错 Parfor 语句的范围必须是行向量。 em> 然而,for 不会抱怨并很好地遍历列。一个简单的解决方法是创建该矩阵,然后使用 parfor 对其进行索引:
p = allpairs(1:6, 1:6);
parfor k = 1:size(pairs, 2)
row = p(k, 1);
col = p(k, 2);
somefun(row, col);
end
我正在寻找代替 allpairs 的内置函数是什么?有人想出了一个方便的惯用模式吗?
【问题讨论】:
标签: matlab nested-loops parfor