2013-09-16 33 views
1

我想知道应该它需要多少个时钟周期来修改一个std ::原子(或atomic_flag)假设它是使用最严格的存储器模型设定?多少个时钟周期来修改C++ 11原子布尔?

+10

您错过了很多关键信息:什么处理器(体系结构,模型,类型),数据在修改时的位置(缓存,主内存,另一个处理器的缓存),还有多少其他处理器系统中有多少处理器拥有原子变量的副本? –

+1

说Linux Ubuntu 12.04,2.5 GHz和Intel 64位架构。我想我关心的场景是该值已经在L1缓存中。那么还有两种情况:1)没有其他线程在运行,2)多线程访问变量,但为了简单起见,假设只有生产者和消费者(绑定在不同的核心上)。 –

+1

介于几十到几千之间......这不是一个足够好的答案吗? –

回答

4

这是相当难以确定它实际上究竟有多少clockcycles需要。我会的,而是试图解释到底发生了什么,如果我们假设它是一个x86处理器(如注释说明),以及运行时库实现了atomic使用“锁定”的指令 - 如果这些假设是错误的,那么“所有投注都关闭:俗话说得好:

当执行atomic操作时,CPU将首先确保它具有“独占”访问(可能)高速缓存的值。这意味着发送一条消息给所有其他CPU说“我为这个变量的it”。每个其他CPU然后必须刷新其副本(如果修改)并将该值标记为“无效”,然后用“我完成”回复。

一旦所有的处理器都表示“我已完成”,主处理器可以继续。这个过程,特别是在有大量CPU(核心)的大型系统中可能需要相当长的时间(数百或数千个周期)。

当然,CPU可以知道没有其他的CPU已经看到它的值,或没有其他CPU已经发出关于该值的写入,在这种情况下,它可以非常快优化此。

你也许可以通过编写一些代码来了解这是多么糟糕[在特定的机器上],在两个线程中,例如1秒,试图更新和读取相同的原子变量,看看它有多好/坏。然后尝试两个“更新”循环(以便在两个线程之间进行更新)。

1

它是大约相同的,以未缓存的主存储器的访问。大约100-1000纳秒,或大约100个时钟周期。