无争议锁定的速度有多快?

pyt*_*nic 9 c++ performance multithreading x86-64 thread-synchronization

与无争议的原子变量(例如C++的原子<>)操作相比,它的速度/速度更快/更慢.此外,相对于无争议锁定,有争议的原子变量有多慢?我正在研究的架构是x86-64.

edA*_*a-y 15

我碰巧有很多低水平的速度测试.然而,速度意味着什么是非常不确定的,因为它很大程度上取决于你究竟在做什么(甚至与操作本身无关).

以下是AMD 64位Phenom II X6 3.2Ghz的一些数字.我也在英特尔芯片上运行它,时间变化很大(再次,具体取决于正在做什么).

GCC __sync_fetch_and_add是一个完全围栏的原子添加物,平均为16ns,最小时间为4ns.最短时间可能更接近事实(尽管我有一点开销).

无争议的pthread互斥(通过boost)是14ns(这也是它的最小值).请注意,这也有点太低,因为如果其他东西锁定了互斥锁,时间实际上会增加,但现在不是无争议(因为它会导致缓存同步).

失败的try_lock是9ns.

我没有一个普通的原子公司,因为在x86_64上这只是一个正常的交换操作.可能接近最小可能时间,所以1-2ns.

在条件变量上没有服务员的情况下调用通知是25ns(如果有什么东西在等待大约304ns).

但是,由于所有锁定都会导致某些CPU排序保证,因此您修改的内存量(适用于存储缓冲区)将改变此类操作所需的时间.显然,如果你曾经在互联网上争论过最糟糕的时间.即使没有实际发生线程切换,任何返回linux内核的时间都可能是几百纳秒.这通常是原子锁执行的地方,因为它们不涉及任何内核调用:您的平均案例性能也是最糟糕的情况.如果有等待线程,互斥锁解锁也会产生开销,而原子则不会.


注意:进行此类测量充满了问题,因此结果总是有点可疑.我的测试试图通过固定CPU速度,设置线程的cpu亲和性,不运行其他进程以及对大型结果集求平均来最小化变化.


Kon*_*lph 6

GitHub上有一个项目,目的是在不同平台上进行测量.不幸的是,在我的硕士论文之后,我从来没有真正有时间跟进这个,但至少基本的代码就在那里.

__sync_fetch_and_add内在函数相比,它测量pthreads和OpenMP锁.

根据我的记忆,我们期待锁和原子操作之间存在很大的差异(〜一个数量级)但真正的差异变得非常小.

但是,现在在我的系统上进行测量会产生反映我原始猜测的结果,即(无论是否使用pthreads或OpenMP)原子操作的速度大约快五倍,单个锁定的增量操作大约需要35ns(这包括获取锁定,执行增量,并释放锁定).