问题标签 [intel-tsx]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
647 浏览

c++ - 中止的 xbegin 事务是否会恢复 xbegin 开始时存在的堆栈上下文?

我对在静态汇编程序库中的 XBEGIN() 和 XEND() 函数中封装事务性 xbegin 和 xend 感兴趣。但是,我不清楚堆栈如何(或是否)恢复到原始的 xbegin 调用状态,因为 xabort 源自其他堆栈级别(更高或更低)。换句话说,动态堆栈上下文(包括中断效果)是否作为事务的另一部分进行管理和回滚?

对于不支持或不支持 _xbegin( ) 和 _xend( ) 内部函数的 VC++ 2010 构建需要这种汇编程序方法,并且 x64 构建不能使用 _asm { } 内联。

0 投票
2 回答
373 浏览

c++ - 为什么 8 个线程比 2 个线程慢?

我必须先为我糟糕的英语道歉。我现在正在学习硬件事务内存,我正在使用 TBB 中的 spin_rw_mutex.h 在 C++ 中实现事务块。speculative_spin_rw_mutex 是 spin_rw_mutex 中的一个类。h 是一个互斥体,它已经实现了 intel TSX 的 RTM 接口。

我用来测试 RTM 的例子很简单。我创建了 Account 类,并随机将资金从一个帐户转移到另一个帐户。所有帐户都在一个帐户数组中,大小为100。随机函数在boost中。(我认为STL具有相同的随机函数)。传递函数受 speculative_spin_rw_mutex 保护。我使用 tbb::parallel_for 和 tbb::task_scheduler_init 来控制并发。所有传输方法都在 paraller_for 的 lambda 中调用。总传输次数为 100 万次。奇怪的是,当 task_scheduler_init 设置为 2 时,程序是最快的(8 秒)。事实上,我的 CPU 是 i7 6700k,它有 8 个线程。在 8 到 50,000 的范围内,程序的性能几乎没有变化(11 到 12 秒)。当我将 task_scheduler_init 增加到 100,000 时,运行时间将增加到大约 18 秒。我尝试使用分析器分析程序,发现热点函数是互斥锁。但是我认为事务回滚率并没有那么高。我不知道为什么程序这么慢。

有人说虚假共享会降低性能,结果我尝试使用

std::vector> cache_aligned_accounts(AccountsSIZE,Account(1000));

替换原始数组

账户* 账户[AccountsSIZE];

避免虚假分享。似乎没有任何改变;这是我的新代码。

0 投票
1 回答
1678 浏览

c++ - 硬件事务内存:_xbegin() 返回 0

通过 gcc 文档:x86-transactional-memory-intrinsics.html,当事务失败/中止时,_xbegin()应该返回中止状态。但是,我发现它有时会返回 0。而且频率非常高。**_xbegin()**会在什么情况下返回0?

检查手册后,我发现很多情况都可能导致此结果。例如,CPUID、SYSTEMCALL、CFLUSH.etc。但是,我认为我的代码没有触发其中任何一个。

这是我的代码:模拟一家小银行,一个随机账户将 1 美元转移到另一个账户。

补充:

  1. 所有帐户都是 64 位对齐的。我打印了 bank->accounts[0], bank->accounts 1地址。0xf41080,0xf410c0。</li>
  2. 使用 -O0asm volatile("":::"memory");因此没有指令重新排序问题。
  3. 中止率随时间增加。这是结果

    /li>
  4. 即使 n_threads 为 1,结果也是一样的。

  5. 如果我按如下方式在回退后添加粗锁,结果似乎是正确的。

    /li>
0 投票
1 回答
2157 浏览

performance - TSX 相关的 Skylake 勘误表 SKL-105 的状态如何?

众所周知,英特尔不得不通过微码更新禁用 Haswell 系列处理器中的 TSX。这是由于 TSX 实现中的一个错误造成的,如果使用这些指令,可能会产生错误的结果。

似乎不太为人所知的是,在较新的架构 Skylake 上显然还有一个影响 TSX 的勘误表。特别是这里提到的勘误表“SKL-105”:

http://www.intel.com/content/www/us/en/processors/core/desktop-6th-gen-core-family-spec-update.html

它特别指出使用 TSX 会导致不可预测的系统行为。但是,它还指出,BIOS 可以进行修复。然而,问题是这个修复需要什么。它是否像 Haswell 微码“修复”一样完全禁用 TSX?谷歌搜索“SKL105”没有给出任何结果,所以似乎社区通常不知道它?

一些用户注意到 TSX 功能被“悄悄地”禁用(但似乎没有意识到上面的勘误表):

https://www.reddit.com/r/hardware/comments/44k218/intel_disables_tsx_transactional_memory_again_in/

如果只有 CPU 的某些变体受到影响,这很奇怪,因为人们会假设它们都将共享相同的微架构,因此同样会受到此错误的影响。

顺便说一下,这种微码“修复”可以运行的另一种方式,并且可能更加隐蔽:我想可以进行微码更新,但仍然会暴露 TSX 的存在(看起来该功能仍然启用)但是会用“虚拟实现”覆盖新 TSX 指令的实现,这些虚拟实现实际上永远不会忽略锁,基本上只是以老式方式执行代码,从而避免了错误,但也放弃了 TSX 可以提供的性能改进。确定是否发生这种情况的唯一方法是通过性能测量。

有人有更多关于 Skylake 中 TSX 状态的信息吗?无论如何,奇怪的是没有更多的信息被发布,人们不得不猜测什么受到影响,什么没有受到影响。事实上,如果该功能可以安全使用。

我有一个 6700K 并且该功能仍然存在。但这也取决于 BIOS 制造商是否接受了微码更新,而且我还没有实际测量过性能,所以我不能排除它仍然可能被禁用。上一段。

0 投票
2 回答
2664 浏览

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

我在英特尔的页面上找到

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

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

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

0 投票
0 回答
130 浏览

c++ - HTM 中的 _xabort(status) 是如何工作的?

_xabort(status)在代码中使用了函数,以便释放缓存中的缓冲区。我检查交易是否成功,如果交易成功,我使用_xend(),否则我使用_xabort(status)。我可以_xabort(status)在这种情况下使用吗?

我可以这样使用_xabort(status)吗?这是单线程情况,我transaction_func()自己检查,然后调用_xabort(status). 我认为这是关于使用的问题_xabort(status),我不知道它是否可以保留在(status == _XBEGIN_STARTED)区域中。在我看来,如果 status 等于_XBEGIN_STARTED,它不会中止交易,所以这段代码不对吗?

如果transction_func()返回false,printfstatus这段代码中,为什么状态值为'0xff000001'?

0 投票
1 回答
1144 浏览

assembly - 汇编 x86 REP、REPZ、REPNZ、XACQUIRE 和 XRELEASE 指令

正如我所注意到的,0xF3二进制前缀被用作:
1)重复并减少ecx直到在, , ,指令中ecx等于并称为 2)重复并减少直到等于或在,指令中设置并称为或0INSOUTSMOVSLODSSTOSrep
ecxecx0ZFCMPSSCASrepzrepe

0xF3二进制前缀用作:
1) 重复和减少,ecx直到ecx等于0或未ZFCMPS,SCAS指令中设置并调用repnzrepne

最近注意到XACQUIRE/XRELEASE前缀也具有相同的二进制值(0xF2, 0xF3

那么XACQUIRE/XRELEASE正在做什么(我读到了一些关于锁定内存地址的内容,但它们不是工作线lock(我相信))?

还有0xF3 mov byte ptr [ecx],0x0会怎么做?(将在ZFset\not set 处停止,或者它将仅在ecx等于处停止0
0xF2 mov byte ptr [ecx],0x0会做什么?

0 投票
1 回答
194 浏览

debugging - TSX:获取导致中止的地址

另一个问题来看,显然英特尔 TSX 读/写集是隐藏的。这是可以理解的,特别是因为它允许他们搞砸设计和实现,并可能尝试诸如布隆过滤器之类的东西。

但是当一个事务中止时,最好看看是什么地址或缓存行导致它(当这样的事情是中止的原因时)。地址是否暴露在任何地方?

0 投票
0 回答
78 浏览

c - 当英特尔 HLE 无法提交时会发生什么?

来自英特尔手册

当 [...] 时,处理器尝试提交 HLE 执行。

如果执行不能以原子方式提交,则执行转换到非事务性执行而不会省略,就好像第一条指令没有XAQUIRE前缀一样。

我读对了吗?基本上“尝试以交易方式进行,但如果你不能,我不在乎你是否这样做”?

如果是这样,HLE如果它可能随机决定表现得好像它不存在,那么拥有扩展有什么意义呢?

0 投票
0 回答
5836 浏览

c - 如何检查 TSX 支持?

我目前的尝试:

我有一个Intel® Core™ i7-7600U(下面是 cpuinfo),正如您从 ark 中看到的,它应该支持 TSX-NI。

不过,上面的检查将返回

此 CPU 不支持 RTM。

has_tsx来自tsx-tools的实现同意:

RTM:没有

HLE:没有

然而与此同时,我可以很好地执行这个片段......

我的理解是这些 asm 指令“在不支持 RTM 的处理器上使用时会产生 #UD 异常”,或者至少这是英特尔手册对此事所说的(第 387 页)。

我也检查了 asm 代码,这些说明仍然存在(有关 .s 文件的内容,请参见下文)。

那么既然这些指令似乎被执行了,那么这些检查是不是完全错误的呢?

如果是这样,您将如何正确测试 RTM 支持?

片段的 ASM 代码

CPU信息