JP5284103B2 - ソフトウェアトランザクショナルメモリ動作の最適化 - Google Patents

ソフトウェアトランザクショナルメモリ動作の最適化 Download PDF

Info

Publication number
JP5284103B2
JP5284103B2 JP2008544369A JP2008544369A JP5284103B2 JP 5284103 B2 JP5284103 B2 JP 5284103B2 JP 2008544369 A JP2008544369 A JP 2008544369A JP 2008544369 A JP2008544369 A JP 2008544369A JP 5284103 B2 JP5284103 B2 JP 5284103B2
Authority
JP
Japan
Prior art keywords
block
stm
transaction
memory
log
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2008544369A
Other languages
English (en)
Other versions
JP2009523271A (ja
Inventor
ローレンス ハリス ティモシー
ロナルド プレスコ マーク
イー.シナル アブラハム
リード タルディティ ジュニア デビッド
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of JP2009523271A publication Critical patent/JP2009523271A/ja
Application granted granted Critical
Publication of JP5284103B2 publication Critical patent/JP5284103B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/466Transaction processing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Executing Machine-Instructions (AREA)

Description

本願は、2005年12月7日出願の米国特許仮出願第60/748,386号明細書の利益を主張する2006年3月23日出願の米国特許出願第11/389,451号明細書の利益を主張するものである。
マルチスレッドプロセスの複数のスレッドが並行実行中に共通のメモリ位置を共有することが、一般的である。その結果、マルチスレッド式プロセスの2つの異なるスレッドが、プログラムによってアクセス可能な同一のメモリ位置を読み取り、更新する可能性がある。しかし、一方のスレッドが共有メモリ位置の値に依存する動作のシーケンスの途中である間に、他方のスレッドがその値を変更しないことを保証するために注意を払わなければならない。
例えば、あるプログラムが、2つの異なるソフトウェアオブジェクトの内容にアクセスしており、各オブジェクトが、異なる銀行口座の金額を表すと仮定する。当初に、第1口座の金額は10ドルであり、メモリアドレスA1にストアされ、第2口座の金額は、200ドルであり、メモリアドレスA2にストアされる。バンキングプログラムの第1スレッドは、A2からA1に100ドルを転送するようにコーディングされ、第2スレッドは、両方の口座の資金の総額を計算するようにコーディングされている。第1スレッドは、A1の内容に100ドルを加算し、これを110ドルに更新することによって開始し、その後、A2の内容から100ドルを減算し、これを100ドルに更新することに進む。しかし、第2スレッドが、この2つの動作の間に実行される場合に、第2スレッドは、210ドルという正しい合計ではなく、両方の口座の310ドルという不正な合計を計算する場合がある。
ソフトウェアトランザクショナルメモリは、スレッドが一連の共有メモリアクセスを安全に実行できるプログラミング抽象化を提供し、スレッドが、別のスレッドからの干渉なしでそのトランザクションを完了することを可能にする。したがって、トランザクショナルメモリをソフトウェアで使用して、第1スレッドの例示的な加算演算および減算演算を含むトランザクションが、メモリ位置A1およびA2に関して「原子的」であり、したがって、第2スレッドが両方の口座の正しい総額を計算するようになることを保証することができる。
しかし、ソフトウェアでトランザクショナルメモリを実施する既存の手法は、性能問題をこうむる。例えば、1つの既存手法では、あるスレッドがトランザクション内でメモリ位置のシーケンスにアクセスするときに、そのスレッドは、それがトランザクション中に読み取り、更新する(すなわち、書き込む)ことを望むメモリ位置および値の別々のリストを維持し、その後、このトランザクションの終りに、そのスレッドが、実際の共有メモリ位置のこれらの値のすべてを更新する。このトランザクション中に、そのスレッドがそのリスト内のメモリ位置のいずれかを再読取するか再書込することを望む場合に、そのスレッドは、エントリにアクセスするためにリスト内のメモリ位置のエントリを検索しなければならず、これは、プログラム的に低速の仕事である。したがって、ソフトウェアでトランザクショナルメモリを実施するこの間接的方法は、低い性能に悩まされる。
さらに、ソフトウェアでトランザクショナルメモリを実施する既存の手法は、トランザクショナルメモリへの不必要な呼出しおよびレコードを保持する命令を含むかなりのオーバーヘッドを導入し、特にこれらの命令が非効率的な形で実行される場合に、プログラムの実行に損害を与える。さらに、一部のトランザクショナルメモリ方式に固有のレコードを保持するアクティビティは、それらが作成するレコードの作成および維持を効果的に制限せず、これは、メモリならびにディスクスペースおよび他のシステムリソースを浪費する可能性がある。
ソフトウェアトランザクショナルメモリシステム(「STM」)を説明する。本明細書で説明するシステムおよび技法は、ソフトウェアトランザクショナルメモリ命令に対する最適化を実行して、効率的なパフォーマンスを達成する。ソフトウェアトランザクショナルメモリブロックをソフトウェアトランザクショナルメモリ命令に置換し、さらに、これらの命令を分解されたソフトウェアトランザクショナルメモリ命令に分解するコンパイラを説明する。このコンパイラは、命令セマンティクスの知識を利用して、伝統的なソフトウェアトランザクショナルメモリシステムでは使用不能な最適化を実行する。このコンパイラは、さらに、STMコードに対する高水準最適化を実行する。これらの最適化の一部は、低水準最適化を活用するために実行される。これらの高水準最適化は、不必要なread−to−updateアップグレードの除去、プロシージャ呼出しの前後でのSTM動作の移動、および新たに割り振られたオブジェクトに対する不必要な動作の除去を含む。さらに、STMコードは、トランザクションの外部で書き込まれるメモリアクセスに対する強い原子性を提供するように最適化される。
一例で、処理ユニットと、ソフトウェアトランザクショナルメモリ動作の知識を用いて構成されたコンパイラとを含むコンピュータシステム内で、ソフトウェアトランザクショナルメモリブロックを含むプログラムをコンパイルする方法を説明する。この方法は、ソフトウェアトランザクショナルメモリ命令を含む最適化されたプログラムを作成するためにプログラムを最適化することと、最適化されたプログラムをコンパイルすることとを含む。
この「課題を解決するための手段」は、下の「発明を実施するための最良の形態」でさらに説明する概念の抜粋を単純化された形で紹介するために提供される。この「課題を解決するための手段」は、請求される主題の主要な特徴または本質的特徴を識別することを意図されたものではなく、請求される主題の範囲を判定する際の助けとして使用されることを意図されたものでもない。
追加の特徴および利益は、添付図面を参照して進行する、実施形態の次の詳細な説明から明白になる。
本明細書で示す例は、ソフトウェアベースおよびハードウェアベースのトランザクショナルメモリシステムおよびこれらのシステムでの性能改善の例を説明する。具体的に言うと、下の実施態様の例は、分解されたソフトウェアトランザクション動作、コード最適化を可能にするためのコンパイラ中間表現(「IR」)でのSTMプリミティブの使用(この用語は下で説明する)、これらのプリミティブに関する性能を改善するように働くコンパイラの改善、アソシアティブテーブル(associative table)を使用するランタイムログフィルタリング、および効率的なランタイムのオブジェクトごとの動作を説明する。本明細書で提供される説明は、特定のソフトウェアトランザクショナルメモリ実施態様の最適化として提供されるが、本明細書で説明する技法およびシステムが、様々な実施態様で動作でき、必ずしも本明細書で説明する技法の実施態様、性能、または要件に対する限定を暗示しないことを理解されたい。
1.ソフトウェアトランザクショナルメモリシステムの例
原子的ブロックは、並行プログラムを記述するという問題に対する有望な単純化を提供する。本明細書で説明するシステムでは、あるコードブロックが、原子的とマークされ、コンパイラおよびランタイムシステムは、関数呼出しを含むそのブロック内の動作が原子的に見えることを提供する。プログラマは、もはや、手動ロック、低水準競合条件、またはデッドロックを気にする必要がなくなる。原子的ブロックは、例外回復をも提供することができ、これによって、あるブロックが例外によって終了される場合に、そのブロックの副作用がロールバックされる。これは、シングルスレッドアプリケーションにおいても貴重である。というのは、エラーハンドリングコードが、しばしば、記述しテストするのが難しいからである。原子的ブロックの実施態様は、大規模マルチプロセッサマシンにもスケーリングされる。というのは、この実施態様が、並列性を保存するからであり、原子的ブロックは、あるブロックで更新される位置が他のブロックのいずれにおいてもアクセスされない限り、並行に実行することができる。これは、従来のデータキャッシュで許容される種類の共有を保存する。
本明細書で説明する技法は、コンパイラおよびランタイムシステムに緊密に統合されたSTM実施態様に関連するようにされる。この実施態様の1つの特徴は、直接更新STMであることである。これは、オブジェクトのプライベートシャドウコピーを操作するのでも、オブジェクト参照と現在のオブジェクト内容との間の余分なレベルのインダイレクションを介するのでもなく、オブジェクトをヒープ内で直接に更新することを可能にする。これは、成功してコミットされるトランザクションについてより効率的である。
本明細書で説明するシステムおよび技法は、分解されたSTMインターフェースを提供する実施態様の特徴を利用する。例えば、トランザクショナルストアobj.field=42は、(a)objが現在のスレッドによって更新されようとしていることを記録するステップと、(b)fieldが保持する古い値をログ記録するステップと、(c)新しい値42をfieldにストアするステップとに分割される。この新設計は、トランザクション動作に対して古典的な最適化を提供することを可能にする。例えば、この例の3つのステップは、コンパイラによって別々に処理され、(a)および(c)は、しばしばループからホイストすることができる。本明細書で説明する技法では、分解されたSTMインターフェースは、STMインターフェースおよびセマンティクスの特定の知識を有し、特にこのインターフェース上で働くように構成された最適化を実行できるコンパイラの使用を介して、より効率的にされる。
もう1つの例で、本明細書で説明するシステムおよび技法は、統合されたトランザクションバージョニングを利用する効率的なオブジェクトごとの動作を介する、説明されるSTM実施態様の効率を示す。これらの実施態様は、既存のオブジェクトヘッダワードを用いるトランザクショナルバージョニングの統合を使用する。これは、他のSTMシステムとは異なる。というのは、これらのシステムが、バージョニングレコードの外部テーブル、追加のヘッダワード、またはオブジェクト参照と現在のオブジェクト内容との間のインダイレクションのレベルのいずれかを使用するからである。これらの手法は、低いキャッシュ局所性を引き起こすか、スペース使用量を増やす。本明細書で説明する実施態様は、膨張させられた(inflated)ヘッダワードを、トランザクショナルコミット中のオブジェクト変更のすばやい検証を可能にする効率的なスナップショット命令と共に利用する。
さらに、ランタイムログフィルタリングを説明する。このフィルタリングは、すべての不必要なSTM動作をコンパイル時に静的に識別できるわけではないので、有用である。
一実施態様で、本明細書で説明する例は、Bartokすなわち、Microsoft .NETプラットフォームと対抗する性能を有する共通中間言語(CIL)プログラムの最適化ahead−of−time研究コンパイラおよびランタイムシステムで実施される。このランタイムシステムは、ガーベジコレクタおよび新しいSTMを含めてCILで実施することができる。
1.1 セマンティクス
本明細書で説明する技法は、原子的ブロックの実行に焦点を合わせたものである。様々な実施態様は、ロックするコードとの原子的ブロックの相互作用、およびこれらの技法を利用し続けながらの原子的ブロックとの入出力動作の組合せを含めて、正確なセマンティクスにおいて異なる可能性がある。
1.2 設計の仮定
本明細書で説明する例では、原子的ブロックをどのように使用するかに関していくつかの仮定を行う。これらは、必ずしも本明細書で説明する実施態様に対する限定を表すのではなく、説明を容易にするように働くものである。
1つの仮定は、ほとんどのトランザクションが成功してコミットされることである。これは、穏当な仮定である。というのは、第1に、並列性を保存するSTMの使用が、トランザクションが「自発的に」すなわちプログラマが理解できない衝突のゆえに異常終了しないことを意味するからである(代替実施態様では、衝突は、ハッシュ値に基づいて検出され、ハッシュ値は、予期されずに衝突する可能性がある)。これの一部として、プログラマが、キャッシュの間の過度なデータ移動のコストのゆえに、競合を回避する強いインセンティブを既に有すると仮定する。激しい競合動作を単一のスレッドによって管理される作業キューにわたすことなどの技法は、価値があるままである。
第2の仮定は、原子的ブロックで、読取が数において更新に優ることである。この仮定は、現在のプログラムの観察および現在のプログラムのトランザクショナルバージョンを開発する試みから生まれたものである。これは、トランザクショナル読取のオーバーヘッドを特に低く保つことの利益を強調する。読取は、読み取られるオブジェクトのアドレスおよびそのヘッダワードの内容のログ記録だけを伴う。
最後の仮定は、トランザクションサイズを制限してはならないことである。これは、コンポジショナリティを維持すると同時に、トランザクションの長さが増えるときにSTM実施態様が良好にスケーリングする必要があることを暗示する。この設計では、スペースオーバーヘッドは、行われるアクセスの回数ではなく、トランザクションでアクセスされるオブジェクトの量に伴って増加する。本明細書で説明する例では、トランザクションを、非形式的に「短い」または「長い」と称する。短いトランザクションは、STMによるメモリ割振りを一切必要とせずに動作する可能性が高い。長いトランザクションは、その実行がGCサイクルにまたがる可能性が高いトランザクションである(例えば、SPEC95ベンチマークxlispのC#に変換されたバージョンのLISPベンチマークのうちの1つの評価)。
1.3 ワードベースのSTMの例
ワードベースのSTMの1つの従来のインターフェースは、次の2セットの動作を提供する。
Figure 0005284103
第1セットは、トランザクションを管理する。TMStartは、現在のスレッドでトランザクションを開始する。TMAbortは、現在のスレッドのトランザクションを異常終了する。TMCommitは、現在のスレッドのトランザクションをコミットすることを試みる。トランザクションがコミットできない(例えば、一実施態様で、並行トランザクションが、それがアクセスした位置のうちの1つを更新済みなので)場合には、TMCommitは、偽を返し、現在のトランザクションは、破棄される。そうでない場合には、TMCommitは、真を返し、そのトランザクション中に行われたすべての更新が、共有ヒープに原子的に伝搬される。TMIsValidは、呼出しの時点で現在のスレッドのトランザクションをコミットできる場合に限って真を返す。動作の第2セットは、データアクセスを実行する。TMReadは、指定された位置の現在の値、または現在のトランザクション内でTMWriteによって書き込まれた最新の値を返す。
本明細書で説明する技法の一実施態様では、STMを直接にプログラムするプロセスは、コンパイラに、STM動作を使用するように原子的ブロック内のメモリアクセスを書き直させることと、コンパイラに、TMReadおよびTMWriteが1つの原子的ブロック内で行われるすべてのメモリアクセスに使用されることを保証するために、呼び出されるメソッドの特殊化されたバージョンを生成させることとによって自動化される。
上で説明した設計は、その適用可能性を制限する複数の問題から損害を受ける。次のコードの例に、これを示す。下に示す例1aは、センチネルノードthis.Headとセンチネルノードthis.Tailとの間でリンクリストの要素を通って反復する。例1aは、ノードのValueフィールドを合計し、その結果をthis.Sumにストアする。例1bは、すべてのメモリアクセスについてTMReadおよびTMWriteへの呼出しを自動的に配置することの1つの例を示す。
しかし、複数の性能問題が、このワードベースのシステムに関して発生する可能性がある。第1に、TMReadおよびTMWriteの多数の実施態様は、すべてのTMRead動作およびTMWrite動作の際に検索されるトランザクションログを使用する。TMReadは、同一トランザクションによる以前のストアを知らなければならず、したがって、仮更新を保持するトランザクションログを検索する。そのような検索は、大きいトランザクションをサポートするようにスケーリングしない可能性がある。性能は、トランザクションログの長さおよび補助インデックス構造体の有効性に依存する。第2に、STMライブラリへの不透明な呼出しが、最適化を妨げる(例えば、TMReadの挙動がコンパイラに未知なので、this.Tailをループからホイストすることは、もはや不可能である)。最後に、モノリシックなTM動作は、作業の繰り返しを引き起こす。例えば、あるフィールドにループ内でアクセスするときの検索の繰り返しである。
1.4 分解された直接アクセスSTM
分解された直接アクセスSTM実施態様は、本明細書で提供する例で使用されるが、これらの問題に対処する。第1の問題は、トランザクションが、ヒープに対して直接に読取動作および書込動作を実行できるようになり、読取が、先行するトランザクショナルストアを検索なしで自然に見られるようになるシステムを設計することによって対処される。ログは、それでも、異常終了するトランザクションをロールバックするため、およびアクセスされた位置のバージョニング情報を追跡するために、必要である。短いトランザクションの場合に、これらのログはアペンド専用である。したがって、検索は、トランザクションサイズに関わりなく不要である。
第2の問題は、コンパイル中の早期にTM動作を導入し、後続の分析フェーズおよび最適化フェーズがそのセマンティクスを知るようにこれらのフェーズを拡張することによって対処される。最後に、第3の問題は、モノリシックTM動作を別々のステップに分解し、その結果、作業の繰り返しを回避できるようにすることによって対処される。例えば、トランザクションログの管理は、実際のデータアクセスから分離され、しばしば、ログ管理をループからホイストすることを可能にする。
このインターフェースは、トランザクショナルメモリ動作を次の4つのセットに分解する。
Figure 0005284103
最初の2つのセットは、単純であり、現在のスレッドのトランザクションマネージャを入手するDTMGetTMMgrを提供し、その後、通常のトランザクション管理動作を提供する。第3のセットは、競合検出を提供する。DTMOpenForReadおよびDTMOpenForUpdateは、指定されたオブジェクトが読取専用モードでアクセスされることを、または後に更新される可能性があることを示す。静的フィールドへのアクセスは、それらのフィールドの代わりにバージョニング情報を保持するサロゲートオブジェクトによって調停され、DTMAddrToSurrogateは、アドレスをそのサロゲートにマッピングする。最後のセットは、異常終了時に更新をロールバックするのに必要なアンドゥログを維持する。DTMLogFieldStoreは、オブジェクトフィールドへのストアを扱い、DTMLogAddrStoreは、任意のアドレスへのストアを扱う。
これらの動作への呼出しは、原子性を実現するために正しくシーケンシングされなければならない。3つのルールがある、すなわち、(a)位置は、読み取られるときに読取用にオープンされなければならず、(b)位置は、更新されるときまたはストアがそれに関してログ記録されるときに更新用にオープンされなければならず、(c)位置の古い値は、更新される前にログ記録されていなければならない。実際には、これは、あるオブジェクトのあるフィールドに関するTMReadへの呼出しが、DTMGetTMMgr、DTMOpenForRead、およびその後のフィールド読取のシーケンスに分割されることを意味する。TMWriteは、DTMGetTMMgr、DTMOpenForUpdate、DTMLogAddrStore、およびその後のフィールド書込である。静的フィールドに関するTMReadの呼出しは、DTMGetTMMgr、DTMAddrToSurrogate、DTMOpenForRead、およびその後の静的フィールド読取に分割される。TMWriteは、DTMGetTMMgr、DTMAddrToSurrogate、DTMOpenForUpdate、DTMLogAddrStore、および静的フィールド書込である。
次の例に、分解された直接アクセスSTMの使用の例を示す。例1のコードは、センチネルノードthis.Headとセンチネルノードthis.Tailとの間でリンクリストの要素を通って反復する。例1のコードは、ノードのValueフィールドを合計し、その結果をthis.Sumにストアする。例2は、分解された直接アクセスSTMを使用してSumをどのように実施できるかを示す。
例1a
Figure 0005284103
例1b
Figure 0005284103
例2
Figure 0005284103
2.コンパイラ最適化
セクション2では、STM動作の知識を用いて構成されたコンパイラを利用する、分解されたSTM動作の最適化を説明する。本願で使用されるときに、用語「最適化する」、「最適化された」、「最適化」、および類似物が、全般的に特定の改善の度合に一切言及せずに改善を指す技術用語であることに留意されたい。したがって、様々なシナリオで、「最適化」が、システムまたは技法の性能の1つまたは複数の態様を改善する場合があるが、そのシステムまたは技法のすべての態様が改善されることは、必ずしも要求されない。さらに、様々な状況で、「最適化」は、必ずしも任意の特定の最小の度合または最大の度合までの任意の態様の改善を暗示しない。さらに、「最適化された」システムまたは技法が、1つまたは複数の領域での性能改善を示す場合があるが、そのシステムまたは技法が、他の領域での性能の低下を同様に示す場合がある。最後に、「最適化」が、いくつかの状況で、あるシステムまたは技法の性能を改善する場合があるが、その「最適化」が他の状況で性能を低下させることが可能である場合がある。下で説明する特定の状況では、最適化が、冗長なまたは余分なSTM命令またはログ書込の除去をもたらし、おそらくは高められた性能を提供するが、これらの最適化は、決して、すべての可能な冗長なまたは余分な命令の除去をもたらすことを暗示しない。
図1は、ソフトウェアトランザクショナルメモリを利用する最適化されたプログラム120を作成するのに使用されるコンパイラ100の一例を示すブロック図である。図示の例では、コンパイラ100は、入力としてソースコード110をとる。図示されているように、ソースコード110は、1つまたは複数の原子的ブロック115を含む。上で言及したように、一実施態様では、これらの原子的ブロックを含めることが、STMを利用することを望むプログラマの追加のプログラミングを防ぎ、これらのブロックは、分解されたSTM命令を含むようにコンパイラによって変更され、その後、この分解されたSTM命令が最適化される。図1は、単一のソースコードを示すが、これが単に図示を単純にするためであることを理解されたい。本明細書で説明する技法およびシステムは、一緒にコンパイルされる複数のソースコードファイルならびに既にコンパイルされたコードを使用するソースコードにも適用される。さらに、様々な実施態様で、C++、C#、Java(登録商標)、Cおよび他の言語を含む異なるコード言語が使用され、様々な実施態様で、インタープリタ型言語をも最適化することができる。図示の例では、この最適化が、STM最適化150によって実現され、STM最適化150は、コンパイラに統合され、この統合の追加の詳細は、下で述べる。コンパイルおよび最適化の後に、ソフトウェアトランザクショナルメモリを利用する最適化されたプログラム120が作られる。そのような最適化されたプログラムのランタイム動作の追加の詳細を、下でより詳細に説明する。さらに、図示の実施形態は、実行の前の実行可能ファイルへのコンパイルを示すが、本明細書で説明する技法の代替実施態様は、実行の直前または実行と同時にプログラムをコンパイルし、最適化することができる。
図2は、図1のコンパイラ100の、例のコンポーネントを示すブロック図である。図2は、コンパイラを通る、例の動作パスを示す。図2は、特定のモジュールを別々に示すが、様々な実施態様で、これらのモジュールを、様々な組合せでマージし、または分割することができることを理解されたい。パスは、第1コンパイラモジュール220で始まり、第1コンパイラモジュール220は、ソースコード110を受け入れ、それから中間表現230を作成する。一実施態様で、このIRは、制御フローグラフ(「CFG」)の形をとり、これは、本明細書で説明する最適化技法によってそのIRを簡単に操作できるようにする。
次に、IR 230は、最適化モジュール240によって変更されて、最適化されたIR 250が作成される。最適化モジュール240の動作では、伝統的なコンパイラ最適化が、低水準および高水準のSTM固有最適化を用いて拡張される。そのような最適化の例を、下でより詳細に説明する。最後に、最適化されたIR 250が、第2コンパイラモジュール260によって、図1の最適化されたプログラム120などの実行可能コードにコンパイルされる。
図3は、STMを使用するプログラムをコンパイルし、実行する、例のプロセス300の流れ図である。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。このプロセスは、ブロック320で開始され、ここで、トランザクショナルメモリブロック(図1の原子的ブロックなど)を含むソースコードを受け取る。代替実施態様では、ソースコードが、トランザクショナルメモリブロックを含まない場合があるが、ソースコードは、ワードベースの命令または上で説明した分解された命令など、個々のソフトウェアトランザクショナルメモリ命令を含む。次に、ブロック340で、このソースコードを実行可能プログラムにコンパイルする。コンパイルの特定の例を、下でより詳細に説明する。最後に、ブロック360で、実行可能プログラムを実行する。
図4は、トランザクショナルメモリブロックを組み込んだソースコードをコンパイルする、例のプロセス400の流れ図である。プロセス400は、図3のブロック340に対応する。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。このプロセスは、ブロック420で開始され、ここで、ソフトウェアトランザクショナルメモリ命令を、コンパイラ100によって各原子的ブロックに挿入する。一実施態様で、この挿入は、ブロック内の読取または書込のすべてのインスタンスの前後に正しいワードベースの読取STM命令および書込STM命令を挿入することによって実行される。もう1つの実施態様で、プログラマが、彼自身のSTM命令を挿入すると決定する場合に、ブロック420のプロセスを省略することができる。
次に、ブロック440で、ワードベースのSTM命令を、コンパイラ100によって分解された命令に置換する。一実施態様で、既に分解された命令を含むソースコードがコンパイラによって受け取られた場合には、ブロック440のプロセスは、省略される。さらに、いくつかの実施態様で、ブロック420および440のプロセスは、特に、原子的ブロックの受取に直接に応答して、分解されたSTM命令を挿入するために組み合わせることができる。上の例2は、あるコードがブロック440のプロセスの動作の後にどのように見えるかを示す。
ブロック440のプロセスのもう1つの実施態様では、コンパイラは、さらに、ログ動作を分解し、複数の動作にまたがるログ管理作業のコストの割賦償却を可能にすることによって、ログ管理のコストを下げる。具体的に言うと、一実施態様で、DTMOpen*動作およびDTMLog*動作は、現在のアレイ内にスペースがあることのチェックから開始する。DTMOpenForReadの場合に、これは、コードの高速パスバージョンで実行しなければならない唯一のチェックである。これらのチェックのコストを割賦償却するために、コンパイラは、所与のログ内で予約すべきスロットの個数を示す整数をとる新しい動作EnsureLogMemoryを利用する。したがって、DTMOpen*動作およびDTMLog*動作の特殊化された分解されたバージョンは、そのスペースが存在すると仮定することができる。ランタイムブックキーピングを減らすために、一実施態様で、EnsureLogMemory動作は、加法的ではなく、2つの連続する動作が、合計ではなく要求された最大値を予約する。単純にするために、一実施形態は、特殊化された動作を配置せず、この場合に、予約されたスペースは、呼出しまたはバックエッジの後で必要になる。もう1つの実施態様では、予約は、各基本ブロック内の呼出しの間のすべての動作について組み合わされる。もう1つの実施態様では、逆方向分析を使用して、できる限り早く、熱心にスペースを予約し、この予約は、すべての呼出しおよびループヘッダで強制的に停止される。これは、より多くの予約を組み合わせるという利益を有するが、予約を必要としないパスに予約動作を導入する可能性がある。
ブロック460で、コンパイラは、強い原子性のための動作の導入、不必要なSTM動作の移動および除去、ならびに新たに割り振られたオブジェクトに関するログ動作の除去を含む、高水準STM最適化を実行する。このプロセスは、下でより詳細に説明する。最後に、ブロック480で、プログラムを最適化し、この最適化にはSTM命令も含まれる。図4のプロセスは、ブロック460および480での高水準最適化およびそれに続く他の最適化を示し、最適化の反復を示さないが、いくつかの実施態様で、図460および480のプロセスまたはそのサブプロセスを、図示と異なる順序で実行することができ、繰り返すことができる。繰り返しの1つの理由は、ある種の最適化が、他の最適化の機会を明らかにする場合があることである。したがって、それらの機会が生じる可能性があるときにそれらの機会を利用するために、最適化を繰り返して実行することが望ましい可能性がある。
図5は、高水準最適化をSTM命令に対して実行する、例のプロセス500の流れ図である。プロセス500は、図4のブロック460に対応する。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。一実施態様で、プロセス500は、高水準最適化によって追加された命令をコンパイラによってさらに最適化できるようにするために、下で説明するプロセス600のコンパイラ最適化の前に実行される。このプロセスは、ブロック520で開始され、ここで、コンパイラは、強い原子性のための動作を導入する。次に、ブロック540で、後続最適化中のオープン動作の、より後の除去を可能にするために、読取のためにオブジェクトをオープンする動作およびそれに続く更新のために同一オブジェクトをオープンする動作を、open−for−update動作に置換する。一実施態様で、これらのopen−for−read動作およびそれに続くopen−for−update動作を、read−to−updateアップグレードと呼び、ブロック540のプロセスは、これらのアップグレードを除去する。次に、ブロック560で、図6のプロセスでのより強い最適化をもたらすために、分解されたSTM動作をプロシージャ呼出しの前後で移動する。最後に、ブロック580で、ログ記録される、トランザクション内で新たに割り振られたオブジェクトのログ記録動作を、不必要なログ動作呼出しを防ぐために除去する。これらのプロセスのそれぞれの特定の例を、下で図7〜12に関してより詳細に説明する。
2.1.分解されたコードに対するコンパイラ最適化
図6は、STM命令に対して最適化を実行する、例のプロセス600の流れ図である。プロセス600は、図4のブロック480に対応する。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。さらに、図示の実施態様は、各アクションが1回実行される例を与えるが、代替実施態様では、アクションを繰り返すことができる。したがって、例えば、下で説明する共通部分式除去アクションを、コード移動最適化を実行した後にもう一度実行することができる。図6には、非STM命令の最適化が示されていないが、これは、図を単純にするために行われたものであり、本明細書で説明するプロセスに対する限定を示すものではない。
このプロセスは、ブロック620で開始され、ここで、STM命令の変更に対する制約を作成する。一実施態様で、これらの制約は、少なくとも原子性に関するものであり、これは、呼出しのシーケンス内に基づく。したがって、3つのルールがある、すなわち、(a)位置は、読み取られるときに読取用にオープンされなければならず、(b)位置は、更新されるときまたはストアがそれに関してログ記録されるときに更新用にオープンされなければならず、(c)位置の古い値は、更新される前にログ記録されていなければならない。
これらのルールは、複数の方法を使用して実施することができる。1つの方法では、コンパイラが、コンパイル中に様々なハウスキーピング手段を介して制約を追跡する。これは、コンパイルプロセスをすぐに複雑にする可能性があるので、もう1つの実施態様では、CFGを変更して、制約に違反するのを防ぐことができる。そのような方法の1つは、後続命令の入力変数になる、命令のダミー出力変数を作ることによって、呼出し順序を強制するSTM命令の間のダミー変数を使用してデータ依存性を導入することである。したがって、次のように見えるIR(ジェネリック命令を使用する)
Figure 0005284103
は、
Figure 0005284103
になる。
次に、ブロック640で、共通部分式除去(「CSE」)をSTM命令に対して実行し、これに、ブロック660の命令に対する冗長ロードストア除去およびブロック680のコード移動最適化が続く。
一例で、これらの最適化を、DTMGetTMMgr動作に対して実行することができる。というのは、これが、コンスタントであり、したがってCSEの機会を提供するからである。同様に、DTMOpenForRead、DTMOpenForUpdate、DTMAddrToSurrogate、およびDTMLog*動作は、トランザクション内で冪等なので、これらも、CSEまたはコード移動に適格である。この最適化に対する1つの制約は、コード移動が、一実施態様で、トランザクション境界を超えて延びることができないことである。もう1つの実施態様では、CSEが、DTMOpenForUpdateの後に発生するDTMOpenForRead命令の除去をもたらすように拡張される。この最適化を実行できるのは、更新アクセスが読取アクセスを包含するからである。
他の実施態様では、CSEを、ネストされたトランザクションの間の動作に対して実行することができる。したがって、一例で、ネストされたトランザクション内のDTMOpenForRead動作が、外側トランザクションのDTMOpenForReadまたはDTMOpenForUpdateによって包含され、したがって、このDTMOpenForRead動作を除去することができる。もう1つの例では、ネストされたトランザクション内のDTMOpenForUpdateが、外側のトランザクションのDTMOpenForUpdateによって包含され、除去される。
もう1つの実施態様で、DTMGetTMMgr動作を、スレッドごとのThreadオブジェクトからスレッドの現在のトランザクションマネージャをフェッチする(および、必要な場合にはトランザクションマネージャを作成する)ことによって実施することができる。したがって、Bartokコンパイラは、GetCurrentThread命令をも、コード移動の対象であるコンスタントな動作として扱うことができる。
一例として、上のプロセスの実行の後に、例2のコードは、次の、より効率的なコードに単純化される。
例3
Figure 0005284103
2.2.高水準STM最適化
2.2.1 強い原子性の実施
上で説明した技法は、ある原子的ブロック内のメモリアクセスが第2の原子的ブロック内のアクセスに関して分割不能に発生する「原子的」ブロックを作成するのに使用することができる。しかし、あるスレッドによって実行される「原子的」ブロックは、第2スレッドが「原子的」ブロックを使用せずに衝突するメモリアクセスを実行するときに、分割不能に実行するように見えない場合がある。この特徴を有する設計を、「弱い原子性」を提供すると言うことができる。
本明細書で説明する技法の一実施態様は、原子的ブロックが、他の原子的ブロック内で行われるメモリアクセスだけではなく、すべてのメモリアクセスに関して分割不能に実行するように見える「強い原子性」をどのようにして提供するかに関する。
基本的な実施態様は、(a)すべての原子的ブロックの外部で発生する共有メモリへのすべてのアクセスを識別することと、(b)それらを短い原子的ブロックとして書き直すこととによる強い原子性のサポートを用いて、上で説明したSTMを拡張する。
例えば、あるプログラムが、フィールド「o1.x」の内容から読み取り、その結果をフィールド「o2.x」にストアすると仮定する。これは、元々は、コンパイラの中間表現(IR)内で次の2つの命令によって表される。
Figure 0005284103
基本的な実施態様は、これを次のようなコードに展開する。
Figure 0005284103
(いくつかの実施態様で、記述される実際のコードは、コミット動作C1またはC2中に競合がある場合にL1またはL2からトランザクションを再実行するためのコードパスをも含まなければならないので、より複雑である。そのコードの正確な詳細は、SMT動作がIRでどのように表現されるかに非常に依存する)。
この基本的な形は、強い原子性を提供するが、オリジナルのフィールドアクセスのコストを超えるトランザクション開始動作、トランザクションコミット動作、open−for−read動作、open−for−update動作、およびログ記録動作の追加コストのゆえに、性能が低い。
強い原子性実施態様を提供しながらも効率を高めるために、本明細書で説明する技法の一実施態様は、単一のメモリ位置だけにアクセスする短いトランザクションの性能を高めるために特殊化されたIR動作を使用する。
考慮すべき2つのケースすなわち、単一の位置から読み取るトランザクション、および単一の位置を更新するトランザクション(単一の位置に対するread−modify−write動作を実行するトランザクションを含む)がある。両方のケースが、STMワードのチェックを伴うが、これは下でより詳細に説明する。第1のケースは、拡張されたIRでは、(a)用いられるオブジェクトのSTMワードを読み取ることと、(b)フィールドを読み取ることと、(c)STMワードをもう一度読み取り、読み取られた値が(a)の値と一致し、その値が同時の衝突するアクセスがあったことを示さないことをチェックすることとによって表される。第2のケースは、拡張されたIRでは、(a)用いられるオブジェクトのSTMワードを更新し、そのオブジェクトが非トランザクショナル更新の対象であることを示すことと、(b)フィールドを更新することと、(c)STMワードをもう一度更新し、そのオブジェクトがもはや非トランザクショナル更新の対象ではないことを示すこととによって表される。
したがって、ある例のIRは、次のようになる。
Figure 0005284103
この実施態様は、上で説明したSTM実施態様に関する2つの相違を伴う。第1の相違は、上のSTM実施態様と異なって、一時的ストレージが、トランザクションログではなくローカル変数にあることである。これは、それらの変数をプロセッサレジスタ内で割り振って、それらの変数へのアクセスを高速にすることができることを意味する。第2の相違は、L2で始まるトランザクションが、異常終了することができず、したがって、「o2.x」で上書きされる値をログ記録する必要がないことである。
もう1つの強い原子性の実施態様では、コンパイラは、この形で展開しなければならないフィールドの個数を制限するためにさらなる最適化を実行する。一例で、コンパイラは、型ベースの分析を実行して、原子的ブロック内で書き込まれる可能性があるすべてのフィールドを識別する。他のすべてのフィールドは、原子的ブロック内でのアクセスの対象に絶対にならないことが保証されるが、直接にアクセスすることができ、したがって、強い原子性動作をその前後に挿入する必要がない。
図7は、強い原子性を実施する動作を導入する、例のプロセス700の流れ図である。プロセス700は、図5のブロック520に対応する。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。このプロセスは、ブロック710で開始され、ここで、型分析を実行して、原子的ブロック内でアクセスされる可能性があるフィールドを判定する。上で説明したように、一実施態様で、これは、衝突を引き起こすことができないメモリアクセスに対する強い原子性動作の不必要な挿入を避けるために実行される。次に、ブロック720で、ブロック710で判定されたフィールドを使用して、原子的ブロックに含まれるフィールドにアクセスする可能性がある、プログラム内のメモリアクセスを突き止める。代替実施態様では、ブロック710のプロセスを省略することができ、ブロック720のプロセスが、強い原子性動作の挿入に関して原子的ブロックの外部のすべてのメモリアクセスを突き止めることができる。
次に、このプロセスは判断ブロック725に継続し、ここで、コンパイラが、ブロック720のアクセス位置が読取アクセスであるのか更新アクセスであるのかを判定する。アクセスが読取である場合には、このプロセスはブロック730に継続し、ここで、open−for−read命令をアクセスの前に挿入する。一実施態様で、この命令は、STMワードを受け取ることができるようになるまでブロックするように構成され、したがって、メモリアクセスが、アクセスされるフィールドを正しく読み取ることができることを保証する。もう1つの実施態様では、この動作がブロックするのではなく、ループが、メモリアクセスが正確であると判明しない場合に、メモリアクセスの後に作成される。次に、ブロック740で、メモリアクセスの後にチェック命令を挿入して、読取アクセスの間に、STMワードが読み取られるフィールドに対する変更を示さなかったことを保証する。上で提供した実施態様では、これは、ブロック730でSTMワードを受け取ることと、ブロック740でのチェック動作にそのSTMワードをわたすこととによって行われ、これは、コード最適化が強い原子性動作の順序を並べ変えるのを防ぐデータ依存性をも作成する。
しかし、ブロック725で、アクセスが更新であると判定される場合には、このプロセスは、ブロック750に継続し、ここで、open−for−update命令をアクセスの前に挿入する。一実施態様で、この命令は、他のアクセスを防ぐために、アクセスされるオブジェクトからのSTMワードを変更するように構成され、したがって強い原子性を提供する。次に、ブロック760で、メモリアクセスの後にコミット命令を挿入して、メモリアクセス時に実行された更新をコミットする。一実施態様で、アクセスされたオブジェクトのバージョン番号が、変更される。別の実施態様では、それが行われない。次に、判断ブロック765で、コンパイラは、追加の非原子的メモリアクセスがあるかどうかを判定する。そうである場合には、このプロセスを繰り返す。そうでない場合には、このプロセスは終了する。
2.2.2 read−to−updateアップグレードの除去
STMコンパイラの様々な実施態様によって実行されるもう1つの高水準最適化は、DTMOpenForRead動作にDTMOpenForUpdate動作が続くときに発生する不必要なログ記録を避けるためのものである。本明細書で説明する技法に固有の1つの設計の仮定は、読取が書込より一般的であることであり、これは、これらの技法がDTMOpenForUpdate動作とDTMOpenForRead動作とを分離する理由である、すなわち、open−for−read命令は、よりすばやく完了することができる。しかし、時々、オブジェクトが、読み取られ、その後に書き込まれる(規範的な例が「obj.field++」である)。この場合に、オープン動作を伴うIRは、次のようになる。
Figure 0005284103
このプログラムがopen−for−read点に達する場合に、当分は例外を無視すると、このプログラムがopen−for−update点に達することがわかる。open−for−updateは同一オブジェクトに対するopen−for−readを包含するので、このopen−for−read動作は浪費される。これは、一実施態様で、read−to−updateアップグレードとして知られる。open−for−update動作をより早期に単純に実行することが、より効率的であるはずである。
Figure 0005284103
したがって、一実施態様で、コンパイラは、read−to−updateアップグレードが見つかったときに、そのread−to−updateアップグレードを除去する。一般に、これは、単純なデータフロー分析によって、DTMOpenForUpdateが続く場合にDTMOpenForRead動作をアップグレードすることによって、基本ブロック内でコンパイラによって処理することができる。もう1つの一般的なケースでは、DTMOpenForUpdate動作が、すべての非例外パスが同一のDTMOpenForUpdateを実行する(用いられる変数への介在するストアなしで)すべての基本ブロックの始めに単純に挿入される。次に、CSEは、余分なDTMOpenForUpdate動作ならびに同一オブジェクトに対するすべての後続のDTMOpenForRead動作を除去することを試みる。
図8は、不必要なread−to−updateアップグレードを除去する、例のプロセス800の流れ図である。プロセス800は、図5のブロック540に対応する。様々な実施態様で、図示のプロセスブロックをマージし、サブブロックに分割し、あるいは省略することができる。このプロセスは、ブロック810で開始され、ここで、コンパイラが、必ず同一参照に対するopen−for−update動作が続くopen−for−read動作を識別する。本明細書の例が、オブジェクトポインタを利用するが、不必要なread−to−updateアップグレードを除去する説明される技法が、インテリアポインタ(interior pointer)および静的フィールドの除去をも実施することに留意されたい。コンパイラは、オープンする動作が同一のオブジェクト(または静的フィールドの一実施態様の場合にサロゲートオブジェクト)に対するものであることを判定する必要がある。
一実施態様で、この分析は、オブジェクト参照またはインテリアポインタが同一のローカル変数であり、その変数が動作の間で更新されないことを必要とする。この実施態様は、代入に対するアップグレードの除去に失敗する可能性があるが、他の実施態様は、代入をも分析する。もう1つの実施態様で、静的フィールド(または変数)は、サロゲートオブジェクトに対するオープン動作を介して制御され、これは、単一のサロゲートオブジェクトがすべての静的フィールドを制御する場合に2つの異なる静的フィールドの間でアップグレードを除去することを可能にする。ブロック810のプロセスの例のプロセスを、図9に関して下でより詳細に説明する。
次に、ブロック820で、ブロック810で識別されたopen−for−read動作を、同一参照に対するopen−for−update動作に置換する。次に、ブロック820で、冗長なopen−for−update動作を除去する。一実施態様で、これは、ブロック820のプロセスの直後に実行されるのではなく、CSEなど、図6に関して説明したコンパイラ最適化によって実行される。
read−to−upgrade除去分析の第1の例示的な実施態様は、基本ブロック内のアップグレードを除去する。したがって、コンパイラは、プログラム全体の各基本ブロックを調べ、それぞれについてスキャンして、open−for−read動作を見つける。最初のopen−for−read動作が見つかったときに、コンパイラは、open−for−update動作またはオープンされたオブジェクトをポイントする変数への代入を探して前方にスキャンする。open−for−updateが最初に現れる場合には、コンパイラは、open−for−readをopen−for−update動作に変換し、オリジナルのopen−for−updateを削除する。変数がアップデートされる場合には、検索をやめる。代替実施態様では、コンパイラは、open−for−read動作を検索するために、open for update動作から逆方向にスキャンすることができる。
図9は、必ずread−to−update動作によって包含されるopen−for−read動作を識別することを除去する第2の例のプロセス900の流れ図である。プロセス900は、図8のブロック810に対応する。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。
図9のプロセスは、標準逆方向データフロー分析を利用する。この分析では、コンパイラは、すべてのプログラム点で、確かに将来に更新のためにオープンされるオブジェクトのセットを計算する。様々な実施態様で、図9のプロセスは、プログラムのすべての基本ブロックのそれぞれについて、または基本ブロックのサブセットについて実行される。このプロセスは、ブロック910で開始され、ここで、確かに更新されるオブジェクトの表示を含むセットを基本ブロック境界で作成する。ブロック920で、その基本ブロック内のすべての変数をそのセットに追加する。その後、ブロック930で、基本ブロック内の命令の分析が、ブロック内の最後の命令を点検することによって開始される。判断ブロック935で、コンパイラは、命令の形式を検討する。命令が代入(例えば、「x=...」)である場合には、ブロック940で、代入される変数をセットから除去する。しかし、命令がopen−for−update命令である場合には、ブロック950で、その命令によってオープンされる変数をセットに追加する。
どちらの場合でも、あるいは命令が別のタイプである場合には、コンパイラは、判断ブロック955に移り、追加の命令が基本ブロック内に存在するかどうかを判定する。そうである場合には、ブロック960で、コンパイラは、制御フローグラフを通って逆方向に移動し、制御フローグラフ内の次の命令を見つけ、この処理を繰り返す。判断ブロック955で、命令がもうないとコンパイラが判断する場合には、基本ブロックの始めに達している。コンパイラがブロックの始めに達したときには、ブロック970で、そのブロックの先行ブロック(すなわち、現在のブロックにジャンプすることができるブロック)を見つけ、セットを、この先行ブロックのそれぞれの終りに格納されたセットと交差させる。一実施態様で、図9のプロセスは、何も変化しなくなるまで繰り返され、各ブロックの終りで現在のセットを与える。コンパイラは、各プログラム点のセットを得るために、同一の形でセットを更新しながらブロックを通って逆方向にウォークスルーすることができる。
この点で、「将来に更新のためにオープンしなければならない」セットの変数が、ブロック810の目的のために識別されている。その後、一実施態様では、open−for−update動作が、これらの変数のそれぞれについて追加され、CSEが後に余分なopen−for−update動作を除去することを可能にする。もう1つの実施態様では、部分的冗長性(「PRE」)が、open−for−update命令の積極的な追加およびそれに続くCSE最適化の代わりに使用される。これは、より一般的な解決策であり、一部のパスでより少数のオープン命令を有するコードを作ることができる。
一実施態様で、上で説明した分析は、例外が送出されないと仮定し、したがって例外エッジを無視し、例外が送出されないならば確かに将来に更新のためにオープンされるオブジェクトのセットを計算する。これは、例外が一般的なケースではないからである。この精度のロスは、正確さには影響しない。しかし、正確な結果を作るために、代替実施態様を、例外エッジを考慮するように拡張することができる。
さらに、代替実施形態では、上の分析を変更して、コードの他の部分を無視することができる。これは、無視されるコードが、分析されるコードと比較して相対的に低い頻度で実行されることを示すヒューリスティックを利用することによって行うことができる。一実施態様で、これらのヒューリスティックは、静的に決定され、別の実施態様で、これらのヒューリスティックは、プロファイル情報から決定される。
例として、上のプロセスの実行の後に、例3のコードは、次のより効率的なコードに単純化される。
例3.1
Figure 0005284103
2.2.3 プロシージャ呼出しの存在下での動作の移動
多数の既存のコンパイラ最適化は、その技法がプログラム全体のグラフに適用するには一般に高価に過ぎるので、関数内のコードを比較し、除去し、移動することしかできない。しかし、プロシージャ境界にまたがってSTM動作を移動する高水準STM最適化を介して、これらの最適化をより効率的に実行することができる。
一例として、次のコードを与えられれば、
Figure 0005284103
Fooが、そのパラメータによって参照されるオブジェクトを必ず更新のためにオープンすることは明白である。Fooの呼出し側も、そのオブジェクトをオープンすることができ(上のように)、あるいは、ループ(もしくは多数の他のもの)の中でFooを呼び出している場合がある。しかし、プロシージャ呼出しは、呼出し側のコードと共にFooのアクションを分析/最適化するのを妨げる。この最適化は、呼出しバリヤにまたがってオープン動作を移動して、他の最適化のためのより多くの機会をもたらす。CSEは、明白な候補である。というのは、呼出し側が、それに移動される動作を既に行っている可能性があるからである。他の非トランザクション固有最適化も改善することができる(例えば、同一のオブジェクトが、ループ内で1つの関数に繰り返してわたされる場合に、オープンをそのループの外にホイストすることができる)。
一例で、この最適化は、DTMGetTMMgr動作およびDTMOpenFor*動作について実施される。代替実施態様では、この最適化を、あるメソッドが呼び出される場合に発生しなければならない他の動作について実行することができる。さらに、代替実施態様で、健全性を失わずに一般的なケースでのよりよい性能のために一般的でないケースでの精度および性能を犠牲にして、この最適化を、あるメソッドが呼び出される場合に通常は発生する動作に対して実行することができる。一実施態様で、コンパイラは、非仮想(「直接」とも呼ばれる)呼出しに対してこの最適化を実行し、これは、「非仮想化された」(例えば、単一の呼出しターゲットだけが存在すると判定され、仮想呼出しを直接呼出しに置換された)仮想呼出しを含む。
図10は、メソッド境界にまたがってSMT動作を移動することによってSMT動作を最適化する、例のプロセス1000の流れ図である。プロセス1000は、図5のブロック560に対応する。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。このプロセスは、ブロック1010で開始され、ここで、メソッドの外に移動できる動作を含むメソッドを突き止める。次に、ブロック1020で、メソッドのクローンを作成して、そのメソッドの、動作をメソッドの外部で実行できるようにするバージョンを作成する。動作が結果を与える場合には、ブロック1020のプロセスは、クローン化されたメソッドに引数を追加して、結果をそのメソッドにわたせるようにもする。
次に、ブロック1030で、動作を、クローン化されたメソッドからそのメソッドの1つまたは複数の呼出しサイトに移動する。代替実施態様では、正確にメソッドのクローンを作成し、動作を移動するのではなく、クローン化されたメソッドは、移動される動作なしで作成される。その後、最後に、ブロック1040で、オリジナルメソッドへの呼出しをクローン化されたメソッドに置換する。置換された呼出しの一実施態様で、クローン化されたメソッドによって使用される追加の引数が、含まれる。これらの追加の引数の例を、下で示す。
呼出しの置換のもう1つの実施態様で、コンパイラは、それがクローンを作成したメソッドのセットおよびこれらのメソッドからのクローン化された(特殊化された)バージョンへのマッピングを維持する。次に、コンパイラは、プログラム内のすべてのメソッドをもう一度スキャンして、呼出しを置換する。いくつかの場合に、この技法は、関数のオリジナルバージョンを完全に除去する。しかし、いくつかの場合に(例えば、関数のアドレスがとられている場合に)、特殊化されないバージョンへの呼出しがまだあり、これを除去することはできない。
異なる動作は、異なる形でメソッドのクローンを作成させる。一例で、あるメソッドがGetTxMgrを含む場合に、コンパイラは、そのメソッドのクローンを作成し、トランザクションマネージャを受け取る余分のパラメータを追加し、GetTxMgrのすべての出現をそのパラメータに置換する。
Figure 0005284103
この例では、このメソッドへの呼出しは、トランザクションマネージャを含む追加の引数を伴う、クローン化されたメソッドへの呼出しに変更される。
Figure 0005284103
もう1つの例では、単一の特性に、(トランザクションマネージャ)に基づく特殊化されたクローンを追跡させ、作成させるのではなく、多数の特性がある(各パラメータおよび各静的サロゲート)。例えば、
Figure 0005284103
この例では、コンパイラは、呼出し側がobj1およびobj3を適当にオープンする(しかし、必ずしもobj2はオープンしない)ことを期待する特殊化されたバージョンを作成することを望む。一実施態様で、これは、上でブロック1010のプロセスの一部として説明した「将来のある時点で更新のためにオープンされなければならない」分析を実行することによって行われる。ここで、この分析は、パラメータおよび静的サロゲートだけを追跡するが、「open−for−read」動作ならびに「open−for−update」動作を行うように拡張もされる。次に、コンパイラは、関数のルートでセットを分析する。それらのセットが空ではない場合には、コンパイラは、その代わりに適当なオープン動作を前後に移動することを除いて、上と同様にメソッドのクローンを作成する。コンパイラは、他の最適化が見るために、クローン化された関数に、どのパラメータがオープンされると期待されるか(および読取または更新のどちらに関するか)をストアする。
2.2.4 新たに割り振られたオブジェクトに関するログ動作の減少
最後の高水準最適化は、あるトランザクション内で新たに割り振られたオブジェクトに関する、そのトランザクション内のログ動作を除去することによって、ログ動作の個数を減らすように働く。具体的に言うと、それが作成されたトランザクションから絶対に漏れ出ないオブジェクトに関するアンドゥログ情報を維持する必要はない。これは、そのようなオブジェクトのアンドゥログ内の情報が、そのトランザクションが異常終了した場合に限って使用され、その点で、そのオブジェクトがいずれにせよ削除されるからである。
本質的に、この最適化は、トランザクションの開始以降に割り振られたオブジェクトに必ず束縛される変数を識別し、次に、これらのオブジェクトに関するログ動作を削除するように働く。したがって、図11に、新たに割り振られたオブジェクトに関するログ動作を除去する、例のプロセス1100の流れ図を示す。プロセス1100は、図5のブロック580に対応する。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。
このプロセスは、ブロック1110で開始され、ここで、コンパイラは、そのトランザクション内で新たに割り振られるオブジェクトに必ず束縛される変数を識別する。様々な実施態様で、ブロック1110のプロセスは、コンパイルされるプログラム内のプログラム点の異なるセットで変数に関する情報を受け取るために実行される。したがって、ブロック1110の分析は、特定の点、コードの短いスパン、またはトランザクション内の変数の寿命全体を通じて、参照に関する情報を習得するために実行することができる。
この分析の後に、ブロック1120で、コンパイラは、これらの変数を介して動作するアンドゥログ動作を除去し、このプロセスは終了する。一実施態様で、コンパイラは、ヒープメモリにアクセスするSTM動作を、その分解がログ動作を含まない動作の特別に拡張されたバージョンに置換することによって、ブロック1120のプロセスを実行する。もう1つの実施態様で、コンパイラは、STM動作の分解の後に図11のプロセスを実行して、分解されたログ動作を明示的に除去する。
ブロック1110のプロセスは、分析されつつあるコードに依存して、単純なものから複雑なものまでの範囲にわたる。一例で、
Figure 0005284103
などのコードは、pが、原子的トランザクションブロック内の新たに割り振られるオブジェクトを参照することが必ずわかることを意味する。したがって、pを介して働くログ動作を除去することは、安全である。
しかし、
Figure 0005284103
などのコードは、pが必ず新たに割り振られたオブジェクトを参照するかどうかに関する情報を簡単には提供しない。したがって、コンパイラは、変数がログ除去に適格であるか否かを識別するために、分析を実行しなければならない。
一実施態様で、コンパイラは、各変数が新たに割り振られたオブジェクトを確かに参照することがわかるかどうかを示す、すべてのプログラム点でのベクトルを利用するビットベクトルを使用する。この実施態様は、ログ動作を除去できる参照を正しく識別するが、一般に、低速であり、大量のメモリ使用を伴う。もう1つの実施態様では、ビットベクトルが、基本ブロックなど、コードの大きいセクションに関する要約情報を提供することができる。この実施態様は、それでも、プロシージャ間分析に関して低速になる可能性がある。
代替案として、一実施形態で、コンパイラは、フローセンシティブプロシージャ間分析を使用して、トランザクションの始め以降に割り振られたオブジェクトに必ず束縛される変数を識別する。図12に、そのような例のプロセス1200の流れ図を示す。プロセス1200は、図11のブロック1110に対応する。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。図示の実施態様では、プロセス1200は、トランザクション内の各基本ブロックに対して実行される。
図12に示されたプロセスは、依存性グラフを同時に作成し、解決するために、プログラム全体の各関数に対して実行される。関数ごとに、このプロセスは、ブロック1210で開始され、ここで、オブジェクト型の変数から依存性グラフ内の格子要素またはノードへのマッピングを作成する。このマップは、ブロック内の任意の点で変数に代入することができる値の種類を表すことができる。一実施態様で、格子は、その中に3つの要素すなわち、新たに割り振ることができないオブジェクトを参照する変数を表す「Old」、新たに割り振らなければならないオブジェクトを参照する変数を表す「New」、および情報がない変数の「Unknown」を有する。ブロック1220で、マッピング内のすべての変数に「Unknown」をセットする。次に、ブロック1230で、コンパイラは、基本ブロックを通って順方向に進んで、ブロック内の最初の動作を点検する。判断ブロック1235で、コンパイラは、それが点検している動作のタイプが何であるかを判定する。動作がオブジェクト割振りである場合には、ブロック1240で、コンパイラは、割り振られる変数のマッピングに「New」を追加する。動作が代入、キャスト、またはプロシージャ呼出しである場合には、ブロック1250で、コンパイラは、変数の間で格子値を伝搬させる。したがって、代入およびキャストは、その抽象値を、代入される変数に伝搬させる。呼出しは、抽象値を呼出しフォーマルにおよび戻り値から伝搬させる。しかし、動作が、上のケース以外の何かである場合には、ブロック1260で、動作が割り当てられる変数について「Old」を表すように格子を変更する。一実施態様で、この分析は、現在のトランザクションのコミットされたサブトランザクション内で割り振られるオブジェクトをも、新たに割り振られるものと考える。
次に、コンパイラは、マッピングに関する情報をローカル変数から格子値またはグラフノートに順方向に伝搬させ、固定点に達するまで関数内で反復する。したがって、判断ブロック1265で、コンパイラは、ifステートメントの終りなどの合流点に達したかどうかを判定する。合流点に達した場合には、ブロック1270で、先行ブロックからの格子値を、現在のブロックの既存マップに点単位で交差させる。分析のために、関数の始めは、その呼出しサイトのすべてからの合流点と考えられる。どの場合でも、このプロセスは、判断ブロック1275に進み、ここで、点検すべき動作がまだあるかどうかを判定する。そうである場合には、このプロセスは、判断ブロック1235で繰り返す。そうでない場合には、このプロセスは終了する。このプロセスは、他の関数から変数へのグラフを介する伝搬を引き起こすことができる。このプロセスが、トランザクション内のすべての基本ブロックに対して実行されたならば、「New」のラベルを付けられた変数は、そのログ動作を除去させることができる。依存性追跡は、様々な実施態様で、関数を異なる順序で処理できることを意味する。依存性追跡は、ある関数の新しい呼出し側または呼ばれる側が判定される場合に、その関数をもう一度分析する必要がないことをも意味する。
3.ランタイム最適化の例
このセクションでは、分解された直接アクセスSTMの実施態様を説明する。概要では、トランザクションは、更新に厳密な2フェーズロックを使用し、衝突する更新を検出できるように、そのトランザクションが読み取るオブジェクトのバージョン番号を記録する。ロールバックログは、衝突またはデッドロックの際の回復に使用される。ある最適化は、コミット動作によって使用されるバージョン番号をサポートするためにオブジェクトフォーマットを拡張することならびにこの拡張に基づいてオブジェクトに対する変更を判定する高速技法を伴う。トランザクショナルメモリのログへのエントリのランタイムフィルタリングも、説明する。
3.1 原子的コミット動作
オブジェクト構造の拡張は、本明細書で説明するSTM実施態様内の原子的コミット動作の文脈で理解することができる。原子的コミットの一例で、DTMStartが呼び出され、オブジェクトは、読取および更新のためにオープンされ、コミットは、これらのアクセスを原子的に実行することを試みるためにDTMCommitを呼び出すことによって終了する。
内部的に、コミット動作は、読取のためにオープンされているオブジェクトの妥当性検査を試みることによって開始される。これは、それらのオブジェクトがオープンされたとき以降に他のトランザクションによってそれらのオブジェクトに対する更新が行われていないことを保証する。妥当性検査が失敗する場合には、衝突が検出されており、トランザクションの更新は、ロールバックされ、そのトランザクションが更新のためにオープンしたオブジェクトは、クローズされ、その結果、そのオブジェクトを、他のトランザクションによってオープンすることができる。妥当性検査が成功する場合には、トランザクションは、衝突なしで実行されており、そのトランザクションが更新のためにオープンしたオブジェクトは、クローズされ、更新が保持される。
妥当性検査プロセスは、DTMOpenForReadコマンドの呼出しから妥当性検査までのタイムスパン中にトランザクションが読み取ったオブジェクトに対する衝突する更新がなかったことをチェックする。更新のためにオブジェクトをオープンされたままにすることは、DTMOpenForUpdateコマンドの呼出しからSTMログ内のオブジェクトのクローズまでのタイムスパン中の衝突を防ぐ。その結果、このタイムスパンの交差中にオープンされているオブジェクトのいずれに対しても衝突するアクセスはなく、トランザクションは、妥当性検査が開始される直前に原子的であると考えることができる。
3.2 ランタイム環境
図13は、ランタイム環境1300内でランタイム中にSTM性能を最適化するように動作する、オブジェクトおよびソフトウェアモジュールの例を示すブロック図である。図13は、特定のモジュールを別々に示すが、様々な実施態様で、モジュールを、様々な組合せでマージするか分割することができ、モジュールが、図示されていない他のランタイムソフトウェア構造の一部として動作することができることを理解されたい。図13は、膨張させられたワードヘッダ1315と共に、ランタイム環境内で動作するオブジェクト1310を示す。その膨張させられたワードヘッダを伴うオブジェクトの動作を、次のセクションで説明する。図13には、上で説明したSTM実施態様の妥当性検査プロシージャおよびクローズプロシージャを実施する、読取妥当性検査モジュール1320およびオブジェクト更新クローズモジュール1330も示されている。ランタイム環境内のオブジェクトに関するこれらのモジュールの特定の諸面を、本明細書で説明する。図13には、さらに、フィルタリングアソシアティブテーブル1350が示され、フィルタリングアソシアティブテーブル1350は、いくつかの実施態様で、不必要なエントリをフィルタリングし、これらがアンドゥログ1360、更新済みオブジェクトログ1370、および読取オブジェクトログ1380の様々な組合せにログ記録されるのを防ぐ。このフィルタリングプロセスの特定の実施態様は、下でより詳細に説明する。最後に、図13は、ガーベジコレクションモジュール1390を示し、ガーベジコレクションモジュール1390は、オブジェクトがもはや実行中プログラム内で到達可能ではなくなったときにそれらのオブジェクトを割振り解除し、ガーベジコレクション中にSTMログを圧縮するように働く。このガーベジコレクションモジュールの特定の実施態様を、下で説明する。
3.3 オブジェクト構造
このセクションでは、読取専用オブジェクトの妥当性検査ならびに更新されるオブジェクトに対するオープン動作およびクローズ動作をサポートするのに使用される構造体の例を説明する。一実施態様で、STMは、オブジェクトに対する動作のために各オブジェクトに対する2つの抽象エンティティすなわち、どのトランザクションがオブジェクトを更新のためにオープンさせたかを調整するのに使用されるSTMワードと、トランザクションが読み取ったオブジェクトに対する衝突する更新を検出するのに高速パスコード内で使用されるSTMスナップショットとを利用する。これらのデータ構造体を使用する動作の例は、次の通りである。
Figure 0005284103
オブジェクトのSTMワードは、2つのフィールドを有する。一方は、そのオブジェクトがいずれかのトランザクションによって現在更新のためにオープンされているか否かを示す単一のビットである。セットされている場合に、このワードの残りは、所有するトランザクションを識別する。そうでない場合には、このワードの残りは、バージョン番号を保持する。OpenSTMWordは、STMワードに対する原子的compare−and−swap(前の値から次の値へ)を実行する。CloseSTMWordは、このワードを指定された値に更新する。
図14aおよび14bに、オブジェクト内でSTMワードを実施する例を示す。図示の実施態様は、Bartokランタイムが、メモリ内でオブジェクトを表すときに単一のマルチユースヘッダワードを各オブジェクトに関連付けるという事実を利用し、これを使用して、同期ロックおよびハッシュコード(どちらもが本明細書で説明するSTM技法の構成要素ではない)をオブジェクトに関連付ける。図14aおよび14bでは、このマルチユースヘッダワードが、トランザクション内で更新のためにオープンされているオブジェクトのSTMワードを保持するために、追加の状態を伴って拡張されている。したがって、図14aでは、オブジェクト1400は、マルチユースヘッダワード1410を含み、マルチユースヘッダワード1410は、それにストアされた値のタイプのインジケータ1413およびそれに続く実際のSTMワード1418を含む。インジケータ1413の使用は、異なるインジケータ値を使用することによって、マルチユースワードをハッシュコードおよびロックに使用することを可能にする。一実施態様では、あるオブジェクトのインジケータ1413が、ロックまたはハッシュコードがこのワードにストアされていることを示す場合に、まだ今のところそのオブジェクトのSTMワードがないと仮定する。やはり図14aに示されているように、STMワード1418は、上で説明した2タイプの値を有することができる。例1420では、STMワードは、オブジェクト1400が更新のためにオープンされてはいないことを示すビットを含み、したがって、このワードの残りは、バージョン番号を保持する。例1430では、STMワードは、オブジェクトが更新のためにオープンされていることを示すビットを含み、したがって、STMワードは、更新のためにこのオブジェクトをオープンしたトランザクションを識別した。
もう1つの実施態様では、マルチユースワードがこれらの目的のうちの複数(例えば、ハッシュコードおよびSTMワード)のために必要な場合に、マルチユースワードは、膨張させられ、外部構造体が、オブジェクトのロックワード、ハッシュコード、およびSTMワードを保持する。したがって、図14bでは、オブジェクト1450が、膨張させられたヘッダワードを使用して図示されている。このオブジェクトのマルチユースワードのインジケータ1465は、ヘッダワードが膨張させられていることを示す値を含み、マルチユースワードの残りの値1460は、膨張させられたヘッダワード構造体のメモリアドレスを含む。したがって、図14bでは、マルチユースワードは、膨張させられたヘッダワード構造体1470をポイントし、膨張させられたヘッダワード構造体1470は、ロックワード、ハッシュコード、およびSTMワードを含む。
STMワードと異なって、オブジェクトのSTMスナップショットは、オブジェクトのトランザクショナル状態に関するヒントを提供する。一実施態様で、ランタイム環境は、CloseSTMWordがオブジェクトに対して呼び出されるときに、すなわち、スレッドがオブジェクトへの更新アクセスを解放するときに、必ずスナップショットが変化することを保証する。これは、衝突を検出するのに十分な情報を与える。
この条件を保証する1つの方法は、オブジェクトのマルチユースワードの値としてSTMスナップショットを実施することである。明らかに、この実施態様は、STMワードがマルチユースワードに直接にストアされるときに、スナップショットが変化することを意味する。しかし、スナップショットは、膨張させられたヘッダワードが使用されるときには、必ずしも変化しない。一実施態様では、膨張させられたヘッダワードを使用するオブジェクトのスナップショットが、各オブジェクトの膨張させられたヘッダワードを見つけ出し、探査することができる。しかし、これは、高速スナップショット命令を作るという目標と一致しない非効率的な実践である。したがって、もう1つの実施態様では、マルチユースワードが膨張させられる場合に、CloseSTMWordが、新しい膨張させられた構造体を作成し、以前の構造体の内容をそれにコピーする。これは、高速のままでありながら、STMスナップショットを常にオブジェクトのマルチユースワードの値として実施することを可能にする。
図15aおよび15bに、CloseSTMWordのそのような実施態様の効果を示す。図15aには、CloseSTMWordの実行の前のオブジェクト1500が示されている。オブジェクト1500は、膨張させられたヘッダワード1520を使用し、膨張させられたヘッダワード1520のアドレスをそのマルチユースヘッダワード1510にストアする。図15bは、CloseSTMWordの実行の後のオブジェクトおよびランタイムメモリに対する変化を示す。実行の後に、新しい膨張させられたヘッダワードデータ構造体1540が作成されており、マルチユースヘッダワード1510にストアされたアドレスが変化している。これは、マルチユースワード1510の値を含むスナップショットが、クローズの結果として変化したことを意味する。
図16は、オブジェクトスナップショットを使用して妥当性検査を実行する、例のプロセス1600の流れ図である。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。このプロセスは、ブロック1620で開始され、ここで、オブジェクトのスナップショットデータを記録する。一実施態様で、この記録は、オブジェクトが読取のためにオープンされるときに実行される。次に、ブロック1640で、読取妥当性検査モジュール1320が、コミット動作中の妥当性検査時にオブジェクトの第2のスナップショットを記録する。判断ブロック1660で、このモジュールが、2つのスナップショットを比較して、それらが同一であるかどうかを調べる。それらが一致する場合には、このプロセスはブロック1670に継続し、ここで、トランザクションは、スナップショットが変化していないという事実を利用して高速パステストを実行するコミット/異常終了プロシージャに継続することを許可される。スナップショットが一致しない場合には、ブロック1680で、読取妥当性検査モジュール1320が、トランザクションがコミットできるのか異常終了するのかを判定するのに一致するスナップショットの存在を利用できないコミット/異常終了プロシージャを実行し、このプロセスは終了する。一実施態様で、プロシージャのこの2つの異なるセットは、高速パスプロシージャおよび低速パスプロシージャとして知られる。
ブロック1670のプロセスとブロック1680のプロセスとの間の主要な相違は、ブロック1670のプロセスが、スナップショットが変化していないことの知識のゆえに不必要なテストまたはメモリアクセスを回避でき、したがって、ブロック1680のテストよりすばやく実行できることである。様々な実施態様で、これらのテストの正確な性質は、基礎になるトランザクショナルメモリ実施態様の性質に依存する可能性がある。例えば、下でコードの例6で説明する一実施態様では、妥当性検査を実行するコードは、2つのスナップショットが一致する場合に、単一のSTMワードをチェックして、それがトランザクションによって所有されるかどうか、およびそのトランザクションが現在妥当性検査を行っているトランザクションと同一であるかどうかを判定するだけでよい。対照的に、この例でスナップショットが一致しない場合には、第2のSTMワードならびにある種の状況で更新エントリをルックアップしなければならない。これらの追加のメモリアクセスならびにそれらに対して実行される追加の比較は、ブロック1680のこの実施態様が、一般にブロック1670の対応する実施態様より低速であることを意味する。
図17は、膨張させられたヘッダワードを使用してオブジェクトを変更する、例のプロセス1700の流れ図である。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。このプロセスは、ブロック1720で開始され、ここで、オブジェクトを変更する。一実施態様で、これは、STM更新命令のゆえとすることができる。もう1つの実施態様で、オブジェクトの膨張させられたヘッダワード自体を、ロックワードまたはハッシュコードのいずれかにおいて変更することができる。次に、ブロック1740で、オブジェクト更新クローズモジュール1330が、クローズ命令に応答して、新しい膨張させられたヘッダワードを作成する。このプロセスは、ブロック1760に継続し、ここで、そのモジュールが、情報を古いヘッダワードから新しいヘッダワードにコピーする。次に、ブロック1780で、オブジェクト更新クローズモジュール630が、新しい膨張させられたヘッダワードをポイントするようにオブジェクトのマルチユースヘッダワードを変更する。
最後に、ブロック1790で、ガーベジコレクションが行われようとしている場合に、古い膨張させられたヘッダワードは、ガーベジコレクタ1390による再利用まで、その位置に残される。オブジェクト更新クローズモジュールは、第2の変化が異なるスレッド内でオブジェクトに対して行われ、第3の膨張させられたヘッダワードが第1の膨張させられたヘッダワードから再利用されるメモリに書き込まれるシナリオを防ぐために、これを行う。オブジェクトを読み取るトランザクションがオープンされている間にこれが発生する場合には、オブジェクトのスナップショットは、2回変更されているにもかかわらず、コミット時に変化していないように見える可能性がある。これは、読取を行うトランザクションが、オブジェクトの2回の変更に起因して異常終了しなければならないときにコミットすることを可能にする可能性がある。一実施態様で、ブロック1790のプロセスは、オブジェクトを再利用することが安全なときまでオブジェクトをその位置に残すことによって実行され、一例で、オブジェクトのこの再利用は、オブジェクトを読取のためにオープンしているトランザクションがないときに行われる。
4.STMログ記録およびコミットの例
4.1.STMログ構造の例
各スレッドは、3つのログと共に別々のトランザクションマネージャを有する。読取オブジェクトログおよび更新済みオブジェクトログは、トランザクションが読取または更新のためにオープンしたオブジェクトを追跡する。アンドゥログは、異常終了時にアンドゥされなければならない更新を追跡する。すべてのログが、シーケンシャルに書き込まれ、絶対に検索されない。別々のログが使用されるのは、それらの中のエントリが、異なるフォーマットを有するからであり、また、コミット中に、システムが異なる種類のエントリにまたがって反復する必要があるからである。各ログは、エントリのアレイのリストに編成され、したがって、コピーなしで大きくなることができる。
図18a、18b、および19a〜cに、例2aからのリストの例を使用するログの構造を示す。図18aに、値10を有する単一のノードを保持するリストの初期状態を示す。オブジェクトのマルチユースワードが、両方ともSTMワードを保持するのに使用されると仮定する。このケースでは、オブジェクトは、バージョン90および100である。図18a、18b、および19a〜cの図示の例では、STMワードの右側の2桁の値は、図14a、14b、15a、および15bのインジケータに対応する。
例3からの1つの動作が、バージョン番号を更新済みオブジェクトログ内の新しいエントリへのポインタに原子的に置換するのにOpenSTMWordを使用して、thisを更新のためにオープンする。擬似コードの1つの例は、例4のようになる。
例4
Figure 0005284103
図18bにこの結果を示す。図示の実施態様で、「ログチャンク内のオフセット」フィールドが、ガーベジコレクション中にログ(図18bのListノードからのログなど)へのインテリアポインタを、それを保持するログエントリのアレイへの参照にマッピングする高速の形として使用されることに留意されたい。
リスト合計の例は、読取のために各リストノードをオープンするために進行する。DTMは、これを単純にし、オブジェクトごとに、オブジェクト参照およびその現在のSTMスナップショットがログ記録される。例5に、これの例を擬似コードで示す。
例5
Figure 0005284103
図19aに、これが作成するログエントリを示す。競合がまれであり、したがって、競合を早期に発見することの利益より、チェックのコストが優るという設計の仮定に従って、衝突を検出する試みは行われない。
リストノードを読み取った後に、最終ステップは、Sumフィールドの更新である。DTMLogFieldStoreは、図19bに示されたアンドゥログ内のエントリに、上書きされた値を記録する。これの擬似コードは省略する。使用される特定のレコードは、一実施形態で使用されるBartokシステム内のガーベジコレクションサポートによって影響され、他の設計が、他のシステムで適当であるからである。アンドゥログエントリは、上書きされた値のアドレスを(オブジェクト,オフセット)対として記録する。これは、いくつかのガーベジコレクタで処理するのが高価なインテリアポインタの使用を回避する。エントリは、スカラまたは参照型ストアの間で区別もする。この型情報は、一部のガーベジコレクタで必要である。最後に、上書きされた値が記録される。もう1つの実施態様では、ガーベジコレクション中のより多くの作業を犠牲にして、アドレスおよび上書きされるワードだけを保持する、より短い2ワードログエントリを使用することができる。
4.2 コミットプロシージャの例
本明細書で説明する実施態様のDTMCommitには2つのフェーズがあり、第1のフェーズは、読取のためにオープンされるオブジェクトに対する衝突する更新をチェックし、第2のフェーズは、更新のためにオープンされたオブジェクトをクローズする。明示的に読取のためにオープンされたオブジェクトをクローズする必要はない。というのは、その事実が、スレッドプライベートトランザクションログだけに記録されるからである。
例6は、次のように、ValidateReadObjectの構造を示す。この擬似コードには多数のケースがあるが、全体的な設計は、DTMインターフェースでの動作に関するケースの分離として考えるならば、より明瞭になる。下のケースV1、V2、およびV3は、衝突が発生していないことを示す。
・ V1 オブジェクトは、トランザクションの持続時間内のどの点でも更新のためにオープンされなかった。
・ V2 オブジェクトは、持続時間全体について現在のトランザクションによって更新のためにオープンされた。
・ V3 オブジェクトは、最初は更新のためにオープンされず、現在のトランザクションは、更新のためにそのオブジェクトをオープンする次のトランザクションであった。
・ V4 オブジェクトは、持続時間全体について別のトランザクションによって更新のためにオープンされた。
・ V5 オブジェクトは、最初は更新のためにオープンされず、別のトランザクションが、更新のためにそのオブジェクトをオープンした次のトランザクションであった。
これらのケースは、例の擬似コードでマークされている。いくつかのケースは、複数回発生する。というのは、STMスナップショットに対して行われるテストが実際の衝突のゆえに不合格になる場合と、衝突なしで不合格になる(例えば、オブジェクトのマルチユースワードが膨張させられるのでSTMスナップショットが変化したので)場合との間で区別することが有用であるからである。
例6
Figure 0005284103
Figure 0005284103
例7に、更新のためにオープンされたオブジェクトをクローズするのに使用されるCloseUpdatedObject動作を示す。
例7
Figure 0005284103
図19cに、新しいバージョン番号91がリストオブジェクトのヘッダに置かれている、リスト構造に対する結果の更新を示す。
バージョン番号に29ビットが使用可能な状態で、約500M個の別個のバージョンを入手できることを観察することができる。示された設計は、実行中のトランザクションがオブジェクトを読取のためにオープンさせている間に、あるバージョン番号が同一オブジェクトに再利用されない限り(読み取るトランザクションが、その数に対する500M回程度の更新があった可能性があることを検出せずに成功してコミットすることを可能にするA−B−A問題)、バージョン番号がオーバーフローすることを安全にする。
正確さのために、一実施態様で、これは、(a)少なくとも500Mトランザクションおきに1回ガーベジコレクションを実行することと、(b)すべてのガーベジコレクションで動作中のトランザクションを妥当性検査することとによって防がれる。読取オブジェクトログ内のレコードは、ログ記録されたバージョン番号が現在のバージョン番号と一致する場合に限って有効であり、その結果は、各ガーベジコレクションが、バージョン番号を更新するために各オブジェクトを訪れることを必要とせずに、500Mトランザクションの「クロックをリセットする」ことである。
5.ランタイムログフィルタリング
このセクションでは、読取オブジェクトログおよびアンドゥログから重複をフィルタリングするのに確率的ハッシング方式を利用する、重複をフィルタリングするランタイム技法を説明する。ログフィルタリングは、一般に、a)ログがかなりのスペースを占め、システムリソースを奪い去る可能性があり、b)特定のメモリ位置が書き込まれたか読み取られたものとしてログ記録されたならば、さらにログ記録する必要がないので、有用である。これは、妥当性検査中に、読取オブジェクトログから必要な唯一の情報が、トランザクションの前のそのオブジェクトのSTMスナップショットであり、アンドゥログから必要な唯一の情報が、トランザクションの前の更新されたメモリ位置の値であるからである。これは、トランザクション内で変化しないので、トランザクションごとに、所与のメモリ位置について1つのログエントリだけが必要である。
セクション4の実施態様では、更新済みオブジェクトログのエントリをフィルタリングする必要はない。これは、DTMOpenForUpdateが、同一トランザクション内で同一の更新されたオブジェクトヘッダについて重複したログエントリの作成を許容しないからである。他の実施態様では、そのような重複が作成される可能性があり、したがって、これをフィルタリングすることができる。
一般に、フィルタは、2つの動作をサポートする。第1の「フィルタ」動作は、指定されたワードがフィルタに存在しなければならない場合に真を返す。この動作は、指定されたワードがフィルタに存在しない可能性がある場合に偽を返し、それを行う際にそのワードをフィルタに追加する。したがって、そのようなフィルタは、検索時に偽陰性を許す確率的集合として働く(すなわち、ワードが実際にはフィルタ内にあるときにそのワードがフィルタ内にないと主張することはできるが、ワードが実際にはないときにそのワードがフィルタ内にあると主張してはならない)。第2の動作「クリア」は、フィルタ内のすべてのワードを除去する。
ソフトウェアトランザクショナルメモリ(STM)の文脈では、フィルタは、同一ワードの内容が、STMが維持するトランザクションログのうちの1つに書き込まれる回数を減らすのに使用することができる。
5.2 ハッシュテーブルフィルタリングの例
本明細書で説明するフィルタリング方式は、読取オブジェクトログおよびアンドゥログへの重複するログ記録要求を、アソシアティブテーブルを使用して確率的に検出する。本明細書で説明する実施態様は、ハッシュテーブルへの参照を用いるが、代替実施態様で、フィルタリングの技法およびシステムが、アソシアティブテーブルの異なる実施態様を使用できることを理解されたい。一実施態様は、アドレスのハッシュを、そのハッシュを有するアドレスに関連する最も最近のログ記録動作の詳細にマッピングするスレッドごとのテーブルを使用する。
一実施態様で、1つのアソシアティブテーブルだけが、読取オブジェクトログとアンドゥログとの両方をフィルタリングするのに必要であることに留意されたい。読取オブジェクトログへのストアは、オブジェクトのヘッダワードのアドレスを使用するが、アンドゥログへのストアは、ログ記録されるワードのアドレスを使用する。アドレスのこれらのセットは、互いに素なので、単一のテーブルが、読取オブジェクトアクセスと更新アクセスとの間の衝突を示さず、したがって、この単一のテーブルを両方のログに使用することができる。
図20に、テーブルの設計を示す。図20には、ハッシュテーブル2000として実施されたアソシアティブテーブルが示されている。図20に示されているように、ハッシュテーブル2000の各エントリは、メモリアドレス2020およびトランザクション番号2030を含む。エントリは、一連のスロット番号2010によって編成される。
一実施態様で、特定のメモリアドレスのスロット番号を識別するハッシュコードには、アドレスをハッシュインデックスおよびタグに分割することによって達する。したがって、そのような実施態様で、ハッシュ関数は、単純にワードWからのいくつかの最下位ビットを使用して、テーブル内で使用されるスロットSを選択する。したがって、ワードW内のビットは、2つの部分に分割されると考えることができ、最下位ビットは、使用されるスロットを識別するように働くハッシュコードであり、残りは、アドレスを一意に識別するタグとして働く。例えば、ワード0x1000は、タグ−1 スロット−0を有し、ワード0x1001は、タグ−1 スロット−1を有し、ワード0x2000は、タグ−2 スロット−0を有し、ワード0x2001は、タグ−2 スロット−1を有するなどである。代替実施態様では、異なるハッシング方式が使用される。
さらに、ハッシュテーブル2000は、メモリアドレスと別々にトランザクション番号を示すが、様々な実施態様では、トランザクション番号は、XOR演算の使用を用いるなど、メモリアドレスと組み合わされる。XOR演算は、相対的に高速な演算であり、連続するXORによって元に戻すことができるので、一実施態様で使用される。代替実施態様では、メモリアドレスの下位ビットをトランザクション番号に置換すること、またはXOR演算ではなく加算演算を使用することなど、トランザクション番号を記録する異なる方法が使用される。これらは、それぞれが、同一のハッシュコードにハッシュ化される2つのアドレスaおよびaと2つのトランザクション番号tおよびtとに関して、a=aかつt=tである場合に限ってop(a,t)がop(a,t)と等しいという特性を共有するという点で有用である。この特性は、挿入される組み合わされた値が、その値がそれから作成された特定のアドレスおよびトランザクション番号に一意であることの信頼をもたらす。
スレッドローカルであるトランザクション番号の使用は、より以前のトランザクションによって記録されたエントリが現在のトランザクションに関連するエントリと混同されるのを防ぐ。トランザクション番号の識別は、トランザクション番号のシーケンスに使用されるビットがオーバーフローするときに限ってテーブルをクリアすることを可能にする。一実施態様で、テーブルは、トランザクション番号のシーケンスがオーバーフローするたびに1回クリアされ、これは、異なるトランザクションから生成された2つのエントリが同一のトランザクション番号を使用するのを防ぐことによって、テーブル内の衝突を防ぐ。もう1つの実施態様では、テーブル内の1つのスロットが、トランザクションごとにクリアされ、いくつかの実施態様では、すべてのトランザクションに小さいオーバーヘッドを追加することが、時折の大きいオーバーヘッドの追加より好ましい場合がある。他の実施形態では、すべてのテーブルのクリアを一時に実行することが好ましい。
図21は、ログエントリをフィルタリングする、例のプロセス2100の流れ図である。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。このプロセスは、ブロック2110で開始され、ここで、トランザクションカウントを、現在のトランザクションの始めに更新する。このカウントは、ハッシュテーブル内で使用されるトランザクション番号を提供する。次に、判断ブロック2115で、トランザクションカウント限度に達したかどうかを判定する。一実施態様で、この限度は、カウントに割り振られたビット数をオーバーフローさせることによって判定される。もう1つの実施態様で、この限度は、メモリ制限に基づくものとすることができ、あるいは、ハッシュテーブルの性能を微調整するために選択することができる。限度に達していない場合には、ブロック2140で、ログ記録されるアドレスを、ハッシュテーブルを介してフィルタリングする。そうではなく、限度に達している場合には、ブロック2120でカウントをリセットし、ブロック2130でテーブルをクリアする。その後、ブロック2140で、ログ記録されるアドレスを、ハッシュテーブルを介してフィルタリングする。
図22は、ログエントリをフィルタリングする、例のプロセス2200の流れ図である。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。様々な実施態様で、プロセス2200は、プロセス2100のブロック2140のプロセスに対応する。プロセス2200は、ブロック2210で開始され、ここで、アドレスをハッシュ化して、正しいハッシュテーブルエントリを見つける。次に、ブロック2220で、フィルタリングされるアドレスの、現在のトランザクション番号(トランザクションカウントから受け取られる)とのXORをとる。一実施態様で、ハッシュ化は、上で説明したように、アドレスをハッシュコードおよびタグ値に分割することによって実行される。
次に、このプロセスは、判断ブロック2225に進み、ここで、ハッシュエントリの値をXOR結果に対してチェックする。この2つが一致する場合には、メモリアクセスをもう一度ログ記録する必要はなく、ブロック2230で、ログに書き込まない。しかし、この2つが一致しない場合には、ブロック2240で、XOR結果をハッシュテーブルエントリに書き込み、ブロック2250で、エントリをログに書き込む。
5.3 新たに割り振られたオブジェクトのランタイムログフィルタリング
一実施態様で、本明細書で説明するSTMのシステムおよび技法は、現在のトランザクションによって割り振られたオブジェクトに関するすべてのアンドゥログエントリの書込を避けるために、それらのオブジェクトを識別する。これは、上で説明した静的コンパイルタイム分析が、新たに割り振られたオブジェクトの特定のログ動作を見逃すか除去できない場合のバックアップを提供する。このランタイム技法は、現在のトランザクションが異常終了する場合にオブジェクトが死ぬので、安全である。一実施態様で、これは、新たに割り振られたオブジェクトに作用するように特殊化されたバージョンのDTMOpenForUpdateを使用し、この動作に、トランザクショナルに割り振られるものとしてオブジェクトをマークするために指定されたSTMワード値を書き込ませることによって行われる。
6.ガーベジコレクションの例
一般に、ガーベジコレクション(「GC」)は、メモリオブジェクトがもはやプログラム内のどのスレッドによっても要求されないのでそのメモリオブジェクトを安全に割振り解除できるときを自動的に判定する機構を提供する。ガーベジコレクションは、多数の近代プログラミング言語に組み込まれ、Microsoft .NETフレームワークの一部を形成する。
このセクションでは、GCを上で説明したSTM技法に統合する様々な実施態様を説明する。しかし、そのような統合は、簡単ではない。その問題を示すために、次の例を検討されたい。
Figure 0005284103
この例において、E1およびE2で実行される計算の両方が、メモリを使い果たさずに完了するためにGCが必要であるのに十分に複雑であると仮定する。さらに、t1に束縛されたLargeTemporaryObjectが、E1でのみ使用され、同様に、t2に束縛されたLargeTemporaryObjectが、E2でのみ使用されると仮定する。「原子的」ブロックなしで実行される場合に、t1によって占められるスペースは、E1が終了したならば再利用することができる。
この例は、既存のトランザクショナルメモリシステムおよびGCを用いて実行することができない。これらのシステムでは、次の2つの問題のうちの1つが発生する。
1.いくつかの非TM対応GCは、GCが発生するときにすべてのメモリトランザクションを強制的に異常終了させる。これらのシステムでは、E1およびE2などの計算は、絶対に原子的ブロック内で実行することができない。
2.他の非TM対応GCは、我々のTM対応GCより長い間、オブジェクトを強制的に保持させる。これらのシステムでは、この例は、成功して実行することができるが、t1およびt2は、GCがE2中に発生し、その間にt1が後に不必要になることがわかる場合であっても、原子的ブロックの終りまで保持される。
一実施態様で、これらの問題は、(a)スレッドが原子的ブロックの実行の途中である間にGCが発生することを可能にし、(b)原子的ブロックが成功して完了する場合であれ、再実行される場合であれ、プログラムによって必要とされないことを保証できるオブジェクトをGCが回復することを可能にする、TM対応GCによって対処される。
様々な実施態様で、ガーベジコレクション技法は、原子的トランザクションブロックの実施態様内で、現在の原子的ブロック内で割り振られるオブジェクトを識別するのに使用される技法を含む。諸実施態様は、STMのデータ構造によって参照されるオブジェクトのどれが、プログラムによって必要とされないことを保証されるかを識別する技法をも含む。最後に、GC実施態様は、TMのデータ構造内のエントリのどれが、プログラムの将来の実行に不必要であるかを識別する技法を含む。
次の説明は、特に上で説明したシステムに頼るが、本明細書で説明する実施態様は、そのセッティングに限定はされず、おそらくはハードウェアトランザクショナルメモリを含む他の形のトランザクショナルメモリと共に使用することができる。
本明細書で説明する実施態様は、stop−the−world tracingガーベジコレクタ、例えばmark−sweepガーベジコレクタまたはcopyingガーベジコレクタを参照して説明される。しかし、これは説明を単純にするためであり、諸実施態様は、そのセッティングに限定されるのではなく、既知の手法を使用して、STMをgenerationalガーベジコレクション、並行ガーベジコレクション、または並列ガーベジコレクションなど、他のガーベジコレクション技法と統合することができる。一実施態様で、STMは、generationalガーベジコレクションと統合される。
高水準では、stop−the−world tracing GCの動作を、次のプロシージャとして要約することができる。まず、アプリケーション内のすべてのアプリケーションスレッドを停止する(時々「mutator threads」として知られる)。次に、mutator threadsが当初にオブジェクトにそれによってアクセスする「ルート」のそれぞれを訪れ、これらのルートから参照されるオブジェクトが、コレクション後に保持されることを保証する(ルートは、プロセッサの実行中mutator threadsの保存されたレジスタ内容、スレッドのスタック上のオブジェクト参照、およびプログラムのスタティックフィールドを介してこれらのスレッドに可視のオブジェクト参照を含む)。そのように保持されるオブジェクトを、しばしば、「グレイ」と称し、残りのオブジェクトを、当初は「ホワイト」と称する。次に、グレイオブジェクトのそれぞれについて、それが含むオブジェクト参照を訪れる。これらの参照が識別するすべてのホワイトオブジェクトを、グレイとマークし、グレイオブジェクト内の参照のすべてを訪れたならば、そのオブジェクトをブラックとマークする。グレイオブジェクトがなくなるまで、このステップを繰り返す。残っているすべてのホワイトオブジェクトは、ガーベジと考えられ、それらが占めるスペースは、再割振りのためにmutator threadsから使用可能にすることができる。最後に、mutator threadsを再始動する。下の例では、グレイオブジェクトを、「訪問済み」オブジェクトと称し、既知のホワイトオブジェクトを、「到達不能」と称する。
STMをGCと統合する一実施態様で、すべてのトランザクションは、GCを開始するときに異常終了される。これは、明白な不利益を有する。もう1つの実施態様では、GCは、STMのデータ構造をmutator threadsのルートの一部と考え、したがって、オブジェクトがログ内のエントリによって参照されることに基づいて、それらのオブジェクトを訪れる。そのような実施態様では、あるログからのオブジェクトへの参照は、GCがそれらを介して到達可能なメモリを保護することを要求する「強い参照」と考えられる。
この実施態様は、STMシステムとGCとの間のある度合の統合を可能にするが、もう1つの実施態様では、より高い度合の統合がある。図23は、STMシステムでガーベジコレクションを実行するガーベジコレクティングモジュール1390によって実行される例のプロセス2300の流れ図である。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。下の図示のプロシージャでは、GCは、オブジェクトおよびログエントリを使用することがもはや不可能であるときにそれらのオブジェクトおよびログエントリを割振り解除し、冗長エントリを除去することによってログを圧縮するのに、STMの特別な知識を使用することができる。一実施態様で、図23のプロセスは、訪問済みオブジェクトのオブジェクト参照のそれぞれを訪れる、上の通常のGCプロシージャのステップの代わりに実行される。代替実施態様では、図23のプロセスを、他の一般的なGCプロシージャに統合することができる。
いくつかの実施態様で、図23のプロセスは、STMシステム内のログ上の2つの質を認識する。第1は、現在のトランザクションがアクセスを試みたオブジェクトを識別するログである。この種類のログは、様々な実施態様で、PLDI論文に記載の実施態様の読取オブジェクトログ、更新済みオブジェクトログ、およびアンドゥログに、アクセスされたオブジェクトへの参照を含む。1つの用語法で、これらのログからのオブジェクトへのいくつかの参照は、「弱い参照」と考えられ、これは、GCが、これらの弱い参照を除いて到達不能なオブジェクトによって使用されるメモリを再利用することを意味する。このプロセスを実行する際にGCによって認識されるもう1つの質は、トランザクションのコミットまたは異常終了の際にメモリに復元されるオブジェクト参照を識別するログである。この種類のログは、アンドゥログ内の古い値を含む。これらのログからのこれらの参照は、いくつかの用語法で「強い参照」と称する。上で述べたように、「強い参照」は、GCがこれらを介して到達可能なメモリを保護することを必要とする。
このプロセスは、ブロック2310で開始され、ここで、GCモジュール1390は、アンドゥログ1360内の各エントリの「前の値」フィールドによって参照されるオブジェクトを訪れ、したがって、これらのオブジェクトが到達不能と考えられるのを防ぎ、現在のトランザクションが異常終了する場合のこれらのオブジェクトの再利用を防ぐ。次に、ブロック2320で、ある種のスペシャルケースエントリをログから除去する。そのような除去プロセスの例を、下で図24に関してより詳細に説明する。
このプロセスは、ブロック2325に継続し、ここで、GCモジュールは、すべての到達可能なオブジェクトを訪れ、到達不能オブジェクトの最終的なセットに達するために、各既に訪問済みのオブジェクトに含まれるオブジェクト参照を訪れる。次に、ブロック2330で、GCモジュールは、到達不能オブジェクトを参照する読取オブジェクトログ1380内のエントリを再検討する。判断ブロック2335で、GCモジュールは、エントリごとに、そのエントリによって参照されるオブジェクトへの衝突する並行アクセスがあるかどうかを判定する。一実施態様では、GCは、エントリごとに、エントリのバージョン番号がオブジェクトのバージョン番号と一致するかどうかを判定することによってこれを行う。そうである場合には、そのエントリが最新であり、オブジェクトが到達不能なので、ブロック2350で、そのエントリをログから単純に割振り解除する。しかし、バージョン番号が一致しない場合には、現在のトランザクションが無効である。この点で、GCモジュール自体が、ブロック2340でそのトランザクションを異常終了させ、そのトランザクションのすべてのログエントリを削除する。代替実施態様では、ブロック2335、2340、および2350の特定のチェックおよびプロセスを省略することができ、既知の到達不能オブジェクトのエントリは、再検討なしで読取オブジェクトログから割振り解除され、STMの他のランタイムシステムに頼って、トランザクションを異常終了させるか否かを判定する。
次に、ブロック2360で、GCモジュールは、更新済みオブジェクトログ1370内のエントリを再検討し、到達不能であるオブジェクトを参照するすべてのエントリを割振り解除する。次に、ブロック2370で、同一のプロセスを、アンドゥログ1360内のエントリについて実行する。最後に、ブロック2380で、GCモジュールは、すべての残りの到達不能オブジェクトの割振り解除に進む。
拡張実施態様は、STMログから追加エントリを除去するのに、スペシャルケースを利用する。図24は、スペシャルケースログエントリを除去する、ガーベジコレクティングモジュール1390によって実行される1つのそのような例のプロセス2400を示す流れ図である。図24のプロセスは、図23のブロック2320に対応する。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。本明細書での説明は、プロセス2400およびブロック2320のプロセスの一部である連続するステップとしてとしてこれらの拡張を説明するが、ある種の状況で、図24のプロセスを、互いに独立に使用することができ、いくつかの場合に、基本実施態様と独立に使用することができ(例えば、GC以外のときにログを圧縮するために)、高速実施態様が、ログ内のエントリを訪問しなければならない回数を減らすためにこれらのステップのうちの1つまたは複数の諸部分を組み合わせることができることを理解されたい。
プロセス2400は、ブロック2410で開始され、ここで、1つのトランザクションだけがアクティブである場合に、GCモジュール1390は、即座にロールバックし、到達不能オブジェクトを参照するエントリをアンドゥログ1360から除去する。ブロック2420で、GCモジュールは、読取オブジェクトログ1380およびアンドゥログ1360を再検討し、エントリが現在のトランザクションブロック内で作成された到達不能オブジェクトを参照する場合に、そのエントリをこれらのログから除去する。GCモジュール1390は、オブジェクトがトランザクション開始の後に割り振られ、現在は到達不能である場合に、そのオブジェクトが、トランザクションがコミットするか否かに関わりなく失われるので、これを行う。一実施態様で、現在のトランザクションのサブトランザクション内で割り振られた到達不能オブジェクトのログエントリも、除去される。
ブロック2430で、読取オブジェクトログ内のエントリごとに、そのエントリが参照するオブジェクトを検査し、そのオブジェクトが既に更新済みオブジェクトログにあり、読取オブジェクトログおよび更新済みオブジェクトログのバージョニング番号がそのオブジェクトについて一致する場合に、読取オブジェクトログエントリを除去することができる。このプロセスは、オブジェクトが最初に読取オブジェクトログに追加されたときと、オブジェクトが最初に更新済みオブジェクトログに追加されたときとの両方を識別することができる。どちらの場合でも、GCは、包含される読取オブジェクトログエントリを除去するように働く。
ブロック2440で、GCモジュール1390は、重複エントリを可能にするSTM実施態様で、読取オブジェクトログから重複エントリを除去する。重複読取オブジェクトログエントリ除去の例のプロセスを、下で図25を参照して説明する。次に、ブロック2450で、GCモジュール1390は、アンドゥログ内のエントリを再検討し、このログ内の「前の値」をログ記録されたメモリ位置の現在の値と比較する。これらが一致する場合には、値は変化しておらず、アンドゥログエントリを維持する理由はなく、したがって、GCモジュール1390は、これらのエントリを除去する。
図25は、重複する読取オブジェクトログエントリを除去する、ガーベジコレクティングモジュール1390によって実行される1つのそのような例のプロセス2500を示す流れ図である。図25のプロセスは、図24のブロック2440に対応する。様々な実施態様で、図示のプロセスブロックを、マージし、サブブロックに分割し、あるいは省略することができる。図25のプロセスは、読取オブジェクトログエントリが、オブジェクトが現在のトランザクション内で読取のためにオープンされたことを記録するのみであるという事実を利用する。これは、単一のオブジェクトの複数のエントリを余分なものにし、したがって、これらのエントリをGC中に除去することが有益である。
図25のプロセスは、ガーベジコレクション中にオブジェクトごとに維持される単一の読取ビットフラグを利用する。一実施態様で、このフラグは、STMワードが保たれる形に似て、ランタイムシステムによって保たれる。もう1つの実施態様では、GCモジュール1390が、GC時にオブジェクトごとにフラグを維持する。このプロセスは、ブロック2510で開始され、ここで、GCモジュール1390が、ログ内の最初のエントリで読取オブジェクトログの圧縮を開始する。次に、ブロック2520で、現在再検討されているエントリによって参照されるオブジェクトを再検討する。ブロック2525で、GCモジュール1390は、オブジェクトがその読取ビットをセットされているかどうかを判定する。そうでない場合には、現在のエントリは、そのオブジェクトの最初のエントリであると仮定される。したがって、ブロック2530で、読取ビットをセットし、そのエントリをそのままにしておく。しかし、GCモジュール1390が、読取ビットが以前にセットされていると判定する場合には、ブロック2540で、このモジュールは、現在のエントリがそのオブジェクトの以前のエントリに対して余分なので、現在のエントリを除去する。一実施態様で、この除去は、保たれるエントリを、除去されるエントリの位置にコピーすることによって、その位置で行われる。他の実施態様では、エントリは、除去されず、単にそれがある場所で割振り解除される。その後、このプロセスは、判断ブロック2545に継続し、ここで、このモジュールが、追加のエントリが読取オブジェクトログに存在するかどうかを判定する。そうである場合には、このプロセスが継続する。そうでない場合には、このプロセスは終了する。
7.コンピューティング環境
上のソフトウェアトランザクショナルメモリ技法は、様々なコンピューティングデバイスのいずれにおいても実行することができる。これらの技法は、ハードウェア回路で、ならびに図16に示されたものなどのコンピュータもしくは他のコンピューティング環境内で実行されるソフトウェアで実施することができる。
図26に、説明した実施形態を実施できる、適切なコンピューティング環境(2600)の一般化された例を示す。コンピューティング環境(2600)は、本発明の使用または機能性の範囲に関する限定を暗示することを意図されたものではない。というのは、本発明を、別個の汎用のまたは特殊目的のコンピューティング環境で実施することができるからである。
図26を参照すると、コンピューティング環境(2600)は、少なくとも1つの処理ユニット(2610)およびメモリ(2620)を含む。図26では、この最も基本的な構成(2630)が、破線の中に含まれる。処理ユニット(2610)は、コンピュータ実行可能命令を実行し、実プロセッサまたは仮想プロセッサとすることができる。マルチプロセッシングシステムでは、処理能力を高めるために、複数の処理ユニットが、コンピュータ実行可能命令を実行する。メモリ(2620)は、揮発性メモリ(例えば、レジスタ、キャッシュ、RAM)、不揮発性メモリ(例えば、ROM、EEPROM、フラッシュメモリなど)、またはこの2つのある組合せとすることができる。メモリ(2620)は、説明された技法を実施するソフトウェア(2680)を記憶する。
コンピューティング環境は、追加の特徴を有することができる。例えば、コンピューティング環境(2600)は、ストレージ(2640)、1つまたは複数の入力デバイス(2650)、1つまたは複数の出力デバイス(2660)、および1つまたは複数の通信接続(2670)を含む。バス、コントローラ、またはネットワークなどの相互接続機構(図示せず)が、コンピューティング環境(2600)の構成要素を相互接続する。通常、オペレーティングシステムソフトウェア(図示せず)が、コンピューティング環境(2600)内で実行される他のソフトウェアのオペレーティング環境を提供し、コンピューティング環境(2600)の構成要素のアクティビティを調整する。
ストレージ(2640)は、取り外し可能または取り外し不能とすることができ、磁気ディスク、磁気テープまたは磁気カセット、CD−ROM、CD−RW、DVD、あるいは情報を記憶するのに使用でき、コンピューティング環境(2600)内でアクセスできる任意の他の媒体を含む。ストレージ(2640)は、説明した技法を実施するソフトウェア(2680)の命令を記憶する。
入力デバイス(2650)は、キーボード、マウス、ペン、またはトラックボールなどのタッチ入力デバイス、音声入力デバイス、スキャニングデバイス、あるいはコンピューティング環境(2600)に入力を供給する別のデバイスとすることができる。オーディオに関して、入力デバイス(2650)を、サウンドカードまたはアナログ形式もしくはデジタル形式でオーディオ入力を受け入れる類似するデバイス、あるいはコンピューティング環境にオーディオサンプルを供給するCD−ROMリーダーとすることができる。出力デバイス(2660)は、ディスプレイ、プリンタ、スピーカ、CDライタ、またはコンピューティング環境(2600)から出力を供給する別のデバイスとすることができる。
通信接続(2670)は、通信媒体を介する別のコンピューティングエンティティへの通信を可能にする。通信媒体は、コンピュータ実行可能命令、圧縮されたオーディオ情報またはビデオ情報、あるいは他のデータなどの情報を変調されたデータ信号内で伝える。変調されたデータ信号とは、信号内で情報をエンコードする形でその特性のうちの1つまたは複数をセットされまたは変更された信号である。限定ではなく例として、通信媒体は、電気、光、RF、赤外線、音響、または他の搬送波を用いて実施される有線または無線の技法を含む。
本明細書で説明した技法を、コンピュータ可読媒体の全般的な文脈で説明することができる。コンピュータ可読媒体は、コンピューティング環境内でアクセスできる任意の使用可能な媒体である。限定ではなく例として、コンピューティング環境(2600)に関して、コンピュータ可読媒体は、メモリ(2620)、ストレージ(2640)、通信媒体、および上記のいずれかの組合せを含む。
本明細書の技法を、プログラムモジュールに含まれるものなど、コンピューティング環境内でターゲットの実プロセッサまたは仮想プロセッサ上で実行される、コンピュータ実行可能命令の全般的な文脈で説明することができる。一般に、プログラムモジュールは、特定のタスクを実行するか特定の抽象データ型を実施する、ルーチン、プログラム、ライブラリ、オブジェクト、クラス、コンポーネント、データ構造などを含む。プログラムモジュールの機能性を、様々な実施形態で、望み通りに組み合わせ、またはプログラムモジュールの間で分割することができる。プログラムモジュールのコンピュータ実行可能命令を、ローカルコンピューティング環境内または分散コンピューティング環境内で実行することができる。
提示のために、詳細な説明は、「判定する」、「生成する」、「比較する」、および「書き込む」などの用語を使用して、コンピューティング環境内のコンピュータ動作を記述する。これらの用語は、コンピュータによって実行される動作の高水準の抽象であり、人間によって実行される行為と混同してはならない。これらの用語に対応する実際のコンピュータ動作は、実施態様に依存して変化する。
本明細書で説明した主題の多数の可能な変形形態に鑑みて、我々は、本発明として、添付の特許請求の範囲およびその同等物の範囲に含まれるすべての実施形態を請求する。
原子的メモリトランザクションブロックを含むソースコードをコンパイルするのに使用されるコンパイラを示すブロック図である。 図1のコンパイラのコンポーネントを示すブロック図である。 トランザクショナルメモリを使用するプログラムをコンパイルし、実行する、例のプロセスを示す流れ図である。 トランザクショナルメモリを用いるプログラムをコンパイルするために図1のコンパイラによって実行される、例のプロセスを示す流れ図である。 高水準ソフトウェアトランザクショナルメモリ最適化を実行するために図1のコンパイラによって実行される、例のプロセスを示す流れ図である。 分解されたソフトウェアトランザクショナルメモリ命令をコンパイル中に最適化するために図1のコンパイラによって実行される、例のプロセスを示す流れ図である。 強い原子性を実施する動作を導入するために図1のコンパイラによって実行される、例のプロセスを示す流れ図である。 read−to−updateアップグレードを除去するために図1のコンパイラによって実行される、例のプロセスを示す流れ図である。 read−to−updateアップグレードを除去するために図1のコンパイラによって実行されるもう1つの例のプロセスを示す流れ図である。 プロシージャ呼出しの前後で動作を移動するために図1のコンパイラによって実行される、例のプロセスを示す流れ図である。 新たに割り振られたオブジェクトに関するログ動作を除去するために図1のコンパイラによって実行される、例のプロセスを示す流れ図である。 新たに割り振られたオブジェクトに関するログ動作を除去するために図1のコンパイラによって実行されるもう1つの例のプロセスを示す流れ図である。 ソフトウェアトランザクショナルメモリシステムのランタイム環境内でランタイム中に使用されるソフトウェアモジュールを含むブロック図である。 マルチユースヘッダワードを使用する例示的オブジェクトを示すブロック図である。 マルチユースヘッダワードを使用する例示的オブジェクトを示すブロック図である。 変化するスナップショットを有する例示的オブジェクトを示すブロック図である。 変化するスナップショットを有する例示的オブジェクトを示すブロック図である。 スナップショットを使用してオブジェクトを妥当性検査する、図6のランタイム環境の、例のプロセスを示す流れ図である。 膨張させられたヘッダワードを使用してオブジェクトのスナップショットを変更する、図6のランタイム環境の、例のプロセスを示す流れ図である。 トランザクション実行の例を示すブロック図である。 トランザクション実行の例を示すブロック図である。 トランザクション実行のもう1つの例を示すブロック図である。 トランザクション実行のもう1つの例を示すブロック図である。 トランザクション実行のもう1つの例を示すブロック図である。 ログフィルタリングのために図6のランタイム環境で使用される、例のアソシアティブテーブルを示すブロック図である。 図13のアソシアティブテーブルを使用してログエントリをフィルタリングする、図6のランタイム環境の、例のプロセスを示す流れ図である。 図13のアソシアティブテーブルを使用してログエントリをフィルタリングする、図6のランタイム環境のもう1つの例のプロセスを示す流れ図である。 ガーベジコレクション中にログを圧縮する、図6のランタイム環境の実行される例のプロセスを示す流れ図である。 ガーベジコレクション中にログを圧縮する、図6のランタイム環境の実行されるもう1つの例のプロセスを示す流れ図である。 ガーベジコレクション中にログを圧縮する、図6のランタイム環境の実行されるもう1つの例のプロセスを示す流れ図である。 本明細書の技法を実施するのに適するコンピューティング環境を示すブロック図である。

Claims (3)

  1. 処理ユニットおよびコンパイラを含むコンピュータシステムが実行する方法であって、前記方法は、前記コンパイラがプログラムをコンパイルするために実行され、前記プログラムは、「atomic{」という文字列と「}」で囲まれた箇所である原子的ブロックを含み、前記方法は、
    処理ユニットが、ソフトウェアトランザクショナルメモリへの命令であるソフトウェアトランザクショナルメモリ(以下、STMともいう)命令を、各原子ブロック内に挿入すること(420)であって、原子的ブロック内の読取または書込の全てのソースコードの前後に正しいワードベースの読取STM命令および書込STM命令を挿入することによって、STM命令を各原子的ブロック内に挿入すること(420)と、
    処理ユニットが、前ワードベースの読取STM命令および書込STM命令分解された命令に置き換えること(440)と、
    処理ユニットが、ソフトウェアトランザクショナルメモリ命令を含む最適化されたプログラムを作成するために前記プログラムを最適化すること(460)であって、該最適化することは、前記分解されたソフトウェアトランザクショナルメモリ命令を処理するよう構成された所定の関数による処理である除去手順を実行することを含む、最適化すること(460)と、
    コンパイラが、前記最適化されたプログラムをコンパイルすること(340)とを含み、
    除去手順は、同じトランザクション内で更新のためにオブジェクトをオープンする命令の後に発生する読み出しのためのオブジェクトをオープンする命令を除去するか、またはトランザクション内での、メモリアドレスに対する重複する読み出し命令および書き込み命令を除去または、メモリアドレスに対する重複するログを除去し、
    プログラムを最適化することは、他の原子的ブロック内で行われるメモリアクセスだけではなく、全てのメモリアクセスに関して分割不能に実行するように見える強い原子性を原子的ブロックに与えることにより、原子的ブロックの外部で発生する原子的ブロック内のフィールドに対するメモリアクセスである非トランザクショナルなメモリ動作を増補することを含み、
    非トランザクショナルなメモリ動作を増補することは、
    前記非トランザクショナルなメモリ動作の前に、非トランザクショナルなメモリ動作によるアクセスのためにオブジェクトをオープンするオープン処理を挿入することと、
    前記非トランザクショナルなメモリ動作の後に、非トランザクショナルなメモリ動作の実行中にオブジェクトに対する衝突するアクセスがあったか否かを決定するコミット処理を挿入することとを含み、
    前記非トランザクショナルなメモリ動作が読み出し処理である場合は、
    前記オープン処理は、非トランザクショナルなメモリ動作の実行の前にオブジェクトの状態の表示を取り出すように構成され、
    前記コミット処理は、
    前記非トランザクショナルなメモリ動作の実行の後に、オブジェクトの状態の表示を取り出し、
    前記オブジェクトの状態が衝突するアクセスを示す場合に、読み出しが可能となるまで、前記オープン動作、前記読取動作、および前記コミット動作をループさせ、または、
    前記非トランザクショナルなメモリ動作が書込み処理である場合は、
    前記オープン処理は、オブジェクトに対する書き込みアクセスを取得するよう構成され、
    コミット処理は、オブジェクトに対してなされる書き込みをコミットするよう構成されていることを特徴とする方法。
  2. プログラムを最適化する最適化を実行することは、コード移動最適化を実行することを含むことを特徴とする請求項1に記載の方法。
  3. メモリトランザクションの外のオブジェクトをアクセスする1つまたはそれ以上のメモリ処理を識別することを含むことを特徴とする請求項1または2に記載の方法。
JP2008544369A 2005-12-07 2006-11-27 ソフトウェアトランザクショナルメモリ動作の最適化 Expired - Fee Related JP5284103B2 (ja)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US74838605P 2005-12-07 2005-12-07
US60/748,386 2005-12-07
US11/389,451 US8799882B2 (en) 2005-12-07 2006-03-23 Compiler support for optimizing decomposed software transactional memory operations
US11/389,451 2006-03-23
PCT/US2006/045526 WO2007067390A2 (en) 2005-12-07 2006-11-27 Optimization of software transactional memory operations

Publications (2)

Publication Number Publication Date
JP2009523271A JP2009523271A (ja) 2009-06-18
JP5284103B2 true JP5284103B2 (ja) 2013-09-11

Family

ID=38123382

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008544369A Expired - Fee Related JP5284103B2 (ja) 2005-12-07 2006-11-27 ソフトウェアトランザクショナルメモリ動作の最適化

Country Status (9)

Country Link
US (1) US8799882B2 (ja)
EP (1) EP1958063A4 (ja)
JP (1) JP5284103B2 (ja)
KR (1) KR101354796B1 (ja)
AU (1) AU2006322227B2 (ja)
BR (1) BRPI0619137A2 (ja)
NO (1) NO20081583L (ja)
RU (1) RU2433453C2 (ja)
WO (1) WO2007067390A2 (ja)

Families Citing this family (68)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7747659B2 (en) * 2004-01-05 2010-06-29 International Business Machines Corporation Garbage collector with eager read barrier
US7747565B2 (en) * 2005-12-07 2010-06-29 Microsoft Corporation Garbage collector support for transactional memory
US8799882B2 (en) 2005-12-07 2014-08-05 Microsoft Corporation Compiler support for optimizing decomposed software transactional memory operations
US7797329B2 (en) * 2006-06-09 2010-09-14 Oracle America Inc. Method and system for enabling a synchronization-free and parallel commit phase
US7865885B2 (en) * 2006-09-27 2011-01-04 Intel Corporation Using transactional memory for precise exception handling in aggressive dynamic binary optimizations
US7913236B2 (en) * 2006-09-29 2011-03-22 Intel Corporation Method and apparatus for performing dynamic optimization for software transactional memory
CN101681282A (zh) 2006-12-06 2010-03-24 弗森多系统公司(dba弗森-艾奥) 用于共享的、前端、分布式raid的装置、系统和方法
US8719807B2 (en) * 2006-12-28 2014-05-06 Intel Corporation Handling precompiled binaries in a hardware accelerated software transactional memory system
US8924782B2 (en) * 2007-01-26 2014-12-30 The Trustees Of Columbia University In The City Of New York Systems, methods, and media for recovering an application from a fault or attack
US8095750B2 (en) * 2007-05-14 2012-01-10 International Business Machines Corporation Transactional memory system with fast processing of common conflicts
US8095741B2 (en) 2007-05-14 2012-01-10 International Business Machines Corporation Transactional memory computing system with support for chained transactions
US8117403B2 (en) 2007-05-14 2012-02-14 International Business Machines Corporation Transactional memory system which employs thread assists using address history tables
US9009452B2 (en) 2007-05-14 2015-04-14 International Business Machines Corporation Computing system with transactional memory using millicode assists
CN101821721B (zh) * 2007-07-26 2017-04-12 起元技术有限责任公司 具有误差处理的事务型基于图的计算
US8359586B1 (en) * 2007-08-20 2013-01-22 The Mathworks, Inc. Code generation
US8140483B2 (en) * 2007-09-28 2012-03-20 International Business Machines Corporation Transaction log management
WO2009076654A1 (en) * 2007-12-12 2009-06-18 University Of Washington Deterministic multiprocessing
US8341607B2 (en) * 2008-03-13 2012-12-25 International Business Machines Corporation Condensing pattern matcher generation for intermediate language patterns
US8214833B2 (en) 2008-05-12 2012-07-03 Oracle America, Inc. Systems and methods for supporting software transactional memory using inconsistency-aware compilers and libraries
US8839213B2 (en) 2008-06-27 2014-09-16 Microsoft Corporation Optimizing primitives in software transactional memory
US9047139B2 (en) * 2008-06-27 2015-06-02 Microsoft Technology Licensing, Llc Primitives for software transactional memory
US8769514B2 (en) * 2008-06-27 2014-07-01 Microsoft Corporation Detecting race conditions with a software transactional memory system
CN101425052B (zh) * 2008-12-04 2010-06-09 中国科学院计算技术研究所 一种事务性内存的实现方法
US8612929B2 (en) * 2008-12-10 2013-12-17 Oracle America, Inc. Compiler implementation of lock/unlock using hardware transactional memory
US9424013B2 (en) * 2008-12-29 2016-08-23 Oracle America, Inc. System and method for reducing transactional abort rates using compiler optimization techniques
US8266604B2 (en) * 2009-01-26 2012-09-11 Microsoft Corporation Transactional memory compatibility management
US8688921B2 (en) * 2009-03-03 2014-04-01 Microsoft Corporation STM with multiple global version counters
US20100228929A1 (en) * 2009-03-09 2010-09-09 Microsoft Corporation Expedited completion of a transaction in stm
US8838656B1 (en) * 2009-07-31 2014-09-16 Hiscamp Systems, Inc. Hardware-protected reference count-based memory management using weak references
US8566524B2 (en) 2009-08-31 2013-10-22 International Business Machines Corporation Transactional memory system with efficient cache support
US9639392B2 (en) * 2013-12-17 2017-05-02 Intel Corporation Unbounded transactional memory with forward progress guarantees using a hardware global lock
US9122579B2 (en) 2010-01-06 2015-09-01 Intelligent Intellectual Property Holdings 2 Llc Apparatus, system, and method for a storage layer
US8495607B2 (en) * 2010-03-01 2013-07-23 International Business Machines Corporation Performing aggressive code optimization with an ability to rollback changes made by the aggressive optimizations
WO2011143628A2 (en) 2010-05-13 2011-11-17 Fusion-Io, Inc. Apparatus, system, and method for conditional and atomic storage operations
US8789025B2 (en) * 2010-07-14 2014-07-22 International Business Machines Corporation Path-sensitive analysis for reducing rollback overheads
WO2012016089A2 (en) 2010-07-28 2012-02-02 Fusion-Io, Inc. Apparatus, system, and method for conditional and atomic storage operations
US8719581B2 (en) * 2010-09-22 2014-05-06 Savant Systems, Llc Programmable multimedia controller with flexible user access and shared device configurations
US8549504B2 (en) * 2010-09-25 2013-10-01 Intel Corporation Apparatus, method, and system for providing a decision mechanism for conditional commits in an atomic region
US9189297B2 (en) 2010-12-14 2015-11-17 Hewlett-Packard Development Company, L.P. Managing shared memory
WO2012129191A2 (en) 2011-03-18 2012-09-27 Fusion-Io, Inc. Logical interfaces for contextual storage
US8600949B2 (en) * 2011-06-21 2013-12-03 Netapp, Inc. Deduplication in an extent-based architecture
CN103092742B (zh) * 2011-10-31 2015-08-19 国际商业机器公司 程序日志记录优化方法和系统
US9274937B2 (en) 2011-12-22 2016-03-01 Longitude Enterprise Flash S.A.R.L. Systems, methods, and interfaces for vector input/output operations
US10133662B2 (en) 2012-06-29 2018-11-20 Sandisk Technologies Llc Systems, methods, and interfaces for managing persistent data of atomic storage operations
US9251086B2 (en) 2012-01-24 2016-02-02 SanDisk Technologies, Inc. Apparatus, system, and method for managing a cache
US9715388B2 (en) * 2012-03-30 2017-07-25 Intel Corporation Instruction and logic to monitor loop trip count and remove loop optimizations
US9141351B2 (en) * 2012-05-01 2015-09-22 Oracle International Corporation Indicators for resources with idempotent close methods in software programs
US8880959B2 (en) * 2012-06-15 2014-11-04 International Business Machines Corporation Transaction diagnostic block
US8688661B2 (en) * 2012-06-15 2014-04-01 International Business Machines Corporation Transactional processing
US20130339680A1 (en) * 2012-06-15 2013-12-19 International Business Machines Corporation Nontransactional store instruction
US9367323B2 (en) * 2012-06-15 2016-06-14 International Business Machines Corporation Processor assist facility
US10437602B2 (en) * 2012-06-15 2019-10-08 International Business Machines Corporation Program interruption filtering in transactional execution
US9292288B2 (en) * 2013-04-11 2016-03-22 Intel Corporation Systems and methods for flag tracking in move elimination operations
US10255158B2 (en) 2013-10-15 2019-04-09 Oracle International Corporation Monitoring and diagnostics of business transaction failures
US9652353B2 (en) * 2013-10-15 2017-05-16 Oracle International Corporation Monitoring business transaction failures involving database procedure calls
GB2539958B (en) * 2015-07-03 2019-09-25 Advanced Risc Mach Ltd Data processing systems
US9928064B2 (en) 2015-11-10 2018-03-27 International Business Machines Corporation Instruction stream modification for memory transaction protection
US10133561B1 (en) 2017-08-30 2018-11-20 International Business Machines Corporation Partial redundancy elimination with a fixed number of temporaries
KR102600283B1 (ko) 2017-12-05 2023-11-08 삼성전자주식회사 전자 장치 및 이를 이용한 명령어 처리 방법
CN110119274A (zh) * 2018-02-05 2019-08-13 北京智明星通科技股份有限公司 一种数据编译的方法、装置以及电子终端、计算机可读存储介质
US11474943B2 (en) 2018-12-21 2022-10-18 Home Box Office, Inc. Preloaded content selection graph for rapid retrieval
US11829294B2 (en) 2018-12-21 2023-11-28 Home Box Office, Inc. Preloaded content selection graph generation
US11474974B2 (en) 2018-12-21 2022-10-18 Home Box Office, Inc. Coordinator for preloading time-based content selection graphs
US11269768B2 (en) 2018-12-21 2022-03-08 Home Box Office, Inc. Garbage collection of preloaded time-based graph data
US11204924B2 (en) * 2018-12-21 2021-12-21 Home Box Office, Inc. Collection of timepoints and mapping preloaded graphs
US11475092B2 (en) 2018-12-21 2022-10-18 Home Box Office, Inc. Preloaded content selection graph validation
US11361400B1 (en) 2021-05-06 2022-06-14 Arm Limited Full tile primitives in tile-based graphics processing
WO2023050147A1 (zh) * 2021-09-29 2023-04-06 长江存储科技有限责任公司 用于存储器的数据保护方法及其存储装置

Family Cites Families (55)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5535352A (en) 1994-03-24 1996-07-09 Hewlett-Packard Company Access hints for input/output address translation mechanisms
KR970076271A (ko) * 1996-05-17 1997-12-12 문정환 확장 메모리 모듈
US5949088A (en) * 1996-10-25 1999-09-07 Micron Technology, Inc. Intermediate SRAM array product and method of conditioning memory elements thereof
US6067550A (en) 1997-03-10 2000-05-23 Microsoft Corporation Database computer system with application recovery and dependency handling write cache
US6059840A (en) 1997-03-17 2000-05-09 Motorola, Inc. Automatic scheduling of instructions to reduce code size
US6151704A (en) 1997-04-01 2000-11-21 Intel Corporation Method for optimizing a loop in a computer program by speculatively removing loads from within the loop
US6216218B1 (en) * 1997-11-03 2001-04-10 Donald L. Sollars Processor having a datapath and control logic constituted with basis execution blocks
US6560773B1 (en) 1997-12-12 2003-05-06 International Business Machines Corporation Method and system for memory leak detection in an object-oriented environment during real-time trace processing
US6247174B1 (en) 1998-01-02 2001-06-12 Hewlett-Packard Company Optimization of source code with embedded machine instructions
US6289357B1 (en) 1998-04-24 2001-09-11 Platinum Technology Ip, Inc. Method of automatically synchronizing mirrored database objects
US6272607B1 (en) * 1998-08-28 2001-08-07 International Business Machines Corporation Method and apparatus for transactional writing of data into a persistent memory
US6694340B1 (en) 1998-09-24 2004-02-17 International Business Machines Corporation Technique for determining the age of the oldest reading transaction with a database object
US6553392B1 (en) 1999-02-04 2003-04-22 Hewlett-Packard Development Company, L.P. System and method for purging database update image files after completion of associated transactions
US6622300B1 (en) * 1999-04-21 2003-09-16 Hewlett-Packard Development Company, L.P. Dynamic optimization of computer programs using code-rewriting kernal module
US6341285B1 (en) 1999-06-28 2002-01-22 Lucent Technologies Inc. Serial protocol for transaction execution in main-memory database systems
JP2001101044A (ja) * 1999-09-29 2001-04-13 Toshiba Corp トランザクショナルファイル管理方法、トランザクショナルファイルシステム及び複合トランザクショナルファイルシステム
US6427154B1 (en) 1999-12-16 2002-07-30 International Business Machines Corporation Method of delaying space allocation for parallel copying garbage collection
US6658652B1 (en) 2000-06-08 2003-12-02 International Business Machines Corporation Method and system for shadow heap memory leak detection and other heap analysis in an object-oriented environment during real-time trace processing
US6662362B1 (en) 2000-07-06 2003-12-09 International Business Machines Corporation Method and system for improving performance of applications that employ a cross-language interface
US6502111B1 (en) 2000-07-31 2002-12-31 Microsoft Corporation Method and system for concurrent garbage collection
RU2206119C2 (ru) 2000-09-22 2003-06-10 Закрытое акционерное общество "МЦСТ" Способ получения объектного кода
US6457023B1 (en) 2000-12-28 2002-09-24 International Business Machines Corporation Estimation of object lifetime using static analysis
US6795836B2 (en) 2000-12-29 2004-09-21 International Business Machines Corporation Accurately determining an object's lifetime
US7210122B2 (en) 2001-03-22 2007-04-24 International Business Machines, Corporation Method for reducing write barrier overhead
WO2002098048A2 (en) 2001-05-31 2002-12-05 Computer Associates Think, Inc. A method and system for online reorganization of databases
WO2003038683A1 (en) 2001-11-01 2003-05-08 Verisign, Inc. Transactional memory manager
JP3939975B2 (ja) 2001-12-14 2007-07-04 松下電器産業株式会社 ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム
US6970981B2 (en) 2001-12-21 2005-11-29 Tibco Software, Inc. Method and apparatus to maintain consistency between an object store and a plurality of caches utilizing transactional updates to data caches
US7278137B1 (en) 2001-12-26 2007-10-02 Arc International Methods and apparatus for compiling instructions for a data processor
US7010553B2 (en) 2002-03-19 2006-03-07 Network Appliance, Inc. System and method for redirecting access to a remote mirrored snapshot
US6898602B2 (en) 2002-04-22 2005-05-24 Sun Microsystems Inc. Measuring the exact memory requirement of an application through intensive use of garbage collector
US9052944B2 (en) 2002-07-16 2015-06-09 Oracle America, Inc. Obstruction-free data structures and mechanisms with separable and/or substitutable contention management mechanisms
US7103597B2 (en) 2002-10-03 2006-09-05 Mcgoveran David O Adaptive transaction manager for complex transactions and business process
US7069279B1 (en) 2002-11-04 2006-06-27 Savaje Technologies, Inc. Timely finalization of system resources
US7784044B2 (en) 2002-12-02 2010-08-24 Microsoft Corporation Patching of in-use functions on a running computer system
US6993540B2 (en) 2002-12-20 2006-01-31 Intel Corporation Prefetching memory objects into a shared cache during garbage collection with a three-finger Cheney scan in a multithreaded processing environment
US6862664B2 (en) 2003-02-13 2005-03-01 Sun Microsystems, Inc. Method and apparatus for avoiding locks by speculatively executing critical sections
US7089374B2 (en) 2003-02-13 2006-08-08 Sun Microsystems, Inc. Selectively unmarking load-marked cache lines during transactional program execution
US20050044538A1 (en) 2003-08-18 2005-02-24 Srinivas Mantripragada Interprocedural computing code optimization method and system
US7383246B2 (en) 2003-10-31 2008-06-03 International Business Machines Corporation System, method, and computer program product for progressive query processing
ATE526628T1 (de) * 2004-01-22 2011-10-15 Nec Lab America Inc System und verfahren zum modellieren, abstrahieren und analysieren von software
US7240171B2 (en) 2004-01-23 2007-07-03 International Business Machines Corporation Method and system for ensuring consistency of a group
US7587429B2 (en) 2004-05-24 2009-09-08 Solid Information Technology Oy Method for checkpointing a main-memory database
US7487497B2 (en) * 2004-08-26 2009-02-03 International Business Machines Corporation Method and system for auto parallelization of zero-trip loops through induction variable substitution
US7607123B2 (en) 2004-09-21 2009-10-20 Hewlett-Packard Development Company, L.P. Systems and methods for validating debug information for optimized code
US7325108B2 (en) 2005-03-15 2008-01-29 International Business Machines Corporation Method and system for page-out and page-in of stale objects in memory
US7716645B2 (en) * 2005-06-10 2010-05-11 International Business Machines Corporation Using atomic sets of memory locations
US7716630B2 (en) * 2005-06-27 2010-05-11 Ab Initio Technology Llc Managing parameters for graph-based computations
US7810086B2 (en) 2005-06-30 2010-10-05 Intel Corporation Safe code-motion of dangerous instructions during compiler optimization
US7536517B2 (en) 2005-07-29 2009-05-19 Microsoft Corporation Direct-update software transactional memory
US8799882B2 (en) 2005-12-07 2014-08-05 Microsoft Corporation Compiler support for optimizing decomposed software transactional memory operations
US7747565B2 (en) 2005-12-07 2010-06-29 Microsoft Corporation Garbage collector support for transactional memory
US7809903B2 (en) 2005-12-15 2010-10-05 Intel Corporation Coordinating access to memory locations for hardware transactional memory transactions and software transactional memory transactions
US7962923B2 (en) 2005-12-30 2011-06-14 Level 3 Communications, Llc System and method for generating a lock-free dual queue
US8214813B2 (en) 2007-01-12 2012-07-03 Microsoft Corporation Code optimization across interfaces

Also Published As

Publication number Publication date
NO20081583L (no) 2008-05-22
RU2008122968A (ru) 2009-12-20
AU2006322227A1 (en) 2007-06-14
KR20080071135A (ko) 2008-08-01
JP2009523271A (ja) 2009-06-18
US20070169030A1 (en) 2007-07-19
US8799882B2 (en) 2014-08-05
WO2007067390A3 (en) 2009-04-30
WO2007067390A2 (en) 2007-06-14
RU2433453C2 (ru) 2011-11-10
AU2006322227B2 (en) 2012-01-19
BRPI0619137A2 (pt) 2011-09-13
KR101354796B1 (ko) 2014-01-22
EP1958063A2 (en) 2008-08-20
EP1958063A4 (en) 2011-04-13

Similar Documents

Publication Publication Date Title
JP5284103B2 (ja) ソフトウェアトランザクショナルメモリ動作の最適化
US7590806B2 (en) Filtering of transactional memory operations using associative tables
US7669015B2 (en) Methods and apparatus to implement parallel transactions
US6530079B1 (en) Method for optimizing locks in computer programs
US9619281B2 (en) Systems and methods for adaptive integration of hardware and software lock elision techniques
JP2012128628A (ja) プログラムの最適化装置、最適化方法および最適化プログラム
US8769514B2 (en) Detecting race conditions with a software transactional memory system
US9239803B2 (en) Array object concurrency in STM
US8839213B2 (en) Optimizing primitives in software transactional memory
US9047139B2 (en) Primitives for software transactional memory
US20100228929A1 (en) Expedited completion of a transaction in stm
Sreeram et al. Hybrid transactions: Lock allocation and assignment for irrevocability

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20091028

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110506

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20110808

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20110815

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110906

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120413

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120713

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20121012

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130212

RD13 Notification of appointment of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7433

Effective date: 20130213

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20130213

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20130305

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20130430

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130529

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees