首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在matlab中将CPU使用率提高到100 %?

如何在matlab中将CPU使用率提高到100 %?
EN

Stack Overflow用户
提问于 2022-06-07 03:21:41
回答 2查看 317关注 0票数 0

我使用了一个parfor循环,但是CPU的使用率约为50%。计算机的配置如图所示。我能用的只有四个核心吗?有命令打开所有的核心吗?我怎么写parfor有关系吗?

简化代码如下:

代码语言:javascript
运行
复制
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;

EN

回答 2

Stack Overflow用户

发布于 2022-06-07 07:18:11

多线程是一个复杂的课题,特别是在MATLAB中,您几乎无法控制它是如何完成的。

性能

首先,并行化并不是提高性能的唯一方法,也不应该是唯一的实现方法。这里是MATLAB的建议。@Adriaan建议进行一些改进,这些改进可能比使用额外的CPU资源更能提高性能。

为什么不百分之百

您没有获得100% CPU使用率的原因是,MATLAB使用的工作人员与物理内核一样多。您的CPU有4个物理核,8个逻辑核,这就是为什么它的使用率约为50%。

完全使用CPU并不意味着更短的执行时间。

获得100 %并不能保证代码执行得更快。它可能对你有用,也可能不适用,原因有很多。如果你感兴趣,看看下面的评论和这个职位从MATLAB的答案。的最终答案是,您必须尝试并花费时间来查看使用更多的资源是否确实改善了您的执行时间。

达到100 %

有两种方法可以强制MATLAB使用100%的CPU。

  1. 您可以增加MATLAB用于匹配您所拥有的逻辑核数目的工作人员数量。
  2. 可以增加每个工作人员使用的线程数。

要做到这一点:

  • 在家庭工具栏中
  • ENVIRONMENT
  • 转到下拉菜单Parallel
  • 选择Create and Manage Clusters...
  • 在左侧列表中,选择要使用的集群(一般为local (default))
  • 单击右下角的“编辑”
  • 增加NumWorkers (选项1)或增加NumThreads (选项2)。
  • 如果您增加了NumWorkers,您可能还需要增加parallel preferences中的preferred number of workers,以使所有这些都从并行池中开始。

最后注记

  • 增加NumWorkers时要小心。根据我个人的经验,它可以在Ubuntu22.04上运行MATLAB。
  • 不要期望有太多的进步。一般来说,MATLAB都是关于做浮点运算的。然而,每个物理核通常只有一个浮点单元(FPU)。因此,你可能不会像你希望的那样得到更多的进步。
  • MATLAB预置的工人人数通常是一个很好的经验法则。我建议在优化的其他方面工作,并且只在最后才干预。
票数 2
EN

Stack Overflow用户

发布于 2022-06-07 07:28:04

代码中的一个更大的问题是,您有三个嵌套的forparfor循环,并将最内部的循环并行化。然而,只要有可能,就会出现。考虑到您还没有为我们提供GetdatazSolve_CC_rhoE_zGau,我将假设这些都是很轻的函数,使得MATLAB花费更多的时间在工作人员之间来回移动数据,而不是实际的计算。

您只有1000个迭代,对于parfor来说不是很多。spmd()parfeval可能更适合您的情况。如果要继续使用parfor,请按如下方式重新排列循环:

代码语言:javascript
运行
复制
parfor k1 = 1:length(delta0)
    for jj = 1:length(r0)
        for ii = 1:ave
            (...)
        end
    end
end

由于r0只包含两个值,所以不要将其用作外部循环,因为这样只能运行两个并行线程。此外,考虑到是内置变量。,我通常警告不要将它们用作循环变量。

您可能需要阅读parfor-loops。通常,当您有大量迭代(幅度超过1000)或每一个单独的迭代非常重(在这种情况下建议使用spmdparfeval )时,建议使用spmd。有关简短摘要,请参见我的这个答案

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72525563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档