如何让两个嵌套的 Parfors 在 Matlab 中迭代两个巨大的数组?
Posted
技术标签:
【中文标题】如何让两个嵌套的 Parfors 在 Matlab 中迭代两个巨大的数组?【英文标题】:How to have two nested Parfors iterating over two huge arrays in Matlab? 【发布时间】:2018-01-21 21:53:16 【问题描述】:考虑到两个数组,A=Huge_Arrau_one
和 B=Huge_array_two
,如何更改以下代码以在 Matlab 中工作(因为 Matlab 不接受嵌套循环)。
parfor (i,j) in all_combinations_of_A_and_B_indices
A_in_this_worker = A(i);
B_in_this_worker = B(j);
....
end
请注意,我不希望每个工作人员的所有 A 和 B 数组都保存在内存中,因为每个工作人员只需要其中的一小部分。 之前已经讨论过这个问题,用于索引二维数组的二维(使用 sub2ind 和 ind2sub 函数),但奇怪的是,我从未见过我目前正在努力解决的问题的这个版本。 事实上,我希望每个组合都有一个单独的工作人员,并且我需要访问每个工作人员中 A 和 B 的一部分。
【问题讨论】:
为什么不在这里也使用ind2sub
?将循环头定义为parfor ind = 1:(szA*szB)
...然后在循环内部检索索引为i,j = ind2sub([szA,szB],ind);
以这种方式访问 A(i) 和 B(j) 会导致 Matlab 为每个 worker 加载整个 A 和 B。
我使用的是 MATLAB 2016b。我收到警告说,像这样访问 A 和 B “可能会导致不必要的通信开销”,但是当我检查 ticBytes
/tocBytes
时,我发现事实并非如此。
你在运行过程中分析过你的内存消耗吗?
【参考方案1】:
method Mathworks suggests 是在 for 循环周围使用 parfor 循环 你可能想这样做:
parfor i = 1:length(Array_A)
for j = 1:length(Array_B)
% your code here
end
end
基本上,确保将外部循环作为 parfor 循环运行
【讨论】:
感谢您的回答,但实际上我希望每个组合都有一个单独的工人。 它们都需要在同一个嵌套循环中完成吗?或者它们可以在两个单独的 parfor 循环中完成 嗯,恐怕我不知道该怎么办。抱歉,我无法提供更多帮助!以上是关于如何让两个嵌套的 Parfors 在 Matlab 中迭代两个巨大的数组?的主要内容,如果未能解决你的问题,请参考以下文章