Performance x86在数据位于2个不同块时存储

Performance x86在数据位于2个不同块时存储,performance,assembly,x86,x86-64,memory-alignment,Performance,Assembly,X86,X86 64,Memory Alignment,Supose linux-32:例如,aligment规则规定double(8字节)必须与4字节对齐。这意味着,如果我们假设64字节缓存块(现代处理器的典型值),我们可以在第60位有一个双精度对齐,这意味着这个双精度将在两个不同的缓存块中。 甚至可能双缓存的两个部分都位于两个不同4KB页面中的两个不同缓存块中 在简要介绍了问题的来龙去脉之后,我有几个疑问: 1-对于追求最高性能的汇编程序编程,建议通过放置对齐指令来防止这些事情发生,对吗?或者,出于我不知道的任何原因,使对齐仅在1个块中实现双精度

Supose linux-32:例如,aligment规则规定double(8字节)必须与4字节对齐。这意味着,如果我们假设64字节缓存块(现代处理器的典型值),我们可以在第60位有一个双精度对齐,这意味着这个双精度将在两个不同的缓存块中。 甚至可能双缓存的两个部分都位于两个不同4KB页面中的两个不同缓存块中

在简要介绍了问题的来龙去脉之后,我有几个疑问:

1-对于追求最高性能的汇编程序编程,建议通过放置对齐指令来防止这些事情发生,对吗?或者,出于我不知道的任何原因,使对齐仅在1个块中实现双精度并不意味着任何性能变化


2-在上述情况下,存储指令将如何在中解码?(支持现代英特尔微体系结构)。我的意思是,我知道一条普通的store x86指令是在一对微融合的str addr和str数据中解码的,但在这种情况下,如果涉及两个不同的缓存块(甚至可能是两个不同的4KB页面),这将在两对微融合的str addr和str数据中解码(一个用于double的前4个字节,另一个用于最后4个字节)?或者它将被解码为单个微熔合对,但必须同时执行str addr和str数据两倍的工作,直到最终能够退出执行端口?

是的,当然,您应该尽可能地对齐一个
,就像编译器一样,除非ABI结构布局规则迫使它们对齐。(ABI是在i386通电时设计的,因此双工始终需要2个负载。)

i386 System V ABI的当前版本需要16字节堆栈对齐,因此本地双精度(必须溢出而不是保存在regs中)可以对齐,并且
malloc
必须返回适合任何类型的内存,并且
alignof(max_align_t)=16
在32位Linux上(32位Windows上为8)因此,32位malloc将始终为您提供至少16(或8)字节对齐的内存。当然,在静态存储中,您可以使用
align
(NASM)或
.p2align
(GAS)指令控制对齐


有关缓存线拆分和页面拆分的性能缺点,请参阅


re:解码:解码时不知道地址,因此很明显,行拆分页拆分的任何影响都会在以后解决。对于存储,在存储缓冲区条目必须提交到L1d缓存之前,可能不会产生任何影响。-可能不会,在执行存储地址uop后分配第二个条目是不可信的

对于加载,通过执行单元重新运行加载以获得另一半(或任何不均匀的分割),使用内部行分割缓冲区合并数据。(不是从RS重新调度,只是在加载端口内部处理。但是RS会积极重放UOP,等待加载结果。)


为未对齐的存储重新运行存储数据uop似乎也不太可能。我认为我们没有看到
uops\u分派的\u端口.port\u 4
perf事件的额外计数。

是的,当然,您应该尽可能对齐
双精度
,就像编译器一样,除非在ABI结构布局规则的强制下使它们未对齐。(ABI是在i386通电时设计的,因此双工始终需要2个负载。)

i386 System V ABI的当前版本需要16字节堆栈对齐,因此本地双精度(必须溢出而不是保存在regs中)可以对齐,并且
malloc
必须返回适合任何类型的内存,并且
alignof(max_align_t)=16
在32位Linux上(32位Windows上为8)因此,32位malloc将始终为您提供至少16(或8)字节对齐的内存。当然,在静态存储中,您可以使用
align
(NASM)或
.p2align
(GAS)指令控制对齐


有关缓存线拆分和页面拆分的性能缺点,请参阅


re:解码:解码时不知道地址,因此很明显,行拆分页拆分的任何影响都会在以后解决。对于存储,在存储缓冲区条目必须提交到L1d缓存之前,可能不会产生任何影响。-可能不会,在执行存储地址uop后分配第二个条目是不可信的

对于加载,通过执行单元重新运行加载以获得另一半(或任何不均匀的分割),使用内部行分割缓冲区合并数据。(不是从RS重新调度,只是在加载端口内部处理。但是RS会积极重放UOP,等待加载结果。)


为未对齐的存储重新运行存储数据uop似乎也不太可能。我认为我们没有看到
uop\u分派的\u端口。端口4
perf事件的额外计数。

您知道第二个问题的答案吗?这是一个让我最好奇的问题:知道如果我决定不对齐数据并且数据已定位,会发生什么在两个区块之间(甚至在两页之间)。(也许,在我问这个问题的时候,你正在对你的答案进行编辑以包含此内容。如果是这种情况,我将删除此评论)@isma:噢,当我略读这个问题时,我不知道你指的是文字解码。我想回答了你所问的大多数其他uop细节。@isma:RS=预订站=调度程序。这种特殊情况可能引发内部异常或其他问题(Skylake之前的页面拆分成本超过100个周期,可能类似于微码辅助,用于低于正常的FP,基本上刷新管道)。或者在Skylake上,他们显然只需轻微的惩罚就可以处理它,可能类似于缓存拆分加载uop稍后在同一端口上重新执行以处理另一方的方式。AMD的内部结构与Intel有许多相似之处。他们有专利共享协议,因此当只有