2012-10-30 47 views
6

我有双核Cortex-A9系统工作,我一直在试图理解 究竟为什么自旋锁功能,需要使用DMB。这似乎 只要合并存储缓冲器被刷新锁定值 应在L1上的解锁核心和SCU最终应该 要么无效或更新其他核心的L1值。 这足以维持一致性和安全锁定权吗?而且 不会STREX无论如何跳过合并存储缓冲区,这意味着我们不需要 甚至需要刷新?螺旋锁确实需要DMB吗?

DMB似乎是一个钝头锤,尤其是因为它 默认为系统域,这可能意味着一直写到主存储器,这可能是昂贵的。

是在锁有一个变通方法的DMB为妥善做好不 使用smp_mb驱动程序?

我目前看到,根据性能指标,我的系统周期在DMB引起的失速中消失了大约5%。

+1

这可能是一个完全误导性的评论,因为我对这种低级别的操作并不是非常有经验,但确实使用自旋锁来保护其他存储位置不受多重访问(可能不是相同缓存页面)..因此,尽管无论如何spinlock本身可能是连贯的,但仍然需要内存屏障来确保其他内存访问在缓存之间是连贯的。 – Mike

+0

好吧,我明白你的意思,但是这个逻辑适用于锁定功能以及解锁?锁定不应该等待关键部分之外的访问才能完成。 –

+2

在我所期望的解锁,这样的临界区中发生的任何变化都保证了锁标志更新之前被刷新,而关键的部分期间发生的任何读操作之前完成前一个完整的内存屏障解锁锁标志被更新。除了缓存问题之外,我认为内存屏障对于告诉CPU什么样的指令重新排序可以通过程序中的不同点是很重要的。 – Mike

回答

2

我发现这些文章可能回答你的问题:

特别是:

你会注意到的数据内存屏障(DMB)指令这是一旦获得锁定后发布的。 DMB保证在内存屏障之前进行所有内存访问之前,系统中的所有其他CPU都会观察内存屏障之前访问的所有内存。如果考虑到一旦获得了锁,那么程序将访问由锁锁定的数据结构,这样做更有意义。上述锁定功能中的DMB确保访问锁定后可以访问锁定的数据结构。

2

需要在SMP情况下,DMB,因为其他处理器可以看到存储器访问以不同的顺序发生,没有它,即,从临界部分中的锁定之前可能发生内部访问从点的视图采取的第二个核心。

所以第二个核心可以看到自己持有的锁,也看到在另一个芯上运行,打破一致性cricital段内更新。

+0

这主要是由于无序执行造成的,对吗? – TerrenceSun