相关疑难解决方法(0)

INVD指令有什么用?

显然,x86 INVD使高速缓存层次结构无效,而不将内容写回内存.

我很好奇,这样的教学有什么用?鉴于人们对各种缓存级别的数据控制得很少,甚至对异步刷新的内容控制得更少,这似乎只是一种确保你不知道什么数据的方法.再也不在记忆中了.

x86 assembly cpu-cache

22
推荐指数
1
解决办法
1558
查看次数

Cache-as-Ram(无填充模式)可执行代码

我已多次阅读有关cache-as-ram模式(无填充模式)的信息,并且想知道是否可以编写第一个可执行代码并跳转到可执行代码,如果是这样,可执行代码仅限于一级缓存的一半(从那以后)缓存真的只是sram).

architecture x86 sys

8
推荐指数
1
解决办法
1573
查看次数

为什么CLFLUSH存在于x86中?

我最近了解了排锤攻击.为了执行此攻击,程序员需要为特定数量的地址刷新CPU的完整缓存层次结构.

我的问题是:为什么在x86中需要CLFLUSH?如果所有L*缓存都是透明的(即,不需要显式缓存失效),那么使用此指令的原因是什么?除此之外:CPU是否可以自由地推测内存访问模式,从而完全忽略该指令?

x86 assembly caching cpu-architecture cache-invalidation

8
推荐指数
1
解决办法
1134
查看次数

减少缓存行失效的总线流量

共享内存多处理系统通常需要为缓存一致性生成大量流量。核心 A 写入缓存。Core B 稍后可能会读取相同的内存位置。因此,内核 A,即使它本来可以避免写入主内存,也需要向内核 B 发送通知,告诉 B 如果该地址正在缓存中,则该地址无效。

究竟什么时候需要这样做,这是一个复杂的问题。不同的 CPU 架构有不同的内存模型,这里上下文中的内存模型是一组关于观察到的事情发生的顺序的保证。内存模型越弱,A 在发送通知的确切时间就越放松对于 B,A 和 B 更容易并行做更多的事情。不同 CPU 架构的内存模型总结:https : //en.wikipedia.org/wiki/Memory_ordering#Runtime_memory_ordering

所有的讨论似乎是关于失效发生时,什么为了事情发生英寸

但在我看来,在许多工作负载中,A 写入的大部分数据永远不会被 B 使用,因此如果可以完全消除那些缓存失效的总线流量会更好。专用于执行缓存一致性的硬件仍然需要存在,因为 A 和 B 有时需要共享数据,但写入共享总线是 CPU 可以做的更耗能的事情之一,并且电池寿命和散热通常是现在限制资源,因此减少总线流量将是一个有用的优化。有没有办法做到这一点?

从效率的角度来看,理想的情况是如果忽略总线流量是默认的(因为大多数写入的数据不与其他线程共享),并且您必须在需要缓存一致性的地方显式地发出内存屏障。另一方面,这可能是不可能的,因为假设它在 x86 或 ARM 上运行的现有代码量很大;有没有办法反过来,向 CPU 指示给定的缓存行永远不会对任何其他线程感兴趣?

我会对任何系统的答案感兴趣,但最特别是 x64、ARM 或 RISC-V 上 Linux 最常见的当前/未来服务器配置。

multithreading cpu-architecture memory-model memory-barriers cpu-cache

7
推荐指数
1
解决办法
134
查看次数

为什么我们需要缓存一致性?

在 C 等语言中,不同线程对同一内存位置的不同步读取和写入是未定义的行为。但在 CPU 中,缓存一致性表示,如果一个核心写入某个内存位置,然后另一个核心读取它,则另一个核心必须读取写入的值。

如果上一层将丢弃内存层次结构的连贯抽象,为什么处理器需要费心暴露它呢?为什么不让缓存变得不连贯,并要求软件在想要共享某些内容时发出特殊指令呢?

c cpu cpu-architecture cpu-cache

6
推荐指数
1
解决办法
809
查看次数