草庐IT

c++ - 英特尔®事务同步扩展新指令(TSX-NI)与英特尔TSX有区别吗?

coder 2024-02-02 原文

我在英特尔页面上找到了

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



该处理器支持TSX-NI技术,但我在Google上找不到有关它的任何信息。是否与Intel TSX相同?如果有区别,那么我该如何使用它。

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

最佳答案

似乎只是一种营销手段。

在Internet上,Intel手册或Intel ISA扩展手册中都找不到“TSX-NI”的引用。

引用英特尔[1]

Intel Transactional Synchronization Extensions (Intel TSX) comes in two flavours: HLE and RTM.



由于它们的实现,这两个方面是分离的(可以彼此独立地支持),并且只有RTM引入了新的指令。
因此,他们可能指的是RTM。

我相信HLE是首先引入的,应该有支持HLE但不支持RTM的处理器(相反,虽然可能,但似乎不太现实)。

因此,也许这只是市场上正确的说法:“此CPU支持我们最新的TSX功能!”。

作为引用,我在假定“TSX-NI”指的是“TSX RTM”的前提下,简要介绍了英特尔TSX的两个部分。
完整的引用资料可以在英特尔手册1-第15章中找到。

LE

HLE(硬件锁定清除)部件向后兼容。
我们仍然可以使用CPUID.07H.EBX.HLE [bit 4]来测试其可用性,但是它是通过更改指令的前缀repne/repe的语义来实现的。

此功能包含两个"new"前缀:xacquirexrelease
现在,CPU能够进入事务状态,其中每个读取都添加到事务的读取集中,而每个写入都添加到事务的写入集中,并且不执行到内存中。
粒度是高速缓存行的大小。

如果线程从另一个线程的读取集读取或写入读取集或写入集,则事务将中止。
CPU恢复事务开始时的架构状态,然后以非事务方式重新执行指令。
如果事务成功完成,则所有已写入的内存都将以原子方式完全提交。

事务由xacquirexrelease分隔。
它们可以嵌套,但是在深度上(事务被中止超过)和可以消除的不同锁的数量有限制(超出了CPU不会取消新锁但不会中止事务的限制)。
当嵌套事务中止时,CPU重新开始执行最外面的事务。
xacquire(操作码F2,与repne相同)用于将获取锁(即写入锁)并标记事务开始的指令的前面。
该读操作不会添加到写集中(或者因为每个线程向锁写入操作都不会发生并发操作,这会立即中止任何后续事务)。
而是将其添加到读取集。
xrelease(操作码F3)用于将释放锁并标记事务结束的指令之前。
必须将xreleasexacquire一起使用,以与它配对并完成交易。
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前缀的MOV mem, immlock

如果存在HLE(或RTM),则新指令xtest可用,它设置ZF为处理器不在事务内。

RTM

RTM(受限事务内存)不向后兼容。
可以使用CPUID.07H.EBX.RTM [bit 11]进行测试。

它引入了三个新指令:xbeginxendxabort
它们只是已指定的通用事务执行功能的新接口(interface)。
xbegin必须提供一个指向后备代码路径的指针作为相对偏移量。
每当事务提交失败时,就会执行此代码。
在这种情况下,eax保留了中止的原因。xend结束事务并指示CPU提交它。xabort使程序员可以使用自定义错误代码显式中止事务。

英特尔不保证处理器成功提交事务的能力。
尽管HLE具有一组非常特定的条件,但是RTM是一种“尽力而为”的功能-因此需要备用代码。

RTM比HLE更底层,它允许程序员使用事务内存,无论是否使用锁。

混合HLE和RTM

引用英特尔:

The behaviour when HLE and RTM are nested together—HLE inside RTM or RTM inside HLE—is implementation specific. However, in all cases, the implementation will maintain HLE and RTM semantics. An implementation may choose to ignore HLE hints when used inside RTM regions, and may cause a transactional abort when RTM instructions are used inside HLE regions. In the latter case, the transition from transactional to non-transactional execution occurs seamlessly since the processor will re-execute the HLE region without actually doing elision, and then execute the RTM instructions.

关于c++ - 英特尔®事务同步扩展新指令(TSX-NI)与英特尔TSX有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42507787/

有关c++ - 英特尔®事务同步扩展新指令(TSX-NI)与英特尔TSX有区别吗?的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  3. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  4. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  5. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  6. ruby - 分布式事务和队列,ruby,erlang,scala - 2

    我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

  7. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  8. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  9. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

  10. ruby - 这两段代码有什么区别? - 2

    打印1:defsum(i)i=i+[2]end$x=[1]sum($x)print$x打印12:defsum(i)i.push(2)end$x=[1]sum($x)print$x后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类Array的任何方法(不仅是push)都会发生这种情况吗? 最佳答案 变量范围在这里无关紧要。在第一段代码中,您仅使用赋值运算符=为变量i赋值,而在第二段代码中,您正在修改$x(也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性

随机推荐