parfor
是在多个“工作人员”之间分配密集计算的独立迭代的便捷方式。一个有意义的限制是parfor
-loops 不能嵌套,并且始终是对there和there等类似问题的答案。
为什么跨循环边界的并行化如此可取
考虑以下代码,其中迭代在允许 4 个工作人员的机器上花费高度可变的时间。两个循环都迭代了 6 个值,显然很难在 4 个值之间共享。
for row = 1:6
parfor col = 1:6
somefun(row, col);
end
end
选择内部循环似乎是一个好主意,parfor
因为单个调用somefun
比外部循环的迭代更具可变性。但是,如果每次调用的运行时间somefun
都非常相似怎么办?如果运行时有趋势并且我们有三个嵌套循环怎么办?这些问题经常出现,人们走极端。
组合循环所需的模式
理想情况下,somefun
为所有对运行row
and col
,并且无论 iterand 正在变化,工作人员都应该忙起来。解决方案应该看起来像
parfor p = allpairs(1:6, 1:6)
somefun(p(1), p(2));
end
不幸的是,即使我知道哪个内置函数创建了一个包含 和 的所有组合的矩阵row
,col
MATLAB 也会报错Parfor 语句的范围必须是行向量。然而,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
我正在寻找的内置函数是什么?有人想出了一个方便的惯用模式吗?