【发布时间】:2020-01-24 14:57:56
【问题描述】:
我的计算基于二叉树,它采用变量块(称为程序集)的两个先前实例并生成另一个。 基于上分支的两个程序集生成一个新程序集,因此必须存储所有变量。
为此,我使用具有以下语法的元胞数组:Assembly_ij = Tree{ithBranch}{jthAssembly},其中Assembly 是18x3 double 矩阵。这种方法是 Matlab 的allowed,但是,它根本没有改进代码的执行。
我相信这是由于我将变量传递给工人的方式不恰当。我收到以下警告:
整个数组或结构“树”是一个广播变量。这 可能会导致不必要的通信开销。
大部分工作都在这部分代码中完成,它应该传达我正在犯的错误。
initialBranch = initialize();
Tree{1} = initialBranch;
for i = 2 : Nbranches
branch = cell(1, elmsInBranch(i));
parfor j = 1 : elmsInBranch(i)
branch{j} = assembleBlocks(Tree{i-1}{2*j-1}, Tree{i-1}{2*j});
end
Tree{i} = branch;
end
Matlab 必须将整个 Tree 结构传递给每个 worker,这是很多无用的复制。我不知道如何重写它以使其正常工作,但是,也许有一些聪明的方法可以为每个工人提取所需的变量?
【问题讨论】:
-
您是否尝试分配
previous_branch = Tree{i-1},并在parfor循环中使用该变量? -
即使 matlab 接受上述建模,它并没有真正使用您问题的局部性。假设你有 4 个工人。从第 3 级开始,每个工人可以在不与任何其他工人交谈的情况下完成树的 1/4。只有在最后,整棵树才必须放在一起。显然实施起来更具挑战性,但可能值得。
标签: matlab parallel-processing