2017-03-02 8 views
0

私はC++でプログラムし、スレッド同期のためにCAS操作を使用します。'__atomic_compare_exchange'のassmblyコードを理解するのが難しい

私はVtuneを使用して自分のプログラムをプロファイリングし、CASの操作に膨大な時間を費やしていることがわかりました。

私はアセンブリコードを見ました。

enter image description here

プロファイリング結果が '(%のRDI)、cmpxchgq%RCXロック' 時間のかなりの部分が 'MOVQの%のRAX、(%のRSI)' ではなく、上に費やされていることを示しています。

CASオペレーションに関連する「movq%rax、(%rsi)」の演算はどのように行われますか? この操作で移動されるデータはどれですか?

+0

はプレーンテキストとしてここにコード、エラーやテキスト出力を投稿してください次の命令に起因する、しないように難しいことができ、画像のように読んだり、コードをテストしたり回答に使うのにコピー貼り付けたり、スクリーンリーダーを使っている人には敵対的です。質問を編集して、質問の本文にコードを追加することができます。 '{}'ボタンを使ってコードのブロックを整形するか、同じ効果のために4つのスペースをインデントします。 – tadman

答えて

2

lock cmpxchgqには長い時間がかかります。プロファイラが現在プログラムがどこにあるかを判断するときに、命令が実行されるのを待ってから実行することがあります。これは、長い、割り込み不可能な命令の後の命令が、実際にはそれほど長い前の命令であるときに長い時間を取っていると報告する原因となる。

1

実際にはロックされていますが、今回はcmpxchgが取っています。 この説明VTune release notesに言及した以下の制限があります: 実行時間は、(200108041)

関連する問題