ldr、str、またはbなどのメモリ命令は、ARMアセンブリで4サイクルかかる。それは各メモリの場所が4バイトであるからですか?なぜメモリ命令がARMアセンブリで4サイクルかかるのですか?
答えて
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
アイデアは、あなたが、レジスタ(別名命令インターリーブ)の依存関係を遅延させることにより、メモリアクセスで追加のレイテンシを隠すことができた場合、パイプラインに固有のレイテンシを隠蔽することです。
その他のポイントは?店舗には待ち時間はありません。また、キャッシュはコードとデータの両方で高速化しています。コードは、最初はデータアクセスと競合します。 'PLD'命令があります。枝は物事を複雑にすることがあります。 –
@artlessnoise - ほとんど真実。シーケンシャル書き込みを結合しない書き込みバッファは4つしかありません。書き込みバッファの不十分な使用(例えば、一度に1バイトを書き込む)は、余分に書き込みを停止させる。 – BitBank
- 1. ARMアセンブリ内のSTRとLDR命令
- 2. ARMでORRr命令とは何か
- 3. ARMアーキテクチャのGT命令とHI命令の違いは何ですか?
- 4. ARMのプリフェッチ命令
- 5. ARMアセンブリ:MOV命令の基本的な使用
- 6. ARM、ヘルプLDR命令
- 7. ARMアセンブリTBB命令 - ジャンプはどのように機能しますか?
- 8. ELFからのアセンブリ命令の削除
- 9. JavaにIINCバイトコード命令があるのはなぜですか?
- 10. Gem5でのARMプロセッサの命令アクセス
- 11. ARM/Thumb(IOS)でのBLX命令のデコード
- 12. 正確に比較するアセンブリcmp命令は何ですか?
- 13. ARM Cortex-M4ミューテックスロック。 DMB命令
- 14. ARM 32ビットSTR命令
- 15. Python on Arm、不正命令
- 16. バスをメモリにマッピングするのはどの命令ですか?
- 17. アセンブリMIPS TAl命令
- 18. アセンブリJZ命令CMP
- 19. MIPSアセンブリ命令数
- 20. eclipseの命令で取った命令サイクルの数を調べる - Android
- 21. 一部のARM命令ではバレルシフタを使用しないのはなぜですか?
- 22. 次のアセンブリ命令は何ですか?-8(%rbp)、%xmm0?
- 23. 同じアセンブリ命令が、別のマシン命令
- 24. 32ビットモードでNASM x86_64アセンブリ:なぜこの命令はRIP相対アドレッシングコードを生成するのですか?
- 25. ARM NEON:どの命令のペアがライトバックを待つ必要がありますか? ARMのNEONのドキュメントで
- 26. アセンブリ言語のCALL命令
- 27. アセンブリの移動命令
- 28. vdiv命令がネオンフラグで生成されるのはなぜですか?
- 29. Atmel 89C2051マイクロコントローラで "acall"命令が動作しないのはなぜですか?
- 30. SIMD命令がカーネルで使用されないのはなぜですか?
CPUに依存するARMプロセッサの中には、サイクル内で複数のLDR命令またはSTR命令を実行するものがあります。 –
いいえ、それはおそらく動作しません(1バイト/サイクルを読んで、したがって4サイクルを取る)、それはおそらく操作全体のまっすぐ上の待ち時間です。 – harold
パラレルで8ビットではなく、16ビットまたは32ビット並列で作業するよりも、より大きな幅を扱えるようにもっと多くのトランジスタを「単純に」投げることができるので、データの幅はパフォーマンスに大きな違いはほとんどありません。これは、CPU全体が4,8,16,32を介して現代の64ビット(128-512ビットの専用SIMD命令ユニットをさらに並列化する)に移行した方法です。しかし、CPUを別のチップ(メモリ)に接続してバス上のデータをフェッチ/格納するという論理的な複雑さを「欺く」(キャッシュは1つです)のは難しいです。それは旅行のようなものです。 – Ped7g