Haswell 内的事务同步

Transactional Synchronization in Haswell

Note

  • 原文发表于 2012-02-07;
  • 名词翻译:
    • Intel® Transactional Synchronization Extensions,英特尔事务同步扩展,译者简称为 TSX,;
    • Intel® Architecture Instruction Set Extensions Programming Reference,英特尔架构指令集扩展编程参考,译者简称为「手册」;
    • Shared-memory multithreaded applications,共享内存的多线程应用,译者简称为「应用」
    • Draft Specification of Transaction Language Constructs for C++,C++事务构件规范草案,译者简称为「草案」

Intel 已公布 Intel® TSX 的细节。TSX 将搭载于代号「Haswell」的多核处理器上,「手册」中已更新相关内容

本文将介绍 TSX 及其部分背景,更多信息请参阅「手册」第八章。

TSX 对于那些基于锁同步算法的「应用」来说十分有用,其提供一套指令集扩展,允许程序员指定用于事务同步的代码区域。使用 TSX,程序员可以凭粗粒度锁的形式,实现细粒度锁的性能。笔者在「另一篇博客」里阐释了一个例子。

鉴于锁是底层编程工具,因此有关 TSX 的讨论也将是底层的。至于 TXT 将如何影响顶层编程方法,乃至开启新的编程模型,则超出本文的范围,不过本文也会在结尾部简短地评论一下。

为何有用

通过事务同步,硬件可以动态地决定,线程在经过被锁保护的临界区时,是否需要执行序列化(serialize),并在需要时执行。这使得处理器可以挖掘并利用,先前被多余的同步所隐藏的并发性。

通过 TSX,由程序员指定的代码区域,也即事务性区域,将在最底层事务地执行。若事务执行成功,则在别的逻辑处理器眼中,该事务中的所有内存操作就像同时发生的一样。处理器仅在成功提交时,才使得其他逻辑处理器“看见”事务性区域内执行的更新,该提交又被称为原子提交。

TSX 可以帮助程序使用粗粒度锁时,也达到细粒度锁的性能。TSX 也能允许程序在临界区周围使用锁,却避免了不必要的序列化。若多个线程执行由相同锁保护的临界区,却不执行对彼此的数据执行任何导致冲突的操作,则这些线程可以并发执行,而无需序列化。即使软件在普通锁上使用锁获取操作,硬件也可以识别这种情况,并取消锁,使得当动态锁通信无必要时,两个线程能够无需锁通信地执行其临界区。

TSX 接口

TSX 提供两种软件接口。

扫描二维码关注公众号,回复: 3295081 查看本文章
  • HLE(Hardware Lock Elision,硬件锁省却)

    HLE 是一种兼容指令集,其由前缀为 XACQUIRE 及 XRELEASE 的指令构成,用于指定事务性区域。HLE 和传统基于锁的编程模型相兼容。使用 HLE 写成的软件能够同时运行在不支持 TSX 的老型硬件、与支持 TSX 的新型硬件上。

  • RTM(Restricted Transactional Memory,受限事务内存)

    RTM 是一种新型指令集,其由 XBEGIN、XEND 与 XABORT 指令构成,允许程序员更灵活地定义事务性区域。不像 HLE,RTM 会在不支持 RTM 的老型处理器上产生未定义指令错误(#UD),不过在这点上,所有新指令集拓展都是一样的。此外,RTM 还要求程序员提供可选的代码路径,用于处理事务执行失败的情况。

总之:“TXS 有两种食用方式:HLE 和 RTM。HLE 是兼容的;RTM 更灵活,却要求程序员提供可选路径,用于事务失败时执行。”

「手册」详细地描述了上述拓展指令集,并概述了不同的编程考虑,以帮助大家利用好 TSX。

TSX 适用性

TSX 旨于经常访问共享数据的「应用」。TSX 允许应用无需揣度细粒度锁的设计,就能实现细粒度锁般的性能。

然而,如果数据竞争较强,则算法需要进行调整,以实现更高的扩展性。世界上不存在解决该问题的万能钥匙,因为强数据争用意味着,该算法被有效地序列化了。

译者注:良好的扩展性意味着,应用的性能应随着线程数的提升而提升。

事务编程?

TSX 将如何应用顶层编程方式,或开启新的编程模型,超过了本博的范围。一些实验性质的编译器,特别是那些并非针对 TSX 的,如 gcc 4.7,将会提供一个实验性的实现。我们可以期待语言标准委员评审,有关如何在语言级别添加事务模型的建议(Intel 已支持「草案」的建立)。TSX 可能会开启一些更高效的事务模型。当然,还要着手很多工作,去关注现实世界中的用法、应用实例,以便开发和改进未来的使用。祝所有参与者好运!

译者:当然,现在(2018-01-10)GCC 都发布到 7.2.0 版本了。至于 Intel 自家以外的编译器对 TSX ABI 支持到了怎样的地步,译者未调查,也不知情。

尽管 TSX 可能开启新编程模型的高效实现,但其不要求、亦不提出新的编程模型。TSX 只是提供一些由硬件支持的事务执行指令,用来减轻开发负担,并提高已存编程模型的性能。

总结

TSX 提供了一些指令集扩展,用于帮助程序员指定事务执行代码区域。使用这些扩展,程序员花费更少的力气,就能实现更好的性能,比如使用粗粒度锁编程而实现细粒度锁般的性能。这对程序员而言十分有用,也将因此成为程序员界的大新闻。

请查看「手册」,并在未来数月继续关注 Intel 等公司的支持工具提供信息。


有关编译器优化的更多完整信息,请参阅优化通知

猜你喜欢

转载自blog.csdn.net/maokelong95/article/details/79019511