2013-04-06 44 views
6

私はThumb-2命令セットを持つARM Cortex-M3コントローラを使用しています。ARM Thumb/Thumb-2パフォーマンス

Thumbモードは、命令を16ビットサイズに圧縮するために使用されます。 コードのサイズが小さくなります。しかし、通常のThumbモードでは、パフォーマンスが低下すると言われているのはなぜですか? Thumb-2の場合には

は、性能は、これらの二つのリンクごとに改善されると言われている。

は、単一の16例でパフォーマンスを向上させます-bit命令は、コンパイラが使用できる機能を制限します。

Thumb-2の目的は、32ビットメモリ上のARM命令セットに似たパフォーマンスでThumbと同様のコード密度を達成することでした。

正確にはどのようなパフォーマンスですか?誰かがそれに関連するいくつかの例を挙げることができますか?

+1

パフォーマンスは常に相対的です。 「親指」のコードが「腕」よりも優れている場合が多い。主にメモリバスがボトルネックの場合。一般に、「親指」は多くのレジスタを持たないので、命令セットがよりコンパクトであるにもかかわらずアルゴリズムによっては、レジスタをスピルするためにより頻繁にメモリにアクセスしなければならない。 –

+1

私は配送トラックAと配送トラックBがAの半分の大きさであれば配送されるものはトラックAに収まるが、トラックBには2つ大きいのでトラックBを2回以上運ぶ同じ仕事。 ThumbはARMと同じくらい効率的ではありませんが、ARMと同じことを行うには10〜15%多くの命令に似ています。 –

+0

関連項目:Stackoverflowの[Gcc -mthumb vs -marm](http://stackoverflow.com/questions/11062936/gcc-mthumb-against-marm)、[Arizona paper](http://www.cs.arizona .edu /〜arvind/papers/lctes02.pdf)を参照してください。 –

答えて

6

サム32ビットの命令セットと比較した場合、サムの16ビット命令セット(サム2の拡張はまだありません)は命令のサイズが半分であるため、スペースが少なくなりますが、一般にパフォーマンスが低下します。それは腕の場合と同じことをするより多くの指示が必要です。命令セットには機能が少なく、ほとんどの命令はレジスタr0〜r7でのみ動作します。 Apples to Apples比較同じことをするためのより多くの指示は遅くなります。

thumb2拡張機能は以前は未定義のサム命令を受け取り、32ビットのサム命令を作成します。 thumb2拡張のセットが複数あることを理解してください。おそらくARMv6mは数十を追加します。 ARMv7mはサム命令セットに150命令のようなものを追加しますが、ARMv8または将来のものについてはわかりません。だから、ARMv7mを前提にして、彼らはあなたが経験できることとARMでできることとのギャップを橋渡してきました。したがって、thumb2はサムのように縮小されたARM命令セットですが、縮小されません。だから、同じことをやっているARMと比較して、同じことをthumb2(想像を絶すると仮定します)で実行するために、より多くの指示が依然としてかかるかもしれません。

これは、腕の中の1つの指示とそれに相当する親指の問題を味わうことができます。

ARM 

and r8,r9,r10 

THUMB 

push {r0,r1} 
mov r0,r8 
mov r1,r9 
and r0,r1 
mov r1,r10 
and r0,r1 
mov r8,r0 
pop {r0,r1} 

今、コンパイラは、コンパイラは、それが親指を狙っている知っているし、他のレジスタを選択することによって違うことをするだろう、それを行うwouldntは。あなたはまだ少ないレジスタと命令当たりが少ない特徴があります。

mov r0,r1 
and r0,r2 

それでもオペランドを変更せずに、一緒に2つの命令/実行サイクルへと二つのレジスタをとり、第3のレジスタに結果を置きます。 Thumb2には3つのレジスタがあるため、thumb2拡張を使用して単一の命令に戻ります。また、thumb2命令は、親指がr0〜r7に制限されている3つのレジスタのいずれかでr0〜r15を許可します。

ARMv5アーキテクチャリファレンスマニュアルを参照してください。各サム命令の下に、同等のARM命令が表示されます。その後、そのARM命令に行き、サム命令ではできないそのアーム命令でできることを比較してください。サム命令(thumb2ではなく)がARM命令と1対1の関係を持つ一方向パスです。すべてのサム命令には同等のアーム命令があります。すべてのアーム命令に同等のサム命令があるわけではありません。このエクササイズでは、サム命令セットを使用するときのコンパイラの制限を確認することができます。次に、ARMv7mアーキテクチャリファレンスマニュアルを入手し、命令セットを見て、 "すべてのサムバリアント"エンコーディング(ARMv4Tを含むもの)とARMv6および/またはv7に限定されたものを比較し、サムの間の機能の拡張を参照してくださいthumb2だけでなく、親指を持たない指示を持つthumb2のみの指示も含む。これは、コンパイラが親指と親指の間で動作しなければならないことを明確にするはずです。 thumb + thumb2と完全に壊れたARM命令(ARMv7 ARはそれが呼び出されているのですか?また、thumb2はARMにもっと近づきますが、すべての命令で条件の例が失われるので、経験則による実行はコードの分岐との比較になります。ARMでは分岐なしでif-then-elseを持つことがあります。

+0

も非常に注意してください、cortex-m3とcortex-m4はARMv7m、cortex-m0と-m1はARMv6mです。これらの命令セットのthumb2拡張の違いが多く、コンパイラもcortex-m3とthumb2のものがたくさん追加されました。それが出てきたら、皮質-m0にthumb2を使用することができませんでした。コンパイラ(gcc/clang)がまだ完全に追いついているかどうかは不明です。同様に、cortex-m4は、Cortex-Aのフレーバの減少した浮動小数点を持ち(できます)、コンパイラは、それが出てきたときに、cortex-m4の浮動小数点で苦労していました。彼らが追いついているかどうかわからない場合サムがレジスタR0〜R7にしかアクセスできない場合には –

+0

...あなたの例ではレジスタr8、r9&r10にmov命令をどのように使用していますか...お勧めしますか? – Katoch

+0

* MOST * thumbの指示特に低いものから高いものへの特定の移動 –

6

Thumb-2は元のThumbに可変長命令を導入しました。命令は16ビットと32ビットを混在させることができます。これは、日常のコードで元のThumbのサイズの優位性を保持していることを意味しますが、以前はThumbで発生していたARMインターワークオーバーヘッドを伴わずに、複雑なコードでほぼ完全なARM機能セットにアクセスできます。

上記のすべてのレジスタ操作からのフルレジスタセットへのアクセスとは別に、Thumb-2はIF-THEN(IT)ブロックの形でブランチレス条件付き実行を追加しました。オリジナルのThumbは、ほぼすべての命令で条件付き実行の商標ARM機能を削除しました。これは、現在のThumb-2では、IT命令に最大4つの後続命令の条件を付加することによって実現されています。

さらに、命令セット自体も大幅に拡張されました。たとえば、Cortex-M4FはDSP拡張とFPv4-SP浮動小数点拡張を実装しています。実際、NEONでもThumb2でエンコードできると私は信じています。