Performance 一级缓存—x86/x64可以从同一缓存线同时加载多少个?

Performance 一级缓存—x86/x64可以从同一缓存线同时加载多少个?,performance,x86-64,hardware,cpu-architecture,cpu-cache,Performance,X86 64,Hardware,Cpu Architecture,Cpu Cache,我有一些从数组读取的代码。阵列更大。我希望它能在二级缓存中大量存在。称之为“告诉” 我编写了一个替代方案,从一个数组中读取数据,该数组主要位于单个缓存线中(我不希望被逐出)。这叫TNew 它们应该产生同样的结果,而且它们确实如此。被告对其数组进行一次读取以获得结果。TNew执行6次读取(以及一些可以忽略不计的简单算术运算)。在这两种情况下,我都希望阅读占据主导地位 二级缓存读取约15个周期的成本。一级缓存读取的成本增加了约5个周期,但我执行了其中的6个周期,因此预计总共需要约30个周期。所以我希

我有一些从数组读取的代码。阵列更大。我希望它能在二级缓存中大量存在。称之为“告诉”

我编写了一个替代方案,从一个数组中读取数据,该数组主要位于单个缓存线中(我不希望被逐出)。这叫TNew

它们应该产生同样的结果,而且它们确实如此。被告对其数组进行一次读取以获得结果。TNew执行6次读取(以及一些可以忽略不计的简单算术运算)。在这两种情况下,我都希望阅读占据主导地位

二级缓存读取约15个周期的成本。一级缓存读取的成本增加了约5个周期,但我执行了其中的6个周期,因此预计总共需要约30个周期。所以我希望TNew的速度应该是现在的一半。相反,这只是几个百分点的差异

这表明一级缓存能够同时从同一缓存线执行2次读取。这在x86/x64中可能吗

另一个选择是,我没有正确地将TNew的数组对齐到一个缓存线中,它跨越了两个缓存线,可能允许两次同时读取,每行一次。可能吗


坦率地说,这两种观点似乎都不可信,但意见是受欢迎的。

x86-64是ISA,而不是微体系结构。特定的微体系结构具有不同的性能。但现代主流的英特尔和AMD都可以在每个时钟上加载2次(从相同或不同的缓存线)。自SnB以来的英特尔,自K8以来的AMD。Intel SnB/IvB在读取不同的缓存线时可能会发生银行冲突,但HSW和后来甚至删除了这一点。还要注意,执行是流水线的~5个周期是L1d加载使用延迟,但仅当一个加载依赖于上一个加载时(例如,在链表中的
next
指针之后),才可将时间相加。否则,即使缓存未命中,流水线执行也可能与访问重叠。(这就是为什么现代x86 CPU有如此多的负载缓冲区)L1d缓存是多端口的,可以在同一个周期内支持多个读取(和一个写入),非常类似于寄存器文件必须是多端口的,才能在一个周期内支持8个值的读取和4个值的写入。多次访问同一行并不比访问不同的行困难,尤其是当两次访问都是读取时。另请参见链接的副本;我找到了一些关于我在评论中所说的内容;为每个端口复制标记比较器,以独立确定命中/未命中,并将正确的数据多路复用到输出,或指示未命中。(显示比较器的数量如何仅随每组通道的数量而不是缓存大小进行缩放。对于多端口缓存,也可随#个端口进行缩放)。是的,寄存器文件由已知范围内的整数(从reg重命名的RAT=寄存器分配表)编制索引,不需要比较器。但是,TLB需要实际的内容寻址内存(CAM),它也是多端口(/)。与缓存线的大小相比,TLB条目的每个条目的数据量不多。现代TLB足够大,它们通常不完全关联,因此可能不是真正的CAM。实际的CPU缓存肯定不是完全关联的,只是8路,所以基本上你可以索引一个集合,从集合中获取(并行)所有标记和数据,并将它们提供给一组比较器/多路复用器。