2011-01-28 13 views
1

EABIでGCCを使用するARM-CPUターゲットのための特別なCプログラミング手法に関するアドバイスに興味があります。私のアプリケーションには、大規模なデータ配列に対する浮動小数点の集中計算が含まれています。主な目的は、最も速い実行可能ファイルを取得することです。主に、私はcodesourceryとandroid-ndkのarm-eabi-gccバージョンを使用しています。ネオン・イントリンシックスを使用したり、他のアーキテクチャー(IA32用インテルコンパイラーなど)用の他のコンパイラーと互換性のないCコードの変更をしたくない場合もあります。ARM(EABI)アーキテクチャ用の特別なCレベルプログラミング手法はありますか?

+0

Androidの場合、VFPハードウェアはかなり一般的です。 NDKには、「ソフト」FP(armv5te)と「ハード」FP(armv7-a)のターゲットがあります。あなたはどんな種類のデバイスをターゲットにしているのかは言わなかった。 – fadden

+0

@fadden:プロセッサによってはNEON SIMD命令をサポートするものもあれば、浮動小数点コプロセッサを持たないものもあります。ほとんどのARM v5、v6、v7 Cortex A8/A9。 – psihodelia

答えて

3

移植性を維持したい場合は、私のアドバイスは「浮動小数点を使用しない」です。ほとんどのARMチップにはFPUがなく、ソフトウェアでの操作をエミュレートする必要があります。

一般に、ベンチマーク、変更、およびベンチマーク。パフォーマンス測定前後の徹底的なパフォーマンスの最適化は無駄です。

+0

ターゲットCPUにはそれぞれFPU(Cortex A8、A9)があります。 – psihodelia

+0

@psihodelia:この場合、CコードレベルではARMについては何も特定されていませんが、コンパイラはSIMD命令を利用するコードを生成しない可能性があります与えられたものではない。調査し、アセンブラでいくつかの操作を最適化する必要があります。私が使用したライブラリの1つは、関数がハードウェアで直接サポートされているにもかかわらず、収束アルゴリズムを使用してsqrt()を実装したものです。 – Clifford

+1

FPUを持っていてもパフォーマンスに関心がある場合でも、定点で数学をやろうとする必要があります。 –

4

ほとんどのARMターゲットにFPUがないため、「最速の実行可能ファイル」が必要な場合は、固定小数点ライブラリの使用を検討する必要があります。このDr. Dobbの記事:Optimizing Math-Intensive Applications with Fixed-Point ArithmeticにはCORDICアルゴリズムの説明があり、この記事で説明したライブラリの完全なソースコードを提供しています。この記事は、FPUを使用しないARMデバイスで、数学的に強力なコードを正確に加速することについてのものです。報告された結果は通常、浮動小数点実装よりも4倍高速化されていました。ベクトル化を使用しないVFP(コンパイラがライブラリコードを除いてサポートする可能性は低い)が5倍の加速を与え、ソフトウェアの実装にはかなり良いことです。

注:このライブラリを使用していて、log()関数でエラーが見つかりました。これは、log_two_power_n_reversed []配列の初期化子の末尾に0x0LLを追加することによって訂正されます。私はこの訂正を著者に確認した。資料のコードへのリンクが壊れている、にそれを見つける:ftp://ftp.drdobbs.com/sourcecode/ddj/2008/0804.zip

[EDIT]おっと、申し訳ありません物品及びコードは、C++インプリメンテーションについて説明しfixedタイプを利用するために広くオーバーロードオペレータおよび機能を使用して可能な限り透明であること。おそらくC++コンパイルを使用する良い理由ですが、あなたが求めたものではありません。

0

FPUなしでCPUのパフォーマンスを最大化するには、「ハード浮動小数点」の代わりに「ソフト浮動小数点」も選択する必要があります。このように、実行ファイルは、カーネルが不正な命令をトラップし、カーネルでエミュレートすることに頼るのではなく、浮動小数点ライブラリにリンクされます(コンテキスト切り替えのために時間がかかります)。

もちろん、ハードウェア浮動小数点ユニットを持つCPUを使用している場合は、それを使用するためにハード浮動小数点を使用する必要があります。

幸運なことに、EABIでは、実行可能ファイルとライブラリの両方を平和的に共存させることができます。

0

スマートフォン用の現在使用されているすべてのARMプロセッサで最高の数のクランチ性能を得るには、ARMアーキテクチャごとに完全に異なるものを使用するのが最適な方法です.fpu-lessチップのスケーリングされた整数算術または低速ソフトフロート、パイプライン化されたVFPハードウェアを搭載したチップのためのオーバーラップ可能な浮動小数点、およびNEON対応チップのための並列化された非ポータブルNEONコンパイラ組み込み関数。これらのすべてをコーディングし、CPUアーキテクチャを検出した後に実行時の計算ルーチンの選択を使用する必要があります。

関連する問題