Ana*_*ani 6 c x86 glibc intel tsx
我正在使用glibc 2.24版本。它具有通过事务同步扩展(例如_xbegin()和_xend())用于pthread_mutex_lock实现的锁省略路径。我认为硬件应该支持锁定删除,因为hle CPU标志用于硬件锁定删除。我正在使用的处理器是采用Skylake架构的Intel®Xeon®Gold 6130。
首先,我想禁用Lock Elision,但是当我运行使用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的更新我在主要功能中使用了这两条指令,就像这样:
_xbegin();
_xend();
Run Code Online (Sandbox Code Playgroud)
我不确定它需要哪个库,我已经包含了数十个。对于编译,我使用以下标志:-O3 -march = native -lpthread与该示例相关。
对于锁,我有互斥锁:
pthread_mutex_t * mutex;
mutex = (pthread_mutex_t *) malloc(10 * sizeof(pthread_mutex_t));
for(int k=0; k<10; k++){
pthread_mutex_init(&mutex[k], NULL);
}
Run Code Online (Sandbox Code Playgroud)
也许为了省略,我应该以不同的方式初始化它?
在 glibc 的早期版本中,即 2.27 之前,只能使用名为 的编译时标志来控制对 TSX 的支持enable-lock-elision。我不知道哪些版本已enable-lock-elision启用或禁用,但这就是它过去的工作方式1。因此,如果您想启用/禁用 TSX,您必须自己编译 glibc 并相应地使用该标志。从glibc 2.27开始,该编译时选项被删除并被名为 的运行时选项取代glibc.elision.enable。也就是说,glibc 始终在编译时支持 TSX,但只有在glibc.elision.enable运行应用程序之前将环境变量设置为 1(例如,通过执行export GLIBC_TUNABLES=glibc.elision.enable=1),才会使用 TSX。
2.27之前,glibc.elision.enable不存在,所以没有效果。是否使用 TSX 取决于编译时标志enable-lock-elision。您使用的是 2.24。因此,最简单的解决方案是迁移到 2.27 或更新的版本。
请注意,根据各自的规范更新,当前所有支持 TSX 的英特尔处理器似乎都存在相同的错误,即“使用英特尔 TSX 指令可能会导致不可预测的系统行为”。对于某些处理器,英特尔已发布微码更新以实际禁用 TSX。但是,您的处理器上的实施将继续启用。
脚注:
(1) 根据此错误报告,从 2.23 开始,glibc 中已禁用锁省略。我认为这是通过在构建 glibc 时禁用来完成的enable-lock-elision,但我没有通过查看代码来验证这一点。但这与您观察到的它在 2.24 中被禁用的情况一致。