这似乎只是一种营销点缀。
我在 Internet 上、英特尔手册和英特尔 ISA 扩展手册中都没有找到对“TSX-NI”的引用。
引用英特尔 [1]
英特尔事务同步扩展(英特尔 TSX)有两种风格:HLE 和 RTM。
由于它们的实现,这两个方面是解耦的(可以单独支持一个),只有 RTM 引入了新的指令。
所以他们可能指的是RTM。
我相信首先引入了 HLE,并且应该有支持 HLE 但不支持 RTM 的处理器(反过来,虽然可能,但似乎不可信)。
所以,也许,这只是营销正确的说法:“此 CPU 支持我们最新的 TSX 功能!”。
作为参考,我在假设“TSX-NI”指的是“TSX RTM”的情况下,对Intel TSX的两个部分进行了简要介绍。
完整的参考资料可以在 英特尔手册 1 - 第 15 章中找到。
HLE
HLE(硬件锁省略)部分向后兼容。
我们仍然可以使用 CPUID.07H.EBX.HLE[bit 4] 测试它的可用性,但它是通过更改指令前缀 repne/repe 的语义来实现的。
此功能包含两个“新”前缀:xacquire 和 xrelease。
CPU 现在能够进入事务状态,每次读取都添加到事务的 read-set 中,并且每次写入都添加到事务的 write-set 中并且不会执行到内存中。
粒度是高速缓存行的大小。
如果一个线程从另一个线程的读集读取,或写入读集或写集,则事务被中止。
CPU 将架构状态恢复为事务开始时的状态,并以非事务方式重新执行指令。
如果事务成功完成,所有写入的内存都会以原子方式完全提交。
事务由xacquire 和xrelease 分隔。
它们可以嵌套,但对深度(超过该深度的事务中止)和可以忽略的不同锁的数量有限制(超过 CPU 不会忽略新锁但不会中止事务)。
当嵌套事务中止时,CPU 重新开始执行 outermost 事务。
xacquire(操作码F2,与repne相同)用于获取锁(即写入锁)的指令前面并标记事务的开始。
此读取不添加到写入集(或者在每个线程都写入锁时不会发生并发,这将立即中止任何后续事务)。
它被添加到读取集中。
xrelease(操作码F3)用于将释放锁并标记事务结束的指令前面。
xrelease必须用于与xacquire相同的锁与之配对并完成交易。
xacquire 只能与以下指令的 lockd 版本一起使用:ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCHG8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, XCHG。
xrelease 与相同的指令加上 MOV mem, reg 和 MOV mem, imm 不带 lock 前缀。
如果 HLE(或 RTM)存在,则新指令 xtest 可用,它设置 ZF 是处理器 不是 在事务中。
RTM
RTM(受限事务内存)不向后兼容。
可以使用 CPUID.07H.EBX.RTM [bit 11] 进行测试。
它引入了三个新指令:xbegin、xend 和 xabort。
它们只是已经指定的通用事务执行功能的新接口。
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 指令。