标签: cpu-cache

什么是 PDE 缓存?

我有以下基于 ARM 的 SoC 规格:

  • L1 数据缓存 = 32 KB, 64 B/line, 2-WAY, LRU
  • L2 缓存 = 1 MB,64 B/线,16 路
  • L1 数据 TLB(用于加载):32 个条目,完全关联
  • L2 数据 TLB:512 个条目,4 路
  • PDE 缓存:16 个条目(每 1 MB 虚拟空间一个条目)

我想知道什么是 PDE 缓存?我想它类似于 TLB,但我不确定。

回答
似乎 PDE(页面目录条目)是中间表遍历缓存,它确实可以与 TLB 分开实现。

Cortex-A15 MPCore 处理器实现了专用缓存,将中间级别的转换表条目存储为表遍历的一部分。

arm computer-architecture tlb cpu-cache mmu

4
推荐指数
3
解决办法
1330
查看次数

可以通过一个核心广泛使用L3缓存使另一个核心的L1/L2缓存失效吗?

当前的英特尔CPU缓存架构由本地L1和L2缓存以及共享的包含L3缓存组成.我有两个类似的问题:

  1. 可以通过一个核心上运行的线程进行大量内存访问,从而使另一个核心的L1/L2缓存无效吗?
  2. 运行在单个核心上的线程所需的数据是否可以占用整个L3缓存?

更新:请注意,英特尔Skylake具有新的L3缓存架构,该架构不具备包容性.

cpu-cores cpu-cache

4
推荐指数
1
解决办法
271
查看次数

如果数据已经在缓存中,那么非临时存储会发生什么?

当你使用非临时存储,例如movntq,并且数据已经在缓存中时,存储会更新缓存而不是写入内存吗?或者它会更新缓存行并写出来,驱逐它吗?或者是什么?

这是一个有趣的困境.假设线程A正在加载包含x和y的缓存行.线程B使用NT存储写入x.线程A写入y.这里有数据竞争,如果B的存储到x可以在A的负载发生时传输到内存.如果A看到x的旧值,但是X的写入已经发生,那么稍后写入y并最终写回高速缓存行将破坏不相关的值x.我假设处理器以某种方式防止这种情况发生?我不知道如果有可能的行为,任何人都可以使用NT商店构建一个可靠的系统.

c++ x86 sse cpu-cache

4
推荐指数
2
解决办法
473
查看次数

根据Intel的说法,我的缓存应该是12路的,但应该是24路的。

根据“英特尔64和IA-32架构优化参考手册”,2012年4月,第2-23页

LLC数据阵列中保留的数据的物理地址通过散列函数分布在缓存片之间,从而使地址均匀分布。高速缓存块中的数据阵列可以具有对应于0.5M / 1M / 1.5M / 2M块大小的4/8/12/16方式。但是,由于从软件的角度来看,缓存块之间的地址分配,因此它不会显示为普通的N路缓存。

我的计算机是一个2核Sandy Bridge,具有3 MB,12路组关联LLC缓存。但是,这似乎与英特尔的文档不一致。根据数据,看来我应该有24路。我可以想象内核/缓存切片的数量正在发生变化,但是我还不太清楚。如果我有2个内核,因此每个切片有2个1.5 MB的高速缓存片,那么根据Intel的说明,每个高速缓存片将有12种方式,这似乎与我的CPU规格不一致。有人可以向我澄清吗?

如果我想逐出整个缓存行,是否需要以128 KB或256 KB的步幅访问缓存?实际上,这就是我要实现的目标。

任何建议的读物都非常欢迎。

performance intel cpu-architecture micro-optimization cpu-cache

4
推荐指数
1
解决办法
553
查看次数

访问内存时,是否会在缓存命中情况下设置页表访问/脏位?

据我所知,CPU的一次内存访问涉及到CPU缓存和MMU。CPU 将尝试在缓存中找到它的目标,如果发生缓存未命中,CPU 将转向 MMU。在 MMU 访问期间,对应页表项的访问/脏位将由硬件设置。

然而,据我所知,除非出现缓存未命中,否则大多数 CPU 设计都不会触发 MMU,这里我的问题是,是否仍会在缓存命中时设置页表条目的访问/脏位?还是跟架构有关?

cpu-architecture cpu-cache mmu page-tables

4
推荐指数
2
解决办法
2748
查看次数

缓冲缓存更改会阻止Meltdown吗?

如果新的CPU有一个缓存缓冲区,如果提交的指令只提交给实际的CPU缓存,那么类似于Meltdown的攻击仍然可能吗?

建议是让推测性执行能够从内存加载,但在实际提交之前不要写入CPU缓存.

cpu x86 caching cpu-architecture cpu-cache

4
推荐指数
1
解决办法
352
查看次数

Linux中堆栈内存在物理上是连续的吗?

据我所知,堆栈内存在虚拟内存地址中是连续的,但是堆栈内存在物理上也是连续的?这与堆栈大小限制有关吗?

编辑:

我曾经认为堆栈内存不必在物理上是连续的,但是为什么我们认为堆栈内存总是比堆内存快?如果它在物理上不是连续的,那么堆栈如何利用缓存的更多优势?还有另一件事总是让我感到困惑,cpu在数据段中执行指令,该指令不在虚拟内存中的堆栈段附近,我认为操作系统不会使堆栈段和数据段在物理上彼此靠近,因此这可能会损害缓存效果,您认为呢?

再次编辑: 也许我应该举一个例子来更好地表达自己,如果我们想对大量数字进行排序,使用数组存储数字要比使用列表更好,因为每个列表节点都可以由构造malloc,因此没有充分利用缓存,这就是为什么我说堆栈内存比堆内存快。

linux heap-memory virtual-memory stack-size cpu-cache

4
推荐指数
1
解决办法
357
查看次数

为什么在全关联 TLB 中 LRU 实现成本高昂?

我有一本书的声明:

在全关联 TLB 中实现 LRU 非常昂贵,所以一般的方法是使用随机替换。

我不明白为什么在完整的关联缓存下它很昂贵。这不就是增加了一个额外的参考位......?

cpu-architecture tlb cpu-cache

4
推荐指数
1
解决办法
607
查看次数

无法在Rust中重现虚假缓存行共享问题

我正在尝试重现处理器缓存效果库的示例6 .

本文以此函数(在C#中)为例来说明如何测试错误共享:

private static int[] s_counter = new int[1024];
private void UpdateCounter(int position)
{
    for (int j = 0; j < 100000000; j++)
    {
        s_counter[position] = s_counter[position] + 3;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们创建传递给这个函数0,1,2,3参数的线程,它将花费很长时间来完成(作者得到4.3秒).如果我们通过,例如,16,32,48,64,我们将获得更好的结果(0.28秒).

我在Rust中提出了以下功能:

pub fn cache_line_sharing(arr: [i32; 128], pos: usize) -> (i32, i32) {
    let arr = Arc::new(arr);
    let handles: Vec<_> = (0..4).map(|thread_number| {
        let arr = arr.clone();
        let pos = thread_number * pos;
        thread::spawn(move || unsafe {
            let p = (arr.as_ptr() as *mut i32).offset(pos as isize); …
Run Code Online (Sandbox Code Playgroud)

benchmarking rust cpu-cache false-sharing

4
推荐指数
1
解决办法
130
查看次数

如果长时间闲置,Cache 会自行清空吗?

如果在阈值时间内没有遇到任何指令,缓存是否会自行刷新?

我的意思是假设,我有一台多核机器,并且上面有隔离的内核。现在,对于其中一个核心,有几秒钟没有活动。在这种情况下,是否会在经过一定时间后刷新指令缓存中的最后一条指令?

我知道这可能取决于体系结构,但我正在寻找有关该概念的一般指示。

cpu-architecture cpu-cache

4
推荐指数
1
解决办法
206
查看次数