2016-12-06 100 views
0

いくつかのループが含まれているため、実行に時間がかかるコードがあります。ベクトル化を使用してコードを最適化できるかどうかは別のトピックです。問題は、完了するまでに長時間(時間)を要していたため、コード実行時にCPU使用率をチェックすることにしました。私の驚いたことに、私はそれが0%と3%の間で変動していることを発見しました!ループを使用してMATLABコードを実行しているときのCPU使用率を上げるにはどうすればよいですか?

enter image description here

私のCPUはクワッドコアであるため、なぜCPUは、少なくとも25%を利用していない(と私は、各コアが、それはありませんが、一度に1つのスレッドを扱うと思う?)、デフォルトではときに他に何もしていないのですか?コード実行時にCPU使用率を上げて実行速度を上げるにはどうすればよいですか?それが関連している、ここで私が実行しているコード(機能のスクリーンショットでxyz)がある場合には

:あなたはあなたが使用できる多くのスレッドを利用したい場合は、デフォルトのMATLABプログラムによって

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

システム/ OS構成によっては、4GBを超えるメモリを使用できないため、ハードディスク上でタスクをオフロードする可能性があります。 – rahnema1

+0

私の純粋に推測的な答えは、実際の計算には単一のCPUの100%を使用していますが、利用率は2秒目です(実際にはグラフが6秒あたりのCPU使用率を示していると思います)最適化されていないトリプルネストループで実行されているため、個々の計算の間に多くのアイドル時間があります。 – craigim

答えて

0

はシングルスレッドですa parforループhttps://www.mathworks.com/help/distcomp/parfor.html(Parallel Toolboxがあると仮定します)。すばやく、あなたのコードはあなたのループのどれかで並列化できるように見えますが、最良の選択肢を選ぶための少しのバランスです。各ループが実行時に持つ反復回数に大きく依存します。

+0

これは、Parallel Toolboxをお持ちの場合にのみ使用できることをここに追加する必要があります。 – craigim

+0

公正なポイント私はそれを当然と考えました – Danny

関連する問題