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融合的具体说明。这些文献将详细介绍适用于融合的指令以及融合机制的条件。建议查阅与您目标处理器架构相应的文档或咨询处理器制造商提供的编程资源,以了解适用于融合的具体指令和成功融合执行的特定条件。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值