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