Performance 关于超线程中一级缓存的自适应模式

Performance 关于超线程中一级缓存的自适应模式,performance,intel,cpu-architecture,cpu-cache,hyperthreading,Performance,Intel,Cpu Architecture,Cpu Cache,Hyperthreading,我是一名学生,最近在做一些关于超线程的研究。我对feature-L1数据缓存上下文模式有点困惑 在中,描述了一级缓存可以在两种模式下运行: 根据上下文ID位,一级缓存可以在两种模式下运行: 共享模式:一级数据缓存由两个逻辑处理器完全共享 自适应模式:在自适应模式下,使用页目录的内存访问在共享一级数据缓存的逻辑处理器之间以相同的方式映射 但是,我很好奇,根据描述,缓存是如何在自适应模式下进行分区的。在Intel arch上,一级上下文ID的值为1表示一级数据缓存模式可以设置为自适应模式或共享

我是一名学生,最近在做一些关于超线程的研究。我对feature-L1数据缓存上下文模式有点困惑

在中,描述了一级缓存可以在两种模式下运行:

  • 根据上下文ID位,一级缓存可以在两种模式下运行:

  • 共享模式:一级数据缓存由两个逻辑处理器完全共享

  • 自适应模式:在自适应模式下,使用页目录的内存访问在共享一级数据缓存的逻辑处理器之间以相同的方式映射


但是,我很好奇,根据描述,缓存是如何在自适应模式下进行分区的。

在Intel arch上,一级上下文ID的值为1表示一级数据缓存模式可以设置为自适应模式或共享模式,而值为0表示不支持此功能。有关详细信息,请查看
IA32\u MISC\u ENABLE MSR Bit 24
(一级数据缓存上下文模式)的定义

根据(第11章/缓存控制),我引用如下:

  • 共享模式
在共享模式下,一级数据缓存在逻辑处理器之间竞争性共享。即使逻辑处理器使用相同的CR3寄存器和分页模式,也是如此。在共享模式下,一级数据缓存中的线性地址可以使用别名,这意味着缓存中的一个线性地址可以指向不同的物理位置。解决混叠的机制可能导致抖动。因此,IA32_MISC_ENABLE[位24]=0是基于支持英特尔超线程技术的英特尔NetBurst微体系结构的处理器的首选配置

  • 自适应模式
自适应模式有助于逻辑处理器之间的一级数据缓存共享。在自适应模式下运行时,一级数据缓存在同一内核中的逻辑处理器之间共享,前提是:

•共享缓存的逻辑处理器的CR3控制寄存器相同

•共享缓存的逻辑处理器使用相同的分页模式

在这种情况下,每个逻辑处理器都可以使用整个一级数据缓存(而不是竞争性共享)。 如果共享一级数据缓存的逻辑处理器的CR3值不同,或者逻辑处理器使用不同的分页模式,则处理器会争夺缓存资源。这会减少每个逻辑处理器的缓存的有效大小。 不允许缓存的别名(这会防止数据抖动)


我只是猜测,一级数据缓存没有明确的分区方法。

文档只是指出,如果您使用自适应模式,并且如果CR3或分页模式在内核之间不同,则缓存不会共享,内核会“竞争”缓存。它没有说明分区是如何工作的

实现这一点最直接的方式是静态地将数据缓存的一半方式保留给每个处理器。这实际上是将一半的数据缓存静态分配给每个处理器

或者,它们可以向每个缓存线的虚拟标记中添加一个附加位,以区分该缓存线属于哪个处理器。这将允许缓存的动态分区。这比静态分区更符合“竞争”缓存的描述


如果你真的需要知道,你可以设计一些微基准来验证这些方案中的一个是否被实际使用。

一级数据缓存在这两种模式中都没有分区,并且始终是竞争性共享的

请注意,手册中有一个明显的错误,模式不是由上下文ID位决定的,而是由
IA32\u MISC\u ENABLE[24]
决定的。Northwood和HT的后续步骤以及所有Prescott处理器都支持此增强功能。默认值为零,表示自适应模式。但是,在某些处理器中,更新的BIOS可能会通过设置
IA32\u MISC\u ENABLE[24]
切换到共享模式,因为这些处理器中的错误仅在自适应模式下发生

在Northwood与HT的早期步骤中,仅支持共享模式。在共享模式下,当向一级数据缓存发出加载请求时,首先在“快速路径”上处理该请求,这涉及基于线性地址的位11-15进行路径预测,并由此产生推测性命中/未命中信号。在使用HT的处理器中,还比较了逻辑核心ID。部分标记和逻辑核心ID必须匹配才能获得推测性命中。一般来说,这有助于提高正确的投机性命中率

如果两个同级逻辑核心在相同的分页模式下运行,并且具有相同的CR3值,这表明来自两个核心的访问使用相同的页表(如果启用了分页),那么即使逻辑核心ID在缓存的快速路径上不匹配,也最好产生推测性命中


在自适应模式下,只要更改其中一个核心的分页模式或CR3寄存器,就会计算上下文ID值。如果分页模式和CR3值匹配,则上下文ID位设置为两个可能值之一。否则,它将设置为另一个值。向缓存发出加载请求时,将检查上下文ID。如果指示核心具有相同的地址转换结构,则忽略逻辑核心ID比较结果,如果部分虚拟标记匹配,则产生推测命中。否则,逻辑核心ID比较将在共享模式下生效。

我已经看到了这些定义。我想知道的是如何对一级数据缓存进行分区,以及如何识别一级缓存中的不同进程?