1 个稳定版本

使用旧的Rust 2015

1.0.0 2017年1月15日

#12 in #transactional-memory

Apache-2.0

585KB
55

包含 (WOFF字体,120KB) docs/Heuristica-Italic.woff,(WOFF字体,90KB) docs/FiraSans-Medium.woff,(WOFF字体,92KB) docs/FiraSans-Regular.woff,(WOFF字体,56KB) docs/SourceCodePro-Regular.woff,(WOFF字体,56KB) docs/SourceCodePro-Semibold.woff,(WOFF字体,49KB) docs/SourceSerifPro-Bold.woff

rtm

文档

提供对英特尔RTM扩展的绑定。

此crate需要

  • 第六代或之后的英特尔x86_64 CPU
  • Rust Nightly

请参阅文档以深入了解RTM及其语义。


lib.rs:

英特尔RTM扩展。

请注意,此crate仅在x86_64英特尔处理器上运行,并且仅限于第六代板载之后的处理器。

#基本介绍

RTM的工作方式与数据库非常相似。您可以读取/写入内存,但必须提交更改。如果您和其他线程修改了相同的内存区域,则其他RTM事务将中止(第二个按时间顺序)。

RTM事务也可以被取消。这意味着如果您不想提交事务,比如您希望回滚,可以通过此库中的abort(x: u8)接口实现,如果遇到需要回滚事务的条件。

#深入了解

现在我们需要深入了解RTM及其实现。RTM在缓存行级别工作。这意味着每个区域RTM都认为它是独占的缓存行。Intel CPU中的每个缓存行是64字节,因此您需要确保在RTM事务内修改的数据结构的大小是X * 64 = size_of::<T>()或者0 == size_of::<T>() % 64。同时,您还需要确保分配是在64字节边界上(这被称为对齐),这仅仅意味着 &T % 64 == 0(物理指针)。

这种假共享的原因。如果不同的线程修改了您声明的RTM相同的缓存行,您的修改可能会中止,从而降低性能。

RTM通过MESIF协议工作。这些是缓存行可能处于的状态。E(独占),M(修改),S(共享),F(转发),I(无效)。实际上,RTM试图确保您将执行的读写操作都在E/F值(独占/转发)上。这意味着您要么拥有缓存中该数据的唯一副本,要么其他线程可以读取该数据,但不能写入。

如果其他线程在RTM事务期间尝试写入缓存行,您的缓存状态将变为E -> SF -> I。而其他线程没有执行RTM代码,您的交易将中止。

##架构说明

RTM更改被缓存在L1缓存中。因此,太多的更改可能导致非常极端的性能惩罚。

RMT更改是一个完整的指令屏障,但它们与mfencesfencelfence指令不同(仅限于受RTM事务影响的本地缓存行)。

##性能说明

对于修改单个缓存行,即使在SeqCst模式下,AtomicUsizeAtomicPtr也会更快。对于较大的事务(通常为几个缓存行或更多字节,通常大于>300字节)或更多,RTM事务通常更快。

无运行时依赖