12

libuv sourceで、次のコードを見つけました。

  /* The if statement lets the compiler compile it to a conditional store.
   * Avoids dirtying a cache line.
   */
  if (loop->stop_flag != 0)
    loop->stop_flag = 0;

誰かがこれを少し説明できますか?

キャッシュラインとは正確には何ですか?

また、条件付きストアは、何かをチェックし、成功した場合は何らかの値を書き込むアセンブラー命令であると思います。右?

そのような構造が意味を持つのはいつですか?そうしないと、コンパイラは常に条件付きストアを使用するだけなので、常にではないと思いますよね?

4

2 に答える 2

1

「キャッシュする」とは、何かを隠すことを意味します。コンピューティングにおけるキャッシュの機能は、メイン メモリへのアクセスを可能な限り先取りすることによって、メイン メモリへの距離を隠すことです。

これは、以前にデータを使用していて、まだキャッシュからプッシュしておらず、他の誰もデータを削除していない場合にのみ機能します。他のアクター (他の CPU、IO-Bus など) は、キャッシュされている場合でも、現在の値を取得して変更できる必要があります。このタスクは、キャッシュ コヒーレンシ プロトコルを使用して実行されます。高いコヒーレンスは、より高いコストを意味します。

あなたのコードがやろうとしているのは、コンパイラに条件付き移動を発行させることです。そのため、CPU は 0 をチェックし、0 でない場合にのみ書き込みます。Intel/AMD IS および他の多くの条件付き移動命令のファミリ全体があります。

だから今、一歩一歩:

  • 0 のテスト: CPU がテストされたデータのコピーを持っていない場合は、1 つ要求する必要があります。それは以前よりもはるかに悪いです。メインメモリにヒットしないことを祈りましょう。
  • 値を書き込む準備をします。
    • あなたはデータを所有しています: すばらしい、あなたはすでに終わっています。
    • あなたはデータを所有していません: キャッシュは、兄弟層と上位層を呼び出して、この部分を所有していることを通知します。他の誰もコピーを保持できません。
  • 値を書き込む: キャッシュは変更を保存し、キャッシュライン (キャッシュの最小粒度) をダーティとしてマークし、書き戻す必要があります。

それで、それは価値がありますか?場合によります。

余談ですが、条件付きジャンプとストアを使用してそれらを合成できるのに、なぜ条件付きストア命令を提供するのでしょうか? 利点は、使用する命令が少なく、命令パイプライン (命令に続いて部分的に実行される) をフラッシュするリスクがないことです。更新: x86/x86_64 では、レジスタ/イミディエイトからメモリに移動できないようです。

于 2014-03-28T16:50:28.770 に答える