(57)【特許請求の範囲】
【請求項１】
アプリケーションのオリジナルのソースコードを物理保護キャッシュに格納する段階と、
第１のプロセッサコアで前記アプリケーションのオリジナルのソースコードを実行する段階と、
第２のプロセッサコアが前記第１のプロセッサコアと協働する異なる実行モードに切り替える旨を示す情報を検知する検知フェーズに、前記第２のプロセッサコアを配置する段階と、
前記第１のプロセッサコアで前記オリジナルのソースコードの実行中のコードに関する情報を収集する段階と、
前記第２のプロセッサコアで、前記収集する段階で収集した情報を利用して前記第１のプロセッサコアと前記第２のプロセッサコアとが協働して実行することができる協働コードを前記オリジナルのソースコードから生成する段階であって、前記協働コードは利用可能なエントリポイントを伴う前記オリジナルのソースコードのスレッド化されたバージョンであり、前記エントリポイントは、前記オリジナルのソースコードにおける前記第１のプロセッサコア及び前記第２のプロセッサコアが協働して前記協働コードを実行する実行モードに切り替えるためのポイントである段階と、
前記第２のプロセッサコアで協働実行モードに切り替える旨を示す情報を検知する段階と、
前記第１のプロセッサコア及び前記第２のプロセッサコアにおいて、生成された前記協働コードを実行する段階と、
前記エントリポイントを格納するホットコードエントリポイントキャッシュにおける、各エントリポイントのフローを識別する署名をチェックすることにより、前記協働コードに、違反又は例外の発生により前記実行モードを終了するダーティな退出があるか判断する段階と、
前記ダーティな退出があるとき、前記物理保護キャッシュに格納されたオリジナルのソースコードを実行し、前記ダーティな退出がないとき、前記協働コードをコミットする段階と、
を備える方法。
【請求項２】
ホットコードエントリポイントキャッシュの署名をチェックすることにより、前記協働コードにダーティな退出があるか判断する段階は、前記第１のプロセッサコア及び前記第２のプロセッサコアの前記ホットコードエントリポイントキャッシュにおける署名をチェックする段階を含む、
請求項１に記載の方法。
【請求項３】
前記切り替える旨を示す情報にヒットしたことに応じて、前記第１のプロセッサコアに異なる実行モードに入るように準備させる段階を更に備える、
請求項１又は２に記載の方法。
【請求項４】
前記オリジナルのソースコードの実行中のコードに関する情報を収集することは、一定量の命令についてのロード、ストア、及び、分岐に関する情報を収集することを含む、
請求項１から３のいずれか１項に記載の方法。
【請求項５】
生成された前記協働コードの成功裡の完了に応じて、前記第１のプロセッサコア及び前記第２のプロセッサコアにおける生成された前記協働コードの実行を停止する段階を更に備える、
請求項１から４のいずれか１項に記載の方法。
【請求項６】
前記第１のプロセッサコア及び前記第２のプロセッサコアにおいて、生成された前記協働コードを実行する段階は、
２個のスレッドを分離して実行する段階と、
ラッパーハードウエアを用いてメモリのロード及びストアをバッファする段階と、
バッファされた前記メモリのロード及びストアに違反の可能性が無いかチェックする段階と、
メモリオーダリングを維持しながら先のプロセスを提供するためにアトミックに前記ストア及び前記ロードの処理をコミットする段階と、
を有する請求項１から５のいずれか１項に記載の方法。
【請求項７】
違反に応じて前記第１のプロセッサコア及び前記第２のプロセッサコアにおける生成された前記協働コードの実行を中断し、最後のコミットポイントにロールバックする段階を更に備える、
請求項６に記載の方法。
【請求項８】
違反に応じて前記第１のプロセッサコア及び前記第２のプロセッサコアにおける生成された前記協働コードの実行を中断することに応じて、前記第１のプロセッサコアで前記オリジナルのソースコードを実行し、前記第２のプロセッサコアが前記協働実行モードに切り替える旨を示す情報を検知する前記検知フェーズに、前記第２のプロセッサコアを戻す段階を更に備える、
請求項７に記載の方法。
【請求項９】
アプリケーションのオリジナルのソースコードのための物理保護キャッシュと、
前記オリジナルのソースコードの実行中にホットコードエントリポイントを検出したことに応じて、協働コードを実行する第１のプロセッサコア及び第２のプロセッサコアと、
ハードウェアラッパーと、
を備え、
前記協働コードは利用可能なエントリポイントを伴う前記オリジナルのソースコードのスレッド化されたバージョンであり、
前記第１のプロセッサコアは、一定量の命令についての情報を収集し、前記第２のプロセッサコアは、収集した前記情報に基づいて前記オリジナルのソースコードのホット領域を検出し、前記情報が収集された前記ソースコードから前記協働コードを生成し、前記ホット領域は、前記コードの動的実行部分に対応するコードの部分であり、
前記ハードウェアラッパーは、前記第１のプロセッサコア及び前記第２のプロセッサコアにより実行されるメモリのロード及びストアをバッファし、バッファされた前記メモリのロード及びストアに対し、ホットコードエントリキャッシュを用いて違反の可能性がないかをチェックし、更に、メモリオーダリングを維持しながら先のプロセスを提供するためにアトミックに前記ロード及び前記ストアの処理をコミットし、
前記ホット領域は、ハードウェアテーブルを用いてアクセスされる頻度に基づいてホット領域を検出することで検知される、
装置。
【請求項１０】
前記ロード及び前記ストアのコミットに利用される中間レベルキャッシュを更に備える、
請求項９に記載の装置。
【請求項１１】
最終レベルキャッシュを更に備える、
請求項９又は１０に記載の装置。
【請求項１２】
前記ハードウェアラッパーは、アボートに応じてバッファされた前記メモリのロード及びストアを破棄する、
請求項９から１１のいずれか１項に記載の装置。
【請求項１３】
前記アボートは、異なるスレッドの２つのストアが同じスパンのメモリの同じアドレスに書き込みをするときに生じるストア−ストア違反に応じて検出される、
請求項１２に記載の装置。
【請求項１４】
前記アボートは、異なるスレッドのストア及びロードが同じスパンのメモリの同じアドレスに書き込みをするときに生じるロード−ストア違反に応じて検出される、
請求項１２に記載の装置。
【請求項１５】
前記アボートに応じて、前記第１のプロセッサコアは、最後のコミットポイントにロールバックする、
請求項１２に記載の装置。
【請求項１６】
前記一定量の命令についての情報は、ロード、ストア、及び分岐に関する情報である請求項９から１５のいずれか１項に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本一部継続出願は、「Systems, Methods, and Apparatuses for Parallel Computing」なる名称の非仮特許出願第12/646,815号明細書の優先日を主張しており、この出願自身も、「System, Methods, and Apparatuses To Decompose A Sequential Program Into Multiple Threads, Execute Said Threads, and Reconstruct The Sequential Execution」なる名称で２００９年１１月２４日に提出された非仮特許出願第12/624,804号明細書の優先日を主張しており、この出願は、「Method and Apparatus To Reconstruct Sequential Execution From A Decomposed Instruction Stream」なる名称で２００９年１１月２４日に提出された仮特許出願第61/200,103号明細書の優先日を主張している。
【０００２】
本発明の実施形態は概して、情報処理分野に係り、より詳しくは、コンピューティングシステム及びマイクロプロセッサにおけるフィールドのマルチスレッド実行に係る。
【背景技術】
【０００３】
シングルスレッドプロセッサは、命令レベルの並列性（ＩＬＰ）を活用して、ここ何十年かの間に飛躍的にパフォーマンスが向上した。しかし、この並列性は、利用が難しい場合があり、許容できない電力消費と設計の複雑性を引き起こしうる複雑なハードウェアが必要となる場合がある。さらに、この複雑性と電力の増加により、利益も減る。チップマルチプロセッサ（ＣＭＰ）が、合理的な電力予算で、さらなるプロセッサパフォーマンス向上を提供する見込みのある他の選択肢として現れた。
【０００４】
本発明は、添付図面を例として説明され、添付図面に限定はされない。添付図面において同様の参照番号は同様の部材を示す。
【図面の簡単な説明】
【０００５】
【図１】動的スレッド切り替え実行アーキテクチャ処理の実施形態の一例をグラフィックに示す。
【図２】一部の実施形態におけるＤＴＳＥ処理の方法の一例を示す。
【図３】ＤＴＳＥアーキテクチャの一実施形態を示す。
【図４】一部の実施形態におけるラッパーの主要なハードウェアブロックを示す。
【図５】一実施形態におけるスパンされた実行を示す。
【図６】ＤＴＳＥハードウェアの一実施形態をより詳細に図示する。
【図７】一部の実施形態におけるＸＧＣの利用を図示する。
【図８】ソフトウェア動作の一部の例を示す。
【図９】ソフトウェア動作の一部の例を示す。
【図１０】ソフトウェア動作の一部の例を示す。
【図１１】ソフトウェア動作の一部の例を示す。
【図１２】本発明の実施形態のコアのアウトオブオーダアーキテクチャの一例を示すブロック図である。
【図１３】本発明の一実施形態におけるシステムのブロック図である。
【図１４】本発明の一実施形態における第２のシステムのブロック図である。
【図１５】本発明の一実施形態における第３のシステムのブロック図である。
【発明を実施するための形態】
【０００６】
以下の記載では、いくつもの詳細を述べる。しかし本発明の実施形態は、これら詳細がなくても実施可能である。また、公知の回路、構造、及び技術に関しては詳細に述べず、記載の理解をあいまいにしないようにしている場合もある。
【０００７】
「一実施形態」「１つの実施形態」「さまざまな実施形態」といった言い回しは、本発明の記載される実施形態が、特定の特徴、構造、または特性を含んでよいが、必ずしも全ての実施形態が特定の特徴、構造、または特性を含まなくてもよい。さらに、一部の実施形態では、他の実施形態のための記載された特徴を一部、全て含んでもよく、まったく含まなくてもよい。さらに、特定の特徴、構造、または特性が一実施形態との関連で記載されていても、当業者であれば、明示的に記載されていてもいなくてもよい他の実施形態との関連で、これら特徴、構造、または特性に影響を与えることは当業者の常識の範囲内であるとする。
【０００８】
動的スレッド切り替え実行を提供するためのシステム、装置、及び方法の実施形態を詳しく説明する。これをサポートするためのシステムの実施形態は、ハードウェアラッパー及びソフトウェアが取り囲むプロセッサコア（動的スレッド切り替えソフトウェア）からなる。通常の実行モードでは、プロセッサが、あたかもハードウェアラッパー及び動的スレッド切り替えソフトウェアが存在しないかのように動作している。たとえば通常のｘ８６実行が行われる。動的スレッド切り替え実行（ＤＴＳＥ）モードでは、ハードウェアラッパー及びソフトウェアが協働して、後述するようにフローの生成及び修正を含む動的スレッド切り替え実行を実行している。しかし先ずは高レベルの概略が提供される。次に、「フロー」「ホット」コード等のこれらトピックの一部のより詳細な説明を行う。
【０００９】
以下の詳細は、グローバルにコミットする前に各ロードが、正しいストアその他からデータを取得していることをチェックするハードウェアラッパーと、ハードウェアが正しい実行をチェック、保証するために、コードだけからは判断が難しいコードの依存性を解消するために最近観察されたコードの振る舞いを利用するソフトウェアとの組み合わせを説明している。
【００１０】
以下の詳細は、依存性を、元の命令の間からではなく、元の命令の具体的なインスタンス間から理解することができるように、元のコードの多くの静的インスタンスを識別する方法を記載している。
【００１１】
記載されるソフトウェアは、「フロー」と称される定義された静的コードのサブセット内の依存性についての完全な、しかし同様に完全に正確ではない理解を利用して、静的なコードを、そのフロー内のトラックの間の依存性のない（または局所的にしか（specifically）依存性が許されていない）別々の「トラック」に分割する。
【００１２】
加えて、以下の１以上を含むメンテナンス処理が記載されている。つまり、予期しない制御フロー、不正確なロード結果、または他のチェックの失敗により退出する前に、所望の動的実行より短くなるようなさらなるフローのプロファイリングを行うこと、この点で突然悪化したフローを削除すること、パフォーマンスに重要な新たなフローまたは置き換えフローの調査を継続すること、及び、新たなプロファイル情報がある場合にコードをトラックに再度分割すること、及び、元のコードより良いパフォーマンスが観察されないフローを削除すること。
【００１３】
ＤＴＳＥハードウェアは、一連のリストを形成して、中間レベルキャッシュにこれらを書き込む。ＤＴＳＥハードウェアは、このトラックのメタデータリストに関する物理アドレスをもつレジスタを有している。帯域幅を低く抑えるためには、ロード及びストアアドレスの圧縮を考えねばならないだろう。
【００１４】
ロードまたはストアを実行している論理プロセッサを追跡して、ロード実行及びストア処理を管轄する（senior）ことができる必要がある。
【００１５】
ＤＴＳＥ論理はさらに、退出時に分岐方向ビット、取られた間接的分岐（「戻る」を含む）の対象を取得する。これは、フラッシュプロファイリングおよびレジスタ状態復帰のサポート用データに利用される。＜Ｉ．高レベルの概略＞
【００１６】
上述したように、ここで詳述するプロセッサは、各コアが自身で動作するレガシーモードで動作することができる。プロセッサコアはさらに、コアの１つが「オフ」または停止しているときに、ＤＴＳＥモードでスレッドコードのプロファイリング、スレッド、及び実行のために利用することもできる。オペレーティングシステムがコアがスリープモードにあると仮定しても、停止フローは、コアの所有権をＯＳからＤＴＳＥモードに切り替えることができる。
【００１７】
図１は、ＤＴＳＥ処理の実施形態の一例をグラフィックに示す。これは、図中の二次コアになるアイドルコアの制御に関する。一部の実施形態では、コアがＨＡＬＴ／ＷＭＡＩＬ命令を受信するときに、アイドルコアの制御が生じる。ＤＴＳＥソフトウェアは、コアのすべてのスレッドがスリープ状態になるかを監視して、次いで、コアの制御を行う。
【００１８】
二次コードは、動的実行（たとえば１００Ｋの連続した命令のために実行されているカーネル）の大部分に対応している一次コアで実行されているソフトウェアのエントリポイントである「ホットコード」を検知することから開始される。ホットコードの検知は、通常、単純なハードウェア構造で行われている。ホットエントリポイントが削除されている場合には、プロファイリング用に装備（arm）される。ヒット（一次コアによる）すると、ホットコードは、全てのロード、ストア、及び分岐が一部の設定命令（たとえば５０，０００個の命令）についてプロファイリングされたことを示すプロファイリングモードに移行する。プロファイリングが完了すると、スレッドが生成される。スレッド生成では、ホットコードが解析されて、プロファイリングされた情報に基づいて、スレッド実行モードの２つのスレッドが生成される。完了すると、エントリポイント（ホットＩＰ）が、ＤＴＳＥモードのエントリポイントとして装備される。次に元のコード（一次コアで実行されている）がエントリポイントにヒットすると、両方のコアが協働してコードを実行するＤＴＳＥモードに切り替わる。ＤＴＳＥモードは、フローがホットコードを抜けるとき、または、違反または外部イベント（たとえば割り込み）が検知されると、終了する。違反には、たとえば、両方のコアが、同じエポックの同じメモリアドレスに対して異なるデータを格納しようとすることが含まれる。違反があると、スレッドモードは最後にコミットされた点にロールバックして、元のコードに戻る。
【００１９】
図２は、一部の実施形態におけるＤＴＳＥ処理の方法の一例を示す。この例では、２つのコアを利用してスレッドコードを処理している。２０１で、一次コア（コア０）が元のシングルスレッドコードを実行する。
【００２０】
２０３で、別のコア（コア１）が、起動されて、二次コアとして利用される。コアは、多くの方法で二次コア（ワーカスレッド）になることができる。たとえば二次コアは、ＯＳにより（たとえばＣ状態にされる）、ソフトウェアの割り当てにより、またはスレッドにより（ＯＳ／ドライバまたはアプリケーション自身により）スリープ状態にされる強奪コア（grabbing core）等のコアの静的分割の結果二次コアとして利用することができる。
【００２１】
一次コアが元のコードを実行している間、二次コアは、２０５で検知段階におかれ、ここで、（ハードウェアまたはソフトウェアによる）ホット領域のホットコード検知処理を待つ。一部の実施形態では、ホットコードの検知は、よくアクセスされるホット領域を検知するハードウェアテーブルであり、自身のエントリＩＰ（命令ポインタ）を提供する。このようなホット領域のエントリＩＰが検知されると、一次コアが装備され、２０７で、そのＩＰの次の起動においてプロファイリングをトリガして、元のコードのスレッドバージョンに実行を切り替える。プロファイリングとは、ロードアドレス、ストアアドレス、または所定の実行の長さへの分岐等の情報を集める処理である（たとえば５０，０００個の動的命令）。
【００２２】
プロファイリングが完了すると、二次コアが、スレッド生成段階（thread-gen）２０９を開始する。この段階では、二次コアが、プロファイリングされた領域のスレッドバージョンを生成して、一方では、プロファイリングされた情報を指針として利用する。スレッド生成によって、元のコードのスレッドバージョンと、可能性のあるエントリポイントとが提供される。エントリポイントの１つ（「ホットＩＰ」と称される）がヒットすると（２１１）、一次コア及び二次コアを方向付けし直して、コードのスレッドバージョンを実行して、実行が、別の実行モード（「スレッド実行モード」と称される場合もある）に切り替えられる。このモードでは、２つのスレッドが完全に別個に動作して、一方では、ラッパーハードウェアを利用して、メモリロードのバッファ及びストア、違反のチェックが行われ、原子的に状態コミットが行われて、メモリの順序を維持しつつ処理が進められる。
【００２３】
この実行モードは、以下の２つのうちいずれかで終了することができる。つまり、コードがホット領域をクリーンに退出（実行に問題がない退出）する場合、及び、不正行為のある場合のダーティな退出の際に、終了する場合がある。２１３で、どの種類の退出かの判断がなされる。ダーティな退出の一例は、ストア／ストア及びロード／ストアの違反または二次実行モードで取り扱われない例外のケースが挙げられる（ゼロ例外による浮動小数点の除算、キャッシュ不可能なメモリ種類のストア等）。第２の実行モードを退出すると、一次コアは元のコードに戻り、一方で二次コアは決定モードに移り、別のホットＩＰが検知されるまで、または、既に生成されている領域のホットＩＰにヒットするまで待つ。クリーンに退出した場合（ホット領域の退出）、元のコードは退出点から続ける。ダーティな退出をした場合（違反または例外の場合）、２１５で、一次コアが最後のチェックポイントに戻り、その実行から再開する。クリーンな退出及びダーティな退出の両方があった場合には、レジスタ状態を両方のコアから統合して、元のコアに移行する。＜ＤＴＳＥアーキテクチャの例＞
【００２４】
図３は、動的スレッド切り替え実行（ＤＴＳＥ）アーキテクチャの一実施形態を示す。このシステムのソフトウェア及びハードウェアの側面を以下で詳述する。上述したように、各コア３０１は、ネイティブに同時マルチスレッド（ＳＭＴ）をサポートしているものであってもよい。これは、２以上の論理プロセッサがコアのハードウェアを共有することを意味している。各論理プロセッサは、独立してコードストリームを処理するが、これらコードストリームからの命令は、同じハードウェア上で実行のために無作為に組み合わせられる。異なる論理プロセッサからの命令同士が同時に１つのコアのスーパスカラーハードウェアで実行する、という場合がよくある。ＳＭＴコアのパフォーマンス及び同じコアにおける論理プロセッサの数を向上させることができる。このために論理プロセッサ数が増えるので、いくつかの重要なワークロードをより速く処理することができるようになる。他のワークロードの処理は、論理プロセッサの数が増えただけでは速くはならない。
【００２５】
システム内に、全ての論理プロセッサの利点を活用することができるに足るソフトウェアスレッドがない場合がある。このようなシステムでは、複数の利用可能なソフトウェアスレッド全てまたは一部それぞれを、同時に実行される複数のスレッドに分解して、複数の（おそらくは数の多い）論理プロセッサの利点を活用する。論理プロセッサの数が増えただけでは速くはならないワークロードは、このスレッドを多数のスレッドに分解してより多くの論理プロセッサを利用できるようにすれば、高速処理されるようになることが予期される。
【００２６】
「従来の」コアに加えて、ハードウェアは、グローバルなメモリの一貫性３０３、グローバル退避３０７、グローバルなレジスタ状態３０９、及び、ソフトウェアの情報収集３０５のための論理を含む動的スレッド切り替え論理を含んでいる。この論理は、コア自身に含まれていてもよいし、別途提供されてもよい。この論理は、５つの機能を実行することができる。第１の機能は、プロファイリングと称される実行コードに関する専門情報の収集であり、第２の機能は、元のコードの実行中に、ハードウェアが、ソフトウェアが定義したホットＩＰストリームアドレスのヒットしていることを確認することである。これが生じると、ハードウェアは、ハードウェアは、ソフトウェアが定義した異なるアドレスにジャンプするようコアに強制する。こうすることで、コードのスレッドバージョンを実行することができる。第３の機能は、ハードウェアがソフトウェアと協働して、時々、元のコードストリームの正確なレジスタ状態を、コアのデータキャッシュ内のグローバルコミット点としてセーブすることである。元のコードストリームがソフトウェアにより複数のスレッドに分解された場合、元のプログラムの正確なレジスタ状態全体を有している論理プロセッサがなくなる場合がある。
各グローバルコミット点と見合った正確なメモリの状態を知っておく必要もある。適宜、ハードウェアがソフトウェアと協働して、アーキテクチャプログラム状態（レジスタ及びメモリ両方）を、最後のグローバルコミット点に復元できるようにしておく必要があるが、これに関しては後述する。第４の機能は、ソフトウェアは正確に実行できるコードの生成をかなり良好に行うことができるとはいえ、ソフトウェアがいつでも１００パーセント正確にはできないこともある。このいい例が、ソフトウェアが、コードのスレッドバージョンを生成する際に、メモリアドレスを完璧に予想できない、ということである。したがってスレッドコードが、ロードの誤った結果を得る場合がある。ハードウェアが、誤ってしまう可能性を全て検証する必要がある。不正確なものが見つかると、ハードウェアはソフトウェアと協働で、プログラム状態を直す必要がある。これは通常、コアの状態を最終のグローバルにコミットされていた状態に復元することにより行われている。最後の機能は、元のコードストリームを複数のスレッドに分解するときに、元のコードに指定されているメモリのストアを、複数の論理プロセッサの間で分配して、これら論理プロセッサの間で無作為な順序で実行させる機能である。動的スレッド切り替え論理は、他のコードストリームが、正確に実行されている元のコードが定義している不正確なメモリ状態を「見る」ことができないようにする必要がある。
【００２７】
これらのアーキテクチャの例では、プロセッサコア（「コア」）が２つのＭＳＴスレッドを有している。一般的には、ＤＴＳＥモードでは、１つのコアについて２つをはるかに超える数の「論理プロセッサ」が存在している。これらの論理プロセッサは、２つの種類「一次」「ワーカ」のいずれかとして定義されている。一次論理プロセッサは、ソフトウェアに知られている（つまり、オペレーティングシステム及び仮想マシンモニタ等）。ソフトウェアは、一次論理プロセッサセットを、コア上で、自身が実際に存在しているコア上のＳＭＴスレッドとしてみる。ＳＭＴスレッドが行うものの全てではないかもしれないが、殆どを行う一次論理プロセッサが、特に割り込みを受ける。
【００２８】
ワーカ論理プロセッサは、一般的には外部のソフトウェアから見えない。ＤＴＳＥソフトウェアによって利用され、「リザーブされているメモリ」に管理されている。このメモリは、物理的にアドレス可能であり、リザーブされたメモリシステムである。このリザーブされたメモリは、既存のシステムメモリの専用部分であっても、別個の物理メモリであってもよい。このリザーブされているメモリは、ＤＴＳＥコードを格納するために利用され、作業メモリとして機能する。ＤＴＳＥモードで生成されるデータ構造は、リザーブされているメモリに格納される。「ホット」なコードもこのリザーブされているメモリに格納される。トラックデータ、トラックデータディレクトリ、及びトラックメタデータもリザーブされているメモリに格納される。これら全てが物理的にアドレスされる。
【００２９】
ワーカ論理プロセッサは一次論理プロセッサが有するコンテキスト全体を有していないために、プロセッサ機能全体のうちのサブセットに制限される。ワーカ論理プロセッサは、リザーブされているメモリのフローのコードのみを実行し、目に見えるメモリの元のコードは実行しない。
【００３０】
一次論理プロセッサは、目に見えるメモリの元のコードまたは隠されているメモリのフローのコードを実行する。一次論理プロセッサが実行する、隠されているメモリのフローのコードは、ＤＴＳＥの観点からは、１つのトラックコードである。
【００３１】
動作においては、現在そうされているように、オペレーティングシステムが一次論理プロセッサでスレッドを実行する。一次論理プロセッサも、今と変わらず「コア」に分類される。数多くの一次論理プロセッサが存在しており、それぞれのパフォーマンスは非常に高い。一次論理プロセッサのパフォーマンスに、オペレーティングシステムが利用可能な一次論理プロセッサの数を乗算すると、チップのスループット機能をはるかに超える量になる。
【００３２】
提供される一次論理プロセッサの一部を利用して、チップの全機能を利用することができる。他方で、コード付が良好で、大量の並列プログラム（massively parallel programs）は、チップの機能をより効率的に利用することができるので、提供される一次論理プロセッサを大量に（好ましくはすべて）利用することで、より高いパフォーマンスを達成することができる。
【００３３】
実行されている一次論理プロセッサが、チップが提供すべきすべてのリソースを利用していない場合には、ＤＴＳＥソフトウェアが自動でスレッドの分解を行う。これは、ワーカ論理プロセッサで、並列化された計算フローを実行する。これには、スループットエンジンで並列に実行される大量のＳＳＥ及びＡＶＸコードの分解が特に含まれる。これには、特殊機能ユニットの特殊機能ユニットで実行することができるコードの実行が含まれる。
【００３４】
基本的には、一次論理プロセッサのスレッドが実際にワーカ論理プロセッサで計算フローを実行している場合には、一次論理プロセッサは何の関係もない。オペレーティングシステムが、自身がすべての作業をやっていると思っている間は、実質的には停止される。既に詳述したように、オペレーティングシステムは、ワーカ論理プロセッサについて知ることができない。計算フローがワーカ論理プロセッサで実行されているときには、それを所有している一次論理プロセッサは、２つ（割り込みまたは計算フローのフローからの退出）のうちの１つが起こるのを待つ。これらのいずれかが起こった場合には、一次論理プロセッサが制御を引き受ける（take over）。割り込みフローに移行する割り込みがある場合には、ワーカにおける計算フローと並列で、割り込みフローをすぐに実行する。ほとんどの場合、割り込みフローが割り込み処理全体を行い、一次論理プロセッサが、計算フローにはなんの影響も及ぼさずに、待ち状態に戻る。この計算フローからフロー退出したときには、待ち状態にあった一次論理プロセッサが、その時点でレジスタ状態を構築して、元のコードで再開する。理想的には、ホットコードエントリポイントにすぐにヒットする。これにより新たな計算フローの実行が開始されたり、おそらくは一次論理プロセッサでシステムフローの実行が開始されたりする。
【００３５】
ＤＴＳＥソフトウェア３１１は、後述する他のタスクからフローを生成したり、維持したり、除去したりするルーチンを含んでよい。
【００３６】
＜ハードウェア「ラッパー」＞
一部の実施形態では、ハードウェアラッパーを動的スレッド切り替え実行論理に利用する。ラッパーハードウェアは、１）ホット領域の検知（ホットコードルート検知）、２）ホット領域（プロファイル）を特徴付ける情報の生成、３）トランザクションを実行するときの状態のバッファリング、４）成功した場合のバッファリング状態に対するコミット、５）アボートされた場合のバッファリング状態の破棄、６）コヒーレンシーイベント（たとえば書き込み―書き込み及び読み出し―書き込みのコンフリクト等）の検知、７）相互修正コードに対する保護、及び、８）ページングに関する変更に対する保護、という機能の少なくとも１以上をサポートする。これら機能それぞれは、上述されているものもあれば、後述するものもある。
【００３７】
ＤＴＳＥ実行モードでは、生成されるスレッド同士は、協働することはできるが、通信することはできない。各コアは、自身のスレッドを実行しており、コミット／スパンマーカは、元のコードの一部のＩＰに対応しているスレッドコードのＩＰを示す。ＤＴＳＥハードウェアバッファは、情報をロード及び格納して、ストアが外部から見える（グローバルにコミットする）ことがないようにする。両方のコアがスパンマーカに到達すると、ロード及びストアに違反がないかをチェックする。違反が検知された場合には、ストアがグローバルにコミットされてよい。ストアのコミットとは、違反／ダーティな退出のあった場合に実行がジャンプすべきチェックポイントのことである。
【００３８】
図４は、一部の実施形態におけるラッパーの主要なハードウェアブロックを示す。上述したように、これは２以上のコア４０１からなる（対に属しているとして示されているが、これ以上存在してもよい）。違反の検知、原子コミット、ホットＩＰ検知、及びプロファイリング論理４０３は、コア４０１に連結されている。一部の実施形態では、このグループを、動的スレッド切り替え実行ハードウェア論理と称する。コアにはさらに、第２の実行モードの実行状態が統合されている中間レベルキャッシュ４０５が連結されている。加えて、最終レベルキャッシュ４０７も存在している。最後に、ｘＭＣ  Ｇｕａｒｄａｔａキャッシュ（ＸＧＣ４０９）が存在しており、これに関しては図７を参照して詳述する。
【００３９】
アプリケーション用の「フロー」の数は、ルート検知ハードウェア（明示されていない）でハードウェアによって特定される。各フローは、１以上のエントリポイントを有する、よく定義された二値コードのセットである。アプリケーション用のフローのセットは、アプリケーションのかなりの量の動的実行を網羅すべきであるが、静的フローを組み合わせたサイズは、フローの並列性によって小さくすべきである。
【００４０】
元のコードの実行中には、ルート検知ハードウェアが、１つのＩＰ値（新たなフローを特定する「ルート」と称される）を探す。通常はこのハードウェアが、実行がフローにある間は検索しない。一部の実施形態では、ハードウェアは６４個の命令ポインタ（ＩＰ）のリストを維持する。このリストは、位置０~位置６３まで順序をつけられて、各位置がＩＰを有したり、空であったりしてよい。リストは全て空の状態から始められる。
【００４１】
ＩＰに、位置Ｎのリストのエントリにマッチしている利用可能な（eligible）分岐がある場合、Ｎ＝０でない限りは、位置Ｎ−１及びＮが位置を入れ替える。Ｎ＝０の場合には何も行わない。より簡潔にいうと、このＩＰをリスト内で１つ繰り上げる。
【００４２】
ＩＰに、リストのエントリにマッチ「していない」利用可能な（eligible）分岐がある場合には、エントリ４０から６２を１つ繰り下げて、位置４１から６３とする。前の位置内容６３が失われる。新たなＩＰを位置４０に挿入する。
【００４３】
一部の実施形態では、ＩＰがリストに追加に「利用可能な」場合、またはマッチするよう「利用可能」な場合には制約があるので、既にリストに存在しているＩＰの利用を促す。第１の制約は、とられた後方への分岐の対象のみを利用可能とする、というものである。呼び出し及びリターンは利用可能としない。とられた後方への分岐が「ホット」を、フローの一部として実行しており、且つ、フローを退去しない場合は、この対象は利用可能としない。とられた後方への分岐の対象がホットコードエントリポイントキャッシュでヒットした場合には、利用可能とはしない。基本的には、既にフローに存在しているＩＰは、リストに配置されるべきではない。
【００４４】
一部の実施形態では、ソフトウェアが設定可能な２つの「除外」領域が存在している。各領域が、除外領域についてＩＰの下限及び上限で記述される。この便宜（facility）は、一定の領域においてＩＰのみを受け付けるよう設定することができる。第２の制約は、除外領域のＩＰを、リストに載せるために利用可能とはしない、というものである。
【００４５】
一部の実施形態では、リストの命令にヒットした後、１６，３８４個の動的命令未満の命令は、追加のために利用可能とはしないが、リストにおける最後のＩＰヒットを、１６，３８４個の動的命令の窓の新たなＩＰで置き換えることは許可されている。基本的に、最少平均が動的に５０，０００個の命令となるようなフローを対象とする。このリストのＩＰは、このようなフローのルートの候補である。したがって次の１６，０００個の動的命令を、リストに既に表されているフローの一部として考える。
【００４６】
一部の実施形態では、ハードウェアは、スタックを１６深いところまで維持する。呼び出しにより、スタックポインタが循環的に増分されて、リターンによって、スタックポインタは低減されるが、ラップはしない。つまり呼び出し時には、スタックポインタが、常に増分される。しかしプッシュ深さカウンタも存在している。１６を超えることはできない。リターンによって、もしもプッシュ深さが負になる場合には、スタックポインタ及びプッシュ深さカウンタは低減されない。全ての命令が、スタックのすべての位置を増分させる。プッシュ時には、スタックの新たなトップがクリアされる。スタック位置は、６４Ｋを最大カウントとして飽和する。したがって、別の制約として、スタックの上部が飽和しないうちは、ＩＰをリストに追加するべく利用可能としない、という制約も存在する。この理由は偽のループを避けるためである。常に２度繰り返されるループが含まれているプロシージャを想定する。このプロシージャは、コードのどこからでも読み出される。なので、このプロシージャの後方の分岐にはよくヒットすることになる。これは非常にホットに見えるが、論理的には全ての場所からの仕事とは関連がなく、良好なフローにはならない。このプロシージャの、これを呼び出すＩＰが望ましい。内部のプロシージャがフローを含む程度の大きさを持たない限りは、内部のプロシージャではなくて、外部のプロシージャが好ましい。
【００４７】
一部の実施形態では、ＩＰ、Ｉがリストに加えられる、または（マッチにヒットしたために）促進される場合には、次の１０２４個の動的命令内の命令はいずれもＩにマッチするために利用可能とはしない。この規則の趣旨は、タイトなループを過大評価しないようにするためである。このようなループの後方への分岐は、数多くヒットするが、各ヒットはあまり多くの仕事を表していない。
【００４８】
リストのトップのＩＰを、非常にアクティブなコードを表すものとしてとらえる。
【００４９】
通常のワークロードは、高い動的網羅範囲を得るために多くの数のフローを有している。これらを絶対に重要な順に発見することは重要事項ではないが、一般的には、これあらフローは大体重要な順に生成して、最大のパフォーマンス利得を早期に得ることができるようにすると好ましい。フローを構築するための合理的な場所を見つける必要がある。これは、ホットコードになり、次に再生できないもの（out of play）として、次に処理すべきフローを見つけるようにする。最もよくあるのは、いくつもフローを見つけてしまうことである。
【００５０】
一般的なフローは、ばらばらであり、重なっていない。しかし、少なくとも各フローのルートは、前に見つかったフロー内にはない。実際、後で見つかるフローに依然として存在している場合がある。２つのフローが同一ではないことを保証するためにはこれで十分である。特定の数を上では利用したが、これらはあくまで例示である。
【００５１】
このアーキテクチャには、システムフローと計算フローという少なくとも２つの種類のフローが存在している。計算フローは、ワーカ論理プロセッサのクラスタ上で実行される。システムフローは、一次論理プロセッサ上で実行される。
【００５２】
計算フローは、スレッド分解によって１つのコードストリームから形成される複数のトラックであってもよいが、必ずしもそうでなくてもよい。計算フローは、１つのクラスタ内のワーカ論理プロセッサによってその全体が実行されるが、これは、このフロー全体が、チェックされた後で、プログラム順にグローバルにコミットされる必要があることに起因している（しかし通常は、１つ１つではなく、一連のコミットスパンとしてグローバルにコミットされる）。フローを実行するすべてのワーカは、同じアドレスに自由にロード及びストアができる。計算フローは、禁止されているものという意味で、最も制約が厳しい。
【００５３】
システムフローも、ＤＴＳＥソフトウェアが生成するコードであり、隠されたメモリに常駐している。システムフローではいくつもできないことがある。制約はあるが、計算フローよりは制約がずっと少ない。システムフローは、計算フロー間のシリアルコード、または、計算フローに並列な独立スレッドである。
【００５４】
システムフローの最も重要な用途の１つに、割り込み処理がある。ＤＴＳＥソフトウェアは、最もよく利用される割り込みベクトル対象であるエントリポイントを有するフローを生成する場合がある。このコードは、これらベクトル対象から最もよく利用される経路をカバーする。もしも割り込みが、割り込みリターン（ＩＲＥＴ）へのベクトル対象から割り込みコードまで、システムフローを抜けることなく、システムフロー内で完璧に処理することができる場合には、「割り込まれた」フローを実行しているワーカを煩わせる必要はない。もし割り込み処理シーケンス全体をこのように処理することができない場合には、「割り込まれた」フローを実行しているワーカにおいてフローの退出を強制することになる。コンテキストの切り替えは、常に割り込みフローを退出させるので、「割り込まれた」計算フローではフロー退出が行われる。
【００５５】
割り込みをこの割り込みフローで処理することができる場合には、レジスタはセーブされない。割り込みシステムフローは、１つのグローバルコミットスパンである。ＩＲＥＴで終わり全てのコミットが１単位になるか、状態が割り込みベクトルの対象に復帰して、元のコードのそこから再開する。状態復帰には、計算フローのグローバルコミット（及びさらなる実行）の停止、及び、レジスタ状態の計算フローの最後のグローバルコミットポイントからの復帰が含まれる。
【００５６】
スレッドの切り替えはコードに正しくプログラミングされているために、隠れたメモリのフローのコードのスレッドは、超高速及び効率よく切り替えることができる。元のコードにはスレッドの切り替えをプログラミングすることができない。元のコードに関するスレッドの切り替えは遅く非効率的である。
【００５７】
計算フローは、何ができるかという点で制約がある。一部の元のコードは、計算フローに行くために利用可能ではない。計算フローには利用できない一部のコードが、制約の少ないシステムフローに行くことができたりする。システムフローにも行くことができないコードもある。これは元のコードとしてとどまらざるをえない。
【００５８】
一部の実施形態では、無制限の量の元のコードが、必要であれば、両方の種類のフローと乗算される。
【００５９】
ホットコードルートＩＰ（エントリＩＰ）が検知されると、そのＩＰの次のヒットにおいて、コアが元のコードのプロファイリングを開始することができるように一次コアが装備される。プロファイリング中は、上述した情報（分岐、ロード及びストア）を、メモリのバッファにプログラムダイナミックな順序で格納する。これらバッファは、後で、スレッド生成ソフトウェアにより利用されて、スレッドの生成が行われる（つまり、分岐に基づいて）未利用のコードが削除される、最適化が行われる、及び、ロード／ストアの関係が検知される。一部の実施形態では、コンフリクトチェックに利用されるものと同じハードウェア（後述する）を利用してロード、ストア及び分岐情報を退避させていた状態からバッファリングして、メモリに戻す（spill）。他の実施形態では、プログラム実行時にマイクロオペレーションを挿入して、必要な情報を直接メモリに格納する。
【００６０】
ホット領域（プロファイリング）を特徴付けるために、スレッドされた実行モードソフトウェアは、１）分岐については、ａ）とられた／とられていない情報への条件分岐が必要として、ｂ）分岐対象の間接分岐のため、２）ロードのためには、ａ）ロードアドレス及びｂ）アクセスサイズが必要であり、及び、３）ストアについては、ａ）ストアアドレス及びｂ）ストアサイズが必要である、のうち、１以上が適合する。
【００６１】
一部の実施形態では、順序づけバッファ（ＯＢ）がプロファイリング用に維持される。これは、ロード、ストア、及び分岐がアウトオフオーダを実施するが、プロファイリングデータは順序立ったものが（in order）必要だからである。ＯＢは、サイズが順序付け直しバッファ（ＲＯＢ）に類似している。ロードは、ディスパッチ中に、そのアドレスとサイズとをＯＢに書き込む。ストアは、ＳＴＡ（ストアアドレス）のディスパッチ中に、同じことを行う（ＳＴＡのディスパッチは、退避を格納する前に行われ、このディスパッチの意図は、仮想格納アドレスを物理アドレスに変換するためである）。分岐は、「ｔｏ」フィールドを書き込み、これは、直接及び間接分岐両方に利用することができる。これらロード、ストア、及び分岐がＲＯＢから退避する場合には、対応する情報をＯＢからコピーする。ホットコードプロファイリングは、ラッパーハードウェアがトランザクション状態をバッファインしておき後でコミットできるということを利用する。ＯＢから書き込み組み合わせキャッシュ（後述する）へデータをコピーするために、バッファリングされている状態をコミットする際に利用するものと同じデータパスを利用して、後でコミットを行う。プロファイリング情報は、専用バッファの特別なメモリ位置に書き込まれ、後でスレッドされた実行ソフトウェアによって利用できるようにしておく。
【００６２】
一部の実施形態では、ＤＴＳＥソフトウェアは、レジスタにＩＰを書き込み、これを装備する。ハードウェアはプロファイルデータをとって、このＩＰにヒットするとメモリのバッファに書き込む。フロールートＩＰの後に遭遇したいくつかの分岐（たとえば１０，０００）のための分岐方向の履歴が、ハードウェアにより実行中に報告される。リストは、ローカルな退避順序の１つの分岐について１ビットである。動的スレッド切り替え実行ソフトウェアは、退避時にとられた分岐の対象を取得する。そして、分岐方向のストリームに埋め込まれた間接分岐の対象を報告する。同時に、ハードウェアは、ロード及びストアのアドレス及びサイズを報告する。
【００６３】
アプリケーションがその振る舞いを継時的に変更することができる場合、アプリケーションが実行されている間は実行を監視するべきである。フローは「あまりに」短くみえるので、成長させる、または削除する必要がある。加えて、いつの時点においても、新たなフローを見つけたり、再生したり、統合することができる。一部の実施形態では、動的スレッド切り替え実行システムのハードウェアが、各フローについてグローバルにコミットされた命令及びサイクルを平均化して報告する。ソフトウェアは、これを考慮に入れて、ときどき、何か質問のある場合には、フローを一時的にディセーブルにすることで元のコードのデータを手にいれる必要がある。ほとんどの場合ソフトウェアは、正味値で勝算があることがかなり明らかである以外は、「ホット」コードを実行しない。「ホット」コードが正味値で勝算があるか定かではない場合には、ソフトウェアは、これをディセーブルにする。これはフローごとに行うことができ、またはソフトウェアはこのワークロードのために全てをオフにするだけの作業を行ってもよい。
【００６４】
ソフトウェアは、分岐ミス予測データ及び分岐方向データを受信し続ける。加えて、ソフトウェアは、グローバルキューのその部分が満杯である、または、フローのキャップを待っていることに起因して、スレッドストールについての報告を取得する。これらは、スケジュールよりかなり前に実行されているロードされたトラック（後述する）を示していてもよい。さらに、キャッシュミスのコアストール時間も取得する。たとえば、多くのキャッシュミスストール時間を得ているコアＡは、なぜコアＢがスケジュールよりかなり前に実行されているかを説明することができる。この全てを利用して、このフローのトラックのより良いロードの均衡を行うことができる。さらにハードウェアは、最大のキャッシュミスレートを有するロードを完全に特定して、それを報告する。こうすることで、ソフトウェアがキャッシュミスを再分配しやすくなる。
【００６５】
一部の実施形態では、ソフトウェアは、各フロー実行においてサイクルまたは命令の報告を取得する。これにより、小さすぎるフローが特定されるので、過度にキャップされたオーバヘッドを有することになる。
【００６６】
図５は、一実施形態におけるスパンされた実行を示す。スレッド実行ソフトウェアは、ホットコードのスレッドを生成するときには、なるべく少ない数の複製でこの実行を試みる。元の静的コードから２以上のスレッドを生成する。これらスレッドをスパンする。スパンマーカ同期は、元のコードについて生成して、違反（上述したもの）をスパンマーカの境界でチェックする。メモリ状態は、各スパンが完了したときコミットしてよい。図示されているようにホットＩＰにヒットすると、実行モードをスレッド実行に切り替える。前の一般的図示と異なるのは、各スレッドがスパンを有しているという点である。各スパンの後に、チェック（ｃｈｋ）を行う。この例では、第２のスパンが実行された後で、チェック（ｃｈｋ２）が違反を発見している。この違反のせいで、コードは最後のチェックポイントにロールバックする（これは、スレッドの後であっても、あるいはホットＩＰのヒットの前であってもよい）。
【００６７】
上述したように、ホットコード領域を退出すると（クリーンな退出時）または違反の条件において（ダーティな退出）、スレッド実行モードを退出する。クリーンな退出時には、退出点が、スパンとコミット点とを示し、これによりすべてのストアがコミットされる。クリーンな退出及びダーティな退出両方において、元のコードは、最後のチェックポイントの対応する元のＩＰに移行する（コミット）。レジスタ状態は、両方のコアの状態から統合される必要がある。こうするためには、スレッド生成器が、各コミットにおいてレジスタチェックポイント情報を更新する必要がある。これは、たとえば、関連するレジスタを各コアからハードウェアバッファまたはメモリに格納するストアである特殊ストアを挿入することにより行うことができる。退出する際には、レジスタの状態を、両方のコアから元の（一次）コアに統合する。レジスタの統合（たとえばレジスタ状態について）の他の選択肢である退出は、バッファリングされているロード及びストア情報（スレッド生成器により生成時点で決定される）から取得することができる。
【００６８】
ＤＴＳＥハードウェアの一実施形態のより詳細な例を図６に示す。この図は、左側に投機的実行を示し、右にコヒーレンシーを示している。一部の実施形態では、ＭＬＣ６１７及びコア６０１を除く全てが違反の検知、原子的コミット、ホットＩＰ検知、及びプロファイリング論理４０３の一部をなしている。実行が投機的である理由は、スレッドモードにある際に、コア６０１に生成されているスレッドが協働している間、これらが互いに通信しないからである。
【００６９】
一部の実施形態では、ハードウェアラッパーは、ある形態のコピーがリザーブされているメモリ（これも不図示）のある元のコードを保護する１つの物理保護キャッシュを含む。一部の実施形態では、１６Ｋのラインであり、各ラインが元のコードの４０９６バイトをカバーする８ウエイセットアソシエイティブキャッシュがある。解決策が、６４バイトのブロックである。キャッシュラインは、開始ブロック及び終了ブロックをそのラインの４０９６バイトの配置範囲内に含んでいる。ブロック数は６ビットである。このキャッシュは、同じタグを持つ同じセットの複数のラインを有してよい。したがって、物理保護キャッシュを読み出す際に、同じセットの複数のラインは、最大８ラインまでにヒットすることができる。これにより、同じ４０９６バイトのいくつかの接続されておらず、間に保護されていないギャップがあるスパンを表す機能が提供される。
【００７０】
ソフトウェア３１１は、物理保護キャッシュに二度以上表される６４バイトブロックがないようにする。６４バイトのブロックに対するヒットをチェックする際に、ブロックが、４０９６バイトの粒度のアドレスヒットもある最大８ラインまでのいずれかにあることをチェックする。１６Ｋのラインがあるので、１４ビットのライン番号を付される。６４バイトのブロックは、このキャッシュをミスするか、固有の１４ビットのライン番号にヒットする。
【００７１】
物理保護キャッシュは、任意の無効スヌープで探される。ヒットすると、ヒットの１４ビットのライン番号が取得され、任意でヒットした６４バイトブロックの６ビットの数が供給される。
【００７２】
各フローについて、ソフトウェアはこの元のコードが、コードの処理前に物理保護キャッシュでカバーされていることを確かめる。これには、キャッシュに既にあるラインのスパンの拡張及び新たなラインの追加が含まれる。
【００７３】
ソフトウェアは、フローをカバーする必要のあるライン番号のリストを取得する。たとえば、ソフトウェアは、このリストを１つの２８ビット番号に低減する。ライン番号は１４ビットである。われわれは、ライン番号の各ビット、有効ビット及びデータビットに２ビットを利用するので、１４ビットのライン番号について２８ビットが利用されることになる。各ビット位置において、リスト全体が、ビットが何であるかについて一致している場合には、これが結果生じるデータビットになり、有効ビットが１となる。リストにビット位置の値について一致していない場合には、結果生じるビットが０になり、有効ビットも０になる。これら２８ビットは、フローの署名である。
【００７４】
各コアは、そのホットコードエントリポイントキャッシュ（不図示）のすべてのフローの署名を有する。そして特に、現在一時的にグローバルにコミットされているフローのその１つの署名を有する。一部の実施形態ではこのテーブルの一部がキャッシュされているが、ホットコードエントリポイントテーブルはリザーブメモリにある。
【００７５】
とられる分岐が予測される場合には、その対象を最大幅の範囲のキャッシュから探す。ミスした場合には、リフィルを要求する。ヒットした場合であってエントリポイントがない場合には、そこで終了する。エントリポイントがある場合には、次に小さい範囲のキャッシュを探す。最終的には、エントリポイントにヒットするか、エントリポイントにヒットしないか、定かでなくフェッチリフィルをキャッシュに行うか、ということになる。
【００７６】
とられた分岐対象がリザーブされているメモリにある場合には、ホットコードエントリポイントキャッシュ検索は行われない。
【００７７】
とられた分岐の識別情報を取得する。エントリポイントにヒットした場合には、この分岐が退避しても、依然としてとられた状態にあるときには、示されている対象にジャンプして、ワーカも示されているエントリポイントにジャンプする旨強制される。
【００７８】
一時的にグローバルにコミットしているフローをそれぞれチェックする。ラインがマッチする場合にはフロー退出が行われる。さもなくばコミットが許可されてよい。これは、ホットコードエントリポイントキャッシュがクリーンされる前にエントリされたすべてのフローが終了するまで続けられる。このチェックが行われると、グローバルコミットを再開させることができる。
【００７９】
ホットコードエントリポイントキャッシュのすべての署名をチェックする必要がある。ラインがマッチする場合には、エントリポイントの証明を取り消す（decertify）。証明コードが呼び出されると、フラグを見ることになる。これは、エントリポイントを証明することができるようになる前に、リザーブされているメモリエージェント（不図示）のワークリストを処理する必要があることを意味している。ヒットしたライン番号を読み出す。各ライン番号について正確なスパンを知っている。各フローが必要とするキャッシュラインを正確に知っている。ヒットしたであろう各フローを削除したりチェックしたりする。完全なホットコードエントリポイントテーブルを更新する。そして、証明タスクを行うことができるようになる。
【００８０】
各コア６０１は、自身のスレッドを実行し、その間、スパンマーカが、元のコードのいずれかのＩＰに対応しているスレッドコードの場所（ＩＰ）を表す（スパンマーカは前の図に示されている）。このモードでの実行中、ハードウェアバッファは、情報をロードしてストアして、いずれのストアもが外部から見える（グローバルにコミットされる）ことがないようにする。この情報は様々なキャッシュに格納することができる。これらは、投機的ロードデータキャッシュ（ＳＬＣ）６０３、ロードストア順序づけバッファ（ＬＳＯＢ）６０５、及び投機的ストアキャッシュ（ＳＳＣ）６０７として示されている。これらは別個に示されているが、一部の実施形態ではこれらが１つの実体のそれぞれ別の部分であってもよい。加えてこれら格納物は、図示されているような１つのコアについて設けられなくてもよい。
【００８１】
一部の実施形態では、このデータを取得する前に順序づけバッファ（ＯＢ６０２）を通るが、ここでは、実行されるロード及びストア退避順序が適切に維持される（前述したとおりである）。ストアの物理アドレスとサイズは、上位（senior）の（古い）格納がデータキャッシュに書き込まれてＳＬＣ６０３に配置されるときに、利用可能とされる。ＳＬＣ６０３も、無効スヌープを検知する。同様に、ロードアドレス及びサイズがＤＴＳＥ論理にとって利用可能となり、ＳＬＣに格納される。ロード及びストアも、ロードストア順序づけバッファリング（ＬＳＯＢ）６０５に書き込まれて、各スレッドのロード及びストアの間の順序づけ情報を維持する。ＬＳＯＢ９６０５は、データとマスクとを維持する（有効なバイト）。
【００８２】
最終的には、ＤＴＳＥ論理は、ロードアドレスを、ストアアドレスとともに適切な順序で退避させる。一部の実施形態では、ＤＴＳＥ論理は、ロードアドレスおよびサイズを実行時に取得する。一部の実施形態では、ＤＴＳＥ論理が古くなり（age）、これらをフィルタリングして、適切な順序づけにして、ロードアドレス及びサイズを退避させる。
【００８３】
＜データキャッシュ＞
【００８４】
両方のコアが、スパンマーカに到達すると、後述する違反チェックコンポーネント（ストア正確さキャッシュ（ＳＣＣ）６１１及びロード正確キャッシュ（ＬＣＣ）６１３）を利用して、ロードおよびストアの違反をチェックする。通常は、ワーカ１つあたりＳＣＣ６１１及びＬＣＣ６１３が存在する。ＳＣＣ６１１は、そのワーカについてロードアドレス及びストアアドレスの両方を書き込まれる。すべての他の協働するワーカのストアアドレスで読み出される。１つの位置合わせスパンのコードで書き込まれたバイトを示している。通常このケースは、独立した物理構造である。ＬＣＣ６１３は、ＬＳＯＢ６０５からのすべてのワーカのストアアドレスで書き込まれる。そのワーカのロードアドレスで読み出される。通常は、これはリザーブされているメモリのデータ構造である。違反が検知されなかった場合には、ストアはグローバルにコミットすることができる。ストアのコミットは、以降のスパンで違反があった場合に実行がジャンプするべきチェックポイントを示す。
【００８５】
生じうる違反はいくつかある。第１の違反は、外部の実体（たとえば別のコア）からの無効化スヌープであり、これは、コアの１つが利用するデータを無効化する。誤っているかもしれない、なんらかの値が想定されるので（投機的実行）、実行をアボートして、元のコードは最終チェックポイントに戻る。ストア／ストアの違反は、異なるスレッドの２つのストアが同じスパンの同じアドレスに書き込みをするときに生じる場合がある。一部の実施形態では、１つのスパンにおける異なるスレッド間には順序がつけられていないので、どのストアが後で元のプログラム順序になるかを知ることができず、スレッド実行モードはアボートされて、元の実行モードに戻る。ストア／ロードの違反は、異なるスレッドのストアとロードとが、同じスパンのメモリの同じアドレスを利用する場合に生じうる。スレッド間で通信は行われないので、ロードは、ストアが格納したデータをミスする可能性がある。通常は、あるロードが、過去のスパンの他のコアにより格納されているデータにヒットすることは許可されていない点に留意されたい。これは、コア同士は独立して実行しており、ロードが、他のコアがストアに到達する前に実行されている可能性があるからである（１つのコアが、他のコアの前の多くのスパンである可能性がある）。元のコードがプログラムのストアにより、またはその他のエージェント（たとえばコア）によって修正されている、という自己修正コードまたは相互修正コードというイベントが生じる可能性がある。こうなると、スレッドコードが古くなっている可能性もある。他の違反も、パフォーマンスの最適化及びアーキテクチャのトレードオフによって生じる可能性がある。この違反の一例が、落とされた（dropped）投機的ストアにヒットする（ハードウェアがこれをサポートしていない場合）Ｌ１データキャッシュユニットのミスである。別の例は、スレッド生成器が行う想定であり、これは、後で誤りとして検知される（アサーションハードウェアブロック６０９）。
【００８６】
違反が生じていないということが保証された場合には、バッファリングされたストアにコミットしてグローバルに見えるようにしてよい。これは原子的に行われ、さもなくばストアの順序が壊れてしまう場合がある（ストアの順序は、プロセッサが順守すべき、メモリ順序づけアーキテクチャの一部である）。
【００８７】
スレッドモードの実行中は、全てのストアが「通常の」データパスを利用できるわけではないが、プライベートなコヒーレントではないスクラッチパッドとして機能する第１レベルキャッシュ（ストアを実行しているコア）にも、専用データストレージにも書き込むことができる。データストレージ（上述したキャッシュ及びバッファ）の情報には、データ、及びストアのデータサイズ／マスクが含まれる。ストアの組み合わせは、ストアが同じコミット領域からのものである限り許されている。
【００８８】
ハードウェアが状態にコミットすると決定すると（違反をチェックした後に）、すべてのストアがデータストレージ（たとえばＳＳＣ６０７）から出されて、コヒーレントな、スヌープ可能な状態にする必要がある。これは、ストアを、データストレージから書き込み組み合わせキャッシュ（ＷＣＣ）６１５に移動させることで行われる。データコピースヌープ中には、無効が全ての他のコヒーレントなエージェントに送られるので、ストアは、変更するキャッシュラインの所有権を取得する。
【００８９】
書き込み組み合わせキャッシュ６１５は、同じ最適化された領域で動作している異なるエージェント（コア及びスレッド）からのストアを組み合わせて、これらストアをグローバルに見える状態にする。すべてのコアからのすべてのストアをＷＣＣ６１５に組み合わせると、スヌープ可能になる。これにより原始的なコミットが提供され、これにより、メモリ順序づけ規則が中間レベルキャッシュ２１７内へと維持される。
【００９０】
バッファリングされている状態は、データストレージ内のいくつかの「有効」ビットをクリアすることでアボートで破棄され、これによりすべてのバッファリング状態がなくなる。
【００９１】
元のプログラムが２以上の同時スレッドに分割されているということから、コヒーレンシーチェックを利用することができる。ソフトウェア最適化器がロード及びストアのあいまいさを正確になくさないと、誤った結果が生じる場合がある。以下のハードウェア構築ブロックは、読み―書き、書き―書きコンフリクトをチェックするために利用することができる。ロード正確さキャッシュ（ＬＣＣ）６１３は、最適化された領域で実行されているロードのアドレス及びデータサイズ（またはマスク）を保持する。これは、別の論理コアからのストアが、最適化された領域からのロードと衝突しないように利用される。スパン違反チェックが行われると、各コアは、自身のストアを他のコアのＬＬＣ６１３（そのコアが書き込む各バイトの有効ビットを設定する）に書き込む。ＬＣＣ６１３は次に、他のコアのストアのアドレスを保持する。そして各コアが、自身のロードを、自身のＬＳＯＢ（ロードストア順序付けバッファ）６０５で繰り返すことでチェックして、自身のストアが書き込む各バイトの有効ビットをリセットして、各ロードが有効であるが１に設定されているバイトにヒットしないことをチェックする（つまり、このバイトが他のコアにより書き込まれたものではないことを確かめる）。１の有効ビットにヒットするロードは、違反と示される。ストア正確さキャッシュ（ＳＣＣ）６１１は、最適化された領域で実行されているストアのアドレス及びマスクを保持する。このキャッシュからの情報は、協働する論理コアのＬＳＯＢ６０５のエントリと比較されて、コンフリクトが検知されないことを確かめる。スパン違反チェックを行うと、ＳＣＣ６１１をリセットする。各コアは、自身のＬＳＯＢ６０５からのストアを、他のコアのＳＣＣ６１１に書き込む。そして各コアは自身のストア（ＬＳＯＢからのもの）を、既にそのＳＣＣ６１１にあるストアと比較する。ストアが他からのストアにヒットする場合に違反が検知される。一部のストアは、スレッド生成器により複製されてよい。これらストアは、ＳＣＣ６１１が正確に処理して、違反を偽検知しないようにする必要がある。加えて、投機ロードキャッシュ（ＳＬＣ）６０３が、最適化されている領域からのロードを、スレッド実行スキーム記述で協働しないが、同じアプリケーションの他のスレッドを同時に実行したり共有データにアクセスしたりしかねない論理コアからのスヌープの無効化から守る必要がある。一部の実施形態では、ここで説明するスレッド実行スキームは、「全てか無か」ポリシーを実装して、最適化された領域の全てのメモリトランザクションが、あたかも１時点（コミット時点）で同時に実行されたかのように見えるようにすべきである。
【００９２】
ＤＴＳＥ実行モードにある場合、各コアのＬ１データキャッシュはスクラッチパッドとして動作する。ストアは、スヌープに応答するべきではなく（ストアがグローバルに見えないように）、投機データ（チェックされてない／コミットされたデータ）を、中間レベルキャッシュに書き戻すべきではない。このモードから退出すると、ロールバックされたであろうすべての投機データを、データキャッシュから破棄するべきである。一部の実装トレードオフのせいで、スレッド実行モードにある間に実行されたすべての格納またはロードされたデータを無効化する必要がある場合がある。データキャッシュでは、全てのグローバルコミット点の元のプログラムデータブロック及びトラックデータブロックを全て同じ位置に格納する。これらは全てこのブロックの元のプログラムアドレスによりアドレスされる。
【００９３】
上述した例は容易に、３つ以上のコアがＤＴＳＥ実行モードで協働している場合を含むように一般化できることができる点は注意を喚起するに値する。さらに一部の違反は、コアの実行をストールさせたり同期させたりすることで、ハードウェア（たとえば一部のロード／ストア違反）により回避（worked around）することもできる。
【００９４】
一部の実施形態では、コミットをすべてのスパンには行わない。この場合には、違反のチェックは、各スパンで行うものの、コミットはいくつかのスパン置きに行われる（レジスタのチェックポイントのオーバヘッドを減らすために）。
【００９５】
一部の実施形態では、データキャッシュ及びそのエントリが通常のものではない。サポートするワーカの量によって、データキャッシュがアドレススペースマップの形態で手助けを必要とする場合がある。たとえば各データキャッシュタグをｘビットアドレススペースマップで拡張することができる（たとえば５ビット値が、１つのコアにつき４つのワーカを想定して、１つのコアについて２つのワーカのみの場合には３ビット、または１つのコアについて１つのルワーカの場合には２ビット等を想定する）。
【００９６】
５ビットの変形例では、ビット４が、一次論理プロセッサがこのキャッシュラインにアクセスできるかを示している。各ワーカ論理プロセッサはフィールド＜３：０＞のビットを有している。これは、対応するワーカ論理プロセッサがこのラインにアクセスできることを示している（たとえば０００１が、ワーカ論理プロセッサ１が他のものが行えない場合にはこのラインにアクセスできることを示している）。ワーカ論理プロセッサは、アドレススペースマップのビットがセットされていない場合にデータキャッシュミスを得る。一次論理プロセッサは、アドレススペースマップの一次ビットがセットされていない場合にデータキャッシュミスを得る。
【００９７】
データキャッシュは、全てのアクセスがせいぜいその１にヒットすることを前提として、（複数のウエイで）同じアドレスの複数のラインを含んでいてよい。これは、アドレススペースマップの５ビットそれぞれについて、データキャッシュには、ビットが同じアドレスにセットされているラインが２以上はないことを意味している。
【００９８】
同じタグを持つ複数のウエイのデータキャッシュを読み出すとき、もしあれば、要求している論理プロセッサがアクセス可能な固有のウエイを選択する。なければ、データキャッシュミスとなる。
【００９９】
上位のストア処理（一番古いストアの処理）においては、上位のストアは、ストアを実行した論理プロセッサがアクセス可能なキャッシュラインのみに移動する。さらにあるワーカが上位のストアをデータキャッシュに書き込む場合、対象のラインのアドレススペースマップは、ストアを行った論理プロセッサのみがアクセス可能なようにセットされる。すべての一次論理プロセッサは、この趣旨からは同じと考えられる。
【０１００】
加えて一部の実施形態では、論理的に各データキャッシュラインに関連付けられている「現在のビット」が存在している。これはデータキャッシュまたはデータキャッシュタグに物理的に近接している必要はない。ワーカ論理プロセッサがアクセス可能なすべてのキャッシュラインについての現在のビットは、ワーカ論理プロセッサのグローバルコミットマーカが上位になるとクリアされる。ラインに対する書き込みが成功すると、「現在」に設定される。ラインが中間レベルキャッシュに書き戻されると、これも「現在」に設定される。中間レベルキャッシュからのリフィルがあると、ダーティな場合、ラインは「現在ではない」と設定されるべきであり、中間レベルキャッシュでは現在ではないに設定されるべきである。そうではない場合には、データキャッシュの現在に設定される。現在のビットは、データがなくても中間レベルキャッシュから応答があると、このように設定される（ＭＬＣは所有権を付与するだけである）。
【０１０１】
１点だけ、中間レベルキャッシュが「ダーティで、現在ではない」、を形成することは、通常ではない。これはデータキャッシュに戻されて、データがない場合であってもデータキャッシュの現在のビットの状態を設定する（ＭＬＣは所有権を付与するだけである）。
【０１０２】
現在のビットがオフのダーティなデータキャッシュラインに、上位ストアがデータキャッシュに配置される前に、このストアを書き込もうとすると書き戻しが生じるが、無効化は生じない。データキャッシュラインの書き戻しを行うと、現在のビットが設定される。適切な場合に上位ストアの書き込みに成功すると、引き起こされる（provoke）書き込みの後に、ラインが「現在」に設定される。
【０１０３】
上位ストアの書き込みが、現在のビットがオフのクリーンなデータキャッシュライン（Ｅ状態）にヒットすると、中間レベルキャッシュに信号が送られて、ダーティな場合には、このラインのコピーを最終レベルキャッシュに書き戻して、新たなトラックデータブロック用の新たな物理アドレスを取得するよう促される。中間レベルキャッシュのダーティなデータは、同じグローバルコミットスパンに、データキャッシュに今行こうとしているダーティなデータとして移動しない。データキャッシュラインは、上位のストアをそれに書き込んだ結果、「現在」という状態を得る。
【０１０４】
一部の実施形態では、各ワーカ論理プロセッサについてメタデータバッファ（不図示）が存在している。メタデータはバッファに順次書き込まれる。メタデータバッファはこれを中間レベルキャッシュに書き込むことができる必要がある。トラックが実行されると、トラックデータがリザーブされているメモリに書き込まれ、メタデータがリザーブされているメモリに書き込まれる。残りの処理は、メタデータをリザーブされているメモリから読み戻して、チェックしてから、様々なトラックからのトラックデータを統合して、リザーブされているメモリから読み出して、元のプログラムアドレススペースの新たな状態として見ることができるようにすることである。
【０１０５】
中間レベルキャッシュ２１７では、全てのグローバルコミット点のトラックデータブロック及び元のプログラムデータブロックが、全て同じ位置に格納される。これらは全てブロックの元のプログラムアドレスによりアドレスされる。
【０１０６】
中間レベルキャッシュでは、中間レベルキャッシュラインの現在の現実の物理アドレスを保持するタグに対して拡張が行われている。現実の物理アドレスは、中間レベルキャッシュから最終レベルキャッシュに書き戻すために必要となる。中間レベルキャッシュの他のほとんどの動作には利用されない。一部の実施形態では、現実の物理アドレスは、トラックデータブロック番号である。１６ビット以下である。
【０１０７】
一部の実施形態では、中間レベルキャッシュに関するハードウェアレジスタが、各ワーカ論理プロセッサの元となるアドレス及びトラックデータスペースの制約、並びに、各トラックの最後に割り当てられたトラックデータブロックを保持する。このハードウェアは、現在のグローバルコミット番号も保持する。
【０１０８】
各中間レベルキャッシュに論理的に関連づけられた「現在のビット」が存在する。中間レベルキャッシュまたは中間レベルキャッシュタグに物理的に近くなくてよい。すべてのキャッシュライン用の、ワーカ論理プロセッサがアクセス可能なこのビットは、グローバルコミットマーカがこのワーカの上位にあるときにクリアにされる。
【０１０９】
一部の実施形態では、各中間レベルキャッシュタグは、６ビットの（我々が１つのコアについて４つのワーカをサポートすると想定して）アドレススペースマップで拡張される。このタグのサイズは、１つのコアについてのワーカの数に依存する。
【０１１０】
アドレススペースマップは、同じ時点で同じタグを含む同じアドレスの中間レベルキャッシュの複数のラインの所有をサポートしている。どの論理プロセッサがそのラインにアクセスすることができるかを特定している。同じタグを持つ複数のウエイの中間レベルキャッシュを読み出すとき、もしあれば、要求している論理プロセッサがアクセス可能な固有のウエイを選択する。なければ、中間レベルキャッシュミスとなる。
【０１１１】
一部の実施形態では、中間レベルキャッシュの各ラインが、一時的にコミットされたビット及び一次的にデコミッショニングされたビットを有していてよい。
【０１１２】
コミットは、全ての一時的にコミットされたキャッシュラインのための、現実の物理アドレスの有効ビットをクリアし、一次アクセス可能なものを設定するフラッシュと、全ての一時的にデコミッショニングされたキャッシュラインのためのライン有効ビットをクリアするフラッシュとからなる。
【０１１３】
一部の実施形態では、各ＤＴＳＥクラスタを有する複数のチェッカーステートマシンが存在している。各チャッカーステートマシンは、スレッドに動作するので、提供されるステートマシンの数によって、クラスタが同時に動作できるスレッドの数が決定される。チェッカーステートマシンは、同じスレッドで動作するすべてのトラックからメタデータリストを読み出して、ストア正確さキャッシュ及びロード正確さキャッシュを介して処理する。さらにコピーバックリストを書く。
【０１１４】
一部の実施形態では、コピーバックステートマシンは、コピーバックリストから中間レベルキャッシュを有する統合ステートマシンにキャッシュラインを配信して、ストアデータの様々に異なるトラックからの実際の統合を行い、元のプログラムアドレススペースに結果を配置する。
【０１１５】
一部の実施形態では、１つの中間レベルキャッシュにつき、正確に１つの統合ステートマシンが設けられる。このステートマシンは、こうすることが適当なときには、いくつかのトラックのトラックデータストレージからデータを実際に統合する。
【０１１６】
ロードが実行されると、ロードを行ったスレッドを除いて、システムのいずれかのエージェントがストアせず、このロードがグローバルにコミットされるまでこのロードにヒットすることが証明可能である必要がある。このグローバルコミットまで、任意のロードまたはストアのコアの退避からの確証があるべきであり、このスレッドの実行中に協働する一部の中間レベルキャッシュが、少なくとも共有状態で対象の元のプログラムアドレスを有してきた。このラインは、協働している中間レベルキャッシュ（マスタ―スレーブ法）の間でやりとりすることができるが、所有は連続させる必要がある。これは、このラインの所有権を持つ任意の他のエージェントについて、協働する中間レベルキャッシュのうち少なくとも１つが、他の協働する中間レベルキャッシュがラインを有していない場合に無効スヌープを得ることを意味している。
【０１１７】
通常は、各ＤＴＳＥクラスタが所有キャッシュを有している。この構造は、われわれがクラスタ内のある中間レベルキャッシュがリングまたはデータキャッシュからスヌープを得る、と確証できるキャッシュラインを示している。通常は所有キャッシュはリザーブされているメモリに位置しているが、一部はチェッカーキャッシュされてもよい。
【０１１８】
各ワーカ論理プロセッサは投機アクセスキャッシュを有している。投機アクセスキャッシュは、ワーカ論理プロセッサによりローカルに退避されてはいるが、まだグローバルにコミットはされていないロード及びストアを表している。
【０１１９】
グローバルコミットマーカは、特別なアドレスのストアである。データは、クラス番号と、コミットポインタ記述子へのポインタとを与える。
【０１２０】
「コミット待ち」は、特別なアドレスセットへのロードである。どこでも生じる可能性がある。このセット内の正確なアドレスに応じて、最後のグローバルコミットポイント、または一定のクラスの最後のグローバルコミットポイント、またはおそらくその他の可能性ある選択肢において、コミットを待つことができる。このロードのアドレスは、最後にグローバルにコミットされたメモリ状態を要求することができる。
【０１２１】
ＤＴＳＥは、コミット待ちに応答しないので、要求しているワーカの実行を、指定されているグローバルコミットが生じるまでストールさせておく。最後のグローバルにコミットされたメモリ状態が要求されている場合には、ＤＴＳＥ論理はさらに、要求しているワーカのすべてのトラックデータを無効化する。ＤＴＳＥ論理は、コミット待ちについてデータを返す。これによりこのワーカがアンストールされて、処理が進められる。
【０１２２】
最後にグローバルにコミットされたメモリ状態が要求されている場合、待ち状態として特定されたグローバルコミットポイントの後のこのワーカのすべてのストアが失われる。したがって一般的には、この選択肢は、グローバルコミットポイントを待った後で、且つ、このワーカがこれ以上ストアをする前に行うのが現実的である。通常、待ち状態は、待っていたグローバルコミットポイントのグローバルコミットマーカの直後に行う。
【０１２３】
待ち状態には３つの用途がる。１つ目が、待ち状態を、レジスタ状態が変更されないように保護するものであり、これによりいくつかのレジスタをセーブする必要がなくなる。異なるトラックのストアにロードがヒットする場合には（時にそうなる）、これにより、ロードが正確な結果を得ることができるようになり、さらに、逃亡投機（runaway speculation）を防ぐこともできる。＜ＩＩ．動作＞
【０１２４】
データメモリ状態は、データ自身及びメタデータで表される。これらは、別個に格納されるだけでなく、異なる方法で格納される。一次論理プロセッサ及びワーカ論理プロセッサの両方がメタデータを有している。メタデータがない場合には、メモリ状態は、ワーカ論理プロセッサにとって意味をなさない。メタデータは、一次論理プロセッサのプロファイリング目的にのみ利用される。
【０１２５】
リザーブされているメモリのデータスペースに関して、一部の実施形態では、各トラックが、自身のデータスペースをリザーブされたメモリに有しており、各ワーカ論理プロセッサも同様である。一次論理プロセッサはトラックデータスペースを有さない。
【０１２６】
フローに入ると、全てのトラックデータスペースが未割当になる。キャッシュラインサイズブロックは、フローが実行されると、必要に応じて、順次循環して割り当てられる。各割り当ては、具体的なグローバルコミットスパン用のものである。ブロックは、自身が割り当てられているスパンがグローバルにコミットされるために、割り当てを解除される。各ワーカ論理プロセッサについて割り当てポインタと割り当て解除ポインタとが存在する。これらのポインタは、ブロック番号を含むが、アドレスは含まない。ブロック番号スペースは、この割り当てのために存在している物理ブロック数の倍数である。
【０１２７】
割り当てにおいて、ブロック番号はラップ（wrap）することができない。すべてのブロック番号が一度割り当てられると、このトラックは、これ以上トラックデータブロックを割り当てることができない。これ以上割り当てる必要がある場合には、フローを退出することになる。
【０１２８】
他方で、物理ブロックの割り当ては、ブロック番号をラップさせない上限まで複数回ラップする。実際の物理アドレスに割り当て解除されたブロック番号を有している中間レベルキャッシュのラインは、最後のレベルキャッシュに書き戻さない。同様に、中間レベルキャッシュにミスがあり、リフィルのための現実の物理アドレスが、割り当て解除されたブロック番号である場合には、リフィルが代わりに元のプログラムアドレスから選ばれる。このラインは、投機ストアを含むことができない。投機ストアがある場合には、より最近割り当てしなおされたものであるはずである。
【０１２９】
実行しているコード内でトラックの論理位置を異ならせるに足る量と、チェック時間およびグローバルコミットをカバーするに足る量をカバーすることのできるトラックデータを割り当てるに足る量の物理ブロックが必要であることがわかるだろう。ブロック番号スペースは、フローの最初から最後までの全実行をカバーする必要がある。
【０１３０】
トラックに状態復帰がある場合、トラックを実行しているワーカのためのトラックデータスペースは、空の状態に初期化され、割り当てのための元の開始点を与えられる。
【０１３１】
割り当ては、トラックが実行されるとワーカ論理プロセッサに関連する論理で行われる。コピーバックステートマシンは、この空間の特定の位置を、後のグローバルコミット処理で、ストアと関連付ける。
【０１３２】
コピーバックステートマシンは、統合ジョブキューを、利用している各統合ステートマシンについてメモリに書き込む。これにより、統合ステートマシンがアクセスするべきトラックデータブロックが記載される。これがメモリ経由で行われるので、なるべく圧縮状態に維持するべきである。
【０１３３】
各論理プロセッサのメタデータは別個に格納される。一部の実施形態では、論理プロセッサのメタデータは、プログラム正確さアドレス、サイズ、及びロード／ストア指標の線形アレイである。これは、位置合わせマーカ及びグローバルコミットマーカ、さらに複製されたストアマーカが含まれる。これはさらに、分岐の方向及び間接分岐対象も含んでよい。さらに、中間レベルキャッシュで受信された無効の記録も含んでよい。
【０１３４】
コアがデータの元のプログラムアドレスにロードする場合、ハードウェアは、アドレスとサイズとを得て、エンタデータリストに追加する。ワーカが一次アクセス可能なデータキャッシュラインからロードする場合には、（設計に便利な場合）、ダーティな場合には、中間レベルキャッシュに書き戻しを強制した後で共有させる。便利ではない場合には、ラインを一次アクセス不可能にして、「現在ではない」にしてよい。これらアクセションのいずれであっても、このワーカと協働していない論理プロセッサによってこのラインが将来格納された場合には通知がいくようにすることができる。
【０１３５】
実行モードのワーカからの上位ストアは、データキャッシュに書き込むためにデータキャッシュの所有権を必要としない。上位ストアは、共有状態のラインに書き込むことができるが、ラインはトラックによりアクセス可能でなければならない。Ｃａｔａｌｉｎａワーカから上位のストアがデータキャッシュラインに書き込まれた場合には、そのラインは、そのワーカのみがアクセス可能となる。そのラインが以前に何であったかに関わらず、トラックデータに変換される。ここで、ラインがダーティな場合には、一部の実施形態では、既にトラックデータになっており現在になっている場合を除き、上位のストアが書き込まれる前に強制的に書き戻される。
【０１３６】
このために、あるデータキャッシュラインへの上位のストアを処理するときには、そのデータキャッシュラインについての所有権は不要である。
【０１３７】
これは実際にトラックデータのストアであるために、中間レベルキャッシュは、元のプログラムアドレスラインの所有権を必要としたり、要求したりしない。トラックデータラインの所有権を有している。
【０１３８】
これは、他のトラックがこのラインに格納しているかもしれないために重要である。統合エンジンは、コミットするために元のプログラムアドレスラインの所有権を得る必要がある。他の中間レベルキャッシュは、ラインを共有して、トラックにより読み出すことができてよいが、それを所有することはできない。ここに記載する条件のために、所有する必要も、所有を要求する必要もない。
【０１３９】
これは、１つの中間レベルキャッシュを統合に利用しておりコミットしており、元のプログラムのアドレスラインの所有権を要求しているが、他のトラックも、共有状態でそのラインを維持して、読み書き両方を行うことができる、ことを意味している（記載するように、書き込みによりトラックデータに変換される）。
【０１４０】
データキャッシュミスが生じると、そのラインは、中間レベルキャッシュから要求されるが、これはいつも通りである。
【０１４１】
コアがデータの元のプログラムアドレスに格納する際、ハードウェアはアドレス及びサイズを得て、メタデータリストに追加する。
【０１４２】
データキャッシュでは、元のプログラムデータブロック及びすべてのグローバルコミットポイントのトラックデータブロックを全て同じ位置に配置する。これらは全てブロックの元のプログラムアドレスによりアドレスされる。
【０１４３】
このワーカがアクセス可能なすべてのキャッシュラインの現在のビットは、グローバルコミットマーカが上位になったときクリアされる。ラインに対する書き戻しが成功すると、「現在」に設定される。ラインが中間レベルキャッシュに書き戻されると、これも「現在」に設定される。中間レベルキャッシュからのリフィルがあると、ダーティな場合、ラインは「現在ではない」と設定されるべきであり、中間レベルキャッシュの現在ではないに設定されるべきである。そうではない場合には、データキャッシュの現在に設定される。現在のビットは、データがなくても中間レベルキャッシュから応答があると、このように設定される。
【０１４４】
ワーカが、現在のビットがオフのダーティなデータキャッシュラインに、上位ストアがデータキャッシュに配置される前に、このストアを書き込もうとすると書き戻しが生じるが、無効化は生じない。ビットは、このライトバックをセットされ、これにより、中間レベルキャッシュが、新たなトラックデータブロックの割り当てを促される。データキャッシュラインの書き戻しを行うと、現在のビットが設定される。適切な場合に上位ストアの書き込みに成功すると、引き起こされる書き込みの後に、ラインが「現在」に設定される。
【０１４５】
このラインにアクセス権を持つワーカが、一次アクセス可能なダーティなデータキャッシュラインに、上位ストアがデータキャッシュに配置される前に、上位ストアを書き込もうとすると書き戻しが生じるが、無効化は生じない。データキャッシュラインの書き戻しを行うと、現在のビットが設定される。適切な場合に上位ストアの書き込みに成功すると、呼び出す書き込みの後に、ラインが「現在」に設定される。適切な場合に上位ストアの書き込みに成功すると、引き起こされる書き込みの後に、ラインが「現在」に設定される。
【０１４６】
このラインにアクセス権を持つワーカが、一次アクセス可能なクリーンなデータキャッシュラインに、上位ストアを書き込もうとすると、中間レベルキャッシュは信号を受け取り、ダーティな場合には最後のレベルキャッシュにこのラインを書き戻して、新たなトラックデータブロックのために新たな物理アドレスを無条件に取得するよう促される。上位のストアの書き込みに成功すると、「現在」という状態に設定される。
【０１４７】
上位ストアの書き込みが、現在のビットがオフのクリーンなデータキャッシュライン（Ｅ状態）にヒットすると、中間レベルキャッシュが信号を受け取り、ダーティな場合には、このラインのコピーを最終レベルキャッシュに無条件に書き戻して、新たなトラックデータブロック用の新たな物理アドレスを取得するよう促される。中間レベルキャッシュのダーティなデータは、同じグローバルコミットスパンに、データキャッシュに今行こうとしているダーティなデータとして移動しない。データキャッシュラインは、上位のストアをそれに書き込んだ結果、「現在」という状態を得る。
【０１４８】
上位ストアが存在しており、そのラインが、データキャッシュでＥまたはＭ状態ではない場合には、所有権要求のための読み出しが、中間レベルキャッシュからのラインについて行われるが、これは通常通りである。
【０１４９】
データキャッシュは、中間レベルキャッシュに、ラインを「書き戻し」、新たなトラックデータブロックを割り当てるよう要求することができる。そのラインが中間レベルキャッシュでダーティな場合には、書き戻されて、新たなトラックデータブロックが割り当てられる。ラインが中間レベルキャッシュでクリーンな場合であっても、要求が無条件に新たなトラックデータブロックの割り当てを指定している場合もある。新たなトラックデータブロックを割り当てる場合には、そこにあったブロックで置き換える。データは同じである。
【０１５０】
中間レベルキャッシュにすべての書き戻しを行うと、データキャッシュ「現在のビット」（この書き戻しに従ってセットされる前）が中間レベルキャッシュに送られる。データキャッシュの書き戻しには２つの理由が存在している。つまり、データキャッシュの従来の立ち退き、または新たな上位ストアが、現在ではないダーティなデータキャッシュラインにヒットした場合である。データキャッシュは、新たな上位ストアが、現在ではないダーティなデータキャッシュラインにヒットした場合にアサートされるビットを送る。
【０１５１】
中間レベルキャッシュは新たなトラックデータブロックを割り当てる。
【０１５２】
一部の実施形態では、キャッシュ及びトラックデータディレクトリがリザーブされているメモリに、各トラックについて格納されている。１つのラインのデータは、トラックデータブロック番号及びグローバルコミット番号だけである。このキャッシュは、トラックがアクセス可能であるが、一次からはアクセス可能ではないダーティなトラックデータブロックが立ち退かされる場合のみに（新たなトラックデータブロックの割り当てとは関係がない）書き込まれる。
【０１５３】
一部の実施形態では、トラックデータディレクトリサマリと称されるトラックデータディレクトリをミラーする別の構造がある。ワーカ論理プロセッサにより中間レベルキャッシュミスがある場合には、トラックデータディレクトリのその場所をカバーするビットが、トラックデータディレクトリサマリから読み出される。通常は、これは無効であり、トラックデータディレクトリミスを示す。この場合には、中間レベルキャッシュヘノリフィルをブロックの元のプログラムアドレスから得るべきである。このデータは既に中間レベルキャッシュ内に、一次アクセス可能バージョンとして存在させておいてよい。この場合には、このバージョンは単に、ワーカからもアクセス可能としてよい。サマリーがヒットの可能性を示している場合には、トラックデータディレクトリは、実際にヒットであることが明らかになった場合には、最新のトラックデータブロック番号を取得するべくアクセスする必要がある。論理は、これをブロックのアドレスに変換することができる。そしてブロックは、リング経由で要求される（ミスの場合で通常行われているように）。
【０１５４】
新たなトラックデータブロックの割り当ては、中間レベルキャッシュから最終レベルキャッシュへの書き戻しの特殊な形態である。中間レベルキャッシュがラインを最終レベルキャッシュに書き戻したいと望む場合、このラインは一次アクセス可能ではないが、有効な現実的物理アドレスを有していないので、書き戻しを進める前に、新たなトラックデータブロックをこのために割り当てる。書き戻しは、新たなトラックデータブロックを割り当てることで得られる物理アドレスに進む。新たなトラックデータブロックの割り当てプロセスは、本明細書の前のセクションで説明済みである。
【０１５５】
各トラックでは、実行がグローバルコミットポイントに別個にヒットする。グローバルコミットポイントマーカとして機能する特別なアドレスへのストアが存在している。これは新たにグローバルコミット番号を増分させる。自身のトラックのグローバルコミット番号が増分させられる。これは、中間レベルキャッシュに関するＤＴＳＥ論理の一部として維持される。上述したように、これによりストアが新たなデータブロックに進む。そしてデータキャッシュ及び中間レベルキャッシュ両方に関する「現在のビット」をクリアする。
【０１５６】
ストアは、グローバルコミットポイントでのみグローバルに見ることができる。ロード及びストア両方をグローバルに投機することができるので、次のグローバルコミットポイントまでは、無効スヌープによるヒットを受けやすい。
【０１５７】
トラックは、このコミットスパンが完了したことを示すフラグをセットする。チェッカーステートマシンは、このフラグをすべてのトラックから受け取るのを待っている。
【０１５８】
前述したように、各ワーカ論理プロセッサはストア正確さキャッシュを有している。このキャッシュは、１つのワーカのストアが同じ位置合わせスパン内の別のワーカのストアには、これらが同じストアである場合を除いてヒットしてはならない、という規則を実施する。また、１つのワーカのロードが、同じ割り当てスパンの別のワーカのストアに衝突してはいけないという規則も実施する。まずロードを先に処理してロードをその後で処理するという規則も実施する。ストアをまず処理してロードを後で処理する場合には、ロード正確さキャッシュにより捉えられる。
【０１５９】
上述したように、各ワーカ論理プロセッサは、ロード正確さキャッシュを有している。ロード正確さキャッシュは、フローに入るときから現在の一時的なグローバルコミットポイントまでで格納されたすべてのバイトを特定する。特に、論理的にバイトを最後に書いたワーカを特定する。
【０１６０】
コピーバックステートマシンは、コピーバックリストに働きかけて、示されているストア全てを元のプログラムアドレス位置に統合して、グローバルに見えるようにする。コピーバックリストは、プログラム順序ではないストアの集合体を表している。したがってコピーバックリストに表されるすべてのストアを、原子的にグローバルに見えるようにする必要がある。外部からは、これらすべてのストアを見ることができるか、またはいずれも見えないようにする必要がある。
【０１６１】
内部的な課題（実行のみの分岐違反または格納違反またはロード違反など）に起因したフロー退出がある場合に、フロー退出の前の最後のグローバルコミット点に復元する。これにより、コピーバックステートマシンが終わるまで待つことになるので、違反前の「最後の」グローバルコミット点となる。
【０１６２】
グローバルに投機的なロードにヒットしたスヌープが無効になった等のある外部の理由からフロー退出がある場合には、関連する命令が、コピーバックステートマシンに解放されたスパンにある可能性がある。こうではないとわかっている場合を除き、これにより、コピーバックステートマシンが現在作業しているコピーバックリストにグローバルにコミットすることなく、直近の退出がなされてしまうだろう。
【０１６３】
データキャッシュとして見ると、統合ステートマシンは、別のデータキャッシュと変わらない。統合ステートマシンがキャッシュラインにアクセスする場合、これにより、データキャッシュがスヌープされて、データキャッシュでラインがダーティな場合に書き戻しが強制される。
【０１６４】
修正されたブロックは、複数の中間レベルキャッシュをスパンしている場合があるので、少し同期している。
【０１６５】
ブロックは全て元のプログラムアドレスブロックにアクセスする（トラックデータへのアクセスのみが読み出され、ＯＫである）。一時的なビットがこのために利用されてよい。
【０１６６】
最適化された（スレッドにされた）コードを実行している間に、元のコードが、最適化されたコード及び同時に実行されている関連しないコードが生成したストアのために変化することがある。これに対する防御策として、ＸＭＣ  Ｇｕａｒｄａｔａキャッシュ（ＸＧＣ）４０９が利用される。このキャッシュは、最適化されたコードを生成するためにアクセスされた全てのページのアドレス及びスヌープ無効化ヒットの場合に利用される最適化された領域のＩＤを保持する。領域ＩＤは、集合が保護されている領域（キャッシュライン）に接触するすべての静的コードラインを示す。図７は、一部の実施形態におけるＸＧＣ４０９の用途を示している。
【０１６７】
最適化されたコードを実行する前に、コアは、ＸＧＣのすべてのエントリが退出して、且つ、スヌープされたり置き換えられたりしていないことを保証する。この場合に、最適化されたコードの実行が許可される。
【０１６８】
もしも、最適化されたコードの実行中に、別の論理コアが元のページのいずれかにおけるデータを変更する場合には、ＸＧＣは、スヌープ無効化メッセージを受け取り（コヒーレンシー領域の他のキャッシュエージェント同様に）、コアのいずれかに対して、一定のページに関連する最適化されたコードの実行をアボートして、そのページを利用する、保持している任意の最適化されたコードエントリポイントを無効化する必要がある。
【０１６９】
スレッド実行モードの実行中に、全てのストアをＸＭＣ４０９に対してチェックして、セルフ修正コードから守る。もしもストアがホットコード領域にヒットする場合には、違反をトリガする。
【０１７０】
一部の実施形態では、スレッド生成器が、後で正確さをチェックするいくつかの推定を行う。これは主にパフォーマンスの最適化である。この推定の一例が、呼び出し―リターンの対である。スレッド生成器は、リターンがその呼び出しに戻る、と想定してよい（大多数の場合それで正しい）。スレッド生成器は、全ての呼び出された関数を１つのスレッドにして、以下のコードを（リターンの後のもの）、他のスレッドで実行させる。以下のコードは、リターンを実行する前に実行開始して、スタックが探されるために、実行が間違っていることもある（たとえば関数がリターンアドレスをスタックに書き込むときに、元のリターンアドレスを上書きしてしまう等）。このようなケースが起こらないようにするために、各スレッドが、アサーションハードウェアブロックにアサーションを書き込むことができる。アサーションは、両方のスレッドがそのアサーションに同意すると、満たされる。スパンにコミットするためには、アサーションが満たされねばならない。
【０１７１】
＜ＩＩＩ．ソフトウェア＞
動的スレッド切り替え実行（ＤＴＳＥ）ソフトウェアは、「フロー」と称されるコードの重要な静的サブセットを定義するために、ハードウェアが収集したプロファイリング情報を利用する。一部の実施形態では、このソフトウェアが自身の作業メモリスペースを有している。フローの元のコードは、この作業メモリで繰り返される。作業メモリのコードのコピーは、ソフトウェアにより変更することができる。元のコードはそっくり元の形態のままで、メモリの、元の位置に維持される。
【０１７２】
ＤＴＳＥソフトウェアは、ＤＴＳＥ作業メモリのフローを、複数の論理プロセッサで実行することができる複数のスレッドに分解することができる。これは、論理プロセッサがこの動作なしに完全には利用されない場合に行われる。これは、ハードウェアが実行可能な５つのことにより可能となる。
【０１７３】
いずれにしても、ＤＴＳＥソフトウェアは、ＤＴＳＥ作業メモリにコードを挿入して、もっと数の多い論理プロセッサの（おそらくはＳＭＴの）ハードウェアプロセッサでの処理を制御する。
【０１７４】
一部の実施形態では、ハードウェアは、実行されているコードのプロファイリングを続けるべきである（これには、ＤＴＳＥソフトウェアが処理したフローが含まれる）。ＤＴＳＥソフトウェアは、変化する振る舞いに応えて、前のコードの処理を改定する。したがって、ソフトウェアは、ペースは遅いかもしれないが、処理するコードをシステマチックに向上させることができる。
【０１７５】
＜フローの定義＞
【０１７６】
ＤＴＳＥハードウェアが、リストのトップに新たなＩＰを有している場合、ソフトウェアはこのＩＰを、新たなフローのプロファイルルートとする。ソフトウェアは、ハードウェアに、このプロファイルルートからプロファイルをとらせるようにする。一実施形態では、ハードウェアは、次回に実行がプロファイルルートＩＰにヒットするときにプロファイルを開始して、その後で大体５０，０００個の動的命令について１つの連続したショットで実行されるようにする。メモリのバッファは、全てのロード及びストアのアドレス、直接の分岐の方向、及び間接分岐の対象で満たされる。リターンも含まれる。これにより、ソフトウェアは、静的コードのプロファイルルートで開始されて、静的コードによってプロファイルされた経路をトレースすることができるようになる。各分岐の実際の対象を発見して、全てのロード及びストアの対象アドレスがわかるようにする。
【０１７７】
このプロファイル経路がヒットするすべての静的命令は、フローにあるよう定義される。このプロファイル経路がヒットするすべての制御フロー経路は、このフロー内にあるよう定義される。このプロファイル経路がヒットしていないすべての制御フロー経路は、フローを去るものとして定義される。
【０１７８】
一部の実施形態では、ＤＴＳＥソフトウェアが、ハードウェアを、同じロートから再度プロファイルをとるようにすることができる。フローにまだない新たな命令または新たな経路がフローに追加される。ソフトウェアは、命令または経路をフローに追加しないプロファイルをとったときに、これ以上プロファイルを要求しないようにする。
【０１７９】
＜フローの維持＞
【０１８０】
フローは、定義された後でモニタ及び改定される。これは、新たなコードを生成した後で、複数のスレッドにおいても起こりうる。フローを改定する場合には、通常これはコード、おそらくスレッドコードの再生が含まれる。
【０１８１】
＜非効率なフローの劣化（aging）＞
【０１８２】
一部の実施形態では、平均長さがＬの「指数的に劣化する」フローを各フローについて維持する。一実施形態では、Ｌが５００，０００に初期化されている。フローを実行するとき、フローで実行されている命令数をＮと想定する。すると、以下のように計算される。Ｌ＝０．９＊（Ｌ＋Ｎ）。Ｌが１つのフローについて一定数未満になると（たとえば１００，０００）、フローを削除する。これはさらに、これらの命令がホットＩＰについて利用可能であることを示しているが、ここでも一部の他のフローにある場合は除く。
【０１８３】
＜フローの統合＞
【０１８４】
一部の実施形態では、フローを実行するときに、一定数の動的命令の前に（たとえば２５，０００）、ホットコードの実行ではなくて、そのホットコードエントリポイントを設定してプロファイルをとらせる。次にこのホットコードエントリポイントがヒットしたとき、プロファイルを、エントリポイントから一定数の命令（たとえば５０，０００）についてとるようにする。これにより、このフローについてのプロファイルの集合体に追加される。
【０１８５】
フローにはいずれの新たな命令及び新たな経路であっても追加することができる。一部の実施形態では、フローの分析および子コードの生成を、この集合体のなかの新たなプロファイルでやりなおす。
【０１８６】
＜トポロジー分析＞
【０１８７】
一部の実施形態では、ＤＴＳＥソフトウェアがトポロジー分析を行う。この分析は、以下の動作のうち１以上から構成されてよい。
【０１８８】
＜基本ブロック＞
【０１８９】
ＤＴＳＥソフトウェアは、フローのコードを基本ブロックに分割する。一部の実施形態では、プロファイリングで観察された結合部（join）のみを結合部として維持する。明らかな対象を有するフローに分岐があり、この対象がフローにある場合には、この結合部がプロファリングで見られなかった場合には、この結合部は無視する。
【０１９０】
プロファイリングでとられたことが観察されなかったすべての制御フロー経路（エッジ）は、「フローを退出する」としてマークされる。これには、常にとられることが観察された分岐についての方向から落ちること（fall though）（とられていない分岐）が含まれる。
【０１９１】
プロファイルの分岐の単調性（無条件の分岐を含む）は、対象が結合部ではない限り、基本ブロックでは終了しない。呼び出し及びリターンによって基本ブロックが終了される。
【０１９２】
上述したことを行った後で、ＤＴＳＥソフトウェアは、基本ブロック集合体、及び、基本ブロック間の「エッジ」の集合体を得ることになる。
【０１９３】
＜トポロジールート＞
【０１９４】
一部の実施形態では、各プロファイルを利用して、フローの静的コード全体を通るようガイドする。この各呼び出しを通る間に、呼び出し対象基本ブロック識別子をスタック及び各リターンにプッシュで配置して、スタックをポップさせる。
【０１９５】
コードストリーム全体では均衡のとれた呼び出し及びリターンを有していたとしても、フローはこれより多いまたは少ない開始及び終了点を有する動的実行の断片から得られる。呼び出し及びリターンがフローで均衡されていると思う理由はない。
【０１９６】
もしあれば、遭遇した各基本ブロックは、スタックの上位の基本ブロック識別子で特定されるプロシージャにあるとして命名される。
【０１９７】
プロファイルルートからのコードは、いくつかの場合において、最初はどのプロシージャにない場合がある。このコードには、プロファイルの後で、プロシージャ内として特定される箇所で、再度遭遇する可能性がある。もっと可能性のあるのは、どのプロシージャにもないコードが存在することである。
【０１９８】
トポロジー分析の質は、トポロジー分析に利用するルートに応じて決まる。通常は、良好なトポロジー分析を得るために、ルートは、フロー内にあるとして定義される静的コードの一番外のプロシージャにあるべきである（つまり、「どのプロシージャにもない」コードにあるべきである）。ハードウェアが発見するプロファイルルートはその可能性がない。したがってＤＴＳＥソフトウェアは、トポロジー分析が利用するトポロジールートを定義する。
【０１９９】
一部の実施形態では、どのプロシージャにもない基本ブロックのうち、コードＲのサブセットが、Ｒの任意の命令から始まるが、フローのエッジのみを利用するよう（つまり、少なくとも１つのプロファイルでとられると観察されたエッジ）、そしてフローのすべての他の命令に対して経路があるように特定される。Ｒは、空の可能性がある。Ｒが空の場合には、トポロジールートをプロファイルルートとして定義する。Ｒが空ではない場合には、Ｒで一番数の小さいＩＰ値を、トポロジールートとして選択する。ここからは、「ルート」をトポロジールートの意味で利用する。
【０２００】
＜プロシージャのインライン＞
【０２０１】
従来のプロシージャのインライン処理は、呼び出し及びリターンのオーバヘッドを減らすことを意図して行われていた。ＤＴＳＥソフトウェアは、コードの振る舞いについての情報を維持する。プロシージャのコードは、どのコードで呼び出すかに応じて異なる振る舞いをしている。したがって一部の実施形態では、ＤＴＳＥソフトウェアが、このプロシージャに対するすべての異なる静的呼び出しについて、それぞれプロシージャのコードについての情報について別のテーブルを維持する。
【０２０２】
このコードの中間の段階は実行不可能である。分析を行う場合、ＤＴＳＥソフトウェアは実行可能なコードを生成する。この直近の状態では、インラインプロシージャにおいてコードの重複は生じない。プロシージャインラインによって、プロシージャのコードに複数の名称が割り当てられ、各名称に対して別の情報が維持される。
【０２０３】
一部の実施形態では、この処理は再帰的である。外部プロシージャＡが、３つの異なるサイトからプロシージャＢを呼び出し、プロシージャＢが、４つの異なるサイトからプロシージャＣを呼び出すとすると、プロシージャＣには１２個の異なる振る舞いがある。ＤＴＳＥソフトウェアは、このコードへの１２個の異なる呼び出し経路に対応するプロシージャＣのコードに関する情報の異なるテーブル、および、このコードの１２個の異なる名称を維持する。
【０２０４】
ＤＴＳＥソフトウェアがこのフローの実行可能なコードを生成する場合、その数は、このコードの静的コピーの数１２よりずっと少ない可能性がある。コードの同じビットの複数のコピーは対象ではなく、殆どの場合には、呼び出し及びリターンのオーバヘッドは些細なものである。しかし一部の実施形態では、ＤＴＳＥソフトウェアは、このコードに、各呼び出し経路の異なる振る舞い情報を維持する。ＤＴＳＥが維持する振る舞い情報の例は、とりわけ、命令への依存度であり、ロード及びストアの対象及び分岐の可能性である。
【０２０５】
一部の実施形態では、ＤＴＳＥソフトウェアが、元のコードに静的に呼び出し命令がある場合、呼び出されたプロシージャから戻る（リターン）ことが常に、呼び出しに続く命令に行くことである（プロファイリングで生じないことが観察されていない限り）、と想定する。しかし、一部の実施形態では、これが実行において正確であることがチェックされる。ＤＴＳＥソフトウェアが生成するコードはこれについてチェックする。
【０２０６】
一部の実施形態では、ＤＴＳＥが生成する最後の実行可能なコードが、元のコードの呼び出し命令について、プログラムのアーキテクチャスタックについてアーキテクチャリターンアドレスを後押しする（push）命令が存在している可能性がある。これが、生成されたコードが全く異なる位置にあり、スタックの誤った値を推し進めることがあることから、生成されたコードの呼び出し命令によっては実行できないことに留意されたい。このスタックにプッシュされた値は、ホットコードにとっては利用価値があまりない。プログラムのデータスペースは、常に正確に維持される。複数のスレッドが生成されている場合には、どのスレッドがこれを行うかはあまり重要ではない。いつでもどこでも行うことができてよい。
【０２０７】
一部の実施形態では、ＤＴＳＥソフトウェアが、プロシージャが非常に小さい場合には、特定のスレッドに物理的に列をそろえられるプロシージャの一部の物理的コピーを配置する、という選択を行うことができる。さもなくば、物理的コピーがここにはなく、コードに向かう何らかの制御転送命令があることになる。これについては、「コード生成」というタイトルで詳述する。
【０２０８】
一部の実施形態では元のコードのリターン命令について、ＤＴＳＥが生成する最終的な実行可能コードに、プログラムのアーキテクチャスタックからのアーキテクチャリターンアドレスをポップさせる命令が存在する。ＤＴＳＥソフトウェアがこのリターンの対象であると信じるアーキテクチャの（でもホットコードではない）リターン対象ＩＰは、コードに開示される。一部の場合には、これはホットコードの直近の定数である。他の場合には、これがＤＴＳＥメモリの、おそらくはスタック構造内に格納されている。これはプログラムのデータスペースの一部ではない。スタックからポップする値は、ＤＴＳＥソフトウェアがこのリターンの対象であると信じるＩＰと比較されてよい。これら値が異なっている場合にはフローを終了させる。複数のスレッドが生成されている場合には、どのスレッドがこれを行うかはあまり重要ではない。いつでもどこでも行うことができてよい。
【０２０９】
一部の実施形態では、ＤＴＳＥソフトウェアが、プロシージャが非常に小さい場合には、特定のスレッドに物理的に列をそろえられるプロシージャの一部の物理的コピーを配置する。さもなくば、物理的コピーがここにはなく、コードに向かう何らかの制御転送命令があることになる。これについては、「コード生成」というタイトルで詳述する。
【０２１０】
＜バックエッジ＞
【０２１１】
一部の実施形態では、ＤＴＳＥソフトウェアが、フローに設定される最少バックエッジを発見する。最小バックエッジセットは、基礎ブロック間のエッジセットであり、これらエッジの作成時に、閉じたループ経路がないようにする。セットは、エッジ全てがセットから取り除かれた場合に閉じたループ経路があるようにする、という意味で最少であるべきである。一部の実施形態では、そのセットのすべてのバックエッジが作成された場合であってもコードが完全に接続されているという特徴がある。ルートから、基礎ブロックの集合全体のすべての命令を導き出すことができることが可能である。
【０２１２】
各プロシージャは別個に行われる。したがって呼び出しエッジ及びリターンエッジをこの際に無視することができる。
【０２１３】
別個の話として一部の実施形態では、再帰的な呼び出し分析が実行される。これは、ネスト状の呼び出しツリーを探すことで行われる。上部から始まり、ネスト状の呼び出しツリーの１つの経路に、その経路に既に存在しているプロシージャに対する呼び出しがある場合には、再帰的な呼び出しがある、ということになる。再帰的な呼び出しは、その呼び出しから定義されるループ及びバックエッジのことを指す。したがって、別個の話として、呼び出しエッジは、「バックエッジ」として示される場合がある。
【０２１４】
一部の実施形態では、アルゴリズムは、ルートから始まり、基本ブロック間のすべての経路を通る。基本ブロックの内部は重要ではない。加えて、既に定義されているバックエッジは通らない。ルートＰの任意の線形経路上で、Ｐに既に存在しているＳにバックブロックが遭遇した場合、Ｓで終了するこのエッジが、バックエッジとして定義される。
【０２１５】
＜分岐の再収束する点を定義する＞
【０２１６】
一部の実施形態では、単調にとらえられるために予測できないような分岐が存在する。この分岐が、実行中に誤った方向に向かうと、分岐の予測ミスになる。それだけではなく、フローが終了してしまう。これら分岐は、フローのコード処理において、全ての目的において完全に単調であるとみなされる（つまり、条件分岐ではない）。
【０２１７】
間接分岐は、既知の対象リストを有する。本質的には、複数対象の条件分岐である。ＤＴＳＥソフトウェアは、これを、比較及び分岐の連続ストリングとして、またはバウンステーブルで符号化することができる。どの符号化を行う際にも、フローを終了させるという別の対象が残されている。これは、本質的には最終的に単調な分岐である。間違った方向に行くと、フローを終了させる。既知の対象に対する複数の分岐は、直接条件分岐と同じであり、同じ方法で発見される再収束点を有している。そしてもちろん、予測されない単調な最後のリゾート分岐を、まったく分岐として捉えずに処理する。
【０２１８】
呼び出しとリターンとは（前述したように）特殊であり、「分岐」ではない。リターンは、再収束点である。ほかの方法で定義された再収束点を有さないプロシージャＰの任意の分岐が、その再収束点として「リターン」を有している。Ｐは、多くの場所で符号化されたリターンを有していてよい。再収束点であるために、リターンのすべての符号インスタンスを同じように取り扱う。プロシージャの任意の静的インスタンスについて、全ての符号化されているリターンが、プロシージャのこの同じ静的インスタンスに固有のまったく同じ場所に赴く。
【０２１９】
これら再収束点全てを考慮に入れて、分岐を発見することができる必要がある。一部の実施形態では、基本ブロックへのエントリポイントのみを再収束点とすることができる。
【０２２０】
分岐Ｂについては、ＢからＲのすべての制御フロー経路において、バックエッジを通る総数を最小にするような再収束点Ｒを発見する必要がある。全てが、Ｂから再収束点への全ての経路において同じ数のバックエッジを有する分岐Ｂの再収束点の組み合わせがある場合、Ｂから再収束点への経路の全部の組み合わせにおける最少の数の命令をもつ再収束点が通常は望ましい。
【０２２１】
一部の実施形態では、バックエッジ限界と分岐限界という２つのパラメータを分析中に維持する。両方の初期値は０に設定されている。一部の実施形態では、プロセスは、再収束点をまだ定義されていない全ての分岐を通り、以下の動作の１以上を実施する。これら各分岐Ｂにおいて、分岐Ｂから始まり、全ての制御フロー経路に順方向に進む。いずれかの経路がフローを終了させる場合、その経路に対する処理をやめる。もしも通る各バックエッジの数がバックエッジの限界を超える場合には、この経路を通るのをやめて、限界を超すバックエッジを通らないようにする。各経路について、その経路で基本ブロックセットを収集する。これらセット全ての交差点を発見する。この交差点のセットが空になると、この検索は不成功に終わる。交差点のセットから、ＢからＲのすべての経路におけるすべての命令が最少になるセットのメンバーＲを選ぶ。
【０２２２】
ここで、全ての経路（ＢからＲまで）の全てから「目に見える」バックエッジの数を求める。この数がバックエッジの限界を超える場合には、Ｒを拒絶する。次に、命令総数より多い数の、次に可能性のある再収束点を、目に見えるバックエッジの総数に対してテストする。最後に、バックエッジの限界を満たす再収束点を見つける、または、これ以外の可能性がないか、になる。見つけられた場合には、ＢからＲのすべての経路で再収束点がない分岐の総数を求める。これが分岐の限界を超えている場合にはＲを拒絶する。最終的には、バックエッジの限界と分岐の限界とを両方とも満たすＲを見つけるか、ほかの可能性がないか、になる。良好なＲとは、Ｂの再収束点である。
【０２２３】
一部の実施形態では、分岐Ｂの再収束点が見つかると、再収束点を見つけるための残りのアルゴリズムについて、Ｂを通る順方向の制御フローはすべて、分岐及びその再収束点の間の詳細を見ることなく、直接この再収束点にジャンプする。再収束点を通る後方制御フローも、分岐及びその再収束点の間の詳細を見ることなく、直接、マッチしている分岐にジャンプする。大切なことは、制御フローが分岐からその再収束点へと、一点に収縮されることである。
【０２２４】
一部の実施形態では、再収束点が見つかると、バックエッジの限界及び分岐の限界の両方をリセットして、まだ再収束点が見つかっていないすべての分岐を考慮する。再収束点が無事見つかった場合には、いくつかを見えなくする。こうすると、前は不成功に終わっていた分岐の再収束点を、バックエッジの限界及び分岐の限界の値が低くても、見つけることができる場合がある。
【０２２５】
一部の実施形態では、再収束点が見つけられなかった場合、次の分岐Ｂを試す。再収束点をまだ見つけていないすべての分岐を試しても不成功に終わった場合には、分岐の限界を増分して、分岐を再度試す。一部の実施形態では、潜在的な再収束点が分岐の限界のために拒絶された場合には、分岐の限界を０にリセットして、バックエッジの限界を増分してから、再度試す。
【０２２６】
一般的には、分岐の限界が０以外に設定されているという理由で、分岐Ｂから再収束点Ｒまでの制御フロー経路上で再収束点が見つからない他の分岐Ｃがある可能性がある。これら分岐Ｃそれぞれには、Ｂが持つものと同じ再収束点が割り当てられている（つまりＲ）。分岐セットＢ及びこれらの分岐Ｃは、１つの「分岐群」であると、定義される。これは、全てが同じ再収束点を持つ分岐群である。一部の実施形態では、これは、分岐から再収束点までの全てが「見えなく」なる前に処理される。群として処理されない場合には、分岐に再収束点が割り当てられるとすぐに、その群の他の分岐の再収束点を発見する必要のあるすべｔネオ経路を見えなくする（まだ再収束点がない他の分岐を見えなくするのは言うまでもなく）。
【０２２７】
一部の実施形態では、全ての分岐に再収束点を定義する。「線形経路のバックエッジ数」とは、異なるバックエッジの数のことを意味している。１つの線形経路において複数回同じバックエッジが生じる場合には、１つのバックエッジのみとしてカウントする。基本ブロックＥが分岐Ｂに定義された再収束点であるからといって、分岐Ｄについて定義された再収束点として利用できないわけではない。
【０２２８】
＜一括アンロール（en mass unrolling）＞
【０２２９】
一部の実施形態では、一括アンロールを実施する。一括アンロールでは、コードの限られた量の静的複製を作成して、特定の並列形態を晒すことを可能とする。
【０２３０】
これらの実施形態では、分岐ネストレベルそれぞれについて全フローをＮ回複製する。Ｎの良好な値は、最終コードに望ましいトラックの数であってよいが、他の数にしてもいくらかの利点は生じるだろう。このように複製することで、複数（おそらくは全て）のトラックで同じコードを持つ機会が与えられ、１つのループの異なる繰り返しで作業することができるようになる。ループの異なる繰り返しを異なるトラックに行うことはない。ループのなかには、繰り返しにより分離されたり、細かい粒度に分離されたり、ループ内の命令ごとに分離されたりするものも出てくるだろう。もっとよく見られることが想定されるのは、１つのループが命令ごとに両方の方法で分離される、ということである。好ましいことが起こるようになる。繰り返しによる分離が単に許可される。
【０２３１】
この時点では、ループ本体の静的コピーが１つだけ存在している。１つの静的コピーのみが存在する場合には、動的複製を行わずして複数のトラックにはありえず、これは非生産的である。このコードを複数のトラックに存在させ、異なる制御フロー経路（異なる繰り返し）で利用させるためには、複数の静的なコピーが必要である。
【０２３２】
＜ネスティング＞
【０２３３】
グループの分岐からグループが定義する再収束点までの経路に、少なくとも１つの目に見えるバックエッジを有する分岐群を、「ループ」と定義する。特定の分岐群が「目に見える」及び「目に見えない」についての区別は、再収束点分析で定義された通りである。加えて、目に見える分岐からその再収束点までの経路にはないバックエッジも、「ループ」として定義される。
【０２３４】
バックエッジのみとして定義されるループは、バックエッジの開始部分から、バックエッジを通り、バックエッジの開始部分に戻る経路を有している経路を、「分岐から再収束点への経路」として定義されている経路を持つものとして定義される。
【０２３５】
異なるループＡ及びＢを与えられると、Ｂの群のすべての分岐が、Ａの分岐からＡについて定義された再収束点までの経路にある場合、ＢはＡ内にネスト状に入れ子になっている（ネストされている）。分岐からその収束点までの経路にないバックエッジとして定義されるループは、その他のループ内にネストされているとは定義されず、他のループがその内部にネストされている可能性があり、通常はその通りである。
【０２３６】
バックエッジとしてのみ定義されているループは、このバックエッジに関連付けられている。他のループは、ループの分岐からループの再収束点までの経路の目に見えるバックエッジに関連付けられる。特定の分岐群が「目に見える」及び「目に見えない」についての区別は、再収束点分析で定義された通りである。
【０２３７】
以下の定理及び補題の１以上をネストの実施形態に適用することができる。
【０２３８】
定理１：ＢがＡ内にネストされている場合には、ＡはＢ内にネストされてはいない。ＢがＡにネストされているとする。すると、Ｂには分岐があり、Ｂのすべての分岐が、Ａからその再収束点までの経路にあることになる。Ａが分岐を含まない場合には、定義として、ＡはＢにネストされていない。Ａの分岐Ｘが、Ｂの分岐からその再収束点までの経路にある場合には、ＸがＢの一部であるか、Ｂには見えない、ということになる。ＸがＢの一部である場合には、Ａの全てがＢの一部であり、ループＡ及びＢに差がないことになる。したがってＸがＢには見えないことになる。これはＡの再収束点は、Ｂの定義の前に定義されていて、Ａの分岐がＢには見えないようになっている必要があることを意味している。したがってＢがＡには見えない。Ｂのすべての分岐はＡからその再収束点までの経路にあり、目に見える。これによりＢはＡの一部であり、ＡとＢとの間に差がないことになる。したがってＸを想定することはできない。
補題１：分岐Ｂ２が分岐Ｂ１からその再収束点までの経路にある場合には、Ｂ２からその再収束点までの全経路も、またＢ１からその再収束点までの経路にあることになる。
Ｂ１からその再収束点Ｒ１までの経路はＢ２につながる。したがって、Ｂ２からのすべての経路に続く。Ｂ１が再収束する場合には、Ｂ２も再収束する。まだＢ２について特定されている「再収束点」に到達していない場合には、Ｒ１がより良い点である。再収束点のアルゴリズムは、最良の点を見つけるので、Ｒ１を見つけている必要がある。
定理２：ループＢの１つの分岐が、ループＡの分岐からその再収束点までの経路にある場合には、ＢがＡ内にネストされている。
Ｘが、ＡからＡの再収束点ＲＡまでの経路にあるＢの分岐であるとする。補題１では、Ｘからその再収束点ＲＢまでの経路が、ＡからＲＡまでの経路にある。ループＢは、ＸからＲＢまでの経路の上のすべての分岐の集合体である。これらは全て、ＡからＲＡまでの経路の上にある。
定理３：ＢがＡ内にネストされており、ＣがＢ内にネストされているとすると、ＣはＡ内にネストされていることになる。Ｘを、再収束点ＲＣをもつＣの分岐であるとする。するとＸはＢ内の分岐ＹからＢの再収束点ＲＢまでの経路にあることになる。補題１では、ＸからＲＣまでの経路が、ＹからＲＢまでの経路の上ｎある。Ｂの分岐Ｙは、Ａの分岐ＺからＡの再収束点ＲＡまでの経路にある。補題１から、ＹからＲＢまでの経路はＺからＲＡまでの経路上にある。したがってＸからＲＣまでの経路は、ＺからＲＡまでの経路の上にある。したがってＸは確実にＺからＲＡの経路にある。これはＣ内の全てのＸについてあてはまるしたがってＣはＡ内にネストされている。
定理４：１つのバックエッジは、１つのループ１つのみに「関連付けられている」。目に見える分岐からその再収束点までの経路にはないバックエッジ自身はループである。目に見える分岐からその再収束点までの経路にバックエッジがある場合には、この分岐が属している分岐群は、少なくとも１つのバックエッジを有することになるので、ループである。
たとえばループＬに関連づけられたバックエッジＥがあるとする。Ｍを別個のループであるとする。ＬまたはＭが分岐のないループである場合（つまり、これらが単に１つのバックエッジである場合）には、定理は正しい。Ｌ及びＭ両方が分岐を有していると想定する。続いて再収束点が定義される。Ｍの再収束点がまず定義された場合には、ＥはＭからその再収束点までの経路にあるので、Ｅが隠されていることになる。後でＬに見えるようにはならない。Ｌの再収束点がまず定義された場合には、ＥはＭには隠されて、後で見えるようにはならない。
非定理５：あるフローで２度以上実行されるすべてのコードはあるループ内にある、というのは真ではない。
いずれかのループ内になく、複数回実行される、フローのなかのコードの一例が、ある分岐で終了する２つの基本ブロックである。１つの分岐のアームが、第１の基本ブロックを対象としており、分岐の他のアームが、第２の基本ブロックを対象としているとする。分岐の再収束点は、第２の分岐ブロックのエントリポイントである。第１の基本ブロックのコードは、ループ内にあるが、第２の基本ブロックのコードはループ内にはない、つまり、ループの分岐からその再収束点までの任意の経路にはないことになる。
「逆バックエッジ」とは、ループ分岐群に関連付けられているバックエッジであり、このバックエッジから順方向に進むと、ループ分岐群の再収束点が、このループ分岐群のいずれの分岐よりも前にヒットする（そしておそらくは、このループ分岐群のいずれの分岐にもヒットしない）。バックエッジは、ループ分岐群に見える場合にそのループ分岐群に関連に「関連付けられている」と称され、ループ分岐群の分岐からループ分岐群の再収束点までの経路にあることになる。
ループを抜けるループ分岐を持つ典型的な（classical）分岐では、バックエッジからの経路がまずループ分岐にヒットしてから、その再収束点にヒットする。バックエッジが逆バックエッジである場合には、このバックエッジからの経路が、まず再収束点にヒットして、そしてループ分岐にヒットする。
定理６：いずれのループ内にもないフローで２度以上実行される命令が存在する場合には、このフローが逆バックエッジを含んでいる。
【０２３９】
Ｉを、あるフロー内で２度以上実行された命令であるとする。Ｉがどのループ内にもないと想定する。このフロー内に逆バックエッジがないと想定する。
【０２４０】
ＩからＩに戻る経路には、経路Ｐがあるはずである。この経路には、少なくとも１つのバックエッジＥがあるべきである。
【０２４１】
Ｅに関連付けられているループの一部である分岐Ｂが存在していると想定する。これはつまり、Ｂが分岐群の一部であることを示している。Ｅは分岐群から見え、Ｅは、分岐群の分岐からその再収束点までの経路上にある。
【０２４２】
Ｅからの順方向の経路は、別の分岐がない限り、Ｐにある。別の分岐Ｃがある場合には、Ｃは、ＢからＢの再収束点までの経路にあるので、Ｃは同じ分岐群である。ＣはＰ内にある。Ｐにはこのループのループ分岐がある。Ｃがない場合には、Ｐが後に続き、Ｉに行く。Ｂの再収束点前にＩに到達した場合には、予想に反してＩがループ内にあることになる。したがってＩに到達する前にＢの再収束点に到達することになる。これはいずれかの分岐に到達する前である。したがってバックエッジからの経路では、別のループ分岐に到達する前に再収束点にヒットすることになる。
【０２４３】
他方で、ループ分岐ＣがＰ内にあると想定する。再収束点がＰにない場合には、Ｐの全てがループ内にあることになる（特にＩ）。したがって再収束点もＰにある。したがって、Ｃ、Ｅ、および再収束点Ｒが全ての経路Ｐの上にある。順序は、まずＥ、そしてＣ、次いでＲ、になる（他の順序はいずれも逆バックエッジになるからである）。Ｐ上に２以上の分岐がある場合（たとえば分岐Ｘ）には、Ｐ上のいずれの箇所に行くこともできる。しかし少なくとも１つのループ分岐は、Ｅ及びＲの間にある必要がある。Ｃはそのループ分岐である。
【０２４４】
Ｃは別のアームを有している。ＲへのＣの他のアームからの経路があるべきである。もしもＣからのすべての経路がＥの前にＲに行く場合には、ＥはＣからＲのいずれの経路にもないことになる。したがって、ＣからＲまでの全構造は、Ｂには見えず、Ｃが、このループのループ分岐でありえない。したがってＣからのある経路がＲの前にＥに行く必要がある。これは不可能である。この経路は、エッジＥの前のいずれかの場所でＰに合流する必要がある。それがどこであったとしても、この合流点が再収束点Ｒとなる。結論としては、Ｐの上の唯一可能性のある順番である、ＥからＣ次いでＲが、現実的に不可能ということである。
【０２４５】
一部の実施形態では、上述した定理の１以上において、ループは固有のネストレベルを割り当てられてよい。内部に別のループがネストされていないループは、ネストレベル０である。別のループがネストされているループはネストレベル１とされる。最高のネストレベルを有するループが存在する。このループが、フローのネストレベルを定義する。ループのネストはプロシージャのみに存在することに留意されたい。各プロシージャは、０からやり直される。これは、プロシージャがインライン処理されることに整合している。フローのネストレベルは、フローのすべてのプロシージャにおける最大ネストレベルである。
【０２４６】
各バックエッジが唯一のループ１つに属しているので、バックエッジのネストレベルは、それが属するループのネストレベルとして定義される。
【０２４７】
一部の実施形態では、ＤＴＳＥソフトウェアがフロー全体を一単位としてＮＵ回複製し、ここでＵはフローのループネストレベルとする。Ｎは、各ループのネストレベルをアンロールする方法の数とする。
【０２４８】
一部の実施形態では、完全に同じコードのＮＵ回のコピーなので、ソフトウェアがこのコードを実際に複製する理由はない。ビットも完全に同じであるはずである。コードは概念的にＮＵ回複製される。
【０２４９】
フローの静的コピーは、Ｕ桁の数で命名することができる。一実施形態では桁の基数（base）がＮである。最低オーダの桁数が、ネストレベル０に関連付けられる。次の桁数はネストレベル１に関連付けられる。各桁は、ネストレベルに対応している。
【０２５０】
一部の実施形態では、アンロールコピー名称における各桁Ｄについて、ＤＴＳＥソフトウェアが、Ｄについて値０のすべてのコピーにおいてＤに関連するネストレベルを持つすべてのバックエッジを作成して、Ｄについて値１を有するが、ほかのすべての桁が同じであるコピーの同じＩＰに赴く。そして、Ｄについて値１のすべてのコピーにおいてＤに関連するネストレベルを持つすべてのバックエッジを作成して、Ｄについて値２を有するが、ほかのすべての桁が同じであるコピーの同じＩＰに赴く。こうした処理を経て最終的に、ソフトウェアは、Ｄについて値Ｎ−１のすべてのコピーにおいてＤに関連するネストレベルを持つすべてのバックエッジを作成して、Ｄについて値０を有するが、ほかのすべての桁が同じであるコピーの同じＩＰに赴く。
【０２５１】
この実施形態は、現在のアンロールの静的なコピー番号及びフロー内を移動するときどう変換するかのアルゴリズムである。このアルゴリズムは、レベルＬのバックエッジが順方向に移動する場合、Ｌ桁目のモジュロ演算Ｎを増分する。レベルＬのバックエッジが後方方向に移動する場合には、Ｌ桁目のモジュロ演算Ｎを低減させる。これが前の複雑な段落が言わんとしていることである。一部の実施形態ではＤＴＳＥソフトウェアは、ポインタまたはこれを表すなにかを有していない。単にこの単純な現在の静的なコピー番号とカウントアルゴリズムを有している。
【０２５２】
したがって一部の実施形態では、ＤＴＳＥソフトウェアは、係数Ｎですべてのループをアンロールしている。これは、ループのいずれかを実際に理解したり、これらを個々に見たりすることなく、一括して一時に行われる。実際に知っていることは、各バックエッジのネストレベルであり、これらの最大値である、フローのネストレベルである。
【０２５３】
これら実施形態では、対象となるＩＰが変化しなかったので、コードのビットに変化はない。変化したのは、同じＩＰにおける命令の各静的インスタンスが異なる依存度を有することができるこようになったことである。各静的インスタンスは、別の命令に依存して、別の命令がこれに依存している。そのＩＰで定義される各命令においては、静的インスタンスそれぞれについて依存度を別個に記録できる機能が望まれる。いずれかの制御経路を行く場合、アンロールコピーカウンタが、いつでもその時点で見られている命令のアンロールコピーを示すように状態を適切に変化させる。
【０２５４】
＜分岐の再収束点＞
【０２５５】
一部の実施形態では、制御フローのグラフにおいて、ループＬのメンバーである分岐Ｂがヒットして、その後に、Ｂが属している分岐群の識別子がスタックにプッシュされる。もしも制御フローグラフにおいて、分岐群が既にスタックの上位にある分岐にヒットした場合には、何も起こらない。再収束点が、制御フローのグラフにおいてスタックＸの上位にある分岐についてヒットした場合には（アンロール前に定義されている）、このアンロールネストレベルのバージョン０に行き、スタックをポップする。これは、Ｘのバージョン０がアンロールループの実際の再収束点であるということである。
【０２５６】
一部の実施形態では例外がある。通過されたＬの最後のバックエッジが逆バックエッジであり、Ｌの再収束点Ｘにヒットした場合には（アンロール前に定義されている）、Ｌがスタックの上位にあり、スタックがポップされるが、バージョン０に行く代わりに、同じアンロールバージョンが維持される。この場合にはＸのこのアンロールネストレベルのバージョン０が、Ｌの再収束点として定義される。
【０２５７】
ループＬを抜けるときは常にＬのネストレベルのバージョン０に行く（Ｌが逆バックエッジを有する場合を除き）。
【０２５８】
上述は、制御フローグラフを前方向にたどる方法の実施形態を示している。一部の実施形態で明らかになるように、制御フローグラフを前方にたどるより後方にたどるほうが多くのものが必要となる。一部の実施形態では、これはネストプロシージャと同様である。
【０２５９】
後方にたどるにあたっては、Ｌの再収束点にまずヒットする。難しいのは、これが、複数のループの、さらにはループではない分岐群の再収束点である場合があることである。つまり、問題は、どの構造を後方に辿っているのか、である。この点に至る多くの経路が存在しているはずであるループに戻る場合には、現在の点より下のネストレベル１であるべきである。このネストレベルには多くのループ、及び、非ループ分岐群がある。どの経路をとるかを選ぶことができるだろう。もしも、後方に向かっているループＬが選ばれたとすると、Ｎ個のアンロールコピーに向かうためにＮ個の経路がある。一部の実施形態では、これらのうち１つを選択する。この段階では、後方に向かうコードの静的コピーがわかっている。探すことができるのは、対応する分岐群の分岐である。情報はスタックにプッシュされる。
【０２６０】
一部の実施形態では、現在のネストレベルのアンロールコピー０にない場合には、このループのバックエッジに戻る。したがってバックエッジをとることができる最後の機会に到達したところで経路がわかる。これ以前には、多くの可能性がある。現在のネストレベルのアンロールコピー０にある場合には、バックエッジをとらないとうさらなる選択肢、及び、ループから退くという選択肢が一部の実施形態では選択可能である。ループから退くことができない場合には、スタックをポップする。
【０２６１】
一部の実施形態では、このループのバックエッジがとられるたびに、このネストレベルモジュロ演算Ｎのコピー数を低減させる。
【０２６２】
ループは通常そのネストレベルの静的コピー０に入り、常に、そのネストレベルの静的コピー０へと退出する。
【０２６３】
これらは、このコードを分析しているソフトウェアの内部の動作であり、このコードの実行ではない。多くの実施形態で、実行はスタックを有さない。コードは、全てが正しい場所に行くために生成される。ソフトウェアが、全て正しい場所に行くコードを生成するためには、自身でフローをどのように行うかを知っている必要がある。図８から図１１は、これら動作の一部の例を示す。図８は、２つのバックエッジを有する３つの基本ブロックの例を示す。２つのレベルのネストされた単純なループが形成される。Ｃへの入り口は、Ｃの分岐の再収束点である。Ｃからの退出の対象は、Ｃの分岐の再収束点である。図９は、フロー全体が複製された様子を示す。その一部を示している。いま、われわれのネストループ（コピー００、コピー０１、コピー１０、及びコピー１１）の４つのコピーが存在している。Ｃｘへの入り口は、Ｃｘの分岐の再収束点である。Ｃｘからの退出の対象は、Ｃｘの分岐の再収束点である。これらは各ｘについて異なる。
図１０は、上述した動作の１以上を利用して修正されたバックエッジ及び再収束点のエッジを示す。Ｃ００への入り口は、今ではループＢ００−Ｂ０１の分岐の再収束点である。Ｃ１０へのエントリポイントは、今ではループＢ１０−Ｂ１１への再収束点である。外部ループ、静的コピー００及び１０は両方とも、共通の再収束点に向かう。Ｃ０１及びＣ１１の対象でもある共通の再収束点が存在している。Ｃ０１及びＣ１１が死んでいるコードであるためにこれはあまり興味がない。このコードに到達する方法はない。実際のところ、このコードからの退出は、常にＣ００またはＣ１０から来る静的コピー００にある。図１１では、死んでいるコード及び死んでいる経路を取り除いて、より明確にどのように動作するかを示す。静的コピー００内にあるこのコードの生きている入口は１つしかなく、静的コピー００内にあるこのコードの生きている出口も１つしかない点に留意されたい。一部の実施形態では、ＤＴＳＥソフトウェアが、いずれかのコードを特に「取り除」かない。コードのコピーが１つだけある。取り除くものはない。ソフトウェアは、基本ブロックＡ及びＣが、２つの名称００及び１０の依存情報を必要としており、４つの名称の依存情報は必要としてないことを理解している。基本ブロックＢは、４つの名称の依存情報を必要としている。
【０２６４】
Ｎの数が大きくなると、準備する仕事量を増加させるが、動的な重複の数が減った並列も増加させる可能性がある。一部の実施形態では、ＤＴＳＥソフトウェアはＮを増やしてより良い仕事を行わせたり、Ｎを低減させて、あまり仕事量のないコードを生成させたりすることができる。一般的には、最終的なトラックの数にマッチするＮによって、合理的な仕事量を有する並列性のほとんどが提供される。一般的には、これよりＮが大きくなると、これよりずっと多い量の仕事で、多少結果がよくなる、ということになる。
【０２６５】
ループのアンロールにより、命令Ｉが、一部の繰り返しについて１つのトラックで実行されるが、一方で同じ命令Ｉの異なる静的バージョンは、異なる繰り返しについて、異なるトラックで同時に実行される。トラック分離は命令ごとに行われることから、「命令」がここでは強調される。命令Ｉは、このようにして処理されてよいが、一方で命令Ｊ（このループでＩのすぐ隣にある）は、完全に異なる方法で処理されてよい。命令Ｊは、トラック０のすべての繰り返しについて実行されてよく、このループのＩ及びＪのすぐ隣の命令Ｋは、トラック１のすべての繰り返しについて実行されてよい。
【０２６６】
ループのアンロールは、同じループの異なる繰り返しからの命令を、異なるトラックで実行させ、非常に有用なツールである。多くのコードにおいてこれは重要な並列性を明らかにする。他方で、ループのアンロールは、多くのコードで並列をまったく明らかにしない。これは、ＤＴＳＥが利用することができるツールの１つにすぎない。
【０２６７】
さらに、ＤＴＳＥソフトウェア内の分析について、通常は、ビットが同一であるのでアンロールのための任意のコードを複製する理由がない。アンロールにより、コードの複数の名称が生成される。各名称は性質のテーブルを各自持っている。各名称は異なる振る舞いをすることができる。これにより並列性が明らかにされてよい。後で生成される実行可能コードであっても、分析中に、このコードに多くの名称がある場合であっても、多くのコピーを有さないことがある。
【０２６８】
＜線形静的複製＞
【０２６９】
一部の実施形態では、フロー全体が既に複数回、一括アンロールについて複製された。とりわけ、一部の実施形態では、フロー全体を適宜、これより多くの回数、複製する。コピーはＳ０、Ｓ１、Ｓ２などと称される。
【０２７０】
フロー内の各分岐Ｂは、各静的コピーＳ０、Ｓ１、Ｓ２内で複製される。Ｂの各コピーは、一般的分岐Ｂのインスタンスである。同様に、Ｂは、今はＳ０、Ｓ１、Ｓ２として複製されている再収束点である。これらコピー全てが、一般的な分岐Ｂの一般的な再収束点のインスタンスである。複製されたバックエッジは全てバックエッジとしてマークされる。
【０２７１】
一部の実施形態では、コードを複製しない。これら実施形態では、コードの全てがまた別のレベルの複数の名称を取得する。すべての名称は、情報を格納する場所を取得する。
【０２７２】
一部の実施形態では、フローのすべての「Ｓ」コピーのすべてのエッジのそれぞれの対象は、正確な一般的な基本ブロックに変更されるが、特定の「Ｓ」コピーに割り当てられはしない。すべてのバックエッジの対象は、具体的に、Ｓ０コピーに変更される。
【０２７３】
一部の実施形態では、フローＳ０、Ｓ１、Ｓ２のコピーが、１つ１つ番号順に行われる。Ｓｋでは、バックエッジではないフローコピーＳｋに端を発する全てのエッジＥが、その対象の特定のコピーを、最低の「Ｓ」の番号のコピーとして割り当てて、他のエッジと対象を共有しないようにする。
【０２７４】
最終的には、その他のエッジと対象基本ブロックを共有するバックエッジではないエッジがなくなる。もちろんバックエッジは、他の、おそらくは多くの他のバックエッジと、対象の基本ブロックを共有することが多い。
【０２７５】
一括アンロールの場合同様に、一部の実施形態では、ループを退出するエッジの対象の「Ｓ」インスタンスが、以下のようにループ収束点に行くことにより修正される。
【０２７６】
一部の実施形態では、制御フローグラフにおいて、分岐ＢがループＬのメンバーにヒットすると、Ｂが属する分岐群の識別子がプッシュされて、現在のインスタンス「Ｓ」の番号がスタックに上がる。一部の実施形態では、制御フローグラフにおいて、分岐群が既にスタックの上位にある分岐がヒットしても何も起こらない。一部の実施形態では、スタックの上位にあるそのループの一般的な再収束点のインスタンスが、制御フローグラフでヒットすると、Ｉがスタックをポップして、実際にスタックからポップしたインスタンス「Ｓ」の番号に行く。
【０２７７】
これは、つまりループで、ループの各繰り返しが、のインスタンス「Ｓ」の番号０から開始されるが、このループを抜けるときには、このループが入った「Ｓ」のインスタンスに行くことを示している。
【０２７８】
一括アンロールとともに利用したものと同じスタックを利用することができる。同じスタックを利用するときには、「Ｓ」インスタンスについて各スタックエレメントにフィールドを追加する。
【０２７９】
繰り返しになるが、これらは、このコードを分析しているソフトウェア内の動作であるが、コードを実行しているわけではない。実行はスタックを有さない。コードは、全てが正しい場所に行くために生成される。ソフトウェアが、全て正しい場所に行くコードを生成するためには、自身でフローをどのように行うかを知っている必要がある。
【０２８０】
コピーＳ０から到達不可能な第１のフローコピーＳｘが存在している。これ、及び、全てのより多い数のコピーは不要である。加えて、各生き残っている静的コピーＳ１、Ｓ２、は、通常、Ｓ０から到達不可能な、死んでいるコードを多く有している。ここから到達不可能なものは、発行された実行可能コードを生成しない。
【０２８１】
＜依存性分析＞
【０２８２】
＜複数の結果の命令＞
【０２８３】
既に記載したように、一部の実施形態では、元の呼び出し命令が、プッシュで置き換えられており、元のリターンがポップ及び比較で置き換えられている場合がある。
【０２８４】
一般的には、複数の結果命令が分析において望ましくない。一部の実施形態では、これらが複数の命令に分割される。多くの、ただすべてではないケースでは、これら及び類似した命令が、コード生成で再構成されていてよい。
【０２８５】
プッシュ及びポップは明らかな例である。プッシュは、ストア及び低減スタックポインタである。ポップは、ロード及び増分スタックポインタである。スタックポインタ補正とメモリ動作とを分離させることが望ましい場合がよくある。分離可能な複数の結果を有する多くの他の命令も存在する。一部の実施形態では、これらの命令を分離する。
【０２８６】
これらを分離させる共通の理由は、全てのスレッドがスタックポインタ変更を必要とする可能性が高いということであるが、全てのスレッドにプッシュされるデータの計算を複製するために必要ではない場合もある。
【０２８７】
＜不変の値＞
【０２８８】
＜ハードウェアサポート及びメカニズム＞
【０２８９】
一部の実施形態では、ＤＴＳＥハードウェアは、ソフトウェアに利用可能な複数の「アサートレジスタ」を有する。各「アサートレジスタ」は少なくとも、実際の値とアサートされた値（Asserted Value）という２種類の値を保持することができ、各値を有する有効ビットが存在する。一部の実施形態では、アサートレジスタは、全てのコア及びハードウェアＳＭＴスレッドに対するグローバルリソースである。
【０２９０】
一部の実施形態では、ＤＴＳＥソフトウェアは、任意のアサートレジスタの実際の値の部分またはアサートされた値の部分いずれかをいずれの時点においても、いずれのコアのいずれのハードウェアＳＭＴスレッドから書き込むことができる。
【０２９１】
一部の実施形態では、書き込みを一定のアサートレジスタのアサートされた値への書き込みをグローバルにコミットするためには、対象となるアサートレジスタの実際の値の部分が有効であり、両方の値がマッチする必要がある。実際の値が有効でなかったり、値同士がマッチしなかったりする場合には、ハードウェアはダーティなフローの退出を生じさせ、状態は、最後にグローバルにコミットされた状態に復元される。
【０２９２】
アサートレジスタは、１つのコア内の１つの論理プロセッサＡで動作するコードの機能を提供して、この論理プロセッサまたはコアが実際に計算しなかった値を利用する。この値は、一部のコアでは、一部の論理プロセッサＢで、論理的には速く、しかし必ずしも物理的に速くなくてもよい時期に計算して、アサートレジスタの実際の値の部分に書き込む必要がある。Ａで実行されているコードは、任意の値を推定して、同じアサートレジスタのアサートされた値に書き込むことができる。アサートされた値の書き込みに続くコードは、アサートされた値に書き込まれた値がこのコードがどの場所にあろうとも、アサートされた値に書き込む論理位置の実際の値に書き込まれる値と完全にマッチすることを確かに知っている。
【０２９３】
ＤＴＳＥソフトウェアが高い可能性を有しているが、その値のすべての計算を行っておらず値について確信がない場合には有用であり、この値を複数の用途に利用することができる。この値を、複数のコアの複数の論理プロセッサで利用して、正確にこれを１つのコアの１つの論理プロセッサで利用することができる。ＤＴＳＥソフトウェアの値が正確な場合には、アサート処理にコストがかからない。ＤＴＳＥソフトウェアの値が正確ではなかった場合には、正確さに関する問題があるのではなく、結果生じるフローの退出について大きなパフォーマンスコストが存在する場合がある。
【０２９４】
＜スタックポインタ＞
【０２９５】
スタックポインタとベースポインタとは、通常よく利用される。非常に有用なコードが、スタックポインタ及びベースポインタの値を利用せずに実行されるとは考えにくい。したがって通常は、全てのＤＴＳＥスレッドのコードが、これらレジスタの値のほとんどを利用する。さらに、例えばスタックポインタの実際の値は、スタックポインタの変更の長い依存の鎖に依存している。一部の実施形態では、ＤＴＳＥソフトウェアは、この長い依存の鎖を、アサートレジスタの実際の値の部分に書き込みを挿入して、推定された値の書き込みをアサートレジスタのアサートされた値に挿入することにより、破壊することができる。そして、実際の値にも、その前のいずれの値にも直接依存していない値が生じる。
【０２９６】
元のコードのプロシージャ呼び出し及びリターンについては、ＤＴＳＥソフトウェアは通常、リターンの直後のスタックポインタ及びベースポインタの値を、呼び出し直前のものと同じと推定する。
【０２９７】
一部の実施形態では、呼び出し（元の命令）の直前には、ダミー命令を挿入してよい。これは、コードを生成しないが、命令のようなテーブルを有している命令である。ダミーは、スタックポンタ及びベースポインタのコンシューマとしてマークされる。
【０２９８】
プロシージャから戻った後で、命令が挿入され、スタックポインタ及びベースポインタを、２つのアサートレジスタの実際の値の部分にコピーする。これら挿入された命令は、これらの値のコンシューマとしてマークされる。
【０２９９】
この直後に、一部の実施形態では、命令が挿入され、スタックポインタ及びベースポインタを、これらのアサートレジスタのアサートされた値の部分にコピーする。これら挿入された命令は、これらの値を消費しないが、これらの値を生成するものとしてマークされる。これらの命令は、直接ダミーに依存するものとしてマークされる。
【０３００】
同様に、不均衡なスタック変更を明らかに行っていない多くのループについて、スタックポインタ及びベースポインタの値を、各繰り返しの開始時と同じであると想定する。一部の実施形態では、コンシューマであるダミーは、ループの最初の入り口に挿入される。実際の値へのコピーは、コンシューマとして挿入され、特定され、次に、アサートされた値のコピーが、プロデューサとして特定される。アサートされた値のコピーは、直接ダミーに依存させられる。
【０３０１】
これには、多くの他の用途も可能である。アサートを利用するためには、値が不変であることは必須ではない。多くのステップの評価を、おそらく正しい、ずっと短い評価で置き換えることができることのみが必須実行である。
【０３０２】
アサートは、ハードウェアが報告する失敗を比較する。一部の実施形態で、アサートが失敗したと観察された場合、ＤＴＳＥソフトウェアは、違反している（offending）アサートレジスタの利用をやめて、コードを、失敗したアサートを使用せずに再処理する。
【０３０３】
こうしたとしても誤ったコードが生成される可能性は高い。スレッドは、プロシージャのスタックポインタのすべてではないが一部の変化をまとめる（wind up）ことができる。したがって、プロシージャの最後におけるスタックポインタの誤った値を推定することができるようになる。これは正確に関する問題ではない。アサートはこれを捉えるが、アサートは、常に、またはしばしば失敗する。スレッドがプロシージャのすべてのスタックポインタの変更を有さない場合には、それらがないことを望む。これは、直接強制されてはいなかった。
【０３０４】
実際の値に書き込みを有するスレッドは、スタックポインタに対する変更全てを有している。これは共通の問題ではない。一部の実施形態では、実行中にアサートの失敗が報告された場合には、そのアサートを除去する。
【０３０５】
一部の実施形態では、ＤＴＳＥソフトウェアは、スレッドの不変であると想定される全てではないが一部の変更を特にチェックすることができる。このような問題のある状況が検知された場合には、アサートを取り除く。この代わりに、ダミーの位置で値をセーブして、アサートされた値の書き込み位置にリロードすることができる。
【０３０６】
＜制御依存性＞
【０３０７】
一部の実施形態では、各プロファイルを利用して、完全に複製されたコードの線形の経路をたどる。プロファイルは、各分岐またはジャンプの一般的な対象を定義して、完全に複製されたコードの利用可能な経路が、対象である特定のインスタンスを定義する。したがって、このトレースは、命令の特定のインスタンスを複数通ることになる。プロファイルは、線形のリストであるが、完全に複製された静的コードをくねくねと通る（winds its way through）。一般的には、これは、同じ命令インスタンスに何度もヒットする。各分岐の各静的インスタンスに別個に、外向きのエッジそれぞれが何度とられたかを記録する。
【０３０８】
分岐のインスタンスのエッジが、プロファイルでとられていることが確認されていない場合には、このエッジがフローを退出する。これは、いくつかのコードを到達不可能にする可能性がある。分岐の単調なインスタンスが「実行のみ」の分岐としてマークされる。これらの多くは、前に特定されている。一般的な分岐は単調になりうる。この場合には、この一般的な分岐のすべてのインスタンスが、「実行のみ」のインスタンスである。今では、一般的な分岐が単調ではなかったとしても、この分岐の一定の静的インスタンスが単調である可能性がある。これらのインスタンスも「実行のみ」の分岐である。
【０３０９】
他の命令インスタンスは、「実行のみの分岐」に依存しない。特定の分岐インスタンスは「実行のみ」であったりなかったりする。
【０３１０】
一部の実施形態では、一般的な分岐Ｂの各「実行のみではない」インスタンスについて、全ての経路で順方向に進み、Ｂの一般的な再収束点のいずれかのインスタンスで止まるようにする。この経路のすべての命令インスタンスが、Ｂのこのインスタンスで直生存性を持つとしてマークされる。一部の実施形態では、これはすべての一般的な分岐Ｂに対して行われる。
【０３１１】
外向きエッジとして「フローを退出しようとしている」が、２以上の他のエッジを有している分岐がある可能性がある。これは、間接分岐に典型的である。プロファイリングにより、間接分岐の可能性のある対象はいくつか特定されているが、通常は、特定されていない対象もあると想定される。間接分岐が、プロファイリングで特定されていない対象に赴く場合には、これが「フローを退出しようとしている」ものである。
【０３１２】
これらの場合には、ＤＴＳＥソフトウェアが、これを、既知の対象、及び、「フローを退出しようとしている」またはいない２つの方向の分岐に分解する。「フローを退出しようとしている」またはいない分岐は、通常は単調な「実行のみの」分岐である。
【０３１３】
＜直接依存性＞
【０３１４】
一部の実施形態では、各命令インスタンスの直接制御依存性が、既に記録されている。
【０３１５】
各命令インスタンスについて、「レジスタ」の入力を特定する。これには、命令を実行する必要のあるすべてのレジスタの値が含まれる。これには、ステータスレジスタ、条件コード、及び暗示的なレジスタ値が含まれてよい。
【０３１６】
一部の実施形態では、要求されている「レジスタ」の値のすべての可能性のあるソースを見つけるために、全ての可能性のある経路上の各命令インスタンスからのトレースバックを行う。ソースは、特定の命令インスタンスであって、一般的な命令ではない。特定の命令インスタンスは特定の命令インスタンスから値を取得する。１つの要求されている値から命令インスタンスには複数のソースがある可能性がある。
【０３１７】
プロファイルは、分岐対象、ロードアドレス及びサイズ、ストアアドレス及びサイズの線形シーケンスである。ＤＴＳＥソフトウェアは、依存性分析をするために少なくとも１つプロファイルを有するべきである。いくつかのプロファイルが利用可能であってよい。
【０３１８】
一部の実施形態では、各プロファイルを利用して、完全に複製されたコードを通る線形経路をたどる。プロファイルは、各分岐またはジャンプの一般的な対象を定義して、完全に複製されたコードの利用可能な経路が、対象である特定のインスタンスを定義する。したがって、このトレースは、命令の特定のインスタンスを複数通ることになる。プロファイルは、線形のリストであるが、完全に複製された静的コードをくねくねと通る（winds its way through）。一般的には、同じインスタンスに何度もヒットする。
【０３１９】
ロードは、メモリから数バイトをロードする場合が多い。原則としては、各バイトが別個の依存性課題である。実際には、もちろんこれは、最適化することができる。一部の実施形態では、各ロードの各バイトについて、このバイトに対する最後の前のストアを見つけるために、プロファイルのロードから逆順序に振り替えることができる。ロード命令の同じインスタンスおよびストアのインスタンスそのものが存在する。一部の実施形態では、このストアのインスタンスは、このロードのインスタンスに直接依存するものとして記録される。ロードのインスタンスは、同じバイトについても、多くのストアのインスタンスに依存することができる。
【０３２０】
＜スーパ鎖＞
【０３２１】
自身に他の命令インスタンスが直接依存していない各命令インスタンスは、「スーパ鎖生成器」である。
【０３２２】
スーパ鎖は、１つのスーパ鎖生成器を含む静的命令インスタンスのセットの、依存性を有する推移的封鎖（transitive closure）である。つまり、スーパ鎖を、スーパ鎖生成器を含むセットとして開始する。一部の実施形態では、スーパ鎖が依存している任意の命令インスタンスが、セットに追加される任意の命令インスタンスである。一部の実施形態では、これは、スーパ鎖が、スーパ鎖内のいずれかの命令インスタンスが依存しているすべての命令インスタンスを含むまで、繰り返し継続される。
【０３２３】
すべてのスーパ鎖が特定されたスーパ鎖生成器から形成された後で、どのスーパ鎖にもない命令インスタンスが残存する場合がある。一部の実施形態では、どのスーパ鎖にもない命令インスタンスをいずれか選んで、スーパ鎖生成器に設定して、そのスーパ鎖を形成する。どのスーパ鎖にもない命令インスタンスが残っている場合には、これらのいずれかの命令インスタンスをスーパ鎖生成器として選択する。これは、全ての命令インスタンスが少なくとも１つのスーパ鎖に含められるまで続けられる。
【０３２４】
多くの命令インスタンスが、複数の（数多くてもよい）スーパ鎖に存在する場合がある点に留意されたい。
【０３２５】
一部の実施形態では、スーパ鎖セットが、依存性分析の最終生産物となる。
【０３２６】
＜トラック形成＞
【０３２７】
＜基本トラック分離＞
【０３２８】
一部の実施形態では、Ｎ個のトラックが望ましい場合、Ｎ個のトラックが同時に分離される。
【０３２９】
＜最初のシード生成＞
【０３３０】
一部の実施形態では、最長のスーパ鎖を発見する（これが「バックボーン」である。
【０３３１】
各トラックについて、一部の実施形態では、「バックボーン」にはなく、どの他のトラックにも見つからないほとんどの命令を有しているスーパ鎖を見つける。これは、このトラックの最初のシードである。
【０３３２】
一部の実施形態では、トラックセットの周りで１または２回繰り返す。各トラックでは、一部の実施形態で、他のトラックにないほとんどの命令を有しているスーパ鎖を発見する。これは、このトラックの次の繰り返しシードであり、前にあったシードを置き換える。これを向上させるためには、本当に際立った選択肢に思える場合には、「バックボーン」をシードにするのがよい考えであろう（よい考えではない場合もあるだろう）。
【０３３３】
通常は、これは、トラックの「シーディング」の冒頭にすぎず、その最後ではない。
【０３３４】
＜トラックの成長＞
【０３３５】
一部の実施形態では、動的に最短であると推定されるスーパ鎖Ｔを選択する。そしてスーパ鎖をこのトラック内に配置する。
【０３３６】
一部の実施形態では、スーパ鎖は、どのトラックにもまだ配置されていない、推定される数の動的命令により、最少から最大のものへと、順に検査される。
【０３３７】
一部の実施形態では、各スーパ鎖について、重複した部分の半分以下を、トラックＴに置き（他のトラックに置いてからトラックＴに置くのではなく）、トラックの成長の開始に戻る。さもなくばこのスーパ鎖は行わず、次のスーパ鎖を行う。
【０３３８】
トラックＴに置かないうちに、スーパ鎖のリストの最後に到達した場合にはトラックＴは新たなシードを必要とする。
【０３３９】
＜新たなシード＞
【０３４０】
一部の実施形態では、全ての「成長した」スーパ鎖を、Ｔ以外のすべてのトラックから取り除き、これらトラックのすべての「シード」を残す。トラックＴは一時的にその「成長した」スーパ鎖としてとどまる。
【０３４１】
一部の実施形態では、配置されていないスーパ鎖の現在のプールから、Ｔ以外のトラックには存在しない最大数（動的のものの推定数）の命令を見つける。このスーパ鎖は、トラックＴに追加されたシードである。
【０３４２】
そしてすべての「成長した」スーパ鎖をトラックＴから取り除く。「成長した」スーパ鎖は、既にすべての他のトラックからは取り除かれている。いまではすべてのトラックが、自身のシードのみを含んでいる。複数（多い場合もある）のシードが各トラックに存在しうる。
【０３４３】
ここからトラックを成長させる。
【０３４４】
良好なシードを取得すると、質のよいトラックの分離につながる。最長のスーパ鎖が、全てのトラックに存在させる可能性が高まる「バックボーン」命令のセット全体を有するものである可能性が高い。命令の独自のセットを定義しない可能性が非常に高い。したがってこれはシードとして最初は選択しない。
【０３４５】
この代わりに一部の実施形態では、「バックボーン」と異なる命令をなるべく多く含むスーパ鎖を探す。これは、独自のものを探し出す可能性が高い。各連続したトラックは、なるべく独自で、かつ、既存のトラックからなるべく異ならせるために、これも「バックボーン」からなるべく異なるシードを取得する。
【０３４６】
一部の実施形態では、これを再度繰り返す。各トラックについて何かある場合には、可能な場合には、各トラックをより独自のものにする試みを行う。各トラックのシードの選択は、他のトラックからなるべく異なるものとなるように再考する。
【０３４７】
ここから、２つの先端（prong）方法が考えられる。
【０３４８】
「成長する」とは、非常に増分的なことを意図している。これは、既にトラックにあったものに対して少しずつ増加していくことを意味しており、このトラックに本当に属することが明らかである場合にのみ行われる。「成長」は、大きな飛躍を意味していない。
【０３４９】
一部の実施形態では、明らかな場合には増分的な成長を止めて、新たな動作の中心に跳躍することもできる。こうするためには、トラックのシード集合体を追加する。
【０３５０】
大きな飛躍は、シードを追加することで行われる。成長により、シードにより明らかに行われていることが充たされる。フローの中には非常に良好な連続性を有しているものもある。最初のシードから増分的に成長させると、非常に良好に機能する。フローの中には段階を有しているものもある。各段階がシードを有している。つぎに、トラックが良好に増分的に満たされる。
【０３５１】
一部の実施形態では、トラックＴの新たなシードを見つけるために、他のトラック全て（それらのシードは除く）を空にする必要がある場合がある。存在しているのは、新たなシードに対する不要なバイアスかもしれない。そうであってもトラックＴに既にある全てを維持することが望ましい。それはこれが既にＴと関連しているものだからである。ここで発見したいのはＴに行くための異なる何かである。進めていくうちにいずれは手に入るものをシードとして得ても助けにはならない。シードとして追加したいのは、成長では得られないものである。
【０３５２】
成長に話を戻すと、一部の実施形態では、このプロセスはクリーンな状態から始める。成長は、異なるシードによって、かなり異なる工程をとる可能性があり、シードは最適化可能なものである必要がある。
【０３５３】
一部の実施形態では、成長は、シードとして必要なものを見つけるメカニズム同様に、ある程度の期間行われる。フローが異なる段階をとる場合には、異なる段階においてシードが必要となる場合がある。しかし段階は公知ではなく、いくつのシードが必要かもわからない。一実施形態ではこれも割り出す必要がある。「お試し」の成長は、どのシードが必要かを発見する方法にすぎないので、単に破棄される。必要なシードのセットが完全に整っている場合には、質の高い「成長」を行って、各トラックでの工程を補充すればよい。
【０３５４】
＜生（ＲＡＷ）のトラックコード＞
【０３５５】
一部の実施形態では、各トラックについて、フローの完全な複製が開始点となる。ここから、このトラックのコードからのすべての命令インスタンス（このトラックに割り当てられているどのスーパ鎖にも存在していないもの）を削除する。これがこのトラックの原材料のコードとなる。
【０３５６】
トラックの原材料コードが定義されると、スーパ鎖に用はなくなる。スーパ鎖は、どの命令インスタンスを各トラックのコードから削除できるかを割り出すためにだけ必要となる。
【０３５７】
この時点においては、すべてのトラックが、基本ブロックすべての完全な複製を含むことになる。実際には、一般的な基本ブロックしかなく、これが多くの名称を有している。各名称について、命令の異なるサブセットが存在する。各名称について、それぞれ他の一般的な基本ブロックの異なる名称に赴くための外向きのエッジが存在している。外向きのエッジのいくつかはバック得次である。一般的には、その名称の一部（ときとして全て）をもつ多くの基本ブロックが命令をまったく含まない場合がある。
【０３５８】
基本ブロックの各名称は、自身の外向きエッジを有している。空の基本部ブロックンスタンスであっても外向きエッジを有している。一定の基本ブロックの名称を有していたりいなかったりする分岐及びジャンプは、その基本ブロックのその名称の外向きのエッジを正確にサポートしていない。基本ブロックのインスタンス（名称）のなかには、ジャンプまたは分岐命令は含まないが、この基本ブロックのこのインスタンスについて外向きのエッジが存在するようなものもある。存在する分岐及びジャンプは、それでも元のコード対象ＩＰを有している。これは直す必要がある。対象ＩＰは修正して外向きのエッジをサポートするようにする必要があるが、これはまだ行われていない。基本ブロックの多くのインスタンスでは、制御転送命令（ジャンプ）を最後に挿入して外向きエッジをサポートする必要がある。
【０３５９】
この時点では、すべてのトラックが、まったく同じ制御フロー構造、および、まったく同じ基本ブロックインスタンスを有している。これらは全て同じものであるが、各トラックについて異なる命令削除が行われている。しかしあるトラックの削除は、全ての命令を構造全体から除去せねばならない大規模なものになりうる。たとえばあるループのすべての命令が、トラックから完全に消失する、という事態も可能である。
【０３６０】
＜スパンのマーカ＞
【０３６１】
スパンマーカ命令は、特殊な命令であり、一部の実施形態では、他のトラックもこのスパンマーカをコードの同じ場所に有していることを示すＤＴＳＥレジスタのストアである。これに関しては後述する。実行可能コードを生成するまではこのことは分からない。
【０３６２】
一部の実施形態では、アンロールコピー数の桁のそのレベルのアンロールコピー０を対象とする逆バックエッジではないどのバックエッジに対しても、スパンマーカが挿入される。これは、スパンマーカのみを含む新たな基本ブロックである。バックエッジは、実際にこの新たな基本ブロックを対象とするように変更される。この新たな基本ブロックは、バックエッジの前の対象に赴く無条件の外向きのエッジを１つだけ有している。
【０３６３】
一部の実施形態では、これらのスパンマーカからのエッジのすべての対象に、結合部のすぐ前にスパンマーカが挿入される。この新たなスパンマーカは、バックエッジにあるスパンマーカからの経路にはなく、この結合部に合流するすべての他の経路に存在する。このスパンマーカもまた、スパンマーカのみを含み、結合部に赴く無条件の外向きエッジを１つだけ有する新たな基本ブロックである。
【０３６４】
一部の実施形態では、逆バックエッジを有するすべての分岐について、この分岐の再収束点に、基本ブロックの第１の命令としてスパンマーカが追加される。
【０３６５】
すべてのスパンマーカは、トラック全体にマッチする必要があるが、この理由は、全てのトラックが同じ基本ブロックと同じエッジとを有しているからである。実行可能なコードの生成においては、いくつかのスパンマーカが、いくつかのトラックから消失することがある。そこで、どのスパンマーカがトラックにおいてマッチしているかの記録を取っておいて、それらのいくつかが消失したらその旨がわかるようにしておく必要があろう。
【０３６６】
＜実行可能なコードの生成＞
【０３６７】
生成される実行可能なコードは、静的なコピー名称またはＤＴＳＥソフトウェア内部で利用される表現の情報テーブルを持たない。一部の実施形態では、異なるアドレスに対する分岐またはジャンプを実行しない限りにおいて、アドレスの順序で連続実行される通常のＸ８６命令である。
【０３６８】
このコードは「プール」である。これはどの特定のトラックまたはその他の場所にも属さない。このコードの一部が、正確な命令シーケンスを有している場合には、どのトラックであってもこれをトラックのいずれの箇所においても利用することができる。したがい、要求されているコードが既に「プール」内に存在している場合には、同じコードの別のコピーを再度生成する必要がない。
【０３６９】
もちろん、あるコードで実行が開始されると、そのコード自身が、実行するすべての将来のコードを決定するという問題もある。ここで、Ｃというコードがあると想定しよう。２つの異なる用途Ｕ１及びＵ２について必要な命令シーケンスにマッチするが、Ｃの実行が終了すると、Ｕ１が命令シーケンスＸを実行する必要があり、Ｕ２は、命令シーケンスＹを実行する必要がある場合を想定する（ＸとＹとは異なる）。これは問題を孕んでいる。
【０３７０】
ＤＴＳＥコードの生成においては、この問題には少なくとも２つの解決法がある。
【０３７１】
一部の実施形態では、第１の解決法は、コードの静的コピーをＤＴＳＥソフトウェアで生成する方法によって、たとえば同じコードのシーケンス（Ｃなど）をしばらくの間必要とするＵ１及びＵ２などの異なる用途においてこの後永久的に同じコードシーケンスを欲するようにする、というものである。
【０３７２】
一部の実施形態では、第２の解決法は、Ｕ１及びＵ２等の複数の用途にマッチするコードの部分（Ｃなど）を、ＤＴＳＥサブルーチンにする、というものである。Ｕ１とＵ２とは、サブルーチン内で同じコードＣを利用するが、Ｕ１とＵ２とは、このサブルーチンから戻ると、異なっていてよい。ここでも、コードの静的コピーを作成したコード分析ソフトウェアが、たいていの場合は、これらサブルーチンの形成を当然簡単に行うことができる。これらサブルーチンは元のプログラムには知らされない。
【０３７３】
＜ブロックの構築＞
【０３７４】
コードは、生来ハンモックになるように構造化される。ハンモックとは、ＤＴＳＥサブルーチンの本来の候補である。
【０３７５】
ＤＴＳＥサブルーチンは、元のプログラムには知らされないプロシージャである。ＤＴＳＥサブルーチンからのリターンアドレスは、通常、アーキテクチャスタックには置かれない。プログラムについて正確ではないことに加えて、全ての実行コアが、同じアーキテクチャスタックを共有しつつ、一方では一般的にこれらがハンモックの別のバージョンを実行して、異なるリターンアドレスを必要とする、という課題もある。
【０３７６】
ＤＴＳＥサブルーチンから出たり戻ったりする際には、呼び出し及びリターン命令を利用するのが望ましいと思われるが、これは、ハードウェアが、非常に精度高くリターンを予測する分岐への特別な構造を有しているからである。一部の実施形態では、呼び出しの前にＤＴＳＥのプライベートスタックを指すように変更され、コードの実行前にプログラムスタックポインタに戻される。そして、リターンするためにプライベートスタックポインタに戻らされる。プライベートスタックポインタ値は、等しいアドレスで、且つ、各論理プロセッサについて異なる位置にセーブされる必要がある。たとえば汎用レジスタがこのような格納領域を持っている。しかしこれらはプログラム実行に利用されている。ＤＴＳＥハードウェアは、このように、等しいアドレスで、且つ、論理プロセッサの固有の格納領域にアクセスできるレジスタを提供することができる。
【０３７７】
前述したように、コードシーケンスを共有する用途は実際のところ、このポイントから永久に同じコードを実行するために、サブルーチンを利用する必要がない場合が多い。共有可能なコードシーケンスは、ユーザがこの点から「永久的に」コードについて了承した場合には、サブルーチンにはならない。
【０３７８】
ハンモックのバージョンのすべての用途が、ハンモックの後に同じコードに赴く場合には、通常、この時点でリターンする必要が生じない。共通のコードをすべてのユーザについて同じである限り拡張することができる。リターンは、ユーザがコードの実行に同意しない場合に必要となる。
【０３７９】
ハンモックは、呼び出し及びリターンのコストを合理的に償却する程度に長い間実行されることが予期される場合にのみ、サブルーチンにされる。さもなくば、サブルーチンにはされない。
【０３８０】
＜インラインされたプロシージャ＞
【０３８１】
プロシージャは、「インラインされて」、その「コピー」が生成される。これは再帰的だったので、数個の呼び出しレベルおよび数個の呼び出しサイトで、多くの「コピー」が存在する可能性がある。他方で、プロシージャはＤＴＳＥサブルーチンの有望な候補である。可能性として、殆どの共通ケースにおけるプロシージャの多くの「コピー」が、同じであると判明する場合がある（異なるトラックの異なる命令のサブセット以外は）。もしくは、少しだけ異なるバージョンがあると判明する場合もある（異なるトラックの異なる命令のサブセット以外は）。したがってプロシージャは、１つまたは数少ないＤＴＳＥサブルーチンとなる（異なるトラックの異なる命令のサブセット以外は）。
【０３８２】
＜一括ループアンロール＞
【０３８３】
一部の実施形態では、ループは常にこのループのアンロールコピー０に入る。ループは、１つの退出点（このループのアンロールコピー０のループ分岐群の一般的な共通の再収束点である）を有するものとして定義される。これがハンモックとされる。したがってループは常にサブルーチンとなる。
【０３８４】
＜日和見的なサブルーチン＞
【０３８５】
分岐ツリーの部分のなかには、ツリーで繰り返されるハンモックのように見えるものもある。この些細な例に、線形静的複製を有する分岐のツリーが、効果的に多くの線形コードセグメントに復号されたものがある。この線形コードセグメントのいくつもが、しばらくの間同じコードシーケンスを含んでいる。線形コードシーケンスは常にサブルーチンでありうる。
【０３８６】
＜コードアセンブリ＞
【０３８７】
一部の実施形態では、各トラックについて、トポロジールートが、開始点であり、全ての到達可能なコード及びすべての到達可能なエッジは、ここを通過点にする。コードは通過中に生成される。特定の基本ブロックインスタンスから特定の基本ブロックインスタンスに向かう方法については、前述したとおりである。
【０３８８】
特定のトラックの基本ブロックのインスタンスは命令を有さなくてよい。その場合コードも生成されない。しかし、この基本ブロックインスタンスからの複数の外向きエッジの多くが注意を要する。
【０３８９】
トラックの基本ブロックのインスタンスが、複数の外向きエッジを有しているが、外向きエッジを選択する際の分岐または間接ジャンプが、このトラックのこのインスタンスから削除されている場合には、このトラックは、分岐のこの（削除される）インスタンスとその再収束点との間に命令を含まない。一部の実施形態では、通過が、このトラックの基本ブロックのこのインスタンスの複数の外向きエッジのいずれにも追従するものであってならず、この代わりに、直接、このトラックのこの基本ブロックインスタンスの最後の（削除される）分岐またはジャンプの再収束点に行くものである必要がある。
【０３９０】
基本ブロックインスタンスからの外向きエッジが１つある場合には、このエッジに追従する（分岐またはジャンプがあってもなくても）。
【０３９１】
複数の外向きエッジのなかから選択されるこのトラックの基本ブロックインスタンスの最後に分岐または間接ジャンプがある場合には、通過は、この複数の外向きエッジに追従する。
【０３９２】
一部の実施形態では、トラックの通過が、このトラックの１以上の命令を含む基本ブロックインスタンスに遭遇したときには、コードがあることになる。既にプールを退出したコードを利用したり、プールに新たなコードを追加することができる。いずれにしても、利用するコードは、特定のアドレスに配置される。そして、この経路の最後に生成されたコードを直してこのアドレスに進む。このコードを、この経路の直前のコードの後に順次配置することもできるだろう。そしてなにもここに到達させる必要がない。または、直前の命令が、分岐またはジャンプである可能性もある。そして、その対象ＩＰが、正しい位置にくるまで直される必要がある。この経路の直前のコードは、分岐またはジャンプでなくてもよい。この場合には、正確な宛先への無条件ジャンプを挿入する必要がある。
【０３９３】
ほとんどの基本ブロックインスタンスが通常はトラックで到達不可能である。
【０３９４】
生成したコードは、中間形態の多数の闇雲に生成された静的コピーを大量に含んではいけない。生成されるコードは、全ての到達可能な経路において命令の正確なシーケンスのみを有するべきである。
【０３９５】
中間形態のエッジを通過する際、静的コピー間を移動する場合がある。静的コピーは、生成されるコードから識別されない。一般的な構想としては、たとえば既に正確な命令シーケンスを有するコードがあった場合などに、正確な元のＩＰ用に生成されたコードへのループバックを閉鎖するなどして、正確な命令シーケンスになるべく迅速にたどり着く、というものである。別の例としては、異なる静的コピー用に生成されたが、正確な命令シーケンスを有しているコードに進む、というものもある。
【０３９６】
既に進んだコードが出てくる問題がある。これは、しばらく正しい既存の命令シーケンスが、時間を経て待ちしなくなったようなケースが考えられる。コードは、２つの異なる場合において同じ元のＩＰに赴くことができるが、同じ元のＩＰから要求されるコードシーケンスは２つの場合において異なる。
【０３９７】
＜線形静的複製＞
【０３９８】
一部の実施形態では、制御フローが、非ループブランチの一般的な再収束点に物理的に再度合流しないようにするために、線形静的複製により、次のバックエッジまで、コードの「コピー」を生成している。これは基本的に、含まれているループの次の繰り返し、または含んでいるループの退出までとなる。数多くのコードの「コピー」を生じさせる分岐ツリーが存在する場合がある。
【０３９９】
すべてではないがほとんどの場合、ある分岐の一般的な再収束点の後に別個に保持されたコードは、異なるトラック（望ましい差）についての異なるサブセットにはならない。コード生成においては、これは、まとめられてよい（異なるトラックについて異なる命令サブセットについて別個に）が、この理由は、一般的な再収束点において、今後ずっと、命令シーケンスが同じであるからである。コピーが消失する。コードの多くのコピーの全てが同じではないとしても、これらは、いくつかの異なる可能性に分類される場合が多いので、多くの静的コピーは実際には、生成されたコードのいくつかの静的コピーのみを生じさせると考えられる。
【０４００】
分岐Ｂのコピーが全てなくなって、生成されたコードが元のコードとまったく同じように完全に再収束した場合には（異なるトラックについての命令サブセットを除いて）、確かに、この静的複製から得られる利点が全くないことになる。このコードは、送信依存性を引き起こすルート（conduit）となる。分離できない場合、並列性を制限する偽の依存性を生成する。分離はしなくてよい。これに加えて、Ｂの一般的な再収束点の後のコードのコピーが、常にではないとしても、ときにトラックの分離によって異なってしまう場合もある。
【０４０１】
＜ループの一括アンロール＞
【０４０２】
一部の実施形態では、一括ループアンロールが、ネストされたループのコードの多くの「コピー」を生成する。たとえば、４レベルのネストループがあって、２通りのアンロール法しかない場合には、一番内部には１６つのループ本体のコピーがあることになる。これら１６つのコピーがすべて異なる可能性は低い。その反対である。ループのアンロールが利点を生じさせる確率は、５０％よりずっと低い。フローのアンロールのほとんど（すべてである場合もある）が、生産的ではない。非生産的なアンロールは、通常すべてのコピーにおいて、そのループについて同じになる（異なるトラックの異なる命令サブセット以外は）。ここで、ほとんどの場合（しばしば）、アンロールの全てを再度コード生成時点でまとめる場合がある。しかし、一方で、いくつかのコピーが異なっており、並列性に寄与する場合もある。
【０４０３】
アンロールからのループ本体の２つのコピーが同じ場合には、コード生成において、そのループのバックエッジが同じ位置に行くが、この理由は、要求されている以降の命令シーケンスが永久的に同じだからである。このコピーのアンロールコピーが消失している。これが内部のループであった場合には、外部ループが生成する多くのコピーで、同じことが起こる。
【０４０４】
外部ループが生産的アンロールを有している場合、外部ループのコピー同士が異なっていたとしても、内部ループが外部ループの複数のコピーで異ならないことも十分に考えられる。ループは、本質的にハンモックを形成する傾向がある。内部ループがサブルーチンになる可能性が非常に高い。そのコピーは１つだけある（異なるトラックの異なる命令サブセット以外は）。外部ループの複数のコピーから生き残ったものと称される。
【０４０５】
＜インラインされたプロシージャ＞
【０４０６】
一部の実施形態では、プロシージャが「インラインされ」、その「コピー」を生成している。これは再帰的なものなので、数個の呼び出しレベル及び数回の呼び出しサイトをもってすれば、多数の「コピー」が存在しうる。他方で、プロシージャは、ＤＴＳＥサブルーチンにとって理想的な候補である。ほとんどの共通するケースにおいて、可能性として、プロシージャの多くの「コピー」が全て同じであることがわかる場合があるだろう（異なるトラックの異なる命令サブセット以外で）。または、いくつか実際の異なるバージョンのみがあるとわかる場合もあるあろう（異なるトラックの異なる命令サブセット以外で）。したがってプロシージャは、１つまたはいくつかのＤＴＳＥサブルーチンとなる（異なるトラックの異なる命令サブセット以外で）。
【０４０７】
「インラインされていない」場合、プロシージャは、偽の依存性を生成する可能性がある。したがって、プロシージャが１度のＤＴＳＥサブルーチン（トラック１つについて）として再構築される場合であっても、依存度分析において完全に「コピー」されることが望まれる。これに加えて、プロシージャの「コピー」は時折、常にではないが、トラックの分離によって異なってしまう場合がある。
【０４０８】
＜複製されたストア＞
【０４０９】
まったく同じ命令が、最終的には、冗長的に実行される複数のトラックとしてみえるようになることがある。これは、この命令を複数のトラックから削除できなかったことに起因して生じる。どの命令でも起こりうることなので、冗長的に実行されるストアを複数のトラックを設けてもよい。
【０４１０】
一部の実施形態では、ＤＴＳＥソフトウェアは、複数のトラックで冗長的な同じストアのケースをマークする。ストアは、特定の接頭語をとってもよいし、ストアマーカ命令の複製の後にきてもよい。一部の実施形態では、ストアマーカ命令の複製は、ＤＴＳＥレジスタへのストアであってもよい。ストアマークの複製は、どんな形態であっても、他のトラックのうちどれが、これと同じストアを冗長的に実行することを示すものであるべきである。
【０４１１】
＜マーカの位置合わせ＞
【０４１２】
一部の実施形態では、ＤＴＳＥハードウェアが２個以上のトラックから同じ位置のスパンの同じバイトへのストアを検知すると、違反を宣言して、最後にグローバルにコミットされている状態への状態復帰を行い、フローを抜ける。もちろん、マークされた冗長的なストアを予測することもできる。ＤＴＳＥハードウェアは、冗長的に実行された、マークされた冗長ストアにマッチして、１つのストアとしてコミットされる。
【０４１３】
スパンマーカは、位置合わせスパン分離器である。マークされた複製ストアは、位置合わせスパン分離器である。位置合わせマーカは、位置合わせスパン分離器である。
【０４１４】
一部の実施形態では、位置合わせマーカが特別な命令である。ＤＴＳＥレジスタへのストアであり、他のトラックのうちどれが同じ位置合わせマーカを有しているかを示す。
【０４１５】
複数のトラックに同じバイトへのストアがある場合には、ハードウェアは、衝突するストア同士が異なる位置合わせスパンにあることを条件に、これらストアをプログラム順に適切に配置することができる。
【０４１６】
ＤＴＳＥハードウェアは、同じトラックからのメモリアクセスのプログラムの順序を知っている。ハードウェアは、異なる位置合わせスパンにある場合のみに、異なるトラックのメモリアクセスのプログラムの順序を知ることができる。一部の実施形態では、ハードウェアが同じトラックで実行されなかったストアからのデータを必要とするロードの可能性があると思う場合には、違反を宣言して、最後にグローバルにコミットされた状態に状態を復帰させてフローを抜ける。
【０４１７】
一部の実施形態では、ＤＴＳＥソフトウェアは、同じバイトにヒットしていることが観察された複数のトラックで生じるストア間の位置合わせマーカのいずれかの形態を配置する。ＤＴＳＥソフトウェアは、位置合わせマーカを配置して、ストアと同じアドレスにヒットしたことが観察されたロード全てを、ハードウェアの適切な順序にする。
【０４１８】
＜状態セーブ及び復帰＞
【０４１９】
一部の実施形態では、グローバルコミット点が各スパンマーカに設けられる。スパンマーカ自身は、ハードウェアに識別子を送信する。一部の実施形態では、ＤＴＳＥソフトウェアがテーブルを構築する。状態を最後にグローバルにコミットされた点に復帰する必要がある場合には、ソフトウェアはハードウェアから識別子を取得して、テーブルでこのグローバルコミット点を探す。ＤＴＳＥソフトウェアは、テーブルに、頻繁に変化せず、コード準備時点で知ることができるこのコード位置の他の状態とともに、このグローバルコミット点の元のコードＩＰ（たとえばコードが実行されているリング）を書き込む。他の情報は、最後にグローバルにコミットされた点から変更されたものであってよいレジスタであってよい。このコードは様々なグローバルコミット点用にカスタマイズ可能なので、ここには状態を復帰させるソフトウェアコードへのポインタがあってもよい。
【０４２０】
一部の実施形態では、各スパンマーカにコードを追加して、適宜、セーブする必要のあるデータをすべてセーブするようにして、状態を復帰できるようにしておいてもよい。これには、少なくとも一部のレジスタ値が含まれてよいだろう。
【０４２１】
一部の実施形態では、グローバルコミット点にカスタマイズされてよいコードを追加して、状態を復帰させることができる。コードへのポインタは、テーブルで調整される（paced）。
【０４２２】
グローバルコミット点は、比較的頻繁に遭遇されるが、これに対して状態復帰の頻度はかなり少ない。実際の状態復帰を行う必要があるときには、仕事が大幅に増えるという犠牲を払ってでもグローバルコミット点での仕事を最小限にすることが有利である。
【０４２３】
したがって依存度分析とトラック分離とを行う一部の実施形態では、コードが全て多くの「コピー」に分散される。実行可能なコード生成時には、再度集められる可能性が高い。
【０４２４】
＜論理プロセッサ管理＞
【０４２５】
ＤＴＳＥは、複数の同時のマルチスレッドハードウェアスレッド（たとえば２つの同時マルチスレッドハードウェアスレッド）を１つのコアについて有するコアセットで実装することができる。ＤＴＳＥシステムは、より多い数の論理プロセッサを生成して、各コアが、たとえば２つだけではなく４つの論理プロセッサを有しているように見えるようにすることができる。加えて、ＤＴＳＥシステムは、論理プロセッサを実装するために、コアリソースを効率的に管理することができる。最後に、ＤＴＳＥが幾つかのコードストリームを複数のスレッドに分解して、これらスレッドが論理プロセッサ上で実行されてよい。
【０４２６】
２つの同時マルチスレッドハードウェアスレッドをたとえば有するコアで４つの論理プロセッサを実装するには、一部の実施形態では、ＤＴＳＥシステムが、たとえば、自身尾の状態をコアハードウェアに有することができない２つの論理プロセッサのプロセッサ状態を保持する。ＤＴＳＥシステムは、各同時マルチスレッドハードウェアの状態を時々切り替えることができる。
【０４２７】
ＤＴＳＥは、各ソフトウェアスレッドのコードを生成する。ＤＴＳＥは、ケースバイケースで、１つの元のコードストリームからいくつかのスレッドを生成するようにスレッド分解を行い、または、ＤＴＳＥが、１つの元のコードストリームから１つのスレッドのみを生成することができてよい。コードは、１つの元のコードストリームに同じように生成する。トラック分離においては、コードは２以上のスレッドに分離されてよく、または、トラック分離が、全てのコードを同じ１つのトラックにするだけでもよい。
【０４２８】
実行可能なコードを生成する前に、更なる仕事をコードに対して行って（たとえば命令の追加）、論理プロセッサ管理を実装することができる。
【０４２９】
一部の実施形態では、ＤＴＳＥハードウェアが、実際にはアクセスを実行する各同時マルチスレッドハードウェアスレッドについて異なるストレージにアクセスする、均一にアドレスされる少なくとも１つの格納位置を提供する。一実施形態では、これは、ＲＡＸ等のプロセッサ汎用レジスタである。これは、「ＲＡＸ」として任意のコア上の任意の同時マルチスレッドハードウェアスレッドで実行されているすべてのコードによりアクセスされるが、格納位置及びデータが、「ＲＡＸ」へのアクセスを実行するすべての同時マルチスレッドハードウェアスレッドについて異なっている。一部の実施形態では、プロセッサ汎用レジスタをプログラムコードの実行に利用して、ＤＴＥが、ＤＴＳＥハードウェアが提供する他の同時マルチスレッドハードウェアスレッド特定ストレージを必要とする。これは、たとえば、ＤＴＳＥ論理モジュールの同時マルチスレッドハードウェアスレッドについて１または数個のレジスタであってよい。
【０４３０】
特に一部の実施形態では、同時マルチスレッドハードウェアスレッドの専用格納レジスタＭＥが、この同時マルチスレッドハードウェアスレッド上で現在実行されている論理プロセッサの状態セーブテーブルへのポインタを含む。この位置のテーブルは、実行されるべき次の論理プロセッサのセーブ領域及びこの同時マルチスレッドハードウェアスレッドセーブテーブルにおいて実行されたセーブ領域へのポインタ等の一定の他の情報を含む。
【０４３１】
ＤＴＳＥが全ての元のコードストリームについてすべてのスレッドについて生成するすべてのコードが、同じアドレススペースに存在している。したがって、どの元のコードストリームのどの生成されたコードであっても、どの元のコードストリームのどの生成されたコードに対してであってもジャンプすることができる。ＤＴＳＥ専用データもすべて同じアドレススペースにある。プログラムデータスペースは、一般的に、各元のコードストリームの別のアドレススペースにある。
【０４３２】
＜効率的なスレッド切り替え＞
【０４３３】
一部の実施形態では、ＤＴＳＥが、ＨＴ切り替えエントリポイント及び退出点を、コードを生成する各スレッドに挿入する。したがってこれらエントリポイントの利用は、ハードウェアのセクションで説明した通りである。
【０４３４】
＜ＨＴ切り替えエントリポイント＞
【０４３５】
一部の実施形態では、ＨＴ切り替えエントリポイントにおけるコードは、ＭＥから、自身のセーブテーブルへのポインタを読み出し、次に、次の論理プロセッサセーブテーブルへのポインタを読み出す。このテーブルから、次のＨＴ切り替えエントリポイントのＩＰから、処理されている次のエントリポイントに行く。コードは、このアドレスを分岐予測器のリターン予測スタックに推進する特殊命令を利用することができる。オプションとして、プリフェッチをこのアドレスで、またはおそらくはさらなるアドレスで発行することもできる。これはすべて、この現在のＨＴ切り替えエントリポイントの後に行われる次のＨＴスイッチのセットアップである。リターン予測器は、次のＨＴスイッチを正確に予測することができるようセットアップする必要がある。Ｉキャッシュミスが次のＨＴ切り替えの後にあるような場合には、プリフェッチをこの時点で発行して、このＩストリームを次のＨＴスレッド切り替えのＩキャッシュに備えさせることができる。次にコードが要求している状態を、この時点から自身のセーブテーブルから読み出して、このＨＴ切り替えエントリポイントの後のコードから実行を再開する。これは、要求されているときの、ＣＲ３、ＥＰＴ，及びセグメントレジスタのロードを含んでよい。同じ同時マルチスレッドハードウェアスレッドを共有して同じアドレススペースを有する論理プロセッサを含むと好適であるが、これは、これらが全て同じプロセスからのスレッドを実行しているので、これは必須ではないが、ＨＴ切り替えにおけるこれらレジスタのリロードを必要ではなくす必要があるからである。
【０４３６】
＜ＨＴ切り替え退出点＞
【０４３７】
一部の実施形態では、ＨＴ切り替え退出点のコードが、ＭＥから、自身のセーブテーブルへのポインタを読み出す。自信のセーブテーブルに再開させるために必要な状態を格納する。そして、自身のセーブテーブルから、実行する次の論理プロセッサのセーブテーブルへのポインタを読み出して、ＭＥに書き込む。進む次のＨＴ切り替えエントリポイントのＩＰを読み出して、スタックにプッシュする。これは、必要なＨＴ切り替えエントリポイントへの完全に予測されたジャンプを実行するリターン命令を実行する。
【０４３８】
ＨＴスイッチ退出点のコードは、実行する同時マルチスレッドハードウェアスレッドを再度取得するときに再開されるＩＰを制御する。自身のセーブテーブルのＩＰに欲しいいずれのものであっても格納することができる。
【０４３９】
＜効率的な予測不可能な間接分岐＞
【０４４０】
予測不可能な間接分岐は、一部の実施形態では、ＤＴＳＥにより、間接分岐を変更して、分岐対象を計算するだけにさせるようにすることで効率的に行うことができる。ＨＴ切り替え退出点で後で行うことができるが、テーブルをセーブするための計算された分岐対象を格納する。
【０４４１】
このスレッドに切り替えして戻す場合には、当然、間接分岐の正確な対象に行くことになる。これは、分岐ミス予測及びＩキャッシュミスがない状態で行うことができる（間接分岐であってもＨＴ切り替えであっても）。
【０４４２】
＜論理プロセッサへのリソースの切り替え＞
【０４４３】
一部の実施形態では、特殊命令または接頭語である、分岐レポートまでのフェッチ停止がある。この命令は、分岐または間接ジャンプの直前に挿入することができる。
【０４４４】
分岐レポートまでのフェッチ停止を復号する場合、他の同時マルチスレッドハードウェアスレッドが前進しているという前提で、このＩストリーム停止用の命令フェッチを停止させ、このＩストリームの次の命令の後の命令を復号しない。他の同時マルチスレッドハードウェアスレッドが前進していない場合には、この命令は無視する。以下の命令は、分岐または間接ジャンプであるべきである。タグ付される。分岐及びジャンプが、実行時に、これらが正確に予測されたか予測に失敗したかを報告する。タグ付された分岐が報告する際には、このＩストリームの命令フェッチ及び復号を再開させる。この同時マルチスレッドハードウェアスレッドのいずれかの分岐が予測ミスを報告する場合には、命令フェッチ及び復号を再開させる。
【０４４５】
一部の実施形態では、特殊命令または接頭語である、ロード報告までのフェッチ停止がある。この命令は、ロードの後のいずれかの時点に挿入することができる。ロードの結果にすることができるオペランドを有している。ロード報告までのフェッチ停止命令は、実際に実行される。これは、キャンセルせずにいつ実行されるかを報告する。ロード報告までのフェッチ停止命令には、条件付き及び無条件という２つの形態がある。
【０４４６】
無条件のロード報告までのフェッチ停止命令は、復号されたときに命令フェッチ及び復号を停止させる。条件付きのロード報告までのフェッチ停止命令は、他の同時マルチスレッドハードウェアスレッドが前進している場合にのみ復号されているこのＩストリームにおける復号及び命令フェッチを停止させる。命令の両方の形態が、命令がキャンセルされていない実行を報告したときにこのＩストリーム上での復号命令フェッチ及びを再開させ、このＩストリームについて未処理のデータキャッシュミスはない。
【０４４７】
＜コード分析＞
【０４４８】
フラッシュプロファイリングは、各個々の分岐またはジャンプ実行インスタンスについて、この実行インスタンスが予測ミスであったか正確な予測であったかを示す。これは、Ｉキャッシュミス、第２レベルのキャッシュミス、及びＤＲＡＭへのミスを得た命令実行インスタンスを示す。各ロード実行インスタンスについて、この実行インスタンスがデータキャッシュミス、第２レベルのキャッシュミス、及びＤＲＡＭへのミスを得たかを示す。
【０４４９】
ＤＴＳＥソフトウェアが行うすべての形態の静的複製も、論理プロセッサ管理に利用することができる。一部の実施形態では、ロード、分岐、及び間接ジャンプのすべての静的インスタンスが、番号ミスを得ている。これらの実施形態では、命令の静的インスタンスが、フェッチキャッシュミスの番号を得る。
【０４５０】
同じ命令（元のＩＰによる）の異なる静的インスタンスが、非常に頻繁に非常に異なるミスを犯す場合があるので、一般的には命令の静的なインスタンスを利用するほうがよい。命令のインスタンス数が増えるほど、各インスタンスにおけるミスの率（miss rate numbers）は高くなったり低くなったりする確率が良好になる。中間のミスの率が一番対処し辛い。
【０４５１】
ベストエフォートや、ＩＰのみを利用した場合に比べるとかなり向上したという事実に関わらず、中間範囲のミスの率である命令インスタンスが多いと思われる。一部の実施形態では、分類が、この中間範囲のミスの率に対処する１つの方法である。それぞれが中間範囲のミスの率を有する小さな分岐ツリーが、ツリーを通じて実行経路のいずれかの箇所でのミスの確率が高いことを予測することができる。同様に、いくつかのロードの一連のストリング（それぞれが、中間範囲のミスの率を有する）が、ロードの少なくとも１つにおいてミスの確率が高いと提示することができる。
【０４５２】
ループのアンロールは、分類メカニズムの１つである。ループの繰り返しの個々のロードは、中間範囲のキャッシュミスの率を有している可能性がある。複数のループの繰り返しにおけるロードの実行数がグループとして認識されると、これら繰り返しにおける少なくとも１つにおけるキャッシュミスの高い確率を提示することができる。当然、１回の繰り返しにおける複数のロードを、複数の繰り返しの分類とともに、同じグループに分類することができる。
【０４５３】
一部の実施形態では、ＤＴＳＥソフトウェアが、各グループが、これら種類のミスの比較的高い確率を有するようにグループ分けしてよい。グループは、小さくすることもできる。これは特に分岐ツリーの場合にあてはまる。後で分岐ツリーの分岐は、前には分岐の前であったが今はその分岐の後にある命令を静的に複製することで移動させることができる。これにより、ツリーで分岐同士を密にすることができる。
【０４５４】
グループが分岐ミス予測を生じる可能性が非常に高い場合、一般的には、ＨＴ切り替えを行うに値しない。一部の実施形態では、分岐報告までフェッチを停止する命令を、その経路の上の最後のグループ分岐の直前のグループからはずれた経路に挿入する。実行経路の上のグループの分岐は、復号した後に、他の同時マルチスレッドハードウェアスレッドが前進している間は、復号を停止させる。これにより、他の同時マルチスレッドハードウェアスレッドにコアリソースが与えられる。グループに予測ミスがない場合には、実行経路の最後のグループの分岐が報告したときに、フェッチ及び復号を再開させる。さもなくば、分岐が予測ミスを報告するとすぐに、フェッチが全ての補正された対象アドレスで再開する。これは、分岐が順序に従って報告していない場合もあるので、あまり完璧ではない。
【０４５５】
しかしＨＴスイッチを、上述したように予測ミスの可能性の高い間接分岐に利用する。
【０４５６】
同様に、あるグループが非常にデータキャッシュミスの可能性が高い場合、一般的にはＨＴ切り替えを行わないほうが攻撃である。一部の実施形態では、可能であれば、グループのロードを移動させて、ロード全てがロードの第１のコンシューマの前にくるようにする。一部の実施形態では、ロード報告命令までの条件的フェッチ停止命令は、グループの最後のロードに依存して行われ、ロードの後であって、全てのコンシューマの前に配置される。
【０４５７】
ロード報告までの無条件のフェッチ停止命令は、データキャッシュミスがほぼ確実ではあるが、データキャッシュミス１つだけの場合に利用することができる。
【０４５８】
グループの頻繁なロードは、一般的にはコンシューマの前には配置されない。たとえば、グループがループのアンロールされている繰り返しである場合、こうしても意味がない。この場合には、グループを十分大きくして、少なくとも１つ及び好適にはいくつかのデータキャッシュミスがほぼ避けられないようにすると好適である。これは、一般的には、グループがループのアンロールされている繰り返しである場合に達成可能である。一実施形態では、プリフェッチセットを生成して、グループのロードをカバーすることができる。最初にプリフェッチをもってきて、次にＨＴ切り替えを置き、その次にコードを配置する。
【０４５９】
第２のレベルのキャッシュミスの可能性が高いグループ（ＤストリームまたはＩストリーム）は、ＨＴ切り替えを正当化する。最初にプリフェッチをもってきて、次にＨＴ切り替えを置き、その次にコードを配置する。
【０４６０】
ＤＲＡＭにミスの確率が３０％の場合であっても、これは、ＨＴ切り替えを正当化することができる。これらのインスタンスでは、一部の実施形態では、最初にプリフェッチをもってきて、次にＨＴ切り替えを持ってくる。それでも、いくつかのミスをカバーすることができる場合には、よりグループ化を促進して、ミスを得る確率を高くしてよりよくするほうが好適である。
【０４６１】
一部の実施形態では、他の同時マルチスレッドハードウェアスレッドに対する動作は、ＨＴ切り替えが生じている場合に「カバー」している。対象物は常に、実際の仕事を行っている１つの同時マルチスレッドハードウェアスレッドである。
【０４６２】
他のスレッドがフェッチ停止中に、１つの同時マルチスレッドハードウェアスレッドが実際の仕事を行っている場合には、いつでも動作している同時マルチスレッドハードウェアスレッドに問題がある危険性がある。したがって、一般的には、非常に長い間１つの動作している同時マルチスレッドハードウェアのみに信頼があるわけではない。加えて、通常は長いフェッチ停止は望ましくない。障害に遭遇した場合など、長くなるときは、一部の実施形態では、ＨＴ切り替えを行って、動作している同時マルチスレッドハードウェアスレッドを別のもので助けるようにする。
【０４６３】
＜コンピュータシステム及びプロセッサの例＞
【０４６４】
図１２は、本発明の実施形態のコアのアウトオブオーダアーキテクチャの一例を示すブロック図である。しかし、上述した命令は、インオーダのアーキテクチャで実装することもできる。図１２では、矢印が、２以上のユニットの間の連結を示しており、矢印の方向が、これらユニットのデータフローの方向を示している。このアーキテクチャのコンポーネントは、これら命令のフェッチ、復号、及び実行を含む上述した命令を処理するために利用することができる。
【０４６５】
図１２は、実行エンジンユニット１２１０及びメモリユニット１２１５に連結されたフロントエンドユニット１２０５を含み、実行エンジンユニット１２１０も、メモリユニット１２１５に連結されている。
【０４６６】
フロントエンドユニット１２０５は、レベル２（Ｌ２）分岐予測ユニット１２２０に連結されているレベル１（Ｌ１）分岐予測ユニット１２２２を含む。これらユニットによりコアが、分岐が解消させるのを待たずして、命令をフェッチ及び実行することができるようになる。Ｌ１及びＬ２ブランド予測ユニット１２２０及び１２２２は、Ｌ１命令キャッシュユニット１２２４に連結されている。Ｌ１命令キャッシュユニット１２２４は、命令または１以上のスレッドを保持して、これらは実行エンジンユニット１２１０により実行されてよい。
【０４６７】
Ｌ１命令キャッシュユニット１２２４は、命令変換ルックアサイドバッファ（ＩＴＬＢ）１２２６に連結される。ＩＴＬＢ１２２６は、バイトストリームを離散した命令に分割する命令フェッチ及び事前復号ユニット１２２８に連結される。
【０４６８】
命令フェッチ及び事前復号ユニット１２２８は、命令キューユニット１２３０に連結されて、これら命令を格納する。復号ユニット１２３２は、上述した命令を含むキューされた命令を復号する。一部の実施形態では、復号ユニット１２３２が、複雑な復号ユニット１２３４及び３つの単純な復号ユニット１２３６、１２３８、及び１２４０を含む。単純な復号器は、全てではなくてもほとんどの、１つのｕｏｐに復号可能なｘ８６命令を処理することができる。複雑な復号器は、複数のｕｏｐにマッピングする命令を復号することができる。復号ユニット１２３２は、さらにマイクロコードＲＯＭユニット１２４２を含んでよい。
【０４６９】
Ｌ１命令キャッシュユニット１２２４は、さらに、メモリユニット１２１５内のＬ２キャッシュユニット１２４８に連結される。命令ＴＬＢユニット１２２６は、さらに、メモリユニット１２１５の第２のレベルのＴＬＢユニット１２４６に連結されている。復号ユニット１２３２、マイクロコードＲＯＭユニット１２４２、及びループストリーム復号（ＬＳＤ）ユニット１２４４は、それぞれ、実行エンジンユニット１２１０内のリネーム／割り当てユニット１２５６に連結される。ＬＳＤユニット１２４４は、ソフトウェアのループが実行されるときを検知して、予測分岐を停止させ（及び、失敗しそうなループの最後の分岐の予測を停止させ）、そこからの命令をストリームする。一部の実施形態では、ＬＳＤ１２４４はマイクロオペレーション（micro-op）をキャッシュする。
【０４７０】
実行エンジンユニット１２１０は、退避ユニット１２７４及び統合スケジュールユニット１２５８に連結されたリネーム／割り当てユニット１２５６を含む。リネーム／割り当てユニット１２５６は、すべてのレジスタリネームの前に必要とされるリソースを判断して、実行のために利用可能なリソースを割り当てる。このユニットは、論理レジスタを、物理レジスタファイルの物理レジスタにリネームする。
【０４７１】
退避ユニット１２７４は、さらに実行ユニット１２６０に連結され、リオーダバッファユニット１２７８を含む。このユニットは、完了後に命令を退避させる。
【０４７２】
統合スケジュールユニット１２５８は、さらに、実行ユニット１２６０に連結されている物理レジスタファイルユニット１２７６に連結される。スケジューラは、プロセッサで実行されている様々なスレッド間で共有される。
【０４７３】
物理レジスタファイルユニット１２７６は、ＭＳＲユニット１２７７Ａ、浮動小数点レジスタユニット１２７７Ｂ、及び整数レジスタユニット１２７７Ｃを含み、さらなるレジスタファイル（不図示であり、たとえば、ＭＭＸパック整数フラットレジスタファイル５５０にエイリアスされたスカラー浮動小数点スタックレジスタファイル５４５など）を含んでもよい。
【０４７４】
実行ユニット１２６０は、３つの混合スカラーＳＩＭＤ実行ユニット１２６２、１２６４、及び、１２７２、ロードユニット１２６６、ストアアドレスユニット１２６８、ストアデータユニット１２７０を含む。ロードユニット１２６６、ストアアドレスユニット１２６８、及びストアデータユニット１２７０は、ロード／ストア、及び、メモリ動作を実行して、それぞれがさらに、メモリユニット１２１５内のデータＴＬＢユニット１２５２に連結されている。
【０４７５】
メモリユニット１２１５は、データＴＬＢユニット１２５２に連結されている第２のレベルのＴＬＢユニット１２４６を含む。データＴＬＢユニット１２５２は、Ｌ１データキャッシュユニット１２５４に連結されている。Ｌ１データキャッシュユニット１２５４はさらに、Ｌ２キャッシュユニット１２４８に連結されている。一部の実施形態では、Ｌ２キャッシュユニット１２４８がさらにメモリユニット１２１５の内部及び外部の片方または両方にある、Ｌ３以上のキャッシュユニット１２５０に連結される。
【０４７６】
以下は、ここに詳述した命令の実行に適したシステムの例である。ラップトップ、デスクトップ、ハンドヘルドＰＣ、情報携帯端末、エンジニアリングワークステーション、サーバ、ネットワークデバイス、ネットワークハブ、スイッチ、エンベデッドプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、グラフィックデバイス、ビデオゲームデバイス、セットトップボックス、マイクロコンピュータ、携帯電話、可搬型メディアプレーヤ、ハンドヘルドデバイス、及び様々な他の電子デバイス等の他のシステム設計及び構成の利用も適している。一般的には、ここで開示したプロセッサ及びその他の実行論理の少なくとも１以上を組み込むことのできる多くの種類のシステムまたは電子デバイスの利用が可能である。
【０４７７】
図１３を参照すると、本発明の一実施形態におけるシステム１３００のブロック図が示されている。システム１３００は、グラフィックメモリコントローラハブ（ＧＭＣＨ）１３２０に連結されている１以上の処理エレメント１３１０、１３１５を含んでよい。さらなる処理エレメント１３１５の随意的性質は、図１３において破線により示している。
【０４７８】
各処理エレメントは、シングルコアであってもよいし、または、複数のコアを含んでもよい。処理エレメントは、随意で、処理コア以外に、他のオンダイのエレメント（たとえば、集積メモリコントローラ及び集積Ｉ／Ｏ制御論理の少なくとも１以上）を含むこともできる。さらに少なくとも１つの実施形態について、処理エレメントのコアをマルチスレッドかして、これらが１つのコアについて２以上のハードウェアスレッドコンテキストを含むようにすることもできる。
【０４７９】
図１３は、たとえば動的ランダムアクセスメモリ（ＤＲＡＭ）であってよいメモリ１３４０に連結されていてよいＧＭＣＨ１３２０を示している。ＤＲＡＭは、少なくとも１つの実施形態では、不揮発性キャッシュに関連付けられていてよい。
【０４８０】
ＧＭＣＨ１３２０は、チップセット、またはチップセットの一部であってよい。ＧＭＣＨ１３２０は、プロセッサ１３１０、１３１５と通信してよく、プロセッサ１３１０、１３１５及びメモリ１３４０の間の相互作用を制御することができる。ＧＭＣＨ１３２０は、さらに、プロセッサ１３１０、１３１５及びシステム１３００の他のエレメントの間の加速バスインタフェースとして機能してよい。少なくとも１つの実施形態では、ＧＭＣＨ１３２０は、プロセッサ１３１０、１３１５と、マルチドロップバス（たとえばフロントサイドバス（ＦＳＢ）１３９５）経由で通信する。
【０４８１】
さらにＧＭＣＨ１３２０は、ディスプレイ１３４５（たとえばフラットパネルディスプレイ）に連結される。ＧＭＣＨ１３２０は、集積グラフィックアクセラレータを含んでよい。ＧＭＣＨ１３２０は、さらに、様々な周辺機器をシステム１３００に連結するために利用することができる入出力（Ｉ／Ｏ）コントローラハブ（ＩＣＨ）１３５０に連結されている。図１３の実施形態にはさらに、たとえば、別の周辺機器１３７０とともにＩＣＨ１３５０に連結される別のグラフィックデバイスであってよい外部グラフィックデバイス１３６０も示されている。
【０４８２】
システム１３００には、さらなるまたは別の処理エレメントも含まれているとして示されている。たとえばさらなる処理エレメント１３１５が、プロセッサ１３１０と同じさらなるプロセッサ、プロセッサ１３１０とは異種または非対称なさらなるプロセッサ、アクセラレータ（たとえばグラフィックアクセラレータまたはデジタル信号処理（ＤＳＰ）ユニット）、フィールドプログラム可能ゲートアレイ、その他の任意の処理エレメントを含んでよい。物理リソース１３１０、１３１５の間には、アーキテクチャ、マイクロアーキテクチャ、熱、電力消費特性等の様々な利点の計測に関して様々な差があってよい。これらの差は、処理エレメント１３１０、１３１５の非対称及び異種性を効果的に表していてよい。少なくとも１つの実施形態では、様々な処理エレメント１３１０、１３１５が、同じダイパッケージに含められていてよい。
【０４８３】
図１４を参照すると、本発明の一実施形態における第２のシステム１４００のブロック図が示されている。図１４では、マイクロプロセッサシステム１４００が、ポイントツーポイントインターコネクトシステムであり、ポイントツーポイントインターコネクト１４５０を介して連結された第１の処理エレメント１４７０と第２の処理エレメント１４８０とを含むと示されている。図１４では、各処理エレメント１４７０及び１４８０が、（第１処理コア及び第２処理コア（つまりプロセッサコア１４７４ａ及び１４７４ｂ及びプロセッサコア１４８４ａ及び１４８４ｂ）を含む）マルチコアプロセッサであってよい。
【０４８４】
この代わりに、処理エレメント１４７０、１４８０の１以上が、プロセッサ以外のエレメントであってよい（たとえばアクセラレータまたはフィールドプログラム可能ゲートアレイ）。
【０４８５】
２つの処理エレメント１４７０、１４８０しか示されていないが、本発明の範囲はこれに限定はされないことを理解されたい。他の実施形態では、１以上のさらなる処理エレメントを任意のプロセッサに加えてもよい。
【０４８６】
第１の処理エレメント１４７０は、さらに、メモリコントローラハブ（ＭＣＨ）１４７２及びポイントツーポイント（Ｐ−Ｐ）インターフェース１４７６及び１４７８を含んでよい。同様に、第２の処理エレメント１４８０が、ＭＣＨ１４８２およびＰ−Ｐインターフェース１４８６および１４８８を含んでよい。プロセッサ１４７０、１４８０は、ポイントツー（ＰｔＰ）インターフェース１４５０を介して、ＰｔＰインターフェース回路１４７８、１４８８を利用してデータを交換する。図１４に示すように、ＭＣＨ１４７２およいｂ１４８２は、プロセッサをそれぞれのメモリ（つまり、メモリ１４４２及びメモリ１４４４）に連結するが、これらメモリは、それぞれのプロセッサにローカルに取り付けられているメインメモリの部分であってよい。
【０４８７】
プロセッサ１４７０、１４８０は、それぞれが、ポイントツーポイントインターフェース回路１４７６、１４９４、１４８６、１４９８を利用して、個々のＰｔＰインターフェース１４５２、１４５４を介してチップセット１４９０と、データを交換することができる。チップセット１４９０はさらに、高パフォーマンスグラフィックインターフェース１４３９を介して、高パフォーマンスグラフィック回路１４３８とデータを交換してもよい。本発明の実施形態は、任意の数のプロセッサコアを有する任意のプロセッサ内にあってもよいし、または図１４の各ＰｔＰバスエージェントな内にあってもよい。一実施形態では、任意のプロセッサコアが、ローカルキャッシュメモリ（不図示）を含んでも、これと関連付けられていてもよい。さらに、共有キャッシュ（不図示）が、両方のプロセッサ外のいずれかのプロセッサに含まれておりながら、ｐ２ｐインターコネクト経由でプロセッサに接続されていてもよい（たとえば、プロセッサ片方または両方のローカルキャッシュ情報を、プロセッサが低電力モードに入ったとき共有キャッシュに格納することができるように）。
【０４８８】
第１の処理エレメント１４７０及び第２の処理エレメント１４８０は、Ｐ−Ｐインターコネクト１４７６、１４８６、及び１４８４をそれぞれ介して、チップセット１４９０に連結されていてもよい。図１４に示すように、チップセット１４９０は、Ｐ−Ｐインターフェース１４９４及び１４９８を含む。さらにチップセット１４９０は、チップセット１４９０をコウパフォーマンスグラフィックエンジン１４４８に連結するためにインターフェース１４９２を含む。一実施形態では、バス１４４９が、グラフィックエンジン１４４８をチップセット１４９０に連結するために利用されてもよい。この代わりに、ポイントツーポイントインターコネクト１４４９がこれらコンポーネントを連結してもよい。
【０４８９】
チップセット１４９０は、インターフェース１４９６を介して第１のバス１４１６に連結されていてよい。一実施形態では、第１のバス１４１６が、周辺コンポーネントインターコネクト（ＰＣＩ）バス、または、ＰＣＩ  Ｅｘｐｒｅｓｓその他の第三世代Ｉ／Ｏインターコネクトバスであってよいが、本発明の範囲はこれに限定はされない。
【０４９０】
図１４に示すように、様々なＩ／Ｏデバイス１４１４が、第１のバス１４１６を第２のバス１４２０に連結するバスブリッジ１４１８とともに第１のバス１４１６に連結されてよい。一実施形態では、第２のバス１４２０は、低ピンカウント（ＬＰＣ）バスであってよい。一実施形態では、様々なデバイス（たとえばキーボード／マウス１２２、通信デバイス１４２６、及びデータ格納ユニット１４２８（たとえばディスクドライブその他の大容量記憶デバイス（コード１４３０を含む）を含む））が第２のバス１４２０に連結されていてよい。さらにオーディオＩ／Ｏ１４２４が、第２のバス１４２０に連結されてよい。他のアーキテクチャを利用してもよい。たとえばズ１４のポイントツーポイントアーキテクチャの代わりに、システムはマルチドロップバスその他のアーキテクチャを実装してもよい。
【０４９１】
図１５を参照すると、本発明の一実施形態における第３のシステム１５００のブロック図が示されている。図１４及び図１５の同様のエレメントには同様の参照番号が付されており、図１４の一定の側面は図１５では省くことで、図１５の他の側面をあいまいにしないようにしている。
【０４９２】
図１５は、処理エレメント１４７０、１４８０が、集積メモリ及びＩ／Ｏ制御論理（「ＣＬ」）１４７２及び１４８２をそれぞれ含んでよいことを示している。少なくとも１つの実施形態では、ＣＬ１４７２、１４８２が、図１３及び図１４を参照して説明したようなメモリコントローラハブ論理（ＭＣＨ）を含んでよい。加えて、ＣＬ１４７２、１４８２もＩ／Ｏ制御論理を含んでよい。図１５は、ＣＬ１４７２、１４８２に連結されているメモリ１４４２、１４４４だけではなく、Ｉ／Ｏデバイス１５１４もが、制御論理１４７２、１４８２に連結されていてもよいことを示している。レガシーＩ／Ｏデバイス１５１５が、チップセット１４９０に連結されている。
【０４９３】
ここに開示するメカニズムの実施形態は、ハードウェア、ソフトウェア、ファームウェア、またはこれら実装方法の組み合わせで実装されてよい。本発明の実施形態は、少なくとも１つのプロセッサ、データ記憶システム（揮発性及び不揮発性メモリ及び記憶素子のすくなくとも１つを含む）、少なくとも１つの入力デバイス、及び、少なくとも１つの出力デバイスを含む、プログラム可能なシステムで実行されうるコンピュータプログラムまたはプログラムコードとして実装されてよい。
【０４９４】
図１４に示すコード１４３０のようなプログラムコードは、データを入力して、ここに記載する機能を実行し、出力情報を生成するために利用することができる。出力情報は１以上の出力デバイスに公知の方法で適用することができる。この用途のために、処理システムは、プロセッサ（たとえばデジタル信号プロセッサ（ＤＳＰ）、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、またはマイクロプロセッサ）を有する任意のシステムを含む。
【０４９５】
プログラムコードは、処理システムと通信するための高レベルプロシージャプログラミング言語またはオブジェクト指向プログラミング言語で実装されてよい。プログラムコードはさらに適宜アセンブリ言語または機械言語で実装されてよい。実際、ここに記載するメカニズムは、特定のプログラミング言語の範囲に限定はされない。いずれにしても、言語はコンパイル言語であっても解釈された言語であってもよい。
【０４９６】
少なくとも１つの実施形態の１以上の態様を、プロセッサ内の様々な論理を表す機械可読媒体に格納されたデータにより実装されてもよく、これらは、機械により読まれると、機械に、ここに記載する技術を実行する論理を製造させることができる。この表現は（「ＩＰコア」として知られている）、有形の、機械可読媒体に格納されて、様々なコンシューマまたは製造所に送られ、実際に論理またはプロセッサを製造する製造機械にロードされてよい。
【０４９７】
これら機械可読記憶媒体は、これらに限定はされないが、機械またはデバイスが製造したり形成したりする粒子の永続的ではない、有形の配置（ハードディスク等の記憶媒体、フロッピー（登録商標）ディスク、光ディスク、ＣＤ−ＲＯＭ，ＣＤ−ＲＷ，及び磁気光ディスク、半導体素子（ＲＯＭ、ＤＲＡＭ等のＲＡＭ，ＳＲＡＭ，ＥＰＲＯＭ、フラッシュメモリ、ＥＥＰＲＯＭ）、磁気カード、または光カード、その他の種類の電子命令の格納に適した媒体等）を含んでよい。
【０４９８】
したがって本発明の実施形態はさらに、構造、回路、装置、プロセッサ、及びここで記載するシステム特徴を含む、非永続的で、有形の機械可読媒体（ＨＤＬ等の設計データを含むまたは命令を含む）を含んでもよい。これらの実施形態はさらにプログラムプロダクトと称されてもよい。
【０４９９】
ここに開示された命令の一定の処理は、ハードウェアコンポーネントにより実施されてもよいし、回路、または他のハードウェアコンポーネントを少なくとも処理を実装する命令でプログラミングさせるために利用される機械実行可能命令に具現化されてよい。回路は、ほんの数例を挙げると、汎用または専用プロセッサ、論理回路を含んでよい。処理はさらに、随意でハードウェア、ソフトウェアの組み合わせで実行されてもよい。実行論理及びプロセッサの少なくとも１以上は、命令特定結果オペランドを格納するために機械命令から導出される１以上の制御信号または機械命令に呼応する特定の回路またはその他の論理を含んでよい。たとえば、ここに開示される命令の実施形態は、図１３、図１４、及び図１５のシステムの１以上で実施されてもよいし、命令の実施形態が、プログラムコードに格納されて、システムで実行されてもよい。
【０５００】
上述した記載は、本発明の好適な実施形態を示すことを意図している。上述した説明から、特に成長著しいために将来の進歩を予測することが難しい技術分野では、本発明を添付請求項及びその均等物の範囲の本発明の原理から逸脱せずに構成及び詳細を変更することができることが容易に分かるだろう。たとえば方法の処理の１以上を組み合わせたり、さらに分解したりすることもできる。
【０５０１】
＜別の実施形態＞
【０５０２】
実施形態は、ここに記載した命令を生来実行することができるものとして記載してきたが、本発明の別の実施形態は、命令を、異なる命令セットを実行するプロセッサで実行されるエミュレーション層で実行することもできる（たとえば、カリフォルニア州のＳｕｎｎｙｖａｌｅ在住のＭＩＰＳ  Ｔｅｃｈｎｏｌｏｇｉｅｓ社によるＭＩＰＳ命令を実行するプロセッサ、カリフォルニア州のＳｕｎｎｙｖａｌｅ在住のＡＲＭ  Ｈｏｌｄｉｎｇｓ社のＡＲＭ命令セットを実行するプロセッサ）。さらに、図面のフロー図は、本発明の一定の実施形態が実施する特定順序の処理を示しているが、このような順序はあくまで例であることを理解されたい（たとえば、別の実施形態では、異なる順序で処理を実行したり、一定の処理を組み合わせたり、一定の処理をまとめたりすることができる）。
【０５０３】
前述した明細書では、本発明が特定の例示的な実施形態を参照して説明された。しかし、請求項に示されている本発明の広義の精神及び範囲を逸脱せずに様々な変更例及び変形例が可能である。したがって、明細書及び図面は、例示を意図しており、限定的な意味で受け取られるべきではない。
【図１】
0005816298.tif 000002
【図２】
0005816298.tif 000003
【図３】
0005816298.tif 000004
【図４】
0005816298.tif 000005
【図５】
0005816298.tif 000006
【図６】
0005816298.tif 000007
【図７】
0005816298.tif 000008
【図８】
0005816298.tif 000009
【図９】
0005816298.tif 000010
【図１０】
0005816298.tif 000011
【図１１】
0005816298.tif 000012
【図１２】
0005816298.tif 000013
【図１３】
0005816298.tif 000014
【図１４】
0005816298.tif 000015
【図１５】
0005816298.tif 000016