我想知道如何分析并行线程互斥,看是否有在我的代码任何锁定的争点。 (谁喜欢有争议的代码,对不对?:)我知道该怎么做的代码更一般的分析,因为我提到这里 。 但我想知道是否有可用的能够剖析互斥锁,将提供有关互斥锁争用,看看我是否有任何问题领域指标/统计工具或选项。
这里的一些背景和情况:
最近我的工作使用了Cavium的Octeon CPU的嵌入式C ++项目。 OCTEON对SDK实现使用自旋锁互斥风格同步。 通过的Octeon文档看,我碰到一个方式来配置文件中的螺旋锁,可以看到每个自旋锁有多少次旋转,而等待锁变得可用。 要使用此我不得不做一个条件编译,然后将每次的自旋锁纺递增计数器,然后我可以查询微调等待值。 所以,我所做的是封装自旋锁,并添加到转储自旋锁微调等待值全部在系统中使用的自旋锁的能力。 实际值didnt多大的意义,但也有一些比其他是有非常高的值,我把重点放在减少对那些争。
我知道这可能是对自旋锁很容易,因为它只是每旋转计数器,而是通过相关的并行线程手册页和头文件我还没有发现任何类似的阅读,有没有可用于并行线程互斥的东西吗?
我真的想避免做一些哈克喜欢拍照的时间前后各锁之后。
PS:什么是互斥的复数形式呢? 互斥,muteces,mutexi,穆蒂??? 互斥从未响起我的权利。
在valgrind
工具DRD ,您可以指定多长时间的锁定限制报告错误之前等待上的限制。
该网站提到drd
,也提到自己的工具,叫做mutrace
它看起来像你后的一种工具。 它会告诉你:
- 互斥了多少次锁定
- 互斥拥有线程多少次改变
- 互斥了多少次争辩(已被锁定,当锁定请求作出)
- 在持续一个互斥体被锁定的各种统计数据
如
mutrace: 10 most contended mutexes:
Mutex # Locked Changed Cont. tot.Time[ms] avg.Time[ms] max.Time[ms] Type
35 368268 407 275 120,822 0,000 0,894 normal
5 234645 100 21 86,855 0,000 0,494 normal
26 177324 47 4 98,610 0,001 0,150 normal
19 55758 53 2 23,931 0,000 0,092 normal
53 106 73 1 0,769 0,007 0,160 normal
25 15156 70 1 6,633 0,000 0,019 normal
4 973 10 1 4,376 0,004 0,174 normal
75 68 62 0 0,038 0,001 0,004 normal
9 1663 52 0 1,068 0,001 0,412 normal
3 136553 41 0 61,408 0,000 0,281 normal
... ... ... ... ... ... ... ...
mutrace: Total runtime 9678,142 ms.
你没有提到你的操作系统。 如果它的Linux,我用LTT相当多的这种分析的。 它可以在两种模式下是有用的:
性能分析 - 例如分析您的系统规范使用N秒,然后分析数据
异常分析 - 例如,它运行在周围“飞行记录仪”模式的时钟(记录活动的最后一个N秒)和一些特殊的条件触发停止飞行记录器。 进来的第二天早晨和分析数据。
我一直在使用,现在看到的“互斥”的互斥体的复数多年无投诉。 ;>
你可能想也给英特尔VTune一试。 这将报告等待时间和等待计对每个同步原语的调用堆栈过。 来看看这文件,看看这是你在找什么http://software.intel.com/sites/products/documentation/hpc/amplifierxe/en-us/2011Update/lin/start/analyzing_locks_linux.pdf
我发现“mutrace” ,同时探索用于同样用途的情况。 我没有用,虽然它尚未。 因为它不会影响运行时就像在Valgrind的这听起来不错。
它已经6年多,但对参考我想补充的另一个链接,这应该显示您的互斥争关闭CPU时间跟踪。 http://www.brendangregg.com/offcpuanalysis.html