wikiページを読むと、ロードとストア用のcheckValidateとコミットシステムがあるように見えるので、私は混乱しています。同期の問題を解決することが目的ですか? それは現在のハードウェアの上に構築されたソフトウェア プログラミングですか、それとも ISA を介したハードウェア実装ですか? 各 (HW/SW) 実装の違いは何ですか?
ありがとう。
wikiページを読むと、ロードとストア用のcheckValidateとコミットシステムがあるように見えるので、私は混乱しています。同期の問題を解決することが目的ですか? それは現在のハードウェアの上に構築されたソフトウェア プログラミングですか、それとも ISA を介したハードウェア実装ですか? 各 (HW/SW) 実装の違いは何ですか?
ありがとう。
トランザクション メモリは、ロックではなくトランザクションを使用して、並列で実行されメモリを共有するプロセスを同期するという概念です。
非常に単純化したレベルでは、ロックと同期するには、異なるスレッドで同時に実行してはならないコードのセクション (クリティカル セクションと呼ばれる) を特定し、クリティカル セクションのロックを取得して解放します。各ロックは一度に 1 つのスレッドしか保持できないため、これにより、1 つのスレッドがクリティカル セクションに入ると、別のスレッドが同じロックによって保護されているクリティカル セクションに入る前に、セクションのすべての操作が完了することが保証されます。
代わりに、トランザクション メモリを使用すると、コードのセクションをトランザクションとして指定できます。トランザクション メモリ システム (ハードウェア、ソフトウェア、またはその両方で実装できます) は、複数のスレッドがトランザクションを並行して実行するプログラムの実行が、別のプログラムの実行と同等であることを保証しようとします。すべてのトランザクションが次々に実行され、同時に実行されることはありません。
トランザクショナル メモリ システムは、トランザクションを並行して実行できるようにし、トランザクション変数へのアクセスを監視することでこれを行います。システムが 2 つのトランザクションの同じ変数へのアクセスの競合を検出すると、そのうちの 1 つが中止され、実行中のトランザクションの先頭に「ロールバック」されます。その後、トランザクションが自動的に再開され、システムの全体的な状態は、以前の実行を開始したことがないかのようになります。
トランザクショナル メモリの 1 つの目標は、プログラミングの容易さと安全性です。トランザクションが正しく使用されることを強制できる適切に実装された TM システムは、確実な保証を提供します。プログラムに並列処理のバグ (デッドロック、競合状態など) がなく、プログラマーがトランザクションを指定するだけでよい (システムがすべてのメモリを暗黙的にトランザクション変数と見なしていない場合は、トランザクション変数も) 、必要なロックを正確に特定する必要はなく、デッドロックを防ぐために正しい順序でそれらを取得するなど。「トランザクションが正しく使用されている」とは、トランザクション変数を経由せずにスレッド間でデータを共有しないこと、トランザクション変数へのアクセスがないことを意味します。トランザクション以外のデータ、およびトランザクション内の「ロールバックできない」操作はありません)。C、Java などの命令型言語用のライブラリ ベースのソフトウェア トランザクション メモリ システムは、一般に、これらすべてを強制することはできません。
トランザクション メモリのもう 1 つの目標は、並列処理を増やすことです。何らかのデータ構造にアクセスする並列操作が多数あり、そのすべてが書き込み可能であり、実際に書き込みを行う操作はほとんどない場合、通常、ロックベースの同期では、データ破損の可能性を回避するために、すべての操作を連続して実行する必要があります。 . トランザクション メモリを使用すると、ほとんどすべての操作を並行して実行できますが、並列性が失われるのは、一部のプロセスが実際にデータ構造に書き込みを行う場合のみです。
実際には (私が数年前に名誉プロジェクトを調査した時点で)、ハードウェア ベースのトランザクション メモリはあまり普及しておらず、現在のソフトウェア トランザクション メモリ システムにはかなりのオーバーヘッドがあります。そのため、ソフトウェア トランザクショナル メモリは、絶対的な最大のパフォーマンスを提供するのではなく、「利用可能なプロセッサに合わせて適度にスケーリングされ、コーディングが非常に簡単な合理的なパフォーマンス」を目的としています。
ただし、異なるトランザクショナル メモリ システム間には多くのばらつきがあります。ここでは、非常に抽象的で単純化されたレベルで話しています。
gcc Wikiから:
一般に、実装には次の 2 つの形式があります。 ソフトウェア トランザクショナル メモリ (STM) システムは、ロックまたはその他の標準的なアトミック命令を使用してそのジョブを実行します。 ハードウェア トランザクション メモリ (HTM) システムは、マルチワード同期を使用します。 トランザクションの要件を直接実装するための CPU の操作 (たとえば、Rock プロセッサを参照してください)。ほとんどの HTM システムが最適である可能性が高いため エフォート機能 (つまり、すべてのトランザクションが HTM を使用して実行できるわけではありません)、 HTM を組み込んだ実用的な TM 実装には、STM コンポーネントもあります。 したがって、ハイブリッド トランザクション メモリ システムと呼ばれます。
実装レベルでは、トランザクション メモリはキャッシュ レイヤーの一部です。これにより、ソフトウェアはメモリに対していくつかの操作を「試行」し、システム内の他のマルチプロセッサが読み取りまたは書き込みされたメモリを変更していない場合にのみ、後でそれらを「コミット」できます。ほとんどのアクセスが衝突しない非常に並列な SMP 環境では、これは、すべてのスレッドが同じ (非常に競合する) 同期プリミティブをロックするよりも高速になる可能性があります。
ただし、コミットが失敗した場合、ソフトウェアはトランザクションを回復 (「ロールバック」) できる必要があるため、アプリケーション プログラマーの作業はより困難になります。