Gil Tene:了解硬件事务内存

  • Ralph Winzinger
  • 金灵杰

2016 年 6 月 27 日

话题:Java语言 & 开发架构

2016 年纽约 QCon上,Gil Tene 在其演讲“了解硬件事务内存”中介绍了硬件事务内存(hardware transactional memory,HTM)。虽然 HTM 概念不是新的,现在终于有商业硬件支持了。HTM 的目的是能够支持在内存中原子的进行多地址写入,以避免与其他合作线程产生不一致的情况。

Tene 首先从解释内存缓存的四个状态开始:

  • 无效
  • 共享
  • 排他
  • 修改

同时他指出,考虑到硬件事务内存,还有两个额外的状态:

  • 缓存行在操作中被读取
  • 缓存行在操作中被修改

如果发送下列情况,事务必须被终止:其他 CPU 希望写入数据、读取已经被修改的数据和 CPU 希望失效其缓存。

根据 Tene 说法,硬件事务内存最大优势是摆脱串行块。最终目的是完全并行执行,并且仅在实际访问数据产生实际冲突时进行回滚。这和阿姆达尔定律有关,即当 CPU 核数越多,对运行速度的实际提升越少。如果应用程序中有 10% 的串行代码,10 核 CPU 最多只能提速 5 倍。要实际达到提速 10 倍,可能需要使用将近 100 核 CPU。

Tene 然后介绍了锁竞争和数据竞争。例如当处理大型散列集合时,可能在读写完全不同的区域,但是整个散列集合都需要被加锁。通常锁竞争影响范围会比数据竞争大很多,但是只有数据竞争才会影响 CPU 的并行工作。因此,仅仅终止产生数据竞争的事务,可以彻底降低阿姆达尔定律影响,加速并行运算。

对于 Java 同步块,Tene 解释了没有竞争的代码库可以和之前运行的速度相同。仅当发生实际数据冲突的地方,将会产生事务回滚,并且让代码并行的重新运行。对于 Java 应用程序,一旦 Java 虚拟机使用 HTM,该过程是完全透明的,代码上不需要做任何修改。这在 Hotspot 8 Java 虚拟机的 40 更新之后实现。Tene 页展示了简单的基准测试数据,可视化的展示了硬件事务内存的效果:即使散列集合中又 5% 的写比例,在增加更多 CPU 时,性能也能线性增加。

Gil Tene 总结指出虽然对于开发者来说 HTM 使用是透明的,他们还是需要开始考虑应用程序中的数据竞争。多线程不应该修改一个变量,因为这样会导致数据竞争,并因 HTM 的优势无法被利用而无法提高运行速度。

请注意大部分 QCon 演讲材料会在会议结束后的几周后免费提供,演示文档可以在大会网站进行下载。同时,您也可以在 InfoQ 网站上观看关于这一主题对 Gil Tene 进行的采访

查看英文原文:Gil Tene: Understanding Hardware Transactional Memory


感谢张龙对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

Java语言 & 开发架构