修改C ++ 11原子bool需要多少个时钟周期?

时间:2013-09-16 18:59:19

标签: c++ performance c++11 concurrency atomic

我想知道修改std :: atomic(或atomic_flag)需要多少个时钟周期,假设它使用最严格的内存模型设置?

2 个答案:

答案 0 :(得分:4)

很难准确确定实际需要多少个时钟周期。相反,如果我们假设它是一个x86处理器(如注释中所述),我将尝试解释实际发生的情况,并且运行时库使用“锁定”指令实现atomic - 如果这些假设中的任何一个是是的,然后“所有的赌注都没有了”,俗话说:

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

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

当然,CPU可以通过知道没有其他CPU读取此值,或者没有其他CPU为此值发出写入来优化这一点,在这种情况下,它可以非常快。

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

答案 1 :(得分:1)

与访问未缓存的主内存大致相同。大约100-1000 ns,或大约100个时钟周期。