ZHCUAQ1F july 2015 – april 2023
避免存储器组冲突
.mptr {variable | memref}, base [+ offset] [, stride]
.mptr 指令将寄存器与允许汇编优化器自动确定两个存储器操作是否存在存储器组冲突的信息相关联。如果汇编优化器确定两个存储器操作存在存储器组冲突,则不会并行调度它们。
在以下情况下,会发生存储器组冲突:在给定周期中对单个存储器组进行两次访问导致存储器停止,从而在从存储器读取第二个值的同时停止一个周期的所有流水线操作。更多有关存储器组冲突的信息,包括如何使用 .mptr 指令来防止冲突,请参阅节 5.5。
以下是 .mptr 指令参数的说明:
variable|memref | 用于标识依赖关系中所涉及加载或存储的寄存器符号或存储器引用的名称。 | |
base | 关联相关存储器访问的符号地址 | |
失调电压 | 起始基符号的偏移量(以字节为单位)。offset 是一个可选参数,默认为 0。 | |
stride | 寄存器循环以字节为单位递增。stride 是一个可选参数,默认为 0。 |
.mptr 指令会告知汇编优化器,当 symbol 或 memref 用作 LD(B/BU)(H/HU)(W) 或 ST(B/H/W) 指令中的存储器指针时,它会初始化为指向 base + offset,并在每次循环中按 stride 递增。
.mptr 指令仅在过程中有效,即在出现 .proc 和.endproc 指令对或 .cproc 和 .endproc 指令对时有效。
用于基符号名称的符号地址 位于与所有其他标签分开的命名空间中。这意味着符号寄存器或汇编标签的名称可以与存储器组基本名称相同。例如:
.mptr Darray,Darray
在下面的示例中,使用 .mptr 来避免存储器组冲突。
_blkcp: .cproc I
.reg ptr1, ptr2, tmp1, tmp2
MVK 0x0, ptr1 ; ptr1 = address 0
MVK 0x8, ptr2 ; ptr2 = address 8
loop: .trip 50
.mptr ptr1, a+0, 4
.mptr foo, a+8, 4
; potential conflict
LDW *ptr1++, tmp1 ; load *0, bank 0
STW tmp1, *ptr2++{foo} ; store *8, bank 0
[I] ADD -1,i,i ; I--
[I] B loop ; if (!0) goto loop
.endproc