这似乎只是一种营销点缀。
我在互联网、英特尔手册和英特尔 ISA 扩展手册中都没有发现任何对“TSX-NI”的引用。
Quoting Intel [1 https://software.intel.com/en-us/blogs/2012/02/07/transactional-synchronization-in-haswell]
英特尔事务同步扩展(英特尔 TSX)有两种版本:HLE 和 RTM。
由于它们的实现,这两个方面是解耦的(其中一个方面可以与另一个方面分开支持),并且只有 RTM 引入了新指令。
所以他们可能指的是 RTM。
我相信 HLE 首先被引入,并且应该有支持 HLE 但不支持 RTM 的处理器(反之亦然,虽然可能,但似乎难以置信)。
因此,也许这只是营销上正确的表达方式:“该 CPU 支持我们最新的 TSX 功能!”。
作为参考,我在假设“TSX-NI”指的是“TSX RTM”的情况下,对 Intel TSX 的两个部分进行了简要介绍。
完整的参考可以在英特尔手册 1 - 第 15 章.
HLE
HLE(硬件锁消除)部分向后兼容。
我们仍然可以测试它的可用性CPUID.07H.EBX.HLE[位 4]但它是通过改变前缀的语义来实现的repne
/repe
以获得说明。
此功能包含两个“新”前缀:xacquire
and xrelease
。
CPU 现在能够进入事务状态,其中每次读取都会添加到read-set事务的每个写入都会添加到写集交易的内容,并且不会被执行到内存中。
粒度是缓存行的大小。
如果一个线程从另一个线程的读集读取,或者写入另一个线程的读集或写集,则事务将中止。
CPU 将架构状态恢复为事务开始时的状态,并以非事务方式重新执行指令。
如果事务成功完成,所有写入的内存都会以原子方式一起提交。
交易由以下分隔xacquire
and xrelease
.
它们可以嵌套,但深度(超过该深度则中止事务)和可以消除的不同锁的数量(超过时 CPU 不会消除新锁但也不会中止事务)存在限制。
当嵌套事务中止时,CPU 重新开始执行最外层交易。
xacquire
(操作码F2
, 与...一样repne
)用在获取锁(即写入锁)的指令前面,并标记事务的开始。
这篇读的是not添加到写入集(或者当每个线程写入锁时不会发生并发,这将立即中止任何后续事务)。
相反,它被添加到读取集中。
xrelease
(操作码F3
) 用在释放锁的指令前面并标记事务的结束。
xrelease
必须与使用的同一把锁一起使用xacquire
与其配对并完成交易。
xacquire
只能与lock
这些说明的 d 版本:ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCHG8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, XCHG
.
xrelease
使用相同的说明加上MOV mem, reg
and MOV mem, imm
没有lock
字首。
新指令xtest
如果存在 HLE(或 RTM)则可用,它设置ZF处理器是not交易内。
RTM
RTM(受限事务内存)不向后兼容。
可以用以下方法进行测试CPUID.07H.EBX.RTM [位 11].
它引入了三个新指令:xbegin
, xend
and xabort
.
它们只是已经指定的通用事务执行功能的新接口。
The xbegin
必须提供指向后备代码路径的指针作为相对偏移量。
每当事务提交失败时,就会执行此代码。
在这种情况下eax
保存中止的原因。
xend
结束事务并指示 CPU 提交它。
xabort
让程序员使用自定义错误代码显式中止事务。
英特尔不保证处理器成功提交事务的能力。
虽然 HLE 有一组非常具体的条件,但 RTM 是一种“尽力而为”的功能 - 因此需要后备代码。
RTM 比 HLE 更底层,它允许程序员使用事务内存,无论是否使用锁。
混合 HLE 和 RTM
引用英特尔的话:
HLE 和 RTM 嵌套在一起时的行为 — HLE
RTM 内部或 HLE 内部的 RTM — 是特定于实现的。然而,在所有情况下,
实现将保持 HLE 和 RTM 语义。一个实现可以
选择在 RTM 区域内使用时忽略 HLE 提示,并且在 HLE 区域内使用 RTM 指令时可能会导致事务中止。在后一种情况下,
从事务性执行到非事务性执行的过渡无缝发生
因为处理器将重新执行 HLE 区域而不实际执行省略,并且
然后执行RTM指令。