P.112でのFFTの計算について(誤植とFLOPS関数の問題)
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
P.112 ページは frops()→flops c;(1,k)→c(1,k) の誤植です。 ただし、動作するのは、MATLAB5.x以前のバージョンのみです。 誤植を直しても最新のMATLAB 6では動作しないようです。 理由は、 >> help flops FLOPS 削除される浮動小数点演算のカウント MATLAB の前のバージョンでは、浮動小数点演算数をカウントしていました。 MATLAB 6で使用している LAPACK では、このコマンドは、実行しません。 とかいてあるとおりです。詳しい理由については、 http://www.mathworks.com/support/solutions/data/24987.shtml に書いてあります。 意訳すると、 昔は、計算に乗算回数が問題となったため、それに応じたアルゴリズムが組まれflopsが ある種の指標となっていたらしいです。しかし現在の、ハードウェアのアーキテクチャで は、乗算の計算時間もハードにより異なり、命令によりかなり異なる場合があります。 そのような理由より、flops関数そのものの存在意義が薄れてしまったこと、とこ れに似たコマンドを厳密にサポートすると、計算パフォーマンスが大幅に遅くなっ てしまうなどの理由のようです。 特にMATLAB6のFFTは、処理速度の改善する方法として乗算回数にこだわらず、プロ セッサやメモリ階層にどのようにアクセスするかと言う点に着目し高速化を図って いると言うことが明確にかかれています。 http://www.cybernet.co.jp/products/matlab/support/technote/speedup_ml/fft.html 従って、結論としては、処理速度をチェックするには、flops関数を用い、乗算数 を計測するより、計算実時間を計測するtic,toc関数で処理時間を直接求めるのが現在の ハードウェアに対しては、最適な方法であると思われます。 一応、参考のために、両方のスクリプトを書いておきました。 実時間計測は、1/100秒単位での計測しかできないため、100回同じ計算を繰り返す ようにしてあります。(回数が多いほうが時間はかかるようになりますが、処理時 間の精度が良くなるかも知れません。) ------------------------------------------------------ MATLAB 5.x以前で動作するプログラム(flopsを使用したもの訂正版) c=zeros(1,600); for k=1:1600 a=rand(size(1:k)); flops(0);b=fft(a);c(1,k)=flops; end loglog(c,'b');xlabel('data length');ylabel('flops'); ------------------------------------------------------- MATLAB 5,6以降で動作するプログラム(実時間で計算するプログラム) c=zeros(1,600); for k=1:1600 a=rand(size(1:k));tic; for kk=1:100;b=fft(a);end; c(1,k)=toc/100; end loglog(c,'b');xlabel('data length');ylabel('time'); ------------------------------------------------------- |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |