2017-03-02 4 views
0

Ich programmiere in C++ und benutze CAS-Operation für die Thread-Synchronisation.Schwierigkeiten beim Verstehen des Assembler-Codes von "__atomic_compare_exchange"

Ich profilierte mein Programm mit Vtune und stellte fest, dass ein großer Teil der Zeit für den CAS-Betrieb aufgewendet wurde.

Ich schaute auf den Assembler-Code.

enter image description here

Das Profilierungser zeigt, dass der signifikante Teil der Zeit auf 'movq% Rax, (% rsi)' ausgegeben wird, aber nicht auf 'Lock cmpxchgq% RCX, (RDI%)'.

Wie ist 'movq% rax, (% rsi)' im Zusammenhang mit CAS-Betrieb? Welche Daten werden durch diesen Vorgang verschoben?

+0

Bitte Postleitzahl, Fehler oder Textausgabe hier als Klartext, nicht als Bilder, die hart sein kann, lesen, kann nicht kopiert werden, um Code zu testen oder in Antworten zu verwenden, und sind feindlich gegenüber denen, die Bildschirmleser verwenden. Sie können Ihre Frage bearbeiten, um den Code im Hauptteil Ihrer Frage hinzuzufügen. Verwenden Sie die Schaltfläche '{'} ', um beliebige Codeblöcke zu formatieren, oder versehen Sie sie mit vier Leerzeichen für denselben Effekt. – tadman

Antwort

2

Die lock cmpxchgq dauert sehr lange. Wenn der Profiler feststellt, wo sich das Programm gerade befindet, muss es manchmal darauf warten, dass ein Befehl ausgeführt wird, bevor er es herausfinden kann. Dies führt dazu, dass der Befehl, der einem langen, nicht unterbrechbaren Befehl folgt, als sehr viel Zeit beansprucht wird, wenn es sich tatsächlich um den vorherigen Befehl handelt, der so lang ist.

1

Es ist eigentlich Sperre cmpxchg nimmt diese Zeit. Es gibt die folgende Einschränkung in VTune release notes erwähnt, die dies erklärt: Laufzeit wird auf den nächsten Befehl zugeschrieben (200.108.041)

Verwandte Themen