我使用的是 glibc 2.24 版本。它包含用于使用事务同步扩展(例如 _xbegin() 和 _xend())实现 pthread_mutex_lock 的锁省略路径。硬件应该支持锁省略hle我认为CPU标志是为了硬件锁消除。我使用的处理器是采用 Skylake 架构的 Intel(R) Xeon(R) Gold 6130。
首先,我想禁用锁定省略,但是当我运行使用的程序时pthread_互斥锁, with 性能统计-T为了监视事务周期,我得到了 0。我认为这意味着 pthread_mutex_lock 根本不使用事务路径。谷歌搜索后我发现可能需要使用导出 GLIBC_TUNABLES=glibc.elision.enable=1首先,启用锁省略,但在此步骤之后我仍然没有看到任何具有 perf 的事务。
另一方面,当我包含 _xbegin(); 时和 _xend();直接在此过程中,我使用 perf stat -T 获得了一些事务周期,这应该意味着我希望使用 perf 寻找正确的计数器。
因此,任何有关如何启用锁省略的建议都会有所帮助。还是我检查错了?
Update对于 TSX,我在主函数中使用这两条指令,就像这样:
_xbegin();
_xend();
我不确定它需要哪个库,我已经包含了数十个库。对于编译,我使用以下标志:-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);
}
也许为了省略我应该以不同的方式初始化它?
In earlier versions of glibc, before 2.27, support for TSX could only be controlled using a compile-time flag called enable-lock-elision
. I don't know which versions have enable-lock-elision
enabled or disabled, but that's how it used to work1. So if you wanted to enable/dsiable TSX, you'll have to compile glibc yourself and use that flag accordingly. Starting with glibc 2.27 https://github.com/bminor/glibc/commit/07ed18d26a342741cb25a4739158c65ed9dd4d09, that compile-time option was removed and replaced by a run-time option called glibc.elision.enable
. That is, glibc is always compiled with support for TSX, but TSX will only be used if the environment variable glibc.elision.enable
is set to 1 before running the application (e.g., by executing export GLIBC_TUNABLES=glibc.elision.enable=1
).
2.27之前,glibc.elision.enable
不存在,因此没有效果。是否使用 TSX 取决于编译时标志enable-lock-elision
。您使用的是 2.24。因此,最简单的解决方案是迁移到 2.27 或更新的版本。
请注意,根据各自的规范更新,当前所有支持 TSX 的英特尔处理器似乎都存在相同的错误,即“使用英特尔 TSX 指令可能会导致不可预测的系统行为”。对于某些处理器,英特尔已发布微码更新以实际禁用 TSX。但是,您的处理器上的实施将继续启用。
脚注:
(一)根据本错误报告 https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1642390,从 2.23 开始,glibc 中已禁用锁省略。我认为这是通过禁用来完成的enable-lock-elision
在构建 glibc 时,但我还没有通过查看代码来验证这一点。但这与您观察到的它在 2.24 中被禁用的情况一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)