3

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

4

2 回答 2

4

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

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

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

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

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

于 2013-09-16T19:27:51.550 回答
1

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

于 2013-09-17T04:00:05.080 回答