質問

iPhone 3GS での ARM と Thumb コードのパフォーマンスについて明確な数字を持っている人がいるかどうか疑問に思っていました。特に非浮動小数点 (VFP または NEON) コードについては、Thumb モードでの浮動小数点のパフォーマンスの問題を認識しています。

より大きな ARM 命令による余分なコード サイズがパフォーマンス上の問題になる点はありますか?言い換えれば、実行可能コードが利用可能なメモリに比べて比較的小さい場合、 測定された Thumb モードをオンにした場合のパフォーマンスの違いは?

私が尋ねる理由は、Xcode で「-marm」オプションを使用して NEON 固有のソース ファイルに対して ARM を有効にすることはできますが、GCC は x86 をビルドしているため、シミュレータのビルドが中断されるからです。「サムとしてコンパイル」をオフにしてそれで済むかどうか迷っていました。

役に立ちましたか?

解決

私は親指がARMは全く正しくないよりも遅いことが、iPhone毛布声明を知ってはいけません。 32ビット幅のゼロ待ち状態のメモリ与えられ、親指は、5%または10%のような数字少し遅くなります。今、それは別の話であるthumb2それがあれば、thumb2を高速に実行できると言われて、私はiPhoneが私の推測では、それがthumb2ないということである持っているものを知らない。
あなたはゼロウェイト状態、32ビットのメモリが不足していない場合は、あなたの結果が異なります。一つの大きなものは、32ビット幅のメモリです。あなたは、ゲームボーイアドバンスの家族のように16ビット幅のバス上で実行されている、といくつかがある場合、それは同じタスクを実行するために多くのThumb命令を取るにもかかわらず、パフォーマンスのためにすることができます簡単に実行ARMアウト親指そして、そのメモリまたはROM上の状態を待ちます。

あなたのコードをテストします!あなたが興味かない結果を提供してテストを発明することは難しいことではありません。親指が腕を吹き飛ばすあるように、アームが親指を吹き飛ばす示すことと同じくらい簡単です。誰がdhrystonesがあり、それがどのように速く、それは重要なこと今日のあなたのコードを実行しないで何気に。

私はARMのためのテストコードのパフォーマンスで長年にわたって発見した何があなたのコードとあなたのコンパイラが大きな要因であるということです。それは同じタスクをpeformには数パーセント以上の命令を使用しているため、だから、親指は理論的には数%遅くなります。しかし、あなたは(gccがそのカテゴリに該当)より速く、数回実行することができ、お気に入りのコンパイラは恐ろしいことや、単にコンパイラを切り替えることにより、できることをご存知でしたか?または同じコンパイラを使用して、最適化オプションを混合。いずれにせよ、あなたは、ツールの使用方法についてスマートであることによって、アーム/親指差をシャドウすることができます。あなたはおそらくこれを知っていますが、人々は、彼らがコードをコンパイルする方法を知っている一つの方法は、唯一の方法であるとより良いパフォーマンスを得るための唯一の方法は問題でより多くのメモリまたは他のハードウェアを投げると思い何を知って驚くだろう。

あなたはiPhone上にある場合、私はそれらの人々を聞くLLVMを使用していますか?私は多くの点でLLVMのコンセプトが好きで、それが成熟するとき、私の毎日のドライバーとしてそれを使用することを熱望していますが、それは私がやっていた特定のタスクのための10から20パーセント(またはそれ以上くらい)遅かったコードを生成することがわかりました。私は親指モードをしようとしなかった、アームモードになっていた、と私は上のL1およびL2キャッシュを持っていました。私は本当に私はおそらく数%遅く親指を見ることがアームに親指を比較するために、キャッシュせずにテストしていたが、あなたはARMコードより二倍のThumbコードをキャッシュすることができます(私は一度に興味が波平がある)それを考える場合にはそのそれのかなり多くをキャッシュし、平均は時間の親指が著しく速くすることができフェッチ減らすことによって、タスクの全体の数パーセントより多くのコードがあってもそれを暗示する可能性があります。私はそれを試しに行かなければならないことがあります。

あなたはLLVMを使用している場合は、最適化を実行するために、複数の場所の他の問題を抱えています。あなたが最適化することができますバイトコードにCから行く、あなたはその後、バイトコード自体を最適化することができ、あなたは、あなたのバイトコードのすべてをマージすることができますし、最適化することができますアセンブラにバイトコードから行くときに、全体としてそれを最適化します。あなたはわずか3ソースファイルを持っていた、と仮定した場合の機会ごとに2つだけの最適化レベル、あなたが実験の数が高くほぼ1桁であるLLVMで、テストするための8つの組み合わせを持っているでしょうgccで、最適化いけないまたは最適化するかというものがなかったです。より多くのあなたが本当に実行できるよりも、数百〜数千。一つのテストのために私は一つの大きな(GER)一つにバイトコードファイルをマージした後、別ますが、最適化しながら、その後のバイトコードを最適化しないで、ステップをバイトコードにCにopimizing NOT、走っていました。有するLLCは、最良の結果が得られたアームの途中に最適化します。

ボトムライン...テスト、テスト、テストます。

EDITます:

私は言葉のバイトコードを使用している、私は正しい用語はLLVMの世界ではビットコードだと思います。 .BCファイル内のコードは、私が何を意味するか...

であります

あなたはLLVMを使用してARMにCから予定されている場合は、途中でビットコード(BC)があります。 BCのSTEにCに最適化するためのコマンドラインオプションがあります。P。 BCたら、紀元前にBC、ファイルごとに最適化することができます。あなたが選択した場合には、より大きなBCファイルに二つ以上のBCファイルをマージ、または単に一つの大きなBCファイルにすべてのファイルを変えることができます。そして、これらの組み合わせの各ファイルも最適化することができます。

私の理論は、これまでのところその背後にあるテストケースのカップルを持っているだけで、あなたは一つの大きなBCファイル内の全プログラム/プロジェクトを持ってまで、あなたが任意の最適化をしない場合、オプティマイザは情報であれば最大量を有することですこれでそのジョブを実行します。だから、最適化なしで紀元前にCから行くことを意味します。そして、一つの大きなBCファイルにすべてのBCファイルをマージします。あなたは一つの大きなBCファイルとして全体のことをしたら、オプティマイザは、情報と最適化のうまくいけば、品質を最大限、その最適化ステップを実行してみましょう。その後、ARMアセンブラに最適化されたBCファイルから行きます。 LLCのデフォルト設定ではあなたはそれが目標のために最適化する方法を知っている唯一のステップであるように、その最適化を可能にしたいんの最適化、です。 BCの最適化へのBCは汎用的であり、特定のターゲットではない(私の知る限り)。

あなたはまだ、テストをテストするためのテストを持っています。それが速いか遅いあなたのプログラムの実行を行うかどうかを確認し、先に行くとステップ間の最適化を試します。

他のヒント

パフォーマンス/コードサイズ/消費電力のトレードオフのためのARM /親指からこのPDFを参照してください。

ARMとThumbの誘導選択プロフィール 取扱説明書
- コンピュータサイエンス学部、ラジブグプタ

アリゾナ大学

Thumb コードは基本的に、同等の ARM よりも常に遅くなります。Thumb コードがパフォーマンスに大きなメリットをもたらす可能性がある 1 つのケースは、コードがオンチップ メモリまたはキャッシュに適合するかどうかに違いが生じる場合です。

パフォーマンスの違いはコードが実際に何を行うかに完全に依存するため、正確な数値を示すのは困難です。

XCode でアーキテクチャごとのコンパイラ フラグを設定すると、シミュレータのビルドが中断されることを回避できます。XCode ビルド設定のドキュメントを参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top