gpt4 book ai didi

assembly - ARM LL/SC 通过寄存器宽度或缓存行宽度进行独占访问?

转载 作者:行者123 更新时间:2023-12-02 18:56:08 24 4
gpt4 key购买 nike

我正在开发我的无锁数据结构库的下一个版本,使用 ARM 上的 LL/SC。

对于我的 LL/SC 用例,我需要将其与 LD​​REX 和 STREX 之间的单个 STR 一起使用。 (而不是用它来模拟 CAS。)

现在,我已经编写了代码并且可以正常工作。然而,令我担心的是它可能并不总是有效。我在 PowerPC 上读到过,如果您访问与 LL/SC 目标相同的缓存行,就会破坏 LL/SC。

所以我在想,如果我的 STR 目标与我的 LL/SC 目标位于同一缓存行,那么,我就死定了。

现在,LL/SC 目标和 STR 目标始终位于不同的 malloc() 中,因此它们直接位于同一缓存行中的机会可能很小(我可以通过填充 LL/SC 目标来保证这一点,以便它从缓存行边界开始并填充该缓存行)。

但是,如果 STR 目标位于内存中正确(错误!)的位置,则可能存在错误共享。

查看 LDREX/STREX 文档,这描述了“物理地址”方面的独占访问。这意味着寄存器宽度粒度,而不是缓存行宽度粒度。

这就是我的问题 - LDREX/STREX 对使用寄存器宽度粒度或缓存行宽度粒度的内存访问是否敏感?

最佳答案

ARM 使用独占监视器通过加载链接/条件存储来实现对内存的独占访问。 [1] 包含所有详细信息,我想说的重要的是:

Exclusives Reservation Granule

When an exclusive monitor tags an address, the minimum region that can be tagged for exclusive access is called the Exclusives Reservation Granule (ERG). The ERG is implementation defined, in the range 8-2048 bytes, in multiples of two bytes. Portable code must not assume anything about ERG size.

所以在我看来你有点不走运。无论如何,大多数实际实现可能会保留一个较小的值,但据我所知,基本 ARM 架构并不能保证这一点,但也许有更多经验的人会发现我错了。 :)尽管如此,LL/SC 的所有实现都是某种形式的弱 LL/SC,因此您几乎永远无法完全确定 LL 和 SC 之间的存储不会总是杀死 SC,或者大多数情况下时间,或者也许永远不会......它只是如此依赖于架构和实现,我个人坚持使用 LL/SC 在紧密循环中实现 CAS,并像往常一样使用它并完成它。

[1] http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0008a/CJAGCFAF.html

关于assembly - ARM LL/SC 通过寄存器宽度或缓存行宽度进行独占访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10812442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com