2017-01-10 70 views
0

ldr、str、またはbなどのメモリ命令は、ARMアセンブリで4サイクルかかる。それは各メモリの場所が4バイトであるからですか?なぜメモリ命令がARMアセンブリで4サイクルかかるのですか?

+0

CPUに依存するARMプロセッサの中には、サイクル内で複数のLDR命令またはSTR命令を実行するものがあります。 –

+1

いいえ、それはおそらく動作しません(1バイト/サイクルを読んで、したがって4サイクルを取る)、それはおそらく操作全体のまっすぐ上の待ち時間です。 – harold

+0

パラレルで8ビットではなく、16ビットまたは32ビット並列で作業するよりも、より大きな幅を扱えるようにもっと多くのトランジスタを「単純に」投げることができるので、データの幅はパフォーマンスに大きな違いはほとんどありません。これは、CPU全体が4,8,16,32を介して現代の64ビット(128-512ビットの専用SIMD命令ユニットをさらに並列化する)に移行した方法です。しかし、CPUを別のチップ(メモリ)に接続してバス上のデータをフェッチ/格納するという論理的な複雑さを「欺く」(キャッシュは1つです)のは難しいです。それは旅行のようなものです。 – Ped7g

答えて

2

ARMはパイプラインアーキテクチャを採用しています。各クロックサイクルは、パイプラインを1ステップ進める(例えば、フェッチ/デコード/実行/リード...)。パイプラインが連続的に供給されるので、各命令を実行する全体の時間は1サイクルに近づくことができるが、「フェッチ」から完了までの個々の命令の実際の時間は3+サイクルになる可能性がある。 ARMは、彼らのウェブサイト上の良い説明があります。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0222b/ch01s01s01.html

メモリレイテンシは、この考えに合併症の別の層を追加します。 ARMは、最も頻繁に使用されるデータを最小サイクルで利用できるようにするマルチレベルキャッシュシステムを採用しています。最も速い(L0)キャッシュからの読み出しでさえ、数サイクルのレイテンシを伴う。パイプラインには、データがすぐに使用されない場合に、後で読み取り要求を完了できるようにする機能が含まれています。これは、一例として理解することは簡単です:

LDR R0,[R1] 
MOV R2,R3 // Allow time for memory read to occur 
ADD R4,R4,#200 // by interleaving other instructions 
CMP R0,#0 // before trying to use the value 

// By trying to access the data immediately, this will cause a pipeline 
// 'stall' and waste time waiting for the data to become available. 
LDR R0,[R1] 
CMP R0,#0 // Wastes at least 1 cycle due to pipeline not having the data 

アイデアは、あなたが、レジスタ(別名命令インターリーブ)の依存関係を遅延させることにより、メモリアクセスで追加のレイテンシを隠すことができた場合、パイプラインに固有のレイテンシを隠蔽することです。

+0

その他のポイントは?店舗には待ち時間はありません。また、キャッシュはコードとデータの両方で高速化しています。コードは、最初はデータアクセスと競合します。 'PLD'命令があります。枝は物事を複雑にすることがあります。 –

+0

@artlessnoise - ほとんど真実。シーケンシャル書き込みを結合しない書き込みバッファは4つしかありません。書き込みバッファの不十分な使用(例えば、一度に1バイトを書き込む)は、余分に書き込みを停止させる。 – BitBank

関連する問題