gpt4 book ai didi

c - 启用/禁用硬件锁省略

转载 作者:太空狗 更新时间:2023-10-29 17:24:44 25 4
gpt4 key购买 nike

我使用的是 glibc 2.24 版本。它包含用于 pthread_mutex_lock 实现的锁省略路径,其中包含事务同步扩展,例如 _xbegin() 和 _xend()。硬件应该支持锁省略,因为我认为 hle CPU 标志用于硬件锁省略。我使用的处理器是采用 Skylake 架构的 Intel(R) Xeon(R) 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();

我不确定它需要哪个库,我已经包含了其中的数十个。对于编译,我使用以下标志:-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 的早期版本中,在 2.27 之前,只能使用名为 enable-lock-elision 的编译时标志来控制对 TSX 的支持。我不知道哪些版本启用或禁用了 enable-lock-elision,但这就是它过去的工作方式1。因此,如果您想启用/禁用 TSX,则必须自己编译 glibc 并相应地使用该标志。以 glibc 2.27 开头, 该编译时选项被删除并替换为名为 glibc.elision.enable 的运行时选项。也就是说,glibc 始终在编译时支持 TSX,但只有在运行应用程序之前将环境变量 glibc.elision.enable 设置为 1 时才会使用 TSX(例如,通过执行 export GLIBC_TUNABLES=glibc.elision.enable=1).

在 2.27 之前,glibc.elision.enable 不存在,因此无效。是否使用 TSX 取决于编译时标志 enable-lock-elision。您使用的是 2.24。因此,最简单的解决方案是迁移到 2.27 或更新的版本。

请注意,根据各自的规范更新,所有当前支持 TSX 的英特尔处理器似乎都存在“使用英特尔 TSX 指令可能导致不可预测的系统行为”的相同错误。对于某些处理器,英特尔发布了微代码更新以实际禁用 TSX。但是,您的处理器上的实现将继续启用。


脚注:

(1) 根据这个bug report ,从 2.23 开始,glibc 中禁用了锁省略。我认为这是通过在构建 glibc 时禁用 enable-lock-elision 来完成的,但我没有通过查看代码来验证这一点。但这与您观察到的在 2.24 中被禁用是一致的。

关于c - 启用/禁用硬件锁省略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57080062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com