1 Studying《Arm A715 Software Optimization Guide》

目錄

1 Introduction

1.1 Product revision status

1.2 Intended audience

1.3 Scope

1.4 Conventions

1.5 Useful resources

2 Overview

2.1 Pipeline overview

3 Instruction characteristics

3.1 Instruction tables

3.2 Legend for reading the utilized pipelines? ? //閱讀所使用的流水線的圖例

3.3 Branch instructions

3.4 Arithmetic and logical instructions

3.5 Divide and multiply instructions

3.6 Pointer Authentication Instructions? ? //指針認證指令

3.7 Miscellaneous data-processing instructions? ? //雜項數據處理指令

3.8 Load instructions

3.9 Store instructions

3.10 Tag Load Instructions

3.11 Tag Store instructions

3.12 FP data processing instructions

3.13 FP miscellaneous instructions

3.14 FP load instructions

3.15 FP store instructions

3.16 ASIMD integer instructions

3.17 ASIMD floating-point instructions

3.18 ASIMD BFloat16 (BF16) instructions

3.19 ASIMD miscellaneous instructions

3.20 ASIMD load instructions

3.21 ASIMD store instructions

3.22 Cryptography extensions? ? //密碼學擴展

3.23 CRC

3.24 SVE Predicate instructions

3.25 SVE integer instructions

3.26 SVE floating-point instructions

3.27 SVE BFloat16 (BF16) instructions

3.28 SVE Load instructions

3.29 SVE Store instructions

3.30 SVE Miscellaneous instructions

3.31 SVE Cryptographic instructions

4 Special considerations

4.1 Dispatch constraints? ? //調度約束

4.2?Optimizing general-purpose register spills and fills? ? //優化通用寄存器的溢出和填充

4.3 Optimizing memory routines

4.4 Load/Store alignment

4.5 Store to Load Forwarding

4.6 AES encryption/decryption

4.7 Region based fast forwarding

4.8 Branch instruction alignment

4.9 FPCR self-synchronization

4.10 Special register access

4.11 Instruction fusion

4.12 Zero Latency Instructions

4.13 Cache maintenance operation? ? //緩存維護操作

4.14 Memory Tagging - Tagging Performance? ? //內存標簽

4.15 Memory Tagging - Synchronous Mode

4.16 Complex ASIMD and SVE instructions

4.17 MOVPRFX fusion


1 Introduction

1.1 Product revision status

"rxpy"標識符表示了此書中描述的產品的修訂狀態,例如r1p2,其中:

rx

標識產品的主要修訂版本,例如r1。

py

標識產品的次要修訂或修改狀態,例如p2。

1.2 Intended audience

本文檔適用于系統設計師、系統集成商和編程人員,他們正在設計或編程使用Arm核心的片上系統(SoC)。

1.3 Scope

本文檔描述了影響軟件性能的Cortex-A715核心微體系結構的各個方面。微體系結構的詳細信息僅限于對軟件優化有用的內容。

此文檔僅涵蓋Cortex-A715核心的軟件可見行為,并不涉及背后行為的硬件原理。

這份文檔旨在幫助系統設計師、系統集成商和程序員理解和優化Cortex-A715核心的軟件,以確保在不需要深入了解底層硬件實現的情況下達到最佳性能和效率。

1.4 Conventions

以下的小節描述了在Arm文檔中使用的約定。

1.4.1 Glossary

Arm詞匯表是Arm文檔中使用的術語列表,其中包含這些術語的定義。Arm詞匯表不包含行業標準術語,除非Arm對該術語的含義與普遍接受的含義有所不同。

要了解更多信息,請參閱Arm詞匯表:Documentation – Arm Developer

1.4.2 Terms and abbreviations

本文檔使用以下術語和縮寫語:

1.5 Useful resources

本文檔包含特定于該產品的信息。有關其他相關信息,請參閱以下文檔:

2 Overview

?Cortex-A715核心是一款平衡性能、低功耗和資源受限的產品,實現了Armv9.0-A架構。Armv9.0-A架構是在Arm?v8-A架構基礎上擴展的,延伸到了Arm?v8.5-A。它適用于大屏計算應用和智能手機應用。

Cortex-A715核心的主要特點包括:

? 實現了Armv9.0-A A64指令集。

? 所有異常級別(EL0到EL3)都支持AArch64執行狀態。

? 內存管理單元(MMU)。

? 40位物理地址(PA)和48位虛擬地址(VA)。

? 通用中斷控制器(GIC)CPU接口,可連接到外部中斷分發器。

? 支持從外部系統計數器輸入的64位計數的通用定時器接口。

? 實現了可靠性、可用性和可維護性(RAS)擴展。

? 實現了具有128位矢量長度的可伸縮矢量擴展(SVE)和可伸縮矢量擴展2(SVE2)。

? 集成執行單元,具有先進的單指令多數據(SIMD)和浮點支持。

? 支持可選擇的加密擴展,需要單獨許可。

? 活動監視單元(AMU)。

? 單獨的L1數據和指令緩存。

? 私有的統一的L2數據和指令緩存。

? 可選擇的錯誤保護,可以在L1指令和數據緩存、L2緩存和L2轉換后備緩沖器(TLB)上進行奇偶校驗或錯誤糾正碼(ECC),實現單錯誤糾正和雙錯誤檢測(SECDED)。

? 支持內存系統資源分區和監控(MPAM)。

? Armv9.0-A調試邏輯。

? 性能監測單元(PMU)。

? 嵌入式跟蹤宏單元(ETM),支持嵌入式跟蹤擴展(ETE)。

? 跟蹤緩沖器擴展(TRBE)。

? 可選擇的統計分析擴展(SPE)實現。

? 可選擇的嵌入式邏輯分析儀(ELA),ELA-600。

本文檔描述了Cortex-A715核心微體系結構中影響軟件性能的元素,以便可以相應地優化軟件和編譯器。

2.1 Pipeline overview

下圖描述了高級別的Cortex-A715指令處理流水線。

指令首先被獲取,然后解碼為內部的宏操作(MOPs)。

然后,MOPs通過寄存器重命名和調度階段進行處理。

在解碼階段之后,一個MOP可以被拆分為兩個微操作(μOPs)。

一旦調度完成,μOPs等待其操作數,并按順序發出到13個發射流水線中的其中一個。

每個發射流水線每個周期可以接受一個μOP。

//順序(in order)取指,亂序(out of order)執行

執行管道支持不同類型的操作,如下表所示。

3 Instruction characteristics

3.1 Instruction tables

本章描述了大多數Armv9-A指令的高級性能特征。一系列表格總結了有效的執行延遲和吞吐量(每個周期的指令帶寬),所使用的流水線以及與每組指令相關的特殊行為。所使用的流水線對應于第2章中描述的執行管道。

在下面的表格中,執行延遲(Exec Latency)被定義為依賴于所描述組中的指令的操作所觀察到的最小延遲。

在下面的表格中,執行吞吐量(Execution Throughput)被定義為可以在Cortex-A715核心微架構的整體上實現的指定指令組的最大吞吐量(每個周期的指令數)。

3.2 Legend for reading the utilized pipelines? ? //閱讀所使用的流水線的圖例

//Pipeline name

3.3 Branch instructions

//Exec Latency

//Execution Throughput

//Utilized Pipelines

3.4 Arithmetic and logical instructions

"Degradated" 的正確拼寫應為 "degraded",表示降級或惡化的意思。

GCR_EL1.RRND 是 ARM 架構中的一個寄存器位,用于控制隨機數生成器。RRND 代表 Random Number Register Disable,即禁用隨機數寄存器的意思。

注:

1. 當 GCR_EL1.RRND = 1 時,延遲為2,吞吐量為2,并且所使用的流水線是 M。當 GCR_EL1.RRND = 0 時,描述無效,執行吞吐量和延遲會降低。

3.5 Divide and multiply instructions

注:

1. 整數除法使用迭代算法進行,并在完成之前阻塞任何后續的除法操作。根據數據值,可能會進行早期終止。

2. 乘累加流水線支持從類似的μOP中延遲轉發累加操作數,允許典型的乘累加μOP序列每N個周期發布一個(累加延遲N以括號表示)。累加器轉發不支持對64位乘積高位操作的使用者。

3. 當 Ra 為 ZR(0'b11111)時,MUL、MNEG、SMULL、SMNEGL、UMULL 和 UMNEGL 指令的乘法而不是累加可以在所使用的流水線 M 上執行,執行吞吐量為2。

3.6 Pointer Authentication Instructions? ? //指針認證指令

3.7 Miscellaneous data-processing instructions? ? //雜項數據處理指令

3.8 Load instructions

所示延遲假設存儲器訪問在一級數據緩存中命中,并表示加載指令寫入的所有寄存器的最大延遲。

注:

1. 僅使用立即數作為預索引并帶有寫回的指令會使用 I 管道。

2. 執行延遲為5個周期,當使用16字節對齊的偏移和128位時,利用的流水線為 L、I。

3.9 Store instructions

下表描述了標準存儲指令的性能特征。存儲微操作(μOPs)被分為地址和數據微操作。一旦執行,存儲器會在后臺進行緩沖和提交。

3.10 Tag Load Instructions

3.11 Tag Store instructions

3.12 FP data processing instructions

注:

1. 浮點除法和平方根操作使用迭代算法執行,并且會阻塞后續的相似操作直到完成。

2. 浮點乘累加流水線支持將浮點乘法微操作的結果延遲轉發到浮點乘累加微操作的累加操作數。后者在浮點乘法微操作發出后的1個周期內可能被發出。

3. 浮點乘累加流水線支持從相似微操作中延遲轉發累加操作數,允許一系列典型的乘累加微操作每N個周期發出一個(累加延遲為N,括號內顯示)。

3.13 FP miscellaneous instructions

注:

1. 特定的FMOV #0或寄存器到寄存器操作可以在重命名階段的流水線中進行優化,因此執行延遲和吞吐量可能不具有代表性。

3.14 FP load instructions

所示的延遲假設內存訪問在一級數據緩存中命中,并且表示加載該指令寫入的所有向量寄存器的最大延遲。與標準加載相比,需要額外的一個周期來將結果轉發給浮點/ASIMD流水線。

3.15 FP store instructions

存儲MOP(Memory Operation)被分成存儲地址和存儲數據的μOP(Micro Operation)。一旦執行,存儲將被緩沖并在后臺提交。

3.16 ASIMD integer instructions

注:

1. 乘累加流水線支持從類似μOP中延遲轉發累加操作數,允許典型的整數乘累加μOP序列每個周期發出一個或每兩個周期發出一個(累加延遲以括號表示)。

2. 其他累加流水線也支持從類似μOP中延遲轉發累加操作數,允許典型的這類μOP序列每個周期發出一個(累加延遲以括號表示)。

3. 此類指令包括形如“PMULL Vd.8H,Vn.8B,Vm.8B”和“PMULL2 Vd.8H,Vn.16B,Vm.16B”的指令。

3.17 ASIMD floating-point instructions

注:

1. ASIMD乘累加流水線支持從類似μOP中延遲轉發累加操作數,允許典型的浮點數乘累加μOP序列每N個周期發出一個(累加延遲N以括號表示)。

2. ASIMD乘累加流水線支持從ASIMD FP乘法μOP的結果延遲轉發到ASIMD FP乘累加μOP的累加操作數。后者可以在發出ASIMD FP乘法μOP后的1個周期內發出。

3. ASIMD除法和平方根操作使用迭代算法執行,并將后續類似操作阻塞在同一流水線上,直到完成。

3.18 ASIMD BFloat16 (BF16) instructions

3.19 ASIMD miscellaneous instructions

注:

1. 在重命名階段的流水線中,特定的FMOV #0指令或寄存器之間的傳輸可以進行優化,此時執行延遲和吞吐量可能不具有代表性。

2. PERM指令屬于特定區域的轉發。

3.20 ASIMD load instructions

注:

1. 寫回形式的加載指令需要額外的μOP來更新基地址。這個更新通常與加載μOP并行執行。

3.21 ASIMD store instructions

注:

1. 寫回形式的存儲指令需要額外的μOP來更新基地址。這個更新通常與存儲μOP并行執行(更新延遲時間在括號中顯示)。

3.22 Cryptography extensions? ? //密碼學擴展

注:

1. 連續的AESE/AESMC指令對和連續的AESD/AESIMC指令對將會呈現出第4.6節中描述的性能特征。

3.23 CRC

注:

1. CRC執行支持將結果從生產者μOP延遲轉發給消費者μOP。這將導致消費者端看到的延遲減少1個周期。

3.24 SVE Predicate instructions

SVE(Scalable Vector Extension)謂詞指令是指針對SVE架構中的謂詞寄存器進行操作的指令。謂詞寄存器是一種特殊的寄存器,用于表示向量元素的有效性或執行控制條件。SVE謂詞指令允許開發人員根據需要設置、清除和測試謂詞寄存器。

Scalable: 可擴展的

注:

1. 導致所有元素活動或無元素活動的操作在重命名階段的流水線中進行優化,因此執行延遲和吞吐量不具有代表性。

3.25 SVE integer instructions

注:

1. SVE累加流水線支持從相似μOP中延遲轉發累加操作數,允許一個典型的這樣的μOP序列每N個周期發出一個(累加延遲N顯示在括號中)。

2. SVE整數除法操作使用迭代算法執行,并阻止后續相似操作進入同一條流水線,直到完成為止。

3. 與2相同,但飽和指令需要額外的一個周期延遲來進行延遲轉發累加操作數。

4. 有符號加法需要多2個周期。

3.26 SVE floating-point instructions

注:

1. SVE乘加流水線支持從相似μOP中延遲轉發累加操作數,允許一個典型的浮點乘加μOP序列每N個周期發出一個(累加延遲N顯示在括號中)。

2. SVE除法和平方根操作使用迭代算法執行,并阻止后續相似操作進入同一條流水線,直到完成為止。

3.27 SVE BFloat16 (BF16) instructions

注:

1. 執行這些指令的SVE流水線支持從相似μOP中延遲轉發累加操作數,允許一個典型的μOP序列每N個周期發出一個(累加延遲N顯示在括號中)。

3.28 SVE Load instructions

所顯示的延遲假設內存訪問命中一級數據緩存,并表示加載指令寫入的所有向量寄存器的最大延遲。

3.29 SVE Store instructions

scalar:標量

vector:向量

CPU SVE(Scalable Vector Extensions)指令集針對的是向量操作。它引入了可擴展的向量長度概念,允許在單個指令中同時處理多個數據元素,從而加速向量計算。SVE指令集的設計目的是優化向量處理能力,提高并行計算性能和能效。因此,SVE指令集主要用于支持向量操作,而不是標量操作。

3.30 SVE Miscellaneous instructions

注釋:

1. 操作在重命名階段的流水線中進行了優化,因此執行延遲和吞吐量并不代表性。

3.31 SVE Cryptographic instructions

4 Special considerations

4.1 Dispatch constraints? ? //調度約束

從微架構的按順序部分到亂序部分的μOP的調度包括幾個限制條件。在代碼生成過程中,考慮這些限制條件對于最大化Cortex-A715核心的有效調度帶寬和后續執行帶寬非常重要。

調度階段每個周期最多能處理5個MOP,并且每個周期最多能調度10個μOP,其中對于每種類型μOP的同時調度數量存在以下限制:

- 最多同時調度4個利用S或B流水線的μOP

- 最多同時調度4個利用M流水線的μOP

- 最多同時調度2個利用M0流水線的μOP

- 最多同時調度2個利用V0流水線的μOP

- 最多同時調度2個利用V1流水線的μOP

- 最多同時調度5個利用L流水線的μOP

如果在給定周期內有更多可供調度的μOP數量超過上述限制條件所支持的數量,則μOP將按照從最老到最新的順序盡可能按照上述限制條件進行調度。

4.2?Optimizing general-purpose register spills and fills? ? //優化通用寄存器的溢出和填充

在通用寄存器(GPR)和ASIMD寄存器(VPR)之間進行寄存器傳輸的延遲比訪問緩存層次結構的讀寫操作要低。因此,建議盡可能將GPR寄存器的填充/溢出操作轉移到VPR寄存器中,而不是內存中。

通過將GPR寄存器的數據直接傳輸到VPR寄存器,可以避免訪問緩存層次結構所引起的延遲和額外的存儲器訪問開銷。這樣做可以提高程序的執行效率和性能,并減少對內存的依賴。

當編譯器進行寄存器溢出和填充優化時,應優先考慮將GPR寄存器的數據移動到VPR寄存器中,而不是直接溢出到內存。這需要基于變量的生命周期和使用模式,以及可用寄存器的情況,做出合理的決策。

然而,需要注意的是,由于VPR寄存器數量有限,如果所有的GPR寄存器都需要被填充到VPR寄存器中,可能會導致寄存器分配瓶頸。在實際優化中,需要綜合考慮寄存器的可用性和數據傳輸的開銷,以在GPR寄存器和VPR寄存器之間實現最佳的數據遷移策略。

總而言之,通過將GPR寄存器的填充/溢出操作轉移到VPR寄存器中,可以利用低延遲的寄存器傳輸,提高程序性能。但在進行優化時,需要考慮寄存器的分配情況和數據遷移開銷,以獲得最佳的性能提升。

4.3 Optimizing memory routines

要實現內存復制(或類似循環)的最大吞吐量,應按照以下方法進行操作:

1. 循環展開:展開循環以每個迭代包含多個加載和存儲操作,從而減少循環的開銷。

2. 在可能的情況下,將存儲操作按32字節邊界對齊。這種對齊可以提高內存傳輸的效率,特別是在處理大塊數據時。

3. 使用非寫回形式的LDP和STP指令,并像下面的示例一樣交錯使用它們:

Loop_start:

SUBS x2,x2,#96

LDP q3,q4,[x1,#0]

STP q3,q4,[x0,#0]

LDP q3,q4,[x1,#32]

STP q3,q4,[x0,#32]

LDP q3,q4,[x1,#64]

STP q3,q4,[x0,#64]

ADD x1,x1,#96

ADD x0,x0,#96

BGT Loop_start

如果要復制的內存位置是非可緩存的,應使用非臨時版本的LDPQ(LDNPQ)。存儲仍然應使用STPQ。

//非寫回形式LDP/STP指令,從內存加載數據后不會修改寄存器的值,還是沒理解???

同樣,建議對比較可緩存內存的memcmp(內存比較)循環使用LDPQ以實現最大吞吐量。非可緩存內存應使用LDNPQ。

要在memset上實現最大吞吐量,建議按照以下步驟進行操作。

展開循環以每次迭代包含多個存儲操作,從而減少循環的開銷。

Loop_start:

STP q1,q3,[x0,#0]

STP q1,q3,[x0,#0x20]

STP q1,q3,[x0,#0x40]

STP q1,q3,[x0,#0x60]

ADD x0,x0,#0x80

SUBS x2,x2,#0x80

B.GT Loop_start

為了實現memset(將內存設置為零)的最佳性能,建議使用DC ZVA(按地址清零數據緩存)指令而不是STP(存儲一對)指令。一個最優的例程可能如下所示:

Loop_start:

SUBS x2,x2,#0x80

DC ZVA,x0

ADD x0,x0,#0x40

DC ZVA,x0

ADD x0,x0,#0x40

B.GT Loop_start

4.4 Load/Store alignment

Armv8-A 架構允許進行許多類型的加載和存儲訪問,它們可以是任意對齊的。Cortex-A715 核心可以處理大多數非對齊訪問而不會帶來性能損失。然而,以下情況可能會降低帶寬或增加額外的延遲:

? 跨越緩存行(64字節)邊界的加載操作。

? 不是4字節對齊的四字加載操作。

? 跨越32字節邊界的存儲操作。

在這些情況下,由于訪問跨越了特定的邊界,可能會導致帶寬降低或延遲增加。因此,在編寫軟件時應盡量避免這些情況,以保持高性能的訪問模式。

4.5 Store to Load Forwarding

Hunter-core允許從存儲指令將數據轉發到加載指令中,但有以下限制:

? 加載的起始地址應與較舊的存儲的起始地址或中間地址對齊。

? 大于8字節的加載可以從最多2個存儲中獲取數據。如果有兩個存儲,則每個存儲只能轉發到加載的第一半或第二半。

? 小于或等于4字節的加載只能從1個存儲中獲取數據。

這些限制規定了Hunter-core體系結構中數據轉發的最佳實踐。它們確保轉發僅限于特定的對齊和大小條件。通過遵守這些限制,軟件開發人員可以最大程度地發揮Hunter-core體系結構中的數據轉發功能的優勢。

4.6 AES encryption/decryption

Cortex-A715核心每個周期可以發出兩個AESE/AESMC/AESD/AESIMC指令(完全流水線化),執行延遲為兩個周期。這意味著為了最大性能,加密或解密至少應該交錯進行四個數據塊的操作。

通過將加密或解密操作交錯進行,可以充分利用Cortex-A715核心的流水線特性。這樣可以保證在每個周期中同時處理多個數據塊,從而提高加密或解密的整體吞吐量和效率。

AESE data0, key_reg

AESMC data0, data0

AESE data1, key_reg

AESMC data1, data1

AESE data2, key_reg

AESMC data2, data2

AESE data3, key_reg

AESMC data3, data3

AESE data0, key_reg

AESMC data0, data0

...

在程序代碼中,當依賴的AESE/AESMC和AESD/AESIMC指令成對出現,并且兩個指令都使用相同的目標寄存器時,它們具有更高的性能。

4.7 Region based fast forwarding

在V流水線中,轉發邏輯經過優化,以提供常常需要相互轉發的指令的最佳延遲。這些優化根據下表進行定義。

請注意以下關于表格中優化的轉發區域的特殊說明:

1. ASIMD/SVE提取窄、飽和指令不包含在這個區域內。

2. ASIM/SVE整數乘累加(INT multiply accumulate)只能快速轉發到累加源。

以下指令不屬于任何區域:

- FP/ASIMD/SVE轉換和舍入指令不會寫入通用寄存器。

- ASIMD/SVE整數歸約(integer reduction)指令。

除了上表中提到的區域之外,INT1和FP1區域中的所有指令都可以快速轉發到FP/ASIMD/SVE存儲以及FP/ASIMD向整數寄存器傳輸,ASIMD寫入通用寄存器的轉換指令和第3.19部分中的PERM指令(參見注釋2)。

關于表格4-1中優化的INT轉發區域的更多特殊說明:

- 在INT1區域中,復雜移位(immediate/register)和位移累加指令不能作為生產者(參見3.16和3.25節)。

- 在INT1區域中,提取窄、飽和指令不能作為生產者(參見3.19和3.25節)。

- 在INT1區域中,絕對值差累加和成對相加累加指令不能作為生產者(參見3.16和3.25節)。

關于表格4-2中優化的FP轉發區域的更多特殊說明:

- ASIMD/SVE浮點乘法和乘累加操作中的元素源(非向量操作數)不能作為消費者。

- 對于浮點生產者-消費者對,指令的精度應該匹配(單精度、雙精度或半精度)在FP1區域中。

- 在FP1區域中,成對浮點指令不能作為生產者或消費者。

不建議交錯使用屬于不同區域的指令。此外,某些指令在特定區域只能作為生產者或消費者,而不能同時兼具兩者身份(請參閱表4-1中針對優化的INT轉發區域和表4-2中針對優化的FP轉發區域的注釋)。例如,下面的代碼交錯了來自INT1和INT2區域的生產者和消費者。這將導致MUL指令面臨額外的1個周期的延遲。

INS v27[1], v20[1]- INT1區域的生產者,但不是INT2區域的消費者

MUL v26, v27, v6 – INT2區域

在表4-1中描述的優化的INT轉發區域和表4-2中的優化的FP轉發區域形成了兩個集群:FP集群和INT集群。集群間通信需要1個額外周期的懲罰。例如,下面的代碼:

FADD v20.2s, v28.2s, v20.2s – FP1區域

ADD v27, v20, v20- INT1區域的生產者,但不是FP1區域的消費者

4.8 Branch instruction alignment

分支指令和分支目標指令的對齊和密度會影響性能。為了獲得最佳性能,應將已經發生的分支放置在對齊的32字節指令內存區域的末尾,并且最好將分支目標指向對齊的32字節指令的開頭。

Cortex-A715核心的預測機制被優化為處理不包含分支的對齊32字節指令區域。為了獲得最佳性能和功耗效率,請避免將分支散布在對齊的指令區域中。

最好是有一個對齊的32字節指令區域包含兩個分支,而不是兩個32字節區域分別包含一個分支。

為避免分支預測限制,請避免將分支放置在4MB對齊的代碼指令區域的最后一條指令位置。

4.9 FPCR self-synchronization

程序員和編譯器編寫者應注意,對FPCR寄存器的寫入是自同步的,即可以依賴其對后續指令的影響,而無需進行干預的上下文同步操作。

4.10 Special register access

Cortex-A715核心對通用寄存器進行了寄存器重命名,以實現亂序和預測執行的指令。但大多數特殊寄存器不會被重命名。讀取或寫入非重命名寄存器的指令將受到以下一個或多個額外的執行約束:

非預測執行 - 指令只能以非預測方式執行。 順序執行 - 指令必須按照與其他相似指令或在某些情況下所有指令相關的順序執行。 刷新副作用 - 指令在執行后觸發刷新副作用,用于同步。

下表總結了各種特殊寄存器讀訪問及其相關的執行約束或副作用。

注意:

1. NZCV和SP寄存器是完全重命名的。

2. FPSR/FPSCR讀取必須等待所有可能更新狀態標志的先前指令執行和完成。

下表總結了各種特殊寄存器寫訪問及其相關的執行約束或副作用。

?

注意:

1. NZCV和SP寄存器是完全重命名的。

2. 如果預測到FPCR寫入將更改控制字段的值,則會引入一個屏障,阻止后續指令的執行。如果預測到FPCR寫入不會更改控制字段的值,則會在沒有屏障的情況下執行,但如果值發生變化則觸發刷新。

3. 如果尚未完成另一個FPSR寫入,則FPSR寫入必須在調度處停頓。

4.11 Instruction fusion

Cortex-A715核心可以通過一種稱為融合的操作來加速特定的指令對。可以進行融合的特定指令對如下所示:

AESE + AESMC(參見AES加密/解密的第4.6節)

AESD + AESIMC(參見AES加密/解密的第4.6節)

CMP/CMN(立即數)+ B.cond

CMP/CMN(寄存器Rn != ZR)+ B.cond

TST(立即數)+ B.cond

TST(寄存器)+ B.cond

BICS ZR(寄存器)+ B.cond

CMP(立即數)+ CSEL

CMP(寄存器)+ CSEL

CMP(立即數)+ CSET

CMP(寄存器)+ CSET

BTI + Integer DP/BR/BLR/RET/B uncond/CBZ/TBZ

SHL + SRI(標量或向量)

FCMP + AXFLAG

MOVPRFX + 支持的SVE指令

這些指令對必須在程序代碼中相鄰。對于CMP、CMN和TST,融合適用于移位和/或擴展的寄存器形式。對于CMP、CMN、TST和BICS,對于支持融合的指令對的兩個指令,存在有關立即數的限制。其他特定限制適用于指令融合。

4.12 Zero Latency Instructions

一些寄存器到寄存器的移動操作、立即數移動操作和謂詞操作可以在零延遲下執行。這些指令不使用調度和執行資源。具體指令如下:

MOV Xd, #{12{1'b0},imm[3:0]}

MOV Xd, XZR

MOV Wd, #{12{1'b0},imm[3:0]}

MOV Wd, WZR

MOV Hd, WZR

MOV Hd, XZR

MOV Sd, WZR

MOV Dd, XZR

MOVI Dd, #0

MOVI Vd.2D, #0

MOV Wd, Wn

MOV Xd, Xn

FMOV Sd, Sn

FMOV Dd, Dn

MOV Vd, Vn(向量)

MOV Zd.D, Zn.D

PTRUE

PFALSE

SETFFR

然而,MOV Wd, Wn、MOV Xd, Xn、FMOV Sd, Sn、FMOV Dd, Dn、MOV Vd, Vn(向量)、MOV Zd.D, Zn.D等指令在某些條件下可能無法以零延遲執行。

4.13 Cache maintenance operation? ? //緩存維護操作

在使用L1緩存的set方式無效化操作時,推薦以內部循環遍歷set,在外部循環遍歷way來編寫軟件。

4.14 Memory Tagging - Tagging Performance? ? //內存標簽

為了實現僅標簽的最大吞吐量,建議按照以下步驟進行操作:

1. 展開循環以在每次迭代中包含多個存儲操作,從而最小化循環的開銷。

2. 使用如下示例所示的STGM(或DCGVA)指令。

Loop_start:

SUBS x2,x2,#0x80

STGM x1,[x0]

ADD x0,x0,#0x40

STGM x1,[x0]

ADD x0,x0,#0x40

B.GT Loop_start

為了實現標簽操作和數據清零的最大吞吐量,建議按照以下步驟進行操作:

1. 展開循環以在每次迭代中包含多個存儲操作,從而最小化循環的開銷。

2. 使用如下示例所示的STZGM(或DCZGVA)指令。這些指令用于同時執行標簽操作和數據清零操作,可以提高效率。

Loop_start:

SUBS x2,x2,#0x80

STZGM x1,[x0]

ADD x0,x0,#0x40

STZGM x1,[x0]

ADD x0,x0,#0x40

B.GT Loop_start

為了實現標簽加載的最大吞吐量,建議按照以下步驟進行操作:

1. 展開循環以在每次迭代中包含多個加載操作,從而最小化循環的開銷。

2. 使用LDGM指令,如下面的示例所示。LDGM指令用于執行標簽加載操作,可以提高效率。

Loop_start:

SUBS x2,x2,#0x80

LDGM x1,[x0]

ADD x0,x0,#0x40

LDGM x1,[x0]

ADD x0,x0,#0x40

B.GT Loop_start

此外,如果不關心數據內容,建議使用STZGM(或DCZGVA)來設置標簽。

4.15 Memory Tagging - Synchronous Mode

在同步標簽檢查模式下,每個存儲操作在執行之前必須完成標簽檢查。因此,在同步標簽檢查模式下,存儲操作的性能會降低。

為了獲得更好的性能,建議使用異步模式。

4.16 Complex ASIMD and SVE instructions

以下是一些ASIMD和SVE指令的帶寬受到解碼限制,當需要高性能代碼時,建議避免使用它們:

ASIMD:

- LD4R,后索引尋址,元素大小為64位。

- LD4,單個4元素結構,后索引尋址模式,元素大小為64位。

- LD4,多個4元素結構,四重形式,元素大小小于64位。

- LD4,多個4元素結構,四重形式,元素大小小于64位,后索引尋址模式。

- ST4,多個4元素結構,四重形式,元素大小小于64位。

- ST4,多個4元素結構,四重形式,元素大小為64位,后索引尋址模式。

SVE:

- LD1H gather(標量 + 矢量尋址),其中矢量索引寄存器與目標寄存器相同,元素大小為32位。尋址模式為32位縮放或非縮放偏移。

- LD3[B/H] contiguous(標量 + 標量尋址)。

- LD4[B/H/W] contiguous(標量 + 立即數尋址)。

- LD4[B/H/W] contiguous(標量 + 標量尋址)。

- LDFF1H gather(標量 + 矢量尋址),其中矢量索引寄存器與目標寄存器相同,元素大小為32位。尋址模式為32位縮放或非縮放偏移。

- ST3[B/H/W/D] contiguous(標量 + 標量尋址)。

- ST4[B/H/D/W] contiguous(標量 + 標量尋址)。

以上指令在執行時受到解碼限制,可能導致帶寬受限,從而影響性能。因此,在對性能要求較高的代碼中,建議避免使用這些指令,選擇其他更適合的指令或優化方法來提高性能。

4.17 MOVPRFX fusion

MOVPRFX是一種指令融合技術,用于將一些特定的MOV和PRFX(Prefix Extend)指令在執行過程中進行融合,以提高執行效率和性能。

在特定條件下,一種名為MOVPRFX融合的機制可以用于加速執行由SVE MOVPRFX指令緊隨其后的SVE整數、浮點或BF16指令組成的指令對。下面的表格中列出了適用于此融合的SVE指令列表和條件。

請注意,在這里我無法直接顯示表格內容,但您可以參考相關文檔、處理器手冊或軟件優化指南以獲取關于MOVPRFX融合的具體說明。這些文獻將詳細介紹適用于融合的指令以及融合機制的條件。建議查閱與您目標處理器架構相應的文檔或咨詢處理器制造商提供的編程資源,以了解適用于融合的具體指令和成功融合執行的特定條件。

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84794.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第二十四章 24.QoS(CCNA)

第二十四章 24.QoS(CCNA) 介紹了switch QoS的配置方法 注釋: 學習資源是B站的CCNA by Sean_Ning CCNA 最新CCNA 200-301 視頻教程(含免費實驗環境) PS:喜歡的可以去買下他的課程,不貴,講的很細 To be continued……

什么是穩定幣?

穩定幣(Stablecoin)是一種特殊的加密貨幣,其核心目標是維持價格穩定,通常與某種穩定資產(如美元、黃金等)掛鉤。 一、為什么需要穩定幣? 普通加密貨幣(如比特幣、以太坊&#xff09…

伺服學習(IS620N)

DI 端子的基本概念 DI 端子是伺服驅動器上的數字輸入接口,用于接收外部開關、按鈕或PLC的24V/0V信號。每個端子的功能可通過參數靈活配置(如啟停、限位等)。 核心要點 功能設置:通過驅動器參數組(如H03)…

基于Python的氣象數據分析及可視化研究

目錄 一.🦁前言二.🦁開源代碼與組件使用情況說明三.🦁核心功能1. ?算法設計2. ?PyEcharts庫3. ?Flask框架4. ?爬蟲5. ?部署項目 四.🦁演示效果1. 管理員模塊1.1 用戶管理 2. 用戶模塊2.1 登錄系統2.2 查看實時數據2.3 查看天…

Excel處理控件Aspose.Cells教程:使用 C# 在 Excel 中應用數據驗證

Excel 中的數據驗證可確保用戶在工作表中僅輸入有效數據。在設計表單、收集數據或構建財務模型時,數據驗證有助于維護結構并最大限度地減少用戶錯誤。在本文中,我們將向您展示如何使用 C# 以編程方式在 Excel 中應用數據驗證。 Aspose.Cells 最新版下載…

AI應用:計算機視覺相關技術總結

計算機視覺概述 計算機視覺(Computer Vision, CV)是一門讓計算機從圖像或視頻中 “理解” 和 “解釋” 視覺信息的技術,涉及多學科交叉(如數學、統計學、機器學習、信號處理等)。以下從技術體系、核心任務、關鍵技術、…

人口販賣暑期威脅消解:算法協同提升安全預警

隨著暑期的到來,人員流動加劇,人口販賣等惡性犯罪活動進入高發階段,景區、車站、商場等公共場所成為潛在風險區域。傳統安防手段在應對此類隱蔽性強、危害性大的犯罪時顯得力不從心。為此,引入基于視覺分析的多維度算法技術&#…

【DSP筆記 · 第3章】數字世界的“棱鏡”:離散傅里葉變換(DFT)完全解析

數字世界的“棱鏡”:離散傅里葉變換(DFT)完全解析 在上一章,我們探索了Z變換和離散時間傅里葉變換(DTFT)。我們知道,DTFT是一個無比強大的理論工具,它能將一個時域離散序列的“基因…

卷積神經網絡的參數量及尺度變化計算

文章目錄 前言1.卷積2.參數量的計算2.1案例一2.2案例二 3.奇怪的優化思想3.1使用小核卷積替換大核卷積3.2卷積核11的應用 4.輸出圖像尺寸的計算4.1Same convolution4.2具體計算規則4.3轉置卷積 小結 前言 本篇博客主要介紹卷積基本概念,卷積神經網絡的參數量計算、…

OpenCV——圖像平滑

圖像平滑 一、圖像的噪聲1.1、噪聲來源1.2、噪聲類型1.3、噪聲模擬 二、濾波器三、線性濾波3.1、均值濾波3.2、方框濾波3.3、高斯濾波 四、非線性濾波4.1、中值濾波4.2、雙邊濾波 圖像在采集和傳輸過程中容易受到各種因素的影響而產生噪聲,而噪聲會對圖像的正確解讀…

鴻蒙系統備份恢復

鴻蒙系統嘗試者,在純血鴻蒙與鴻蒙4.2/4.3之前反復橫跳,中間折騰… 目錄 鴻蒙4.2/4.3升級鴻蒙5.0系統備份 鴻蒙5.0回退鴻蒙4.2/4.3系統備份備份恢復 華為手機助手注意 鴻蒙4.2/4.3升級鴻蒙5.0 系統備份 云空間備份手機本地備份華為手機助手備份 鴻蒙5.…

JS進階 Day03

1.兩種面向編程思想 2.構造函數實現封裝以及存在的問題 下面就引出了原型對象 3.原型對象prototype 共享原理圖&#xff1a; 4.數組擴展案例-求最大值和數組求和 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…

visual studio小番茄插件某些快捷鍵失效

問題 AltO 切換頭文件和源文件失效。 背景 最近升級了 visual studio&#xff0c;多了一些插件 原因 Alt O 快捷鍵被其他插件占用了 解決方案 工具 → 選項 → 環境 → 鍵盤 搜索這個 VAssistX.OpenCorrespondingFile&#xff08;切換頭/源文件&#xff09; 發現命令的快…

基于單片機的PT100溫度變送器設計

基于單片機的PT100溫度變送器設計 文章目錄 基于單片機的PT100溫度變送器設計前言一、資源分享二、系統框架三、硬件準備1.主控制器2、PT100溫度傳感器3、顯示屏4、WIFI模塊5、USB轉RS485模塊6、SP3485EN7、K11-11D3 四、設計PCB1、安裝下載立創EDA專業版2、畫原理圖3、擺放元器…

Git 清理指南:如何從版本庫中移除誤提交的文件(保留本地文件)

場景 在 Git 項目中&#xff0c;我們可能會不小心提交了本應忽略的文件&#xff08;如 node_modules/、.env、*.log 等&#xff09;&#xff0c;導致倉庫體積膨脹或敏感信息泄露。本文介紹如何從 Git 歷史中徹底刪除這些文件&#xff0c;同時保留本地文件。 解決方案 1. 確認…

服務器數據恢復—重裝系統導致XFS文件系統分區無法訪問的數據恢復案例

服務器數據恢復環境&故障&#xff1a; 一臺服務器上通過磁盤柜RAID卡組建的riad5磁盤陣列&#xff0c;服務器上層安裝Linux操作系統&#xff0c;搭建XFS文件系統。服務器上層分配一個LUN&#xff0c;并劃分了兩個分區。通過LVM擴容的方式將sdc1分區加入到了root_lv中&#…

在QtCreator中使用GitHubCopilot

文章目錄 1.github copilot賬號2. 安裝node.js3.安裝 GitHub Copilot Neovim plugin4.在Qt中啟用4.1.在extension中啟用4.2.在配置中啟用4.3.使用/禁用 5.評價 在最新版的QtCreator中&#xff0c;已經通過Extension集成了GitHubCopilot進來。 我用的是16.0.2版本的&#xff08;…

島嶼周長問題的三種解法:直接計數法、數學計算法與深度優先搜索

問題描述 給定一個二維網格 grid&#xff0c;其中1表示陸地&#xff0c;0表示水域。網格中的格子水平和垂直方向相連&#xff08;對角線不相連&#xff09;。網格中恰好有一個島嶼&#xff08;即一個或多個相連的陸地格子&#xff09;&#xff0c;需要計算這個島嶼的周長。 解…

將包含父子關系的扁平列表 List<Demo> 轉換成樹形結構的 List<DemoVO>,每個節點包含自己的子節點列表

1.stream遞歸操作 private List<DemoVO> createtree(List<Demo> datas) {//得到父節點return datas.stream().filter(m -> TargetConstants.ROOT.equalsIgnoreCase(m.getParentId())).map(m -> {DemoVO vo new DemoVO();vo.setTaxonomyId(m.getPlatformTaxo…

【Jmeter】Jmeter 高并發性能壓力測試

目錄 一、下載 Jmeter 二、配置環境變量 三、設置中文語言 四、入門最簡單的高并發性能壓測流程 1. 添加線程組 2. 添加請求 3. 添加監聽器 3.1 添加聚合報告 3.2 添加結果樹 4. 啟動測試 2 種啟動方式&#xff1a; 查看結果樹&#xff1a; 聚合報告&#xff1a; 五…