我正在使用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匹配的计数器。
因此,有关如何启用锁定清除的任何建议都将有所帮助。还是我检查不正确?
更新 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);
}
也许为了简化,我应该以不同的方式初始化它?
答案 0 :(得分:3)
在2.27之前的早期版本的glibc中,只能使用名为enable-lock-elision
的编译时标志来控制对TSX的支持。我不知道哪个版本启用或禁用了enable-lock-elision
,但这就是它过去工作的方式 1 。因此,如果您想启用/指定TSX,则必须自己编译glibc并相应地使用该标志。从glibc 2.27开始,该编译时选项已删除,并由名为glibc.elision.enable
的运行时选项代替。也就是说,glibc始终在支持TSX的情况下进行编译,但是只有在运行应用程序之前(例如,通过执行glibc.elision.enable
)将环境变量export GLIBC_TUNABLES=glibc.elision.enable=1
设置为1时,才使用TSX。
在2.27之前,glibc.elision.enable
不存在,因此无效。是否使用TSX取决于编译时标志enable-lock-elision
。您正在使用2.24。因此,最简单的解决方案是将其升级到2.27或更高版本。
请注意,根据各自的规范更新,当前所有支持TSX的Intel处理器似乎都具有与“使用Intel TSX指令可能导致不可预测的系统行为”相同的错误。对于某些处理器,英特尔已经发布了微码更新,以实际禁用TSX。但是,将继续启用处理器上的实现。
脚注:
(1)根据此bug report,从2.23开始,glibc中的锁定省略已被禁用。我认为这是通过在构建glibc时禁用enable-lock-elision
来完成的,但是我没有通过查看代码来验证这一点。但这与您在2.24中被禁用的观察一致。
答案 1 :(得分: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 开始,elisions 在编译时被禁用。 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(自 2.20.90 起) |
elision=--enable-lock-elision if [ "$dirname" = "noelision" ];然后 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