问题标签 [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.
java - 如何在 JNI 中使用“不安全”?
假设我有一个 (base,offset) 元组指向的值。
例如
(可运行版本:https ://ideone.com/OasQrh )
我现在想执行
在C
.
为什么?因为不同的进程可能会移动数据并改变base
并off
指向新的位置。我想利用英特尔 RTM 来确保移动数据不会干扰对该字段的常规访问。
所以让我们创建一个新类
并更换
我们通过 javah 运行它以获取标头,将方法签名复制到 anRTM_transct.cpp
并获得类似
在交易主体中,我用什么来处理不安全的?
事务的“核心”是(应该)对应于 Accessor 过去所做的这三行:
)
理想情况下,当然,我想做类似的事情base[offset] = value
,但我非常怀疑这会奏效。
我在这里为 unsafe.setInt 放什么?
java - 程序正在丢失一个增量和两个“printf”
在下面的方法中,我们设置volatile int success = 0
然后输入一个
while(!success)
环形。
循环递增tries
,然后进入一个事务,在其中我们调用 javasun.misc.Unsafe.putLong
并继续循环,直到事务成功。
只要__TRX_DEBUG__
设置了调试标志,它就会在返回之前打印尝试次数。
由于该数字始终为零,因此我添加了一些 "Hello" printf
。
程序的输出是
你好0?!
putLong: (Lsun/misc/Unsafe;Ljava/lang/Class;Ljava/lang/Object;JJ)V 0 次尝试
我完全不明白为什么。
有趣的是,在文件的更深处,我有一个不同的方法,
本质上是相同的(除了它使用不同的方法来更改数据),但始终输出
putLong: (Ljava/lang/Object;Ljava/lang/String;J)V 1 次尝试
每个方法在每次运行时都被调用一次(来自 Java):
并且该程序正在运行而没有引发断言错误,这只会增加我的困惑。
因为如果assert(data.x == 4)
没有抛出错误,那么
在第一个 C 方法中必须成功。然而它成功了,没有tries
在它开始事务之前执行增量,也没有执行printf
我在它周围插入的两个 s。
更新
将printf
s 添加到第二种方法也不会打印它们。所以我想在事务中会抑制 IO,并且行为仅对tries
计数器不同。
为什么会发生这种情况,我该如何阻止它?
更新
删除了 hello printfs 并且不确定如何直接创建 asm 代码,所以我反汇编了生成的.so
文件。
放大重要的部分,
这是来自工作方法:
这是来自错误的方法:
我仍然看不到任何可以解释这种行为的相关差异。
完整的对象转储
perf - 对带有 TSX 中止的特殊线程使用“性能跟踪命令”
我尝试使用 'perf trace' 命令在特殊线程中跟踪 tsx abort。但是我在参数上遇到错误。我认为可能正确并尝试过的所有命令都在下面。
所有错误提示都是“解析要跟踪的目标时出现问题,请检查您的选项”。
有什么方法可以让性能跟踪按预期运行?
c - 为什么这些 rtm 交易表现得很奇怪?
我正在尝试使用 rtm 交易。我开始使用内在函数来实现一个简单的事务。但我发现以下行总是返回zero,而要成功开始事务,它应该是-1:
int status = _xbegin();
然后,我尝试将if..else放入循环中以达到此代码:
代码的输出是“000111”,我不明白为什么第一个交易失败但第二个交易没有。
此外,如果我在第一个事务中更改 printf 输入,则第二个事务根本不会启动,并且以下修改代码的输出将为"0000":
如果我也删除其中一条 printf 行,也会发生同样的情况。
我想了解为什么输出是这样的以及如何解决问题?请注意,我使用 immintrin.h 并使用“gcc -mrtm”进行编译。
x86 - 当线程可能切换内核时,如何正确使用 TSX-NI(HLE 和 RTM)?
似乎英特尔的事务同步扩展 (TSX-NI) 在每个 CPU 的基础上工作。
这适用于_InterlockedXxx_HLE{Acquire,Release}
Hardware Lock Elision 函数 (HLE) 以及_xbegin
/ _xend
/etc。受限事务内存 (RTM) 功能。
在多核系统上使用这些功能的“正确”方式是什么?
鉴于他们的正确性保证,我认为我只需要担心这里的性能。
那么,考虑到线程总是有可能突然切换内核并因此这些指令可能需要退回到较慢的代码路径,我应该如何构建和编写我的代码以使我的代码具有最佳性能?
例如,我应该尝试显式设置线程 CPU 关联性,还是这是不好的做法?
还有什么我应该担心的吗?
c - 启用/禁用硬件锁定消除
我正在使用 glibc 2.24 版本。它包含用于 pthread_mutex_lock 实现的锁省略路径,并带有事务同步扩展,例如 _xbegin() 和 _xend()。硬件应该支持锁定省略,因为我认为hle CPU 标志用于硬件锁定省略。我使用的处理器是带有 Skylake 架构的 Intel(R) Xeon(R) Gold 6130。
首先,我想禁用锁定省略,但是当我运行使用pthread_mutex_lock的程序时,使用perf stat -T来监视事务周期,我得到了 0。我认为这意味着 pthread_mutex_lock 根本不使用事务路径。谷歌搜索后,我发现可能需要先使用export GLIBC_TUNABLES=glibc.elision.enable=1来启用锁定省略,但在这一步之后,我仍然看不到任何带有 perf 的事务。
另一方面,当我包含 _xbegin(); 和 _xend(); 直接在此过程中,我使用 perf stat -T 获得了一些事务周期,这应该意味着我正在寻找具有 perf 的正确计数器,希望如此。
因此,任何关于如何启用锁定省略的建议都会有所帮助。还是我检查不正确?
TSX 的更新我在 main 函数中使用这两个指令,就像这样:
我不确定它需要哪个库,我已经包含了几十个。对于编译,我使用以下标志: -O3 -march=native -lpthread 与此示例相关。
对于锁,我有互斥锁:
也许为了省略我应该以不同的方式初始化它?
webassembly - 将 TSX 与 WebAssembly 一起使用
可以将 TSX 事务同步扩展与 WebAssembly 一起使用吗?我没有发现任何关于在 WebAssembly 中使用这些扩展的信息。谢谢!
assembly - 汇编程序 xbegin 引发非法指令
我的汇编代码在调用 xbegin 时引发非法指令。
有什么问题吗?
这是我的代码。
主程序
rtm.S
debugging - 是否可以调试 Intel TSX?
我想利用 Intel TSX 编写无锁代码。
但是,由于某些原因,我在 TSX 执行 TSX 中的一条指令中止。
我想知道哪条指令产生了故障并使 TSX 中止。
有没有办法知道哪条指令产生了错误?
我的第一次尝试是在 TSX 区域中执行每条指令后递增全局计数器。但是,当故障发生时,对计数器的更新也会回滚,因为它会回滚 TSX 区域中的每次写入。
调试 TSX 执行有什么技巧吗?
security - 由于 Spectre 缓解,硬件锁消除是否永远消失了?
由于 Spectre 缓解而对所有当前 CPU 禁用硬件锁定消除是否正确,并且任何使用 HLE 内在函数/指令的互斥锁的尝试都会导致通常的互斥锁?
这是否有可能在未来不会有任何像 HLE 互斥锁这样的东西来避免像 Spectre 这样的漏洞?