【发布时间】:2019-11-26 12:52:04
【问题描述】:
我使用的是 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 来启用锁定省略,但在这一步之后我仍然看不到任何具有性能的事务。
另一方面,当我包含 _xbegin();和 _xend();直接在此过程中,我使用 perf stat -T 获得了一些事务周期,这应该意味着我正在寻找具有 perf 的正确计数器,希望如此。
因此,任何有关如何启用锁定省略的建议都会有所帮助。还是我检查不正确?
更新 for 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);
}
也许为了省略我应该以不同的方式初始化它?
【问题讨论】:
-
我没有足够新的 GLIBC 来测试,但 this link 包含手册的补丁。它包含互斥体类型的属性位,以使其始终(或从不)使用省略。它还说没有种类集的互斥锁使用 PTHREAD_MUTEX envar。虽然它很旧。
-
能否请您发布一个最小示例并向我们展示您如何编译和链接它?
-
@FlorianWeimer 嗨,我更新了帖子,这是你的意思吗?
-
如果同时支持 hle 和 rtm 标志,那么 TSX-NI 应该可以在您的处理器上运行。我认为问题出在您的 glibc 版本上。
glibc.elision.enable对早于 2.27 的版本没有影响。如果我没记错的话,旧版本的 glibc 必须使用--enable-lock-elision=yes编译才能使锁定省略工作。 -
澄清一下,2.27 之前的 glibc 必须用
--enable-lock-elision=yes编译,不是你的代码。相反,从 glibc 2.27 开始,您的代码必须使用export GLIBC_TUNABLES=glibc.elision.enable=1运行。
标签: c x86 intel glibc intel-tsx