7

Thumb-2 命令セットを備えた ARM Cortex-M3 コントローラーで作業しています。

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

Thumb-2 の場合、次の 2 つのリンクに従ってパフォーマンスが向上すると言われています。

単一の 16 ビット命令がコンパイラで使用できる関数を制限する場合のパフォーマンスを向上させます。

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

このパフォーマンスとは一体何なのでしょうか?誰かがそれに関連するいくつかの例を挙げてもらえますか?

4

2 に答える 2

10

ARM 32 ビット命令セットと比較すると、thumb 16 ビット命令セット (thumb2 拡張機能についてはまだ話していません) は、命令のサイズが半分であるため、必要なスペースが少なくなりますが、一般に、より多くの命令が必要になるため、パフォーマンスが低下します。腕と同じことをする。命令セットの機能は少なく、ほとんどの命令はレジスタ r0 ~ r7 でのみ動作します。リンゴとリンゴを比較すると、同じことを行う命令が増えるほど遅くなります。

現在、thumb2 拡張機能は、以前は定義されていなかった Thumb 命令を取り、32 ビットの Thumb 命令を作成します。thumb2 拡張機能のセットが複数あることを理解してください。ARMv6m は、おそらく数十を追加します。ARMv7m は、親指命令セットに 150 の命令のようなものを追加します。ARMv8 または将来が何を保持するかはわかりません。したがって、ARMv7m を想定すると、親指でできることと ARM でできることの間のギャップが埋められました。したがって、thumb2 は、thumb のように縮小された ARM 命令セットですが、縮小されたものではありません。そのため、thumb2 で同じことを行うには、同じことを行う ARM と比較して、さらに多くの命令が必要になる場合があります (プラスの親指を想定)。

これにより、問題の味、アーム内の単一の指示、および経験上の同等の指示が得られます。

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}

現在、コンパイラはそれを行いません。コンパイラは、それが親指をターゲットにしていることを認識し、他のレジスタを選択することで別のことを行います。命令ごとのレジスタと機能はまだ少なくなります。

mov r0,r1
and r0,r2

オペランドを変更せずに、2 つのレジスタをまとめて 2 つの命令/実行サイクルを実行し、結果を 3 番目のレジスタに入れます。Thumb2 には 3 つのレジスタがあるため、thumb2 拡張機能を使用して単一の命令に戻ります。そして、thumb2 命令は、thumb が r0-r7 に制限されている 3 つのレジスタのいずれかで r0-r15 を許可します。

ARMv5 アーキテクチャ リファレンス マニュアルを参照してください。各親指命令の下に、同等の ARM 命令が示されています。次に、その ARM 命令に移動し、thumb 命令ではできないことをその ARM 命令で実行できることを比較します。これは、thumb 命令 (thumb2 ではない) が ARM 命令と 1 対 1 の関係を持つ一方向パスです。すべてのサム命令には、同等のアーム命令があります。ただし、すべてのアーム命令に同等のサム命令があるわけではありません。この演習から、thumb 命令セットを使用する場合のコンパイラの制限を確認できるはずです。次に、ARMv7m アーキテクチャ リファレンス マニュアルを入手し、命令セットを調べて、「すべての親指バリアント」を比較します。エンコーディング (ARMv4T を含むもの) および ARMv6 および/または v7 に限定されたものであり、thumb と thumb2 の間の機能の拡張と、thumb に対応するものがない thumb2 のみの命令が見られます。これにより、コンパイラがthumbとthumb2の間で何を処理する必要があるかが明確になります。次に、thumb+thumb2 を本格的な ARM 命令と比較するところまで行くことができます (ARMv7 AR はそれが呼ばれるものですか?)。そして、thumb2 が ARM にかなり近づいていることを確認してください。ただし、たとえばすべての命令で条件が失われるため、thumb での条件付き実行は、コードの分岐との比較になります。ARM では、分岐なしで if-then-else を使用できる場合があります。 . これにより、コンパイラがthumbとthumb2の間で何を処理する必要があるかが明確になります。次に、thumb+thumb2 を本格的な ARM 命令と比較するところまで行くことができます (ARMv7 AR はそれが呼ばれるものですか?)。そして、thumb2 が ARM にかなり近づいていることを確認してください。ただし、たとえばすべての命令で条件が失われるため、thumb での条件付き実行は、コードの分岐との比較になります。ARM では、分岐なしで if-then-else を使用できる場合があります。 . これにより、コンパイラがthumbとthumb2の間で何を処理する必要があるかが明確になります。次に、thumb+thumb2 を本格的な ARM 命令と比較するところまで行くことができます (ARMv7 AR はそれが呼ばれるものですか?)。そして、thumb2 が ARM にかなり近づいていることを確認してください。ただし、たとえばすべての命令で条件が失われるため、thumb での条件付き実行は、コードの分岐との比較になります。ARM では、分岐なしで if-then-else を使用できる場合があります。 .

于 2013-04-06T04:01:40.017 に答える
8

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

前述のすべてのレジスタ操作からの完全なレジスタ セットへのアクセスとは別に、Thumb-2 は IF-THEN (IT) ブロックの形式で分岐のない条件付き実行を追加しました。元の Thumb では、ほぼすべての命令で条件付き実行という ARM のトレードマーク機能が削除されました。Thumb-2 では、IT 命令の先頭に最大 4 つの後続命令の条件を追加することで、これを実現しています。

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

于 2013-04-25T00:29:16.560 に答える