matlab parfor 在大型矩阵上运行非常慢

问题描述 投票:0回答:1

我正在编写一个 matlab 代码,它对一个大矩阵进行一些操作。首先我创建三个 3D array

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

这段代码大概需要100s左右,每次迭代将近10s。

然而,在我开始后

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 名工人(中的一部分)来加速代码?任何评论都非常感谢。我需要运行数百万个案例。所以我真的希望我能以某种方式利用这 48 名工人。

matlab parallel-processing parfor
1个回答
3
投票

看来你的数据量很大,而且MATLAB workers很多。必须将大数据复制到每个工人,并且必须将结果复制回来。这需要时间。此外,使用那么多进程可能会耗尽内存,这会使事情变得非常缓慢。

我建议您将工作人员设置为线程,而不是单独的进程。这样,他们使用共享内存,数据不需要复制。 你可以用

parpool('threads')
来做到这一点。您的代码必须符合一些限制,并非所有代码都可以这样运行,请参阅here.

基于进程的并行性,具有多个 MATLAB 副本,每个副本都有自己的数据,并通过通信来回复制数据,最初设计用于在计算集群上工作。该系统后来被改编为在具有多核的单机上工作。我不认为这是一个在单台机器上使用的理想系统,它很容易实现。

有关详细信息,请参阅此文档页面

© www.soinside.com 2019 - 2024. All rights reserved.