matlab parfor在大型矩阵上的操作非常慢

hyrbngr7  于 2023-04-06  发布在  Matlab
关注(0)|答案(1)|浏览(467)

我正在写一个matlab代码,它对一个大矩阵进行一些运算。首先我创建了三个3D数组

dw2 = 0.001;
W2 = [0:dw2:1];
dp = 0.001;
P1 = [dp:dp:1];
dI = 0.001;
I = [1:-dI:0];
[II,p1,ww2] = ndgrid(I,P1,W2);

然后我的代码基本上做以下事情

G = [0:0.1:10]
Y = zeros(length(G),1)
for i = 1:1:length(G)
    g = G(i);
    Y(i) = myfunction(II,p1,ww2,g)
end

这段代码大约需要100秒,每次迭代大约需要10秒。
但是,在启动parfor之后

ProcessPool with properties: 

            Connected: true
           NumWorkers: 48
              Cluster: local
        AttachedFiles: {}
    AutoAddClientPath: true
          IdleTimeout: 30 minutes (30 minutes remaining)
          SpmdEnabled: true

那就像永远在跑一样,最多48个工人,我也试过2,5,10.所有这些都比非并行计算慢。这是因为matlab复制了II,p1,ww2 48次而导致的问题吗?还有myfunction涉及到大量的向量化。我已经优化了myfunction。这会导致parfor的性能变慢吗?有没有办法利用48个worker来加速代码?任何评论都非常感谢。我需要运行数百万个案例。所以我真的希望我能以某种方式利用48个worker。

dgjrabp2

dgjrabp21#

看起来你有很大的数据,而且有很多MATLAB工作者。大数据必须复制到每个工作者,结果必须复制回来。这需要时间。此外,使用那么多进程可能会耗尽内存,这会使事情变得非常缓慢。
我建议你将你的worker设置为线程,而不是单独的进程。这样,它们使用共享内存,数据不需要复制。你可以用parpool('threads')来做到这一点。你的代码必须符合一些限制,不是所有的代码都可以这样运行,请参阅here
基于进程的并行性,即MATLAB的多个副本,每个副本都有自己的数据,并进行通信以来回复制数据,最初设计用于计算集群。该系统后来被调整为在具有多个核心的单台机器上工作。我不认为这是在单台机器上使用的理想系统,它只是易于实现。
有关详细信息,请参阅this documentation page

相关问题