2017-03-02 109 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)