【问题标题】:How to have two nested Parfors iterating over two huge arrays in Matlab?如何让两个嵌套的 Parfors 在 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 时,我发现事实并非如此。
  • 你在运行过程中分析过你的内存消耗吗?

标签: arrays matlab parallel-processing parfor


【解决方案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 循环中完成
  • 嗯,恐怕我不知道该怎么办。抱歉,我无法提供更多帮助!
猜你喜欢
  • 1970-01-01
  • 2012-08-10
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
相关资源
最近更新 更多