「キャッシュする」とは、何かを隠すことを意味します。コンピューティングにおけるキャッシュの機能は、メイン メモリへのアクセスを可能な限り先取りすることによって、メイン メモリへの距離を隠すことです。
これは、以前にデータを使用していて、まだキャッシュからプッシュしておらず、他の誰もデータを削除していない場合にのみ機能します。他のアクター (他の CPU、IO-Bus など) は、キャッシュされている場合でも、現在の値を取得して変更できる必要があります。このタスクは、キャッシュ コヒーレンシ プロトコルを使用して実行されます。高いコヒーレンスは、より高いコストを意味します。
あなたのコードがやろうとしているのは、コンパイラに条件付き移動を発行させることです。そのため、CPU は 0 をチェックし、0 でない場合にのみ書き込みます。Intel/AMD IS および他の多くの条件付き移動命令のファミリ全体があります。
だから今、一歩一歩:
- 0 のテスト: CPU がテストされたデータのコピーを持っていない場合は、1 つ要求する必要があります。それは以前よりもはるかに悪いです。メインメモリにヒットしないことを祈りましょう。
- 値を書き込む準備をします。
- あなたはデータを所有しています: すばらしい、あなたはすでに終わっています。
- あなたはデータを所有していません: キャッシュは、兄弟層と上位層を呼び出して、この部分を所有していることを通知します。他の誰もコピーを保持できません。
- 値を書き込む: キャッシュは変更を保存し、キャッシュライン (キャッシュの最小粒度) をダーティとしてマークし、書き戻す必要があります。
それで、それは価値がありますか?場合によります。
余談ですが、条件付きジャンプとストアを使用してそれらを合成できるのに、なぜ条件付きストア命令を提供するのでしょうか? 利点は、使用する命令が少なく、命令パイプライン (命令に続いて部分的に実行される) をフラッシュするリスクがないことです。更新: x86/x86_64 では、レジスタ/イミディエイトからメモリに移動できないようです。