我写了一些无锁的代码,在大多数情况下可以与当地的 一起使用。自旋锁总是需要记忆障碍吗?旋转在记忆障碍上是否昂贵?
本地在读取内存时是否必然意味着我必须始终在旋转 之前插入内存屏障?
(为了验证这一点,我设法产生一个读/写器组合 这导致读取器从未看到 写入的值,在某些非常特殊的条件 - 专用CPU,过程连接到CPU, 优化器接通一路向上,在 环没有进行任何的工作 - 这样的箭头做点这个方向发展,但我不 完全确信通过存储纺 屏障的成本)
是什么。通过内存屏障旋转的代价,如果 没有什么要在缓存的存储区中刷新e缓冲区? 即所有的进程正在做(在C)是
while (1) {
__sync_synchronize();
v = value;
if (v != 0) {
... something ...
}
}
我是正确的假设,它是免费的,它不会与任何业务拖累 内存总线?
另一种方式把这个要问:没有一个内存屏障做 什么比更多:刷新存储缓冲区,应用 废票给它,并防止 重新排序的编译器读取在其位置/写?
拆卸,__sync_synchronize()似乎翻译成:
lock orl
从英特尔手册(同样含糊不清的新手):
Volume 3A: System Programming Guide, Part 1 -- 8.1.2
Bus Locking
Intel 64 and IA-32 processors provide a LOCK# signal that
is asserted automatically during certain critical memory
operations to lock the system bus or equivalent link.
While this output signal is asserted, requests from other
processors or bus agents for control of the bus are
blocked.
[...]
For the P6 and more recent processor families, if the
memory area being accessed is cached internally in the
processor, the LOCK# signal is generally not asserted;
instead, locking is only applied to the processor’s caches
(see Section 8.1.4, “Effects of a LOCK Operation on
Internal Processor Caches”).
我的翻译:“当你说LOCK,这将会很昂贵,但我们只在需要的地方使用 。“
@BlankXavier:
我做了测试,如果作家没有明确推出从存储缓冲区写入,它是CPU上运行的唯一的过程中,读者可以永远看作者的作用(我可以用测试程序重现它,但正如我上面提到的,它只发生在特定的测试中,具有特定的编译选项和专用的核心分配 - 我的算法工作正常,只有当我好奇时关于这是如何工作的,并写下了明确的测试,我意识到它可能会出现问题)。
我认为默认情况下,简单的写入是WB写入(回写),这意味着它们不会立即刷新,但读取将取最近的值(我认为他们称之为“存储转发”)。所以我为作者使用CAS指令。我在英特尔手册中发现了所有这些不同类型的写入实现(UC,WC,WT,WB,WP),英特尔第3A卷第11-10章,仍然在了解它们。
我的不确定性在读者身上:我从McKenney的论文中了解到,还有一个无效队列,即从总线进入缓存的无效队列。我不确定这部分是如何工作的。特别是,您似乎暗示循环读取正常(即,非LOCK'ed,没有屏障,并且仅使用volatile来确保优化器在编译之后保留读取)将每次都检查到“无效队列” (如果存在这样的事情)。如果一个简单的读取不够好(也就是说可以读取一个旧的缓存行,该行在排队失效之前仍然显示有效(这对我来说听起来有点不一致,但是失效队列如何工作呢?)),那么原子读取会是必要的,我的问题是:在这种情况下,这会对公共汽车产生什么影响吗? (我想可能不是)
我仍然在阅读我通过英特尔手册的方式,虽然我看到商店转发的一个很好的讨论,但我还没有找到关于失效队列的很好的讨论。我决定将我的C代码转换为ASM并进行实验,我认为这是真正理解它如何工作的最好方法。
“在大多数情况下可以正常读取。” - 如果它总是无法正常工作,那么它就不好...... –
关于全面优化的小循环测试,还有其他一些问题,例如: [Cyrix昏迷错误](http://en.wikipedia.org/wiki/Cyrix_coma_bug#Analysis)(尽管它不适用于这种情况),这可能会影响“假”测试。 –
@Mitch:我的,当然,这就是为什么我问:-) – blais