"第1のプロセッサコアで元のソースコードを実行する段階と、第2のプロセッサコアが前記第1のプロセッサコアと協働する異なる実行モードに切り替える旨を示す情報を検知する検知段階に、前記第2のプロセッサコアを配置する段階と、前記第1のプロセッサコアと前記第2のプロセッサコアとが協働して実行することができる協働コードを前記元のソースコードから生成するように前記元のソースコードをプロファイリングする段階と、この旨の情報を検知する段階と、前記第1のプロセッサコア及び前記第2のプロセッサコアにおいて、生成された前記協働コードを実行する段階とを備える方法。以下の記載では、いくつもの詳細を述べる。しかし本発明の実施形態は、これら詳細がなくても実施可能である。また、公知の回路、構造、及び技術に関しては詳細に述べず、記載の理解をあいまいにしないようにしている場合もある。一実施形態1つの実施形態さまざまな実施形態といった言い回しは、本発明の記載される実施形態が、特定の特徴、構造、または特性を含んでよいが、必ずしも全ての実施形態が特定の特徴、構造、または特性を含まなくてもよい。さらに、一部の実施形態では、他の実施形態のための記載された特徴を一部、全て含んでもよく、まったく含まなくてもよい。さらに、特定の特徴、構造、または特性が一実施形態との関連で記載されていても、当業者であれば、明示的に記載されていてもいなくてもよい他の実施形態との関連で、これら特徴、構造、または特性に影響を与えることは当業者の常識の範囲内であるとする。動的スレッド切り替え実行を提供するためのシステム、装置、及び方法の実施形態を詳しく説明する。これをサポートするためのシステムの実施形態は、ハードウェアラッパー及びソフトウェアが取り囲むプロセッサコア動的スレッド切り替えソフトウェアからなる。通常の実行モードでは、プロセッサが、あたかもハードウェアラッパー及び動的スレッド切り替えソフトウェアが存在しないかのように動作している。たとえば通常のx86実行が行われる。動的スレッド切り替え実行DTSEモードでは、ハードウェアラッパー及びソフトウェアが協働して、後述するようにフローの生成及び修正を含む動的スレッド切り替え実行を実行している。しかし先ずは高レベルの概略が提供される。次に、フローホットコード等のこれらトピックの一部のより詳細な説明を行う。以下の詳細は、グローバルにコミットする前に各ロードが、正しいストアその他からデータを取得していることをチェックするハードウェアラッパーと、ハードウェアが正しい実行をチェック、保証するために、コードだけからは判断が難しいコードの依存性を解消するために最近観察されたコードの振る舞いを利用するソフトウェアとの組み合わせを説明している。以下の詳細は、依存性を、元の命令の間からではなく、元の命令の具体的なインスタンス間から理解することができるように、元のコードの多くの静的インスタンスを識別する方法を記載している。記載されるソフトウェアは、フローと称される定義された静的コードのサブセット内の依存性についての完全な、しかし同様に完全に正確ではない理解を利用して、静的なコードを、そのフロー内のトラックの間の依存性のないまたは局所的にしかspecifically依存性が許されていない別々のトラックに分割する。加えて、以下の1以上を含むメンテナンス処理が記載されている。つまり、予期しない制御フロー、不正確なロード結果、または他のチェックの失敗により退出する前に、所望の動的実行より短くなるようなさらなるフローのプロファイリングを行うこと、この点で突然悪化したフローを削除すること、パフォーマンスに重要な新たなフローまたは置き換えフローの調査を継続すること、及び、新たなプロファイル情報がある場合にコードをトラックに再度分割すること、及び、元のコードより良いパフォーマンスが観察されないフローを削除すること。DTSEハードウェアは、一連のリストを形成して、中間レベルキャッシュにこれらを書き込む。DTSEハードウェアは、このトラックのメタデータリストに関する物理アドレスをもつレジスタを有している。帯域幅を低く抑えるためには、ロード及びストアアドレスの圧縮を考えねばならないだろう。ロードまたはストアを実行している論理プロセッサを追跡して、ロード実行及びストア処理を管轄するseniorことができる必要がある。DTSE論理はさらに、退出時に分岐方向ビット、取られた間接的分岐戻るを含むの対象を取得する。これは、フラッシュプロファイリングおよびレジスタ状態復帰のサポート用データに利用される。<I.高レベルの概略>上述したように、ここで詳述するプロセッサは、各コアが自身で動作するレガシーモードで動作することができる。プロセッサコアはさらに、コアの1つがオフまたは停止しているときに、DTSEモードでスレッドコードのプロファイリング、スレッド、及び実行のために利用することもできる。オペレーティングシステムがコアがスリープモードにあると仮定しても、停止フローは、コアの所有権をOSからDTSEモードに切り替えることができる。図1は、DTSE処理の実施形態の一例をグラフィックに示す。これは、図中の二次コアになるアイドルコアの制御に関する。一部の実施形態では、コアがHALT/WMAIL命令を受信するときに、アイドルコアの制御が生じる。DTSEソフトウェアは、コアのすべてのスレッドがスリープ状態になるかを監視して、次いで、コアの制御を行う。二次コードは、動的実行たとえば100Kの連続した命令のために実行されているカーネルの大部分に対応している一次コアで実行されているソフトウェアのエントリポイントであるホットコードを検知することから開始される。ホットコードの検知は、通常、単純なハードウェア構造で行われている。ホットエントリポイントが削除されている場合には、プロファイリング用に装備armされる。ヒット一次コアによるすると、ホットコードは、全てのロード、ストア、及び分岐が一部の設定命令たとえば50,000個の命令についてプロファイリングされたことを示すプロファイリングモードに移行する。プロファイリングが完了すると、スレッドが生成される。スレッド生成では、ホットコードが解析されて、プロファイリングされた情報に基づいて、スレッド実行モードの2つのスレッドが生成される。完了すると、エントリポイントホットIPが、DTSEモードのエントリポイントとして装備される。次に元のコード一次コアで実行されているがエントリポイントにヒットすると、両方のコアが協働してコードを実行するDTSEモードに切り替わる。DTSEモードは、フローがホットコードを抜けるとき、または、違反または外部イベントたとえば割り込みが検知されると、終了する。違反には、たとえば、両方のコアが、同じエポックの同じメモリアドレスに対して異なるデータを格納しようとすることが含まれる。違反があると、スレッドモードは最後にコミットされた点にロールバックして、元のコードに戻る。図2は、一部の実施形態におけるDTSE処理の方法の一例を示す。この例では、2つのコアを利用してスレッドコードを処理している。201で、一次コアコア0が元のシングルスレッドコードを実行する。203で、別のコアコア1が、起動されて、二次コアとして利用される。コアは、多くの方法で二次コアワーカスレッドになることができる。たとえば二次コアは、OSによりたとえばC状態にされる、ソフトウェアの割り当てにより、またはスレッドによりOS/ドライバまたはアプリケーション自身によりスリープ状態にされる強奪コアgrabbingcore等のコアの静的分割の結果二次コアとして利用することができる。一次コアが元のコードを実行している間、二次コアは、205で検知段階におかれ、ここで、ハードウェアまたはソフトウェアによるホット領域のホットコード検知処理を待つ。一部の実施形態では、ホットコードの検知は、よくアクセスされるホット領域を検知するハードウェアテーブルであり、自身のエントリIP命令ポインタを提供する。このようなホット領域のエントリIPが検知されると、一次コアが装備され、207で、そのIPの次の起動においてプロファイリングをトリガして、元のコードのスレッドバージョンに実行を切り替える。プロファイリングとは、ロードアドレス、ストアアドレス、または所定の実行の長さへの分岐等の情報を集める処理であるたとえば50,000個の動的命令。プロファイリングが完了すると、二次コアが、スレッド生成段階threadgen209を開始する。この段階では、二次コアが、プロファイリングされた領域のスレッドバージョンを生成して、一方では、プロファイリングされた情報を指針として利用する。スレッド生成によって、元のコードのスレッドバージョンと、可能性のあるエントリポイントとが提供される。エントリポイントの1つホットIPと称されるがヒットすると211、一次コア及び二次コアを方向付けし直して、コードのスレッドバージョンを実行して、実行が、別の実行モードスレッド実行モードと称される場合もあるに切り替えられる。このモードでは、2つのスレッドが完全に別個に動作して、一方では、ラッパーハードウェアを利用して、メモリロードのバッファ及びストア、違反のチェックが行われ、原子的に状態コミットが行われて、メモリの順序を維持しつつ処理が進められる。この実行モードは、以下の2つのうちいずれかで終了することができる。つまり、コードがホット領域をクリーンに退出実行に問題がない退出する場合、及び、不正行為のある場合のダーティな退出の際に、終了する場合がある。213で、どの種類の退出かの判断がなされる。ダーティな退出の一例は、ストア/ストア及びロード/ストアの違反または二次実行モードで取り扱われない例外のケースが挙げられるゼロ例外による浮動小数点の除算、キャッシュ不可能なメモリ種類のストア等。第2の実行モードを退出すると、一次コアは元のコードに戻り、一方で二次コアは決定モードに移り、別のホットIPが検知されるまで、または、既に生成されている領域のホットIPにヒットするまで待つ。クリーンに退出した場合ホット領域の退出、元のコードは退出点から続ける。ダーティな退出をした場合違反または例外の場合、215で、一次コアが最後のチェックポイントに戻り、その実行から再開する。クリーンな退出及びダーティな退出の両方があった場合には、レジスタ状態を両方のコアから統合して、元のコアに移行する。<DTSEアーキテクチャの例>図3は、動的スレッド切り替え実行DTSEアーキテクチャの一実施形態を示す。このシステムのソフトウェア及びハードウェアの側面を以下で詳述する。上述したように、各コア301は、ネイティブに同時マルチスレッドSMTをサポートしているものであってもよい。これは、2以上の論理プロセッサがコアのハードウェアを共有することを意味している。各論理プロセッサは、独立してコードストリームを処理するが、これらコードストリームからの命令は、同じハードウェア上で実行のために無作為に組み合わせられる。異なる論理プロセッサからの命令同士が同時に1つのコアのスーパスカラーハードウェアで実行する、という場合がよくある。SMTコアのパフォーマンス及び同じコアにおける論理プロセッサの数を向上させることができる。このために論理プロセッサ数が増えるので、いくつかの重要なワークロードをより速く処理することができるようになる。他のワークロードの処理は、論理プロセッサの数が増えただけでは速くはならない。システム内に、全ての論理プロセッサの利点を活用することができるに足るソフトウェアスレッドがない場合がある。このようなシステムでは、複数の利用可能なソフトウェアスレッド全てまたは一部それぞれを、同時に実行される複数のスレッドに分解して、複数のおそらくは数の多い論理プロセッサの利点を活用する。論理プロセッサの数が増えただけでは速くはならないワークロードは、このスレッドを多数のスレッドに分解してより多くの論理プロセッサを利用できるようにすれば、高速処理されるようになることが予期される。従来のコアに加えて、ハードウェアは、グローバルなメモリの一貫性303、グローバル退避307、グローバルなレジスタ状態309、及び、ソフトウェアの情報収集305のための論理を含む動的スレッド切り替え論理を含んでいる。この論理は、コア自身に含まれていてもよいし、別途提供されてもよい。この論理は、5つの機能を実行することができる。第1の機能は、プロファイリングと称される実行コードに関する専門情報の収集であり、第2の機能は、元のコードの実行中に、ハードウェアが、ソフトウェアが定義したホットIPストリームアドレスのヒットしていることを確認することである。これが生じると、ハードウェアは、ハードウェアは、ソフトウェアが定義した異なるアドレスにジャンプするようコアに強制する。こうすることで、コードのスレッドバージョンを実行することができる。第3の機能は、ハードウェアがソフトウェアと協働して、時々、元のコードストリームの正確なレジスタ状態を、コアのデータキャッシュ内のグローバルコミット点としてセーブすることである。元のコードストリームがソフトウェアにより複数のスレッドに分解された場合、元のプログラムの正確なレジスタ状態全体を有している論理プロセッサがなくなる場合がある。各グローバルコミット点と見合った正確なメモリの状態を知っておく必要もある。適宜、ハードウェアがソフトウェアと協働して、アーキテクチャプログラム状態レジスタ及びメモリ両方を、最後のグローバルコミット点に復元できるようにしておく必要があるが、これに関しては後述する。第4の機能は、ソフトウェアは正確に実行できるコードの生成をかなり良好に行うことができるとはいえ、ソフトウェアがいつでも100パーセント正確にはできないこともある。このいい例が、ソフトウェアが、コードのスレッドバージョンを生成する際に、メモリアドレスを完璧に予想できない、ということである。したがってスレッドコードが、ロードの誤った結果を得る場合がある。ハードウェアが、誤ってしまう可能性を全て検証する必要がある。不正確なものが見つかると、ハードウェアはソフトウェアと協働で、プログラム状態を直す必要がある。これは通常、コアの状態を最終のグローバルにコミットされていた状態に復元することにより行われている。最後の機能は、元のコードストリームを複数のスレッドに分解するときに、元のコードに指定されているメモリのストアを、複数の論理プロセッサの間で分配して、これら論理プロセッサの間で無作為な順序で実行させる機能である。動的スレッド切り替え論理は、他のコードストリームが、正確に実行されている元のコードが定義している不正確なメモリ状態を見ることができないようにする必要がある。これらのアーキテクチャの例では、プロセッサコアコアが2つのMSTスレッドを有している。一般的には、DTSEモードでは、1つのコアについて2つをはるかに超える数の論理プロセッサが存在している。これらの論理プロセッサは、2つの種類一次ワーカのいずれかとして定義されている。一次論理プロセッサは、ソフトウェアに知られているつまり、オペレーティングシステム及び仮想マシンモニタ等。ソフトウェアは、一次論理プロセッサセットを、コア上で、自身が実際に存在しているコア上のSMTスレッドとしてみる。SMTスレッドが行うものの全てではないかもしれないが、殆どを行う一次論理プロセッサが、特に割り込みを受ける。ワーカ論理プロセッサは、一般的には外部のソフトウェアから見えない。DTSEソフトウェアによって利用され、リザーブされているメモリに管理されている。このメモリは、物理的にアドレス可能であり、リザーブされたメモリシステムである。このリザーブされたメモリは、既存のシステムメモリの専用部分であっても、別個の物理メモリであってもよい。このリザーブされているメモリは、DTSEコードを格納するために利用され、作業メモリとして機能する。DTSEモードで生成されるデータ構造は、リザーブされているメモリに格納される。ホットなコードもこのリザーブされているメモリに格納される。トラックデータ、トラックデータディレクトリ、及びトラックメタデータもリザーブされているメモリに格納される。これら全てが物理的にアドレスされる。ワーカ論理プロセッサは一次論理プロセッサが有するコンテキスト全体を有していないために、プロセッサ機能全体のうちのサブセットに制限される。ワーカ論理プロセッサは、リザーブされているメモリのフローのコードのみを実行し、目に見えるメモリの元のコードは実行しない。一次論理プロセッサは、目に見えるメモリの元のコードまたは隠されているメモリのフローのコードを実行する。一次論理プロセッサが実行する、隠されているメモリのフローのコードは、DTSEの観点からは、1つのトラックコードである。動作においては、現在そうされているように、オペレーティングシステムが一次論理プロセッサでスレッドを実行する。一次論理プロセッサも、今と変わらずコアに分類される。数多くの一次論理プロセッサが存在しており、それぞれのパフォーマンスは非常に高い。一次論理プロセッサのパフォーマンスに、オペレーティングシステムが利用可能な一次論理プロセッサの数を乗算すると、チップのスループット機能をはるかに超える量になる。提供される一次論理プロセッサの一部を利用して、チップの全機能を利用することができる。他方で、コード付が良好で、大量の並列プログラムmassivelyparallelprogramsは、チップの機能をより効率的に利用することができるので、提供される一次論理プロセッサを大量に好ましくはすべて利用することで、より高いパフォーマンスを達成することができる。実行されている一次論理プロセッサが、チップが提供すべきすべてのリソースを利用していない場合には、DTSEソフトウェアが自動でスレッドの分解を行う。これは、ワーカ論理プロセッサで、並列化された計算フローを実行する。これには、スループットエンジンで並列に実行される大量のSSE及びAVXコードの分解が特に含まれる。これには、特殊機能ユニットの特殊機能ユニットで実行することができるコードの実行が含まれる。基本的には、一次論理プロセッサのスレッドが実際にワーカ論理プロセッサで計算フローを実行している場合には、一次論理プロセッサは何の関係もない。オペレーティングシステムが、自身がすべての作業をやっていると思っている間は、実質的には停止される。既に詳述したように、オペレーティングシステムは、ワーカ論理プロセッサについて知ることができない。計算フローがワーカ論理プロセッサで実行されているときには、それを所有している一次論理プロセッサは、2つ割り込みまたは計算フローのフローからの退出のうちの1つが起こるのを待つ。これらのいずれかが起こった場合には、一次論理プロセッサが制御を引き受けるtakeover。割り込みフローに移行する割り込みがある場合には、ワーカにおける計算フローと並列で、割り込みフローをすぐに実行する。ほとんどの場合、割り込みフローが割り込み処理全体を行い、一次論理プロセッサが、計算フローにはなんの影響も及ぼさずに、待ち状態に戻る。この計算フローからフロー退出したときには、待ち状態にあった一次論理プロセッサが、その時点でレジスタ状態を構築して、元のコードで再開する。理想的には、ホットコードエントリポイントにすぐにヒットする。これにより新たな計算フローの実行が開始されたり、おそらくは一次論理プロセッサでシステムフローの実行が開始されたりする。DTSEソフトウェア311は、後述する他のタスクからフローを生成したり、維持したり、除去したりするルーチンを含んでよい。<ハードウェアラッパー>一部の実施形態では、ハードウェアラッパーを動的スレッド切り替え実行論理に利用する。ラッパーハードウェアは、1ホット領域の検知ホットコードルート検知、2ホット領域プロファイルを特徴付ける情報の生成、3トランザクションを実行するときの状態のバッファリング、4成功した場合のバッファリング状態に対するコミット、5アボートされた場合のバッファリング状態の破棄、6コヒーレンシーイベントたとえば書き込み―書き込み及び読み出し―書き込みのコンフリクト等の検知、7相互修正コードに対する保護、及び、8ページングに関する変更に対する保護、という機能の少なくとも1以上をサポートする。これら機能それぞれは、上述されているものもあれば、後述するものもある。DTSE実行モードでは、生成されるスレッド同士は、協働することはできるが、通信することはできない。各コアは、自身のスレッドを実行しており、コミット/スパンマーカは、元のコードの一部のIPに対応しているスレッドコードのIPを示す。DTSEハードウェアバッファは、情報をロード及び格納して、ストアが外部から見えるグローバルにコミットすることがないようにする。両方のコアがスパンマーカに到達すると、ロード及びストアに違反がないかをチェックする。違反が検知された場合には、ストアがグローバルにコミットされてよい。ストアのコミットとは、違反/ダーティな退出のあった場合に実行がジャンプすべきチェックポイントのことである。図4は、一部の実施形態におけるラッパーの主要なハードウェアブロックを示す。上述したように、これは2以上のコア401からなる対に属しているとして示されているが、これ以上存在してもよい。違反の検知、原子コミット、ホットIP検知、及びプロファイリング論理403は、コア401に連結されている。一部の実施形態では、このグループを、動的スレッド切り替え実行ハードウェア論理と称する。コアにはさらに、第2の実行モードの実行状態が統合されている中間レベルキャッシュ405が連結されている。加えて、最終レベルキャッシュ407も存在している。最後に、xMCGuardataキャッシュXGC409が存在しており、これに関しては図7を参照して詳述する。アプリケーション用のフローの数は、ルート検知ハードウェア明示されていないでハードウェアによって特定される。各フローは、1以上のエントリポイントを有する、よく定義された二値コードのセットである。アプリケーション用のフローのセットは、アプリケーションのかなりの量の動的実行を網羅すべきであるが、静的フローを組み合わせたサイズは、フローの並列性によって小さくすべきである。元のコードの実行中には、ルート検知ハードウェアが、1つのIP値新たなフローを特定するルートと称されるを探す。通常はこのハードウェアが、実行がフローにある間は検索しない。一部の実施形態では、ハードウェアは64個の命令ポインタIPのリストを維持する。このリストは、位置0位置63まで順序をつけられて、各位置がIPを有したり、空であったりしてよい。リストは全て空の状態から始められる。IPに、位置Nのリストのエントリにマッチしている利用可能なeligible分岐がある場合、N=0でない限りは、位置N-1及びNが位置を入れ替える。N=0の場合には何も行わない。より簡潔にいうと、このIPをリスト内で1つ繰り上げる。IPに、リストのエントリにマッチしていない利用可能なeligible分岐がある場合には、エントリ40から62を1つ繰り下げて、位置41から63とする。前の位置内容63が失われる。新たなIPを位置40に挿入する。一部の実施形態では、IPがリストに追加に利用可能な場合、またはマッチするよう利用可能な場合には制約があるので、既にリストに存在しているIPの利用を促す。第1の制約は、とられた後方への分岐の対象のみを利用可能とする、というものである。呼び出し及びリターンは利用可能としない。とられた後方への分岐がホットを、フローの一部として実行しており、且つ、フローを退去しない場合は、この対象は利用可能としない。とられた後方への分岐の対象がホットコードエントリポイントキャッシュでヒットした場合には、利用可能とはしない。基本的には、既にフローに存在しているIPは、リストに配置されるべきではない。一部の実施形態では、ソフトウェアが設定可能な2つの除外領域が存在している。各領域が、除外領域についてIPの下限及び上限で記述される。この便宜facilityは、一定の領域においてIPのみを受け付けるよう設定することができる。第2の制約は、除外領域のIPを、リストに載せるために利用可能とはしない、というものである。一部の実施形態では、リストの命令にヒットした後、16,384個の動的命令未満の命令は、追加のために利用可能とはしないが、リストにおける最後のIPヒットを、16,384個の動的命令の窓の新たなIPで置き換えることは許可されている。基本的に、最少平均が動的に50,000個の命令となるようなフローを対象とする。このリストのIPは、このようなフローのルートの候補である。したがって次の16,000個の動的命令を、リストに既に表されているフローの一部として考える。一部の実施形態では、ハードウェアは、スタックを16深いところまで維持する。呼び出しにより、スタックポインタが循環的に増分されて、リターンによって、スタックポインタは低減されるが、ラップはしない。つまり呼び出し時には、スタックポインタが、常に増分される。しかしプッシュ深さカウンタも存在している。16を超えることはできない。リターンによって、もしもプッシュ深さが負になる場合には、スタックポインタ及びプッシュ深さカウンタは低減されない。全ての命令が、スタックのすべての位置を増分させる。プッシュ時には、スタックの新たなトップがクリアされる。スタック位置は、64Kを最大カウントとして飽和する。したがって、別の制約として、スタックの上部が飽和しないうちは、IPをリストに追加するべく利用可能としない、という制約も存在する。この理由は偽のループを避けるためである。常に2度繰り返されるループが含まれているプロシージャを想定する。このプロシージャは、コードのどこからでも読み出される。なので、このプロシージャの後方の分岐にはよくヒットすることになる。これは非常にホットに見えるが、論理的には全ての場所からの仕事とは関連がなく、良好なフローにはならない。このプロシージャの、これを呼び出すIPが望ましい。内部のプロシージャがフローを含む程度の大きさを持たない限りは、内部のプロシージャではなくて、外部のプロシージャが好ましい。一部の実施形態では、IP、Iがリストに加えられる、またはマッチにヒットしたために促進される場合には、次の1024個の動的命令内の命令はいずれもIにマッチするために利用可能とはしない。この規則の趣旨は、タイトなループを過大評価しないようにするためである。このようなループの後方への分岐は、数多くヒットするが、各ヒットはあまり多くの仕事を表していない。リストのトップのIPを、非常にアクティブなコードを表すものとしてとらえる。通常のワークロードは、高い動的網羅範囲を得るために多くの数のフローを有している。これらを絶対に重要な順に発見することは重要事項ではないが、一般的には、これあらフローは大体重要な順に生成して、最大のパフォーマンス利得を早期に得ることができるようにすると好ましい。フローを構築するための合理的な場所を見つける必要がある。これは、ホットコードになり、次に再生できないものoutofplayとして、次に処理すべきフローを見つけるようにする。最もよくあるのは、いくつもフローを見つけてしまうことである。一般的なフローは、ばらばらであり、重なっていない。しかし、少なくとも各フローのルートは、前に見つかったフロー内にはない。実際、後で見つかるフローに依然として存在している場合がある。2つのフローが同一ではないことを保証するためにはこれで十分である。特定の数を上では利用したが、これらはあくまで例示である。このアーキテクチャには、システムフローと計算フローという少なくとも2つの種類のフローが存在している。計算フローは、ワーカ論理プロセッサのクラスタ上で実行される。システムフローは、一次論理プロセッサ上で実行される。計算フローは、スレッド分解によって1つのコードストリームから形成される複数のトラックであってもよいが、必ずしもそうでなくてもよい。計算フローは、1つのクラスタ内のワーカ論理プロセッサによってその全体が実行されるが、これは、このフロー全体が、チェックされた後で、プログラム順にグローバルにコミットされる必要があることに起因しているしかし通常は、1つ1つではなく、一連のコミットスパンとしてグローバルにコミットされる。フローを実行するすべてのワーカは、同じアドレスに自由にロード及びストアができる。計算フローは、禁止されているものという意味で、最も制約が厳しい。システムフローも、DTSEソフトウェアが生成するコードであり、隠されたメモリに常駐している。システムフローではいくつもできないことがある。制約はあるが、計算フローよりは制約がずっと少ない。システムフローは、計算フロー間のシリアルコード、または、計算フローに並列な独立スレッドである。システムフローの最も重要な用途の1つに、割り込み処理がある。DTSEソフトウェアは、最もよく利用される割り込みベクトル対象であるエントリポイントを有するフローを生成する場合がある。このコードは、これらベクトル対象から最もよく利用される経路をカバーする。もしも割り込みが、割り込みリターンIRETへのベクトル対象から割り込みコードまで、システムフローを抜けることなく、システムフロー内で完璧に処理することができる場合には、割り込まれたフローを実行しているワーカを煩わせる必要はない。もし割り込み処理シーケンス全体をこのように処理することができない場合には、割り込まれたフローを実行しているワーカにおいてフローの退出を強制することになる。コンテキストの切り替えは、常に割り込みフローを退出させるので、割り込まれた計算フローではフロー退出が行われる。割り込みをこの割り込みフローで処理することができる場合には、レジスタはセーブされない。割り込みシステムフローは、1つのグローバルコミットスパンである。IRETで終わり全てのコミットが1単位になるか、状態が割り込みベクトルの対象に復帰して、元のコードのそこから再開する。状態復帰には、計算フローのグローバルコミット及びさらなる実行の停止、及び、レジスタ状態の計算フローの最後のグローバルコミットポイントからの復帰が含まれる。スレッドの切り替えはコードに正しくプログラミングされているために、隠れたメモリのフローのコードのスレッドは、超高速及び効率よく切り替えることができる。元のコードにはスレッドの切り替えをプログラミングすることができない。元のコードに関するスレッドの切り替えは遅く非効率的である。計算フローは、何ができるかという点で制約がある。一部の元のコードは、計算フローに行くために利用可能ではない。計算フローには利用できない一部のコードが、制約の少ないシステムフローに行くことができたりする。システムフローにも行くことができないコードもある。これは元のコードとしてとどまらざるをえない。一部の実施形態では、無制限の量の元のコードが、必要であれば、両方の種類のフローと乗算される。ホットコードルートIPエントリIPが検知されると、そのIPの次のヒットにおいて、コアが元のコードのプロファイリングを開始することができるように一次コアが装備される。プロファイリング中は、上述した情報分岐、ロード及びストアを、メモリのバッファにプログラムダイナミックな順序で格納する。これらバッファは、後で、スレッド生成ソフトウェアにより利用されて、スレッドの生成が行われるつまり、分岐に基づいて未利用のコードが削除される、最適化が行われる、及び、ロード/ストアの関係が検知される。一部の実施形態では、コンフリクトチェックに利用されるものと同じハードウェア後述するを利用してロード、ストア及び分岐情報を退避させていた状態からバッファリングして、メモリに戻すspill。他の実施形態では、プログラム実行時にマイクロオペレーションを挿入して、必要な情報を直接メモリに格納する。ホット領域プロファイリングを特徴付けるために、スレッドされた実行モードソフトウェアは、1分岐については、aとられた/とられていない情報への条件分岐が必要として、b分岐対象の間接分岐のため、2ロードのためには、aロードアドレス及びbアクセスサイズが必要であり、及び、3ストアについては、aストアアドレス及びbストアサイズが必要である、のうち、1以上が適合する。一部の実施形態では、順序づけバッファOBがプロファイリング用に維持される。これは、ロード、ストア、及び分岐がアウトオフオーダを実施するが、プロファイリングデータは順序立ったものがinorder必要だからである。OBは、サイズが順序付け直しバッファROBに類似している。ロードは、ディスパッチ中に、そのアドレスとサイズとをOBに書き込む。ストアは、STAストアアドレスのディスパッチ中に、同じことを行うSTAのディスパッチは、退避を格納する前に行われ、このディスパッチの意図は、仮想格納アドレスを物理アドレスに変換するためである。分岐は、toフィールドを書き込み、これは、直接及び間接分岐両方に利用することができる。これらロード、ストア、及び分岐がROBから退避する場合には、対応する情報をOBからコピーする。ホットコードプロファイリングは、ラッパーハードウェアがトランザクション状態をバッファインしておき後でコミットできるということを利用する。OBから書き込み組み合わせキャッシュ後述するへデータをコピーするために、バッファリングされている状態をコミットする際に利用するものと同じデータパスを利用して、後でコミットを行う。プロファイリング情報は、専用バッファの特別なメモリ位置に書き込まれ、後でスレッドされた実行ソフトウェアによって利用できるようにしておく。一部の実施形態では、DTSEソフトウェアは、レジスタにIPを書き込み、これを装備する。ハードウェアはプロファイルデータをとって、このIPにヒットするとメモリのバッファに書き込む。フロールートIPの後に遭遇したいくつかの分岐たとえば10,000のための分岐方向の履歴が、ハードウェアにより実行中に報告される。リストは、ローカルな退避順序の1つの分岐について1ビットである。動的スレッド切り替え実行ソフトウェアは、退避時にとられた分岐の対象を取得する。そして、分岐方向のストリームに埋め込まれた間接分岐の対象を報告する。同時に、ハードウェアは、ロード及びストアのアドレス及びサイズを報告する。アプリケーションがその振る舞いを継時的に変更することができる場合、アプリケーションが実行されている間は実行を監視するべきである。フローはあまりに短くみえるので、成長させる、または削除する必要がある。加えて、いつの時点においても、新たなフローを見つけたり、再生したり、統合することができる。一部の実施形態では、動的スレッド切り替え実行システムのハードウェアが、各フローについてグローバルにコミットされた命令及びサイクルを平均化して報告する。ソフトウェアは、これを考慮に入れて、ときどき、何か質問のある場合には、フローを一時的にディセーブルにすることで元のコードのデータを手にいれる必要がある。ほとんどの場合ソフトウェアは、正味値で勝算があることがかなり明らかである以外は、ホットコードを実行しない。ホットコードが正味値で勝算があるか定かではない場合には、ソフトウェアは、これをディセーブルにする。これはフローごとに行うことができ、またはソフトウェアはこのワークロードのために全てをオフにするだけの作業を行ってもよい。ソフトウェアは、分岐ミス予測データ及び分岐方向データを受信し続ける。加えて、ソフトウェアは、グローバルキューのその部分が満杯である、または、フローのキャップを待っていることに起因して、スレッドストールについての報告を取得する。これらは、スケジュールよりかなり前に実行されているロードされたトラック後述するを示していてもよい。さらに、キャッシュミスのコアストール時間も取得する。たとえば、多くのキャッシュミスストール時間を得ているコアAは、なぜコアBがスケジュールよりかなり前に実行されているかを説明することができる。この全てを利用して、このフローのトラックのより良いロードの均衡を行うことができる。さらにハードウェアは、最大のキャッシュミスレートを有するロードを完全に特定して、それを報告する。こうすることで、ソフトウェアがキャッシュミスを再分配しやすくなる。一部の実施形態では、ソフトウェアは、各フロー実行においてサイクルまたは命令の報告を取得する。これにより、小さすぎるフローが特定されるので、過度にキャップされたオーバヘッドを有することになる。図5は、一実施形態におけるスパンされた実行を示す。スレッド実行ソフトウェアは、ホットコードのスレッドを生成するときには、なるべく少ない数の複製でこの実行を試みる。元の静的コードから2以上のスレッドを生成する。これらスレッドをスパンする。スパンマーカ同期は、元のコードについて生成して、違反上述したものをスパンマーカの境界でチェックする。メモリ状態は、各スパンが完了したときコミットしてよい。図示されているようにホットIPにヒットすると、実行モードをスレッド実行に切り替える。前の一般的図示と異なるのは、各スレッドがスパンを有しているという点である。各スパンの後に、チェックchkを行う。この例では、第2のスパンが実行された後で、チェックchk2が違反を発見している。この違反のせいで、コードは最後のチェックポイントにロールバックするこれは、スレッドの後であっても、あるいはホットIPのヒットの前であってもよい。上述したように、ホットコード領域を退出するとクリーンな退出時または違反の条件においてダーティな退出、スレッド実行モードを退出する。クリーンな退出時には、退出点が、スパンとコミット点とを示し、これによりすべてのストアがコミットされる。クリーンな退出及びダーティな退出両方において、元のコードは、最後のチェックポイントの対応する元のIPに移行するコミット。レジスタ状態は、両方のコアの状態から統合される必要がある。こうするためには、スレッド生成器が、各コミットにおいてレジスタチェックポイント情報を更新する必要がある。これは、たとえば、関連するレジスタを各コアからハードウェアバッファまたはメモリに格納するストアである特殊ストアを挿入することにより行うことができる。退出する際には、レジスタの状態を、両方のコアから元の一次コアに統合する。レジスタの統合たとえばレジスタ状態についての他の選択肢である退出は、バッファリングされているロード及びストア情報スレッド生成器により生成時点で決定されるから取得することができる。DTSEハードウェアの一実施形態のより詳細な例を図6に示す。この図は、左側に投機的実行を示し、右にコヒーレンシーを示している。一部の実施形態では、MLC617及びコア601を除く全てが違反の検知、原子的コミット、ホットIP検知、及びプロファイリング論理403の一部をなしている。実行が投機的である理由は、スレッドモードにある際に、コア601に生成されているスレッドが協働している間、これらが互いに通信しないからである。一部の実施形態では、ハードウェアラッパーは、ある形態のコピーがリザーブされているメモリこれも不図示のある元のコードを保護する1つの物理的保護キャッシュを含む。一部の実施形態では、16Kのラインであり、各ラインが元のコードの4096バイトをカバーする8つの方法が設定された関連キャッシュがある。解決策が、64バイトのブロックである。キャッシュラインは、開始ブロック及び終了ブロックをそのラインの4096バイトの配置範囲内に含んでいる。ブロック数は6ビットである。このキャッシュは、同じタグを持つ同じセットの複数のラインを有してよい。したがって、物理的保護キャッシュを読み出す際に、同じセットの複数のラインは、最大8ラインまでにヒットすることができる。これにより、同じ4096バイトのいくつかの接続されておらず、間に保護されていないギャップがあるスパンを表す機能が提供される。ソフトウェア311は、物理保護キャッシュに二度以上表される64バイトブロックがないようにする。64バイトのブロックに対するヒットをチェックする際に、ブロックが、4096バイトの粒度のアドレスヒットもある最大8ラインまでのいずれかにあることをチェックする。16Kのラインがあるので、14ビットのライン番号を付される。64バイトのブロックは、このキャッシュをミスするか、固有の14ビットのライン番号にヒットする。物理保護キャッシュは、任意の無効スヌープで探される。ヒットすると、ヒットの14ビットのライン番号が取得され、任意でヒットした64バイトブロックの6ビットの数が供給される。各フローについて、ソフトウェアはこの元のコードが、コードの処理前に物理保護キャッシュでカバーされていることを確かめる。これには、キャッシュに既にあるラインのスパンの拡張及び新たなラインの追加が含まれる。ソフトウェアは、フローをカバーする必要のあるライン番号のリストを取得する。たとえば、ソフトウェアは、このリストを1つの28ビット番号に低減する。ライン番号は14ビットである。われわれは、ライン番号の各ビット、有効ビット及びデータビットに2ビットを利用するので、14ビットのライン番号について28ビットが利用されることになる。各ビット位置において、リスト全体が、ビットが何であるかについて一致している場合には、これが結果生じるデータビットになり、有効ビットが1となる。リストにビット位置の値について一致していない場合には、結果生じるビットが0になり、有効ビットも0になる。これら28ビットは、フローの署名である。各コアは、そのホットコードエントリポイントキャッシュ不図示のすべてのフローの署名を有する。そして特に、現在一時的にグローバルにコミットされているフローのその1つの署名を有する。一部の実施形態ではこのテーブルの一部がキャッシュされているが、ホットコードエントリポイントテーブルはリザーブメモリにある。とられる分岐が予測される場合には、その対象を最大幅の範囲のキャッシュから探す。ミスした場合には、リフィルを要求する。ヒットした場合であってエントリポイントがない場合には、そこで終了する。エントリポイントがある場合には、次に小さい範囲のキャッシュを探す。最終的には、エントリポイントにヒットするか、エントリポイントにヒットしないか、定かでなくフェッチリフィルをキャッシュに行うか、ということになる。とられた分岐対象がリザーブされているメモリにある場合には、ホットコードエントリポイントキャッシュ検索は行われない。とられた分岐の識別情報を取得する。エントリポイントにヒットした場合には、この分岐が退避しても、依然としてとられた状態にあるときには、示されている対象にジャンプして、ワーカも示されているエントリポイントにジャンプする旨強制される。一時的にグローバルにコミットしているフローをそれぞれチェックする。ラインがマッチする場合にはフロー退出が行われる。さもなくばコミットが許可されてよい。これは、ホットコードエントリポイントキャッシュがクリーンされる前にエントリされたすべてのフローが終了するまで続けられる。このチェックが行われると、グローバルコミットを再開させることができる。ホットコードエントリポイントキャッシュのすべての署名をチェックする必要がある。ラインがマッチする場合には、エントリポイントの証明を取り消すdecertify。証明コードが呼び出されると、フラグを見ることになる。これは、エントリポイントを証明することができるようになる前に、リザーブされているメモリエージェント不図示のワークリストを処理する必要があることを意味している。ヒットしたライン番号を読み出す。各ライン番号について正確なスパンを知っている。各フローが必要とするキャッシュラインを正確に知っている。ヒットしたであろう各フローを削除したりチェックしたりする。完全なホットコードエントリポイントテーブルを更新する。そして、証明タスクを行うことができるようになる。各コア601は、自身のスレッドを実行し、その間、スパンマーカが、元のコードのいずれかのIPに対応しているスレッドコードの場所IPを表すスパンマーカは前の図に示されている。このモードでの実行中、ハードウェアバッファは、情報をロードしてストアして、いずれのストアもが外部から見えるグローバルにコミットされることがないようにする。この情報は様々なキャッシュに格納することができる。これらは、投機的ロードデータキャッシュSLC603、ロードストア順序づけバッファLSOB605、及び投機的ストアキャッシュSSC607として示されている。これらは別個に示されているが、一部の実施形態ではこれらが1つの実体のそれぞれ別の部分であってもよい。加えてこれら格納物は、図示されているような1つのコアについて設けられなくてもよい。一部の実施形態では、このデータを取得する前に順序づけバッファOB602を通るが、ここでは、実行されるロード及びストア退避順序が適切に維持される前述したとおりである。ストアの物理アドレスとサイズは、上位seniorの古い格納がデータキャッシュに書き込まれてSLC603に配置されるときに、利用可能とされる。SLC603も、無効スヌープを検知する。同様に、ロードアドレス及びサイズがDTSE論理にとって利用可能となり、SLCに格納される。ロード及びストアも、ロードストア順序づけバッファリングLSOB605に書き込まれて、各スレッドのロード及びストアの間の順序づけ情報を維持する。LSOB9605は、データとマスクとを維持する有効なバイト。最終的には、DTSE論理は、ロードアドレスを、ストアアドレスとともに適切な順序で退避させる。一部の実施形態では、DTSE論理は、ロードアドレスおよびサイズを実行時に取得する。一部の実施形態では、DTSE論理が古くなりage、これらをフィルタリングして、適切な順序づけにして、ロードアドレス及びサイズを退避させる。<データキャッシュ>両方のコアが、スパンマーカに到達すると、後述する違反チェックコンポーネントストア正確さキャッシュSCC611及びロード正確キャッシュLCC613を利用して、ロードおよびストアの違反をチェックする。通常は、ワーカ1つあたりSCC611及びLCC613が存在する。SCC611は、そのワーカについてロードアドレス及びストアアドレスの両方を書き込まれる。すべての他の協働するワーカのストアアドレスで読み出される。1つの位置合わせスパンのコードで書き込まれたバイトを示している。通常このケースは、独立した物理構造である。LCC613は、LSOB605からのすべてのワーカのストアアドレスで書き込まれる。そのワーカのロードアドレスで読み出される。通常は、これはリザーブされているメモリのデータ構造である。違反が検知されなかった場合には、ストアはグローバルにコミットすることができる。ストアのコミットは、以降のスパンで違反があった場合に実行がジャンプするべきチェックポイントを示す。生じうる違反はいくつかある。第1の違反は、外部の実体たとえば別のコアからの無効化スヌープであり、これは、コアの1つが利用するデータを無効化する。誤っているかもしれない、なんらかの値が想定されるので投機的実行、実行をアボートして、元のコードは最終チェックポイントに戻る。ストア/ストアの違反は、異なるスレッドの2つのストアが同じスパンの同じアドレスに書き込みをするときに生じる場合がある。一部の実施形態では、1つのスパンにおける異なるスレッド間には順序がつけられていないので、どのストアが後で元のプログラム順序になるかを知ることができず、スレッド実行モードはアボートされて、元の実行モードに戻る。ストア/ロードの違反は、異なるスレッドのストアとロードとが、同じスパンのメモリの同じアドレスを利用する場合に生じうる。スレッド間で通信は行われないので、ロードは、ストアが格納したデータをミスする可能性がある。通常は、あるロードが、過去のスパンの他のコアにより格納されているデータにヒットすることは許可されていない点に留意されたい。これは、コア同士は独立して実行しており、ロードが、他のコアがストアに到達する前に実行されている可能性があるからである1つのコアが、他のコアの前の多くのスパンである可能性がある。元のコードがプログラムのストアにより、またはその他のエージェントたとえばコアによって修正されている、という自己修正コードまたは相互修正コードというイベントが生じる可能性がある。こうなると、スレッドコードが古くなっている可能性もある。他の違反も、パフォーマンスの最適化及びアーキテクチャのトレードオフによって生じる可能性がある。この違反の一例が、落とされたdropped投機的ストアにヒットするハードウェアがこれをサポートしていない場合L1データキャッシュユニットのミスである。別の例は、スレッド生成器が行う想定であり、これは、後で誤りとして検知されるアサーションハードウェアブロック609。違反が生じていないということが保証された場合には、バッファリングされたストアにコミットしてグローバルに見えるようにしてよい。これは原子的に行われ、さもなくばストアの順序が壊れてしまう場合があるストアの順序は、プロセッサが順守すべき、メモリ順序づけアーキテクチャの一部である。スレッドモードの実行中は、全てのストアが通常のデータパスを利用できるわけではないが、プライベートなコヒーレントではないスクラッチパッドとして機能する第1レベルキャッシュストアを実行しているコアにも、専用データストレージにも書き込むことができる。データストレージ上述したキャッシュ及びバッファの情報には、データ、及びストアのデータサイズ/マスクが含まれる。ストアの組み合わせは、ストアが同じコミット領域からのものである限り許されている。ハードウェアが状態にコミットすると決定すると違反をチェックした後に、すべてのストアがデータストレージたとえばSSC607から出されて、コヒーレントな、スヌープ可能な状態にする必要がある。これは、ストアを、データストレージから書き込み組み合わせキャッシュWCC615に移動させることで行われる。データコピースヌープ中には、無効が全ての他のコヒーレントなエージェントに送られるので、ストアは、変更するキャッシュラインの所有権を取得する。書き込み組み合わせキャッシュ615は、同じ最適化された領域で動作している異なるエージェントコア及びスレッドからのストアを組み合わせて、これらストアをグローバルに見える状態にする。すべてのコアからのすべてのストアをWCC615に組み合わせると、スヌープ可能になる。これにより原始的なコミットが提供され、これにより、メモリ順序づけ規則が中間レベルキャッシュ217内へと維持される。バッファリングされている状態は、データストレージ内のいくつかの有効ビットをクリアすることでアボートで破棄され、これによりすべてのバッファリング状態がなくなる。元のプログラムが2以上の同時スレッドに分割されているということから、コヒーレンシーチェックを利用することができる。ソフトウェア最適化器がロード及びストアのあいまいさを正確になくさないと、誤った結果が生じる場合がある。以下のハードウェア構築ブロックは、読み―書き、書き―書きコンフリクトをチェックするために利用することができる。ロード正確さキャッシュLCC613は、最適化された領域で実行されているロードのアドレス及びデータサイズまたはマスクを保持する。これは、別の論理コアからのストアが、最適化された領域からのロードと衝突しないように利用される。スパン違反チェックが行われると、各コアは、自身のストアを他のコアのLLC613そのコアが書き込む各バイトの有効ビットを設定するに書き込む。LCC613は次に、他のコアのストアのアドレスを保持する。そして各コアが、自身のロードを、自身のLSOBロードストア順序付けバッファ605で繰り返すことでチェックして、自身のストアが書き込む各バイトの有効ビットをリセットして、各ロードが有効であるが1に設定されているバイトにヒットしないことをチェックするつまり、このバイトが他のコアにより書き込まれたものではないことを確かめる。1の有効ビットにヒットするロードは、違反と示される。ストア正確さキャッシュSCC611は、最適化された領域で実行されているストアのアドレス及びマスクを保持する。このキャッシュからの情報は、協働する論理コアのLSOB605のエントリと比較されて、コンフリクトが検知されないことを確かめる。スパン違反チェックを行うと、SCC611をリセットする。各コアは、自身のLSOB605からのストアを、他のコアのSCC611に書き込む。そして各コアは自身のストアLSOBからのものを、既にそのSCC611にあるストアと比較する。ストアが他からのストアにヒットする場合に違反が検知される。一部のストアは、スレッド生成器により複製されてよい。これらストアは、SCC611が正確に処理して、違反を偽検知しないようにする必要がある。加えて、投機ロードキャッシュSLC603が、最適化されている領域からのロードを、スレッド実行スキーム記述で協働しないが、同じアプリケーションの他のスレッドを同時に実行したり共有データにアクセスしたりしかねない論理コアからのスヌープの無効化から守る必要がある。一部の実施形態では、ここで説明するスレッド実行スキームは、全てか無かポリシーを実装して、最適化された領域の全てのメモリトランザクションが、あたかも1時点コミット時点で同時に実行されたかのように見えるようにすべきである。DTSE実行モードにある場合、各コアのL1データキャッシュはスクラッチパッドとして動作する。ストアは、スヌープに応答するべきではなくストアがグローバルに見えないように、投機データチェックされてない/コミットされたデータを、中間レベルキャッシュに書き戻すべきではない。このモードから退出すると、ロールバックされたであろうすべての投機データを、データキャッシュから破棄するべきである。一部の実装トレードオフのせいで、スレッド実行モードにある間に実行されたすべての格納またはロードされたデータを無効化する必要がある場合がある。データキャッシュでは、全てのグローバルコミット点の元のプログラムデータブロック及びトラックデータブロックを全て同じ位置に格納する。これらは全てこのブロックの元のプログラムアドレスによりアドレスされる。上述した例は容易に、3つ以上のコアがDTSE実行モードで協働している場合を含むように一般化できることができる点は注意を喚起するに値する。さらに一部の違反は、コアの実行をストールさせたり同期させたりすることで、ハードウェアたとえば一部のロード/ストア違反により回避workedaroundすることもできる。一部の実施形態では、コミットをすべてのスパンには行わない。この場合には、違反のチェックは、各スパンで行うものの、コミットはいくつかのスパン置きに行われるレジスタのチェックポイントのオーバヘッドを減らすために。一部の実施形態では、データキャッシュ及びそのエントリが通常のものではない。サポートするワーカの量によって、データキャッシュがアドレススペースマップの形態で手助けを必要とする場合がある。たとえば各データキャッシュタグをxビットアドレススペースマップで拡張することができるたとえば5ビット値が、1つのコアにつき4つのワーカを想定して、1つのコアについて2つのワーカのみの場合には3ビット、または1つのコアについて1つのルワーカの場合には2ビット等を想定する。5ビットの変形例では、ビット4が、一次論理プロセッサがこのキャッシュラインにアクセスできるかを示している。各ワーカ論理プロセッサはフィールド<3:0>のビットを有している。これは、対応するワーカ論理プロセッサがこのラインにアクセスできることを示しているたとえば0001が、ワーカ論理プロセッサ1が他のものが行えない場合にはこのラインにアクセスできることを示している。ワーカ論理プロセッサは、アドレススペースマップのビットがセットされていない場合にデータキャッシュミスを得る。一次論理プロセッサは、アドレススペースマップの一次ビットがセットされていない場合にデータキャッシュミスを得る。データキャッシュは、全てのアクセスがせいぜいその1にヒットすることを前提として、同じアドレスの複数のラインを含んでいてよい複数の方法で。これは、アドレススペースマップの5ビットそれぞれについて、データキャッシュには、ビットが同じアドレスにセットされているラインが2以上はないことを意味している。同じタグを持つ複数の方法のデータキャッシュを読み出すとき、もしあれば、要求している論理プロセッサがアクセス可能な固有の方法を選択する。なければ、データキャッシュミスとなる。上位のストア処理一番古いストアの処理においては、上位のストアは、ストアを実行した論理プロセッサがアクセス可能なキャッシュラインのみに移動する。さらにあるワーカが上位のストアをデータキャッシュに書き込む場合、対象のラインのアドレススペースマップは、ストアを行った論理プロセッサのみがアクセス可能なようにセットされる。すべての一次論理プロセッサは、この趣旨からは同じと考えられる。加えて一部の実施形態では、論理的に各データキャッシュラインに関連付けられている現在のビットが存在している。これはデータキャッシュまたはデータキャッシュタグに物理的に近接している必要はない。ワーカ論理プロセッサがアクセス可能なすべてのキャッシュラインについての現在のビットは、ワーカ論理プロセッサのグローバルコミットマーカが上位になるとクリアされる。ラインに対する書き込みが成功すると、現在に設定される。ラインが中間レベルキャッシュに書き戻されると、これも現在に設定される。中間レベルキャッシュからのリフィルがあると、ダーティな場合、ラインは現在ではないと設定されるべきであり、中間レベルキャッシュでは現在ではないに設定されるべきである。そうではない場合には、データキャッシュの現在に設定される。現在のビットは、データがなくても中間レベルキャッシュから応答があると、このように設定されるMLCは所有権を付与するだけである。1点だけ、中間レベルキャッシュがダーティで、現在ではない、を形成することは、通常ではない。これはデータキャッシュに戻されて、データがない場合であってもデータキャッシュの現在のビットの状態を設定するMLCは所有権を付与するだけである。現在のビットがオフのダーティなデータキャッシュラインに、上位ストアがデータキャッシュに配置される前に、このストアを書き込もうとすると書き戻しが生じるが、無効化は生じない。データキャッシュラインの書き戻しを行うと、現在のビットが設定される。適切な場合に上位ストアの書き込みに成功すると、引き起こされるprovoke書き込みの後に、ラインが現在に設定される。上位ストアの書き込みが、現在のビットがオフのクリーンなデータキャッシュラインE状態にヒットすると、中間レベルキャッシュに信号が送られて、ダーティな場合には、このラインのコピーを最終レベルキャッシュに書き戻して、新たなトラックデータブロック用の新たな物理アドレスを取得するよう促される。中間レベルキャッシュのダーティなデータは、同じグローバルコミットスパンに、データキャッシュに今行こうとしているダーティなデータとして移動しない。データキャッシュラインは、上位のストアをそれに書き込んだ結果、現在という状態を得る。一部の実施形態では、各ワーカ論理プロセッサについてメタデータバッファ不図示が存在している。メタデータはバッファに順次書き込まれる。メタデータバッファはこれを中間レベルキャッシュに書き込むことができる必要がある。トラックが実行されると、トラックデータがリザーブされているメモリに書き込まれ、メタデータがリザーブされているメモリに書き込まれる。残りの処理は、メタデータをリザーブされているメモリから読み戻して、チェックしてから、様々なトラックからのトラックデータを統合して、リザーブされているメモリから読み出して、元のプログラムアドレススペースの新たな状態として見ることができるようにすることである。中間レベルキャッシュ217では、全てのグローバルコミット点のトラックデータブロック及び元のプログラムデータブロックが、全て同じ位置に格納される。これらは全てブロックの元のプログラムアドレスによりアドレスされる。中間レベルキャッシュでは、中間レベルキャッシュラインの現在の現実の物理アドレスを保持するタグに対して拡張が行われている。現実の物理アドレスは、中間レベルキャッシュから最終レベルキャッシュに書き戻すために必要となる。中間レベルキャッシュの他のほとんどの動作には利用されない。一部の実施形態では、現実の物理アドレスは、トラックデータブロック番号である。16ビット以下である。一部の実施形態では、中間レベルキャッシュに関するハードウェアレジスタが、各ワーカ論理プロセッサの元となるアドレス及びトラックデータスペースの制約、並びに、各トラックの最後に割り当てられたトラックデータブロックを保持する。このハードウェアは、現在のグローバルコミット番号も保持する。各中間レベルキャッシュに論理的に関連づけられた現在のビットが存在する。中間レベルキャッシュまたは中間レベルキャッシュタグに物理的に近くなくてよい。すべてのキャッシュライン用の、ワーカ論理プロセッサがアクセス可能なこのビットは、グローバルコミットマーカがこのワーカの上位にあるときにクリアにされる。一部の実施形態では、各中間レベルキャッシュタグは、6ビットの我々が1つのコアについて4つのワーカをサポートすると想定してアドレススペースマップで拡張される。このタグのサイズは、1つのコアについてのワーカの数に依存する。アドレススペースマップは、同じ時点で同じタグを含む同じアドレスの中間レベルキャッシュの複数のラインの所有をサポートしている。どの論理プロセッサがそのラインにアクセスすることができるかを特定している。同じタグを持つ複数の方法の中間レベルキャッシュを読み出すとき、もしあれば、要求している論理プロセッサがアクセス可能な固有の方法を選択する。なければ、中間レベルキャッシュミスとなる。一部の実施形態では、中間レベルキャッシュの各ラインが、一時的にコミットされたビット及び一次的にデコミッショニングされたビットを有していてよい。コミットは、全ての一時的にコミットされたキャッシュラインのための、現実の物理アドレスの有効ビットをクリアし、一次アクセス可能なものを設定するフラッシュと、全ての一時的にデコミッショニングされたキャッシュラインのためのライン有効ビットをクリアするフラッシュとからなる。一部の実施形態では、各DTSEクラスタを有する複数のチェッカーステートマシンが存在している。各チャッカーステートマシンは、スレッドに動作するので、提供されるステートマシンの数によって、クラスタが同時に動作できるスレッドの数が決定される。チェッカーステートマシンは、同じスレッドで動作するすべてのトラックからメタデータリストを読み出して、ストア正確さキャッシュ及びロード正確さキャッシュを介して処理する。さらにコピーバックリストを書く。一部の実施形態では、コピーバックステートマシンは、コピーバックリストから中間レベルキャッシュを有する統合ステートマシンにキャッシュラインを配信して、ストアデータの様々に異なるトラックからの実際の統合を行い、元のプログラムアドレススペースに結果を配置する。一部の実施形態では、1つの中間レベルキャッシュにつき、正確に1つの統合ステートマシンが設けられる。このステートマシンは、こうすることが適当なときには、いくつかのトラックのトラックデータストレージからデータを実際に統合する。ロードが実行されると、ロードを行ったスレッドを除いて、システムのいずれかのエージェントがストアせず、このロードがグローバルにコミットされるまでこのロードにヒットすることが証明可能である必要がある。このグローバルコミットまで、任意のロードまたはストアのコアの退避からの確証があるべきであり、このスレッドの実行中に協働する一部の中間レベルキャッシュが、少なくとも共有状態で対象の元のプログラムアドレスを有してきた。このラインは、協働している中間レベルキャッシュマスタ―スレーブ法の間でやりとりすることができるが、所有は連続させる必要がある。これは、このラインの所有権を持つ任意の他のエージェントについて、協働する中間レベルキャッシュのうち少なくとも1つが、他の協働する中間レベルキャッシュがラインを有していない場合に無効スヌープを得ることを意味している。通常は、各DTSEクラスタが所有キャッシュを有している。この構造は、われわれがクラスタ内のある中間レベルキャッシュがリングまたはデータキャッシュからスヌープを得る、と確証できるキャッシュラインを示している。通常は所有キャッシュはリザーブされているメモリに位置しているが、一部はチェッカーキャッシュされてもよい。各ワーカ論理プロセッサは投機アクセスキャッシュを有している。投機アクセスキャッシュは、ワーカ論理プロセッサによりローカルに退避されてはいるが、まだグローバルにコミットはされていないロード及びストアを表している。グローバルコミットマーカは、特別なアドレスのストアである。データは、クラス番号と、コミットポインタ記述子へのポインタとを与える。コミット待ちは、特別なアドレスセットへのロードである。どこでも生じる可能性がある。このセット内の正確なアドレスに応じて、最後のグローバルコミットポイント、または一定のクラスの最後のグローバルコミットポイント、またはおそらくその他の可能性ある選択肢において、コミットを待つことができる。このロードのアドレスは、最後にグローバルにコミットされたメモリ状態を要求することができる。DTSEは、コミット待ちに応答しないので、要求しているワーカの実行を、指定されているグローバルコミットが生じるまでストールさせておく。最後のグローバルにコミットされたメモリ状態が要求されている場合には、DTSE論理はさらに、要求しているワーカのすべてのトラックデータを無効化する。DTSE論理は、コミット待ちについてデータを返す。これによりこのワーカがアンストールされて、処理が進められる。最後にグローバルにコミットされたメモリ状態が要求されている場合、待ち状態として特定されたグローバルコミットポイントの後のこのワーカのすべてのストアが失われる。したがって一般的には、この選択肢は、グローバルコミットポイントを待った後で、且つ、このワーカがこれ以上ストアをする前に行うのが現実的である。通常、待ち状態は、待っていたグローバルコミットポイントのグローバルコミットマーカの直後に行う。待ち状態には3つの用途がる。1つ目が、待ち状態を、レジスタ状態が変更されないように保護するものであり、これによりいくつかのレジスタをセーブする必要がなくなる。異なるトラックのストアにロードがヒットする場合には時にそうなる、これにより、ロードが正確な結果を得ることができるようになり、さらに、逃亡投機runawayspeculationを防ぐこともできる。<II.動作>データメモリ状態は、データ自身及びメタデータで表される。これらは、別個に格納されるだけでなく、異なる方法で格納される。一次論理プロセッサ及びワーカ論理プロセッサの両方がメタデータを有している。メタデータがない場合には、メモリ状態は、ワーカ論理プロセッサにとって意味をなさない。メタデータは、一次論理プロセッサのプロファイリング目的にのみ利用される。リザーブされているメモリのデータスペースに関して、一部の実施形態では、各トラックが、自身のデータスペースをリザーブされたメモリに有しており、各ワーカ論理プロセッサも同様である。一次論理プロセッサはトラックデータスペースを有さない。フローに入ると、全てのトラックデータスペースが未割当になる。キャッシュラインサイズブロックは、フローが実行されると、必要に応じて、順次循環して割り当てられる。各割り当ては、具体的なグローバルコミットスパン用のものである。ブロックは、自身が割り当てられているスパンがグローバルにコミットされるために、割り当てを解除される。各ワーカ論理プロセッサについて割り当てポインタと割り当て解除ポインタとが存在する。これらのポインタは、ブロック番号を含むが、アドレスは含まない。ブロック番号スペースは、この割り当てのために存在している物理ブロック数の倍数である。割り当てにおいて、ブロック番号はラップwrapすることができない。すべてのブロック番号が一度割り当てられると、このトラックは、これ以上トラックデータブロックを割り当てることができない。これ以上割り当てる必要がある場合には、フローを退出することになる。他方で、物理ブロックの割り当ては、ブロック番号をラップさせない上限まで複数回ラップする。実際の物理アドレスに割り当て解除されたブロック番号を有している中間レベルキャッシュのラインは、最後のレベルキャッシュに書き戻さない。同様に、中間レベルキャッシュにミスがあり、リフィルのための現実の物理アドレスが、割り当て解除されたブロック番号である場合には、リフィルが代わりに元のプログラムアドレスから選ばれる。このラインは、投機ストアを含むことができない。投機ストアがある場合には、より最近割り当てしなおされたものであるはずである。実行しているコード内でトラックの論理位置を異ならせるに足る量と、チェック時間およびグローバルコミットをカバーするに足る量をカバーすることのできるトラックデータを割り当てるに足る量の物理ブロックが必要であることがわかるだろう。ブロック番号スペースは、フローの最初から最後までの全実行をカバーする必要がある。トラックに状態復帰がある場合、トラックを実行しているワーカのためのトラックデータスペースは、空の状態に初期化され、割り当てのための元の開始点を与えられる。割り当ては、トラックが実行されるとワーカ論理プロセッサに関連する論理で行われる。コピーバックステートマシンは、この空間の特定の位置を、後のグローバルコミット処理で、ストアと関連付ける。コピーバックステートマシンは、統合ジョブキューを、利用している各統合ステートマシンについてメモリに書き込む。これにより、統合ステートマシンがアクセスするべきトラックデータブロックが記載される。これがメモリ経由で行われるので、なるべく圧縮状態に維持するべきである。各論理プロセッサのメタデータは別個に格納される。一部の実施形態では、論理プロセッサのメタデータは、プログラム正確さアドレス、サイズ、及びロード/ストア指標の線形アレイである。これは、位置合わせマーカ及びグローバルコミットマーカ、さらに複製されたストアマーカが含まれる。これはさらに、分岐の方向及び間接分岐対象も含んでよい。さらに、中間レベルキャッシュで受信された無効の記録も含んでよい。コアがデータの元のプログラムアドレスにロードする場合、ハードウェアは、アドレスとサイズとを得て、エンタデータリストに追加する。ワーカが一次アクセス可能なデータキャッシュラインからロードする場合には、設計に便利な場合、ダーティな場合には、中間レベルキャッシュに書き戻しを強制した後で共有させる。便利ではない場合には、ラインを一次アクセス不可能にして、現在ではないにしてよい。これらアクセションのいずれであっても、このワーカと協働していない論理プロセッサによってこのラインが将来格納された場合には通知がいくようにすることができる。実行モードのワーカからの上位ストアは、データキャッシュに書き込むためにデータキャッシュの所有権を必要としない。上位ストアは、共有状態のラインに書き込むことができるが、ラインはトラックによりアクセス可能でなければならない。Catalinaワーカから上位のストアがデータキャッシュラインに書き込まれた場合には、そのラインは、そのワーカのみがアクセス可能となる。そのラインが以前に何であったかに関わらず、トラックデータに変換される。ここで、ラインがダーティな場合には、一部の実施形態では、既にトラックデータになっており現在になっている場合を除き、上位のストアが書き込まれる前に強制的に書き戻される。このために、あるデータキャッシュラインへの上位のストアを処理するときには、そのデータキャッシュラインについての所有権は不要である。これは実際にトラックデータのストアであるために、中間レベルキャッシュは、元のプログラムアドレスラインの所有権を必要としたり、要求したりしない。トラックデータラインの所有権を有している。これは、他のトラックがこのラインに格納しているかもしれないために重要である。統合エンジンは、コミットするために元のプログラムアドレスラインの所有権を得る必要がある。他の中間レベルキャッシュは、ラインを共有して、トラックにより読み出すことができてよいが、それを所有することはできない。ここに記載する条件のために、所有する必要も、所有を要求する必要もない。これは、1つの中間レベルキャッシュを統合に利用しておりコミットしており、元のプログラムのアドレスラインの所有権を要求しているが、他のトラックも、共有状態でそのラインを維持して、読み書き両方を行うことができる、ことを意味している記載するように、書き込みによりトラックデータに変換される。データキャッシュミスが生じると、そのラインは、中間レベルキャッシュから要求されるが、これはいつも通りである。コアがデータの元のプログラムアドレスに格納する際、ハードウェアはアドレス及びサイズを得て、メタデータリストに追加する。データキャッシュでは、元のプログラムデータブロック及びすべてのグローバルコミットポイントのトラックデータブロックを全て同じ位置に配置する。これらは全てブロックの元のプログラムアドレスによりアドレスされる。このワーカがアクセス可能なすべてのキャッシュラインの現在のビットは、グローバルコミットマーカが上位になったときクリアされる。ラインに対する書き戻しが成功すると、現在に設定される。ラインが中間レベルキャッシュに書き戻されると、これも現在に設定される。中間レベルキャッシュからのリフィルがあると、ダーティな場合、ラインは現在ではないと設定されるべきであり、中間レベルキャッシュの現在ではないに設定されるべきである。そうではない場合には、データキャッシュの現在に設定される。現在のビットは、データがなくても中間レベルキャッシュから応答があると、このように設定される。ワーカが、現在のビットがオフのダーティなデータキャッシュラインに、上位ストアがデータキャッシュに配置される前に、このストアを書き込もうとすると書き戻しが生じるが、無効化は生じない。ビットは、このライトバックをセットされ、これにより、中間レベルキャッシュが、新たなトラックデータブロックの割り当てを促される。データキャッシュラインの書き戻しを行うと、現在のビットが設定される。適切な場合に上位ストアの書き込みに成功すると、引き起こされる書き込みの後に、ラインが現在に設定される。このラインにアクセス権を持つワーカが、一次アクセス可能なダーティなデータキャッシュラインに、上位ストアがデータキャッシュに配置される前に、上位ストアを書き込もうとすると書き戻しが生じるが、無効化は生じない。データキャッシュラインの書き戻しを行うと、現在のビットが設定される。適切な場合に上位ストアの書き込みに成功すると、呼び出す書き込みの後に、ラインが現在に設定される。適切な場合に上位ストアの書き込みに成功すると、引き起こされる書き込みの後に、ラインが現在に設定される。このラインにアクセス権を持つワーカが、一次アクセス可能なクリーンなデータキャッシュラインに、上位ストアを書き込もうとすると、中間レベルキャッシュは信号を受け取り、ダーティな場合には最後のレベルキャッシュにこのラインを書き戻して、新たなトラックデータブロックのために新たな物理アドレスを無条件に取得するよう促される。上位のストアの書き込みに成功すると、現在という状態に設定される。上位ストアの書き込みが、現在のビットがオフのクリーンなデータキャッシュラインE状態にヒットすると、中間レベルキャッシュが信号を受け取り、ダーティな場合には、このラインのコピーを最終レベルキャッシュに無条件に書き戻して、新たなトラックデータブロック用の新たな物理アドレスを取得するよう促される。中間レベルキャッシュのダーティなデータは、同じグローバルコミットスパンに、データキャッシュに今行こうとしているダーティなデータとして移動しない。データキャッシュラインは、上位のストアをそれに書き込んだ結果、現在という状態を得る。上位ストアが存在しており、そのラインが、データキャッシュでEまたはM状態ではない場合には、所有権要求のための読み出しが、中間レベルキャッシュからのラインについて行われるが、これは通常通りである。データキャッシュは、中間レベルキャッシュに、ラインを書き戻し、新たなトラックデータブロックを割り当てるよう要求することができる。そのラインが中間レベルキャッシュでダーティな場合には、書き戻されて、新たなトラックデータブロックが割り当てられる。ラインが中間レベルキャッシュでクリーンな場合であっても、要求が無条件に新たなトラックデータブロックの割り当てを指定している場合もある。新たなトラックデータブロックを割り当てる場合には、そこにあったブロックで置き換える。データは同じである。中間レベルキャッシュにすべての書き戻しを行うと、データキャッシュ現在のビットこの書き戻しに従ってセットされる前が中間レベルキャッシュに送られる。データキャッシュの書き戻しには2つの理由が存在している。つまり、データキャッシュの従来の立ち退き、または新たな上位ストアが、現在ではないダーティなデータキャッシュラインにヒットした場合である。データキャッシュは、新たな上位ストアが、現在ではないダーティなデータキャッシュラインにヒットした場合にアサートされるビットを送る。中間レベルキャッシュは新たなトラックデータブロックを割り当てる。一部の実施形態では、キャッシュ及びトラックデータディレクトリがリザーブされているメモリに、各トラックについて格納されている。1つのラインのデータは、トラックデータブロック番号及びグローバルコミット番号だけである。このキャッシュは、トラックがアクセス可能であるが、一次からはアクセス可能ではないダーティなトラックデータブロックが立ち退かされる場合のみに新たなトラックデータブロックの割り当てとは関係がない書き込まれる。一部の実施形態では、トラックデータディレクトリサマリと称されるトラックデータディレクトリをミラーする別の構造がある。ワーカ論理プロセッサにより中間レベルキャッシュミスがある場合には、トラックデータディレクトリのその場所をカバーするビットが、トラックデータディレクトリサマリから読み出される。通常は、これは無効であり、トラックデータディレクトリミスを示す。この場合には、中間レベルキャッシュヘノリフィルをブロックの元のプログラムアドレスから得るべきである。このデータは既に中間レベルキャッシュ内に、一次アクセス可能バージョンとして存在させておいてよい。この場合には、このバージョンは単に、ワーカからもアクセス可能としてよい。サマリーがヒットの可能性を示している場合には、トラックデータディレクトリは、実際にヒットであることが明らかになった場合には、最新のトラックデータブロック番号を取得するべくアクセスする必要がある。論理は、これをブロックのアドレスに変換することができる。そしてブロックは、リング経由で要求されるミスの場合で通常行われているように。新たなトラックデータブロックの割り当ては、中間レベルキャッシュから最終レベルキャッシュへの書き戻しの特殊な形態である。中間レベルキャッシュがラインを最終レベルキャッシュに書き戻したいと望む場合、このラインは一次アクセス可能ではないが、有効な現実的物理アドレスを有していないので、書き戻しを進める前に、新たなトラックデータブロックをこのために割り当てる。書き戻しは、新たなトラックデータブロックを割り当てることで得られる物理アドレスに進む。新たなトラックデータブロックの割り当てプロセスは、本明細書の前のセクションで説明済みである。各トラックでは、実行がグローバルコミットポイントに別個にヒットする。グローバルコミットポイントマーカとして機能する特別なアドレスへのストアが存在している。これは新たにグローバルコミット番号を増分させる。自身のトラックのグローバルコミット番号が増分させられる。これは、中間レベルキャッシュに関するDTSE論理の一部として維持される。上述したように、これによりストアが新たなデータブロックに進む。そしてデータキャッシュ及び中間レベルキャッシュ両方に関する現在のビットをクリアする。ストアは、グローバルコミットポイントでのみグローバルに見ることができる。ロード及びストア両方をグローバルに投機することができるので、次のグローバルコミットポイントまでは、無効スヌープによるヒットを受けやすい。トラックは、このコミットスパンが完了したことを示すフラグをセットする。チェッカーステートマシンは、このフラグをすべてのトラックから受け取るのを待っている。前述したように、各ワーカ論理プロセッサはストア正確さキャッシュを有している。このキャッシュは、1つのワーカのストアが同じ位置合わせスパン内の別のワーカのストアには、これらが同じストアである場合を除いてヒットしてはならない、という規則を実施する。また、1つのワーカのロードが、同じ割り当てスパンの別のワーカのストアに衝突してはいけないという規則も実施する。まずロードを先に処理してロードをその後で処理するという規則も実施する。ストアをまず処理してロードを後で処理する場合には、ロード正確さキャッシュにより捉えられる。上述したように、各ワーカ論理プロセッサは、ロード正確さキャッシュを有している。ロード正確さキャッシュは、フローに入るときから現在の一時的なグローバルコミットポイントまでで格納されたすべてのバイトを特定する。特に、論理的にバイトを最後に書いたワーカを特定する。コピーバックステートマシンは、コピーバックリストに働きかけて、示されているストア全てを元のプログラムアドレス位置に統合して、グローバルに見えるようにする。コピーバックリストは、プログラム順序ではないストアの集合体を表している。したがってコピーバックリストに表されるすべてのストアを、原子的にグローバルに見えるようにする必要がある。外部からは、これらすべてのストアを見ることができるか、またはいずれも見えないようにする必要がある。内部的な課題実行のみの分岐違反または格納違反またはロード違反などに起因したフロー退出がある場合に、フロー退出の前の最後のグローバルコミット点に復元する。これにより、コピーバックステートマシンが終わるまで待つことになるので、違反前の最後のグローバルコミット点となる。グローバルに投機的なロードにヒットしたスヌープが無効になった等のある外部の理由からフロー退出がある場合には、関連する命令が、コピーバックステートマシンに解放されたスパンにある可能性がある。こうではないとわかっている場合を除き、これにより、コピーバックステートマシンが現在作業しているコピーバックリストにグローバルにコミットすることなく、直近の退出がなされてしまうだろう。データキャッシュとして見ると、統合ステートマシンは、別のデータキャッシュと変わらない。統合ステートマシンがキャッシュラインにアクセスする場合、これにより、データキャッシュがスヌープされて、データキャッシュでラインがダーティな場合に書き戻しが強制される。修正されたブロックは、複数の中間レベルキャッシュをスパンしている場合があるので、少し同期している。ブロックは全て元のプログラムアドレスブロックにアクセスするトラックデータへのアクセスのみが読み出され、OKである。一時的なビットがこのために利用されてよい。最適化されたスレッドにされたコードを実行している間に、元のコードが、最適化されたコード及び同時に実行されている関連しないコードが生成したストアのために変化することがある。これに対する防御策として、XMCGuardataキャッシュXGC409が利用される。このキャッシュは、最適化されたコードを生成するためにアクセスされた全てのページのアドレス及びスヌープ無効化ヒットの場合に利用される最適化された領域のIDを保持する。領域IDは、集合が保護されている領域キャッシュラインに接触するすべての静的コードラインを示す。図7は、一部の実施形態におけるXGC409の用途を示している。最適化されたコードを実行する前に、コアは、XGCのすべてのエントリが退出して、且つ、スヌープされたり置き換えられたりしていないことを保証する。この場合に、最適化されたコードの実行が許可される。もしも、最適化されたコードの実行中に、別の論理コアが元のページのいずれかにおけるデータを変更する場合には、XGCは、スヌープ無効化メッセージを受け取りコヒーレンシー領域の他のキャッシュエージェント同様に、コアのいずれかに対して、一定のページに関連する最適化されたコードの実行をアボートして、そのページを利用する、保持している任意の最適化されたコードエントリポイントを無効化する必要がある。スレッド実行モードの実行中に、全てのストアをXMC409に対してチェックして、セルフ修正コードから守る。もしもストアがホットコード領域にヒットする場合には、違反をトリガする。一部の実施形態では、スレッド生成器が、後で正確さをチェックするいくつかの推定を行う。これは主にパフォーマンスの最適化である。この推定の一例が、呼び出し―リターンの対である。スレッド生成器は、リターンがその呼び出しに戻る、と想定してよい大多数の場合それで正しい。スレッド生成器は、全ての呼び出された関数を1つのスレッドにして、以下のコードをリターンの後のもの、他のスレッドで実行させる。以下のコードは、リターンを実行する前に実行開始して、スタックが探されるために、実行が間違っていることもあるたとえば関数がリターンアドレスをスタックに書き込むときに、元のリターンアドレスを上書きしてしまう等。このようなケースが起こらないようにするために、各スレッドが、アサーションハードウェアブロックにアサーションを書き込むことができる。アサーションは、両方のスレッドがそのアサーションに同意すると、満たされる。スパンにコミットするためには、アサーションが満たされねばならない。<III.ソフトウェア>動的スレッド切り替え実行DTSEソフトウェアは、フローと称されるコードの重要な静的サブセットを定義するために、ハードウェアが収集したプロファイリング情報を利用する。一部の実施形態では、このソフトウェアが自身の作業メモリスペースを有している。フローの元のコードは、この作業メモリで繰り返される。作業メモリのコードのコピーは、ソフトウェアにより変更することができる。元のコードはそっくり元の形態のままで、メモリの、元の位置に維持される。DTSEソフトウェアは、DTSE作業メモリのフローを、複数の論理プロセッサで実行することができる複数のスレッドに分解することができる。これは、論理プロセッサがこの動作なしに完全には利用されない場合に行われる。これは、ハードウェアが実行可能な5つのことにより可能となる。いずれにしても、DTSEソフトウェアは、DTSE作業メモリにコードを挿入して、もっと数の多い論理プロセッサのおそらくはSMTのハードウェアプロセッサでの処理を制御する。一部の実施形態では、ハードウェアは、実行されているコードのプロファイリングを続けるべきであるこれには、DTSEソフトウェアが処理したフローが含まれる。DTSEソフトウェアは、変化する振る舞いに応えて、前のコードの処理を改定する。したがって、ソフトウェアは、ペースは遅いかもしれないが、処理するコードをシステマチックに向上させることができる。<フローの定義>DTSEハードウェアが、リストのトップに新たなIPを有している場合、ソフトウェアはこのIPを、新たなフローのプロファイルルートとする。ソフトウェアは、ハードウェアに、このプロファイルルートからプロファイルをとらせるようにする。一実施形態では、ハードウェアは、次回に実行がプロファイルルートIPにヒットするときにプロファイルを開始して、その後で大体50,000個の動的命令について1つの連続したショットで実行されるようにする。メモリのバッファは、全てのロード及びストアのアドレス、直接の分岐の方向、及び間接分岐の対象で満たされる。リターンも含まれる。これにより、ソフトウェアは、静的コードのプロファイルルートで開始されて、静的コードによってプロファイルされた経路をトレースすることができるようになる。各分岐の実際の対象を発見して、全てのロード及びストアの対象アドレスがわかるようにする。このプロファイル経路がヒットするすべての静的命令は、フローにあるよう定義される。このプロファイル経路がヒットするすべての制御フロー経路は、このフロー内にあるよう定義される。このプロファイル経路がヒットしていないすべての制御フロー経路は、フローを去るものとして定義される。一部の実施形態では、DTSEソフトウェアが、ハードウェアを、同じロートから再度プロファイルをとるようにすることができる。フローにまだない新たな命令または新たな経路がフローに追加される。ソフトウェアは、命令または経路をフローに追加しないプロファイルをとったときに、これ以上プロファイルを要求しないようにする。<フローの維持>フローは、定義された後でモニタ及び改定される。これは、新たなコードを生成した後で、複数のスレッドにおいても起こりうる。フローを改定する場合には、通常これはコード、おそらくスレッドコードの再生が含まれる。<非効率なフローの劣化aging>一部の実施形態では、平均長さがLの指数的に劣化するフローを各フローについて維持する。一実施形態では、Lが500,000に初期化されている。フローを実行するとき、フローで実行されている命令数をNと想定する。すると、以下のように計算される。L=0.9LN。Lが1つのフローについて一定数未満になるとたとえば100,000、フローを削除する。これはさらに、これらの命令がホットIPについて利用可能であることを示しているが、ここでも一部の他のフローにある場合は除く。<フローの統合>一部の実施形態では、フローを実行するときに、一定数の動的命令の前にたとえば25,000、ホットコードの実行ではなくて、そのホットコードエントリポイントを設定してプロファイルをとらせる。次にこのホットコードエントリポイントがヒットしたとき、プロファイルを、エントリポイントから一定数の命令たとえば50,000についてとるようにする。これにより、このフローについてのプロファイルの集合体に追加される。フローにはいずれの新たな命令及び新たな経路であっても追加することができる。一部の実施形態では、フローの分析および子コードの生成を、この集合体のなかの新たなプロファイルでやりなおす。<トポロジー分析>一部の実施形態では、DTSEソフトウェアがトポロジー分析を行う。この分析は、以下の動作のうち1以上から構成されてよい。<基本ブロック>DTSEソフトウェアは、フローのコードを基本ブロックに分割する。一部の実施形態では、プロファイリングで観察された結合部joinのみを結合部として維持する。明らかな対象を有するフローに分岐があり、この対象がフローにある場合には、この結合部がプロファリングで見られなかった場合には、この結合部は無視する。プロファイリングでとられたことが観察されなかったすべての制御フロー経路エッジは、フローを退出するとしてマークされる。これには、常にとられることが観察された分岐についての方向から落ちることfallthoughとられていない分岐が含まれる。プロファイルの分岐の単調性無条件の分岐を含むは、対象が結合部ではない限り、基本ブロックでは終了しない。呼び出し及びリターンによって基本ブロックが終了される。上述したことを行った後で、DTSEソフトウェアは、基本ブロック集合体、及び、基本ブロック間のエッジの集合体を得ることになる。<トポロジールート>一部の実施形態では、各プロファイルを利用して、フローの静的コード全体を通るようガイドする。この各呼び出しを通る間に、呼び出し対象基本ブロック識別子をスタック及び各リターンにプッシュで配置して、スタックをポップさせる。コードストリーム全体では均衡のとれた呼び出し及びリターンを有していたとしても、フローはこれより多いまたは少ない開始及び終了点を有する動的実行の断片から得られる。呼び出し及びリターンがフローで均衡されていると思う理由はない。もしあれば、遭遇した各基本ブロックは、スタックの上位の基本ブロック識別子で特定されるプロシージャにあるとして命名される。プロファイルルートからのコードは、いくつかの場合において、最初はどのプロシージャにない場合がある。このコードには、プロファイルの後で、プロシージャ内として特定される箇所で、再度遭遇する可能性がある。もっと可能性のあるのは、どのプロシージャにもないコードが存在することである。トポロジー分析の質は、トポロジー分析に利用するルートに応じて決まる。通常は、良好なトポロジー分析を得るために、ルートは、フロー内にあるとして定義される静的コードの一番外のプロシージャにあるべきであるつまり、どのプロシージャにもないコードにあるべきである。ハードウェアが発見するプロファイルルートはその可能性がない。したがってDTSEソフトウェアは、トポロジー分析が利用するトポロジールートを定義する。一部の実施形態では、どのプロシージャにもない基本ブロックのうち、コードRのサブセットが、Rの任意の命令から始まるが、フローのエッジのみを利用するようつまり、少なくとも1つのプロファイルでとられると観察されたエッジ、そしてフローのすべての他の命令に対して経路があるように特定される。Rは、空の可能性がある。Rが空の場合には、トポロジールートをプロファイルルートとして定義する。Rが空ではない場合には、Rで一番数の小さいIP値を、トポロジールートとして選択する。ここからは、ルートをトポロジールートの意味で利用する。<プロシージャのインライン>従来のプロシージャのインライン処理は、呼び出し及びリターンのオーバヘッドを減らすことを意図して行われていた。DTSEソフトウェアは、コードの振る舞いについての情報を維持する。プロシージャのコードは、どのコードで呼び出すかに応じて異なる振る舞いをしている。したがって一部の実施形態では、DTSEソフトウェアが、このプロシージャに対するすべての異なる静的呼び出しについて、それぞれプロシージャのコードについての情報について別のテーブルを維持する。このコードの中間の段階は実行不可能である。分析を行う場合、DTSEソフトウェアは実行可能なコードを生成する。この直近の状態では、インラインプロシージャにおいてコードの重複は生じない。プロシージャインラインによって、プロシージャのコードに複数の名称が割り当てられ、各名称に対して別の情報が維持される。一部の実施形態では、この処理は再帰的である。外部プロシージャAが、3つの異なるサイトからプロシージャBを呼び出し、プロシージャBが、4つの異なるサイトからプロシージャCを呼び出すとすると、プロシージャCには12個の異なる振る舞いがある。DTSEソフトウェアは、このコードへの12個の異なる呼び出し経路に対応するプロシージャCのコードに関する情報の異なるテーブル、および、このコードの12個の異なる名称を維持する。DTSEソフトウェアがこのフローの実行可能なコードを生成する場合、その数は、このコードの静的コピーの数12よりずっと少ない可能性がある。コードの同じビットの複数のコピーは対象ではなく、殆どの場合には、呼び出し及びリターンのオーバヘッドは些細なものである。しかし一部の実施形態では、DTSEソフトウェアは、このコードに、各呼び出し経路の異なる振る舞い情報を維持する。DTSEが維持する振る舞い情報の例は、とりわけ、命令への依存度であり、ロード及びストアの対象及び分岐の可能性である。一部の実施形態では、DTSEソフトウェアが、元のコードに静的に呼び出し命令がある場合、呼び出されたプロシージャから戻るリターンことが常に、呼び出しに続く命令に行くことであるプロファイリングで生じないことが観察されていない限り、と想定する。しかし、一部の実施形態では、これが実行において正確であることがチェックされる。DTSEソフトウェアが生成するコードはこれについてチェックする。一部の実施形態では、DTSEが生成する最後の実行可能なコードが、元のコードの呼び出し命令について、プログラムのアーキテクチャスタックについてアーキテクチャリターンアドレスを後押しするpush命令が存在している可能性がある。これが、生成されたコードが全く異なる位置にあり、スタックの誤った値を推し進めることがあることから、生成されたコードの呼び出し命令によっては実行できないことに留意されたい。このスタックにプッシュされた値は、ホットコードにとっては利用価値があまりない。プログラムのデータスペースは、常に正確に維持される。複数のスレッドが生成されている場合には、どのスレッドがこれを行うかはあまり重要ではない。いつでもどこでも行うことができてよい。一部の実施形態では、DTSEソフトウェアが、プロシージャが非常に小さい場合には、特定のスレッドに物理的に列をそろえられるプロシージャの一部の物理的コピーを配置する、という選択を行うことができる。さもなくば、物理的コピーがここにはなく、コードに向かう何らかの制御転送命令があることになる。これについては、コード生成というタイトルで詳述する。一部の実施形態では元のコードのリターン命令について、DTSEが生成する最終的な実行可能コードに、プログラムのアーキテクチャスタックからのアーキテクチャリターンアドレスをポップさせる命令が存在する。DTSEソフトウェアがこのリターンの対象であると信じるアーキテクチャのでもホットコードではないリターン対象IPは、コードに開示される。一部の場合には、これはホットコードの直近の定数である。他の場合には、これがDTSEメモリの、おそらくはスタック構造内に格納されている。これはプログラムのデータスペースの一部ではない。スタックからポップする値は、DTSEソフトウェアがこのリターンの対象であると信じるIPと比較されてよい。これら値が異なっている場合にはフローを終了させる。複数のスレッドが生成されている場合には、どのスレッドがこれを行うかはあまり重要ではない。いつでもどこでも行うことができてよい。一部の実施形態では、DTSEソフトウェアが、プロシージャが非常に小さい場合には、特定のスレッドに物理的に列をそろえられるプロシージャの一部の物理的コピーを配置する。さもなくば、物理的コピーがここにはなく、コードに向かう何らかの制御転送命令があることになる。これについては、コード生成というタイトルで詳述する。<バックエッジ>一部の実施形態では、DTSEソフトウェアが、フローに設定される最少バックエッジを発見する。最小バックエッジセットは、基礎ブロック間のエッジセットであり、これらエッジの作成時に、閉じたループ経路がないようにする。セットは、エッジ全てがセットから取り除かれた場合に閉じたループ経路があるようにする、という意味で最少であるべきである。一部の実施形態では、そのセットのすべてのバックエッジが作成された場合であってもコードが完全に接続されているという特徴がある。ルートから、基礎ブロックの集合全体のすべての命令を導き出すことができることが可能である。各プロシージャは別個に行われる。したがって呼び出しエッジ及びリターンエッジをこの際に無視することができる。別個の話として一部の実施形態では、再帰的な呼び出し分析が実行される。これは、ネスト状の呼び出しツリーを探すことで行われる。上部から始まり、ネスト状の呼び出しツリーの1つの経路に、その経路に既に存在しているプロシージャに対する呼び出しがある場合には、再帰的な呼び出しがある、ということになる。再帰的な呼び出しは、その呼び出しから定義されるループ及びバックエッジのことを指す。したがって、別個の話として、呼び出しエッジは、バックエッジとして示される場合がある。一部の実施形態では、アルゴリズムは、ルートから始まり、基本ブロック間のすべての経路を通る。基本ブロックの内部は重要ではない。加えて、既に定義されているバックエッジは通らない。ルートPの任意の線形経路上で、Pに既に存在しているSにバックブロックが遭遇した場合、Sで終了するこのエッジが、バックエッジとして定義される。<分岐の再収束する点を定義する>一部の実施形態では、単調にとらえられるために予測できないような分岐が存在する。この分岐が、実行中に誤った方向に向かうと、分岐の予測ミスになる。それだけではなく、フローが終了してしまう。これら分岐は、フローのコード処理において、全ての目的において完全に単調であるとみなされるつまり、条件分岐ではない。間接分岐は、既知の対象リストを有する。本質的には、複数対象の条件分岐である。DTSEソフトウェアは、これを、比較及び分岐の連続ストリングとして、またはバウンステーブルで符号化することができる。どの符号化を行う際にも、フローを終了させるという別の対象が残されている。これは、本質的には最終的に単調な分岐である。間違った方向に行くと、フローを終了させる。既知の対象に対する複数の分岐は、直接条件分岐と同じであり、同じ方法で発見される再収束点を有している。そしてもちろん、予測されない単調な最後のリゾート分岐を、まったく分岐として捉えずに処理する。呼び出しとリターンとは前述したように特殊であり、分岐ではない。リターンは、再収束点である。ほかの方法で定義された再収束点を有さないプロシージャPの任意の分岐が、その再収束点としてリターンを有している。Pは、多くの場所で符号化されたリターンを有していてよい。再収束点であるために、リターンのすべての符号インスタンスを同じように取り扱う。プロシージャの任意の静的インスタンスについて、全ての符号化されているリターンが、プロシージャのこの同じ静的インスタンスに固有のまったく同じ場所に赴く。これら再収束点全てを考慮に入れて、分岐を発見することができる必要がある。一部の実施形態では、基本ブロックへのエントリポイントのみを再収束点とすることができる。分岐Bについては、BからRのすべての制御フロー経路において、バックエッジを通る総数を最小にするような再収束点Rを発見する必要がある。全てが、Bから再収束点への全ての経路において同じ数のバックエッジを有する分岐Bの再収束点の組み合わせがある場合、Bから再収束点への経路の全部の組み合わせにおける最少の数の命令をもつ再収束点が通常は望ましい。一部の実施形態では、バックエッジ限界と分岐限界という2つのパラメータを分析中に維持する。両方の初期値は0に設定されている。一部の実施形態では、プロセスは、再収束点をまだ定義されていない全ての分岐を通り、以下の動作の1以上を実施する。これら各分岐Bにおいて、分岐Bから始まり、全ての制御フロー経路に順方向に進む。いずれかの経路がフローを終了させる場合、その経路に対する処理をやめる。もしも通る各バックエッジの数がバックエッジの限界を超える場合には、この経路を通るのをやめて、限界を超すバックエッジを通らないようにする。各経路について、その経路で基本ブロックセットを収集する。これらセット全ての交差点を発見する。この交差点のセットが空になると、この検索は不成功に終わる。交差点のセットから、BからRのすべての経路におけるすべての命令が最少になるセットのメンバーRを選ぶ。ここで、全ての経路BからRまでの全てから目に見えるバックエッジの数を求める。この数がバックエッジの限界を超える場合には、Rを拒絶する。次に、命令総数より多い数の、次に可能性のある再収束点を、目に見えるバックエッジの総数に対してテストする。最後に、バックエッジの限界を満たす再収束点を見つける、または、これ以外の可能性がないか、になる。見つけられた場合には、BからRのすべての経路で再収束点がない分岐の総数を求める。これが分岐の限界を超えている場合にはRを拒絶する。最終的には、バックエッジの限界と分岐の限界とを両方とも満たすRを見つけるか、ほかの可能性がないか、になる。良好なRとは、Bの再収束点である。一部の実施形態では、分岐Bの再収束点が見つかると、再収束点を見つけるための残りのアルゴリズムについて、Bを通る順方向の制御フローはすべて、分岐及びその再収束点の間の詳細を見ることなく、直接この再収束点にジャンプする。再収束点を通る後方制御フローも、分岐及びその再収束点の間の詳細を見ることなく、直接、マッチしている分岐にジャンプする。大切なことは、制御フローが分岐からその再収束点へと、一点に収縮されることである。一部の実施形態では、再収束点が見つかると、バックエッジの限界及び分岐の限界の両方をリセットして、まだ再収束点が見つかっていないすべての分岐を考慮する。再収束点が無事見つかった場合には、いくつかを見えなくする。こうすると、前は不成功に終わっていた分岐の再収束点を、バックエッジの限界及び分岐の限界の値が低くても、見つけることができる場合がある。一部の実施形態では、再収束点が見つけられなかった場合、次の分岐Bを試す。再収束点をまだ見つけていないすべての分岐を試しても不成功に終わった場合には、分岐の限界を増分して、分岐を再度試す。一部の実施形態では、潜在的な再収束点が分岐の限界のために拒絶された場合には、分岐の限界を0にリセットして、バックエッジの限界を増分してから、再度試す。一般的には、分岐の限界が0以外に設定されているという理由で、分岐Bから再収束点Rまでの制御フロー経路上で再収束点が見つからない他の分岐Cがある可能性がある。これら分岐Cそれぞれには、Bが持つものと同じ再収束点が割り当てられているつまりR。分岐セットB及びこれらの分岐Cは、1つの分岐群であると、定義される。これは、全てが同じ再収束点を持つ分岐群である。一部の実施形態では、これは、分岐から再収束点までの全てが見えなくなる前に処理される。群として処理されない場合には、分岐に再収束点が割り当てられるとすぐに、その群の他の分岐の再収束点を発見する必要のあるすべtネオ経路を見えなくするまだ再収束点がない他の分岐を見えなくするのは言うまでもなく。一部の実施形態では、全ての分岐に再収束点を定義する。線形経路のバックエッジ数とは、異なるバックエッジの数のことを意味している。1つの線形経路において複数回同じバックエッジが生じる場合には、1つのバックエッジのみとしてカウントする。基本ブロックEが分岐Bに定義された再収束点であるからといって、分岐Dについて定義された再収束点として利用できないわけではない。<一括アンロールenmassunrolling>一部の実施形態では、一括アンロールを実施する。一括アンロールでは、コードの限られた量の静的複製を作成して、特定の並列形態を晒すことを可能とする。これらの実施形態では、分岐ネストレベルそれぞれについて全フローをN回複製する。Nの良好な値は、最終コードに望ましいトラックの数であってよいが、他の数にしてもいくらかの利点は生じるだろう。このように複製することで、複数おそらくは全てのトラックで同じコードを持つ機会が与えられ、1つのループの異なる繰り返しで作業することができるようになる。ループの異なる繰り返しを異なるトラックに行うことはない。ループのなかには、繰り返しにより分離されたり、細かい粒度に分離されたり、ループ内の命令ごとに分離されたりするものも出てくるだろう。もっとよく見られることが想定されるのは、1つのループが命令ごとに両方の方法で分離される、ということである。好ましいことが起こるようになる。繰り返しによる分離が単に許可される。この時点では、ループ本体の静的コピーが1つだけ存在している。1つの静的コピーのみが存在する場合には、動的複製を行わずして複数のトラックにはありえず、これは非生産的である。このコードを複数のトラックに存在させ、異なる制御フロー経路異なる繰り返しで利用させるためには、複数の静的なコピーが必要である。<ネスティング>グループの分岐からグループが定義する再収束点までの経路に、少なくとも1つの目に見えるバックエッジを有する分岐群を、ループと定義する。特定の分岐群が目に見える及び目に見えないについての区別は、再収束点分析で定義された通りである。加えて、目に見える分岐からその再収束点までの経路にはないバックエッジも、ループとして定義される。バックエッジのみとして定義されるループは、バックエッジの開始部分から、バックエッジを通り、バックエッジの開始部分に戻る経路を有している経路を、分岐から再収束点への経路として定義されている経路を持つものとして定義される。異なるループA及びBを与えられると、Bの群のすべての分岐が、Aの分岐からAについて定義された再収束点までの経路にある場合、BはA内にネスト状に入れ子になっているネストされている。分岐からその収束点までの経路にないバックエッジとして定義されるループは、その他のループ内にネストされているとは定義されず、他のループがその内部にネストされている可能性があり、通常はその通りである。バックエッジとしてのみ定義されているループは、このバックエッジに関連付けられている。他のループは、ループの分岐からループの再収束点までの経路の目に見えるバックエッジに関連付けられる。特定の分岐群が目に見える及び目に見えないについての区別は、再収束点分析で定義された通りである。以下の定理及び補題の1以上をネストの実施形態に適用することができる。定理1:BがA内にネストされている場合には、AはB内にネストされてはいない。BがAにネストされているとする。すると、Bには分岐があり、Bのすべての分岐が、Aからその再収束点までの経路にあることになる。Aが分岐を含まない場合には、定義として、AはBにネストされていない。Aの分岐Xが、Bの分岐からその再収束点までの経路にある場合には、XがBの一部であるか、Bには見えない、ということになる。XがBの一部である場合には、Aの全てがBの一部であり、ループA及びBに差がないことになる。したがってXがBには見えないことになる。これはAの再収束点は、Bの定義の前に定義されていて、Aの分岐がBには見えないようになっている必要があることを意味している。したがってBがAには見えない。Bのすべての分岐はAからその再収束点までの経路にあり、目に見える。これによりBはAの一部であり、AとBとの間に差がないことになる。したがってXを想定することはできない。補題1:分岐B2が分岐B1からその再収束点までの経路にある場合には、B2からその再収束点までの全経路も、またB1からその再収束点までの経路にあることになる。B1からその再収束点R1までの経路はB2につながる。したがって、B2からのすべての経路に続く。B1が再収束する場合には、B2も再収束する。まだB2について特定されている再収束点に到達していない場合には、R1がより良い点である。再収束点のアルゴリズムは、最良の点を見つけるので、R1を見つけている必要がある。定理2:ループBの1つの分岐が、ループAの分岐からその再収束点までの経路にある場合には、BがA内にネストされている。Xが、AからAの再収束点RAまでの経路にあるBの分岐であるとする。補題1では、Xからその再収束点RBまでの経路が、AからRAまでの経路にある。ループBは、XからRBまでの経路の上のすべての分岐の集合体である。これらは全て、AからRAまでの経路の上にある。定理3:BがA内にネストされており、CがB内にネストされているとすると、CはA内にネストされていることになる。Xを、再収束点RCをもつCの分岐であるとする。するとXはB内の分岐YからBの再収束点RBまでの経路にあることになる。補題1では、XからRCまでの経路が、YからRBまでの経路の上nある。Bの分岐Yは、Aの分岐ZからAの再収束点RAまでの経路にある。補題1から、YからRBまでの経路はZからRAまでの経路上にある。したがってXからRCまでの経路は、ZからRAまでの経路の上にある。したがってXは確実にZからRAの経路にある。これはC内の全てのXについてあてはまるしたがってCはA内にネストされている。定理4:1つのバックエッジは、1つのループ1つのみに関連付けられている。目に見える分岐からその再収束点までの経路にはないバックエッジ自身はループである。目に見える分岐からその再収束点までの経路にバックエッジがある場合には、この分岐が属している分岐群は、少なくとも1つのバックエッジを有することになるので、ループである。たとえばループLに関連づけられたバックエッジEがあるとする。Mを別個のループであるとする。LまたはMが分岐のないループである場合つまり、これらが単に1つのバックエッジである場合には、定理は正しい。L及びM両方が分岐を有していると想定する。続いて再収束点が定義される。Mの再収束点がまず定義された場合には、EはMからその再収束点までの経路にあるので、Eが隠されていることになる。後でLに見えるようにはならない。Lの再収束点がまず定義された場合には、EはMには隠されて、後で見えるようにはならない。非定理5:あるフローで2度以上実行されるすべてのコードはあるループ内にある、というのは真ではない。いずれかのループ内になく、複数回実行される、フローのなかのコードの一例が、ある分岐で終了する2つの基本ブロックである。1つの分岐のアームが、第1の基本ブロックを対象としており、分岐の他のアームが、第2の基本ブロックを対象としているとする。分岐の再収束点は、第2の分岐ブロックのエントリポイントである。第1の基本ブロックのコードは、ループ内にあるが、第2の基本ブロックのコードはループ内にはない、つまり、ループの分岐からその再収束点までの任意の経路にはないことになる。逆バックエッジとは、ループ分岐群に関連付けられているバックエッジであり、このバックエッジから順方向に進むと、ループ分岐群の再収束点が、このループ分岐群のいずれの分岐よりも前にヒットするそしておそらくは、このループ分岐群のいずれの分岐にもヒットしない。バックエッジは、ループ分岐群に見える場合にそのループ分岐群に関連に関連付けられていると称され、ループ分岐群の分岐からループ分岐群の再収束点までの経路にあることになる。ループを抜けるループ分岐を持つ典型的なclassical分岐では、バックエッジからの経路がまずループ分岐にヒットしてから、その再収束点にヒットする。バックエッジが逆バックエッジである場合には、このバックエッジからの経路が、まず再収束点にヒットして、そしてループ分岐にヒットする。定理6:いずれのループ内にもないフローで2度以上実行される命令が存在する場合には、このフローが逆バックエッジを含んでいる。Iを、あるフロー内で2度以上実行された命令であるとする。Iがどのループ内にもないと想定する。このフロー内に逆バックエッジがないと想定する。IからIに戻る経路には、経路Pがあるはずである。この経路には、少なくとも1つのバックエッジEがあるべきである。Eに関連付けられているループの一部である分岐Bが存在していると想定する。これはつまり、Bが分岐群の一部であることを示している。Eは分岐群から見え、Eは、分岐群の分岐からその再収束点までの経路上にある。Eからの順方向の経路は、別の分岐がない限り、Pにある。別の分岐Cがある場合には、Cは、BからBの再収束点までの経路にあるので、Cは同じ分岐群である。CはP内にある。Pにはこのループのループ分岐がある。Cがない場合には、Pが後に続き、Iに行く。Bの再収束点前にIに到達した場合には、予想に反してIがループ内にあることになる。したがってIに到達する前にBの再収束点に到達することになる。これはいずれかの分岐に到達する前である。したがってバックエッジからの経路では、別のループ分岐に到達する前に再収束点にヒットすることになる。他方で、ループ分岐CがP内にあると想定する。再収束点がPにない場合には、Pの全てがループ内にあることになる特にI。したがって再収束点もPにある。したがって、C、E、および再収束点Rが全ての経路Pの上にある。順序は、まずE、そしてC、次いでR、になる他の順序はいずれも逆バックエッジになるからである。P上に2以上の分岐がある場合たとえば分岐Xには、P上のいずれの箇所に行くこともできる。しかし少なくとも1つのループ分岐は、E及びRの間にある必要がある。Cはそのループ分岐である。Cは別のアームを有している。RへのCの他のアームからの経路があるべきである。もしもCからのすべての経路がEの前にRに行く場合には、EはCからRのいずれの経路にもないことになる。したがって、CからRまでの全構造は、Bには見えず、Cが、このループのループ分岐でありえない。したがってCからのある経路がRの前にEに行く必要がある。これは不可能である。この経路は、エッジEの前のいずれかの場所でPに合流する必要がある。それがどこであったとしても、この合流点が再収束点Rとなる。結論としては、Pの上の唯一可能性のある順番である、EからC次いでRが、現実的に不可能ということである。一部の実施形態では、上述した定理の1以上において、ループは固有のネストレベルを割り当てられてよい。内部に別のループがネストされていないループは、ネストレベル0である。別のループがネストされているループはネストレベル1とされる。最高のネストレベルを有するループが存在する。このループが、フローのネストレベルを定義する。ループのネストはプロシージャのみに存在することに留意されたい。各プロシージャは、0からやり直される。これは、プロシージャがインライン処理されることに整合している。フローのネストレベルは、フローのすべてのプロシージャにおける最大ネストレベルである。各バックエッジが唯一のループ1つに属しているので、バックエッジのネストレベルは、それが属するループのネストレベルとして定義される。一部の実施形態では、DTSEソフトウェアがフロー全体を一単位としてNU回複製し、ここでUはフローのループネストレベルとする。Nは、各ループのネストレベルをアンロールする方法の数とする。一部の実施形態では、完全に同じコードのNU回のコピーなので、ソフトウェアがこのコードを実際に複製する理由はない。ビットも完全に同じであるはずである。コードは概念的にNU回複製される。フローの静的コピーは、U桁の数で命名することができる。一実施形態では桁の基数baseがNである。最低オーダの桁数が、ネストレベル0に関連付けられる。次の桁数はネストレベル1に関連付けられる。各桁は、ネストレベルに対応している。一部の実施形態では、アンロールコピー名称における各桁Dについて、DTSEソフトウェアが、Dについて値0のすべてのコピーにおいてDに関連するネストレベルを持つすべてのバックエッジを作成して、Dについて値1を有するが、ほかのすべての桁が同じであるコピーの同じIPに赴く。そして、Dについて値1のすべてのコピーにおいてDに関連するネストレベルを持つすべてのバックエッジを作成して、Dについて値2を有するが、ほかのすべての桁が同じであるコピーの同じIPに赴く。こうした処理を経て最終的に、ソフトウェアは、Dについて値N-1のすべてのコピーにおいてDに関連するネストレベルを持つすべてのバックエッジを作成して、Dについて値0を有するが、ほかのすべての桁が同じであるコピーの同じIPに赴く。この実施形態は、現在のアンロールの静的なコピー番号及びフロー内を移動するときどう変換するかのアルゴリズムである。このアルゴリズムは、レベルLのバックエッジが順方向に移動する場合、L桁目のモジュロ演算Nを増分する。レベルLのバックエッジが後方方向に移動する場合には、L桁目のモジュロ演算Nを低減させる。これが前の複雑な段落が言わんとしていることである。一部の実施形態ではDTSEソフトウェアは、ポインタまたはこれを表すなにかを有していない。単にこの単純な現在の静的なコピー番号とカウントアルゴリズムを有している。したがって一部の実施形態では、DTSEソフトウェアは、係数Nですべてのループをアンロールしている。これは、ループのいずれかを実際に理解したり、これらを個々に見たりすることなく、一括して一時に行われる。実際に知っていることは、各バックエッジのネストレベルであり、これらの最大値である、フローのネストレベルである。これら実施形態では、対象となるIPが変化しなかったので、コードのビットに変化はない。変化したのは、同じIPにおける命令の各静的インスタンスが異なる依存度を有することができるこようになったことである。各静的インスタンスは、別の命令に依存して、別の命令がこれに依存している。そのIPで定義される各命令においては、静的インスタンスそれぞれについて依存度を別個に記録できる機能が望まれる。いずれかの制御経路を行く場合、アンロールコピーカウンタが、いつでもその時点で見られている命令のアンロールコピーを示すように状態を適切に変化させる。<分岐の再収束点>一部の実施形態では、制御フローのグラフにおいて、ループLのメンバーである分岐Bがヒットして、その後に、Bが属している分岐群の識別子がスタックにプッシュされる。もしも制御フローグラフにおいて、分岐群が既にスタックの上位にある分岐にヒットした場合には、何も起こらない。再収束点が、制御フローのグラフにおいてスタックXの上位にある分岐についてヒットした場合にはアンロール前に定義されている、このアンロールネストレベルのバージョン0に行き、スタックをポップする。これは、Xのバージョン0がアンロールループの実際の再収束点であるということである。一部の実施形態では例外がある。通過されたLの最後のバックエッジが逆バックエッジであり、Lの再収束点Xにヒットした場合にはアンロール前に定義されている、Lがスタックの上位にあり、スタックがポップされるが、バージョン0に行く代わりに、同じアンロールバージョンが維持される。この場合にはXのこのアンロールネストレベルのバージョン0が、Lの再収束点として定義される。ループLを抜けるときは常にLのネストレベルのバージョン0に行くLが逆バックエッジを有する場合を除き。上述は、制御フローグラフを前方向にたどる方法の実施形態を示している。一部の実施形態で明らかになるように、制御フローグラフを前方にたどるより後方にたどるほうが多くのものが必要となる。一部の実施形態では、これはネストプロシージャと同様である。後方にたどるにあたっては、Lの再収束点にまずヒットする。難しいのは、これが、複数のループの、さらにはループではない分岐群の再収束点である場合があることである。つまり、問題は、どの構造を後方に辿っているのか、である。この点に至る多くの経路が存在しているはずであるループに戻る場合には、現在の点より下のネストレベル1であるべきである。このネストレベルには多くのループ、及び、非ループ分岐群がある。どの経路をとるかを選ぶことができるだろう。もしも、後方に向かっているループLが選ばれたとすると、N個のアンロールコピーに向かうためにN個の経路がある。一部の実施形態では、これらのうち1つを選択する。この段階では、後方に向かうコードの静的コピーがわかっている。探すことができるのは、対応する分岐群の分岐である。情報はスタックにプッシュされる。一部の実施形態では、現在のネストレベルのアンロールコピー0にない場合には、このループのバックエッジに戻る。したがってバックエッジをとることができる最後の機会に到達したところで経路がわかる。これ以前には、多くの可能性がある。現在のネストレベルのアンロールコピー0にある場合には、バックエッジをとらないとうさらなる選択肢、及び、ループから退くという選択肢が一部の実施形態では選択可能である。ループから退くことができない場合には、スタックをポップする。一部の実施形態では、このループのバックエッジがとられるたびに、このネストレベルモジュロ演算Nのコピー数を低減させる。ループは通常そのネストレベルの静的コピー0に入り、常に、そのネストレベルの静的コピー0へと退出する。これらは、このコードを分析しているソフトウェアの内部の動作であり、このコードの実行ではない。多くの実施形態で、実行はスタックを有さない。コードは、全てが正しい場所に行くために生成される。ソフトウェアが、全て正しい場所に行くコードを生成するためには、自身でフローをどのように行うかを知っている必要がある。図8から図11は、これら動作の一部の例を示す。図8は、2つのバックエッジを有する3つの基本ブロックの例を示す。2つのレベルのネストされた単純なループが形成される。Cへの入り口は、Cの分岐の再収束点である。Cからの退出の対象は、Cの分岐の再収束点である。図9は、フロー全体が複製された様子を示す。その一部を示している。いま、われわれのネストループコピー00、コピー01、コピー10、及びコピー11の4つのコピーが存在している。Cxへの入り口は、Cxの分岐の再収束点である。Cxからの退出の対象は、Cxの分岐の再収束点である。これらは各xについて異なる。図10は、上述した動作の1以上を利用して修正されたバックエッジ及び再収束点のエッジを示す。C00への入り口は、今ではループB00-B01の分岐の再収束点である。C10へのエントリポイントは、今ではループB10-B11への再収束点である。外部ループ、静的コピー00及び10は両方とも、共通の再収束点に向かう。C01及びC11の対象でもある共通の再収束点が存在している。C01及びC11が死んでいるコードであるためにこれはあまり興味がない。このコードに到達する方法はない。実際のところ、このコードからの退出は、常にC00またはC10から来る静的コピー00にある。図11では、死んでいるコード及び死んでいる経路を取り除いて、より明確にどのように動作するかを示す。静的コピー00内にあるこのコードの生きている入口は1つしかなく、静的コピー00内にあるこのコードの生きている出口も1つしかない点に留意されたい。一部の実施形態では、DTSEソフトウェアが、いずれかのコードを特に取り除かない。コードのコピーが1つだけある。取り除くものはない。ソフトウェアは、基本ブロックA及びCが、2つの名称00及び10の依存情報を必要としており、4つの名称の依存情報は必要としてないことを理解している。基本ブロックBは、4つの名称の依存情報を必要としている。Nの数が大きくなると、準備する仕事量を増加させるが、動的な重複の数が減った並列も増加させる可能性がある。一部の実施形態では、DTSEソフトウェアはNを増やしてより良い仕事を行わせたり、Nを低減させて、あまり仕事量のないコードを生成させたりすることができる。一般的には、最終的なトラックの数にマッチするNによって、合理的な仕事量を有する並列性のほとんどが提供される。一般的には、これよりNが大きくなると、これよりずっと多い量の仕事で、多少結果がよくなる、ということになる。ループのアンロールにより、命令Iが、一部の繰り返しについて1つのトラックで実行されるが、一方で同じ命令Iの異なる静的バージョンは、異なる繰り返しについて、異なるトラックで同時に実行される。トラック分離は命令ごとに行われることから、命令がここでは強調される。命令Iは、このようにして処理されてよいが、一方で命令JこのループでIのすぐ隣にあるは、完全に異なる方法で処理されてよい。命令Jは、トラック0のすべての繰り返しについて実行されてよく、このループのI及びJのすぐ隣の命令Kは、トラック1のすべての繰り返しについて実行されてよい。ループのアンロールは、同じループの異なる繰り返しからの命令を、異なるトラックで実行させ、非常に有用なツールである。多くのコードにおいてこれは重要な並列性を明らかにする。他方で、ループのアンロールは、多くのコードで並列をまったく明らかにしない。これは、DTSEが利用することができるツールの1つにすぎない。さらに、DTSEソフトウェア内の分析について、通常は、ビットが同一であるのでアンロールのための任意のコードを複製する理由がない。アンロールにより、コードの複数の名称が生成される。各名称は性質のテーブルを各自持っている。各名称は異なる振る舞いをすることができる。これにより並列性が明らかにされてよい。後で生成される実行可能コードであっても、分析中に、このコードに多くの名称がある場合であっても、多くのコピーを有さないことがある。<線形静的複製>一部の実施形態では、フロー全体が既に複数回、一括アンロールについて複製された。とりわけ、一部の実施形態では、フロー全体を適宜、これより多くの回数、複製する。コピーはS0、S1、S2などと称される。フロー内の各分岐Bは、各静的コピーS0、S1、S2内で複製される。Bの各コピーは、一般的分岐Bのインスタンスである。同様に、Bは、今はS0、S1、S2として複製されている再収束点である。これらコピー全てが、一般的な分岐Bの一般的な再収束点のインスタンスである。複製されたバックエッジは全てバックエッジとしてマークされる。一部の実施形態では、コードを複製しない。これら実施形態では、コードの全てがまた別のレベルの複数の名称を取得する。すべての名称は、情報を格納する場所を取得する。一部の実施形態では、フローのすべてのSコピーのすべてのエッジのそれぞれの対象は、正確な一般的な基本ブロックに変更されるが、特定のSコピーに割り当てられはしない。すべてのバックエッジの対象は、具体的に、S0コピーに変更される。一部の実施形態では、フローS0、S1、S2のコピーが、1つ1つ番号順に行われる。Skでは、バックエッジではないフローコピーSkに端を発する全てのエッジEが、その対象の特定のコピーを、最低のSの番号のコピーとして割り当てて、他のエッジと対象を共有しないようにする。最終的には、その他のエッジと対象基本ブロックを共有するバックエッジではないエッジがなくなる。もちろんバックエッジは、他の、おそらくは多くの他のバックエッジと、対象の基本ブロックを共有することが多い。一括アンロールの場合同様に、一部の実施形態では、ループを退出するエッジの対象のSインスタンスが、以下のようにループ収束点に行くことにより修正される。一部の実施形態では、制御フローグラフにおいて、分岐BがループLのメンバーにヒットすると、Bが属する分岐群の識別子がプッシュされて、現在のインスタンスSの番号がスタックに上がる。一部の実施形態では、制御フローグラフにおいて、分岐群が既にスタックの上位にある分岐がヒットしても何も起こらない。一部の実施形態では、スタックの上位にあるそのループの一般的な再収束点のインスタンスが、制御フローグラフでヒットすると、Iがスタックをポップして、実際にスタックからポップしたインスタンスSの番号に行く。これは、つまりループで、ループの各繰り返しが、のインスタンスSの番号0から開始されるが、このループを抜けるときには、このループが入ったSのインスタンスに行くことを示している。一括アンロールとともに利用したものと同じスタックを利用することができる。同じスタックを利用するときには、Sインスタンスについて各スタックエレメントにフィールドを追加する。繰り返しになるが、これらは、このコードを分析しているソフトウェア内の動作であるが、コードを実行しているわけではない。実行はスタックを有さない。コードは、全てが正しい場所に行くために生成される。ソフトウェアが、全て正しい場所に行くコードを生成するためには、自身でフローをどのように行うかを知っている必要がある。コピーS0から到達不可能な第1のフローコピーSxが存在している。これ、及び、全てのより多い数のコピーは不要である。加えて、各生き残っている静的コピーS1、S2、は、通常、S0から到達不可能な、死んでいるコードを多く有している。ここから到達不可能なものは、発行された実行可能コードを生成しない。<依存性分析><複数の結果の命令>既に記載したように、一部の実施形態では、元の呼び出し命令が、プッシュで置き換えられており、元のリターンがポップ及び比較で置き換えられている場合がある。一般的には、複数の結果命令が分析において望ましくない。一部の実施形態では、これらが複数の命令に分割される。多くの、ただすべてではないケースでは、これら及び類似した命令が、コード生成で再構成されていてよい。プッシュ及びポップは明らかな例である。プッシュは、ストア及び低減スタックポインタである。ポップは、ロード及び増分スタックポインタである。スタックポインタ補正とメモリ動作とを分離させることが望ましい場合がよくある。分離可能な複数の結果を有する多くの他の命令も存在する。一部の実施形態では、これらの命令を分離する。これらを分離させる共通の理由は、全てのスレッドがスタックポインタ変更を必要とする可能性が高いということであるが、全てのスレッドにプッシュされるデータの計算を複製するために必要ではない場合もある。<不変の値><ハードウェアサポート及びメカニズム>一部の実施形態では、DTSEハードウェアは、ソフトウェアに利用可能な複数のアサートレジスタを有する。各アサートレジスタは少なくとも、実際の値とアサートされた値AssertedValueという2種類の値を保持することができ、各値を有する有効ビットが存在する。一部の実施形態では、アサートレジスタは、全てのコア及びハードウェアSMTスレッドに対するグローバルリソースである。一部の実施形態では、DTSEソフトウェアは、任意のアサートレジスタの実際の値の部分またはアサートされた値の部分いずれかをいずれの時点においても、いずれのコアのいずれのハードウェアSMTスレッドから書き込むことができる。一部の実施形態では、書き込みを一定のアサートレジスタのアサートされた値への書き込みをグローバルにコミットするためには、対象となるアサートレジスタの実際の値の部分が有効であり、両方の値がマッチする必要がある。実際の値が有効でなかったり、値同士がマッチしなかったりする場合には、ハードウェアはダーティなフローの退出を生じさせ、状態は、最後にグローバルにコミットされた状態に復元される。アサートレジスタは、1つのコア内の1つの論理プロセッサAで動作するコードの機能を提供して、この論理プロセッサまたはコアが実際に計算しなかった値を利用する。この値は、一部のコアでは、一部の論理プロセッサBで、論理的には速く、しかし必ずしも物理的に速くなくてもよい時期に計算して、アサートレジスタの実際の値の部分に書き込む必要がある。Aで実行されているコードは、任意の値を推定して、同じアサートレジスタのアサートされた値に書き込むことができる。アサートされた値の書き込みに続くコードは、アサートされた値に書き込まれた値がこのコードがどの場所にあろうとも、アサートされた値に書き込む論理位置の実際の値に書き込まれる値と完全にマッチすることを確かに知っている。DTSEソフトウェアが高い可能性を有しているが、その値のすべての計算を行っておらず値について確信がない場合には有用であり、この値を複数の用途に利用することができる。この値を、複数のコアの複数の論理プロセッサで利用して、正確にこれを1つのコアの1つの論理プロセッサで利用することができる。DTSEソフトウェアの値が正確な場合には、アサート処理にコストがかからない。DTSEソフトウェアの値が正確ではなかった場合には、正確さに関する問題があるのではなく、結果生じるフローの退出について大きなパフォーマンスコストが存在する場合がある。<スタックポインタ>スタックポインタとベースポインタとは、通常よく利用される。非常に有用なコードが、スタックポインタ及びベースポインタの値を利用せずに実行されるとは考えにくい。したがって通常は、全てのDTSEスレッドのコードが、これらレジスタの値のほとんどを利用する。さらに、例えばスタックポインタの実際の値は、スタックポインタの変更の長い依存の鎖に依存している。一部の実施形態では、DTSEソフトウェアは、この長い依存の鎖を、アサートレジスタの実際の値の部分に書き込みを挿入して、推定された値の書き込みをアサートレジスタのアサートされた値に挿入することにより、破壊することができる。そして、実際の値にも、その前のいずれの値にも直接依存していない値が生じる。元のコードのプロシージャ呼び出し及びリターンについては、DTSEソフトウェアは通常、リターンの直後のスタックポインタ及びベースポインタの値を、呼び出し直前のものと同じと推定する。一部の実施形態では、呼び出し元の命令の直前には、ダミー命令を挿入してよい。これは、コードを生成しないが、命令のようなテーブルを有している命令である。ダミーは、スタックポンタ及びベースポインタのコンシューマとしてマークされる。プロシージャから戻った後で、命令が挿入され、スタックポインタ及びベースポインタを、2つのアサートレジスタの実際の値の部分にコピーする。これら挿入された命令は、これらの値のコンシューマとしてマークされる。この直後に、一部の実施形態では、命令が挿入され、スタックポインタ及びベースポインタを、これらのアサートレジスタのアサートされた値の部分にコピーする。これら挿入された命令は、これらの値を消費しないが、これらの値を生成するものとしてマークされる。これらの命令は、直接ダミーに依存するものとしてマークされる。同様に、不均衡なスタック変更を明らかに行っていない多くのループについて、スタックポインタ及びベースポインタの値を、各繰り返しの開始時と同じであると想定する。一部の実施形態では、コンシューマであるダミーは、ループの最初の入り口に挿入される。実際の値へのコピーは、コンシューマとして挿入され、特定され、次に、アサートされた値のコピーが、プロデューサとして特定される。アサートされた値のコピーは、直接ダミーに依存させられる。これには、多くの他の用途も可能である。アサートを利用するためには、値が不変であることは必須ではない。多くのステップの評価を、おそらく正しい、ずっと短い評価で置き換えることができることのみが必須実行である。アサートは、ハードウェアが報告する失敗を比較する。一部の実施形態で、アサートが失敗したと観察された場合、DTSEソフトウェアは、違反しているoffendingアサートレジスタの利用をやめて、コードを、失敗したアサートを使用せずに再処理する。こうしたとしても誤ったコードが生成される可能性は高い。スレッドは、プロシージャのスタックポインタのすべてではないが一部の変化をまとめるwindupことができる。したがって、プロシージャの最後におけるスタックポインタの誤った値を推定することができるようになる。これは正確に関する問題ではない。アサートはこれを捉えるが、アサートは、常に、またはしばしば失敗する。スレッドがプロシージャのすべてのスタックポインタの変更を有さない場合には、それらがないことを望む。これは、直接強制されてはいなかった。実際の値に書き込みを有するスレッドは、スタックポインタに対する変更全てを有している。これは共通の問題ではない。一部の実施形態では、実行中にアサートの失敗が報告された場合には、そのアサートを除去する。一部の実施形態では、DTSEソフトウェアは、スレッドの不変であると想定される全てではないが一部の変更を特にチェックすることができる。このような問題のある状況が検知された場合には、アサートを取り除く。この代わりに、ダミーの位置で値をセーブして、アサートされた値の書き込み位置にリロードすることができる。<制御依存性>一部の実施形態では、各プロファイルを利用して、完全に複製されたコードの線形の経路をたどる。プロファイルは、各分岐またはジャンプの一般的な対象を定義して、完全に複製されたコードの利用可能な経路が、対象である特定のインスタンスを定義する。したがって、このトレースは、命令の特定のインスタンスを複数通ることになる。プロファイルは、線形のリストであるが、完全に複製された静的コードをくねくねと通るwindsitswaythrough。一般的には、これは、同じ命令インスタンスに何度もヒットする。各分岐の各静的インスタンスに別個に、外向きのエッジそれぞれが何度とられたかを記録する。分岐のインスタンスのエッジが、プロファイルでとられていることが確認されていない場合には、このエッジがフローを退出する。これは、いくつかのコードを到達不可能にする可能性がある。分岐の単調なインスタンスが実行のみの分岐としてマークされる。これらの多くは、前に特定されている。一般的な分岐は単調になりうる。この場合には、この一般的な分岐のすべてのインスタンスが、実行のみのインスタンスである。今では、一般的な分岐が単調ではなかったとしても、この分岐の一定の静的インスタンスが単調である可能性がある。これらのインスタンスも実行のみの分岐である。他の命令インスタンスは、実行のみの分岐に依存しない。特定の分岐インスタンスは実行のみであったりなかったりする。一部の実施形態では、一般的な分岐Bの各実行のみではないインスタンスについて、全ての経路で順方向に進み、Bの一般的な再収束点のいずれかのインスタンスで止まるようにする。この経路のすべての命令インスタンスが、Bのこのインスタンスで直生存性を持つとしてマークされる。一部の実施形態では、これはすべての一般的な分岐Bに対して行われる。外向きエッジとしてフローを退出しようとしているが、2以上の他のエッジを有している分岐がある可能性がある。これは、間接分岐に典型的である。プロファイリングにより、間接分岐の可能性のある対象はいくつか特定されているが、通常は、特定されていない対象もあると想定される。間接分岐が、プロファイリングで特定されていない対象に赴く場合には、これがフローを退出しようとしているものである。これらの場合には、DTSEソフトウェアが、これを、既知の対象、及び、フローを退出しようとしているまたはいない2つの方向の分岐に分解する。フローを退出しようとしているまたはいない分岐は、通常は単調な実行のみの分岐である。<直接依存性>一部の実施形態では、各命令インスタンスの直接制御依存性が、既に記録されている。各命令インスタンスについて、レジスタの入力を特定する。これには、命令を実行する必要のあるすべてのレジスタの値が含まれる。これには、ステータスレジスタ、条件コード、及び暗示的なレジスタ値が含まれてよい。一部の実施形態では、要求されているレジスタの値のすべての可能性のあるソースを見つけるために、全ての可能性のある経路上の各命令インスタンスからのトレースバックを行う。ソースは、特定の命令インスタンスであって、一般的な命令ではない。特定の命令インスタンスは特定の命令インスタンスから値を取得する。1つの要求されている値から命令インスタンスには複数のソースがある可能性がある。プロファイルは、分岐対象、ロードアドレス及びサイズ、ストアアドレス及びサイズの線形シーケンスである。DTSEソフトウェアは、依存性分析をするために少なくとも1つプロファイルを有するべきである。いくつかのプロファイルが利用可能であってよい。一部の実施形態では、各プロファイルを利用して、完全に複製されたコードを通る線形経路をたどる。プロファイルは、各分岐またはジャンプの一般的な対象を定義して、完全に複製されたコードの利用可能な経路が、対象である特定のインスタンスを定義する。したがって、このトレースは、命令の特定のインスタンスを複数通ることになる。プロファイルは、線形のリストであるが、完全に複製された静的コードをくねくねと通るwindsitswaythrough。一般的には、同じインスタンスに何度もヒットする。ロードは、メモリから数バイトをロードする場合が多い。原則としては、各バイトが別個の依存性課題である。実際には、もちろんこれは、最適化することができる。一部の実施形態では、各ロードの各バイトについて、このバイトに対する最後の前のストアを見つけるために、プロファイルのロードから逆順序に振り替えることができる。ロード命令の同じインスタンスおよびストアのインスタンスそのものが存在する。一部の実施形態では、このストアのインスタンスは、このロードのインスタンスに直接依存するものとして記録される。ロードのインスタンスは、同じバイトについても、多くのストアのインスタンスに依存することができる。<スーパ鎖>自身に他の命令インスタンスが直接依存していない各命令インスタンスは、スーパ鎖生成器である。スーパ鎖は、1つのスーパ鎖生成器を含む静的命令インスタンスのセットの、依存性を有する推移的封鎖transitiveclosureである。つまり、スーパ鎖を、スーパ鎖生成器を含むセットとして開始する。一部の実施形態では、スーパ鎖が依存している任意の命令インスタンスが、セットに追加される任意の命令インスタンスである。一部の実施形態では、これは、スーパ鎖が、スーパ鎖内のいずれかの命令インスタンスが依存しているすべての命令インスタンスを含むまで、繰り返し継続される。すべてのスーパ鎖が特定されたスーパ鎖生成器から形成された後で、どのスーパ鎖にもない命令インスタンスが残存する場合がある。一部の実施形態では、どのスーパ鎖にもない命令インスタンスをいずれか選んで、スーパ鎖生成器に設定して、そのスーパ鎖を形成する。どのスーパ鎖にもない命令インスタンスが残っている場合には、これらのいずれかの命令インスタンスをスーパ鎖生成器として選択する。これは、全ての命令インスタンスが少なくとも1つのスーパ鎖に含められるまで続けられる。多くの命令インスタンスが、複数の数多くてもよいスーパ鎖に存在する場合がある点に留意されたい。一部の実施形態では、スーパ鎖セットが、依存性分析の最終生産物となる。<トラック形成><基本トラック分離>一部の実施形態では、N個のトラックが望ましい場合、N個のトラックが同時に分離される。<最初のシード生成>一部の実施形態では、最長のスーパ鎖を発見するこれがバックボーンである。各トラックについて、一部の実施形態では、バックボーンにはなく、どの他のトラックにも見つからないほとんどの命令を有しているスーパ鎖を見つける。これは、このトラックの最初のシードである。一部の実施形態では、トラックセットの周りで1または2回繰り返す。各トラックでは、一部の実施形態で、他のトラックにないほとんどの命令を有しているスーパ鎖を発見する。これは、このトラックの次の繰り返しシードであり、前にあったシードを置き換える。これを向上させるためには、本当に際立った選択肢に思える場合には、バックボーンをシードにするのがよい考えであろうよい考えではない場合もあるだろう。通常は、これは、トラックのシーディングの冒頭にすぎず、その最後ではない。<トラックの成長>一部の実施形態では、動的に最短であると推定されるスーパ鎖Tを選択する。そしてスーパ鎖をこのトラック内に配置する。一部の実施形態では、スーパ鎖は、どのトラックにもまだ配置されていない、推定される数の動的命令により、最少から最大のものへと、順に検査される。一部の実施形態では、各スーパ鎖について、重複した部分の半分以下を、トラックTに置き他のトラックに置いてからトラックTに置くのではなく、トラックの成長の開始に戻る。さもなくばこのスーパ鎖は行わず、次のスーパ鎖を行う。トラックTに置かないうちに、スーパ鎖のリストの最後に到達した場合にはトラックTは新たなシードを必要とする。<新たなシード>一部の実施形態では、全ての成長したスーパ鎖を、T以外のすべてのトラックから取り除き、これらトラックのすべてのシードを残す。トラックTは一時的にその成長したスーパ鎖としてとどまる。一部の実施形態では、配置されていないスーパ鎖の現在のプールから、T以外のトラックには存在しない最大数動的のものの推定数の命令を見つける。このスーパ鎖は、トラックTに追加されたシードである。そしてすべての成長したスーパ鎖をトラックTから取り除く。成長したスーパ鎖は、既にすべての他のトラックからは取り除かれている。いまではすべてのトラックが、自身のシードのみを含んでいる。複数多い場合もあるのシードが各トラックに存在しうる。ここからトラックを成長させる。良好なシードを取得すると、質のよいトラックの分離につながる。最長のスーパ鎖が、全てのトラックに存在させる可能性が高まるバックボーン命令のセット全体を有するものである可能性が高い。命令の独自のセットを定義しない可能性が非常に高い。したがってこれはシードとして最初は選択しない。この代わりに一部の実施形態では、バックボーンと異なる命令をなるべく多く含むスーパ鎖を探す。これは、独自のものを探し出す可能性が高い。各連続したトラックは、なるべく独自で、かつ、既存のトラックからなるべく異ならせるために、これもバックボーンからなるべく異なるシードを取得する。一部の実施形態では、これを再度繰り返す。各トラックについて何かある場合には、可能な場合には、各トラックをより独自のものにする試みを行う。各トラックのシードの選択は、他のトラックからなるべく異なるものとなるように再考する。ここから、2つの先端prong方法が考えられる。成長するとは、非常に増分的なことを意図している。これは、既にトラックにあったものに対して少しずつ増加していくことを意味しており、このトラックに本当に属することが明らかである場合にのみ行われる。成長は、大きな飛躍を意味していない。一部の実施形態では、明らかな場合には増分的な成長を止めて、新たな動作の中心に跳躍することもできる。こうするためには、トラックのシード集合体を追加する。大きな飛躍は、シードを追加することで行われる。成長により、シードにより明らかに行われていることが充たされる。フローの中には非常に良好な連続性を有しているものもある。最初のシードから増分的に成長させると、非常に良好に機能する。フローの中には段階を有しているものもある。各段階がシードを有している。つぎに、トラックが良好に増分的に満たされる。一部の実施形態では、トラックTの新たなシードを見つけるために、他のトラック全てそれらのシードは除くを空にする必要がある場合がある。存在しているのは、新たなシードに対する不要なバイアスかもしれない。そうであってもトラックTに既にある全てを維持することが望ましい。それはこれが既にTと関連しているものだからである。ここで発見したいのはTに行くための異なる何かである。進めていくうちにいずれは手に入るものをシードとして得ても助けにはならない。シードとして追加したいのは、成長では得られないものである。成長に話を戻すと、一部の実施形態では、このプロセスはクリーンな状態から始める。成長は、異なるシードによって、かなり異なる工程をとる可能性があり、シードは最適化可能なものである必要がある。一部の実施形態では、成長は、シードとして必要なものを見つけるメカニズム同様に、ある程度の期間行われる。フローが異なる段階をとる場合には、異なる段階においてシードが必要となる場合がある。しかし段階は公知ではなく、いくつのシードが必要かもわからない。一実施形態ではこれも割り出す必要がある。お試しの成長は、どのシードが必要かを発見する方法にすぎないので、単に破棄される。必要なシードのセットが完全に整っている場合には、質の高い成長を行って、各トラックでの工程を補充すればよい。<原材料のトラックコード>一部の実施形態では、各トラックについて、フローの完全な複製が開始点となる。ここから、このトラックのコードからのすべての命令インスタンスこのトラックに割り当てられているどのスーパ鎖にも存在していないものを削除する。これがこのトラックの原材料のコードとなる。トラックの原材料コードが定義されると、スーパ鎖に用はなくなる。スーパ鎖は、どの命令インスタンスを各トラックのコードから削除できるかを割り出すためにだけ必要となる。この時点においては、すべてのトラックが、基本ブロックすべての完全な複製を含むことになる。実際には、一般的な基本ブロックしかなく、これが多くの名称を有している。各名称について、命令の異なるサブセットが存在する。各名称について、それぞれ他の一般的な基本ブロックの異なる名称に赴くための外向きのエッジが存在している。外向きのエッジのいくつかはバック得次である。一般的には、その名称の一部ときとして全てをもつ多くの基本ブロックが命令をまったく含まない場合がある。基本ブロックの各名称は、自身の外向きエッジを有している。空の基本部ブロックンスタンスであっても外向きエッジを有している。一定の基本ブロックの名称を有していたりいなかったりする分岐及びジャンプは、その基本ブロックのその名称の外向きのエッジを正確にサポートしていない。基本ブロックのインスタンス名称のなかには、ジャンプまたは分岐命令は含まないが、この基本ブロックのこのインスタンスについて外向きのエッジが存在するようなものもある。存在する分岐及びジャンプは、それでも元のコード対象IPを有している。これは直す必要がある。対象IPは修正して外向きのエッジをサポートするようにする必要があるが、これはまだ行われていない。基本ブロックの多くのインスタンスでは、制御転送命令ジャンプを最後に挿入して外向きエッジをサポートする必要がある。この時点では、すべてのトラックが、まったく同じ制御フロー構造、および、まったく同じ基本ブロックインスタンスを有している。これらは全て同じものであるが、各トラックについて異なる命令削除が行われている。しかしあるトラックの削除は、全ての命令を構造全体から除去せねばならない大規模なものになりうる。たとえばあるループのすべての命令が、トラックから完全に消失する、という事態も可能である。<スパンのマーカ>スパンマーカ命令は、特殊な命令であり、一部の実施形態では、他のトラックもこのスパンマーカをコードの同じ場所に有していることを示すDTSEレジスタのストアである。これに関しては後述する。実行可能コードを生成するまではこのことは分からない。一部の実施形態では、アンロールコピー数の桁のそのレベルのアンロールコピー0を対象とする逆バックエッジではないどのバックエッジに対しても、スパンマーカが挿入される。これは、スパンマーカのみを含む新たな基本ブロックである。バックエッジは、実際にこの新たな基本ブロックを対象とするように変更される。この新たな基本ブロックは、バックエッジの前の対象に赴く無条件の外向きのエッジを1つだけ有している。一部の実施形態では、これらのスパンマーカからのエッジのすべての対象に、結合部のすぐ前にスパンマーカが挿入される。この新たなスパンマーカは、バックエッジにあるスパンマーカからの経路にはなく、この結合部に合流するすべての他の経路に存在する。このスパンマーカもまた、スパンマーカのみを含み、結合部に赴く無条件の外向きエッジを1つだけ有する新たな基本ブロックである。一部の実施形態では、逆バックエッジを有するすべての分岐について、この分岐の再収束点に、基本ブロックの第1の命令としてスパンマーカが追加される。すべてのスパンマーカは、トラック全体にマッチする必要があるが、この理由は、全てのトラックが同じ基本ブロックと同じエッジとを有しているからである。実行可能なコードの生成においては、いくつかのスパンマーカが、いくつかのトラックから消失することがある。そこで、どのスパンマーカがトラックにおいてマッチしているかの記録を取っておいて、それらのいくつかが消失したらその旨がわかるようにしておく必要があろう。<実行可能なコードの生成>生成される実行可能なコードは、静的なコピー名称またはDTSEソフトウェア内部で利用される表現の情報テーブルを持たない。一部の実施形態では、異なるアドレスに対する分岐またはジャンプを実行しない限りにおいて、アドレスの順序で連続実行される通常のX86命令である。このコードはプールである。これはどの特定のトラックまたはその他の場所にも属さない。このコードの一部が、正確な命令シーケンスを有している場合には、どのトラックであってもこれをトラックのいずれの箇所においても利用することができる。したがい、要求されているコードが既にプール内に存在している場合には、同じコードの別のコピーを再度生成する必要がない。もちろん、あるコードで実行が開始されると、そのコード自身が、実行するすべての将来のコードを決定するという問題もある。ここで、Cというコードがあると想定しよう。2つの異なる用途U1及びU2について必要な命令シーケンスにマッチするが、Cの実行が終了すると、U1が命令シーケンスXを実行する必要があり、U2は、命令シーケンスYを実行する必要がある場合を想定するXとYとは異なる。これは問題を孕んでいる。DTSEコードの生成においては、この問題には少なくとも2つの解決法がある。一部の実施形態では、第1の解決法は、コードの静的コピーをDTSEソフトウェアで生成する方法によって、たとえば同じコードのシーケンスCなどをしばらくの間必要とするU1及びU2などの異なる用途においてこの後永久的に同じコードシーケンスを欲するようにする、というものである。一部の実施形態では、第2の解決法は、U1及びU2等の複数の用途にマッチするコードの部分Cなどを、DTSEサブルーチンにする、というものである。U1とU2とは、サブルーチン内で同じコードCを利用するが、U1とU2とは、このサブルーチンから戻ると、異なっていてよい。ここでも、コードの静的コピーを作成したコード分析ソフトウェアが、たいていの場合は、これらサブルーチンの形成を当然簡単に行うことができる。これらサブルーチンは元のプログラムには知らされない。<ブロックの構築>コードは、生来ハンモックになるように構造化される。ハンモックとは、DTSEサブルーチンの本来の候補である。DTSEサブルーチンは、元のプログラムには知らされないプロシージャである。DTSEサブルーチンからのリターンアドレスは、通常、アーキテクチャスタックには置かれない。プログラムについて正確ではないことに加えて、全ての実行コアが、同じアーキテクチャスタックを共有しつつ、一方では一般的にこれらがハンモックの別のバージョンを実行して、異なるリターンアドレスを必要とする、という課題もある。DTSEサブルーチンから出たり戻ったりする際には、呼び出し及びリターン命令を利用するのが望ましいと思われるが、これは、ハードウェアが、非常に精度高くリターンを予測する分岐への特別な構造を有しているからである。一部の実施形態では、呼び出しの前にDTSEのプライベートスタックを指すように変更され、コードの実行前にプログラムスタックポインタに戻される。そして、リターンするためにプライベートスタックポインタに戻らされる。プライベートスタックポインタ値は、等しいアドレスで、且つ、各論理プロセッサについて異なる位置にセーブされる必要がある。たとえば汎用レジスタがこのような格納領域を持っている。しかしこれらはプログラム実行に利用されている。DTSEハードウェアは、このように、等しいアドレスで、且つ、論理プロセッサの固有の格納領域にアクセスできるレジスタを提供することができる。前述したように、コードシーケンスを共有する用途は実際のところ、このポイントから永久に同じコードを実行するために、サブルーチンを利用する必要がない場合が多い。共有可能なコードシーケンスは、ユーザがこの点から永久的にコードについて了承した場合には、サブルーチンにはならない。ハンモックのバージョンのすべての用途が、ハンモックの後に同じコードに赴く場合には、通常、この時点でリターンする必要が生じない。共通のコードをすべてのユーザについて同じである限り拡張することができる。リターンは、ユーザがコードの実行に同意しない場合に必要となる。ハンモックは、呼び出し及びリターンのコストを合理的に償却する程度に長い間実行されることが予期される場合にのみ、サブルーチンにされる。さもなくば、サブルーチンにはされない。<インラインされたプロシージャ>プロシージャは、インラインされて、そのコピーが生成される。これは再帰的だったので、数個の呼び出しレベルおよび数個の呼び出しサイトで、多くのコピーが存在する可能性がある。他方で、プロシージャはDTSEサブルーチンの有望な候補である。可能性として、殆どの共通ケースにおけるプロシージャの多くのコピーが、同じであると判明する場合がある異なるトラックの異なる命令のサブセット以外は。もしくは、少しだけ異なるバージョンがあると判明する場合もある異なるトラックの異なる命令のサブセット以外は。したがってプロシージャは、1つまたは数少ないDTSEサブルーチンとなる異なるトラックの異なる命令のサブセット以外は。<一括ループアンロール>一部の実施形態では、ループは常にこのループのアンロールコピー0に入る。ループは、1つの退出点このループのアンロールコピー0のループ分岐群の一般的な共通の再収束点であるを有するものとして定義される。これがハンモックとされる。したがってループは常にサブルーチンとなる。<日和見的なサブルーチン>分岐ツリーの部分のなかには、ツリーで繰り返されるハンモックのように見えるものもある。この些細な例に、線形静的複製を有する分岐のツリーが、効果的に多くの線形コードセグメントに復号されたものがある。この線形コードセグメントのいくつもが、しばらくの間同じコードシーケンスを含んでいる。線形コードシーケンスは常にサブルーチンでありうる。<コードアセンブリ>一部の実施形態では、各トラックについて、トポロジールートが、開始点であり、全ての到達可能なコード及びすべての到達可能なエッジは、ここを通過点にする。コードは通過中に生成される。特定の基本ブロックインスタンスから特定の基本ブロックインスタンスに向かう方法については、前述したとおりである。特定のトラックの基本ブロックのインスタンスは命令を有さなくてよい。その場合コードも生成されない。しかし、この基本ブロックインスタンスからの複数の外向きエッジの多くが注意を要する。トラックの基本ブロックのインスタンスが、複数の外向きエッジを有しているが、外向きエッジを選択する際の分岐または間接ジャンプが、このトラックのこのインスタンスから削除されている場合には、このトラックは、分岐のこの削除されるインスタンスとその再収束点との間に命令を含まない。一部の実施形態では、通過が、このトラックの基本ブロックのこのインスタンスの複数の外向きエッジのいずれにも追従するものであってならず、この代わりに、直接、このトラックのこの基本ブロックインスタンスの最後の削除される分岐またはジャンプの再収束点に行くものである必要がある。基本ブロックインスタンスからの外向きエッジが1つある場合には、このエッジに追従する分岐またはジャンプがあってもなくても。複数の外向きエッジのなかから選択されるこのトラックの基本ブロックインスタンスの最後に分岐または間接ジャンプがある場合には、通過は、この複数の外向きエッジに追従する。一部の実施形態では、トラックの通過が、このトラックの1以上の命令を含む基本ブロックインスタンスに遭遇したときには、コードがあることになる。既にプールを退出したコードを利用したり、プールに新たなコードを追加することができる。いずれにしても、利用するコードは、特定のアドレスに配置される。そして、この経路の最後に生成されたコードを直してこのアドレスに進む。このコードを、この経路の直前のコードの後に順次配置することもできるだろう。そしてなにもここに到達させる必要がない。または、直前の命令が、分岐またはジャンプである可能性もある。そして、その対象IPが、正しい位置にくるまで直される必要がある。この経路の直前のコードは、分岐またはジャンプでなくてもよい。この場合には、正確な宛先への無条件ジャンプを挿入する必要がある。ほとんどの基本ブロックインスタンスが通常はトラックで到達不可能である。生成したコードは、中間形態の多数の闇雲に生成された静的コピーを大量に含んではいけない。生成されるコードは、全ての到達可能な経路において命令の正確なシーケンスのみを有するべきである。中間形態のエッジを通過する際、静的コピー間を移動する場合がある。静的コピーは、生成されるコードから識別されない。一般的な構想としては、たとえば既に正確な命令シーケンスを有するコードがあった場合などに、正確な元のIP用に生成されたコードへのループバックを閉鎖するなどして、正確な命令シーケンスになるべく迅速にたどり着く、というものである。別の例としては、異なる静的コピー用に生成されたが、正確な命令シーケンスを有しているコードに進む、というものもある。既に進んだコードが出てくる問題がある。これは、しばらく正しい既存の命令シーケンスが、時間を経て待ちしなくなったようなケースが考えられる。コードは、2つの異なる場合において同じ元のIPに赴くことができるが、同じ元のIPから要求されるコードシーケンスは2つの場合において異なる。<線形静的複製>一部の実施形態では、制御フローが、非ループブランチの一般的な再収束点に物理的に再度合流しないようにするために、線形静的複製により、次のバックエッジまで、コードのコピーを生成している。これは基本的に、含まれているループの次の繰り返し、または含んでいるループの退出までとなる。数多くのコードのコピーを生じさせる分岐ツリーが存在する場合がある。すべてではないがほとんどの場合、ある分岐の一般的な再収束点の後に別個に保持されたコードは、異なるトラック望ましい差についての異なるサブセットにはならない。コード生成においては、これは、まとめられてよい異なるトラックについて異なる命令サブセットについて別個にが、この理由は、一般的な再収束点において、今後ずっと、命令シーケンスが同じであるからである。コピーが消失する。コードの多くのコピーの全てが同じではないとしても、これらは、いくつかの異なる可能性に分類される場合が多いので、多くの静的コピーは実際には、生成されたコードのいくつかの静的コピーのみを生じさせると考えられる。分岐Bのコピーが全てなくなって、生成されたコードが元のコードとまったく同じように完全に再収束した場合には異なるトラックについての命令サブセットを除いて、確かに、この静的複製から得られる利点が全くないことになる。このコードは、送信依存性を引き起こすルートconduitとなる。分離できない場合、並列性を制限する偽の依存性を生成する。分離はしなくてよい。これに加えて、Bの一般的な再収束点の後のコードのコピーが、常にではないとしても、ときにトラックの分離によって異なってしまう場合もある。<ループの一括アンロール>一部の実施形態では、一括ループアンロールが、ネストされたループのコードの多くのコピーを生成する。たとえば、4レベルのネストループがあって、2通りのアンロール法しかない場合には、一番内部には16つのループ本体のコピーがあることになる。これら16つのコピーがすべて異なる可能性は低い。その反対である。ループのアンロールが利点を生じさせる確率は、50よりずっと低い。フローのアンロールのほとんどすべてである場合もあるが、生産的ではない。非生産的なアンロールは、通常すべてのコピーにおいて、そのループについて同じになる異なるトラックの異なる命令サブセット以外は。ここで、ほとんどの場合しばしば、アンロールの全てを再度コード生成時点でまとめる場合がある。しかし、一方で、いくつかのコピーが異なっており、並列性に寄与する場合もある。アンロールからのループ本体の2つのコピーが同じ場合には、コード生成において、そのループのバックエッジが同じ位置に行くが、この理由は、要求されている以降の命令シーケンスが永久的に同じだからである。このコピーのアンロールコピーが消失している。これが内部のループであった場合には、外部ループが生成する多くのコピーで、同じことが起こる。外部ループが生産的アンロールを有している場合、外部ループのコピー同士が異なっていたとしても、内部ループが外部ループの複数のコピーで異ならないことも十分に考えられる。ループは、本質的にハンモックを形成する傾向がある。内部ループがサブルーチンになる可能性が非常に高い。そのコピーは1つだけある異なるトラックの異なる命令サブセット以外は。外部ループの複数のコピーから生き残ったものと称される。<インラインされたプロシージャ>一部の実施形態では、プロシージャがインラインされ、そのコピーを生成している。これは再帰的なものなので、数個の呼び出しレベル及び数回の呼び出しサイトをもってすれば、多数のコピーが存在しうる。他方で、プロシージャは、DTSEサブルーチンにとって理想的な候補である。ほとんどの共通するケースにおいて、可能性として、プロシージャの多くのコピーが全て同じであることがわかる場合があるだろう異なるトラックの異なる命令サブセット以外で。または、いくつか実際の異なるバージョンのみがあるとわかる場合もあるあろう異なるトラックの異なる命令サブセット以外で。したがってプロシージャは、1つまたはいくつかのDTSEサブルーチンとなる異なるトラックの異なる命令サブセット以外で。インラインされていない場合、プロシージャは、偽の依存性を生成する可能性がある。したがって、プロシージャが1度のDTSEサブルーチントラック1つについてとして再構築される場合であっても、依存度分析において完全にコピーされることが望まれる。これに加えて、プロシージャのコピーは時折、常にではないが、トラックの分離によって異なってしまう場合がある。<複製されたストア>まったく同じ命令が、最終的には、冗長的に実行される複数のトラックとしてみえるようになることがある。これは、この命令を複数のトラックから削除できなかったことに起因して生じる。どの命令でも起こりうることなので、冗長的に実行されるストアを複数のトラックを設けてもよい。一部の実施形態では、DTSEソフトウェアは、複数のトラックで冗長的な同じストアのケースをマークする。ストアは、特定の接頭語をとってもよいし、ストアマーカ命令の複製の後にきてもよい。一部の実施形態では、ストアマーカ命令の複製は、DTSEレジスタへのストアであってもよい。ストアマークの複製は、どんな形態であっても、他のトラックのうちどれが、これと同じストアを冗長的に実行することを示すものであるべきである。<マーカの位置合わせ>一部の実施形態では、DTSEハードウェアが2個以上のトラックから同じ位置のスパンの同じバイトへのストアを検知すると、違反を宣言して、最後にグローバルにコミットされている状態への状態復帰を行い、フローを抜ける。もちろん、マークされた冗長的なストアを予測することもできる。DTSEハードウェアは、冗長的に実行された、マークされた冗長ストアにマッチして、1つのストアとしてコミットされる。スパンマーカは、位置合わせスパン分離器である。マークされた複製ストアは、位置合わせスパン分離器である。位置合わせマーカは、位置合わせスパン分離器である。一部の実施形態では、位置合わせマーカが特別な命令である。DTSEレジスタへのストアであり、他のトラックのうちどれが同じ位置合わせマーカを有しているかを示す。複数のトラックに同じバイトへのストアがある場合には、ハードウェアは、衝突するストア同士が異なる位置合わせスパンにあることを条件に、これらストアをプログラム順に適切に配置することができる。DTSEハードウェアは、同じトラックからのメモリアクセスのプログラムの順序を知っている。ハードウェアは、異なる位置合わせスパンにある場合のみに、異なるトラックのメモリアクセスのプログラムの順序を知ることができる。一部の実施形態では、ハードウェアが同じトラックで実行されなかったストアからのデータを必要とするロードの可能性があると思う場合には、違反を宣言して、最後にグローバルにコミットされた状態に状態を復帰させてフローを抜ける。一部の実施形態では、DTSEソフトウェアは、同じバイトにヒットしていることが観察された複数のトラックで生じるストア間の位置合わせマーカのいずれかの形態を配置する。DTSEソフトウェアは、位置合わせマーカを配置して、ストアと同じアドレスにヒットしたことが観察されたロード全てを、ハードウェアの適切な順序にする。<状態セーブ及び復帰>一部の実施形態では、グローバルコミット点が各スパンマーカに設けられる。スパンマーカ自身は、ハードウェアに識別子を送信する。一部の実施形態では、DTSEソフトウェアがテーブルを構築する。状態を最後にグローバルにコミットされた点に復帰する必要がある場合には、ソフトウェアはハードウェアから識別子を取得して、テーブルでこのグローバルコミット点を探す。DTSEソフトウェアは、テーブルに、頻繁に変化せず、コード準備時点で知ることができるこのコード位置の他の状態とともに、このグローバルコミット点の元のコードIPたとえばコードが実行されているリングを書き込む。他の情報は、最後にグローバルにコミットされた点から変更されたものであってよいレジスタであってよい。このコードは様々なグローバルコミット点用にカスタマイズ可能なので、ここには状態を復帰させるソフトウェアコードへのポインタがあってもよい。一部の実施形態では、各スパンマーカにコードを追加して、適宜、セーブする必要のあるデータをすべてセーブするようにして、状態を復帰できるようにしておいてもよい。これには、少なくとも一部のレジスタ値が含まれてよいだろう。一部の実施形態では、グローバルコミット点にカスタマイズされてよいコードを追加して、状態を復帰させることができる。コードへのポインタは、テーブルで調整されるpaced。グローバルコミット点は、比較的頻繁に遭遇されるが、これに対して状態復帰の頻度はかなり少ない。実際の状態復帰を行う必要があるときには、仕事が大幅に増えるという犠牲を払ってでもグローバルコミット点での仕事を最小限にすることが有利である。したがって依存度分析とトラック分離とを行う一部の実施形態では、コードが全て多くのコピーに分散される。実行可能なコード生成時には、再度集められる可能性が高い。<論理プロセッサ管理>DTSEは、複数の同時のマルチスレッドハードウェアスレッドたとえば2つの同時マルチスレッドハードウェアスレッドを1つのコアについて有するコアセットで実装することができる。DTSEシステムは、より多い数の論理プロセッサを生成して、各コアが、たとえば2つだけではなく4つの論理プロセッサを有しているように見えるようにすることができる。加えて、DTSEシステムは、論理プロセッサを実装するために、コアリソースを効率的に管理することができる。最後に、DTSEが幾つかのコードストリームを複数のスレッドに分解して、これらスレッドが論理プロセッサ上で実行されてよい。2つの同時マルチスレッドハードウェアスレッドをたとえば有するコアで4つの論理プロセッサを実装するには、一部の実施形態では、DTSEシステムが、たとえば、自身尾の状態をコアハードウェアに有することができない2つの論理プロセッサのプロセッサ状態を保持する。DTSEシステムは、各同時マルチスレッドハードウェアの状態を時々切り替えることができる。DTSEは、各ソフトウェアスレッドのコードを生成する。DTSEは、ケースバイケースで、1つの元のコードストリームからいくつかのスレッドを生成するようにスレッド分解を行い、または、DTSEが、1つの元のコードストリームから1つのスレッドのみを生成することができてよい。コードは、1つの元のコードストリームに同じように生成する。トラック分離においては、コードは2以上のスレッドに分離されてよく、または、トラック分離が、全てのコードを同じ1つのトラックにするだけでもよい。実行可能なコードを生成する前に、更なる仕事をコードに対して行ってたとえば命令の追加、論理プロセッサ管理を実装することができる。一部の実施形態では、DTSEハードウェアが、実際にはアクセスを実行する各同時マルチスレッドハードウェアスレッドについて異なるストレージにアクセスする、均一にアドレスされる少なくとも1つの格納位置を提供する。一実施形態では、これは、RAX等のプロセッサ汎用レジスタである。これは、RAXとして任意のコア上の任意の同時マルチスレッドハードウェアスレッドで実行されているすべてのコードによりアクセスされるが、格納位置及びデータが、RAXへのアクセスを実行するすべての同時マルチスレッドハードウェアスレッドについて異なっている。一部の実施形態では、プロセッサ汎用レジスタをプログラムコードの実行に利用して、DTEが、DTSEハードウェアが提供する他の同時マルチスレッドハードウェアスレッド特定ストレージを必要とする。これは、たとえば、DTSE論理モジュールの同時マルチスレッドハードウェアスレッドについて1または数個のレジスタであってよい。特に一部の実施形態では、同時マルチスレッドハードウェアスレッドの専用格納レジスタMEが、この同時マルチスレッドハードウェアスレッド上で現在実行されている論理プロセッサの状態セーブテーブルへのポインタを含む。この位置のテーブルは、実行されるべき次の論理プロセッサのセーブ領域及びこの同時マルチスレッドハードウェアスレッドセーブテーブルにおいて実行されたセーブ領域へのポインタ等の一定の他の情報を含む。DTSEが全ての元のコードストリームについてすべてのスレッドについて生成するすべてのコードが、同じアドレススペースに存在している。したがって、どの元のコードストリームのどの生成されたコードであっても、どの元のコードストリームのどの生成されたコードに対してであってもジャンプすることができる。DTSE専用データもすべて同じアドレススペースにある。プログラムデータスペースは、一般的に、各元のコードストリームの別のアドレススペースにある。<効率的なスレッド切り替え>一部の実施形態では、DTSEが、HT切り替えエントリポイント及び退出点を、コードを生成する各スレッドに挿入する。したがってこれらエントリポイントの利用は、ハードウェアのセクションで説明した通りである。<HT切り替えエントリポイント>一部の実施形態では、HT切り替えエントリポイントにおけるコードは、MEから、自身のセーブテーブルへのポインタを読み出し、次に、次の論理プロセッサセーブテーブルへのポインタを読み出す。このテーブルから、次のHT切り替えエントリポイントのIPから、処理されている次のエントリポイントに行く。コードは、このアドレスを分岐予測器のリターン予測スタックに推進する特殊命令を利用することができる。オプションとして、プリフェッチをこのアドレスで、またはおそらくはさらなるアドレスで発行することもできる。これはすべて、この現在のHT切り替えエントリポイントの後に行われる次のHTスイッチのセットアップである。リターン予測器は、次のHTスイッチを正確に予測することができるようセットアップする必要がある。Iキャッシュミスが次のHT切り替えの後にあるような場合には、プリフェッチをこの時点で発行して、このIストリームを次のHTスレッド切り替えのIキャッシュに備えさせることができる。次にコードが要求している状態を、この時点から自身のセーブテーブルから読み出して、このHT切り替えエントリポイントの後のコードから実行を再開する。これは、要求されているときの、CR3、EPT,及びセグメントレジスタのロードを含んでよい。同じ同時マルチスレッドハードウェアスレッドを共有して同じアドレススペースを有する論理プロセッサを含むと好適であるが、これは、これらが全て同じプロセスからのスレッドを実行しているので、これは必須ではないが、HT切り替えにおけるこれらレジスタのリロードを必要ではなくす必要があるからである。<HT切り替え退出点>一部の実施形態では、HT切り替え退出点のコードが、MEから、自身のセーブテーブルへのポインタを読み出す。自信のセーブテーブルに再開させるために必要な状態を格納する。そして、自身のセーブテーブルから、実行する次の論理プロセッサのセーブテーブルへのポインタを読み出して、MEに書き込む。進む次のHT切り替えエントリポイントのIPを読み出して、スタックにプッシュする。これは、必要なHT切り替えエントリポイントへの完全に予測されたジャンプを実行するリターン命令を実行する。HTスイッチ退出点のコードは、実行する同時マルチスレッドハードウェアスレッドを再度取得するときに再開されるIPを制御する。自身のセーブテーブルのIPに欲しいいずれのものであっても格納することができる。<効率的な予測不可能な間接分岐>予測不可能な間接分岐は、一部の実施形態では、DTSEにより、間接分岐を変更して、分岐対象を計算するだけにさせるようにすることで効率的に行うことができる。HT切り替え退出点で後で行うことができるが、テーブルをセーブするための計算された分岐対象を格納する。このスレッドに切り替えして戻す場合には、当然、間接分岐の正確な対象に行くことになる。これは、分岐ミス予測及びIキャッシュミスがない状態で行うことができる間接分岐であってもHT切り替えであっても。<論理プロセッサへのリソースの切り替え>一部の実施形態では、特殊命令または接頭語である、分岐レポートまでのフェッチ停止がある。この命令は、分岐または間接ジャンプの直前に挿入することができる。分岐レポートまでのフェッチ停止を復号する場合、他の同時マルチスレッドハードウェアスレッドが前進しているという前提で、このIストリーム停止用の命令フェッチを停止させ、このIストリームの次の命令の後の命令を復号しない。他の同時マルチスレッドハードウェアスレッドが前進していない場合には、この命令は無視する。以下の命令は、分岐または間接ジャンプであるべきである。タグ付される。分岐及びジャンプが、実行時に、これらが正確に予測されたか予測に失敗したかを報告する。タグ付された分岐が報告する際には、このIストリームの命令フェッチ及び復号を再開させる。この同時マルチスレッドハードウェアスレッドのいずれかの分岐が予測ミスを報告する場合には、命令フェッチ及び復号を再開させる。一部の実施形態では、特殊命令または接頭語である、ロード報告までのフェッチ停止がある。この命令は、ロードの後のいずれかの時点に挿入することができる。ロードの結果にすることができるオペランドを有している。ロード報告までのフェッチ停止命令は、実際に実行される。これは、キャンセルせずにいつ実行されるかを報告する。ロード報告までのフェッチ停止命令には、条件付き及び無条件という2つの形態がある。無条件のロード報告までのフェッチ停止命令は、復号されたときに命令フェッチ及び復号を停止させる。条件付きのロード報告までのフェッチ停止命令は、他の同時マルチスレッドハードウェアスレッドが前進している場合にのみ復号されているこのIストリームにおける復号及び命令フェッチを停止させる。命令の両方の形態が、命令がキャンセルされていない実行を報告したときにこのIストリーム上での復号命令フェッチ及びを再開させ、このIストリームについて未処理のデータキャッシュミスはない。<コード分析>フラッシュプロファイリングは、各個々の分岐またはジャンプ実行インスタンスについて、この実行インスタンスが予測ミスであったか正確な予測であったかを示す。これは、Iキャッシュミス、第2レベルのキャッシュミス、及びDRAMへのミスを得た命令実行インスタンスを示す。各ロード実行インスタンスについて、この実行インスタンスがデータキャッシュミス、第2レベルのキャッシュミス、及びDRAMへのミスを得たかを示す。DTSEソフトウェアが行うすべての形態の静的複製も、論理プロセッサ管理に利用することができる。一部の実施形態では、ロード、分岐、及び間接ジャンプのすべての静的インスタンスが、番号ミスを得ている。これらの実施形態では、命令の静的インスタンスが、フェッチキャッシュミスの番号を得る。同じ命令元のIPによるの異なる静的インスタンスが、非常に頻繁に非常に異なるミスを犯す場合があるので、一般的には命令の静的なインスタンスを利用するほうがよい。命令のインスタンス数が増えるほど、各インスタンスにおけるミスの率missratenumbersは高くなったり低くなったりする確率が良好になる。中間のミスの率が一番対処し辛い。ベストエフォートや、IPのみを利用した場合に比べるとかなり向上したという事実に関わらず、中間範囲のミスの率である命令インスタンスが多いと思われる。一部の実施形態では、分類が、この中間範囲のミスの率に対処する1つの方法である。それぞれが中間範囲のミスの率を有する小さな分岐ツリーが、ツリーを通じて実行経路のいずれかの箇所でのミスの確率が高いことを予測することができる。同様に、いくつかのロードの一連のストリングそれぞれが、中間範囲のミスの率を有するが、ロードの少なくとも1つにおいてミスの確率が高いと提示することができる。ループのアンロールは、分類メカニズムの1つである。ループの繰り返しの個々のロードは、中間範囲のキャッシュミスの率を有している可能性がある。複数のループの繰り返しにおけるロードの実行数がグループとして認識されると、これら繰り返しにおける少なくとも1つにおけるキャッシュミスの高い確率を提示することができる。当然、1回の繰り返しにおける複数のロードを、複数の繰り返しの分類とともに、同じグループに分類することができる。一部の実施形態では、DTSEソフトウェアが、各グループが、これら種類のミスの比較的高い確率を有するようにグループ分けしてよい。グループは、小さくすることもできる。これは特に分岐ツリーの場合にあてはまる。後で分岐ツリーの分岐は、前には分岐の前であったが今はその分岐の後にある命令を静的に複製することで移動させることができる。これにより、ツリーで分岐同士を密にすることができる。グループが分岐ミス予測を生じる可能性が非常に高い場合、一般的には、HT切り替えを行うに値しない。一部の実施形態では、分岐報告までフェッチを停止する命令を、その経路の上の最後のグループ分岐の直前のグループからはずれた経路に挿入する。実行経路の上のグループの分岐は、復号した後に、他の同時マルチスレッドハードウェアスレッドが前進している間は、復号を停止させる。これにより、他の同時マルチスレッドハードウェアスレッドにコアリソースが与えられる。グループに予測ミスがない場合には、実行経路の最後のグループの分岐が報告したときに、フェッチ及び復号を再開させる。さもなくば、分岐が予測ミスを報告するとすぐに、フェッチが全ての補正された対象アドレスで再開する。これは、分岐が順序に従って報告していない場合もあるので、あまり完璧ではない。しかしHTスイッチを、上述したように予測ミスの可能性の高い間接分岐に利用する。同様に、あるグループが非常にデータキャッシュミスの可能性が高い場合、一般的にはHT切り替えを行わないほうが攻撃である。一部の実施形態では、可能であれば、グループのロードを移動させて、ロード全てがロードの第1のコンシューマの前にくるようにする。一部の実施形態では、ロード報告命令までの条件的フェッチ停止命令は、グループの最後のロードに依存して行われ、ロードの後であって、全てのコンシューマの前に配置される。ロード報告までの無条件のフェッチ停止命令は、データキャッシュミスがほぼ確実ではあるが、データキャッシュミス1つだけの場合に利用することができる。グループの頻繁なロードは、一般的にはコンシューマの前には配置されない。たとえば、グループがループのアンロールされている繰り返しである場合、こうしても意味がない。この場合には、グループを十分大きくして、少なくとも1つ及び好適にはいくつかのデータキャッシュミスがほぼ避けられないようにすると好適である。これは、一般的には、グループがループのアンロールされている繰り返しである場合に達成可能である。一実施形態では、プリフェッチセットを生成して、グループのロードをカバーすることができる。最初にプリフェッチをもってきて、次にHT切り替えを置き、その次にコードを配置する。第2のレベルのキャッシュミスの可能性が高いグループDストリームまたはIストリームは、HT切り替えを正当化する。最初にプリフェッチをもってきて、次にHT切り替えを置き、その次にコードを配置する。DRAMにミスの確率が30の場合であっても、これは、HT切り替えを正当化することができる。これらのインスタンスでは、一部の実施形態では、最初にプリフェッチをもってきて、次にHT切り替えを持ってくる。それでも、いくつかのミスをカバーすることができる場合には、よりグループ化を促進して、ミスを得る確率を高くしてよりよくするほうが好適である。一部の実施形態では、他の同時マルチスレッドハードウェアスレッドに対する動作は、HT切り替えが生じている場合にカバーしている。対象物は常に、実際の仕事を行っている1つの同時マルチスレッドハードウェアスレッドである。他のスレッドがフェッチ停止中に、1つの同時マルチスレッドハードウェアスレッドが実際の仕事を行っている場合には、いつでも動作している同時マルチスレッドハードウェアスレッドに問題がある危険性がある。したがって、一般的には、非常に長い間1つの動作している同時マルチスレッドハードウェアのみに信頼があるわけではない。加えて、通常は長いフェッチ停止は望ましくない。障害に遭遇した場合など、長くなるときは、一部の実施形態では、HT切り替えを行って、動作している同時マルチスレッドハードウェアスレッドを別のもので助けるようにする。<コンピュータシステム及びプロセッサの例>図12は、本発明の実施形態のコアのアウトオブオーダアーキテクチャの一例を示すブロック図である。しかし、上述した命令は、インオーダのアーキテクチャで実装することもできる。図12では、矢印が、2以上のユニットの間の連結を示しており、矢印の方向が、これらユニットのデータフローの方向を示している。このアーキテクチャのコンポーネントは、これら命令のフェッチ、復号、及び実行を含む上述した命令を処理するために利用することができる。図12は、実行エンジンユニット1210及びメモリユニット1215に連結されたフロントエンドユニット1205を含み、実行エンジンユニット1210も、メモリユニット1215に連結されている。フロントエンドユニット1205は、レベル2L2分岐予測ユニット1220に連結されているレベル1L1分岐予測ユニット1222を含む。これらユニットによりコアが、分岐が解消させるのを待たずして、命令をフェッチ及び実行することができるようになる。L1及びL2ブランド予測ユニット1220及び1222は、L1命令キャッシュユニット1224に連結されている。L1命令キャッシュユニット1224は、命令または1以上のスレッドを保持して、これらは実行エンジンユニット1210により実行されてよい。L1命令キャッシュユニット1224は、命令変換ルックアサイドバッファITLB1226に連結される。ITLB1226は、バイトストリームを離散した命令に分割する命令フェッチ及び事前復号ユニット1228に連結される。命令フェッチ及び事前復号ユニット1228は、命令キューユニット1230に連結されて、これら命令を格納する。復号ユニット1232は、上述した命令を含むキューされた命令を復号する。一部の実施形態では、復号ユニット1232が、複雑な復号ユニット1234及び3つの単純な復号ユニット1236、1238、及び1240を含む。単純な復号器は、全てではなくてもほとんどの、1つのuopに復号可能なx86命令を処理することができる。複雑な復号器は、複数のuopにマッピングする命令を復号することができる。復号ユニット1232は、さらにマイクロコードROMユニット1242を含んでよい。L1命令キャッシュユニット1224は、さらに、メモリユニット1215内のL2キャッシュユニット1248に連結される。命令TLBユニット1226は、さらに、メモリユニット1215の第2のレベルのTLBユニット1246に連結されている。復号ユニット1232、マイクロコードROMユニット1242、及びループストリーム復号LSDユニット1244は、それぞれ、実行エンジンユニット1210内のリネーム/割り当てユニット1256に連結される。LSDユニット1244は、ソフトウェアのループが実行されるときを検知して、予測分岐を停止させ及び、失敗しそうなループの最後の分岐の予測を停止させ、そこからの命令をストリームする。一部の実施形態では、LSD1244はマイクロオペレーションmicroopをキャッシュする。実行エンジンユニット1210は、退避ユニット1274及び統合スケジュールユニット1258に連結されたリネーム/割り当てユニット1256を含む。リネーム/割り当てユニット1256は、すべてのレジスタリネームの前に必要とされるリソースを判断して、実行のために利用可能なリソースを割り当てる。このユニットは、論理レジスタを、物理レジスタファイルの物理レジスタにリネームする。退避ユニット1274は、さらに実行ユニット1260に連結され、リオーダバッファユニット1278を含む。このユニットは、完了後に命令を退避させる。統合スケジュールユニット1258は、さらに、実行ユニット1260に連結されている物理レジスタファイルユニット1276に連結される。スケジューラは、プロセッサで実行されている様々なスレッド間で共有される。物理レジスタファイルユニット1276は、MSRユニット1277A、浮動小数点レジスタユニット1277B、及び整数レジスタユニット1277Cを含み、さらなるレジスタファイル不図示であり、たとえば、MMXパック整数フラットレジスタファイル550にエイリアスされたスカラー浮動小数点スタックレジスタファイル545などを含んでもよい。実行ユニット1260は、3つの混合スカラーSIMD実行ユニット1262、1264、及び、1272、ロードユニット1266、ストアアドレスユニット1268、ストアデータユニット1270を含む。ロードユニット1266、ストアアドレスユニット1268、及びストアデータユニット1270は、ロード/ストア、及び、メモリ動作を実行して、それぞれがさらに、メモリユニット1215内のデータTLBユニット1252に連結されている。メモリユニット1215は、データTLBユニット1252に連結されている第2のレベルのTLBユニット1246を含む。データTLBユニット1252は、L1データキャッシュユニット1254に連結されている。L1データキャッシュユニット1254はさらに、L2キャッシュユニット1248に連結されている。一部の実施形態では、L2キャッシュユニット1248がさらにメモリユニット1215の内部及び外部の片方または両方にある、L3以上のキャッシュユニット1250に連結される。以下は、ここに詳述した命令の実行に適したシステムの例である。ラップトップ、デスクトップ、ハンドヘルドPC、情報携帯端末、エンジニアリングワークステーション、サーバ、ネットワークデバイス、ネットワークハブ、スイッチ、エンベデッドプロセッサ、デジタル信号プロセッサDSP、グラフィックデバイス、ビデオゲームデバイス、セットトップボックス、マイクロコンピュータ、携帯電話、可搬型メディアプレーヤ、ハンドヘルドデバイス、及び様々な他の電子デバイス等の他のシステム設計及び構成の利用も適している。一般的には、ここで開示したプロセッサ及びその他の実行論理の少なくとも1以上を組み込むことのできる多くの種類のシステムまたは電子デバイスの利用が可能である。図13を参照すると、本発明の一実施形態におけるシステム1300のブロック図が示されている。システム1300は、グラフィックメモリコントローラハブGMCH1320に連結されている1以上の処理エレメント1310、1315を含んでよい。さらなる処理エレメント1315の随意的性質は、図13において破線により示している。各処理エレメントは、シングルコアであってもよいし、または、複数のコアを含んでもよい。処理エレメントは、随意で、処理コア以外に、他のオンダイのエレメントたとえば、集積メモリコントローラ及び集積I/O制御論理の少なくとも1以上を含むこともできる。さらに少なくとも1つの実施形態について、処理エレメントのコアをマルチスレッドかして、これらが1つのコアについて2以上のハードウェアスレッドコンテキストを含むようにすることもできる。図13は、たとえば動的ランダムアクセスメモリDRAMであってよいメモリ1340に連結されていてよいGMCH1320を示している。DRAMは、少なくとも1つの実施形態では、不揮発性キャッシュに関連付けられていてよい。GMCH1320は、チップセット、またはチップセットの一部であってよい。GMCH1320は、プロセッサ1310、1315と通信してよく、プロセッサ1310、1315及びメモリ1340の間の相互作用を制御することができる。GMCH1320は、さらに、プロセッサ1310、1315及びシステム1300の他のエレメントの間の加速バスインタフェースとして機能してよい。少なくとも1つの実施形態では、GMCH1320は、プロセッサ1310、1315と、マルチドロップバスたとえばフロントサイドバスFSB1395経由で通信する。さらにGMCH1320は、ディスプレイ1345たとえばフラットパネルディスプレイに連結される。GMCH1320は、集積グラフィックアクセラレータを含んでよい。GMCH1320は、さらに、様々な周辺機器をシステム1300に連結するために利用することができる入出力I/OコントローラハブICH1350に連結されている。図13の実施形態にはさらに、たとえば、別の周辺機器1370とともにICH1350に連結される別のグラフィックデバイスであってよい外部グラフィックデバイス1360も示されている。システム1300には、さらなるまたは別の処理エレメントも含まれているとして示されている。たとえばさらなる処理エレメント1315が、プロセッサ1310と同じさらなるプロセッサ、プロセッサ1310とは異種または非対称なさらなるプロセッサ、アクセラレータたとえばグラフィックアクセラレータまたはデジタル信号処理DSPユニット、フィールドプログラム可能ゲートアレイ、その他の任意の処理エレメントを含んでよい。物理リソース1310、1315の間には、アーキテクチャ、マイクロアーキテクチャ、熱、電力消費特性等の様々な利点の計測に関して様々な差があってよい。これらの差は、処理エレメント1310、1315の非対称及び異種性を効果的に表していてよい。少なくとも1つの実施形態では、様々な処理エレメント1310、1315が、同じダイパッケージに含められていてよい。図14を参照すると、本発明の一実施形態における第2のシステム1400のブロック図が示されている。図14では、マイクロプロセッサシステム1400が、ポイントツーポイントインターコネクトシステムであり、ポイントツーポイントインターコネクト1450を介して連結された第1の処理エレメント1470と第2の処理エレメント1480とを含むと示されている。図14では、各処理エレメント1470及び1480が、第1処理コア及び第2処理コアつまりプロセッサコア1474a及び1474b及びプロセッサコア1484a及び1484bを含むマルチコアプロセッサであってよい。この代わりに、処理エレメント1470、1480の1以上が、プロセッサ以外のエレメントであってよいたとえばアクセラレータまたはフィールドプログラム可能ゲートアレイ。2つの処理エレメント1470、1480しか示されていないが、本発明の範囲はこれに限定はされないことを理解されたい。他の実施形態では、1以上のさらなる処理エレメントを任意のプロセッサに加えてもよい。第1の処理エレメント1470は、さらに、メモリコントローラハブMCH1472及びポイントツーポイントP-Pインターフェース1476及び1478を含んでよい。同様に、第2の処理エレメント1480が、MCH1482およびP-Pインターフェース1486および1488を含んでよい。プロセッサ1470、1480は、ポイントツーPtPインターフェース1450を介して、PtPインターフェース回路1478、1488を利用してデータを交換する。図14に示すように、MCH1472およいb1482は、プロセッサをそれぞれのメモリつまり、メモリ1442及びメモリ1444に連結するが、これらメモリは、それぞれのプロセッサにローカルに取り付けられているメインメモリの部分であってよい。プロセッサ1470、1480は、それぞれが、ポイントツーポイントインターフェース回路1476、1494、1486、1498を利用して、個々のPtPインターフェース1452、1454を介してチップセット1490と、データを交換することができる。チップセット1490はさらに、高パフォーマンスグラフィックインターフェース1439を介して、高パフォーマンスグラフィック回路1438とデータを交換してもよい。本発明の実施形態は、任意の数のプロセッサコアを有する任意のプロセッサ内にあってもよいし、または図14の各PtPバスエージェントな内にあってもよい。一実施形態では、任意のプロセッサコアが、ローカルキャッシュメモリ不図示を含んでも、これと関連付けられていてもよい。さらに、共有キャッシュ不図示が、両方のプロセッサ外のいずれかのプロセッサに含まれておりながら、p2pインターコネクト経由でプロセッサに接続されていてもよいたとえば、プロセッサ片方または両方のローカルキャッシュ情報を、プロセッサが低電力モードに入ったとき共有キャッシュに格納することができるように。第1の処理エレメント1470及び第2の処理エレメント1480は、P-Pインターコネクト1476、1486、及び1484をそれぞれ介して、チップセット1490に連結されていてもよい。図14に示すように、チップセット1490は、P-Pインターフェース1494及び1498を含む。さらにチップセット1490は、チップセット1490をコウパフォーマンスグラフィックエンジン1448に連結するためにインターフェース1492を含む。一実施形態では、バス1449が、グラフィックエンジン1448をチップセット1490に連結するために利用されてもよい。この代わりに、ポイントツーポイントインターコネクト1449がこれらコンポーネントを連結してもよい。チップセット1490は、インターフェース1496を介して第1のバス1416に連結されていてよい。一実施形態では、第1のバス1416が、周辺コンポーネントインターコネクトPCIバス、または、PCIExpressその他の第三世代I/Oインターコネクトバスであってよいが、本発明の範囲はこれに限定はされない。図14に示すように、様々なI/Oデバイス1414が、第1のバス1416を第2のバス1420に連結するバスブリッジ1418とともに第1のバス1416に連結されてよい。一実施形態では、第2のバス1420は、低ピンカウントLPCバスであってよい。一実施形態では、様々なデバイスたとえばキーボード/マウス122、通信デバイス1426、及びデータ格納ユニット1428たとえばディスクドライブその他の大容量記憶デバイスコード1430を含むを含むが第2のバス1420に連結されていてよい。さらにオーディオI/O1424が、第2のバス1420に連結されてよい。他のアーキテクチャを利用してもよい。たとえばズ14のポイントツーポイントアーキテクチャの代わりに、システムはマルチドロップバスその他のアーキテクチャを実装してもよい。図15を参照すると、本発明の一実施形態における第3のシステム1500のブロック図が示されている。図14及び図15の同様のエレメントには同様の参照番号が付されており、図14の一定の側面は図15では省くことで、図15の他の側面をあいまいにしないようにしている。図15は、処理エレメント1470、1480が、集積メモリ及びI/O制御論理CL1472及び1482をそれぞれ含んでよいことを示している。少なくとも1つの実施形態では、CL1472、1482が、図13及び図14を参照して説明したようなメモリコントローラハブ論理MCHを含んでよい。加えて、CL1472、1482もI/O制御論理を含んでよい。図15は、CL1472、1482に連結されているメモリ1442、1444だけではなく、I/Oデバイス1514もが、制御論理1472、1482に連結されていてもよいことを示している。レガシーI/Oデバイス1515が、チップセット1490に連結されている。ここに開示するメカニズムの実施形態は、ハードウェア、ソフトウェア、ファームウェア、またはこれら実装方法の組み合わせで実装されてよい。本発明の実施形態は、少なくとも1つのプロセッサ、データ記憶システム揮発性及び不揮発性メモリ及び記憶素子のすくなくとも1つを含む、少なくとも1つの入力デバイス、及び、少なくとも1つの出力デバイスを含む、プログラム可能なシステムで実行されうるコンピュータプログラムまたはプログラムコードとして実装されてよい。図14に示すコード1430のようなプログラムコードは、データを入力して、ここに記載する機能を実行し、出力情報を生成するために利用することができる。出力情報は1以上の出力デバイスに公知の方法で適用することができる。この用途のために、処理システムは、プロセッサたとえばデジタル信号プロセッサDSP、マイクロコントローラ、特定用途向け集積回路ASIC、またはマイクロプロセッサを有する任意のシステムを含む。プログラムコードは、処理システムと通信するための高レベルプロシージャプログラミング言語またはオブジェクト指向プログラミング言語で実装されてよい。プログラムコードはさらに適宜アセンブリ言語または機械言語で実装されてよい。実際、ここに記載するメカニズムは、特定のプログラミング言語の範囲に限定はされない。いずれにしても、言語はコンパイル言語であっても解釈された言語であってもよい。少なくとも1つの実施形態の1以上の態様を、プロセッサ内の様々な論理を表す機械可読媒体に格納されたデータにより実装されてもよく、これらは、機械により読まれると、機械に、ここに記載する技術を実行する論理を製造させることができる。この表現はIPコアとして知られている、有形の、機械可読媒体に格納されて、様々なコンシューマまたは製造所に送られ、実際に論理またはプロセッサを製造する製造機械にロードされてよい。これら機械可読記憶媒体は、これらに限定はされないが、機械またはデバイスが製造したり形成したりする粒子の永続的ではない、有形の配置ハードディスク等の記憶媒体、フロッピー登録商標ディスク、光ディスク、CD-ROM,CD-RW,及び磁気光ディスク、半導体素子ROM、DRAM等のRAM,SRAM,EPROM、フラッシュメモリ、EEPROM、磁気カード、または光カード、その他の種類の電子命令の格納に適した媒体等を含んでよい。したがって本発明の実施形態はさらに、構造、回路、装置、プロセッサ、及びここで記載するシステム特徴を含む、非永続的で、有形の機械可読媒体HDL等の設計データを含むまたは命令を含むを含んでもよい。これらの実施形態はさらにプログラムプロダクトと称されてもよい。ここに開示された命令の一定の処理は、ハードウェアコンポーネントにより実施されてもよいし、回路、または他のハードウェアコンポーネントを少なくとも処理を実装する命令でプログラミングさせるために利用される機械実行可能命令に具現化されてよい。回路は、ほんの数例を挙げると、汎用または専用プロセッサ、論理回路を含んでよい。処理はさらに、随意でハードウェア、ソフトウェアの組み合わせで実行されてもよい。実行論理及びプロセッサの少なくとも1以上は、命令特定結果オペランドを格納するために機械命令から導出される1以上の制御信号または機械命令に呼応する特定の回路またはその他の論理を含んでよい。たとえば、ここに開示される命令の実施形態は、図13、図14、及び図15のシステムの1以上で実施されてもよいし、命令の実施形態が、プログラムコードに格納されて、システムで実行されてもよい。上述した記載は、本発明の好適な実施形態を示すことを意図している。上述した説明から、特に成長著しいために将来の進歩を予測することが難しい技術分野では、本発明を添付請求項及びその均等物の範囲の本発明の原理から逸脱せずに構成及び詳細を変更することができることが容易に分かるだろう。たとえば方法の処理の1以上を組み合わせたり、さらに分解したりすることもできる。<別の実施形態>実施形態は、ここに記載した命令を生来実行することができるものとして記載してきたが、本発明の別の実施形態は、命令を、異なる命令セットを実行するプロセッサで実行されるエミュレーション層で実行することもできるたとえば、カリフォルニア州のSunnyvale在住のMIPSTechnologies社によるMIPS命令を実行するプロセッサ、カリフォルニア州のSunnyvale在住のARMHoldings社のARM命令セットを実行するプロセッサ。さらに、図面のフロー図は、本発明の一定の実施形態が実施する特定順序の処理を示しているが、このような順序はあくまで例であることを理解されたいたとえば、別の実施形態では、異なる順序で処理を実行したり、一定の処理を組み合わせたり、一定の処理をまとめたりすることができる。前述した明細書では、本発明が特定の例示的な実施形態を参照して説明された。しかし、請求項に示されている本発明の広義の精神及び範囲を逸脱せずに様々な変更例及び変形例が可能である。したがって、明細書及び図面は、例示を意図しており、限定的な意味で受け取られるべきではない。"