英特尔® 事务同步扩展新指令 (TSX-NI) 与英特尔 TSX 有何不同?

2024-04-26

我在Intel的页面上找到了

https://ark.intel.com/products/97123/Intel-Core-i5-7500-Processor-6M-Cache-up-to-3_80-GHz https://ark.intel.com/products/97123/Intel-Core-i5-7500-Processor-6M-Cache-up-to-3_80-GHz

该处理器支持 TSX-NI 技术,但我在 google 上找不到任何有关它的信息。和英特尔TSX一样吗?如果有区别,那么我该如何使用它。

对不起,我的英语不好! :)


这似乎只是一种营销点缀。

我在互联网、英特尔手册和英特尔 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指令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

英特尔® 事务同步扩展新指令 (TSX-NI) 与英特尔 TSX 有何不同? 的相关文章

随机推荐

  • 有没有办法重命名已部署的 ClickOnce 应用程序?

    我的公司有一个 ClickOnce 应用程序 我们的客户已经使用该应用程序大约一年了 我们正在进行品牌重塑 并希望更改应用程序的名称 但是 仅更改 Visual Studio 中的所有正常名称选项 然后构建新的部署显然会更改现有应用程序正在
  • 在 Azure Pipelines 构建中使用 Azure Repos git 模块源进行身份验证

    我目前正在为 Azure DevOps 创建一个管道 以验证 Terraform 配置并将其应用到不同的订阅 我的 terraform 配置使用模块 这些模块 托管 在与 terraform 配置相同的 Azure DevOps 项目中的其
  • RGBA格式HEX转换成RGB格式HEX? PHP

    我想在 RGBA 格式的十六进制颜色之间来回转换 例如0xFF0000FF 和 RGB 格式的十六进制颜色 例如0xFF0000 在 PHP 中 我怎样才能做到这一点 这两个函数将满足您的需要 function rgbaToRgb rgba
  • MongoError:池正在耗尽,在集成测试中使用 MongoMemoryServer 时禁止新操作

    我在用着MongoMemoryServer编写集成测试 我有两个集成测试文件 当我运行 IT 测试时 我看到以下内容 我不明白为什么 我正在使用 jestjs 测试框架 当我有两个 IT 测试文件时 我看到以下错误 MongoError p
  • Windows 相当于 Mac OS X“打开”命令

    刘畅在这里问了一个与此非常相似的问题 Linux 相当于 Mac OS X 打开 命令 https stackoverflow com questions 264395 linux equivalent of the mac os x op
  • C#中如何终止线程?

    我想尝试使用 C 进行线程处理 我了解一些有关 C 线程处理的知识 所以我只是想问我是否想终止一个线程 我应该这样做smt Abort 或者函数结束后它会 自杀 另外 有没有类似的东西pthread exit 在 C 中 在 C 中 Thr
  • 如何在 C++ MPI 代码中放置检查点?

    根据容错系统 https www elsevier com books fault tolerant systems koren 978 0 12 088525 1 第 6 章 由 Israel Koren 和 C Mani Krishna
  • String类中的线程安全

    使用局部变量构建字符串是否是线程安全的String像下面的方法中的类 假设从多个线程调用以下方法 public static string WriteResult int value string name return string Fo
  • 如何使用 React-Native-fs 读取 JSON 文件

    我有一个包含内容的 asset json 文件 需要在反应本机应用程序中读取它 我已经认为它必须手动复制到本机实现 并且我可以验证文件是否存在 并且可读 rw r r 由于它在那里并且我正在使用承诺来获取它 请告诉我输出何时仍然 40 0
  • 如何在调整窗口大小时使 Tkinter 消息展开?

    我正在尝试获取 tkinter 消息小部件 以便在调整窗口大小时使单词移动 现在 窗口是一个小块 文本行是一个丑陋的块 我怎样才能让它扩大 这是我的代码 root Tk Message text This is a Tkinter mess
  • 创建自定义 HTML 标签安全吗?

    我正在阅读一种可以创建自定义 HTML 标签的技术 如下所示 鉴于存在多种浏览器和浏览器版本 我想知道 创建自定义标签安全吗 如果不是 正确的解决方法是什么 我只是好奇 真的 不 不推荐这样做 除非你有某种填充材料 大多数浏览器不支持它 请
  • 如何使用 core.async 在 Clojure 中写入日志文件?

    我想使用 core async 作为写入文件的记录器 因此我创建了一个 test txt 文件 将其粘贴在我的资源文件夹中并编写了以下代码 use clojure java io use clojure core async def pri
  • 在仍然有许多活动事务的情况下执行 pg_dump

    作为主题 当数据库中仍然有许多活动事务时 备份文件会发生什么情况 它导出实时还是仅导出部分备份 提前致谢 pg dump 在可序列化事务中运行 因此它会看到数据库的一致快照 包括系统目录 但是 如果有人在转储启动时执行 DDL 更改 则可能
  • 添加两个 2D NumPy 数组,忽略其中的 NaN

    将 numpy nan 作为缺失值添加 2 个 numpy 数组 a 和 b 均为 2D 的正确方法是什么 a b or numpy ma sum a b 由于输入是二维数组 因此您可以将它们沿第三轴堆叠np dstack http doc
  • 在 Mac OS X 上使用 pip 安装 pyopencv

    我正在尝试在 OS X Mountain Lion 中使用 pip 安装 pyopencv 但导入 setuptools 失败 以下是我的作品 setuptools中的 库 是什么 我以前没见过 我已经通过 homebrew 和其他东西安装
  • 更改 Oracle 11g 或 12c 中的表/列/索引名称大小

    我使用oracle 11g并且需要名称大小大于30个字符 我知道11g中的最大大小是30个字符 我可以更改这个最大尺寸吗 Oracle 12c 中表 列 索引名称的最大大小是多少 数据库对象名称位于11g https docs oracle
  • RDS不支持创建以下组合的数据库实例

    我正在尝试弄清楚如何创建一个简单的数据库实例 到目前为止我只有一个DBSubnetGroup and DBInstance 此时 根据我尝试使用模板 在 Designer 中创建 创建堆栈时遇到的错误 我已经弄清楚了一些事情 我现在遇到了一
  • 在Python中写入文件之前如何确保文件存在或可以创建?

    我正在编写一个函数 我希望它能够touch一个文件 以便我可以写入该文件 如果该文件不存在 我会收到错误消息 我怎么能这么说呢 只需打开要写入的文件 如果该文件不存在 则会创建该文件 假设您具有写入该位置的适当权限 f open some
  • 使用 css 和 javascript 在 div 背景中创建透明窗口

    我正在尝试在网页中实现效果 网页必须完全被带有透明窗口的背景覆盖 该窗口基本上会突出显示页面的某些页面以吸引用户的注意力 窗口的大小事先是未知的 效果必须在前端实现 所以我可以自由地使用html css和js 我不知道如何仅使用 css 来
  • 英特尔® 事务同步扩展新指令 (TSX-NI) 与英特尔 TSX 有何不同?

    我在Intel的页面上找到了 https ark intel com products 97123 Intel Core i5 7500 Processor 6M Cache up to 3 80 GHz https ark intel c