(57)【特許請求の範囲】
【請求項１】
複数のプロセッサを含み、前記プロセッサの各々はレジスタファイルと、リオーダバッファと、投機的マルチスレッド実行を支持するための回路とを含み、さらに
リオーダバッファタグ変換バッファを含み、前記変換バッファは、第１のプロセッサのリオーダバッファのエントリを第２のプロセッサのリオーダバッファのエントリにマップし、さらに
スレッド制御装置を含み、前記スレッド制御装置は前記プロセッサ間の命令を記憶および伝送するように構成され、前記命令は前記プロセッサ上のスレッドの投機的実行を支持し、前記スレッドは並行して実行されてもよい、多重プロセッサコンピュータ。
【請求項２】
前記回路は前記スレッドの前記実行の同期を支持するように構成される、請求項１に記載の多重プロセッサコンピュータ。
【請求項３】
前記回路はプロセッサ間通信ユニットを含む、請求項２に記載の多重プロセッサコンピュータ。
【請求項４】
前記プロセッサ間通信ユニットは予約ステーションを含む、請求項３に記載の多重プロセッサコンピュータ。
【請求項５】
前記プロセッサ間通信ユニットは、予約ステーション、ロックされた読取予約ステーション、ロックされた書込予約ステーション、およびスクラッチパッド機能ユニットを含む、請求項３に記載の多重プロセッサコンピュータ。
【請求項６】
前記多重プロセッサコンピュータはスクラッチパッド命令を含み、前記スクラッチパッド命令は、第１のプロセッサ上でランする第１のスレッドと第２のプロセッサ上でランする第２のスレッドとの間で共有されるデータの交換を支持する、請求項５に記載の多重プロセッサコンピュータ。
【請求項７】
前記多重プロセッサコンピュータは複数の前記リオーダバッファタグ変換バッファを含む、請求項１に記載の多重プロセッサコンピュータ。
【請求項８】
前記スレッド制御装置は、前記プロセッサ上の前記スレッドの実行を同期させるように構成される、請求項１に記載の多重プロセッサコンピュータ。
【請求項９】
前記スレッド制御装置は、
記憶バッファと、
同期論理とを含み、前記同期論理は、前記プロセッサ上の前記スレッドの同期を支持するように構成される、請求項８に記載の多重プロセッサコンピュータ。
【請求項１０】
前記スレッド制御装置はさらに、
複数のスクラッチパッドレジスタを含む、請求項９に記載の多重プロセッサコンピュータ。
【請求項１１】
前記記憶バッファは複数のＦＩＦＯを含む、請求項９に記載の多重プロセッサコンピュータ。
【請求項１２】
前記スレッドの前記実行の前記同期は、
第１の同期命令を実行する前記第１のプロセッサと、
第２の同期命令を実行する前記第２のプロセッサと、
前記第１の同期命令が前記第１のプロセッサでリタイアする準備ができていることと前記第２のプロセッサの前記第２の同期命令がリタイアする準備ができていないこととを検出することに応答して、前記第１のプロセッサ上の前記スレッドの実行を停止する前記第１のプロセッサと、
前記第２の同期命令が前記第２のプロセッサでリタイアする準備ができていることと前記第１のプロセッサの前記第１の同期命令がリタイアする準備ができていないこととを検出することに応答して、前記第２のプロセッサ上の前記スレッドの実行を停止する前記第２のプロセッサと、
前記第１の同期命令と前記第２の同期命令とが両方ともリタイアする準備ができていることを検出することに応答して、前記第１のプロセッサ上の前記スレッドの実行を継続する前記第１のプロセッサと、
前記第１の同期命令および前記第２の同期命令が両方ともリタイアする準備ができていることを検出することに応答して、前記第２のプロセッサ上の前記スレッドの実行を継続する前記第２のプロセッサとを含む、請求項８に記載の多重プロセッサコンピュータ。
【請求項１３】
前記スレッドの前記実行の前記同期は、
第１の同期命令を実行する前記第１のプロセッサと、
第２の同期命令を実行する前記第２のプロセッサと、
前記第１の同期命令が前記第１のプロセッサでリタイアする準備ができていることと前記第２のプロセッサの前記第２の同期命令がリタイアする準備ができていないこととを検出することに応答して、前記第１のプロセッサ上の前記スレッドの実行を停止する前記第１のプロセッサと、
前記第２の同期命令は前記第２のプロセッサでリタイアする準備ができていることと前記第１のプロセッサの前記第１の同期命令はリタイアする準備ができていないこととを検出することに応答して、前記第２のプロセッサ上の前記スレッドの実行を停止する前記第２のプロセッサと、
前記第１の同期命令と前記第２の同期命令とが両方ともリタイアする準備ができていることを検出することに応答して、前記第１の同期命令をリタイアする前記第１のプロセッサと、
前記第１の同期命令と前記第２の同期命令とが両方ともリタイアする準備ができていることを検出することに応答して、前記第２の同期命令をリタイアする前記第２のプロセッサと、
前記第１の同期命令が前記第１のプロセッサでリタイアしたことと前記第２のプロセッサで前記第２の同期命令はリタイアしていないことを検出することに応答して、前記第１のプロセッサ上の前記スレッドの実行を停止する前記第１のプロセッサと、
前記第２の同期命令は前記第２のプロセッサでリタイアしたことと前記第１の同期命令は前記第１のプロセッサでリタイアしていないこととを検出することに応答して、前記第２のプロセッサ上の前記スレッドの実行を停止する前記第２のプロセッサと、
前記第１の同期命令と前記第２の同期命令とがリタイアしたことを検出することに応答して、前記第１のプロセッサ上の前記スレッドの実行を継続する前記第１のプロセッサと、
前記第１の同期命令と前記第２の同期命令とがリタイアしたことを検出することに応答して、前記第２のプロセッサ上の前記スレッドの実行を継続する前記第２のプロセッサとを含む、請求項８に記載の多重プロセッサコンピュータ。
【請求項１４】
前記複数のプロセッサの第１のプロセッサはマスタであり、前記マスタは前記多重プロセッサコンピュータ上のすべての単一スレッドコードを実行する、請求項１に記載の多重プロセッサコンピュータ。
【請求項１５】
複数のマルチスレッド命令をさらに含み、
前記マスタは前記複数のマルチスレッド命令の第１の命令に応答してデータを前記マスタのレジスタファイルから第２のプロセッサに運び、
前記第２のプロセッサは前記複数のマルチスレッド命令の第２の命令に応答してデータを前記第２のプロセッサのレジスタファイルから前記マスタに運び、
前記第２のプロセッサは前記複数のマルチスレッド命令の第３の命令に応答して命令のスレッドの実行を開始し、
前記第２のプロセッサは前記複数のマルチスレッド命令の第４の命令に応答して命令の前記スレッドの実行を終了し、
前記マスタおよび前記第２のプロセッサは前記複数のマルチスレッド命令の第５の命令に応答してスレッド実行を同期させる、請求項１４に記載の多重プロセッサコンピュータ。
【請求項１６】
前記第１の命令はＷｒ２Ｐｒｏｃ命令であり、前記第２の命令はＲｄＦｒＰｒｏｃ命令であって、前記第３の命令はフォーク命令であり、前記第４の命令は結合命令であり、前記第５の命令は同期命令である、請求項１５に記載の多重プロセッサコンピュータ。
【請求項１７】
前記第１の命令、前記第２の命令、および前記第３の命令は前記第２のプロセッサにおいて投機的に実行される、請求項１５に記載の多重プロセッサコンピュータ。
【請求項１８】
前記第１の命令は、前記第１の命令が前記第２のプロセッサの前記リオーダバッファでリタイアする準備ができていることを検出することと前記第１の命令が前記マスタのリオーダバッファからリタイアしたことの表示を前記マスタから受取ることとに応答して、前記第２のプロセッサのリオーダバッファからリタイアされ、
前記第３の命令は、前記第３の命令が前記第２のプロセッサの前記リオーダバッファでリタイアする準備ができていることを検出することと前記第３の命令が前記マスタの前記リオーダバッファからリタイアしたことの表示を前記マスタから受取ることとに応答して、前記第２のプロセッサの前記リオーダバッファからリタイアされる、請求項１５に記載の多重プロセッサコンピュータ。
【請求項１９】
前記第１の命令は、前記第１の命令が前記第２のプロセッサの前記リオーダバッファでリタイアする準備ができていることを検出することと前記第３の命令が前記マスタのリオーダバッファからリタイアしたことの表示を前記マスタから受取ることとに応答して、前記第２のプロセッサのリオーダバッファからリタイアされ、
前記第３の命令は、前記第３の命令が前記第２のプロセッサの前記リオーダバッファでリタイアする準備ができていることを検出することと前記第３の命令が前記マスタの前記リオーダバッファからリタイアしたことの表示を前記マスタから受取ることとに応答して、前記第２のプロセッサの前記リオーダバッファからリタイアされる、請求項１５に記載の多重プロセッサコンピュータ。
【請求項２０】
第１のプロセッサが、第２のプロセッサ上でのスレッドの実行のためのスレッドセットアップを行なうステップを含み、前記セットアップは前記第１のプロセッサが、前記第２のプロセッサにセットアップ命令を運び、前記セットアップ命令は前記第２のプロセッサ上で投機的に実行され、さらに
前記第１のプロセッサが、リオーダバッファのリオーダバッファタグを記憶するステップを含み、前記リオーダバッファタグは、前記セットアップ命令の第１の命令を含む前記第１のプロセッサの前記リオーダバッファの場所に対応し、さらに
前記第１のプロセッサが、前記第２のプロセッサに起動命令を運ぶステップを含み、前記起動命令は前記第２のプロセッサ上で投機的に実行され、さらに
前記第２のプロセッサが、前記起動命令を受取ることに応答して前記第２のプロセッサ上で前記スレッドを実行するステップを含み、前記スレッドは投機的に実行され、前記スレッドは前記第１のプロセッサ上のスレッドの実行と並行して実行され、さらに
前記第２のプロセッサが、前記第２のプロセッサ上の前記スレッドの前記実行を終了させるステップを含み、前記終了は前記第２のプロセッサにおける第１の終了命令をリタイアするステップを含み、さらに
前記第２のプロセッサが検索結果命令を受取ることに応答して、前記第２のプロセッサが、前記第１のプロセッサに前記第２のプロセッサ上の前記スレッドの前記実行の結果を運ぶステップを含み、前記検索結果命令は前記第２のプロセッサによって投機的に実行され、さらに
前記第２のプロセッサが、リオーダバッファタグ変換バッファを更新するステップを含み、前記更新は前記変換バッファ中の場所に前記第２のプロセッサの前記リオーダバッファのリオーダバッファタグを記憶するステップを含み、前記第２のプロセッサの前記リオーダバッファの前記リオーダバッファタグは前記第２のプロセッサの前記リオーダバッファ中の前記第１の命令の場所に対応し、前記変換バッファ中の前記場所は前記第１のプロセッサの前記リオーダバッファの前記リオーダバッファタグによって選択される、方法。
【請求項２１】
結果を運ぶ前記ステップは、
スレッド制御装置が、前記第１のプロセッサからの検索結果指示を第１のＦＩＦＯに記憶するステップと、
前記第２のプロセッサが、前記第１のＦＩＦＯから前記検索結果命令を読取るステップと、
前記第２のプロセッサが、前記第２のプロセッサのレジスタファイルからデータを読取るステップとを含み、前記データは前記第２のプロセッサの前記レジスタファイルの場所に対応し、前記場所は前記検索結果命令によって表示され、さらに
スレッド制御装置が、前記データを第２のＦＩＦＯに記憶するステップと、
前記第１のプロセッサが、前記第２のＦＩＦＯから前記データを読取るステップとを含む、請求項２０に記載の方法。
【請求項２２】
結果を運ぶ前記ステップは前記第２のプロセッサにおける前記第１の終了命令をリタイアする前記ステップに続き、前記運ぶステップは前記第１のプロセッサにおける第２の終了命令をリタイアするステップに続く、請求項２０に記載の方法。
【請求項２３】
スレッド制御装置が、前記第１のプロセッサ上の前記スレッドの前記実行を前記第２のプロセッサ上の前記スレッドの前記実行と同期させるステップをさらに含む、請求項２０に記載の方法。
【請求項２４】
前記同期させるステップは、
前記第１のプロセッサが、前記第１のプロセッサ上で第１の同期命令を実行するステップと、
前記第１のプロセッサが、前記第２のプロセッサ上で第２の同期命令を実行するステップと、
前記第１のプロセッサが、前記第１の同期命令がリタイアする準備ができていることと前記第２の同期命令はリタイアする準備ができていないこととを検出することに応答して、前記第１のプロセッサ上の前記スレッドの実行を停止するステップと、
前記第２のプロセッサが、前記第２の同期命令がリタイアする準備ができていることと前記第１の同期命令はリタイアする準備ができていないこととを検出することに応答して、前記第２のプロセッサ上の前記スレッドの実行を停止するステップと、
前記第１のプロセッサが、第１の同期命令および前記第２の同期命令が両方ともリタイアする準備ができていることに応答して、前記第１のプロセッサ上の前記スレッドの実行を継続するステップと、
前記第２のプロセッサが、第１の同期命令および前記第２の同期命令が両方ともリタイアする準備ができていることに応答して、前記第２のプロセッサ上の前記スレッドの実行を継続するステップとを含む、請求項２３に記載の方法。
【請求項２５】
前記同期するステップは、
前記第１のプロセッサが、前記第１のプロセッサ上の第１の同期命令を実行するステップと、
前記第２のプロセッサが、前記第２のプロセッサ上の第２の同期命令を実行するステップと、
前記第１のプロセッサが、前記第１の同期命令がリタイアする準備ができていることと前記第２の同期命令はリタイアする準備ができていないこととを検出することに応答して、前記第１のプロセッサ上の前記スレッドの実行を停止するステップと、
前記第２のプロセッサが、前記第２の同期命令はリタイアする準備ができていることと前記第１の同期命令はリタイアする準備ができていないこととを検出することに応答して、前記第２のプロセッサ上の前記スレッドの実行を停止するステップと、
前記第１のプロセッサが、前記第１の同期命令と前記第２の同期命令とが両方ともリタイアする準備ができていることを検出することに応答して、前記第１の同期命令をリタイアするステップと、
前記第２のプロセッサが、前記第１の同期命令と前記第２の同期命令とが両方ともリタイアする準備ができていることを検出することに応答して、前記第２の同期命令をリタイアするステップと、
前記第１のプロセッサが、前記第１の同期命令はリタイアしたことと前記第２の同期命令はリタイアしていないこととを検出することに応答して、前記第１のプロセッサ上の前記スレッドの実行を停止するステップと、
前記第２のプロセッサが、前記第２の同期命令はリタイアしたことと前記第１の同期命令はリタイアしていないこととを検出することに応答して、前記第２のプロセッサ上の前記スレッドの実行を停止するステップと、
前記第１のプロセッサが、前記第１の同期命令および前記第２の同期命令が両方ともリタイアしたことを検出することに応答して、前記第１のプロセッサ上の前記スレッドの実行を継続するステップと、
前記第２のプロセッサが、前記第１の同期命令および前記第２の同期命令が両方ともリタイアしたことを検出することに応答して、前記第２のプロセッサ上の前記スレッドの実行を継続するステップとを含む、請求項２３に記載の方法。
【請求項２６】
第２のプロセッサが、前記第１のセットアップ命令が前記第２のプロセッサの前記リオーダバッファでリタイアする準備ができていることを検出することと前記第１のセットアップ命令が前記第１のプロセッサのリオーダバッファからリタイアしたことの表示を受取ることとに応答して、前記第２のプロセッサのリオーダバッファから前記セットアップ命令の第１のセットアップ命令をリタイアするステップと、
第２のプロセッサが、前記起動命令が前記第２のプロセッサの前記リオーダバッファでリタイアする準備ができていることを検出することと前記起動命令が前記第１のプロセッサの前記リオーダバッファからリタイアしたことの表示を受取ることとに応答して、第２のプロセッサのリオーダバッファから前記起動命令をリタイアするステップとをさらに含む、請求項２０に記載の方法。
【請求項２７】
前記第２のプロセッサが、前記セットアップ命令は前記第２のプロセッサの前記リオーダバッファでリタイアする準備ができていることを検出することと前記起動命令が前記第１のプロセッサのリオーダバッファからリタイアしたことの表示を前記第１のプロセッサから表示を受取ることに応答して、前記第２のプロセッサのリオーダバッファから前記セットアップ命令をリタイアするステップと、
前記第２のプロセッサが、前記起動命令が前記第２のプロセッサの前記リオーダバッファでリタイアする準備ができていることを検出することと前記起動命令が前記第１のプロセッサの前記リオーダバッファからリタイアしたことの表示を前記第１のプロセッサから受取ることとに応答して、第２のプロセッサのリオーダバッファから前記起動命令をリタイアするステップとをさらに含む、請求項２０に記載の方法。
【請求項２８】
前記第１のプロセッサが、スクラッチパッド命令をデコードするステップを含み、前記デコードするステップは複数の動作を生成し、前記複数の動作はスクラッチパッド機能ユニットおよび第１のリオーダバッファに運ばれ、前記複数の動作はロックされた読取動作、ＡＬＵ動作、およびロックされた書込動作を含み、さらに
前記第１のプロセッサが、前記ロックされた読取動作をロックされた読取予約ステーションに記憶し、前記ロックされた書込動作をロックされた書込予約ステーションに記憶するステップと、
前記第１のプロセッサが、前記読取予約ステーションのすべての前のロックされた読取動作が完了したことに応答して、前記ロックされた読取予約ステーションから前記ロックされた読取動作を発行するステップと、
前記第１のプロセッサが、記憶に場所をロックするステップとを含み、前記場所は、前記場所がロックされていないことを検出することに応答して、前記ロックされた読取動作によってロックされ、
前記第１のプロセッサが、前記ロックされた場所の内容を読取るステップと、
前記第１のプロセッサが、前記ロックされた書込動作はその入力オペランドを受取ることと前記ロックされた書込動作は前記第１のリオーダバッファにおいて次にリタイアすることとを検出することに応答して、前記ロックされた書込動作を前記ロックされた書込予約ステーションから発行するステップと、
前記第１のプロセッサが、前記場所にデータを記憶するステップと、
前記第１のプロセッサが、前記場所をアンロックするステップと、
前記第１のプロセッサが、前記ロックされた読取動作および前記ロックされた書込動作が完了したことを検出することに応答して、前記ロックされた読取動作を前記ロックされた読取予約ステーションから取除き、前記ロックされた書込動作を前記ロックされた書込予約ステーションから取除くステップとをさらに含む、請求項２０に記載の方法。
【請求項２９】
前記第１のプロセッサが、リオーダバッファの分岐命令が誤って予測されることを検出するステップと、
前記第１のプロセッサが、前記リオーダバッファの前記分岐命令に続く複数の命令を無効にするステップと、
前記第１のプロセッサが、複数の命令のうち１つはロックされた命令であることを検出するステップと、
前記第１のプロセッサが、複数のリオーダバッファタグをスクラッチパッド機能ユニットに運ぶステップとを含み、前記リオーダバッファタグは前記ロックされた命令に対応し、前記ロックされた命令は前記分岐命令に続く前記第１のリオーダバッファにおける第１のロックされた命令であって、
前記第１のプロセッサが、前記スクラッチパッド機能ユニットのロックされた命令を無効にするステップを含み、前記ロックされた命令は前記複数のリオーダバッファタグに対応し、さらに
前記第１のプロセッサが、前記ロックされた命令の１つはロックされた読取命令であることを検出することに応答してスクラッチパッドレジスタにおける場所をアンロックするステップをさらに含み、前記ロックされた読取命令はロックされた読取予約ステーションの前にあり、前記ロックされた読取命令は発行されている、請求項２８に記載の方法。
【発明の詳細な説明】
【０００１】
【発明の背景】
１．技術分野
この発明はマイクロプロセッサの分野に関し、より特定的には多重プロセッサにおけるマルチスレッディングに関する。
【０００２】
２．背景技術
複数の処理ユニットを用いるコンピュータシステムは、現行の単一プロセッサベースのシステムに優る性能能力に経済的に適応する見込みを有する。多重処理環境においては、単一のプロセッサにアプリケーションに対するすべての処理を集中させる代わりに、タスクが別個のプロセッサによって扱い得るグループまたは「スレッド」に分割される。それによって全体の処理負荷がいくつかのプロセッサに分配され、分配されたタスクは並行して同時に実行されてもよい。オペレーティングシステムソフトウェアはプログラムコードのさまざまな部分を別々に実行可能なスレッドに分割し、典型的には各スレッドに優先レベルを割当てる。
【０００３】
スーパースカラマイクロプロセッサは、クロックサイクル当り複数の命令を実行することによって、またその設計に合う可能な最も短いクロックサイクルを選択することによって、高性能を達成する。ここで用いられる「クロックサイクル」という用語は、マイクロプロセッサ内の命令処理パイプラインのさまざまなステージに一致する時間間隔を示す。記憶装置（たとえばレジスタおよびアレイ）は、クロックサイクルに従ってそれらの値を捕捉する。たとえば、記憶装置はクロックサイクルを定めるクロック信号の立上がりまたは立下がり端に従って値を捕捉してもよい。次いで記憶装置はその値を、それぞれクロック信号のその後の立上がりまたは立下がり端まで記憶する。ここで用いられる「命令処理パイプライン」という用語は、パイプライン処理方式で命令を処理するために用いられる論理回路を示す。パイプラインは命令処理の部分が行なわれるあらゆる数のステージに分割されてもよいが、命令処理は一般的に命令をフェッチするステップと、命令をデコードするステップと、命令を実行するステップと、実行の結果を命令によって識別される宛先に記憶するステップとを含む。
【０００４】
マイクロプロセッサの重要な特徴は、それらが並行性を利用できる程度である。並行性とは直列ではなく並行した命令の実行である。スーパースカラプロセッサは、特定の命令を並行して実行することによって、細粒命令レベル並行性を識別および利用できる。しかし、この種の並行性は命令間のデータ従属性によって制限される。さらに前述のとおり、１つよりも多くのプロセッサを含むコンピュータシステムは、コンピュータプロセスによって与えられる作業負荷を分割することによって性能を改善してもよい。より高いレベルの並行性を識別することによって、多重プロセッサコンピュータシステムはコードのより大きいセグメントまたはスレッドを別個のプロセッサで並行して実行してもよい。マイクロプロセッサおよびオペレーティングシステムは並行マルチスレッド実行に従うコードのセグメントを識別できないため、それらはアプリケーションコード自体によって識別される。一般的にオペレーティングシステムは、多重プロセッサシステムにおける利用可能なプロセッサの中で、実行のさまざまなスレッドをスケジューリングする責を負う。
【０００５】
並行マルチスレッディングの問題の１つは、オペレーティングシステムによる実行のためにスレッドをスケジューリングすることに伴うオーバーヘッドのために、コードのより短いセグメントが並行マルチスレッディングを効率的に利用できないことである。その結果、並行マルチスレッディングからの可能な性能利得が達成できない。
【０００６】
ハモンドＬらによる「チップ多重プロセッサのためのデータ投機支持」（“Data Speculation Support for a Chip Multiprocessor”、ACM Sigplan Notices, Association for Computing Machinery, ニューヨーク、US, 第33巻, 第11号, 1998年11月1日、58-69頁）は、データ投機を支持するように構成されるプロセッサを記載する。このプロセッサは、ソフトウェア投機例外ハンドラの実行を助ける目的のための付加されたコプロセッサを含む。
マーキュエロ（MARCUELLO）Ｐらによる「投機的マルチスレッドプロセッサ」（“Speculative multithreaded Processors”、メルボルン、オーストラリア、1998年7月13-17日、ニューヨーク、NY: ACM, US, vol.12th Conf, 1998年7月13日、77-84頁）は、連続的プログラムの異なるスレッドを同時に実行するように構成される複数のスレッドユニットを含むマルチスレッドプロセッサアーキテクチャを記載する。ループ実行テーブルを組み入れる制御投機機構が含まれ、それはループ反復の数を予測するために用いられてもよい。
クリシュナン（KRISHNAN）Ｖらによる「投機的マルチスレッディングを有するチップ多重プロセッサアーキテクチャ」（“A Chip-Multiprocessor Architecture with Speculative Multithreading”、IEEE transactions on Computers, US, IEE Inc. ニューヨーク、第48巻, 第9号、1999年9月、866-880頁）は、スレッド間レジスタ通信を促進するための「同期スコアボード」と呼ばれる増加されたスコアボードと、投機的データを記憶するための高められたキャッシュアーキテクチャとを用いるチップ多重プロセッサを記載する。
前述において概観した問題は、ここに記載されるマイクロプロセッサおよび方法によって多くの部分が解決される。オペレーティングシステムの介入および固有のオーバーヘッドなしに複数のプロセッサ上での複数のスレッドのスケジューリングおよび投機的実行を可能にする対称多重処理システムの形で、付加的な回路が含まれる。有利には、並行マルチスレッド実行がより効率的であり、性能が改善される。
【０００７】
この発明の１つの局面に従うと、レジスタファイルと第１のリオーダバッファとを含むプロセッサが提供され、このプロセッサは、第１のリオーダバッファにおけるエントリを第２のプロセッサの第２のリオーダバッファにおけるエントリにマップするように構成されるリオーダバッファタグ変換バッファと、複数のスレッドの投機的マルチスレッド実行を支持するための回路とを特徴とする。
【０００８】
スレッド制御装置は２つのプロセッサ間の命令を記憶および伝送するように構成されることが好ましく、その命令は２つのプロセッサ上のスレッドの投機的実行を支持することによってそのスレッドが並行して実行され得るようにする。
【０００９】
この発明の第２の局面に従うと、多重プロセッサにおける複数のスレッドの投機的実行を促進するための方法が提供され、前記方法は、第１のプロセッサのリオーダバッファの第１の場所に第１のスレッドに対応するスレッド命令を記憶するステップを含み、前記リオーダバッファのリオーダバッファタグを前記第１のプロセッサから第２のプロセッサに運ぶステップを特徴とし、前記リオーダバッファタグは前記第１の場所に対応し、さらに前記スレッド命令を前記第２のプロセッサの第２のリオーダバッファに記憶するステップと、前記第２のプロセッサのリオーダバッファタグ変換バッファを更新するステップとを特徴とし、前記更新は前記バッファ中の場所に前記第２のリオーダバッファのリオーダバッファタグを記憶するステップを含み、前記変換バッファ中の前記場所は前記第１のプロセッサの前記リオーダバッファの前記リオーダバッファタグによって選択される。
添付の図面は例としてのみ示される。
【００１０】
この発明にはさまざまな変更形および代替形が可能であるが、その特定の実施例を例として図面に示し、ここに詳細に説明する。しかし、図面およびその詳細な説明は、この発明を開示される特定の形に制限することを意図するものではなく、反対に添付の請求項によって定められるこの発明の趣旨および範囲内にあるすべての変更形、同等のものおよび代替形をカバーすることが意図されることが理解されるべきである。
【００１１】
【この発明を実行するためのモード】
プロセッサの概観
図１を参照すると、プロセッサ１０の実施例の１つのブロック図が示される。その他の実施例も可能であり、予期される。図１に示すとおり、プロセッサ１０は、プリフェッチ／プリデコードユニット１２と、分岐予測ユニット１４と、命令キャッシュ１６と、命令整列ユニット１８と、複数のデコードユニット２０Ａ−２０Ｃと、複数の予約ステーション２２Ａ−２２Ｃと、複数の機能ユニット２４Ａ−２４Ｃと、ロード／ストアユニット２６と、データキャッシュ２８と、レジスタファイル３０と、リオーダバッファ３２と、ＭＲＯＭユニット３４と、プロセッサ間通信ユニット３００と、バスインターフェイスユニット３７とを含む。ここで、後ろに文字のついた特定の参照番号によって参照される構成要素は、参照番号のみによって集合的に参照される。たとえば、デコードユニット２０Ａ−２０Ｃはデコードユニット２０として集合的に参照される。
【００１２】
プリフェッチ／プリデコードユニット１２はバスインターフェイスユニット３７から命令を受取るように結合され、命令キャッシュ１６および分岐予測ユニット１４にさらに結合される。同様に、分岐予測ユニット１４は命令キャッシュ１６に結合される。さらに、分岐予測ユニット１４はデコードユニット２０と機能ユニット２４とに結合される。命令キャッシュ１６はＭＲＯＭユニット３４と命令整列ユニット１８とにさらに結合される。命令整列ユニット１８はデコードユニット２０に結合される。各デコードユニット２０Ａ−２０Ｃは、ロード／ストアユニット２６およびそれぞれの予約ステーション２２Ａ−２２Ｃに結合される。予約ステーション２２Ａ−２２Ｃはそれぞれの機能ユニット２４Ａ−２４Ｃにさらに結合される。加えて、デコードユニット２０と予約ステーション２２とはレジスタファイル３０とリオーダバッファ３２とに結合される。機能ユニット２４はロード／ストアユニット２６と、レジスタファイル３０と、リオーダバッファ３２とにも結合される。データキャッシュ２８はロード／ストアユニット２６とバスインターフェイスユニット３７とに結合される。バスインターフェイスユニット３７はＬ２キャッシュに対するＬ２インターフェイスとバスとにさらに結合される。プロセッサ間通信ユニット３００はリオーダバッファ３２と結果バス３８とに結合される。最後に、ＭＲＯＭユニット３４がデコードユニット２０に結合される。
【００１３】
命令キャッシュ１６は、命令を記憶するために与えられる高速キャッシュメモリである。命令は命令キャッシュ１６からフェッチされ、デコードユニット２０にディスパッチされる。実施例の１つにおいて、命令キャッシュ１６は、６４バイトライン（１バイトは８バイナリビットを含む）を有する２方向セット連想型（2 way set associative）構造で最大６４キロバイトの命令を記憶するように構成される。代替的には、あらゆるその他の所望の構成および大きさが用いられてもよい。たとえば、命令キャッシュ１６は完全連想型（fully associative）、セット連想型、または直接マップされる構成として実現されてもよい。
【００１４】
命令は、プリフェッチ／プリデコードユニット１２によって命令キャッシュ１６に記憶される。命令は、プリフェッチ方式に従って命令キャッシュ１６からのその要求に先行してプリフェッチされてもよい。さまざまなプリフェッチ方式がプリフェッチ／プリデコードユニット１２によって用いられてもよい。プリフェッチ／プリデコードユニット１２が命令を命令キャッシュ１６に伝達する際に、プリフェッチ／プリデコードユニット１２は命令の各バイトに対する３つのプリデコードビット、すなわち開始ビット、終了ビット、および機能ビットを生成する。プリデコードビットは、各命令の境界を示すタグを形成する。プリデコードタグはまた、以下により詳細に説明するとおり、所与の命令をデコードユニット２０から直接デコードできるかどうか、またはその命令がＭＲＯＭユニット３４によって制御されるマイクロコード手順を呼出すことによって実行されるかどうかなどの付加的な情報を運ぶ。さらにプリフェッチ／プリデコードユニット１２は、分岐命令を検出し、その分岐命令に対応する分岐予測情報を分岐予測ユニット１４に記憶するように構成されてもよい。その他の実施例はあらゆる好適なプリデコード方式を用いてもよい。
【００１５】
次に、可変バイト長命令セットを用いるプロセッサ１０の実施例に対するプリデコードタグの符号化の１つについて説明する。可変バイト長命令セットは、異なる命令が異なる数のバイトを占め得る命令セットである。プロセッサ１０の実施例の１つによって用いられる例示的な可変バイト長命令セットは、ｘ８６命令セットである。
【００１６】
例示的な符号化においては、所与のバイトがある命令の第１のバイトであるとき、そのバイトに対する開始ビットがセットされる。そのバイトが命令の最終バイトであるときには、そのバイトに対する終了ビットがセットされる。デコードユニット２０によって直接デコードされ得る命令は、「高速経路」命令と呼ばれる。実施例の１つに従うと、残りのｘ８６命令はＭＲＯＭ命令と呼ばれる。高速経路命令に対しては、機能ビットが命令に含まれる各接頭バイトに対してセットされ、その他のバイトに対してクリアされる。代替的には、ＭＲＯＭ命令に対しては、機能ビットは各接頭バイトに対してクリアされ、その他のバイトに対してセットされる。命令の種類は、終了バイトに対応する機能ビットを調べることによって定められてもよい。その機能ビットがクリアであるとき、その命令は高速経路命令である。逆に、その機能ビットがセットされているとき、その命令はＭＲＯＭ命令である。それによって、命令のオペコードが、命令中の第１のクリア機能ビットに関連するバイトとしてデコードユニット２０によって直接デコードされ得る命令内に置かれてもよい。たとえば、２つの接頭バイトすなわちMod R/Mバイトと即時バイトとを含む高速経路命令は、次のような開始、終了および機能ビットを有する。
【００１７】
開始ビット  １００００
終了ビット  ００００１
機能ビット  １１０００
ＭＲＯＭ命令は、デコードユニット２０によるデコードには複雑すぎると判断される命令である。ＭＲＯＭ命令はＭＲＯＭユニット３４を呼出すことによって実行される。より特定的には、ＭＲＯＭ命令に出会うと、ＭＲＯＭユニット３４は命令をパーズおよび発行して定められた高速経路命令のサブセットにし、所望の動作を実現する。ＭＲＯＭユニット３４は高速経路命令のサブセットをデコードユニット２０にディスパッチする。
【００１８】
プロセッサ１０は、条件付き分岐命令に続く命令を投機的にフェッチするために分岐予測を用いる。分岐予測ユニット１４は分岐予測動作を行なうために含まれる。実施例の１つにおいて、分岐予測ユニット１４は、命令キャッシュ１６におけるキャッシュラインの１６バイト部分当り最大２つの分岐目標アドレスおよび対応するテイクン／ノットテイクン（taken/not taken）予測をキャッシュする分岐目標バッファを用いる。たとえば、分岐目標バッファは２０４８エントリまたはあらゆるその他の好適な数のエントリを含んでもよい。プリフェッチ／プリデコードユニット１２は、特定のラインがプリデコードされるときに最初の分岐目標を定める。その後、キャッシュライン内の命令の実行によって、キャッシュラインに対応する分岐目標に対する更新が起こり得る。命令キャッシュ１６は命令アドレスがフェッチされたことの表示を与えるため、分岐予測ユニット１４は分岐予測を形成するためにどの分岐目標アドレスを選択するかを定めてもよい。デコードユニット２０と機能ユニット２４とは分岐予測ユニット１４に更新情報を与える。デコードユニット２０は分岐予測ユニット１４に予測されなかった分岐命令を検出する。機能ユニット２４は分岐命令を実行し、その予測された分岐方向が誤りかどうかを定める。その分岐方向は「テイクン」であるかもしれず、そこでは分岐命令の目標アドレスからその後の命令がフェッチされる。逆に分岐方向は「ノットテイクン」であるかもしれず、そこでは分岐命令に連続するメモリ場所からその後の命令がフェッチされる。誤って予測された分岐命令が検出されると、その誤って予測された分岐に続く命令はプロセッサ１０のさまざまなユニットから廃棄される。代替的な構成において、分岐予測ユニット１４はデコードユニット２０および機能ユニット２４の代わりにリオーダバッファ３２に結合されてもよく、リオーダバッファ３２から分岐の誤った予測の情報を受取ってもよい。分岐予測ユニット１４によってさまざまな好適な分岐予測アルゴリズムが用いられてもよい。
【００１９】
命令キャッシュ１６からフェッチされた命令は命令整列ユニット１８に運ばれる。命令が命令キャッシュ１６からフェッチされる際に、対応するプリデコードデータが走査されて、フェッチされた命令に関して命令整列ユニット１８（およびＭＲＯＭユニット３４）に情報を与える。命令整列ユニット１８は走査データを用いて各々のデコードユニット２０に対する命令を整列する。実施例の１つにおいて、命令整列ユニット１８は８命令バイトの３セットからの命令をデコードユニット２０に対して整列する。デコードユニット２０Ａは、（プログラム順序で）デコードユニット２０Ｂおよび２０Ｃによって同時に受取られる命令に先行する命令を受取る。同様に、デコードユニット２０Ｂは、プログラム順序でデコードユニット２０Ｃによって同時に受取られる命令に先行する命令を受取る。
【００２０】
デコードユニット２０は、命令整列ユニット１８から受取られる命令をデコードするように構成される。レジスタオペランド情報が検出され、レジスタファイル３０およびリオーダバッファ３２に経路付けされる。付加的には、その命令が１つまたはそれ以上のメモリ動作が行なわれることを要求するとき、デコードユニット２０はメモリ動作をロード／ストアユニット２６にディスパッチする。各命令は機能ユニット２４に対する制御値のセットにデコードされ、これらの制御値はオペランドアドレス情報およびその命令に含まれ得る変位または即時データとともに予約ステーション２２にディスパッチされる。１つの特定の実施例において、各命令は、機能ユニット２４Ａ−２４Ｃによって個別に実行され得る最大２つの動作にデコードされる。
【００２１】
プロセッサ１０は故障実行を支持し、すなわちリオーダバッファ３２を用いてレジスタ読取および書込動作に対するもとのプログラム配列を憶えておくことによって、レジスタ再命名を実現して、投機的命令実行および分岐の誤った予測からの回復を可能にし、かつ精密な例外を促進する。リオーダバッファ３２内の一時的記憶場所は、レジスタの更新を含むことによって投機的レジスタ状態を記憶する命令のデコードの際に予約される。分岐予測が誤っているとき、誤って予測された経路に沿った投機的に実行された命令の結果は、レジスタファイル３０に書込まれる前にバッファにおいて無効にできる。同様に、特定の命令が例外をもたらすとき、その特定の命令に続く命令が廃棄されてもよい。この態様で、例外は「精密」である（すなわち、例外をもたらす特定の命令に続く命令はその例外に先立って完了されない）。なお、ある特定の命令がプログラム順序においてその特定の命令に先行する命令に先立って実行されるとき、その命令は投機的に実行される。先行する命令は分岐命令または例外をもたらす命令であってもよく、その場合には投機的結果はリオーダバッファ３２によって廃棄されてもよい。
【００２２】
デコードユニット２０の出力において与えられる命令制御値および即時または変位データは、それぞれの予約ステーション２２に直接経路付けされる。実施例の１つにおいて、各予約ステーション２２は、対応する機能ユニットへの発行を待つ最大５つの保留命令に対する命令情報（すなわち命令制御値ならびにオペランド値、オペランドタグおよび／または即時データ）を保持できる。なお、図１の実施例に対して、各予約ステーション２２は専用機能ユニット２４に関連付けられる。したがって、予約ステーション２２および機能ユニット２４によって３つの専用「発行位置」が形成される。言い換えると、発行位置０は予約ステーション２２Ａと機能ユニット２４Ａとによって形成される。整列されて予約ステーション２２Ａにディスパッチされる命令は、機能ユニット２４Ａによって実行される。同様に、発行位置１は予約ステーション２２Ｂと機能ユニット２４Ｂとによって形成され、発行位置２は予約ステーション２２Ｃと機能ユニット２４Ｃとによって形成される。
【００２３】
特定の命令のデコードの際に、必要とされるオペランドがレジスタ場所であるとき、レジスタアドレス情報はリオーダバッファ３２とレジスタファイル３０とに同時に経路付けされる。実施例の１つにおいて、リオーダバッファ３２はデコードユニットからもオペランド要求を受取るフューチャファイルを含む。ｘ８６レジスタファイルは８つの３２ビット実レジスタ（すなわち典型的にＥＡＸ、ＥＢＸ、ＥＣＸ、ＥＤＸ、ＥＢＰ、ＥＳＩ、ＥＤＩおよびＥＳＰと呼ばれる）を含むことを当業者は認識するであろう。ｘ８６プロセッサアーキテクチャを用いるプロセッサ１０の実施例において、レジスタファイル３０は３２ビット実レジスタの各々に対する記憶場所を含む。ＭＲＯＭユニット３４による使用のために付加的な記憶場所がレジスタファイル３０内に含まれてもよい。リオーダバッファ３２は、これらのレジスタの内容を変更することによって故障実行を可能にする結果に対する一時的記憶場所を含む。リオーダバッファ３２の一時的記憶場所は、デコードの際に実レジスタの１つの内容を変更することが定められる各命令に対して予約される。したがって、特定のプログラムの実行の間のさまざまな点において、リオーダバッファ３２は所与のレジスタの投機的に実行される内容を含む１つまたはそれ以上の場所を有してもよい。所与の命令のデコードに続いて、リオーダバッファ３２が所与の命令におけるオペランドとして用いられるレジスタに割当てられた前の場所を有することが定められるとき、リオーダバッファ３２は対応する予約ステーションに、１）最も最近割当てられた場所における値、または２）その値が前の命令を実行する機能ユニットによってまだ生成されていないときには、最も最近割当てられた場所に対するタグを転送する。リオーダバッファ３２が所与のレジスタに対して予約される場所を有するときには、オペランド値（またはリオーダバッファタグ）はレジスタファイル３０からではなくリオーダバッファ３２から提供される。リオーダバッファ３２中に要求されるレジスタに対して予約される場所がないときには、その値はレジスタファイル３０から直接取られる。オペランドがメモリ場所に対応するときには、オペランド値はロード／ストアユニット２６を通じて予約ステーションに与えられる。
【００２４】
１つの特定の実施例において、リオーダバッファ３２は同時にデコードされた命令をユニットとして記憶および操作するように構成される。この構成をここでは「線形指向（line-oriented）」と呼ぶ。いくつかの命令を一緒に操作することによって、リオーダバッファ３２内に用いられるハードウェアを簡略化してもよい。たとえば、この実施例に含まれる線形指向リオーダバッファは、デコードユニット２０によって１つまたはそれ以上の命令が発行されるたびに３つの命令（各デコードユニット２０から１つ）に属する命令情報に対して十分な記憶を割当てる。逆に、従来のリオーダバッファにおいては、実際にディスパッチされた命令の数に依存して可変量の記憶が割当てられる。可変量の記憶を割当てるためには比較的多数の論理ゲートが必要とされ得る。同時にデコードされた命令の各々が実行されたとき、その命令の結果はレジスタファイル３０に同時に記憶される。次いでその記憶は同時にデコードされた命令の別のセットに対する割当のために自由になる。付加的には、制御論理はいくつかの同時にデコードされる命令にならされるため、命令当りに用いられる制御論理回路の量は減少する。特定の命令を識別するリオーダバッファタグは２つのフィールド、すなわちラインタグおよびオフセットタグに分割されてもよい。ラインタグはその特定の命令を含む同時にデコードされた命令のセットを識別し、オフセットタグはそのセット内のどの命令が特定の命令に対応するかを識別する。なお、レジスタファイル３０に命令の結果を記憶し、対応する記憶を解放することを、命令を「リタイアする」と呼ぶ。さらに、プロセッサ１０のさまざまな実施例において、レジスタファイル３０の投機的状態を記憶するためにフューチャファイルを用いることを含むあらゆるリオーダバッファ構成が用いられてもよい。
【００２５】
先に示したとおり、予約ステーション２２は、命令が対応する機能ユニット２４によって実行されるまでその命令を記憶する。（ｉ）その命令のオペランドが与えられたとき、および（ii）同じ予約ステーション２２Ａ−２２Ｃ内の、プログラム順序でその命令の前にある命令に対してオペランドが与えられていないときに、その命令が実行のために選択される。なお、ある命令が機能ユニット２４の１つによって実行されるとき、その結果がリオーダバッファ３２を更新するために送られるのと同時に、その命令の結果はその結果を待っているあらゆる予約ステーション２２に直接送られる（この技術は一般的に「結果転送」と呼ばれる）。命令は実行のために選択されて、関連する結果が転送されるクロックサイクルの間に機能ユニット２４Ａ−２４Ｃに送られてもよい。この場合に予約ステーション２２は転送された結果を機能ユニット２４に経路付けする。命令を機能ユニット２４によって実行される複数の動作にデコードし得る実施例において、その動作は互いに分離してスケジューリングされてもよい。
【００２６】
実施例の１つにおいて、機能ユニット２４の各々は、加算および減算の整数演算動作、ならびにシフト、回転、論理演算および分岐演算を行なうように構成される。この演算は、デコードユニット２０によって特定の命令に対してデコードされる制御値に応答して行なわれる。なお、浮動小数点演算に適応するために浮動小数点ユニット（図示せず）が用いられてもよい。浮動小数点ユニットはコプロセッサとして動作されてもよく、ＭＲＯＭユニット３４またはリオーダバッファ３２から命令を受取った後に、リオーダバッファ３２と通信することによって命令を完了させる。加えて、機能ユニット２４はロード／ストアユニット２６によって行なわれるロードおよびストアメモリ動作に対するアドレス生成を行なうように構成されてもよい。１つの特定の実施例において、各機能ユニット２４はアドレスを生成するためのアドレス生成ユニットと、残りの機能を行なうための実行ユニットとを含んでもよい。この２つのユニットはクロックサイクルにおける異なる命令または動作の際に独立に動作してもよい。
【００２７】
各機能ユニット２４はまた、分岐予測ユニット１４に条件付き分岐命令の実行に関する情報を与える。分岐予測が誤っていたとき、分岐予測ユニット１４は命令処理パイプラインに入った誤って予測された分岐に続く命令をフラッシュし、命令キャッシュ１６またはメインメモリからの要求される命令のフェッチを起こさせる。なお、このような状況において、投機的に実行されてロード／ストアユニット２６およびリオーダバッファ３２に一時的に記憶されたものを含む、誤って予測された分岐命令の後に起こる元のプログラム配列中の命令の結果は廃棄される。さらに、分岐実行の結果は機能ユニット２４によってリオーダバッファ３２に与えられてもよく、それは機能ユニット２４に分岐の誤った予測を示してもよい。
【００２８】
機能ユニット２４によって生成される結果は、レジスタ値が更新されるときにはリオーダバッファ３２に送られ、メモリ場所の内容が変更されるときにはロード／ストアユニット２６に送られる。結果がレジスタに記憶されるとき、リオーダバッファ３２は、命令がデコードされたときにレジスタの値に対して予約された場所にその結果を記憶する。機能ユニット２４およびロード／ストアユニット２６からの結果の転送のために複数の結果バス３８が含まれる。結果バス３８は生成された結果および実行された命令を識別するリオーダバッファタグを運ぶ。
【００２９】
ロード／ストアユニット２６は機能ユニット２４とデータキャッシュ２８との間のインターフェイスを与える。実施例の１つにおいて、ロード／ストアユニット２６は、データキャッシュ２８にアクセスしなかった保留ロードまたはストアに対するデータおよびアドレス情報に対する記憶場所を有する第１のロード／ストアバッファと、データキャッシュ２８にアクセスしたロードおよびストアに対するデータおよびアドレス情報に対する記憶場所を有する第２のロード／ストアバッファとによって構成される。たとえば、第１のバッファは１２の場所を含んでもよく、第２のバッファは３２の場所を含んでもよい。デコードユニット２０はロード／ストアユニット２６へのアクセスを仲裁する。第１のバッファが一杯のとき、デコードユニットはロード／ストアユニット２６が保留ロードまたはストア要求情報に対する空間を有するまで待たなければならない。ロード／ストアユニット２６はまた、データコヒーレンシが維持されていることを確認するために、保留記憶メモリ動作に対するロードメモリ動作に対する従属性チェックを行なう。メモリ動作は、プロセッサ１０とメインメモリサブシステムとの間のデータの伝達である。メモリ動作は、メモリに記憶されるオペランドを用いる命令の結果であってもよく、またはデータ伝達をもたらすがそれ以外の動作を起こさないロード／ストア命令の結果であってもよい。加えて、ロード／ストアユニット２６は、セグメントレジスタおよびｘ８６プロセッサアーキテクチャによって定められるアドレス変換機構に関係するその他のレジスタなどの特別なレジスタに対する特別なレジスタ記憶を含んでもよい。
【００３０】
データキャッシュ２８は、ロード／ストアユニット２６とメインメモリサブシステムとの間に伝達される一時的な記憶データに与えられる高速キャッシュメモリである。実施例の１つにおいて、データキャッシュ２８は２方向セット連想型構造で最大６４キロバイトのデータを記憶する容量を有する。データキャッシュ２８は、セット連想型構成、完全連想型構成、直接マップされた構成、およびあらゆる好適な大きさのあらゆるその他の構成を含むさまざまな特定的メモリ構成において実現されてもよいことが理解される。
【００３１】
プロセッサ間通信ユニット３００は、マルチスレッド多重プロセッサ構成において別のプロセッサと通信するためのインターフェイスを提供する。実施例の１つにおいて、プロセッサ間通信ユニット３００は実行される命令を一時的に記憶するための予約ステーションを含んでもよい。加えて、実施例の１つにおいては、プロセッサ間通信ユニット３００はプロセッサ間のマルチスレッド関連通信を促進するスレッド制御装置にインターフェイスする。
【００３２】
ｘ８６プロセッサアーキテクチャを用いるプロセッサ１０の１つの特定の実施例において、命令キャッシュ１６とデータキャッシュ２８とは線形的にアドレス指定されて物理的にタグ付けされる。線形アドレスは、命令によって特定化されるオフセットと、ｘ８６アドレス変換機構のセグメント部分によって特定化されるベースアドレスとによって形成される。線形アドレスは、メインメモリをアクセスするための物理アドレスに任意に変換されてもよい。線形アドレスから物理アドレスへの変換は、ｘ８６アドレス変換機構のページング部分によって特定化される。物理アドレスを物理タグと比較することによって、ヒット／ミス状態を判断する。
【００３３】
バスインターフェイスユニット３７は、バスを介してプロセッサ１０とコンピュータシステム中のその他の構成要素とを通信するように構成される。たとえば、そのバスはデジタル・エクイップメント社によって開発されたＥＶ−６バスに適合可能であってもよい。代替的には、パケットベース、単方向または双方向リンクなどを含むあらゆる好適な内部接続構造が用いられてもよい。同等の２つのキャッシュに対するインターフェイスのために任意のＬ２キャッシュインターフェイスが用いられてもよい。
【００３４】
対称的多重処理
図２は、複数の処理ユニット１２Ａ−１２Ｂと、スレッド制御装置３００と、バスブリッジ３０と、メモリ２０とを含む多重プロセッサコンピュータ１００の実施例の１つを示すブロック図である。各処理ユニット１２Ａ−１２Ｂはそれぞれ処理コア１４Ａ−１４Ｂと、Ｌ１キャッシュメモリ１６Ａ−１６Ｂと、バスインターフェイス１８Ａ−１８Ｂとを含む。処理ユニット１２Ａ−１２Ｂはシステムバス２２を介してメインメモリ２０に結合される。
【００３５】
すべての処理ユニット１２Ａ−１２Ｂが同じメモリ空間（すなわちメインメモリ２０）を共有し、同じアドレスマッピングを用いてメモリ空間にアクセスするという意味において、図２の多重プロセッサコンピュータ１００は対称的である。すべての処理ユニット１２Ａ−１２Ｂが同じＩ／Ｏサブシステムへの同等のアクセスを共有するという意味において、多重処理システム１００はさらに対称的である。
【００３６】
一般的に、オペレーティングシステムソフトウェアの単一コピーおよび各ユーザアプリケーションファイルの単一コピーがメインメモリ２０内に記憶される。各処理ユニット１２Ａ−１２Ｂは、オペレーティングシステムおよびユーザアプリケーションファイルのこれらの単一コピーから実行する。処理コア１４Ａ−１４Ｂはコードを同時に実行していてもよいが、所与の時間において処理ユニット１２Ａ−１２Ｂのうちの１つだけがシステムバス２２のマスタシップを取り得る。したがって、２つまたはそれ以上の処理ユニットの同時のバス要求を仲裁し、予め定められた仲裁アルゴリズムに基づいて処理ユニットの１つにマスタシップを与えるために、バス仲裁機構、バスブリッジ３０が与えられる。さまざまなバス仲裁技術が周知である。
【００３７】
各処理ユニット１２Ａ−１２Ｂのそれぞれの高速キャッシュメモリ１６Ａ−１６Ｂは、それぞれの処理ユニットによって最も最近アクセスされたデータを、関連データが対応するメインメモリアドレスを示すアドレスタグとともに記憶する。プログラムはコードの同じセクションを実行し、同じデータ構造に繰返しアクセスする傾向があるため、キャッシュが十分大きければ、アクセスされる場所の多くがキャッシュに既に記憶される。
【００３８】
キャッシュ機構は２つの重要な利益を提供する。第１に、キャッシュは高速メモリとともに実現され、かつバス仲裁およびバッファ遅延なしでアクセス可能であるため、それぞれのキャッシュに記憶される場所へのアクセスはメインメモリアクセスよりもかなり速い。第２に、それぞれのキャッシュに記憶される場所へのアクセスはシステムバスへのアクセスを必要としないため、各プロセッサのバス利用が大きく減少する。したがってシステムバスは他の要求されるトランザクションを供するために利用可能である。典型的には、「ヒット率」が高いほど、全体のシステム性能がよくなる。ヒット率とは、キャッシュに既に記憶される場所に対する特定の処理コアによるアクセスのパーセンテージである。適度に大きいキャッシュを有するよく設計されたシステムは、９０％より大きいヒット率を達成できる。
【００３９】
キャッシュメモリを用いる多重処理システムに関する重要な考慮点はデータコヒーレンシである。メインメモリ２０によって記憶されるデータ（および命令）の複数のコピーがキャッシュメモリ１６Ａ−１６Ｂの１つまたはそれ以上に同時に存在することがあるため、メモリサブシステムの１つが更新される（すなわち新たなデータが書込まれる）事象におけるデータの完全性を維持するために、特殊化した機構を用いる必要がある。たとえば、処理コア１４Ａによってキャッシュメモリ１６Ａ内でデータの特定のセクションが更新されるが、メインメモリ２０の対応するセクション内では更新されないという状況を考える。処理コア１４Ｂがその後コードの同じセクションにアクセスするとき、処理コア１４Ｂが適切なデータにアクセスすることを確定するために、どのセクションが最新であり、どのセクションがもはや有効でないかを追跡するための何らかの信頼性ある機構が必要である。したがって、キャッシュコヒーレンシを効率的に維持する目的のために、いわゆるライトスルーおよびライトバック技術に基づくものを含むさまざまな技術が開発された。さまざまなキャッシュコヒーレンシ技術は公知の先行技術の多数の出版物に記載されており、ここではさらに考察しない。
【００４０】
一般的な動作
図３Ａおよび図３Ｂは、マルチスレッド多重処理の一般的な動作を例示する。図３Ａにおいては、２つのプロセッサ１２Ａ−１２Ｂとスレッド制御装置３００との内部接続が示される。図３Ｂは、図３Ａに示される多重プロセッサコンピュータの一般的な動作を例示するフローチャートである。各プロセッサ１２Ａ−１２Ｂは、処理コア１４Ａ−１４Ｂと、Ｌ１キャッシュ１６Ａ−１６Ｂと、プロセッサ間通信ユニット（以下ＩＣＵ）３２０Ａ−３２０Ｂとを含む。また、先入れ先出し（以下ＦＩＦＯ）バッファ３１０Ａ−３１０Ｂと同期論理３１４とを含むスレッド制御装置３００が示される。
【００４１】
各プロセッサ１２のＩＣＵ３２０は、プロセッサ１２Ａと１２Ｂとの通信を促進するスレッド制御装置３００に結合される。一般的に、一方のプロセッサ１２Ａはマスタとして働き、他方のプロセッサ１２Ｂはスレーブとして働く。マスタプロセッサ１２Ａはすべての単一スレッドコードをランし、スレーブプロセッサ１２Ｂにおけるスレッド実行をセットアップおよび開始し、スレッド実行に続く実行の結果を統合する。一般的に、処理コア１４Ａはマルチスレッドセットアップ命令に出会うまで単一スレッドコード（ブロック３３０）を実行する。処理コア１２Ａがマルチスレッドセットアップ命令（ブロック３３２）に出会うと、処理コア１２Ａはスレッドセットアップ命令をＩＣＵ３２０Ａに運び、ＩＣＵ３２０Ａはその命令をＦＩＦＯ１  ３１０Ａに運ぶ。ＩＣＵ３２０Ｂは命令をＦＩＦＯ１  ３１０Ａから検索し、それらを処理コア１４Ｂに伝達する。その後マスタプロセッサ１２Ａはスレッド２起動命令（ブロック３３４）をＩＣＵ３２０Ａに運び、ＩＣＵ３２０Ａはその命令をＦＩＦＯ１  ３１０Ａに置く。ＩＣＵ３２０Ｂはスレッド起動命令をＦＩＦＯ１  ３１０Ａから検索し、それを処理コア１４Ｂに伝達する。次いで処理コア１４Ｂはスレッド２コード（ブロック３３８）のフェッチおよび実行を開始する。両方のプロセッサ１２による結合命令（ブロック３４０および３４２）の実行およびリタイアの際に、スレーブプロセッサ１２Ｂはスレッド２の実行を終了し、マスタプロセッサ１２Ａによって単一スレッド実行が再開する。次いでマスタプロセッサ１２Ａは別の命令をプロセッサ１２Ｂに運んでもよく、その命令によってスレーブプロセッサ１２ＢはＦＩＦＯ３１０Ｂを介してマスタプロセッサ１２Ａにスレッド２実行の結果を運ぶ。次いでマスタプロセッサ１２Ａは別個のスレッド（ブロック３４４）からの実行の結果を統合して、通常の実行（ブロック３４６）を継続してもよい。まとめると、マスタプロセッサ１２Ａはスレーブプロセッサ１２Ｂにおける実行のための第２のスレッドをセットアップする。マスタ１２Ａおよびスレーブ１２Ｂプロセッサはどちらも並行してスレッドを実行する。次いでマスタプロセッサ１２Ａはスレーブプロセッサから第２のスレッド実行の結果を得る。
【００４２】
動作の詳細な説明
図４は、マルチスレッド多重プロセッサの実施例の１つを示す。図４には、プロセッサ１２Ａおよび１２Ｂと、スレッド制御装置３００と、バス２２との部分が含まれる。プロセッサ１２はＩＣＵ３２０と、レジスタファイル３０と、リオーダバッファ３２と、システムバス３８と、バスインターフェイスユニット３７とを含む。加えて、ＩＣＵ３２０は予約ステーション４０２と、リオーダバッファタグ変換バッファ（以下ＲＴＢ）４００とを含む。スレッド制御装置３００は２つのＦＩＦＯ３１０と、同期論理３１４とを含む。ＩＣＵ３２０はリオーダバッファ３２とシステムバス３８とに結合される。レジスタファイル３０とバスインターフェイスユニット３７とはバス２２に結合される。バスインターフェイスユニット３７もまたバス２２に結合される。スレッド制御装置３００はＩＣＵ３２０に結合される。
【００４３】
図４に示されるマルチスレッド多重プロセッサの実施例の１つにおいて、スレッドの制御のために次の５つの命令が用いられる。すなわち、Ｗｒ２Ｐｒｏｃ、ＲｄＦｒＰｒｏｃ、フォーク、結合、同期である。次の表１は各命令の目的の簡単な説明を与える。
【００４４】
【表１】
0004578042.tif 000002
【００４５】
簡単にいうと、マスタプロセッサ１２Ａはスレーブプロセッサ１２ＢにＷｒ２Ｐｒｏｃ命令を運ぶことによって、実行のために第２のスレッドをセットアップする。Ｗｒ２Ｐｒｏｃ命令はマスタプロセッサのレジスタファイルからスレーブプロセッサにデータを移動する。第２のスレッドの実行を開始するためにフォーク命令が用いられる。マスタプロセッサ１２Ａがフォーク命令をスレーブプロセッサ１２Ｂに運ぶと、スレーブプロセッサ１２Ｂはそのリオーダバッファ３２Ｂ中にフォーク命令を置き、フォーク命令とともに運ばれるスレッドアドレスからの第２のスレッドに対する命令のフェッチを開始する。結合命令の実行の際に第２のスレッドの実行は終了する。以下に考察するとおり、スレッド命令を投機的に実行する能力は重要である。次に投機的実行に対する支持を考察し、その後スレッドセットアップおよび実行の全体機構のより詳細な考察を行なう。
【００４６】
投機的スレッド実行に対する支持
最新のスーパースカラプロセッサは大きな命令ウィンドウを有する。そのため、スレッド起動の前にフォーク命令がリタイアするのを待つと、かなりの遅延が起こり得る。最適なスレッド起動を可能にするために、この機構はスレッドの投機的起動を可能にすべきである。このことによって、マスタプロセッサ中でフォーク命令がリタイアするよりもかなり前に、スレーブプロセッサ中で第２のスレッドを起動および実行できる。有利には、マルチスレッド多重プロセッサの性能が改善される。
【００４７】
投機的スレッド実行を支持するために、各プロセッサ１２にはリオーダバッファタグ変換バッファ（ＲＴＢ）４００が含まれ、これは１つのプロセッサリオーダバッファ中の命令の場所を別のプロセッサリオーダバッファ中の同じ命令の場所にマップする。実施例の１つにおいて、ＲＴＢ４００はリオーダバッファ３２と同数のエントリを有する。ＲＴＢは第１のプロセッサのリオーダバッファ３２タグとともにアドレス指定され、ＲＴＢ４００のアドレス指定されたエントリは第２のプロセッサの対応するリオーダバッファタグ３２を含む。
【００４８】
スレッドの投機的起動および実行を可能にするために、Ｗｒ２Ｐｒｏｃおよびフォーク命令は投機的に処理される。Ｗｒ２ＰｒｏｃおよびフォークがマスタプロセッサＩＣＵ３２０Ａにディスパッチされるとき、それらはＦＩＦＯ１  ３１０Ａを介してスレーブプロセッサ１２Ｂにも送られる。Ｗｒ２Ｐｒｏｃ命令がマスタＩＣＵ３２０Ａにディスパッチされるとき、２つの可能性が存在し得る。すなわち、データが利用可能であるか、またはデータが利用可能でないかである。データが利用可能であるとき、命令と、その命令のリオーダバッファ３２Ａタグと、「加算命令」とがスレーブプロセッサに送られる。命令およびデータはスレーブプロセッサのリオーダバッファ３２Ｂに挿入され、エントリは有効データを有するとしてマーク付けされる。加えて、スレーブのＲＴＢ４００Ｂが更新されることによって、リオーダバッファ３２Ａエントリとリオーダバッファ３２Ｂエントリとの対応を示す。マスタプロセッサＩＣＵ３２０Ａへのディスパッチの際にデータが利用可能でないとき、命令はデータが利用可能になるまでマスタプロセッサＩＣＵ３２０ＡのＩＣＵ予約ステーション４０２Ａに残る。しかし、命令はスレーブプロセッサ１２Ｂにも送られる。その命令はスレーブプロセッサのリオーダバッファ３２Ｂに挿入され、スレーブプロセッサリオーダバッファ３２Ｂにおけるエントリは有効データを有さないとしてマーク付けされ、ＲＴＢ４００Ｂは前述のように更新される。有効データを有さないとしてマーク付けされるスレーブプロセッサリオーダバッファ３２Ｂ中の命令は、データが利用可能になるまで実行しなくてもよい。マスタプロセッサ１２Ａの予約ステーション４０２Ａにおいて待っている命令に対してデータが利用可能になると、その命令はマスタプロセッサ１２Ａの予約ステーション４０２Ａから除去されてＩＣＵ３２０Ａに発行される。ＩＣＵ３２０Ａがこの命令を受取るとき、マスタプロセッサのデータおよびリオーダバッファ３２Ａタグが、「データ更新」コマンドとともにスレーブプロセッサ１２Ｂに送られる。スレーブプロセッサ１２ＢはＲＴＢ４００Ｂを用いてリオーダバッファ３２Ａタグを変換し、スレーブプロセッサ１２Ｂリオーダバッファ３２Ｂにおける命令のタグを識別する。次いで、対応するリオーダバッファ３２Ｂタグが用いられて、データを正しいリオーダバッファ３２Ｂエントリに挿入する。スレーブプロセッサリオーダバッファ３２Ｂ中の命令はここで有効データを有するとしてマーク付けされ、スレーブプロセッサ１２Ｂ中の従属命令が発行されてもよい。
【００４９】
スレッドセットアップおよびスレッド起動
別のプロセッサにおける実行のために第２のスレッドをセットアップするために、マスタプロセッサ１２ＡはＦＩＦＯ１  ３１０Ａを介してスレーブプロセッサ１２Ｂに投機的Ｗｒ２Ｐｒｏｃ命令を運ぶ。Ｗｒ２Ｐｒｏｃ命令に加えて、マスタプロセッサ１２Ａは命令のリオーダバッファ３２Ａタグをスレーブプロセッサ１２Ｂに運ぶ。この命令はスレーブプロセッサのリオーダバッファ３２Ｂ中に置かれる。Ｗｒ２Ｐｒｏｃ命令に対するデータが利用可能であるときには、それもリオーダバッファ３２Ｂ中に置かれる。そうでないときには、リオーダバッファ３２Ｂエントリは有効データを有さないとしてマーク付けされる。これと並行して、スレーブプロセッサリオーダバッファ３２Ｂのタグをマスタプロセッサリオーダバッファ３２Ａのタグによって索引付けされる場所に置くことによって、スレーブプロセッサのＲＴＢ４００Ｂが更新される。スレーブプロセッサ１２Ｂのリオーダバッファ３２Ｂが一杯のとき、マスタプロセッサ１２Ａから命令が受取られない。スレーブプロセッサリオーダバッファ１２Ｂにおいて空間が利用可能であるとき、マスタプロセッサ１２Ａは表示を受取り、保留命令が送られてもよい。
【００５０】
第２のスレッドのセットアップが完了した後、フォーク命令が用いられて第２のスレッドの実行が開始される。フォーク命令がマスタプロセッサに出会うとき、それは前述のようにスレッド制御装置３００を介してスレーブプロセッサ１２Ｂに送られる。スレーブプロセッサ１２Ｂがスレッドを既にランしているときには、フォーク命令は無視される。フォーク動作の成功に対してスレーブプロセッサ１２Ｂによって表示が作成される。このような表示は、マスタプロセッサ１２Ａによってチェックされ得る通常のプロセッサフラグをセットするなど、さまざまな手段によって作成されてもよい。他の実施例は他の手段を用いて、別のスレッドが既にランしているときに第２のスレッドを開始する試みが起こらないことを確実にし、フラグのセットおよびチェックの必要性をなくしてもよい。スレーブプロセッサ１２Ｂが既にスレッドをランしていないときには、フォーク命令はリオーダバッファ３２Ｂ中に置かれ、スレーブプロセッサは第２のスレッドに対する命令のフェッチを開始する。新たにフェッチされたスレッド命令はリオーダバッファ３２Ｂのフォーク命令の後に置かれ、実行のためにプロセッサ機能ユニットにディスパッチされる。Ｗｒ２Ｐｒｏｃ命令に対する顕著な従属性を有さない命令を発行してもよい。有利には、マスタプロセッサ１２Ａにおいてフォーク命令がリタイアする前に、スレーブプロセッサ１２Ｂにおいて多くの非従属命令が発行されてもよい。スレーブプロセッサ１２Ｂにおけるフォーク命令の後のスレッド命令の実行の機構は、通常のスーパースカラプロセッサと同一である。
【００５１】
分岐の誤った予測および訂正
マスタプロセッサ１２Ａにおいて分岐の誤った予測が検出されるとき、その分岐に続くリオーダバッファ３２Ａ中のすべてのエントリは無効にされる。Ｗｒ２Ｐｒｏｃまたはフォーク命令が誤って予測されたときには、それらもスレーブプロセッサ１２Ｂにおいて無効にされる必要がある。マスタプロセッサ１２Ａが誤って予測された分岐に続くリオーダバッファ３２Ａ中のエントリを無効にするとき、それは誤って予測された分岐に続く第１のＷｒ２Ｐｒｏｃまたはフォーク命令を検出し、ＩＣＵ３２０Ａに無効化要求とともにその命令のリオーダバッファ３２Ａタグを送る。このタグおよび要求は次いでスレーブプロセッサ１２Ｂに運ばれ、そこでマスタプロセッサリオーダバッファ３２ＡタグがＲＴＢ４００Ｂによって変換されることにより、スレーブプロセッサ１２Ｂのリオーダバッファ３２Ｂタグが得られる。得られたリオーダバッファ３２Ｂタグを用いて、リオーダバッファ３２Ｂにおけるそのエントリおよびその後のすべてのエントリが無効にされる。リオーダバッファ３２Ｂにおける命令の無効化の際にフォーク命令に出会うと、スレーブプロセッサ１２Ｂにおける投機的実行は停止する。
【００５２】
第２のスレッド実行の終了およびリタイア
スレーブプロセッサ１２Ｂにおいて実行する第２のスレッドの終了は結合命令によって示される。結合命令は、マスタプロセッサ１２Ａにおいてランするスレッドにおいても用いられる。マスタおよびスレーブプロセッサ１２がどちらも結合命令をリタイアしたとき、スレーブプロセッサ１２Ｂは実行を停止し、実行はマスタプロセッサ１２Ａにおいてのみ継続する。スレーブプロセッサ１２Ｂが結合命令をリタイアするとき、それはこのリタイアをマスタプロセッサ１２Ａに信号し、そのリオーダバッファ３２Ｂはクリアされる。次いでスレーブプロセッサ１２Ｂは実行を停止し、次のフォーク命令を待つ。スレーブプロセッサ１２Ｂが結合命令をリタイアしたという表示をマスタプロセッサ１２Ａが受取ったとき、マスタプロセッサ１２Ａはその結合命令が完了してリタイアできるものとしてマーク付けする。
【００５３】
両方のプロセッサ１２が結合命令をリタイアしたとき、マスタプロセッサ１２Ａはスレーブプロセッサ１２Ｂのレジスタファイル３０Ｂにアクセスして、第２のスレッドの実行の結果を得てもよい。スレーブレジスタファイル３０Ｂへのアクセスは、ＲｄＦｒＰｒｏｃ命令を用いることによって得られる。ＲｄＦｒＰｒｏｃ命令はマスタプロセッサ１２ＡによってＩＣＵ３２０Ａにディスパッチされ、そこで予約ステーション４０２Ａ中でそれが先頭になるまで待ってから発行される。次いで、ＲｄＦｒＰｒｏｃコマンドがスレーブプロセッサ１２Ｂに送られる。スレーブプロセッサ１２ＢにおけるＲｄＦｒＰｒｏｃコマンドの実行は、特定化されたレジスタの内容を読取り、その結果をＦＩＦＯ２  ３１０Ｂを介してマスタプロセッサ１２Ａに戻す。なおも実行相にあるマスタプロセッサ中のＲｄＦｒＰｒｏｃコマンドは、その結果を取出してそれを結果バス３８Ａ上に置く。次いで通常の命令実行が継続される。
【００５４】
ＲｄＦｒＰｒｏｃ命令は結合命令がリタイアする前に発行されてもよいが、結合命令がリタイアするまでリタイアしてはならない。ＲｄＦｒＰｒｏｃ命令より前には同期が行なわれないため、結合命令はマスタおよびスレーブスレッドの両方においてその命令に先行しなければならない。誤って予測された分岐が起こり、かつＲｄＦｒＰｒｏｃ命令が誤って予測されるとき、その命令はなおもデータを受取ってもよいが、その結果はマスタプロセッサリオーダバッファ３２Ａによって廃棄される。有利には、前述の機構はＲｄＦｒＰｒｏｃ命令の投機的実行を可能にする。
【００５５】
Ｗｒ２Ｐｒｏｃおよびフォーク命令のリタイア
Ｗｒ２Ｐｒｏｃまたはフォーク命令がマスタプロセッサリオーダバッファ３２Ａにおいてリタイアするとき、リオーダバッファ３２Ａタグがスレーブプロセッサに送られ、そこでＲＴＢ４００Ｂによってスレーブプロセッサのリオーダバッファ３２Ｂタグに変換される。マスタプロセッサ１２Ａにおいてリタイアしたそれらの命令は、次いでスレーブプロセッサ１２Ｂからもリタイアされてもよい。
【００５６】
Ｗｒ２Ｐｒｏｃおよびフォーク命令のリタイアはさまざまな態様で扱われてもよい。１つの方法はリタイアコマンドを含み、第２の方法はフォークコミットコマンドを含む。前述のような分岐の誤った予測の回復を実現するために、Ｗｒ２Ｐｒｏｃおよびフォークコマンドは、マスタプロセッサリオーダバッファ３２Ａにおいてリタイアしなければスレーブプロセッサリオーダバッファ３２Ｂにおいてリタイアできない。したがって、このようなリタイアが起こるときにはリオーダバッファ３２Ａはリオーダバッファ３２Ｂに通知しなければならない。この通知を行なうための１つのやり方は、Ｗｒ２Ｐｒｏｃまたはフォーク命令がマスタリオーダバッファ３２Ａにおいてリタイアするたびに、スレーブプロセッサ１２Ｂにリオーダバッファ３２Ａタグとともにリタイアコマンドを送るものである。マスタリオーダバッファ３２Ａタグは次いでスレーブプロセッサ１２Ｂ中のＲＴＢ４００Ｂによって変換され、スレーブリオーダバッファ３２Ｂタグが得られる。次いで得られたスレーブリオーダバッファ３２Ｂタグを用いて対応する命令をリタイアする。この方法はスレーブリオーダバッファ３２Ｂに付加的なリタイアトラフィックを生成するが、この方法の動作は以下の方法とは異なり、ソフトウェアに対して有利に透明である。
【００５７】
Ｗｒ２Ｐｒｏｃおよびフォーク命令のリタイアを扱う第２の方法は、フォークコミットコマンドの使用を含む。フォーク命令がマスタリオーダバッファ３２Ａにおいてリタイアされるとき、リオーダバッファ３２Ａは、フォーク命令がリタイアされたことを対応するリオーダバッファ３２ＡタグとともにＩＣＵ３２０Ａに示す。次いでＩＣＵ３２０Ａは、フォークコミットコマンドおよびリオーダバッファ３２Ａタグをスレーブプロセッサ１２Ｂに送る。次いでリオーダバッファ３２ＡタグはＲＴＢ４００Ｂによって変換され、対応するリオーダバッファ３２Ｂタグが得られる。得られたリオーダバッファ３２Ｂタグを用いて、対応するエントリが完了してリタイアできるとマーク付けする。また、スレーブリオーダバッファ３２Ｂにおけるすべての以前のＷｒ２Ｐｒｏｃ命令が完了して今リタイアできるとマーク付けされる。この第２の方法を用いるときには、考慮すべき特別な場合がある。何らかの理由によってＷｒ２Ｐｒｏｃ命令にフォーク命令が続かないとき、それらは完了とマーク付けされなくてもよく、リオーダバッファ３２Ｂに残っていてもよい。マスタプロセッサ１２Ａによるその後のスレッドセットアップはさらなるＷｒ２Ｐｒｏｃ命令を書込んでもよい。各セットアップによって、スレーブリオーダバッファ３２Ｂにおけるより少ない空間が利用可能になる。このプロセスは継続する可能性があり、最終的にはスレーブリオーダバッファ３２Ｂのオーバーフローをもたらす。この条件を避けるために、ソフトウェアはスレーブリオーダバッファ３２Ｂの利用可能なサイズを常に追跡していることが要求される。この第２の方法は前述の第１の方法よりも少ないトラフィックを生成し得るが、ソフトウェアがスレーブリオーダバッファ３２Ｂ中の利用可能な空間を継続的に追跡することを要求するのは望ましくない。したがって、リタイアコマンドを用い、かつソフトウェアに対して透明な前述の第１の方法が好ましい。
【００５８】
実施例の１つにおいて、ＩＣＵ３２０はサイクル当り複数の命令を受入れてもよい。予約ステーション４０２は複数の命令に適応してもよく、ここで予約ステーション４０２内のその命令の位置はそれらが他のプロセッサに送られる順序を示す。加えて、複数の命令が一度に他のプロセッサに運ばれてもよい。全体として、命令が他のプロセッサのリオーダバッファ３２Ｂに順序どおりに挿入されることを確実にする必要がある。
【００５９】
スレッドの同期
同期命令を用いる同期
並行スレッドの実行の際には、スレッドを決定できる状態にすることが望ましいときがある。たとえば、スレッド間でデータを交換する必要があるときには、スレッドの実行を同期させるための機構が必要である。同期を可能にするために、実施例の１つにおいては同期命令および同期論理が用いられてもよい。用いられる同期機構はそのシステムの特徴に依存する。システム中のすべてのプロセッサが同じ待ち時間および相を有するときには、高度に同期的な実現例を用いてもよい。そうでなければより柔軟な実現例を用いてもよい。いずれの場合においても、その機構はソフトウェアに対して透明である。どちらの実現例に対しても同じ同期コードを用いてもよい。
【００６０】
図５は、スレッドを同期させるために同期命令をどのように用い得るかを例示する。図５は２つの列を含み、その各々が命令のスレッドを表わす。第１の列はマスタプロセッサ上でランするコードのスレッドを表わし、第２の列はスレーブプロセッサ上でランするコードのスレッドを表わす。図５における各列は行に分割され、各セルは単一の命令を表わす。命令５００はコード中の他の場所からの分岐エントリ点の役割をし得るラベルを表わす。このスレッドの動作は以下のとおりである。スレッド１コードはスレッド２コードと並行して実行する。スレッド１は第１の同期５０２命令に達するまで実行する。スレッド２コードは、ハンドルデータをｒｅｇ１に移動するｍｏｖ命令５１０を実行する。スレッド２は次いで同期命令５１２に対する実行を続ける。両方のスレッドが第１の同期命令、すなわちそれぞれ５０２および５１２に達したとき、同期命令はリタイアされてもよい。両方の同期命令が同期点を出た（リタイアした）とき、実行は継続する。スレッド１は、プロセッサ２のｒｅｇ１からそのレジスタファイルのｒｅｇ０にデータを読込む命令５０４を実行する。両方のスレッドが同期命令５０６および５１４における第２の同期点に達する。同期命令５０６および５１４がどちらもリタイアできるとき、両方がリタイアされて実行が継続する。次いでスレッド１は比較命令５０７を実行し、それらが同一でないときには、ジャンプ命令５０８によって命令５００による実行が継続する。そうでなければ、スレッド１の実行はその他のコードによって継続する。前述の例が示すとおり、同期命令はすべてのプロセッサがその対応する同期命令をリタイアできるようになるまでリタイアされなくてもよい。このことは、各プロセッサがいつ同期命令をリタイアできるかを示すことを必要とし、また各プロセッサはその他すべてのプロセッサがいつ同期点に達したかを知る必要がある。
【００６１】
図６は、同期論理を実現するための同期機構のブロック図を示す。同期論理３１４と、ＳＳＯ信号６００と、ＳＳＩ信号６０２とが示される。ＳＳＯ信号６００はＣＰＵ１−ｘから出力され、同期論理３１４に入力される。同期論理３１４は信号ＳＳＩ６０２を出力する。図６に示される同期的実現例において、各プロセッサは２つの信号、すなわち同期状態アウト（ＳＳＯ）信号６００および同期信号イン（ＳＳＩ）６０２によって同期論理３１４に接続される。各プロセッサはＳＳＯ信号６００を出力して、同期論理３１４に同期命令の状態を示す。加えて、各プロセッサはＳＳＩ信号６０２を入力として受取り、他のプロセッサにおける同期命令の状態を検出する。実施例の１つにおいて、ＳＳＯ信号６００の状態は次の表によって説明される。
【００６２】
【表２】
0004578042.tif 000003
【００６３】
同期命令はリオーダバッファによって特別に扱われる。この同期的実現例において、ある同期命令が次にリタイアするとき、そのプロセッサのＳＳＯ信号６００が状態１にセットされることにより、その他すべてのプロセッサにそれが同期点に入ったことを示す。同期論理３１４に入力されるすべてのＳＳＯ信号６００が状態１にセットされるとき、同期論理３１４はＳＳＩ信号６０２を状態１にセットする。プロセッサに入力されるＳＳＩ信号６０２が状態１にセットされるときにのみ、そのプロセッサは自身の同期命令をリタイアしてもよい。この態様で、すべてのプロセッサがその同期命令を同時にリタイアする。プロセッサが同期命令をリタイアするとき、そのＳＳＯ信号６００は続くクロックサイクルにおいて状態０にセットされることにより、それが同期点を出たことを示す。リタイア後の第２のクロックサイクルにおいて、同期命令がリタイアできるときにはＳＳＯ信号６００は再び状態１にセットされてもよい。この同期的実現例において、同期論理３１４はアンドゲートからなっていてもよく、ここですべてのＳＳＯ信号６００を入力として、ＳＳＩ信号６０２を出力として有する。この同期的実現例は最速の同期機構を提供する。しかし、これはプロセッサがサイクルごとの同期的態様で動作するときにのみ用い得る。
【００６４】
プロセッサ間の同期的動作が保証されないとき、同期論理３１４の非同期的実現が用いられてもよい。図７は非同期的実現例を例示するブロック図である。図７は同期論理３１４と、同期論理３１４に入力されるＳＳＯ信号７００と、同期論理３１４から出力されるＳＳＩ信号７０２とを示す。この非同期的実現例において、各プロセッサはその同期命令の状態を示すための２ビットＳＳＯ信号７００を含む。同期的実現例と同様に、同期論理３１４は各プロセッサにＳＳＩ信号７０２を出力する。実施例の１つにおいて、ＳＳＯ信号７００の状態は次の表によって説明されてもよい。
【００６５】
【表３】
0004578042.tif 000004
【００６６】
同期的実現例と同様に、同期命令はリオーダバッファ３２によって特別に扱われる。非同期的実現例において、同期命令が次にリタイアするとき、そのプロセッサのＳＳＯ信号は状態１にセットされることによって、他のプロセッサにそれが同期命令をリタイアできることを示す。同期論理３１４に入力されるすべてのＳＳＯ信号７００が状態１にセットされるとき、同期論理３１４はＳＳＩ信号７０２を状態１にセットする。プロセッサに入力されるＳＳＩ信号７０２が状態１にセットされるときにのみ、そのプロセッサは自身の同期命令をリタイアしてもよい。この態様で、すべてのプロセッサがその同期命令を同時にリタイアする。同期命令がリタイアされるとき、そのプロセッサのＳＳＯ信号７００は状態２にセットされることによって、他のプロセッサにそれが同期点を出ることを示す。プロセッサが同期点を出てそのＳＳＯ信号７００を状態２にセットするとき、それはその他すべてのプロセッサが同期点を出るまで待つ。すべてのプロセッサがそのＳＳＯ信号７００を状態２にセットしたとき、ＳＳＩ信号７０２は状態０にセットされる。次いですべてのプロセッサがＳＳＩ信号７０２が状態０にセットされたことを検出し、実行を継続してもよい。ＳＳＩ信号７０２が状態０に戻った後、プロセッサはそのＳＳＩ信号７０２を状態１にセットすることによって別の同期命令がリタイアできることを示してもよい。
【００６７】
同期論理３１４の非同期的実現例は中央論理であっても、またはプロセッサの１つの部分として含まれてもよい。同期論理３１４は、図８に例示されるように働き得る小さい状態機械を実現する。図８は、ＦＳＭＳｔａｔｅの状態を連続的にチェックする連続ループを表わす。ＦＳＭＳｔａｔｅは、プロセッサ中の同期信号ＳＳＯの状態を表わす。最初に、同期論理３１４は状態ＷＡＩＴ＿ＡＬＬ＿Ｓ１であってもよい。状態ＷＡＩＴ＿ＡＬＬ＿Ｓ１にあるとき、信号ＳＳＩは状態０にセットされる。すべてのＳＳＯ信号が状態Ｓ１にあるとき、それはすべてのプロセッサが同期命令をリタイアできることを示し、ＦＳＭＳｔａｔｅに対する次の状態はＡＬＬ＿Ｓ１である。そうでなければ、ＦＳＭＳｔａｔｅに対する次の状態はＷＡＩＴ＿ＡＬＬ＿Ｓ１のままである。すべてのＳＳＯ信号が状態Ｓ１になると、ＦＳＭＳｔａｔｅは状態ＡＬＬ＿Ｓ１および続いて状態ＷＡＩＴ＿ＡＬＬ＿Ｓ２に移る。状態ＷＡＩＴ＿ＡＬＬ＿Ｓ２において、信号ＳＳＩは状態１にセットされ、それによって各プロセッサは自身の同期命令をリタイアできる。状態ＷＡＩＴ＿ＡＬＬ＿Ｓ２にあるとき、同期論理はすべてのＳＳＯ信号が状態２に入るのを待つ。すべてのプロセッサが、自身のＳＳＯ信号を状態２にセットすることによって示されるとおり、同期点を出たときには、ＦＳＭＳｔａｔｅは状態ＡＬＬ＿Ｓ２および続いて状態ＷＡＩＴ＿ＡＬＬ＿Ｓ１に移り、そこで信号ＳＳＩを状態０にセットする。この実現例は、たとえプロセッサがロックステップにおいて働いていなくても、それらの同期を可能にする。この実現例はより柔軟であるが、これは前述の同期的実現例よりも長い待ち時間を有する。
【００６８】
スクラッチパッドを用いる同期
複数のプロセッサが異なるスレッドを処理しているときにデータを交換する別のやり方は、スクラッチパッドレジスタ空間を用いることである。図９は、ＩＣＵ９２０Ａと、同期のためにスクラッチパッドレジスタ９０２を用いるＴＣＤ９００とのブロック図を示す。スクラッチパッドレジスタ９０２に加えて、スクラッチパッドレジスタにアクセスする付加的なスクラッチパッド命令（以下ＳＣＩＮＳ）が加えられる。スクラッチパッド機構を実現するために、スクラッチパッド論理９０２がＴＣＤに付加されている。図９にはＩＣＵ９０２ＡとＴＣＤ９００とが示される。ＩＣＵ９０２ＡはＳＣＩＮＳ読取予約ステーション９３０Ａと、ＳＣＩＮＳ書込予約ステーション９３２Ａと、ＦＩＦＯ予約ステーション４０２Ａとを含む。ＴＣＤ９００はＦＩＦＯ３１０と、同期論理３１４と、スクラッチパッドレジスタ９０２とを含む。ＩＣＵ９０２ＡはＴＣＤ９００に結合される。
【００６９】
ＳＣＩＮＳはスクラッチパッドレジスタ場所に対するロックされた読取−変更−書込（以下ＲｍｏｄＷ）命令である。これらの命令は並行スレッド実行の際の共有データの変更を可能にする。スクラッチパッドレジスタはアドレスベースによってアドレスにロックされてもよい。ＳＣＩＮＳは、ＩＣＵ９２０から分離しているか、またはそこに含まれてもよい特別の機能ユニットによって扱われる。ＳＣＩＮＳ機能ユニットは、読取および書込アクセスに対する分離した予約ステーション９３０および９３２を含む。すべての命令はスクラッチパッド予約ステーションから順に発行される。ＲｍｏｄＷ動作によってスクラッチパッド場所を変更するあらゆる命令はロックされた命令である。ＳＣＩＮＳは複数の動作にデコードされる。少なくともロックされた読取、ＡＬＵ動作、およびロックされた書込が生成される。この機構は次のように働く。
【００７０】
１．ロックされたＲｍｏｄＷ  ＳＣＩＮＳがデコードされる。このデコードされた命令から、ロックされた読取およびロックされた書込がＳＣＩＮＳ機能ユニットにディスパッチされる。
【００７１】
２．ロックされた読取がロックされた読取予約ステーション９３０Ａに挿入される。ロックされた書込がロックされた書込予約ステーション９３２Ａに挿入される。
【００７２】
３．読取予約ステーション９３０Ａにおけるすべての前の読取が完了すると、ロックされた読取が読取予約ステーション９３０Ａから発行される。すべてのＲｍｏｄＷ命令は順序どおりに発行されるため、対応する書込命令もまた書込予約ステーション９３２Ａの先頭になる。
【００７３】
４．読取がスクラッチパッドレジスタ９０２にアクセスする。それがロックされているときには、読取はそれがアンロックされるまで待つ。次いでそれはスクラッチパッドレジスタ９０２場所をロックし、その動作を完了し、結果を結果バスに運ぶ。しかし、読取命令はまだ予約ステーション９３０Ａから取除かれない。
【００７４】
５．ここでその読取に従属するすべての命令が発行されてもよい。書込予約ステーション９３２Ａにおけるロックされた書込がその入力オペランドを受取ると、それは発行できる。しかし、書込はその書込がリオーダバッファ３２において次にリタイアするまで発行されない。非投機的書込のみが許可されるために、このことが必要である。
【００７５】
６．書込がリオーダバッファ３２において次にリタイアするとき、書込は予約ステーション９３２Ａから発行され、スクラッチパッドレジスタ９０２に書込まれる。この書込はデータを更新し、場所をアンロックする。ここでＳＣＩＮＳ読取および書込命令はそれぞれ予約ステーション９３０および９３２から取除かれる。
【００７６】
前述の６において、関連する書込がリタイアすると読取は予約ステーション９３０から取除かれる。分岐の誤った予測を適切に扱うために、読取は予約ステーション９３０に残る必要がある。誤って予測された分岐の場合には、この機構は次のように動作する。
【００７７】
１．誤って予測された分岐が検出されると、リオーダバッファ３２中の誤って予測された分岐に続くエントリが取消される。
【００７８】
２．取消の際に、ＳＣＩＮＳのロックされた命令が検出されてもよい。これによって、リオーダバッファ３２は無効コマンドとともに取消されたＳＣＩＮＳに対するリオーダバッファタグをＳＣＩＮＳ機能ユニットに送る。複数のＳＣＩＮＳ命令が検出されるときには、分岐後の第１の命令のタグのみが要求される。
【００７９】
３．ＳＣＩＮＳ機能ユニットは運ばれたリオーダバッファタグを用いて、受取ったリオーダバッファタグから始まる、およびそれに続く予約ステーション９３０および９３２中のすべての命令を無効にする。
【００８０】
４．読取予約ステーション９３０Ａ中の命令の取消が、既に発行された予約ステーション９３０Ａの先頭における読取にヒットするとき、論理はその読取命令のアドレスを用いてスクラッチパッドレジスタ９０２中のその場所をアンロックする。
【００８１】
前述の機構は、投機的にロックされたスクラッチパッド場所９０２がアンロックされることを可能にする。前述の機構はロックされた読取の投機的実行を可能にすることが有利である。前述の考察は分離した読取および書込予約ステーションを用いるが、その他の実現例が用いられてもよく、予期される。しかし、それはロックされた読取が誤って予測されたときに、誤って予測されたロックされた書込を実行することなくその場所をアンロックできる必要がある。
【００８２】
コンピュータシステム
図１０に移ると、バスブリッジ１８０２を通じてさまざまなシステム構成要素に結合された多重プロセッサコンピュータ１００を含むコンピュータシステム１８００の実施例の１つのブロック図が示される。その他の実施例も可能であり予期される。ここに示されるシステムにおいて、メインメモリ１８０４はメモリバス１８０６を通じてバスブリッジ１８０２に結合され、グラフィックスコントローラ１８０８はＡＧＰバス１８１０を通じてバスブリッジ１８０２に結合される。最後に、複数のＰＣＩ装置１８１２Ａ−１８１２ＢがＰＣＩバス１８１４を通じてバスブリッジ１８０２に結合される。ＥＩＳＡ／ＩＳＡバス１８２０を通じて１つまたはそれ以上のＥＩＳＡまたはＩＳＡ装置１８１８に対する電気的インターフェイスに適応するために二次的なバスブリッジ１８１６がさらに与えられてもよい。多重プロセッサコンピュータ１００はＣＰＵバス１８２４を通じてバスブリッジ１８０２に結合され、また任意のＬ２キャッシュ１８２８に結合される。
【００８３】
バスブリッジ１８０２は多重プロセッサコンピュータ１００と、メインメモリ１８０４と、グラフィックスコントローラ１８０８と、ＰＣＩバス１８１４に取付けられた装置とのインターフェイスを提供する。バスブリッジ１８０２に接続された装置の１つから動作を受取ると、バスブリッジ１８０２は動作の目標（たとえば特定の装置または、ＰＣＩバス１８１４の場合にはその目標はＰＣＩバス１８１４上にある）を識別する。バスブリッジ１８０２はその動作を目標の装置に経路付けする。バスブリッジ１８０２は一般的に、ソース装置またはバスによって用いられるプロトコルから目標装置またはバスによって用いられるプロトコルに動作を変換する。
【００８４】
二次的バスブリッジ１８１６は、ＰＣＩバス１８１４にＩＳＡ／ＥＩＳＡバスに対するインターフェイスを与えることに加えて、所望に応じて付加的な機能をさらに組み入れてもよい。所望に応じて、キーボードおよびマウス１８２２ならびにさまざまな直列および並列ポートに対する動作支持を提供するために、二次的バスブリッジ１８１６の外にあるか、またはそこに一体化される入力／出力コントローラ（図示せず）がコンピュータシステム１８００に含まれてもよい。他の実施例においては、多重プロセッサコンピュータ１００とバスブリッジ１８０２との間のＣＰＵバス１８２４に外部キャッシュユニット（図示せず）がさらに結合されてもよい。代替的には、外部キャッシュはバスブリッジ１８０２に結合されてもよく、その外部キャッシュに対するキャッシュ制御論理がバスブリッジ１８０２に一体化されてもよい。プロセッサ１０に対する後側構成にＬ２キャッシュ１８２８がさらに示される。なお、Ｌ２キャッシュ１８２８は多重プロセッサコンピュータ１００から分離していても、多重プロセッサコンピュータ１００とともにカートリッジ（たとえばスロット１またはスロットＡ）に一体化されても、または多重プロセッサコンピュータ１００とともに半導体基板上に一体化されてもよい。
【００８５】
メインメモリ１８０４は、アプリケーションプログラムが記憶され、そこから多重プロセッサコンピュータ１００が本質的に実行するメモリである。好適なメインメモリ１８０４はＤＲＡＭ（動的ランダムアクセスメモリ）を含む。たとえば、複数のバンクのＳＤＲＡＭ（同期ＤＲＡＭ）またはラムバスＤＲＡＭ（ＲＤＲＡＭ）が好適であり得る。
【００８６】
ＰＣＩ装置１８１２Ａ−１８１２Ｂは、たとえばネットワークインターフェイスカード、ビデオ加速器、オーディオカード、ハードまたはフロッピー（Ｒ）ディスクドライブまたはドライブコントローラ、ＳＣＳＩ（小型コンピュータシステムインターフェイス）アダプタ、およびテレホンカードなどのさまざまな周辺装置を例示するものである。同様に、ＩＳＡ装置１８１８は、モデム、サウンドカード、およびＧＰＩＢまたはフィールドバスインターフェイスカードなどのさまざまなデータ収集カードなどのさまざまな種類の周辺装置を例示するものである。
【００８７】
グラフィックスコントローラ１８０８は、ディスプレイ１８２６上の文字および画像のレンダリングを制御するために与えられる。グラフィックスコントローラ１８０８は、メインメモリ１８０４に、およびそこから効率的にシフトされ得る三次元データ構造をレンダリングすることが当該技術分野において一般的に公知である典型的なグラフィックス加速器を包含してもよい。したがってグラフィックスコントローラ１８０８は、バスブリッジ１８０２内の目標インターフェイスに対するアクセスを要求および受取ることによってメインメモリ１８０４へのアクセスを得ることができるという点において、ＡＧＰバス１８１０のマスタであってもよい。専用グラフィックスバスはメインメモリ１８０４からのデータの迅速な検索に適応する。特定の動作に対して、グラフィックスコントローラ１８０８はＡＧＰバス１８１０上にＰＣＩプロトコルトランザクションを生成するようにさらに構成されてもよい。よってバスブリッジ１８０２のＡＧＰインターフェイスはＡＧＰプロトコルトランザクションならびにＰＣＩプロトコル目標およびイニシエータトランザクションの両方を支持する機能を含んでもよい。ディスプレイ１８２６は、画像または文字をその上に提供できるあらゆる電子ディスプレイである。好適なディスプレイ１８２６は陰極線管（“ＣＲＴ”）、液晶ディスプレイ（“ＬＣＤ”）などを含む。
【００８８】
なお、前述の説明においてはＡＧＰ、ＰＣＩおよびＩＳＡまたはＥＩＳＡバスを例として用いたが、所望に応じてあらゆるバスアーキテクチャを置換してもよい。さらに、コンピュータシステム１８００は付加的な多重プロセッサコンピュータ（たとえばコンピュータシステム１８００の任意の構成要素として示される多重プロセッサコンピュータ１０ａなど）を含む多重処理コンピュータシステムであってもよい。多重プロセッサコンピュータ１０ａは多重プロセッサコンピュータ１０と類似のものであってもよい。より特定的には、多重プロセッサコンピュータ１０ａは多重プロセッサコンピュータ１０の同一のコピーであってもよい。多重プロセッサコンピュータ１０ａは（図５に示すとおり）独立のバスを介してバスブリッジ１８０２に接続されても、またはプロセッサ１０とＣＰＵバス１８２４を共有してもよい。さらに、プロセッサ１０ａはＬ２キャッシュ１８２８と類似の任意のＬ２キャッシュ１８２８ａに結合されてもよい。
【００８９】
なお、この考察はさまざまな信号のアサーションを参照してもよい。ここで用いられるとおり、信号はそれが特定の状態を示す値を運ぶときには「アサート」される。逆に、信号はそれが特定の状態がないことを示す値を運ぶときには「デアサート」される。信号は、それが論理０値を運ぶとき、または逆にそれが論理１値を運ぶときにアサートされることが定められてもよい。加えて、前述の考察においてはさまざまな値が廃棄されたと説明された。値はいくつかの態様で廃棄されてもよいが、一般的には、その値を変更することによってその値を受取る論理回路がそれを無視するようにすることを含む。たとえば、その値がビットを含むときには、その値の論理状態が反転されてその値を廃棄してもよい。その値がｎビット値のときには、そのｎビット符号の１つがその値が無効であることを示してもよい。その値を無効符号にセットすることによって、その値は廃棄される。付加的には、ｎビット値は、セットされるときにそのｎビット値が有効であることを示す有効ビット表示を含んでもよい。その有効ビットをリセットすることがその値を廃棄することを含んでもよい。値を廃棄するその他の方法が用いられてもよい。
【００９０】
一旦前述の開示が完全に認識されると、当業者には多数の修正形および変更形が明らかになるであろう。添付の請求項はこうしたすべての修正形および変更形を包含すると解釈されることが意図される。
【００９１】
産業上の適用可能性
この発明は、多重処理コンピュータシステムに適用可能である。
【図面の簡単な説明】
【図１】  マイクロプロセッサの実施例の１つのブロック図である。
【図２】  多重プロセッサコンピュータの実施例の１つを示すブロック図である。
【図３Ａ】  ２つのマイクロプロセッサおよびスレッド制御装置を示す図である。
【図３Ｂ】  スレッドのセットアップ、実行および完了を例示するフローチャートである。
【図４】  ２つのマイクロプロセッサおよびスレッド制御装置を示す図である。
【図５】  命令の２つのスレッドおよび同期命令の使用を示す図である。
【図６】  同期論理の同期的実現例を示す図である。
【図７】  同期論理の非同期的実現例を示す図である。
【図８】  同期論理の非同期的実現例を表わす命令配列を示す図である。
【図９】  プロセッサ間通信ユニットおよびスレッド制御装置の実施例の１つを示す図である。
【図１０】  図２に示される多重プロセッサコンピュータを含むコンピュータシステムの実施例の１つを示すブロック図である。
【図１】
0004578042.tif 000005
【図２】
0004578042.tif 000006
【図３Ａ】
0004578042.tif 000007
【図３Ｂ】
0004578042.tif 000008
【図４】
0004578042.tif 000009
【図５】
0004578042.tif 000010
【図６】
0004578042.tif 000011
【図７】
0004578042.tif 000012
【図８】
0004578042.tif 000013
【図９】
0004578042.tif 000014
【図１０】
0004578042.tif 000015