8

MEX を使用してコンパイルした後、MATLAB から呼び出すいくつかの C コードを作成しました。C コード内で、次のコードを使用して計算の一部の時間を測定します。

clock_t begin, end;
double time_elapsed;
begin = clock();
/* do stuff... */
end = clock();
time_elapsed = (double) ((double) (end - begin) / (double) CLOCKS_PER_SEC);

経過時間は秒単位の実行時間です。

次に、値time_elapsedを MATLAB に出力します (正しくエクスポートされていることを確認しました)。次に、MATLAB 側でこの C 関数を呼び出し (MEX を使用してコンパイルした後)、 と を使用して実行時間を測定しticますtoc。完全にばかげていることが判明したのは、tic と toc を使用して計算した時間は 0.0011 秒 (500 回の実行で平均、st. dev. 1.4e-4) であるのに対し、C コードによって返される時間は 0.037 秒 ( 500 回の実行の平均、st. dev. 0.0016)。

ここで、2 つの非常に奇妙な事実に気付くかもしれません。

  1. 関数全体の実行時間は、コードの一部の実行時間よりも短くなります。したがって、MATLAB または C の測定値は非常に不正確です。
  2. C コードで測定された実行時間は非常にばらつきがあり、非常に高い st を示しています。偏差 (変動係数 44%、tic-toc のわずか 13% と比較)。

これらのタイマーで何が起こっていますか?

4

1 に答える 1

6

あなたはリンゴとオレンジを比較しています。

Matlabのドキュメントを見てください:

チック-http : //www.mathworks.com/help/matlab/ref/tic.htmltoc-http :
//www.mathworks.com/help/matlab/ref/toc.html

tictocを使用すると、実際の経過時間を測定できます。

次に、時計関数http://linux.die.net/man/3/clockを見てください。

特に、

clock()関数は、プログラムで使用されるプロセッサ時間の概算を返します。

返される値は、clock_tまでに使用されたCPU時間です。使用された秒数を取得するには、CLOCKS_PER_SECで除算します。使用されたプロセッサ時間が利用できない場合、またはその値を表すことができない場合、関数は値(clock_t)-1を返します。

それで、あなたの違いを説明できるものは何ですか?

  • CPU時間(clock()で測定)と実際の経過時間(ticとtocで測定)は同じではありません。それで、CPU時間は経過時間よりも短いと予想しますか?まあ、多分。0.0011秒以内に100%で10コアを駆動している場合はどうなりますか?これは、clock()の測定値がticおよびtocで測定された値の10倍であることを意味します。可能性は低いです。
  • clock(。)は非常に不正確であり、ドキュメントと一致しているため、おおよそのCPU時間の測定値です。スケジューラのクォンタムサイズに固定されているのではないかと思いますが、Linuxカーネルコードを調べて確認しませんでした。私も他のOSをチェックしませんでしたが、この男のブログはその理論と一致しています。

だから何をすべきか...まず、リンゴとリンゴを比較してください!次に、タイマーの解像度を考慮に入れてください。

于 2013-02-01T03:44:14.340 に答える