事务内存(TM)13 是一种并发控制范式,为代码区域提供原子和隔离的执行。许多研究人员认为 TM 是解决多核处理器编程问题的最有希望的解决方案之一。其最吸引人的特点是,大多数程序员只需要在本地考虑共享数据访问,标记要事务性执行的代码区域,并让底层系统确保正确的并发执行。该模型有望提供细粒度锁定的可扩展性,同时避免锁组合的常见陷阱,例如死锁。在本文中,我们探讨了一种高度优化的 STM 的性能,并观察到 TM 的总体性能在低并行度下要差得多,这可能会限制这种编程范式的采用。
事务内存系统的不同实现方式会做出权衡,这会影响性能和可编程性。Larus 和 Rajwar16 概述了事务内存系统实现的设计权衡。我们在此总结了一些设计选择
混合系统的一个特例是硬件加速的 STM。在这种情况下,事务语义由 STM 提供,硬件原语仅用于加速 STM 中的关键性能瓶颈。如果硬件原语的成本适中,并且可以通过系统中的其他用途进一步分摊,则此类系统可以提供有吸引力的解决方案。
独立于这些实现决策,存在事务语义问题,这些问题破坏了社区所期望的理想事务编程模型。TM 引入了锁基互斥中不存在的各种编程问题。例如,语义因以下原因而变得混乱:
除了内在的语义问题外,还有由高事务开销驱动的特定于实现的优化,例如程序员注释用于排除私有数据。此外,中止事务引入的非确定性使调试变得复杂——事务代码可能会被执行并在冲突时中止,这使得程序员难以找到具有可重复行为的确定性路径。所有这些都淡化了事务的生产力论点,尤其是纯软件 STM 实现。
鉴于所有这些问题,我们得出的结论是,TM 尚未成熟到足以呈现引人注目的价值主张,从而触发其广泛采用。虽然 TM 可以成为并行程序员投资组合中的有用工具,但我们认为它本身不会解决并行编程困境。有证据表明,它有助于构建某些并发数据结构,例如哈希表和二叉树。此外,还有传闻称它有助于工作负载;然而,尽管在该领域进行了多年的积极研究和发表,但我们很失望地发现研究文献中没有提及使用 TM 的大规模应用程序。STAMP30 和 Lonestar17 基准测试套件是一个有希望的开始,但要代表完整的应用程序还有很长的路要走。
我们的这些结论基于我们过去两年构建最先进的 STM 运行时系统和编译器框架 IBM STM31 的工作。在这里,我们描述了这一经验,首先讨论了 STM 算法和设计决策。然后,我们将此 STM 的性能与其他两个最先进的实现(Intel STM14 和 Sun TL2 STM7)进行比较,并剖析 IBM STM 执行的操作,并详细分析 STM 的性能热点。
STM 在软件中实现所有事务语义。这包括冲突检测、保证事务性读取的一致性、保持原子性和隔离性(防止其他线程在事务成功之前观察到推测性写入)以及冲突解决(事务仲裁)。图 1 说明了典型 STM 执行的主要操作的伪代码。我们展示了两种 STM 算法,一种执行完全验证,另一种使用全局版本号(标有 gv# 注释的附加语句)。
STM 对于系统程序员的优势在于,它在实现这些操作的不同机制和策略方面提供了灵活性。对于最终用户而言,STM 的优势在于它提供了一个环境,可以将他们的应用程序事务化(即移植到 TM),而无需承担额外的硬件成本或等待此类硬件的开发。
相反,STM 在性能和编程语义方面存在明显的缺点
malloc
和 free
。使用此类 STM 设计,事务性访问的位置的内存分配和释放与其他位置的处理方式不同。此处我们使用以下基准测试集
基线性能。 在图 2 中,我们展示了三个 STM 的性能比较:IBM31,34、Intel14 和 Sun 的 TL27 STM。运行在四核、双路超线程 Intel Xeon 2.3GHz 机器上,运行 Linux Fedora Core 6。在这些运行中,我们使用了代码的手动检测版本,这些版本积极地最小化了 IBM 和 TL2 STM 的屏障数量。由于我们无法访问 Intel STM 的底层 API,因此 Intel STM 的曲线来自其编译器检测的代码,这些代码由于编译器检测而产生了额外的屏障开销36。这些图是相对于串行、非事务化版本的可扩展性曲线。因此,y 轴上的值 1 表示性能等于串行版本。这些 STM 的性能大多相当,其中 IBM STM 在 delaunay 上显示出更好的可扩展性,而 TL2 在 genome 上获得了更好的可扩展性。然而,获得的总体性能非常低:在 kmeans 上,IBM STM 在 4 个线程时几乎无法达到单线程性能,而在 vacation 上,即使有 8 个线程,也没有任何 STM 真正克服事务内存的开销。
编译器检测。 编译器是基于 STM 的编程环境的必要组成部分,该环境将被大众程序员采用。其基本作用是消除程序员手动检测内存引用到 STM 读取和写入屏障的需求。虽然提供了便利性,但编译器检测确实通过引入冗余屏障为 STM 系统添加了另一层开销,这通常是由于编译器分析的保守性造成的,正如 Yoo36 中也观察到的那样。
图 3 提供了另一个基线:编译器检测的开销。性能是在运行 AIX 5.3 的 16 路 POWER5 上测量的。对于 STMXLC 曲线,我们使用代码的未检测版本,并使用编译器提供的语言扩展来注释事务区域和函数31。
编译器过度检测在传统的、非托管的语言(如 C 和 C++)中更为明显,其中没有过程间分析的编译器检测最终可能会检测事务区域中的每个内存引用(堆栈访问除外)。实际上,我们的编译器检测使 delaunay、genome 和 kmeans 中的动态读取屏障的数量增加了一倍以上。过程间分析可以帮助提高某些情况下编译器检测的紧密度,但通常受到全局分析准确性的限制。
STM 操作性能。 鉴于此基线,我们现在详细分析 STM 中的哪些操作导致了开销。为此,我们使用 PowerPC 架构的周期精确模拟器,该模拟器提供用于检测的钩子。STM 操作和子操作使用这些模拟器钩子进行检测。此环境的原因是我们想在指令级别捕获开销,并消除真实硬件引入的任何其他非确定性。模拟器消除了检测引入的所有其他簿记操作,并提供了 STM 开销的准确细分。
我们研究两种 STM 算法的性能:一种在每次事务性读取后完全验证(“fv”)读取集,另一种使用全局版本号(“gv#”)以避免完全验证,同时保持操作的正确性。fv 算法以更高的代价提供更多的并发性。gv# 被认为是 STM 实现的最佳权衡之一。
图 4 显示了这些算法在顺序运行上的单线程开销,再次说明了算法引起的显着减速。图 5 将这些开销分解为各种 STM 组件。对于这两种算法,事务性读取的开销占主导地位,这是由于读取操作相对于所有其他操作的频率而言。全局版本号在降低开销方面的有效性在“gv#”的较低读取开销中显示出来。
图 6 详细细分了事务性读取操作的开销。“fv”配置中,验证读取集的开销如预期那样在事务性读取时间中占主导地位。对于这两种算法,isync 操作(对于对元数据读取和数据读取以及数据读取和验证进行排序是必要的)构成了重要的组成部分。在同一事务中在读取之前执行写入的应用程序(delaunay、kmeans)中,检查位置是否已被同一事务中的先前写入写入所花费的时间构成了总时间的很大一部分。有趣的是,读取数据本身仅占总时间的一小部分,这表明为了使这些算法的性能具有吸引力,必须克服的障碍。
图 7 给出了事务性提交操作的类似细分。与之前一样,“fv”配置受到必须验证读取集的困扰。两种配置的其他主要开销是必须获取写入集的元数据(这涉及一系列加载链接/存储条件操作)以及对于对元数据获取、数据写入和元数据释放进行排序是必要的同步操作。再次,数据写入本身仅占总时间的一小部分。
开销优化。 关于通过编译器或运行时技术降低 STM 开销,已经有很多提议,其中大多数是对 STM 硬件加速的补充。
这些优化对 STM 性能产生了积极影响。然而,此处呈现的结果表明,要使 STM 的性能对用户普遍具有吸引力,还需要多少进一步的创新。
Shavit 和 Touitou26 提出了第一个 STM 系统,该系统基于对象所有权。该协议是静态的,这是一个显着的缺点,随后的 STM 系统7 克服了这一缺点。静态性质大大简化了冲突检测,因为在获取所有权记录时(在事务开始时)已经可以排除冲突。
DSTM12 是第一个动态 STM 系统;该设计遵循每个对象的运行时组织(定位器对象)。应用程序堆中的变量(对象)引用定位器对象。与具有所有权记录的设计(例如,Harris 和 Fraser10)不同,定位器不存储厌恶版本号,而是引用对象的最新提交版本。DSTM 设计的一个特点是,对象必须在事务性访问之前显式“打开”(以只读或读写模式);此外,DSTM 允许提前释放。作者认为,这两种机制都有助于减少冲突。
RSTM18 系统的设计原则与 DSTM 类似,因为它将事务元数据与对象关联。然而,与 DSTM 不同的是,该系统不需要动态分配事务数据,而是将其与非事务数据并置。这种方案有两个好处:首先,它有助于空间访问局部性,从而提高执行性能和事务吞吐量。其次,不需要事务数据的动态内存管理(通常通过垃圾收集器完成),因此该方案适用于内存管理显式的环境。
最近的工作探索了此处描述的基本 STM 算法的算法优化和/或替代实现。Riegel 等人提出了使用实时时钟来使用全局版本号增强 STM 可扩展性22。JudoSTM21 和 RingSTM29 减少了提交事务时必须执行的原子操作的数量,但代价是序列化提交和/或由于不精确的冲突检测而导致虚假中止。已经提出了几种通过动态二进制重写来操作的 STM 方案,以便允许在遗留二进制文件上使用 STM8,21,33。
Yoo 等人36 分析了 Intel STM14,23 执行中的开销。他们确定了四个主要的开销来源:过度检测、错误共享、摊销成本和私有化安全成本。错误共享、私有化安全和过度检测是实现工件,可以通过使用更细粒度的簿记、更精细的分析或用户注释来消除。摊销成本是 STM 中固有的开销,正如我们在此处证明的那样,不太可能被消除。
在分析 TM 系统中的操作方面已经花费了大量研究精力。最近的软件优化已设法将 STM 性能提高了 2%–15%。我们认为,这种分析是一种好的做法,应扩展到每件系统软件,尤其是开源软件。然而,这些收益只是我们在观察到的开销中的一个小小的凹痕,这表明社区在使 STM 性能具有吸引力方面面临的挑战。
根据我们的结果,我们认为 STM 的未来之路充满挑战。将 STM 的开销降低到普遍具有吸引力的程度是一项艰巨的任务,并且必须展示明显更好的结果。如果我们能强调进一步研究的单一方向,那就是消除动态不必要的读取和写入屏障——这可能是进一步降低 STM 开销的最有力的杠杆。然而,鉴于研究界探索的类似问题的难度,例如别名分析、逃逸分析等等,这可能是一场艰难的战斗。并且由于 TM 的论点取决于其简单性和生产力优势,我们对任何需要程序员额外工作才能解决性能问题的提议都深感怀疑。
我们观察到,TM 编程模型本身,无论是在硬件还是软件中实现,都引入了复杂性,这些复杂性限制了预期的生产力提升,从而降低了当前迁移到事务编程的动力,以及目前 оправдание 任何超过少量硬件支持的 оправдание。
我们要感谢 Pratap Pattnaik 的持续支持、Christoph von Praun 的多次讨论、在基准测试和运行时方面的工作,以及 Rajesh Bordawekar 的 B+树代码实现。
1. Baugh, L., Neelakantarn, N., 和 Zilles, C. 使用硬件内存保护构建高性能、强原子混合事务内存。载于第 35 届国际计算机体系结构研讨会论文集。 IEEE 计算机学会,华盛顿特区,2008 年,115–126 页。
2. Blundell, C., Devietti, J., Lewis, E.L., Martin, M.M.K. 在无界事务内存中使快速情况常见,使不常见情况简单。载于第 34 届年度国际计算机体系结构研讨会论文集。 ,纽约,2007 年。
3. Blundell, C., Lewis, C., 和 Martin, M.M.K. 事务内存原子性语义的微妙之处。IEEE TCCA 计算机体系结构快报 5, 2 (2006 年 11 月)。
4. Bobba, J., Goyal, N., Hill, M.D., Swift, M.M., 和 Wood, D.A. TokenTM:使用硬件事务内存高效执行大型事务。载于第 35 届国际计算机体系结构研讨会论文集。 IEEE 计算机学会,华盛顿特区,2008 年,127–138 页。
5. Ceze, L., Tuck, J., Cascaval, C., Torrellas, J. 多处理器中推测线程的批量消除歧义。载于第 34 届年度国际计算机体系结构研讨会论文集。 ,纽约,2006 年,237–238 页。
6. Damron, P., Federava, A., Lev, Y., Luchangco, V., Moir, M., 和 Nussbaum, D. 混合事务内存。载于第 12 届编程语言和操作系统体系结构支持国际会议论文集,2006 年 10 月。
7. Dice, D., Shalev, O., 和 Shavit, N. 事务锁定 II。DISC,2006 年 9 月,194–208 页。
8. Felber, P., Fetzer, C., Mueller, U., Riegel, T., Suesskraut, M., 和 Sturzrehm, H. 使用开放编译器框架事务化应用程序。载于 SIGPLAN 事务计算研讨会论文集。 2007 年 8 月。
9. Hammond, L., Wong, V., Chen, M., Carlstrom, B.D., Davis, J.D., Hertzberg, B., Prabhu, M.K., Wijaya, H., Kozyrakis, C., 和 Olukotun, K. 事务内存一致性和一致性。载于第 31 届年度国际计算机体系结构研讨会论文集。 IEEE 计算机学会,2004 年 6 月,102 页。
10. Harris, T. 和 Fraser, K. 轻量级事务的语言支持。载于面向对象编程、系统、语言和应用程序论文集。 2003 年 10 月,388–402 页。
11. Harris, T., Plesko, M., Shinnar, A., 和 Tarditi, D. 优化内存事务。载于编程语言设计与实现会议论文集。 2003 年,388–402 页。
12. Herlihy, M., Luchangco, V., Moir, M., 和 Scherer III, W.N. 用于动态大小数据结构的软件事务内存。载于第 22 届 分布式计算原理研讨会论文集。 2003 年 7 月,92–101 页。
13. Herlihy, M. 和 Moss, J.E.B. 事务内存:无锁数据结构的体系结构支持。载于第 20 届年度国际计算机体系结构研讨会论文集。 1993 年 5 月。
14. Intel C++ STM 编译器,原型版 2.O.; http://softwarecommunity.intel.com/articles/eng/1460.htm/ (2008 年)。
15. Kulkarni, M., Pingali, K., Walter, B., Ramanarayanan, G., Baia, K., 和 Chew, P.L. 乐观并行性需要抽象。载于PLDI 2007 论文集。 ,纽约,2007 年,211–222 页。
16. Larus, J.R., 和 Rajwar, R. 事务内存。Morgan Claypool,2006 年。
17. Lonestar 基准测试套件;http://iss.ices.utexas.edu/lonestar/ (2008 年)。
18. Marathe, V.J., Spear, M.F., Heriot, C., Acharya, A., Eisenstat, D., Scherer III, W.N., 和 Scott, M.L. 降低软件事务内存的开销。罗切斯特大学计算机科学系技术报告 TR 893,2006 年 3 月。缩写版本已提交出版。
19. Minh, C.C., Trautmann, M., Chung, J., McDonald, A., Branson, N., Casper, J., Kozyrakis, C., 和 Olukotun, K. 具有强隔离保证的有效混合事务内存系统。载于第 34 届年度国际计算机体系结构研讨会论文集。 ,纽约,2007 年,69–80 页。
20. Moore, K.E., Bobba, J., Moravan, M.J., Hill, M.D., 和 Wood, D.A. LogTM:基于日志的事务内存。载于第 12 届年度高性能计算机体系结构国际研讨会论文集,2006 年 2 月。
21. Olszewski, M., Cutler, J., Steffan, J.G. Judostm:一种软件事务内存的动态二进制重写方法。载于第 16 届国际并行体系结构和编译技术会议论文集。 2007 年。IEEE 计算机学会,华盛顿特区,365–375 页。
22. Riegel, T., Fetzer, C., 和 Felber, P. 具有可扩展时间基的时间基事务内存。载于第 19 届 并行算法和体系结构研讨会论文集,2007 年
23. Saha, B., Adl-Tabatabai, A.R., Hudson, R.L., Minh, C.C., 和 Hertzberg, B. Mcrt-stm:用于多核运行时的高性能软件事务内存系统。载于第 11 届 并行编程原理与实践研讨会论文集。 2006 年 3 月,,纽约,187–197 页。
24. Saha, B., Adl-Tabatabai, A.R., 和 Jacobson, Q. 软件事务内存的架构支持。载于第39届国际微体系结构年度研讨会论文集。2006年12月,185–196页。
25. Shavit, N., 和 Touitou, D. 软件事务内存。载于分布式计算原理研讨会论文集。 ,1995年。
26. Shavit, N. 和 Touitou, D. 软件事务内存。载于第14届分布式计算原理研讨会论文集。 ,纽约,1995年。
27. Shpeisman, T., Menon, V, Adl-Tabatabai, A-R., Balensiefer, S., Grossman, D., Hudson, R., Moore, K.F., 和 Saha, B. 在STM中强制隔离和排序。载于编程语言设计与实现会议论文集。 ,2007年,78–88页。
28. Shriraman, A., Spear, M.F., Hossain, H., Marathe, V.J., Dwarkadas, S., 和 Scott, M.L. 一种灵活事务内存的软硬件集成方法。载于第34届国际计算机体系结构年度研讨会论文集。 ,纽约,2007年,104–115页。
29. Spears, M.T., Michael, M.M., 和 von Praum, C. Ringstm:使用单个原子指令的可扩展事务。载于第20届并行算法与体系结构研讨会论文集。 ,纽约,275–284页。
30. STAMP 基准测试; http://stamp.stanford.edu/ (2007年)。
31. (IBM) 用于AIX的XL C/C++事务内存; http://www.alphaworks.ibm.com/tech/xlcstm/ (2008年)。
32. Tremblay, M. 和 Chaudhry, S. 第三代65nm 16核32线程加32侦察线程CMT。载于IEEE国际固态电路会议论文集。 2008年2月。
33. Wang, C. Chein, W-Y, Wu, Y., Saha, B., 和 Adl-Tabatabai, A.R. 用于非托管语言中事务内存构造的代码生成和优化。载于国际代码生成和优化研讨会论文集。 2007年,34–48页。
34. Wu, P., Michael, M.M., von Praun, C., Nakaike, T., Bordawekar, R., Cain, H.W., Cascaval, C., Chatterjee, S., Chiras, S., Hou, R., Mergen, M., Shen, X., Spear, M.F., Wang, H.Y., 和 Wang, K. 软件事务内存优化的编译器和运行时技术。即将发表于并发与计算:实践与经验,2008年。
35. Yen, L., Bobba, J., Marty, M.M., Moore, K.E., Volos. H., Hill, M.D., Swift, M.M., 和 Wood, D.A. LogTM-SE:将硬件事务内存与缓存解耦。载于第13届国际高性能计算机体系结构研讨会论文集。 2007年2月。
36. Yoo, R.M., Ni, Y., Welc, A., Saha, B. Adl-Tabatabai, A-R. 和 Lee, H-H.S. 软件事务内存的实际问题:为何步履维艰。第20届并行算法与体系结构年度研讨会论文集,2008年。
37. Zhang, R., Budirnlić, Z. 和 Scherer III, W.N. 基于时间戳的STM中的提交阶段。载于第20届并行算法与体系结构年度研讨会论文集。 ,纽约,326–335页。
Călin Cașcaval ([email protected]) 是IBM TJ Watson研究中心可扩展系统编程模型和工具的研究人员和经理,纽约州约克镇高地。
Colin Blundell 是宾夕法尼亚大学计算机与信息科学系体系结构和编译器组的成员。
Maged Michael 是IBM TJ Watson研究中心的研究人员,纽约州约克镇高地。
Trey Cain 是IBM TJ Watson研究中心的研究人员,纽约州约克镇高地。
Peng Wu 是IBM TJ Watson研究中心的研究人员,纽约州约克镇高地。
Stefanie Chiras 是IBM系统与技术部门的经理。
Siddhartha Chatterjee 是IBM研究院奥斯汀研究实验室主任,德克萨斯州奥斯汀。
DOI: http://doi.acm.org/10.1145/1400214.1400228
最初发表于Communications of the 第51卷,第11期—
在数字图书馆中查看此项
最初发表于Queue 第6卷,第5期—
在数字图书馆中评论这篇文章
Adam Morrison - 多核程序中可扩展的同步
为现代多核处理器设计软件提出了一个难题。传统的软件设计,其中线程操作共享数据,由于对共享数据更新的同步会串行化线程并限制并行性,因此可扩展性有限。替代的分布式软件设计,其中线程不共享可变数据,消除了同步并提供了更好的可扩展性。但是,分布式设计使得实现共享数据结构自然提供的功能(例如动态负载平衡和强一致性保证)具有挑战性,并且并非适用于每个程序。然而,通常,共享可变数据结构的性能受到当今使用的同步方法(无论是基于锁还是无锁)的限制。
Fabien Gaud, Baptiste Lepers, Justin Funston, Mohammad Dashti, Alexandra Fedorova, Vivien Quéma, Renaud Lachaize, Mark Roth - 现代NUMA系统上内存管理的挑战
现代服务器级系统通常构建为在单个系统中组合在一起的多个多核芯片。每个芯片都有一个本地DRAM(动态随机存取存储器)模块;它们一起被称为一个节点。节点通过高速互连连接,系统是完全一致的。这意味着,对程序员透明地,核心可以向其节点的本地内存以及其他节点的内存发出请求。关键的区别在于,远程请求将花费更长的时间,因为它们会受到更长的线路延迟的影响,并且可能必须跳转多跳才能遍历互连。
Spencer Rathbun - 使用Promise进行并行处理
在当今世界,有很多理由编写并发软件。提高性能和增加吞吐量的愿望导致了许多不同的异步技术。然而,所涉及的技术通常很复杂,并且是许多微妙错误的根源,特别是如果它们需要共享可变状态。如果不需要共享状态,那么这些问题可以通过更好的抽象(称为promise)来解决。这些 promise 允许程序员将异步函数调用连接在一起,等待每个调用返回成功或失败,然后再运行链中的下一个适当的函数。
Davidlohr Bueso - 实用同步原语的可扩展性技术
在理想的世界中,应用程序有望在越来越大的系统上执行时自动扩展。然而,在实践中,不仅这种扩展不会发生,而且常见的是在那些更大的系统上看到性能实际上会恶化。