【问题标题】:Is this a true way of using parallel pools in MATLAB?这是在 MATLAB 中使用并行池的真正方法吗?
【发布时间】:2017-01-06 23:54:18
【问题描述】:

我正在使用具有 2 个物理 CPU 内核的机器。 Arii_Modified 函数是我写的。当我在不使用并行池的情况下运行如下代码时,所用时间为425.456

profile on
[Ps,Pd,Pv,ThetaMean,Variance,frobonius] = Arii2011_Modified(C11,C12_imag,C12_real,C13_imag,C13_real,C22,C23_imag,C23_real,C33);
profile off
profsave
span = C11+C22+C33;
total=Pd+Ps+Pv+frobonius;
save('results.mat');  

但是当我启动一个有两个工人的并行池时:

parpool('local',2)
profile on
[Ps,Pd,Pv,ThetaMean,Variance,frobonius] = Arii2011_Modified(C11,C12_imag,C12_real,C13_imag,C13_real,C22,C23_imag,C23_real,C33);
profile off
profsave
span = C11+C22+C33;
total=Pd+Ps+Pv+frobonius;
save('results.mat');
p = gcp;
delete(p)  

所用时间为 687.687 秒。
我是否以真正的方式使用并行池?
函数Arii2011_modified 中的代码完全是顺序的。
我已经使用 MEX 解决方案来加速它,但在 Arii2011_Modified.m 代码和其中的 mex 函数的 C++ 源代码中都没有使用并行编程代码?

【问题讨论】:

    标签: c++ matlab parallel-processing


    【解决方案1】:

    parpool 本身并不能神奇地使任何代码并行运行并且执行得更快。它只是创建了一个 MATLAB 实例池,这些实例可以作为工作人员来处理您传递给他们的任务。您只是创建了一个并行池(使用parpool)但从未实际使用它,因此您不能期望您的代码执行得更快。增加的执行时间仅仅是因为启动池所需的时间。

    如果您想真正使用您创建的并行池,您需要将部分代码包装在parfor 构造中,其中parfor 中的每次迭代都是独立的,并且通过parfor 循环的每次迭代都将移交给可用的工作人员之一。

    如果您的代码实际上不可并行化,则可能值得仔细查看Arii2011_Modified.m,看看您是否可以对其中的某些部分进行矢量化以缩短执行时间。

    The Mathworks 有一些很棒的 documentation 介绍了如何利用 MATLAB 中的并行计算。

    附带说明,如果您想实际测量执行时间,profile 是一种不好的方法,因为它会跟踪所有函数调用,因此会引入大量开销。相反,您应该使用timeit

    【讨论】:

    • 谢谢。我的代码不能使用parfor 等,因为我已经在C++ 中实现了所有for loops 并且它们是预编译的。但另一种选择是使用分布式数组并为每个worker 分配整个数组的一部分以在其上运行函数。我怎样才能以编程方式而不是手动执行此操作?有可能吗?
    • @sepideh 没有单一的最佳方法可以做到这一点。你必须自己实现。正如我所说,在 MATLAB 中对一些代码进行矢量化处理(删除 for 循环)并比较执行时间可能是值得的。
    • 好的,我现在给你看代码。没有办法在 matlab 中对代码进行矢量化了。
    • @sepideh 这真的超出了这个问题的范围,可能更适合 codereview.stackexchange.com 这个问题是关于为什么parpool 没有减少执行时间。
    猜你喜欢
    • 2022-10-25
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2018-12-31
    • 2021-04-29
    • 1970-01-01
    相关资源
    最近更新 更多