【发布时间】: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时,我发现事实并非如此。 -
你在运行过程中分析过你的内存消耗吗?
标签: arrays matlab parallel-processing parfor