我使用了一个parfor
循环,但是CPU的使用率约为50%。计算机的配置如图所示。我能用的只有四个核心吗?有命令打开所有的核心吗?我怎么写parfor
有关系吗?
简化代码如下:
n = 5;
d = 2^n;
r0 = [2 3];
m = d^2;
delta0 = 0:0.05:0.5;
ave = 50;
tic;
for j = 1:length(r0)
for k1 = 1:length(delta0)
delta = delta0(k1);
r = r0(j);
parfor i = 1:ave
% Getdataz and Solve_CC_rhoE_zGau are function file
[Pauli,y,rhoT,noiseT] = Getdataz(d,n,r,m,s,delta);
[rhoE,noiseE] = Solve_CC_rhoE_zGau(n,r,m,s,Pauli,y,noiseT,delta);
rhoE = rhoE/trace(rhoE);
FdRho(i) = fullfidelity(rhoT,rhoE);
end
out.delta(k1,1) = delta;
out.FdRho(k1,:) = FdRho;
end
end
toc;
发布于 2022-06-07 07:18:11
多线程是一个复杂的课题,特别是在MATLAB中,您几乎无法控制它是如何完成的。
性能
首先,并行化并不是提高性能的唯一方法,也不应该是唯一的实现方法。这里是MATLAB的建议。@Adriaan建议进行一些改进,这些改进可能比使用额外的CPU资源更能提高性能。
为什么不百分之百
您没有获得100% CPU使用率的原因是,MATLAB使用的工作人员与物理内核一样多。您的CPU有4个物理核,8个逻辑核,这就是为什么它的使用率约为50%。
完全使用CPU并不意味着更短的执行时间。
获得100 %并不能保证代码执行得更快。它可能对你有用,也可能不适用,原因有很多。如果你感兴趣,看看下面的评论和这个职位从MATLAB的答案。的最终答案是,您必须尝试并花费时间来查看使用更多的资源是否确实改善了您的执行时间。
达到100 %
有两种方法可以强制MATLAB使用100%的CPU。
要做到这一点:
ENVIRONMENT
下Parallel
。Create and Manage Clusters...
local (default)
)NumWorkers
(选项1)或增加NumThreads
(选项2)。NumWorkers
,您可能还需要增加parallel preferences
中的preferred number of workers
,以使所有这些都从并行池中开始。最后注记
NumWorkers
时要小心。根据我个人的经验,它可以在Ubuntu22.04上运行MATLAB。发布于 2022-06-07 07:28:04
代码中的一个更大的问题是,您有三个嵌套的for
或parfor
循环,并将最内部的循环并行化。然而,只要有可能,一就会出现。考虑到您还没有为我们提供Getdataz
或Solve_CC_rhoE_zGau
,我将假设这些都是很轻的函数,使得MATLAB花费更多的时间在工作人员之间来回移动数据,而不是实际的计算。
您只有1000个迭代,对于parfor
来说不是很多。spmd()
或parfeval
可能更适合您的情况。如果要继续使用parfor
,请按如下方式重新排列循环:
parfor k1 = 1:length(delta0)
for jj = 1:length(r0)
for ii = 1:ave
(...)
end
end
end
由于r0
只包含两个值,所以不要将其用作外部循环,因为这样只能运行两个并行线程。此外,考虑到是内置变量。,我通常警告不要将它们用作循环变量。
您可能需要阅读parfor
和-loops。通常,当您有大量迭代(幅度超过1000)或每一个单独的迭代非常重(在这种情况下建议使用spmd
或parfeval
)时,建议使用spmd
。有关简短摘要,请参见我的这个答案。
https://stackoverflow.com/questions/72525563
复制相似问题