【发布时间】:2013-09-16 18:59:19
【问题描述】:
我想知道假设它使用最严格的内存模型设置,修改 std::atomic(或 atomic_flag)需要多少时钟周期?
【问题讨论】:
-
你遗漏了很多关键信息:什么处理器(架构、型号、类型),你修改它时的数据在哪里(缓存、主内存、另一个处理器的缓存),系统中还有多少其他处理器,这些处理器中有多少拥有原子变量的副本?
-
说 Linux Ubuntu 12.04、2.5 GHz 和 Intel 64 位架构。我想我关心的场景是该值已经在 L1 缓存中。然后还有另外两种情况:1)没有其他线程在运行,2)多个线程访问该变量,但为简单起见,假设只有一个生产者和消费者(绑定在不同的内核上)。
-
几十到几千之间...这不是一个足够好的答案吗?
-
这是一个有点傻的问题,答案是:0.5 到 1,000,000 个周期,取决于 a) 实现是否无锁 b) 是否存在拥塞,以及 c) 是否存在数据依赖。如果它是在没有拥塞和数据依赖的情况下的无锁实现,它以 CPU 可以启动新整数指令的速度运行(通常每个时钟 2-4 条)。对于数据依赖性,大约需要 20 个周期(或者在 NUMA 系统的不同内核上多 3-5 倍)。否则,由于拥塞或锁定,它需要......任何......数量的周期。
-
好吧,我想原子变量是无锁的,应该在活动线程到达它时立即执行。
标签: c++ performance c++11 concurrency atomic