3

浮動小数点ユニットがないARMデバイス用にC++コードを最適化したいと思います。私の関数のほとんどは浮動小数点数を使用しており、それらを固定小数点に変更することを検討しています。

ARMデバイスの場合、本当の利点はありますか、それともコンパイラはこれを自分で行うのに十分賢いですか?

たとえば、これはARMデバイスでより効率的でしょうか

//unsigned char const* input
unsigned int a, b;
a= *input++ << 12; 
b= *input++ << 12; 
a*=1024;    //0.25 shifted 12 bits
b*=1024;    //0.25 shifted 12 bits
*output++ = (a+b) >> 24;

するより

float a,b;
a= *input++;
b= *input++;
a=a/4;
b=a/4;
*output++ = a+b;
4

4 に答える 4

5

200MHzのARMプロセッサを搭載したgp2xハンドヘルドデバイスでコーディングを行いました。私は3Dグラフィックスをやっていて、数学演算にfloatを使用するのは確かに遅すぎたでしょう。

頂点ごとの計算に浮動小数点演算のみを使用した場合でも、固定小数点を使用した場合よりもパフォーマンスが大幅に低下しました。これは、コンパイラが浮動小数点エミュレーションライブラリを使用する「soft-fp」の場合でした。カーネルに浮動小数点エミュレーションを処理させると、パフォーマンスはさらに低下します。

私は、floatの代わりに使用できるオーバーロードされた演算子を使用してクラスを提供するC++固定小数点Librayを開発しました。

于 2012-05-25T11:15:37.980 に答える
4

いいえ、セマンティクスがかなり異なるため、コンパイラはフロートの操作を固定小数点に変換しません。フロートの範囲は広く、NaNと無限大をサポートし、丸めの動作はまったく異なります。

したがって、ターゲットとするプロセッサにFPUがない場合は、固定小数点を使用することで大きなメリットが確実に得られます(これらの計算が実行時間のかなりの部分を占める場合)。ただし、固定小数点に関連するすべてのハウスキーピングに対処する必要があります。

于 2012-05-25T11:28:56.130 に答える
3

ARMコードについて具体的に話すことはできませんが、浮動小数点のエミュレートは安価ではありません。Leading-1の検出、動的シフト、丸め、および特殊なケースの処理(NaN、infなど)があります。これは、そこにある固定小数点コードとはまったく異なります。

于 2012-05-25T10:51:02.903 に答える
2

固定小数点は通常、FPUを備えたデバイスであっても、浮動小数点が実際に浮動しないすべての場合に効率的です。たとえば、長整数を使用して最も近いミリメートルまでのスペースを表す場合です。節約は通常、計算速度、長い距離から出るのと同じミリメートル範囲を取得するためにフロートではなくダブルが必要な場所で使用されるスペース、およびsprintfなどの関数を回避できる出力で実現されます...

そうです、固定小数点は多くのコンテキストで意味があります。

于 2012-05-25T11:56:31.947 に答える