我正在写一个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名工作人员中的一些来加快代码的速度?如有任何意见,我们将不胜感激。我需要处理数百万个案子。所以我真的希望我能以某种方式利用这48名工人。
看起来你有大量的数据和大量的MATLAB工作人员。必须将大数据复制到每个工作者,并且必须将结果复制回。这需要时间。此外,使用这么多进程可能会耗尽内存,这会使事情变得非常缓慢。
我建议您将工作人员设置为线程,而不是单独的进程。通过这种方式,它们使用共享内存,并且数据不需要复制。您可以使用parpool('threads')
执行此操作。您的代码必须符合某些限制,并非所有代码都可以以这种方式运行,请参阅此处。
基于过程的并行性,有多个MATLAB副本,每个副本都有自己的数据,并通过通信来回复制数据,最初设计用于在计算集群上工作。该系统后来被调整为在具有多个核心的单机上工作。我不认为这是一个在单机上使用的理想系统,它只是很容易实现。
有关更多信息,请参阅此文档页。