如何让两个嵌套的 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_oneB=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 中迭代两个巨大的数组?的主要内容,如果未能解决你的问题,请参考以下文章

Matlab - 在嵌套的 if 语句中继续下一个 elseif

matlab如何让坐标轴的值减少一百倍

matlab里面的for循环嵌套

如何在matlab中将两个图叠加到一起?

如何利用matlab求相关系数?

如果 MATLAB Rb2020 中的行和列维度不一致,如何取消嵌套具有嵌套数据和文本内容的元胞数组?