(58)【調査した分野】(Int.Cl.,DB名)
最近の修正の前記予め設定された条件は、前記書き込み操作前に、前記第1のデータが前記第1のプロセッサと異なる第2のプロセッサによって最後に修正されたことを含む、請求項1に記載の方法。
最近の修正の前記予め設定された条件は、前記書き込み操作前に、前記第1のデータが前記第1のプロセッサと異なる第2のプロセッサによって最後に修正されたことを含む、請求項15に記載のコンピューティングシステム。
【背景技術】
【0003】
コンピュータ技術は、マルチコアコンピューティングの方向に開発され続けており、消費電力と熱性能への懸念のため、この高性能コンピューティングの傾向は続く必要性がある。マルチコアアーキテクチャの使用を最適化するために、アプリケーションプログラムは多くの場合、シングルコア(プロセッサ)上でそれぞれ別個に動作するマルチスレッドに分けられ、より高い計算効率を有する並列コンピューティングを実現する。
【0004】
図1A及び
図1Bは、従来のマルチコアアーキテクチャの概略図を示す。
図1Aは、コア間を相互にコアを訪れることを可能にするために、(太線にて表示された)ルーティングシステムを使用して相互接続された16のCPUコアP1、P2、・・・P16を有する。
図1Bは、キャッシュ
*Ln及びLLCを備えたそれぞれのCPUコアの概略構造を示し、
*Lnは、第1レベルのキャッシュ(L1)及び/または第2レベルのキャッシュ(L2)を表し、一方、LLCはラストレベルキャッシュを意味する。
*Ln及びLLCはルーティングシステムを通じて接続され、LLCはルーティングシステムも通じて接続されたディレクトリを有する。プロセッサはメモリ(図示せず)からデータを読み取り、このデータはマルチコア(プロセッサ)のキャッシュ間に分配され得る。
【0005】
データの同期を維持するため、異なるスレッドは同期機構により管理され、共有領域にアクセスする必要があり得、これは従来、マルチスレッドによるシリアルアクセスを必要とした。トランザクショナルメモリの設計は、並列処理のレベルを上げるために導入されてきた。トランザクショナルメモリは、プログラムを多くのトランザクションに分け、それぞれのトランザクションを別々に処理することにより、コンピューティングに対処する。それぞれのトランザクションの処理の間、トランザクションの状態は、隠され、その他のプロセッサによる影響を受けない。トランザクションの処理後、結果が次にグローバルシステムにコミットされる。異なるスレッドが衝突し、そのためロックが必要であると「悲観的に」仮定する代わりに、トランザクショナルメモリは、衝突が検出されない限り、異なるスレッドが略衝突しないと仮定して、より「楽観的」手法を取る。衝突が検出された場合、プログラムの状態は衝突前の状態にロールバックされ、データの整合性を維持する。トランザクショナルメモリは現在、IBM社のBlue Gen及びIntel社のHaswellを含む、CPUのアーキテクチャにおいて使用されている。
【0006】
トランザクショナルメモリは、ソフトウェアまたはハードウェアの何れかを使用する、2つの異なる方法で実現され得る。ソフトウェアトランザクショナルメモリは、低効率で低速度であり、一方ハードウェアトランザクショナルメモリは、技術の有用性を著しく上げた。本開示は、ハードウェアトランザクショナルメモリに関する。
【0007】
トランザクショナルメモリは、マルチコアスレッドのうち、共有データの訪問は、書き込み−読み取り、読み取り−書き込み、及び書き込み−書き込みの衝突の発生がめったになく、したがってマルチスレッドは並行して操作可能であると仮定する。トランザクション中のデータの修正済の状態を隠し、衝突でロールバックすることによって、本システムの性能及びスケーラビリティはデータの整合性を損なうことなく上昇される。
【0008】
トランザクショナルメモリはマルチコアシステムの並行性を上昇させるが、衝突率は、プログラムの性能に悪影響を大きく与え得るロールバックの量が過剰になるために並行性のレベルが上昇するにつれ上がる。
【0009】
理論上は、事前無効化の技術は、共有データの修正時に衝突を著しく減少することにより、クリティカル領域の実行を改善し得る。しかしながら、事前無効化の技術は、グローバルデータの状態を変化させる必要がある。事前無効化が直接従来のトランザクショナルメモリの設計に適用される場合には、直接トランザクショナルメモリの設計と矛盾し、修正の間、隠された状態であることを必要とする。したがって、事前有効化及びトランザクショナルメモリは、単純に組み合わされることはできない。
【発明を実施するための形態】
【0018】
本開示は、添付の図及び例示的実施形態とともにさらに詳細に記載されている。記載においては、例えば、「技術(単数または複数)」という用語は、上述の文脈及び本開示を通して許可された、方法、機器装置、システム及び/またはコンピュータ可読命令を意味し得る。
【0019】
この記載においては、プロセスが記載されている順序は、限定するものと解釈されることを意図せず、任意の数の記載されたプロセスのブロックは、本方法または代替的な方法を実行するために任意の順序で組み合わされ得る。実施形態は説明の利便性のためのみに、連続した工程で記載されている。矛盾が生じない限り、本開示に記載された実施例及び実施形態並びにその特徴及び特色は自由に組み合わせられ得る。さらに、本開示の技術を実行するために、実施形態に記載されているすべての工程が必要とされるわけではない。
【0020】
典型的な構成においては、マルチコアシステムは、多数のプロセッサ(CPU)、1つ以上のI/Oインタフェース、ネットワークインタフェース及びメモリを含む。メモリは、揮発性メモリ、ランダムアクセスメモリ(RAM)、及び/または読み出し専用メモリ(ROM)若しくはフラッシュメモリ(フラッシュRAM)のような他の形態の不揮発性メモリのような、コンピュータ可読媒体を含み得る。計算装置の内部メモリは、コンピュータ可読メモリ媒体の一種である。プロセッサは内蔵のキャッシュメモリを有する。
【0021】
コンピュータ可読媒体は、永続的及び非永続的、取り外し可能及び取り外し不可能な媒体を含み、情報の記憶のために任意の方法や技術で形成され得る。記憶された情報は、コンピュータ可読命令、データ構造、プログラムモジュールまたはその他のデータのセットであり得る。コンピュータ記憶媒体の実施例は、相変化メモリ(PRAM)、スタティックランダムアクセスメモリ(SRAM)、ダイナミックランダムアクセスメモリ(DRAM)、その他の種類のランダムアクセスメモリ(RAM)、読み取り専用メモリ(ROM)、電気的に消去可能なプログラマブル読み取り専用メモリ(EEPROM)、フラッシュメモリ若しくはその他のメモリ技術、CD−ROM読み取り専用メモリ(CD−ROM)、デジタルヴァーサタイルディスク(DVD)若しくはその他の光記憶装置、磁気カセット、磁気テープディスクストレージ若しくはその他の磁気記憶装置または計算装置によってアクセス可能な情報を記憶するために使用され得る任意のその他の非伝達媒体を含むが、これらに限定されない。本開示の定義によると、コンピュータ可読媒体は、変調されたデータ信号及び搬送波のような、一時的なコンピュータ可読媒体(一過性の媒体)を含まない。
【0022】
以下、従来のハードウェアのトランザクショナルメモリの動作原理が始めに記載されている。
【0023】
従来のハードウェアのトランザクショナルメモリにおいては、プログラムコードはCPUに、Transaction_start及びTransaction_endのような命令を使用して、トランザクション領域のスタートとエンドがどこであるかを知らせる。スタートとエンドとの間は、実行するためのトランザクション領域である。トランザクション領域の実行が一旦行われると、Transaction_endの命令がCPUに修正済のデータを最小単位でコミットするよう依頼し、これはコミットのプロセスが割り込まれたり訪れられたりしないことを意味する。トランザクションの実行中、読み込み操作または書き込み操作を行ったすべてのメモリ領域は、書き込み−読み取り、読み取り−書き込み及び書き込み−書き込み衝突を避けるために監視され、トランザクショナルメモリのプロセスを実行中、すべての書き込み操作前の元データのコピーが保持されることを確保する。例えば、キャッシュラインは、対応する不可視のプライベートキャッシュ(例えば、第1レベルキャッシュL1)にコピーされ、キャッシュラインの任意の次に書き込まれたデータは不可視のプライベートキャッシュ中に保持され得る。衝突の場合においては、不可視のプライベートキャッシュ(例えば、L1)中の修正済のデータは破棄される。トランザクションが成功すると、不可視のプライベートキャッシュ(例えば、L1)中の修正済のデータは、元のデータを置き換える。
【0024】
通常、キャッシュデータの整合性と一貫性を維持する2つの方法、つまり、ブロードキャスト及びディレクトリがある。ブロードキャストの方法は、比較的少数のコアのアーキテクチャには、より好適である。一方、ディレクトリの方法は強力なスケーラビリティを有し、より大きなマルチコアシステムにより好適である。本開示は、開示された技術もまた原理においてはブロードキャストの方法に好適であるが、説明のための基礎として、主としてディレクトリの方法を使用する。
【0025】
図2にて示されているように、すべてのキャッシュラインはLLCディレクトリにおける多数のビット位置のデータ状態インデックスストリングを有する。
図2においては、ビット位置である「タグ」は、ディレクトリ中のキャッシュラインのインデックスマーカであり、通常、キャッシュラインデータの上位ビットに配置されている。「状態」とは、データ状態のインジケータであり、排他的、修正済、共有、及び無効の状態の任意のうちの一つであり得る。共有された状態では、データは1つ以上のプロセッサのプライベートキャッシュに分配される。データインジケータのビットP0、P1、…Pn−1のそれぞれは、nプロセッサCPU1、CPU2、…CPUn−1に対応する。CPUがキャッシュラインの分配されたデータを有する場合、それぞれのデータインジケータのビットは値「1」を有し、CPUがキャッシュラインの分配されたデータを有しない場合、それぞれのデータインジケータのビットは値「0」を有する。キャッシュラインが「修正済」の状態にあるとき、1つのCPU(プロセッサ)のみが最新のデータを有するであろう。すなわち、データ状態インデックスストリングのうち、1つのデータインジケータのビットのみが値「1」を有し、すべてのその他のデータインジケータのビットは値「0」を有するだろう。
【0026】
それぞれの書き込み操作は、キャッシュラインの状態(上に列挙した4つの状態のいずれかであり得る)は、「修正済」の状態に変更されることを要するであろう。「修正済」状態への変化においては、本システムは、データを無効化するために、元のデータのコピーを有するすべてのCPUに要求を送信する。すなわち、それぞれの対応するCPUのプライベートキャッシュのデータは無効化するよう命令され、CPUに対応するキャッシュライン中のデータインジケータのビットは「0」に設定され、CPUのプライベートキャッシュ中の新しく修正されたものを唯一の有効なデータにする。本プロセス後、その他のCPUはみな、修正済のデータを読み込む必要がある場合には、新しい修正済のデータを有するCPUのみからデータを読み込む必要があるだろう。CPUの数が増えるにしたがい、修正済のデータを読み込む時間も迅速に上昇する。トランザクショナルメモリのクリティカル領域中の修正済のデータのすべての読み込み、及び修正済のデータのすべての送信は、この速度を落とすプロセスを含む。本明細書にて開示されている本方法の目的は、このプロセスをより速く、かつ並列計算の時間を増加し、衝突率を下げることである。
【0027】
図3は、データ処理のための開示された方法における例示的実施形態のブロックフロー図である。
【0028】
S1ブロックでは、第1のプロセッサ(例えば、P1)はトランザクションの処理を開始する。トランザクションはプログラム中のマークされた領域によって定義され、通常、少なくとも第1のデータをシステムのメモリからプロセッサのプライベートキャッシュへと読み込むことを含む。トランザクションは多くの場合、データへの書き込み操作も含み得る。簡潔にするために、書き込み操作を行うのは、プロセッサのプライベートキャッシュにたった今読み込まれた第1のデータに対して行われる。
【0029】
ブロックS2では、トランザクションの処理の一部として、第1のプロセッサはプライベートキャッシュ中の第1のデータの書き込み操作を行う。書き込み操作が行われた後、第1のプロセッサは、次で説明されている通り、トランザクショナルメモリシステムにトランザクションの結果をコミットし始め得る。
【0030】
ブロックS3では、システムはトランザクションをコミットし始める。書き込み操作の前に、第1のデータが、第1のプロセッサとは異なる第2のプロセッサによって最後に修正されたという検出に対応して、本システムは第1のプロセッサのプライベートキャッシュ中の第1のデータを、多数のプロセッサによりアクセス可能なラストレベルキャッシュ(LLC)へと書き込む。本システムはさらに、キャッシュラインの状態インデックスストリングを設定し、LLCに書き込まれた第1のデータは第1のプロセッサによって最後に修正されたことを示し、第1のプロセッサのプライベートキャッシュ中の第1のデータを無効化する。
【0031】
本開示の一つの重要な態様は、第1のデータに書き込み操作を行う前に、第1のデータに行われた最近の修正の状態に応じて、システムはプロセッサのキャッシュメモリ中の修正済のデータを別々に処理する。システムが、データへの最後の修正に基いて、修正済のデータがその他のプロセッサによって読み込まれる可能性が高くなったと予測した場合には、データにたった今修正が行われた現在のプロセッサのプライベートキャッシュの代わりに、システムは修正済のデータをプロセッサのLLCにコミットする。上述のブロックS3で説明された実施例においては、予測は単に、書き込み操作の前に、第1のデータが、第1のプロセッサとは異なる第2のプロセッサによって最後に修正されたという検出に基づく。しかしながら、修正済のデータをLLCに移動することは、トランザクショナルメモリの効率化には全面的に有益である結果となり得るという、有意性のある予測に基づいた任意の条件は、使用され得ると理解されている。
【0032】
各データはトランザクショナルメモリ中のキャッシュラインに対応している。LLCディレクトリ中の対応するキャッシュラインのデータ状態インデックスストリングは、どのプロセッサがデータに最後に修正を行ったかを見分ける。それが現在のプロセッサ(本実施例の第1のプロセッサ)である場合には、従来のトランザクショナルメモリスキームが使用され得る。具体的には、修正済のデータは、現在のプロセッサのプライベートキャッシュ中に保持され得る。しかし、
図3に図示したように、現在のデータ(本実施例の第1のデータ)に修正を行ったのが別のプロセッサである場合には、現在のプロセッサによる書き込み操作の後、修正済のデータはLLCへと書き込まれる。その間、現在のプロセッサのプライベートキャッシュ中のデータが無効化され、より高い効率をもたらす事前無効化の影響を有するが、同時に、やみくもに使用されて事前無効化がトランザクショナルメモリの利点が失われないように、予測条件に基づいて選択的に行われる。
【0033】
換言すれば、予測条件に合致するキャッシュラインの場合、対応する修正済のデータは、現在のプロセッサの代わりにLLCに保存されるため、及び、さらに修正済のデータがコミットされると現在のプロセッサ中のデータは無効化されるため、この特定のデータへの任意のその後の修正は、LLCに保持されるコピーに対して行われ、これにより、プロセッサ間のデータトラフィックを避け、トランザクショナルメモリシステムの性能を上げる。さらに、開示された方法を使用すると、LLCに保存された修正済のデータの読み取り時間がプロセッサの数とともに迅速に増加しないため、本システムのスケーラビリティが改善される。
【0034】
本明細書において記載されている方法は、プロセッサの操作において自動的に実行されるようにプロセッサのロジックに直接事前に実装されるか、プロセッサによって実行されるべきアプリケーションソフトウェアの追加のコーディングを使用して実装されるかの何れかであり得る。後者の場合には、本明細書において記載されている方法は、プロセッサに追加のコーディングを使用して必要な機能を実行するよう命令することにより行われる。
【0035】
いくつかの実施形態では、第1のデータに書き込み操作を行うとき、本方法は、異なるプロセッサが書き込み操作の前に第1のデータに最後の修正を行ったという検出に対応して、キャッシュラインの状態インデックスストリングを設定し、第1のプロセッサのプライベートキャッシュに書き込まれた第1のデータの特別な状態を示す。特別な状態になると、第1のデータが修正され、トランザクションがコミットされるときにLLCに排他的に書き込まれるべきであると信号を送る。特別な状態の指定は、トランザクショナルメモリを調節するための効率的な信号として機能する。特別な状態は、修正済、排他的、共有または無効のような任意の一般に使用される状態とは異なるべきである。特別な状態の一例は、「修正済及び排他的」であり、これはデータが修正され、その他の修正されたものと比較して排他的または独特な特徴も有することを表している。同一のプロセッサ(本実施例の第1のプロセッサ)が書き込み操作の前に第1のデータに最後の修正を行ったということが検出された場合には、本方法は、キャッシュラインの状態インデックスストリングを設定し、第1のプロセッサのプライベートキャッシュに書き込まれた第1のデータの「修正済」の状態であることを示す。これは一般的なトランザクショナルメモリの設計と一致している。
【0036】
したがって、トランザクションの修正済のデータをコミットするときには、本方法はまた、第1のプロセッサのプライベートキャッシュ中の第1のデータが特別な状態であるとの認識に対応して、LLCディレクトリ中の修正済の第1のデータの状態も特別な状態に設定する。例えば、LLCディレクトリ中の修正済の第1のデータの状態は、LLC中の第1のデータが修正済の状態にあり、また、その他の修正済のデータと比較して排他的または独特な特徴を有することを示すために、「修正済及び排他的」と設定され得る。
【0037】
ブロックS4では、トランザクションの送信は完了する。
【0038】
要約すれば、システムが、第1のデータは現在書き込み操作を行っている同一のプロセスによって最後に修正されたと認識した場合には、共有のトランザクショナルメモリの方法を使用して修正済の第1のデータを扱う。しかし、システムが予測した条件に合致した(例えば、第1のデータが異なるプロセッサによって最後に修正された)と認識した場合には、本システムは、修正済のデータの状態を特別な状態(例えば、「修正済及び排他的」)に設定し、修正済のデータをLLCに移動することによって特別な処理を示す。この設計により、任意の次のトランザクションは、データがLLCに書き込まれたことを明瞭に通知され、(第1のデータに最後に書き込み操作が行われた)第1のプロセッサ中の対応するデータはすでに無効化されている。
【0039】
上記のようなトランザクション処理(ブロックS1を含む)は、2つの異なる場合で下記に記載されたサブブロックをさらに含み得る。
【0040】
第1の場合は、現在の第1のデータが通常の「修正された」状態、つまり特別な処理を必要としない場合である。
【0041】
サブブロックS11(図示せず)では、第1のプロセッサはトランザクションの処理を開始する。第1のデータがプライベートキャッシュに見られない場合には、システムはLLCディレクトリを訪れ、アドレスマッピングにより必要な第1のデータを見つける。
【0042】
サブブロックS12(図示せず)では、システムは、第1のデータのキャッシュラインに対応するLLCディレクトリ中の第1の状態インデックスストリングによる第1のデータの状態を得る。「修正済」の状態であれば、プロセスはサブブロックS13に進む。
【0043】
サブブロックS13(図示せず)では、第1のデータのインジケータストリングのデータインジケータビットに基づいて、システムは第1のデータを最後に修正したプロセッサの識別子を特定する。第2のプロセッサである場合には、システムは第2のプロセッサのプライベートキャッシュからLLCへ第1のデータを読み込み、LLC中の第1のデータの状態を「共有」に変更する。第1のプロセッサの場合には、プロセスは
図3のブロックS2に直接進み、以下のサブブロックS14を省き、第1のプロセッサのプライベートキャッシュ中の第1のデータに書き込み操作を行う。この場合、第1のデータの状態が特別な「修正済及び排他的」な状態ではなく、通常の「修正済」の状態のため、修正された第1のデータは第1のプロセッサのプライベートキャッシュ中に保持される。
【0044】
第2のプロセッサのプライベートキャッシュ中の修正された第1のデータがLLCに読み込まれたサブブロックS13から続くサブブロックS14(図示せず)では、システムは、次に、LLCからの第1のデータを第1のプロセッサのプライベートキャッシュへと読み込み、第1のプロセッサに対応する、第1の状態インデックスストリング中のデータインジケータのビットの値を「1」に設定する。
【0045】
上記のサブブロックS13は、第1のデータの状態が「修正済及び排他的」のような特別な状態ではなく、通常の「修正済」であるトランザクショナルメモリプロセスを表す。第1のデータが以前に、本明細書で開示された、特別に改善されたトランザクショナルメモリの方法を使用して処理されていないときに、この場合が起こる。サブブロックS13が行われる前では、最新の第1のデータが第2のプロセッサに保持される場合には、次に第1のプロセッサが第1のデータを読み込むために、システムは、はじめに第2のプロセッサから第1のデータをLLCに読み込む必要がある。この場合には、第1のプロセッサが第1のデータに書き込み操作を行った後、第2のプロセッサ中の第1のデータは無効化されるべきである。
【0046】
本明細書で記載された多くのその他の工程またはブロックのように、サブブロックS14及び第1のデータの状態を「共有」に変更する工程は、実行されるときに任意の特定の順序を必要とせず、同時に実施してよいということに注意する。
【0047】
第2の場合は、異なる処理を受ける、現在の第1のデータが「修正済及び排他的」な特別の状態にある場合である。
【0048】
サブブロックS11’(図示せず)では、第1のプロセッサはトランザクションを処理し始める。第1のデータがプライベートキャッシュ中に見つからない場合には、システムはアドレスマッピングにしたがいLLCディレクトリを訪れ、必要な第1のデータを見つける。
【0049】
サブブロックS12’(図示せず)では、システムは、第1のデータのキャッシュラインに対応するLLCディレクトリ中の第1の状態インデックスストリングによる第1のデータの状態を得る。状態が「修正済及び排他的」であれば、プロセスはサブブロックS13’に進む。
【0050】
サブブロックS13’(図示せず)では、システムはLLCディレクトリ中の第1のデータの状態を「修正済及び排他的」な状態に変更し、「修正済及び排他的」という特別な状態にあった第1のデータがここで第1のプロセッサで共有されることを示す。
【0051】
サブブロックS14’(図示せず)では、第1のデータの「修正済及び排他的」な特別な状態に基づくため、システムは修正された第1のデータがすでにLLCにあることを認識する。よって、システムは、LLCからの第1のデータを第1のプロセッサのプライベートキャッシュへと読み込み、第1のプロセッサに対応する、第1の状態インデックスストリング中のデータインジケータのビットの値を「1」に設定する。
【0052】
本明細書で記載された多くのその他の工程またはブロックのように、サブブロックS13’及びサブブロックS14’は、実行されるときに任意の特定の順序を必要とせず、同時に実行してよいということに注意する。
【0053】
上記のサブブロック13’は、第1のデータの状態が「修正済及び排他的」という特別な状態である、トランザクショナルメモリプロセスを表す。第1のデータが以前に、本明細書で開示された、特別に改善されたトランザクショナルメモリの方法を使用して既に処理されたときに、この場合が起こる。サブブロック13’が行われる前の時点で、最新の第1のデータはLLCに保持される。第1のプロセッサが第1のデータを読み込むためには、システムはLLCから第1のデータを第1のプロセッサに読み込まねばならない。この場合、第1のプロセッサがLLCから第1のデータを読み込んだ後、第1のデータが多数のプロセッサ間で共有され得る通常の「共有された」状態と区別するため、第1のデータの状態を「修正済及び共有された」状態に変更するべきである。「修正済及び共有された」特別な状態においては、その他のプロセッサは、第1のデータの有効なコピーを有さなくて良い。第1のデータは、現在の状態でLLCと第1のプロセッサの両方にあるという意味において「共有され」ており、第1のデータは依然として最新であるという意味において「修正され」ている。この区別が、その他のプロセッサ中に保持された第1のデータを無効化する必要があるか否かを決定する、次のプロセスに役立つ。
【0054】
前述したようにトランザクションをコミットするプロセス(ブロックS3を含む)は、さらに以下に記載するプロセスを含み得る。
【0055】
トランザクションをコミットするプロセスの間、トランザクションの間、第1のプロセッサが第1のデータへの書き込み操作を実行したと仮定すると、システムはLLCディレクトリ中の第1のデータのデータインジケータのビットのそれぞれを調べ、第1のプロセッサのデータインジケータのビット(P1)に加えて、対応するデータインジケータのビットが値「1」を有する任意のその他のプロセッサがあるかどうかを判定し得る。ある場合には、システムは、(現在の第1のプロセッサ以外の)これらのプロセッサ中の第1のデータの無効化へ進み、対応するデータインジケータのビットを再設定する(すなわち、値を「0」の設定に戻す)。
【0056】
このようにして、開示されて改善された方法が第1のデータにはじめて適用されるか否かにかかわらず、トランザクションをコミットした後、(第1のデータに対応する)第1の状態インデックスストリング中の状態インジケータは、常に「修正済及び排他的」であると言われる。さらに、すべてのデータインジケータのビットのうち、第1のプロセッサに対応するビットのみが、第1のプロセッサが第1のデータを最後に修正したことを示す値「1」を有する。
【0057】
以下に、従来の方法と比較して、開示されたデータ処理方法を示す3つの具体例が記載されている。
【0058】
第1の実施例では、データ処理は後述のように従来の方法に見られるような通常の手段で行われる。
【0059】
データが修正済であるとみなし、かつすべてのその他のCPU中のデータを無効化した後、CPU1のプライベートキャッシュのみが最新のデータを有する。LLCディレクトリは、CPU1が最新のデータを有し、データの現在の状態が「修正済」であるというステータスを反映する。
図4は、状態インジケータが「修正済」である、LLCディレクトリ中の状態インデックスストリングの初期ステータスを示し、CPU1に対応するデータインジケータのビットP1のみが値「1」を有し、すべてのその他のデータインジケータのビットは値「0」を有する。
【0060】
図5は、ブロック101〜ブロック111を含む、トランザクション中の読み取り−書き込み操作を実行するCPU0を示す。
【0061】
ブロック101では、CPU0はトランザクションを処理し始める。
【0062】
ブロック102では、CPU0は、最初に自身のプライベートキャッシュ中のデータを読み取ろうとする。
【0063】
ブロック103では、CPU0のプライベートキャッシュがデータを有しないと検出すると、CPU0は、データのアドレスマッピングにしたがいLLCディレクトリを訪問する。
【0064】
ブロック104では、LLCディレクトリにより、システムはCPU1が最新のデータを有すると判断し、CPU1にデータを主メモリに書き込むよう命令する。同時に、システムはまた、CPU1のプライベートキャッシュからデータをLLCに読み込み、データに対応するキャッシュラインのLLCディレクトリの状態インジケータを「共有」に設定し、データインジケータのビットP0を、(すでに「1」であるべきデータインジケータのビットP1とともに)「1」に設定し、データをLLCからCPU0へと送信する。
図6はLLCディレクトリ中の状態インデックスストリングの現在のステータスを示す。
【0065】
ブロック105では、CPU0はデータを自身のプライベートキャッシュに保存する。対応するキャッシュラインはここで、「共有された」状態を有する。データの読み取りが終了する。
【0066】
ブロック106では、CPU0は自身のプライベートキャッシュ中のデータを操作する。トランザクションがコミットされる前に、任意の書き込み操作の結果はグローバルな状態に影響を与えるためにLLCに返信されない。
【0067】
ブロック107では、CPU0はトランザクションの結果をトランザクションメモリシステムにコミットし始める。
【0068】
ブロック108では、この時点でキャッシュラインの状態が「共有」であるため、任意の書き込み操作は、その他のCPUのプライベートキャッシュ中の同一のデータが無効化されていることを要するであろう。これをするためには、CPU0はLLCディレクトリをデータのアドレスマッピングにしたがい点検する。
【0069】
ブロック109では、LLCディレクトリに基づき、CPU1がデータのコピーを有すると判定される。よって、CPU1のプライベートキャッシュ中のデータは、無効化されており、対応するデータインジケータのビットP1は値「0」に再設定される。
【0070】
ブロック110では、システムはLLCディレクトリの対応するキャッシュラインの状態インデックスストリングを設定する。
図7に示すように、状態インジケータが「修正済」に設定され、データインジケータのビットP0は「1」である。一方、すべてのその他のデータインジケータのビットは「0」であり。データはCPU0のみで見られることを示している。
【0071】
ブロック111では、トランザクションをトランザクショナルメモリに送信することが完了する。
【0072】
衝突を避けるために、ブロック107〜ブロック110はコミットするときにアトミック処理に組み合わされる。
【0073】
CPU0のプライベートキャッシュ中のキャッシュラインの状態は、本トランザクションの最後で「修正済」であることが理解できる。次にCPU1が同一のデータを操作する場合、CPU0とCPU1の置き換えのみを行い、上述のプロセスを繰り返す必要があろう。このプロセスが別のCPUのプライベートキャッシュを訪問する1つのCPUを含むため(例えば、他方のCPUからデータを読み取り、次にその他方のCPUのデータを無効化することを含む)、CPUコアの数の増加にしたがって遅延が増加するであろう。この上述した第1の実施例は、従来のトランザクショナルメモリの方法による例示的なプロセスを示す。
【0074】
第2の実施例では、データ処理は、本開示による異なる方法にて行われる。本方法は、事前無効化の技術にトランザクショナルメモリをシームレスに組み合わせ、トランザクションメモリの処理を加速する。
【0075】
最初にデータは、「修正済」の状態でCPU1のプライベートキャッシュ内にあることを依然として仮定する。LLCディレクトリ中のデータの初期の状態インデックスストリングは、
図4に示されたものと同一である。
【0076】
図8は、ブロック201〜ブロック211を含む、第2の実施例のデータ処理のブロックフロー図を示す。
【0077】
ブロック201〜ブロック205は、ブロック101〜ブロック105と同一である。例えば、ブロック204では、LLCディレクトリ中のキャッシュラインの状態インデックスストリングは
図6に示されている。すなわち、データインジケータのビットP0及びP1は両方共「1」であるが、状態インジケータは「共有」に設定される。
【0078】
ブロック206では、CPU0は自身のプライベートキャッシュ中のデータを操作する。トランザクションがコミットされる前に、任意の書き込み操作の結果はグローバルな状態に影響を与えるためにLLCに返信されない。CPU0が読み取り操作のみ行う場合には、CPU0のプライベートキャッシュ中のデータは、「共有」の状態に設定される。CPU0が書き込み操作を行う場合には、CPU0は、データが別のCPU(本実施例ではCPU1)によって最後に修正されたと認識するため、CPU0のプライベートキャッシュ中のデータは、ここで特別な状態、例えば「修正済及び排他的」に設定される。
【0079】
しかしながら、データが同一のCPUにより最後に修正された場合には(本実施例ではCPU0、図示されていない)、CPU0のプライベートキャッシュ中のデータは、通常の状態の「修正済」に設定されるであろう。
【0080】
ブロック207では、CPU0はトランザクションの結果をトランザクションメモリシステムにコミットし始める。
【0081】
ブロック208では、システムはデータのアドレスマッピングにしたがいLLCディレクトリを点検し、無効化を行う。この時点でのキャッシュラインの状態は、修正履歴及びトランザクションにおける操作により、いくつかの可能性を有する。トランザクションが読み取り操作のみ行った場合には、キャッシュラインの状態は「共有」になるであろう。最後の修正を行った前のプロセッサ(本実施例ではCPU1)に保持されたデータは最新のままであるため、システムは、CPU0のプライベートキャッシュ中のデータを無効化し得る。トランザクションが書き込み操作をした場合には、この時点でのキャッシュラインの状態は、書き込み操作の前の修正履歴に応じて、「修正済及び排他的」または「修正済」の何れかであろう。いずれの場合においても、その他のプロセッサのプライベートキャッシュにおけるデータは、無効化される必要があり得る。
【0082】
ブロック209では、LLCディレクトリに基づき、CPU1がデータのコピーを有すると決定する。よって、CPU1のプライベートキャッシュ中のデータは、無効化され、対応するデータインジケータのビットP1は値「0」に再設定される。
【0083】
この時点でのキャッシュラインの状態が「修正済及び排他的」である場合には、修正履歴の予測条件が合致することを示し、システムは(「修正済及び排他的」な状態を有する)CPU0のプライベートキャッシュ中のデータをLLCに書き込み、CPU0のプライベートキャッシュ中のデータを無効化する。この時点でのキャッシュラインの状態が「修正済」である場合には、データはCPU0のプライベートキャッシュ中に保持される。
【0084】
ブロック210では、システムは、LLCディレクトリにおいて、CPU0が書き込み操作を実行したデータの状態インデックスストリングを設定する。
図9に示すように、CPU0のプライベートキャッシュ中におけるデータの状態が「修正済及び排他的」である場合には、LLCディレクトリ中の状態インデックスストリングの状態インジケータも「修正済及び排他的」に設定され、CPU0のプライベートキャッシュにおけるデータの状態が「修正済」である場合には、LLCディレクトリにおける状態インデックスストリングの状態インジケータもまた「修正済」に設定される。いずれの場合においても、データインジケータのビットP0は「1」であり、データが最後にCPU0によって修正されたことを示す。
【0085】
ブロック211では、トランザクションをトランザクショナルメモリにコミットするプロセスが完成される。
【0086】
衝突を避けるために、ブロック207〜ブロック211はコミットされるときにアトミック処理に組み合わされる。
【0087】
書き込み操作が行われたばかりのデータがLLCにあり、その状態は本トランザクションの最後で「修正済及び排他的」であることが理解できる。データインジケータのビット値によると、データを最後に修正したプロセッサはCPU0である。しかしながら、CPU0はデータを有しないため、次のCPUの操作において、システムはデータCPU0を無効化する必要はない。その上、別のCPUがデータを読み取る必要がある場合には、最初にCPU0にデータをLLCに最初に書き込むよう要求してから次にその他のCPUによって読み取られるのではなく、LLCディレクトリから直接読み取ることができる。
【0088】
3番目の実施例においては、本開示によると、追加のデータ処理は、上述した第2の実施例におけるプロセスにしたがって行われる。
【0089】
図10は、ブロック301〜ブロック308を含む、第3の実施例のデータ処理のブロックフロー図を示す。
【0090】
ブロック301では、CPU1はトランザクションの処理を開始する。
【0091】
ブロック302では、CPU1は、最初に自身のプライベートキャッシュ中のデータを読み取ろうとする。
【0092】
ブロック303では、CPU1のプライベートキャッシュがデータを有しないと検出すると、CPU1は、データのアドレスマッピングにしたがいLLCディレクトリを訪問する。読み取られる必要があるデータに対応するキャッシュラインの状態インジケータによると、データの状態は、CPU0によって最後に修正された「修正済及び排他的」である。
図11にて示すように、CPU1はデータを読み取る必要が有るため、システムは、データのキャッシュラインの状態インジケータを「修正済及び共有」に変更し、P1を「1」に設定し、P0を「0」に再設定する。
【0093】
ブロック304では、データはCPU1のプライベートキャッシュ中に記憶される。データの読み取りが終了する。
【0094】
ブロック305では、CPU1はプライベートキャッシュ中のデータを操作する。トランザクションがコミットされる前に、データへのすべての操作はCPU1のプライベートキャッシュ中に起こり、任意の書き込み操作の結果はグローバルな状態に影響を与えるためLLCに送信されない。CPU1が読み取り操作のみ行う場合には、CPU1のプライベートキャッシュ中のデータは、「共有」の状態に設定される。CPU1が書き込み操作を行う場合には、CPU1は、データが別のCPU(本実施例のCPU0)によって最後に修正されたと認識するため、CPU1のプライベートキャッシュ中のデータは、ここで特別な状態、例えば「修正済及び排他的」に設定される。
【0095】
しかしながら、データが同一のCPUにより最後に修正された場合には(本実施例ではCPU1、図示されていない)、CPU1のプライベートキャッシュ中のデータは、通常の状態の「修正済」に設定されるであろう。
【0096】
ブロック306では、CPU1はトランザクションメモリシステムにトランザクションの結果をコミットし始める。
【0097】
ブロック307では、システムはLLCにCPU1中のデータを書き込み、CPU1中のデータを無効化し、それに応じてデータの状態インデックスストリングを設定する。
【0098】
この段階では、システムはデータのアドレスマッピングにしたがいLLCディレクトリを点検し、無効化を行ってよい。この時点でのキャッシュラインの状態は、修正履歴及びトランザクションにおける操作に応じて、いくつかの可能性を有する。トランザクションが読み取り操作のみをした場合には、システムは、最後に修正した前のプロセッサ(本実施例ではCPU0)に保持されたデータは、最新のままであるため、CPU1のプライベートキャッシュ中のデータを無効化し得る。トランザクションが書き込み操作をした場合には、この時点でのキャッシュラインの状態は、書き込み操作の前の修正履歴に応じて、「修正済及び排他的」または「修正済」の何れかであろう。いずれの場合においても、その他のプロセッサのプライベートキャッシュにおけるデータは、無効化される必要があり得る。LLC中のデータの状態インデックスストリングが、P1以外、すべてのその他のデータインジケータのビットは値「0」であることを示す場合には、他のCPUはデータを有さず、そのためその他のCPU中のデータを無効化する必要が無いことを意味する。
【0099】
CPU1のプライベートキャッシュ中のデータの状態が「修正済及び排他的」である場合には、システムはCPU1のプライベートキャッシュ中のデータをLLCに書き込むように決定し、CPU1中のデータを無効化する。CPU1のプライベートキャッシュ中のデータの状態が「修正済」である場合には、データは、CPU1のプライベートキャッシュに保持される。何れの場合においても、システムはLLC中のキャッシュラインの状態インデックスストリングの状態インジケータをそれに応じて設定する。第1の場合においては、状態インジケータは、(
図12に示されているように)「修正済及び排他的」に設定され、第2の場合においては、状態インジケータは「修正済」に設定されている。両方の場合において、P1は「1」であり、CPU1は最後にこのデータを修正したプロセッサであることを示す。
【0100】
ブロック308では、トランザクションをトランザクショナルメモリにコミットするプロセスが完了する。
【0101】
衝突を避けるために、ブロック306〜ブロック308はコミットされるときにアトミック処理を組み合わされる。
【0102】
データに書き込み操作が行われた場合には、修正されたデータはLLCにここで保持され、その状態は本トランザクションの最後で「修正済及び排他的」であることが理解できる。データインジケータのビット値によると、データを最後に修正したプロセッサはCPU1である。しかしながら、CPU1はデータを有しないため、次のCPUの操作で、システムはデータCPU1を無効化する必要はない。その上、別のCPUがデータを読み取る必要がある場合には、最初にCPU1にデータをLLCに最初に書き込むよう要求してから次にその他のCPUによって読み取られるのではなく、LLCディレクトリから直接読み取ることができる。
【0103】
本明細書にて開示された方法に関連し、本開示はまた、本明細書において記載されている方法を実行するための計算システムを提供する。
【0104】
図13に示されているように、本開示の一態様は、トランザクショナルメモリを提供するための計算システム1300である。計算システム1300は、少なくとも第1のプロセッサと第2のプロセッサを含む複数のプロセッサ1302と、複数のプロセッサ1302のうちそれぞれ1つによって各々アクセス可能な複数のプライベートキャッシュ1304と、複数のプロセッサ1302間で共有されるラストレベルキャッシュ(LLC)1306とを有する。計算システム1300は、トランザクショナルメモリのための方法の文脈中に本明細書で記載された機能を実行するようプログラムされている。
【0105】
例えば、計算システム1300は以下の機能を実行するようプログラムされている。
【0106】
第1のプロセッサを使用してトランザクションを処理すること、このときトランザクションは、第1のデータを第1のプロセッサのプライベートキャッシュに読み込むことと、第1のプロセッサのプライベートキャッシュ中の第1のデータに書き込み操作を実行することを含む、および
【0107】
トランザクショナルメモリへのトランザクションをコミットすること、このときコミットすることは、書き込み操作前に、第1のデータの最近の修正から予め設定された条件の検出に反応して、第1のプロセッサのプライベートキャッシュ中の第1のデータをLLCに書き込むことと、第1のプロセッサのプライベートキャッシュ中の第1のデータを無効化することを含む。
【0108】
最近の修正の予め設定された条件の実施例は、書き込み操作前に、第1のデータは第1のプロセッサと異なる第2のプロセッサによって最後に修正された。
【0109】
さらにトランザクションをコミットする機能は、キャッシュラインの状態インデックスストリングを設定し、LLCに書き込まれた第1のデータは第1のプロセッサによって最後に修正されたことを示すことをさらに含み得る。
【0110】
別の実施形態では、トランザクションをコミットする機能は、キャッシュラインの状態インデックスストリングを設定し、LLCに書き込まれた第1のデータの特別な状態を示すことをさらに含み得る。特別な状態は、LLCに書き込まれた第1のデータは修正済であり排他的であり、第1のプロセッサのプライベートキャッシュ中の第1のデータは無効化されたことを通知する。
【0111】
機能の詳細はトランザクショナルメモリを使用してデータを処理する方法に関連して本明細書で記載されてきたため、再度説明しない。
【0112】
機能はプログラムモジュールまたは装置を使用して実現されてよく、機械で実行可能な命令及び符号に基づいてコンピュータプログラムを使用して実行され得る。一般には、コンピュータプログラムは特定のタスクを実行してよく、または、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造等の特定の抽象データの種類を実行してよい。本開示に記載されている技術もまた、分散コンピューティング環境のような、分散されたコンピューティング環境にて実行され、通信網を通して接続された遠隔処理装置によってタスクを実行することができる。分散コンピューティング環境において、プログラムされたモジュールまたは装置は、メモリ装置を含むローカルまたは遠隔コンピュータ保存媒体の何れにおいても配置され得る。
【0113】
本明細書の様々な実施形態が、実施例及び環境とともに漸進的により詳細を記載している。各実施形態は、本開示のある態様に焦点をあわせており、そのため異なる実施形態は互いに異なるが、類似の部分も共有し得る。
【0114】
例示的な実施形態が、本開示における本発明の概念及び実施を説明するために採用されている。例示的な実施形態は、本開示の方法及び中心となる概念をよりよく理解するためのみに使用されている。本開示の概念に基づき、当業者は例示的な実施形態及び適用となる分野を修正し得る。