2013-07-23 9 views
10

推奨する索引付け方法を選択しようとしているうちに、パフォーマンスを評価しようとしました。しかし、測定値は私をたくさん混乱させました。私はこれを複数の異なる順序で実行しましたが、測定値は一貫しています。索引作成のパフォーマンス

for N = [10000 15000 100000 150000] 
    x = round(rand(N,1)*5)-2; 
    idx1 = x~=0; 
    idx2 = abs(x)>0; 

    tic 
    for t = 1:5000 
     idx1 = x~=0; 
    end 
    toc 

    tic 
    for t = 1:5000 
     idx2 = abs(x)>0; 
    end 
    toc 
end 

そして、これが結果です:

Elapsed time is 0.203504 seconds. 
Elapsed time is 0.230439 seconds. 

Elapsed time is 0.319840 seconds. 
Elapsed time is 0.352562 seconds. 

Elapsed time is 2.118108 seconds. % This is the strange part 
Elapsed time is 0.434818 seconds. 

Elapsed time is 0.508882 seconds. 
Elapsed time is 0.550144 seconds. 

私がチェックし、100000この周りの値に対しても奇妙な測定が発生しても50000で、たまたまここ は、私は、パフォーマンスを測定する方法です。

私の質問です:他の誰かがこれを特定の範囲で経験していますか? (これはバグですか?)

+0

さて、私は間違いなく '腹筋を想定し、それは本当に2つの操作を行っているので、(X)> 0 '遅くなるだろうが、100000のN裁判でしょう、これに従っていません。奇妙な。しかし、私はほとんどの場合、 'x〜= 0'を使うのは1つの操作しかしないためです。また、2つの違いは、私にとってはそれほど高くないことに注意してください。 3回目の試行は0.4秒だけではなく、1.5 – MZimmerman6

+0

であり、私の唯一の考えは、100k試行でバックグラウンドで起こっていることでしょう。 – MZimmerman6

+0

私は同じことを見ていますが、それほど激しくはありません(R2012b、OS X 10.8.4)。私は 'abs(x)> 0'が2つの操作を行うと仮定しません。 JITがコンパイルされると、符号ビットは比較で無視できます。実際には、より複雑な(x> 0 | x <0)に相当する 'x〜= 0'のケースです。サイズの違いの理由の1つに[cache missing](https://en.wikipedia.org/wiki/CPU_cache#Cache_miss)があります。詳しくは[こちら](http://stackoverflow.com/questions)で説明しています。/8547778/why-is-one-loop-so-much-two-loopsよりも遅い)。 – horchler

答えて

6

を使用してJITオフには、これは、いくつかの自動最適化MathWorks社のMATLABは、その基本線形代数サブルーチンの使用に起因することがあります。

私の設定(OSX 10.8.4、デフォルト設定のR2012a)は、x(11e5要素)よりもx(10e5要素)の方が計算が遅くなります(idx1 = x~=0)。異なるベクトルサイズ(x軸)に対して処理時間(y軸)が測定される図の左側のパネルを参照してください。 N> 103000の場合、より低い処理時間が表示されます。このパネルでは、計算中にアクティブだったコアの数も表示しました。 1コア構成の場合、ドロップがないことがわかります。つまり、1つのコアがアクティブな場合(並列化は不可能)、matlabは~=の実行を最適化しません。 Matlabは、複数のコアと十分な大きさのベクトルの2つの条件が満たされたときに最適化ルーチンを有効にします。

feature('accel','on'/off')がオフ(doc)に設定されている場合、右側のパネルに結果が表示されます。ここでは、1つのコアのみがアクティブであり(1コアと4コアは同一)、最適化は不可能です。

最後に、コアをアクティブ/非アクティブ化するために使用した機能はmaxNumCompThreadsです。 Loren Shureによると、maxNumCompThreadsはJITとBLASの両方を制御します。 feature('JIT','on'/'off')はパフォーマンスの役割を果たさなかったため、残りの最後のオプションはBLASです。

私は最後の文をLorenに残します:"ここでの主なメッセージは、通常、この関数[maxNumCompThreads]を使う必要はないということです!なぜですか?MATLABを最良の仕事にしたいのですあなたのために可能です。enter image description here

accel = {'on';'off'}; 
figure('Color','w'); 
N = 100000:1000:105000; 

for ind_accel = 2:-1:1 
    eval(['feature(''accel'',''' accel{ind_accel} ''')']); 
    tElapsed = zeros(4,length(N)); 
    for ind_core = 1:4 
     maxNumCompThreads(ind_core); 
     n_core = maxNumCompThreads; 
     for ii = 1:length(N) 
      fprintf('core asked: %d(true:%d) - N:%d\n',ind_core,n_core, ii); 
      x = round(rand(N(ii),1)*5)-2; 
      idx1 = x~=0; 
      tStart = tic; 
      for t = 1:5000 
       idx1 = x~=0; 
      end 
      tElapsed(ind_core,ii) = toc(tStart); 
     end 
    end 
    h2 = subplot(1,2,ind_accel); 
    plot(N, tElapsed,'-o','MarkerSize',10); 
    legend({('1':'4')'}); 
    xlabel('Vector size','FontSize',14); 
    ylabel('Processing time','FontSize',14); 
    set(gca,'FontSize',14,'YLim',[0.2 0.7]); 
    title(['accel ' accel{ind_accel}]); 
end 
+0

私は、理想的にはより良い結果につながるとすぐに最適化が始まると思います。だから、私が正しく理解している場合:この操作(私たちのコンピュータ上で)最適化は単に遅すぎるでキック? –

+0

yep - "あなたのための最高の仕事"の設定/制限のいずれかが見つかりました。しかし、確かにmatlabの開発者はこれを認識しており、意図的にそれをしました。 – marsei

7

これはJITと関係があります(以下の結果は2011bを使用しています)。システム、Matlabのバージョン、変数のサイズ、ループの内容によっては、JITを使用する方が必ずしも高速であるとは限りません。これは、「ウォームアップ」エフェクトに関連しています。セッションでmファイルを複数回実行すると、アクセラレータがコードの一部を一度コンパイルするだけで済むため、最初の実行後に時間がかかります。

(上の特徴アクセル)

Elapsed time is 0.176765 seconds. 
Elapsed time is 0.185301 seconds. 

Elapsed time is 0.252631 seconds. 
Elapsed time is 0.284415 seconds. 

Elapsed time is 1.782446 seconds. 
Elapsed time is 0.693508 seconds. 

Elapsed time is 0.855005 seconds. 
Elapsed time is 1.004955 seconds. 

JITオフ(特徴アクセルオフ)

Elapsed time is 0.143924 seconds. 
Elapsed time is 0.184360 seconds. 

Elapsed time is 0.206405 seconds. 
Elapsed time is 0.306424 seconds. 

Elapsed time is 1.416654 seconds. 
Elapsed time is 2.718846 seconds. 

Elapsed time is 2.110420 seconds. 
Elapsed time is 4.027782 seconds. 

ETA、あなたはダブルスの代わりに整数を使用する場合、何が起こるか見てちょっと面白いのJIT:

JITオン、同じコードですが、int8を使用してxを変換しました

Elapsed time is 0.202201 seconds. 
Elapsed time is 0.192103 seconds. 

Elapsed time is 0.294974 seconds. 
Elapsed time is 0.296191 seconds. 

Elapsed time is 2.001245 seconds. 
Elapsed time is 2.038713 seconds. 

Elapsed time is 0.870500 seconds. 
Elapsed time is 0.898301 seconds. 

INT8

Elapsed time is 0.198611 seconds. 
Elapsed time is 0.187589 seconds. 

Elapsed time is 0.282775 seconds. 
Elapsed time is 0.282938 seconds. 

Elapsed time is 1.837561 seconds. 
Elapsed time is 1.846766 seconds. 

Elapsed time is 2.746034 seconds. 
Elapsed time is 2.760067 seconds. 
+0

JITをオフに切り替えると実際には高速になります。しかし、もしウォームアップが問題になるのであれば、100000が150000よりも遅い理由は説明できないでしょう。 'N = [10000 15000 150000 100000]' –

+0

ウォームアップが動作しないと思いますコマンドラインで私は基本的に、可変サイズの関数である可能性があるJITを使用することにいくらかのオーバーヘッドがあり、可変サイズの関数であるいくつかの利点があると推測しています。最終的に利益はオーバーヘッドよりも大きくなりますが、x> 150000程度のサイズ(この場合)までではありません。 – nkjt

+0

実際にJITから来ないかもしれない - 私の答えを見てください。 – marsei

関連する問題