我有以下基于 ARM 的 SoC 规格:
我想知道什么是 PDE 缓存?我想它类似于 TLB,但我不确定。
回答
似乎 PDE(页面目录条目)是中间表遍历缓存,它确实可以与 TLB 分开实现。
Cortex-A15 MPCore 处理器实现了专用缓存,将中间级别的转换表条目存储为表遍历的一部分。
当前的英特尔CPU缓存架构由本地L1和L2缓存以及共享的包含L3缓存组成.我有两个类似的问题:
更新:请注意,英特尔Skylake具有新的L3缓存架构,该架构不具备包容性.
当你使用非临时存储,例如movntq,并且数据已经在缓存中时,存储会更新缓存而不是写入内存吗?或者它会更新缓存行并写出来,驱逐它吗?或者是什么?
这是一个有趣的困境.假设线程A正在加载包含x和y的缓存行.线程B使用NT存储写入x.线程A写入y.这里有数据竞争,如果B的存储到x可以在A的负载发生时传输到内存.如果A看到x的旧值,但是X的写入已经发生,那么稍后写入y并最终写回高速缓存行将破坏不相关的值x.我假设处理器以某种方式防止这种情况发生?我不知道如果有可能的行为,任何人都可以使用NT商店构建一个可靠的系统.
根据“英特尔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
据我所知,CPU的一次内存访问涉及到CPU缓存和MMU。CPU 将尝试在缓存中找到它的目标,如果发生缓存未命中,CPU 将转向 MMU。在 MMU 访问期间,对应页表项的访问/脏位将由硬件设置。
然而,据我所知,除非出现缓存未命中,否则大多数 CPU 设计都不会触发 MMU,这里我的问题是,是否仍会在缓存命中时设置页表条目的访问/脏位?还是跟架构有关?
如果新的CPU有一个缓存缓冲区,如果提交的指令只提交给实际的CPU缓存,那么类似于Meltdown的攻击仍然可能吗?
建议是让推测性执行能够从内存加载,但在实际提交之前不要写入CPU缓存.
据我所知,堆栈内存在虚拟内存地址中是连续的,但是堆栈内存在物理上也是连续的?这与堆栈大小限制有关吗?
编辑:
我曾经认为堆栈内存不必在物理上是连续的,但是为什么我们认为堆栈内存总是比堆内存快?如果它在物理上不是连续的,那么堆栈如何利用缓存的更多优势?还有另一件事总是让我感到困惑,cpu在数据段中执行指令,该指令不在虚拟内存中的堆栈段附近,我认为操作系统不会使堆栈段和数据段在物理上彼此靠近,因此这可能会损害缓存效果,您认为呢?
再次编辑:
也许我应该举一个例子来更好地表达自己,如果我们想对大量数字进行排序,使用数组存储数字要比使用列表更好,因为每个列表节点都可以由构造malloc,因此没有充分利用缓存,这就是为什么我说堆栈内存比堆内存快。
我有一本书的声明:
在全关联 TLB 中实现 LRU 非常昂贵,所以一般的方法是使用随机替换。
我不明白为什么在完整的关联缓存下它很昂贵。这不就是增加了一个额外的参考位......?
我正在尝试重现处理器缓存效果库的示例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) 如果在阈值时间内没有遇到任何指令,缓存是否会自行刷新?
我的意思是假设,我有一台多核机器,并且上面有隔离的内核。现在,对于其中一个核心,有几秒钟没有活动。在这种情况下,是否会在经过一定时间后刷新指令缓存中的最后一条指令?
我知道这可能取决于体系结构,但我正在寻找有关该概念的一般指示。
cpu-cache ×10
mmu ×2
tlb ×2
x86 ×2
arm ×1
benchmarking ×1
c++ ×1
caching ×1
cpu ×1
cpu-cores ×1
heap-memory ×1
intel ×1
linux ×1
page-tables ×1
performance ×1
rust ×1
sse ×1
stack-size ×1