2016-12-06 1731 views
0

我有一个耗时运行的代码,因为它包含一些for循环。代码是否可以通过使用矢量化进行优化是另一个话题。问题是,由于完成需要很长时间(几小时),所以我决定在代码运行时检查CPU利用率。令我惊讶的是,我发现它在0到3%之间波动!如何在循环运行MATLAB代码时提高CPU利用率?

enter image description here

为什么不利用至少25%的CPU,因为我的CPU是四核(我认为每个核心处理1个线程在同一时间,是不是?),默认情况下,当没有做别的事情?运行代码时如何提高CPU利用率,以便更快地执行?

如果它是相关的,这里是代码(在截图功能xyz)我正在运行:如果你想利用你可以使用多个线程

users(:,1)=unique(M(:,10)); 
categories(:,1)=unique(M(:,2)); 
N=size(users,1); 
for i=1:N 
    U=M(M(:,10)==users(i,1),:); 
    C(:,1)=unique(U(:,2)); 
    [~,~,subs] = unique(U(:,2)); 
    vals = U(:,9); 
    C(:,2) = accumarray(subs(:), vals(:), [], @(x) 1-mean(x)); 
    for j=1:size(categories,1) 
     for k=1:size(C,1) 
      if categories(j,1)==C(k,1) 
       categories(j,i)=C(k,2); 
      end 
     end 
    end 
    clear C; 
end 
+0

这可能是由于您的系统/操作系统配置,它不能使用超过4GB的内存并将其任务卸载到硬盘上。 – rahnema1

+0

我纯粹推测的答案是,它实际计算使用100%的单CPU,但利用率_per second_(事实上,我相信该图显示CPU每6秒利用率)远低于您的计算是在一个未优化的三重嵌套循环中完成的,因此每个计算之间有很多空闲时间。 – craigim

回答

0

默认情况下MATLAB程序是单线程一个parfor循环https://www.mathworks.com/help/distcomp/parfor.html(假设你有并行工具箱)。快速浏览一下,你的代码看起来可以在你的任何循环中并行化,但它在选择最佳选择方面有点平衡;它高度依赖于每个循环在运行时会有的迭代次数。

+0

您应该在此添加,只有具有Parallel Toolbox的情况下才可用。 – craigim

+0

公平点我认为这是理所当然的 – Danny