【问题标题】:Enable/Disable Hardware Lock Elision启用/禁用硬件锁定消除
【发布时间】: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


【解决方案1】:

在 2.27 之前的 glibc 早期版本中,只能使用名为 enable-lock-elision 的编译时标志来控制对 TSX 的支持。我不知道哪些版本启用或禁用了enable-lock-elision,但这就是它过去的工作方式1。因此,如果您想启用/dsiable 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 中被禁用是一致的。

【讨论】:

  • 如果这回答了您的问题,您可以/应该通过点击投票按钮下方的复选标记来接受答案。
  • 好的,但这实际上是你的答案:)
  • 没关系,你可以继续接受答案。如果您不介意,我已经添加了更多信息,只是为了让答案更完整。
  • @HadiBrais 是的,这是一个更全面的答案。非常感谢。
  • 此错误报告,”请提及这不是 glibc 中的错误
【解决方案2】:

为了补充来自 Ana 的答案,我认为 glibc 可能在操作系统上具有自定义变量。至少在 RHEL 上,“RHEL_GLIBC_TUNABLES="glibc.elision.enable=1" 已在 glibc 2.17 中引入。可能 OP 的发行版也有类似的环境变量用于在运行时启用 HLE。

%define glibcsrcdir glibc-2.17-c758a686
%define glibcversion 2.17
%define glibcrelease 317%{?dist}
...
# If the architecture has elision support in glibc then it should be listed
# here to enable elision for default pthread mutexes and rwlocks. The elision
# is not enabled automatically and each process has to opt-in to elision via
# the environment variable RHEL_GLIBC_TUNABLES by setting it to enabled e.g.
# RHEL_GLIBC_TUNABLES="glibc.elision.enable=1".
%define elisionarches x86_64 %{power64}
...
%ifarch %{elisionarches}
    --enable-lock-elision=yes \
%endif
...

根据用于 Fedora 24 的 glibc 2.23.1 的 glibc.spec,除 s390/s390x 系统外,自 glibc 2.20 以来,省略已在编译时禁用。 glibc 2.24 的 glibc.spec 重申了这一点。对于 Fedora 25。

# Enable lock elision support for these architectures
#
# At the moment lock elision is disabled on x86_64 until there's a CPU that
# would actually benefit from enabling it.  Intel released a microcode update
# to disable HLE and RTM at boot and the Fedora kernel now applies it early
# enough that keeping lock elision enabled should be harmless, but we have
# disabled it anyway as a conservative measure.
%define lock_elision_arches s390 s390x
...
%ifarch %{lock_elision_arches}
        --enable-lock-elision \
%endif
...
# Disable rwlock elision if --enable-lock-elision is not used.
Patch0052: glibc-disable-rwlock-elision.patch
...
* Tue Sep 30 2014 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.20.90-6
- Sync with upstream master.
- Disable more Intel TSX usage in rwlocks (#1146967).
- Enable lock elision again on s390 and s390x.
- Enable Systemtap SDT probes for all architectures (#985109).

虽然说 OP 的 Linux 发行版在与 Fedora 25 相同的 glibc 2.24 上运行还没有定论,但通用 glibc 2.24 很可能根据 Patch0052 禁用了省略。这就是为什么 OP 无法通过“export GLIBC_TUNABLES=glibc.elision.enable=1”看到性能提升

来源:
http://rpmfind.net/linux/RPM/centos/7.9.2009/x86_64/Packages/glibc-2.17-317.el7.x86_64.html
http://rpm.pbone.net/info_idpl_48715292_distro_fedora_24_com_glibc-2.23.1-12.fc24.x86_64.rpm.html
http://rpm.pbone.net/resultsb_dist_103_size_26149846_name_glibc-2.24-10.fc25.src.rpm.html

更新:
SLES12 有自己的 glibc 版本。 SP2 自带 glibc 2.22,与 Fedora 25 的 glibc 2.22 不同。

SLES12 SP2 Fedora 25
\ Patch0052: glibc-disable-rwlock-elision.patch (since 2.20.90)
elision=--enable-lock-elision
if [ "$dirname" = "noelision" ]; then
elision=--disable-lock-elision
fi
\

来源:
https://www.suse.com/support/kb/doc/?id=000019071 http://rpm.pbone.net/info_idpl_55157770_distro_opensuse_com_glibc-2.24-3.29.x86_64.rpm.html

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多