事务内存:它是什么以及通过英特尔 TSX 进行集成

事务记忆

我们 PC 的很大一部分功能基于工作分工,其中多个元素共享执行部分代码以使用它。 但有时在访问数据和指令时会出现冲突,从而成为性能问题。 修复它的一种方法是事务内存。

多核最大的问题之一 中央处理器 我们的 PC 使用的系统是基于冯诺依曼模型的,即只有一个共享内存。 随着 CPU 中并行工作的执行单元、内核、线程和其他元素的数量增加。 他们之间的矛盾越来越多。 不仅在访问数据方面,而且在不同内存地址中包含的信息中,因此在程序使用的变量的值中。 有很多方法可以避免这些冲突,其中之一是事务内存,我们将在本文中对其进行描述。

问题简介

塞罗霍斯

在编写程序时,它被编码为一系列显然是按顺序执行的指令。 但是已经有了在执行过程中具有单个内核的指令的并行性,不同的执行单元可以进入。 为此,我们必须考虑到无序执行会增加运行时对内存和数据的访问以无序方式进行的复杂性。

当有大量请求时,最终会产生访问相同内存的争用。 这会导致请求延迟越来越长,从而增加 CPU 在某些指令上的内存延迟并影响带宽。 为此,有一些机制可以尽可能避免内存访问中的这些冲突,以便进程从有序内存访问内存。 这可以避免在修改其层次结构中的数据时发生冲突,并减少争用问题和访问延迟。

实现这一点的最简单方法是通过锁,这是我们标记的代码部分,它们不必由 CPU 的不同线程同时执行。 也就是说,只有它的一个核心可以负责这部分代码。 所以我们对其余的核做了一个锁定,其余的只有在到达结束锁定的指令时才能进入执行。 当与除一个内核之外的所有内核隔离的代码部分完成时,就会发生这种情况。

什么是事务内存?

Códigobinario颜色

避免上一节中描述的问题的一种方法是使用事务内存。 这不是一种内存或存储,所以我们不是在谈论一个纯粹的硬件。 它的起源是在数据库的事务中,它是一种在 Load-Store 单元中执行的指令。

处理器中的事务系统的工作原理如下:

  1. 创建多个内核想要访问的内存部分的副本,每个实例一个。
  2. 每个实例独立于其余私有副本修改其私有副本。
  3. 如果数据已在私有副本中而不是在其余副本中被修改,则修改也会复制到私有副本的其余部分中。
  4. 如果两个实例同时对同一数据进行更改并导致数据不一致,则两个私有副本都将被删除。 其余的私人副本被复制

第四点很重要,因为在这部分代码中很明显有必要对那部分代码进行序列化。 这意味着其余的实例停止修改其私有副本,并且只有其中一个实例进行修改。 当它结束时,修改然后被复制到私有副本的其余部分。 当标记为事务的代码部分已经执行并且所有私有副本都包含相同的信息时,则将结果复制到相应的缓存行和内存地址中。

事务内存系统,英特尔 TSX

Memoria 跨系统硬件

缩写词 TSX, 事务同步扩展, 指的是对 x86 ISA 的一系列附加指令,这些指令旨在将事务内存支持添加到 英特尔 CPU。 因此,它是一系列与之相关的指令和机制,允许将代码的特定部分界定为事务性的,并允许英特尔 CPU 执行我们在前面的过程中讨论过的过程。 但在这种情况下,英特尔的实现有点复杂。 因为,正如我们之前看到的,如果两个数据之间存在冲突,整个过程就会被一个正在运行的实例中止。

它在硬件中的实现是通过添加一种称为事务缓存的新型缓存来实现的,其中对不同的数据执行不同的操作。 请记住,事务内存寻求的是减少访问内存时的冲突。 尽管缓存支持的请求数量比 内存 一般来说,这些也是有限的,尤其是在离核心最远的层次上。 所有这些都与内部存储器和私有寄存器的使用相结合,这些内部存储器和私有寄存器用作对由不同内核执行的私有副本的支持。

英特尔 TSX 指令不是一个复杂的集合,一方面,我们有 XBEGIN 指令,它在内存的事务部分开始时标记我们,XEND 指令标记结束,XABORT 用于标记进程退出当出现异常情况时。

Intel TSX指令结束?

英特尔 TSX 取消

今天的 CPU 控制单元实际上是成熟的微控制器,这意味着它解码指令的方式和指令列表可以更新。 英特尔在 Haswell 架构上进行了第一个实现,迄今为止它一直保留在英特尔 CPU 中。 由于它最近已通过英特尔自己的第六、第七和第八代内核上的固件禁用。

英特尔不时执行其 CPU 的远程更新,这些更新是通过我们 PC 中的英特尔管理引擎在我们不知情的情况下执行的。 它们通常并不常见,但可以包括对某些指令的执行进行优化,甚至取消对其他指令的支持。 在英特尔酷睿中取消英特尔 TSX 是因为控制单元内部微码的最新修改意味着软件运行中存在冲突,这意味着 CPU 无法正常工作。

但真正的原因是,英特尔 TSX 允许恶意代码在经典安全系统的雷达下执行,尤其是影响操作系统的代码。 由于私有副本不对应于用户的环境或操作系统。 所以仍然是一个类似于投机执行的问题。