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