2017-03-02 107 views
0

我在C++中编程并使用CAS操作进行线程同步。理解'__atomic_compare_exchange'的组合代码的困难

我通过使用Vtune对我的程序进行了剖析,发现大部分时间都花在了CAS操作上。

我看了一下汇编代码。

enter image description here

剖析结果表明时间的显著部分花费在 'MOVQ%RAX,(%RSI)',但不能在 '锁定cmpxchgq%RCX,(%RDI)'。

'movq%rax,(%rsi)'的运算是如何与CAS操作相关的? 该操作正在移动哪些数据?

+0

请在这里发表代码,错误或文本输出为纯文本,不作为可能很难图片阅读,不能被复制粘贴以帮助测试代码或在答案中使用,并且对使用屏幕阅读器的人是不利的。您可以编辑您的问题以在您的问题正文中添加代码。使用'{}'按钮来格式化任何代码块,或使用四个空格缩进以获得相同的效果。 – tadman

回答

2

lock cmpxchgq需要很长时间。当剖析器确定当前程序的位置时,它有时必须等待指令完成执行才能找出。这导致紧接着长时间,不可中断指令的指令被报告为占用大量时间,当它真的是前面的指令非常冗长时。

1

它实际上是锁定cmpxchg正在这个时间。 有这解释了这VTune release notes提到以下限制: 运行时间被归属到下一条指令(200108041)