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でも奇妙な測定値が発生します。

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

4

2 に答える 2

6

これは、Matlab が Basic Linear Algebra Subroutine に使用するいくつかの自動最適化が原因である可能性があります。

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

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

最後に、コアのアクティブ化/非アクティブ化に使用した関数は ですmaxNumCompThreadsLoren Shureによると、maxNumCompThreads は JIT とBLASの両方を制御します。feature('JIT','on'/'off')パフォーマンスに関与しなかったため、BLAS は最後の選択肢です。

最後の文は Loren に任せます。 「ここでの主なメッセージは、通常、この関数 [maxNumCompThreads] を使用する必要はまったくないということです!なぜですか?MATLAB に可能な限り最高の仕事をさせたいからです。」ここに画像の説明を入力

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
于 2013-07-28T01:33:12.223 に答える