相关疑难解决方法(0)

29
推荐指数
3
解决办法
2万
查看次数

L2 TLB未命中后会发生什么?

我很难理解当翻译旁视缓冲区的前两个级别导致未命中时会发生什么?

我不确定特殊硬件电路中是否出现"页面行走",或者页表是否存储在L2/L3高速缓存中,或者它们是否只存在于主存储器中.

cpu performance x86 cpu-architecture tlb

19
推荐指数
1
解决办法
2135
查看次数

当base + offset与基数不同时,是否存在惩罚?

这三个片段的执行时间:

pageboundary: dq (pageboundary + 8)
...

    mov rdx, [rel pageboundary]
.loop:
    mov rdx, [rdx - 8]
    sub ecx, 1
    jnz .loop
Run Code Online (Sandbox Code Playgroud)

还有这个:

pageboundary: dq (pageboundary - 8)
...

    mov rdx, [rel pageboundary]
.loop:
    mov rdx, [rdx + 8]
    sub ecx, 1
    jnz .loop
Run Code Online (Sandbox Code Playgroud)

还有这个:

pageboundary: dq (pageboundary - 4096)
...

    mov rdx, [rel pageboundary]
.loop:
    mov rdx, [rdx + 4096]
    sub ecx, 1
    jnz .loop
Run Code Online (Sandbox Code Playgroud)

对于第一个片段,在4770K上,每次迭代大约5个周期,对于第二个片段,每次迭代大约9个周期,然后是第三个片段的5个周期.它们都访问完全相同的地址,这是4K对齐的.在第二个片段中,只有地址计算跨越页面边界:rdx并且rdx + 8不属于同一页面,负载仍然是对齐的.如果偏移量很大,则会再次回到5个周期.

这种效果一般如何起作用?


通过ALU指令从加载路由结果,如下所示:

.loop:
    mov rdx, …
Run Code Online (Sandbox Code Playgroud)

performance x86 assembly micro-optimization

11
推荐指数
1
解决办法
456
查看次数

为什么用{:p}打印的内存地址比我的RAM规格大得多?

我想打印变量的内存位置(地址):

let x = 1;
println!("{:p}", &x);
Run Code Online (Sandbox Code Playgroud)

这将打印0x7fff51ef6380十进制的十六进制值140734568031104.

我的电脑有16GB的RAM,为什么这么大的数字呢?x64架构是否使用大间隔序列而不是简单的1增量来访问内存位置?

在x86中,通常第一个位置从0开始,然后是1,2,等等.因此,您可以拥有的最高数字大约为40亿,因此地址编号始终等于或小于40亿.

为什么x64不是这种情况?

memory rust

7
推荐指数
2
解决办法
261
查看次数

如何在x86_64上准确地对准未对齐的访问速度

答案中,我已经声明未对齐访问的速度与对齐访问的速度几乎相同(在x86/x86_64上).我没有任何数字来支持这个陈述,所以我已经为它创建了一个基准.

你看到这个基准测试有什么缺陷吗?你可以改进它(我的意思是,增加GB /秒,所以它更好地反映了真相)?

#include <sys/time.h>
#include <stdio.h>

template <int N>
__attribute__((noinline))
void loop32(const char *v) {
    for (int i=0; i<N; i+=160) {
        __asm__ ("mov     (%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x04(%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x08(%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x0c(%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x10(%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x14(%0), %%eax" : : "r"(v) :"eax");
        __asm__ ("mov 0x18(%0), %%eax" : : "r"(v) :"eax"); …
Run Code Online (Sandbox Code Playgroud)

performance benchmarking x86 x86-64 inline-assembly

5
推荐指数
1
解决办法
881
查看次数

从Intel上的CPUID结果了解TLB

我正在探索说明的叶子0x02cpuid并提出了一些问题。文档中有一个表格,描述cpuid了TLB配置的结果。他们来了:

情况1

56H TLB Data TLB0: 4 MByte pages, 4-way set associative, 16 entries
[...]
B4H TLB Data TLB1: 4 KByte pages, 4-way associative, 256 entries
Run Code Online (Sandbox Code Playgroud)

这是否意味着只有2个级别的TLB?如果某些x86供应商决定提供3个级别的TLB,如何查询TLB缓存的级别数?

情况2

57H TLB Data TLB0: 4 KByte pages, 4-way associative, 16 entries
[...] 
B4H TLB Data TLB1: 4 KByte pages, 4-way associative, 256 entries
Run Code Online (Sandbox Code Playgroud)

这里的“ 4向关联”仅仅是错字,意味着“ 4向集合关联”吗?

情况3

55H TLB Instruction TLB: 2-MByte or 4-MByte pages, fully associative, 7 entries
[...]
6AH Cache …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64 tlb cpuid

5
推荐指数
2
解决办法
208
查看次数

加载操作是否在分派、完成或其他时间从 RS 解除分配?

在现代 Intel 1 x86 上,是否在调度2 时完成3时或介于4之间的某个时间点从 RS(保留站)释放负载 uops ?


1我也对 AMD Zen 和续集很感兴趣,所以也可以随意包括在内,但为了使问题易于管理,我将其限制为英特尔。此外,AMD 似乎与英特尔的加载管道略有不同,这可能会使在 AMD 上进行调查成为一项单独的任务。

2这里的调度是指让 RS 执行。

3在这里完成意味着当加载数据返回并准备好满足相关的 uops 时。

4甚至在这两个事件定义的时间范围之外的某个地方,这似乎不太可能,但可能。

x86 intel cpu-architecture micro-architecture

5
推荐指数
2
解决办法
289
查看次数

现代缓存中的方式预测

我们知道,就缓存命中时间而言,直接映射缓存优于集合关联缓存,因为不涉及特定标签的搜索。另一方面,组关联缓存通常比直接映射缓存具有更好的命中率。

我读到,现代处理器试图通过使用一种称为路径预测的技术来结合两者的优点。他们预测给定集合中最有可能发生命中的行,并仅在该行中进行搜索。如果尝试导致未命中,请在该组的所有缓存行中使用正常的组关联搜索。

我想了解这种路径预测是如何工作的。预测硬件/逻辑的延迟如何小于整套的搜索延迟?

caching processor cpu-architecture cpu-cache micro-architecture

5
推荐指数
1
解决办法
3309
查看次数

如果它们都需要两次内存访问,什么使 TLB 比页表更快?

刚刚离开维基百科

页表通常存储在主内存中,跟踪虚拟页面在物理内存中的存储位置。该方法使用两次内存访问(一次用于页表条目,一次用于字节)来访问一个字节。首先,在页表中查找帧号。其次,带有页偏移量的帧号给出了实际地址。因此,任何简单的虚拟内存方案都会使内存访问时间加倍。因此,TLB 用于减少在页表方法中访问内存位置所花费的时间。

因此,我很好奇为什么 TLB 实际上更快,因为据我所知,它只是页表的一个更小、更精确的副本。

您仍然需要访问TLB以找到物理地址,然后一旦获得了物理地址,您仍然需要实际访问物理地址处的数据,这与页表一样是两次查找。

我只能想到TLB更快的两个原因:

  • 在 TLB 或页表中查找地址不是 O(n)(我假设它像哈希表一样是 O(1))。因此,由于 TLB 小得多,因此查找速度更快。同样在这种情况下,为什么不使用哈希表而不是 TLB?

  • 我错误地解释了 TLB 的工作原理,它实际上并没有进行两次访问。

memory paging operating-system cpu-architecture tlb

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

不同级别的缓存是否在同一个频域中运行?

较大的高速缓存通常具有较长的位线或字线,因此很可能具有更高的访问延迟和周期时间。

那么,L2 缓存是否与 L1 缓存在同一个域中工作?L3 缓存(切片)如何,因为它们现在是非包容性的并且在所有内核之间共享?

相关问题是:内核中的所有功能单元都在同一个时钟域中吗?非核心部分是否都在同一个时钟域中?多核系统中的内核是否同步?

我相信时钟域交叉会引入额外的延迟。CPU 芯片中的大部分部件是否在同一时钟域上工作?

cpu caching cpu-architecture

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