web-dev-qa-db-ja.com

ハードウェアレベルでアトミック操作はどのように実装されますか?

アセンブリ言語レベルでは、命令セットアーキテクチャが比較およびスワップと同様の操作を提供していることがわかります。ただし、チップがこれらの保証を提供する方法がわかりません。

私が想像しているように、命令の実行は

  1. メモリから値を取得する
  2. 値を比較する
  3. 比較によっては、別の値をメモリに格納する可能性があります

最初のコアがフェッチした後、新しい値を設定する前に、別のコアがメモリアドレスにアクセスするのを妨げているものは何ですか。メモリコントローラーはこれを管理しますか?

編集:x86の実装が秘密である場合、どのプロセッサフ​​ァミリがどのように実装するかを聞いて喜んでいます。

41

これは、ユーザーレベルのロックにほとんど光を当てない、software.intel.comの article オーバーです。

ユーザーレベルのロックでは、プロセッサのアトミック命令を利用して、メモリ空間をアトミックに更新します。アトミック命令は、命令のロックプレフィックスを利用し、宛先オペランドをメモリアドレスに割り当てます。次の命令は、現在のIntelプロセッサでロックプレフィックスを使用してアトミックに実行できます:ADD、ADC、AND、BTC、BTR、BTS、CMPXCHG、CMPXCH8B、DEC、INC、NEG、NOT、OR、SBB、SUB、XOR、XADD、およびXCHG。 [...]ほとんどの命令では、ロックプレフィックスを明示的に使用する必要があります。ただし、xchg命令では、命令にメモリアドレスが含まれる場合にロックプレフィックスが含まれます。

Intel 486プロセッサの時代には、バスのロックをアサートするためにロックプレフィックスが使用され、パフォーマンスに大きな影響がありました。 Intel Pentium Proアーキテクチャ以降、バスロックはキャッシュロックに変換されます。ロックがキャッシュ不可のメモリにある場合、またはロックがキャッシュラインの境界を超えてキャッシュラインを分割している場合、最新のアーキテクチャではバス上でロックがアサートされます。これらのシナリオはどちらも起こりそうにないので、ほとんどのロックプレフィックスは、はるかに安価なキャッシュロックに変換されます。

では、別のコアがメモリアドレスにアクセスするのを妨げているものは何でしょうか。 キャッシュコヒーレンシプロトコル はすでにキャッシュラインのアクセス権を管理しています。したがって、コアがキャッシュラインへの(一時的な)排他的アクセス権を持っている場合、他のコアはそのキャッシュラインにアクセスできません。そのキャッシュラインにアクセスするには、他のコアが最初にアクセス権を取得する必要があり、それらの権限を取得するプロトコルには現在の所有者が関与します。実際、キャッシュコヒーレンシプロトコルは、他のコアがキャッシュラインにサイレントにアクセスするのを防ぎます。

ロックされたアクセスが単一のキャッシュラインにバインドされていない場合、状況はさらに複雑になります。ページ境界を越えてロックされたアクセスなど、あらゆる種類の厄介なコーナーケースがあります。Intelは詳細を知らせず、ロックを高速化するためにおそらくあらゆる種類のトリックを使用します。

31
Mackie Messer

これの実装例は LL/SC です。この場合、プロセッサは実際にアトミック操作を完了するために使用される追加の命令を持っています。そのメモリ側には、キャッシュの一貫性があります。最も一般的なキャッシュコヒーレンシプロトコルの1つは MESIプロトコル です。 。

4
Josh

キャッシュコヒーレンシプロトコル自体では、アトミック操作を実装するには不十分です。アトミック増分を実装したいとしましょう。以下は関連するステップです

  1. キャッシュからレジスタに値をロードします
  2. レジスタにロードされた値をインクリメントします
  3. 更新された値をキャッシュに戻す

したがって、上記の3つの命令をアトミックな方法で実装するには、必要な値を含むキャッシュラインへの排他的アクセスを最初に取得する必要があります。排他的アクセスを取得したら、「保存」操作が完了するまで、このキャッシュラインへの排他的アクセスを放棄しないでください。これは、アトミック命令を実行するCPUが、このキャッシュラインのキャッシュコヒーレンシプロトコルメッセージに応答しないことを意味します。悪魔はこれがどのように実装されるかの詳細にありますが、少なくともそれは私たちにメンタルモデルを与えます

以下は、Linus Torvaldsがアトミック命令について述べたことです。

アトミック命令は、ストアバッファーをバイパスするか、少なくともactのようにバイパスします。実際にはストアバッファーを使用する可能性がありますが、ロードの前にそれと命令パイプラインをフラッシュし、後でドレインされるまで待機します。キャッシュラインをロックし、ロードの一部として受け取り、ストアの一部として解放します。これは、キャッシュラインがその間を離れず、他の人がストアバッファーの内容を表示できないようにするためです。起こっている。

1
rahul

メモリコントローラーは、さまざまなプロセッサのメモリとキャッシュの整合性を維持することのみを担当します。CPU1のメモリに書き込むと、CPU2はキャッシュから何かを読み取ることができなくなります。両方が同じデータを操作しようとしていることを確認することは責任ではありません。ロックとアトミック操作に使用される低レベルの命令がいくつかあります。これらはOSレベルで、メモリの小さなチャンクを操作してミューテックスやセマフォなどを作成するために使用されます。これらは、文字どおり1バイトまたは2バイトのメモリであり、アトミックで同期された操作を実行する必要があります。次に、アプリケーションはこれに基づいて構築され、より大きなデータ構造とリソースで操作を実行します。

0