(57)【要約】深さｐのパイプライン化された演算実行ユニットにおいて命令ストリームを実行する方法は：命令ストリームをロードすること；ロードされた命令ストリーム中の命令の反復を検出すること；パイプラインが中間ストレージをインスタンスのｐ個のストリームに提供するように、パイプライン中の命令のｐ個のストリームをインターリーブすること；反復の終了を検出すること；および、すべてのプログラムされた反復が完了した後に、ｐ個のストリームから得られた結果を結合すること、を含む。計算回路は：オペランドおよび反復演算の結果の両方を表す値を記憶することができるレジスタ；レジスタからのオペランドを受け取るように接続する第一の入力および反復操作の識別値のソースに接続する第二の入力、および出力を有するマルチプレクサ；および、マルチプレクサの出力からの値を受け取るように接続する入力、および結果をレジスタへ返すように接続する出力を有するオペレータ回路、を含む。
2006506735.tif 000002
【特許請求の範囲】
【請求項１】
深さｐのパイプライン化された演算実行ユニットにおいて命令ストリームを実行する方法であって：
命令ストリームをロードすること；
ロードされた命令ストリーム中の命令の反復を検出すること；
パイプラインが中間ストレージをインスタンスのｐ個のストリームに提供するように、パイプライン中の命令のインスタンスのｐ個のストリームをインターリーブすること；
反復の終了を検出すること；および
すべてのプログラムされた反復が完了した後に、ｐ個のストリームから得られた結果を結合すること、
を含む、前記方法。
【請求項２】
ｐが少なくとも２である、請求項１に記載の方法。
【請求項３】
命令の検出された反復のためのインターロックを無効化することをさらに含む、請求項１に記載の方法。
【請求項４】
検出が、同一のオペランドおよびあて先を有する反復される命令に基づいて命令の反復の認識をすることをさらに含む、請求項１に記載の方法。
【請求項５】
命令の反復が算術的累算を行う、請求項４に記載の方法。
【請求項６】
命令の反復が算術積を求める、請求項４に記載の方法。
【請求項７】
オペランドおよび反復操作の結果の両方を表す値を記憶することができるレジスタ；
レジスタからのオペランドを受け取るように接続する第一の入力および反復操作の識別値のソースに接続する第二の入力、および出力を有するマルチプレクサ；および
マルチプレクサの出力からの値の受け取るように接続する入力、および結果をレジスタへ返すように接続する出力を有するオペレータ回路、
を含む、計算回路。
【請求項８】
反復操作を検出するように構成および配設されたコントロール回路をさらに含む、請求項７に記載の回路。
【請求項９】
オペレータ回路が加算器を含む、請求項８に記載の回路。
【請求項１０】
オペレータ回路が乗算器を含む、請求項８に記載の回路。
【請求項１１】
コントロール回路が、
パイプライン中の命令のインスタンスのｐ個のストリームをインターリーブし、すべてのプログラムされた反復が完了した後にｐ個のストリームから得られた結果を結合するように、構成および配設されたシーケンサ、
をさらに含む、請求項８に記載の回路。
【請求項１２】
検出が、同一のオペランドおよびあて先を有する反復される命令に基づいて命令の反復の認識をすること、をさらに含む、請求項１１に記載の回路。
【請求項１３】
命令の反復が算術的累算を行う、請求項１２に記載の回路。
【請求項１４】
命令の反復が算術積を求める、請求項１２に記載の回路。
【請求項１５】
パイプライン化された演算実行ユニットにおいて命令ストリームを実行する方法であって：
ソフトウェアスケジューリングなしで、演算実行ユニットに命令ストリームを自然な順番の命令列として提供すること；
命令列中の命令の反復を検出すること；
それぞれ異なった値を用いる、反復される命令の複数のインスタンスをパイプライン化された演算実行ユニットのパイプラインに導入すること；および
パイプライン中の複数のインスタンスの結果をそれぞれ保存すること、
を含む、前記方法。
【請求項１６】
検出がさらに、同一のオペランドおよびあて先を有する反復される命令に基づいて命令の反復の認識をすること、を含む、請求項１５に記載の方法。
【請求項１７】
命令の検出された反復のためのインターロックを無効化することを含む、請求項１６に記載の方法。
【請求項１８】
命令の反復が算術的累算を行う、請求項１６に記載の方法。
【請求項１９】
命令の反復が算術積を求める、請求項１６に記載の方法。
【請求項２０】
パイプライン化された演算実行ユニットにおいて命令ストリームを実行する方法であって：
命令ストリーム中の命令の反復を検出すること；
該反復される命令の複数のストリームを、演算実行ユニットの外部に中間結果を保存することなく、独立に実行すること；および、
一つの結果を得るために、独立して実行された複数のストリームを再結合すること、を含み；
ここで、独立して実行することおよび再結合は、一つのみのあて先レジスタと一つのみのテンポラリレジスタを使用する、
前記方法。
【請求項２１】
最初のフェーズの間、値が命令の識別値であるオペランドを導入することを含む、請求項２０に記載の方法。
【請求項２２】
命令のインターロックを含み、深さｐのパイプラインを有するパイプライン化された計算ユニットを含む、プログラム可能なデータプロセッサにおける回路であって：
入力された命令ストリーム中の反復計算を検出するように構成および配設されたコントローラを含む、前記回路。
【請求項２３】
コントローラが、オペランドのソースとしての指定と結果の記録のためのあて先としての指定との両方の指定をされた単一のレジスタを有する命令を検出するように構成および配設された回路をさらに含む、請求項２２に記載の回路。
【請求項２４】
コントローラが、命令の一つが、オペランドのソースとしての指定と結果の記録のためのあて先としての指定との両方の指定をされた単一のレジスタを失った場合、および異なったあて先レジスタを有する命令が発生した場合に、反復の中断を検出するように構成および配設された回路をさらに含む、請求項２３に記載の回路。
【請求項２５】
コントローラが、リードアフターライトおよびライトアフターリードのインターロックを無効にする回路をさらに含む、請求項２４に記載の回路。
【請求項２６】
コントローラが、パイプライン中の重複するｐ個までの反復のストリームをインターリーブするように構成および配設されている、請求項２２に記載の回路。
【請求項２７】
コントローラが、ｐ個のストリームからのｐ個の中間結果を最終的な結果に結合するように構成および配設された回路をさらに含む、請求項２６に記載の回路。
【請求項２８】
回路が、他の計算には用いられないレジスタＴをさらに含み；
コントローラが、中断の後に結果をレジスタＴにリダイレクトするように構成および配設される、
請求項２７に記載の回路。
【請求項２９】
コントローラが、反復が完了した後にインターロックを再配置するように構成および配設された回路をさらに含む、請求項２５に記載の回路。
【請求項３０】
パイプライン化された演算実行ユニットにおいて実行するためのソフトウェアの命令の列を準備する方法であって：
列中の反復される命令を検出すること；および、
互いに依存することなく独立した複数のストリームを形成するために、反復される命令のインスタンスを配列すること、を含み、
ここで、それぞれの複数の独立したストリームからの結果は、反復命令の全ての反復が完了するまで、パイプラインの外部のレジスタに保存されることはない、
前記方法。
【請求項３１】
検出が、同一のオペランドおよびあて先を有する反復される命令に基づいて命令の反復の認識をすること、をさらに含む、請求項３０に記載の方法。
【請求項３２】
命令の反復が算術的累算を行う、請求項３１に記載の方法。
【請求項３３】
命令の反復が算術積を求める、請求項３１に記載の方法。
【請求項３４】
ソフトウェア命令の列に、それぞれの複数の独立したストリームからの結果を一つのあて先レジスタに結合するクリーンアップの列を挿入することをさらに含む、請求項３０に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
背景
本願は、デジタルシグナルプロセッサ（ＤＳＰｓ）および一般目的のプロセッサを含む、パイプラインデータプロセッサに関する。より詳細には、本願は、演算実行ユニットがパイプライン化されたプロセッサに関する。
【０００２】
パイプライン処理は、プロセッサに並列して複数の処理を行えるようにすることで全スループットを増加させるプロセッサのアーキテクチャ技術である。パイプライン処理は各命令ストリームの実行をステップまたはステージのシリーズに分割する。各ステージの出力は次のステージの入力となる。ストリーム中の隣接した命令の異なったステージが並列処理されるので、動作の頻度は増加し、したがって、スループットも増加する。
【０００３】
理想的なスループットの増加のためにプロセッサ内の全ての機能ユニットが種々の深さにパイプライン処理され得るが、この文書でさらに「パイプライン」と言った場合には、演算実行ユニット内に演算処理のために存在するパイプラインのみを意味する。
【０００４】
それぞれの命令を多数のステージに分割し、したがって、多くの命令について順番に演算を開始する深いパイプライン化は、並列性を増加させ、それゆえスループットを増加させる。しかし、深いパイプライン処理はコストがかかる。深いパイプライン化のコストの一つは、命令列が制御の変更を必要とする場合である。制御の変更は、パイプラインに入れられ部分的に実行され得る全ての命令が消去されることを要求し、パイプラインによって得られる効率を喪失させる。例えば、１０段の深さのパイプラインを使用すると、いずれかの時点で１０個の命令がパイプライン内に存在する。したがって、制御の変更が発生すると、これら１０個の命令それぞれに対して要求された制御の変更のときまでになされた作業は失われる。
【０００５】
第二の命令が第一の命令のオペランドに依存する場合は、以下の通り実行パイプラインをストールさせる依存状態が存在する。第二の命令がパイプラインに入る前に、第一の命令は実行を完了しなければならない。第一の命令が完了したときに、第二の命令は要求されるオペランドにアクセスして、パイプラインに実行されることができる。ストールの影響の大きさはパイプラインの深さに依存する。
【０００６】
デジタルシグナル処理に共通の、特徴的なこのような深いパイプライン処理のコストの例は反復操作をするときに現れる。反復操作は命令のオペランドのロケーションが命令の結果のあて先でもあることを要求するものである。反復は反復操作の実行によるものである。デジタルシグナル処理は和の蓄積などの反復操作を頻繁に含む。反復操作を指定する命令の繰り返しの実行は、上述の第一の命令と第二の命令の関係と類似の状態を形成する。この状態では、繰り返される命令の第一のインスタンスは上述の第一の命令の役割であり、繰り返される命令の第二のインスタンスは上述の第二の命令の役割である。したがって、反復操作は多数で長期にわたり得るパイプラインのストールを引き起こす。
【０００７】
この問題は長年当業者に知られている。これを解決する数多くの試みが成されたが、それぞれ不利益を伴っている。
【０００８】
提案された一つの解決策は、以下のようなソフトウェアのスケジューリングである。ソフトウェアスケジューリングを使用することで、ソフトウェアは反復操作の第一のインスタンスを独立に開始するように設計され、同じ反復操作の第二のインスタンスが独立したデータを用いてこれ続く。そして、すでにパイプライン中にはないオペランドデータとしてそれぞれ使用することで、二つのインスタンスが独立に進行する。反復操作の最後のインスタンスが独立した計算ストリームを再結合するコストを負担する。特定の深さを持つ特定のパイプラインの最適な使用のために、独立に開始されるインスタンスの数は該特定の深さと同じである必要がある。
【０００９】
ソフトウェアスケジューリングは不利であるが、その理由は、オペランドとして全ての独立したインスタンスに要求されるものが、レジスタファイルにあることが要求され、もしくは必要なときに用いられるため、ソフトウェアスケジューリングを用いない反復法に比べてより多くのシステムリソースを必要とするからである。ソフトウェアスケジューリングを使用しない場合は、レジスタは二つだけ要求される。累算レジスタと新しいオペランドを記憶するレジスタである。ソフトウェアスケジューリングを使用すると、累算レジスタは反復操作のそれぞれのインスタンスに要求される。
【００１０】
このような方法で特定のプロセッサのために設計されたソフトウェアは、該特定のプロセッサで使用されるのと同一のまたは互換性のある命令の上位集合を使用し、ソフトウェアスケジューリングでなければ該特定のソフトウェアと互換性があるが、パイプラインの深さは違うような、将来のより高速である他種のプロセッサと互換性が無いことが、ソフトウェアスケジューリングの他の問題点である。プロセッサベンダーがパイプラインの深さを増加させて既存のプロセッサのより高速であるバージョンを開発し製造することは一般的である。
【００１１】
従来の演算実行ユニットの発行ステージ（issue stage）を図５のフローチャートに関連して説明する。発行ステージは命令のパイプラインへの発行を制御するステージである。
【００１２】
以下に記載するように、インターロックされたパイルサインプロセッサの発行ステージは、独立の命令によってパイプラインがストールしたのかどうかの決定を下すステップ５０１から始まる一連のステップを実行する。演算実行ユニットがストールしていない場合には次の命令をフェッチする５０２。そうではなく、演算実行ユニットがストールしている場合５０１には現行命令が保持される５０３。次いで、いずれの場合でも、発行される命令の依存状態が評価される５０４。
【００１３】
命令中の一つまたは二つ以上のオペランドが従前の命令の結果に依存している場合は、データの依存状態が存在する。現行の命令が依存状態にないと分かった場合５０５は、現行命令が発行される５０６。そして、発行ステージのサイクルが完了する。しかし、命令が依存状態にあると分かった場合５０５、演算実行ユニットはストールされ５０７、発行ステージのサイクルは完了する。ストールしているか否かという演算実行ユニットの状態は、例えばフラグレジスタにフラグビットを設定するなどにより、適切なあらゆる手段で記憶することが出来る。
【００１４】
非インターロックパイプラインを導入するプロセッサの場合、発行ステージは上述のいかなる依存状態のチェックも行わない。それは、単に順番に各命令を演算実行ユニットのパイプラインに発行する。命令が必要とするときに全ての与えられた命令のためのオペランドが準備できていることを保証するために、全ての相互依存の命令対が適切な数のＮＯＰ命令（no-operation命令）などの関連性のない命令に分割される、という方法で、そのようなプロセッサのためのソフトウェアは通常記述される。通常、コンパイラプログラムがこのようなプロセッサのための命令を生成する。
【００１５】
図６に示すように、複数のステージを有する実行パイプラインの一つのステージによって入力される従来の演算実行ユニットは、単純に加算器６０１などのオペレータユニット、レジスタファイル６０２およびコントローラ６０３を含む。コントローラ６０３は、図５のフローチャートのように、演算実行ユニットの操作を上述のパイプラインに従って、誘導する。
【００１６】
発明の概要
本発明の一態様の側面においては、深さｐのパイプライン化された演算実行ユニットにおいて命令ストリームを実行する方法は：命令ストリームをロードすること；ロードされた命令ストリーム中の命令の反復を検出すること；パイプラインが中間ストレージをインスタンスのｐ個のストリームに提供するように、パイプライン中の命令のｐ個のストリームをインターリーブすること；反復の終了を検出すること；および、すべてのプログラムされた反復が完了した後に、ｐ個のストリームから得られた結果を結合すること、を含む。
【００１７】
パイプライン化された演算実行ユニットの深さは何段の深さであってもよい。前記方法はさらに、命令の検出された反復のためのインターロックを無効化することを含んでもよい。該方法の様々なバリエーションにおいて、検出はさらに、同一のオペランドおよびあて先を有する反復される命令に基づいて命令の反復の認識をすることを含んでもよい。命令の反復は、例えば算術的累算または算術乗算を行ってもよい。
【００１８】
本発明の態様の他の側面に従って、計算回路は：オペランドおよび反復演算の結果の両方を表す値を記憶することができるレジスタ；レジスタからのオペランドを受け取るように接続する第一の入力および反復操作の識別値のソースに接続する第二の入力、および出力を有するマルチプレクサ；および、マルチプレクサの出力からの値を受け取るように接続する入力、および結果をレジスタへ返すように接続する出力を有するオペレータ回路、を含む。前記回路はさらに、反復操作を検出するように構成および配設されたコントロール回路を含んでもよい。
【００１９】
オペレータ回路は、例えば、加算器または乗算器を含んでもよい。コントロール回路はさらに：パイプライン中の命令のインスタンスのｐ個のストリームをインターリーブし、すべてのプログラムされた反復が完了した後にｐ個のストリームから得られた結果を結合するように構成および配設されたシーケンサ、を含んでもよい。該回路はさらに：同一のオペランドおよびあて先を有する反復される命令に基づいて命令の反復の認識をすること、を含む検出のために構成および配置されてもよい。該回路はさらに、命令の反復が例えば算術的累算または算術積を実行するように構成されてもよい。
【００２０】
本発明の一態様のさらに他の側面においては、パイプライン化された演算実行ユニットにおいて命令ストリームを実行する方法は：ソフトウェアスケジューリングなしで、演算実行ユニットに命令ストリームを自然な順番の命令の列として提供すること；命令列中の命令の反復を検出すること；それぞれ異なった値を用いる、反復される命令の複数のインスタンスをパイプライン化された演算実行ユニットのパイプラインに導入すること；および、パイプラインに中の複数のインスタンスの結果をそれぞれ保存すること、を含む。検出はさらに；同一のオペランドおよびあて先を有する反復される命令に基づいて命令の反復の認識をすること、を含んでもよい。前記方法はさらに、命令の検出された反復のためのインターロックを無効化することを含んでもよい。命令の反復は、例えば算術的累算または算術積を実行してもよい。
【００２１】
本発明のさらにその他の態様に従って、パイプライン化された演算実行ユニットにおいて命令ストリームを実行する方法は：命令ストリーム中の命令の反復を検出すること；該反復される命令の複数のストリームを、演算実行ユニットの外部に中間結果を保存することなく、独立に実行すること；および、一つの結果を得るために独立に実行された複数のストリームを再結合すること、を含み；ここで、独立に実行することおよび再結合は一つのみのあて先レジスタと一つのみのテンポラリレジスタを使用する。該方法はさらに、最初のフェーズの間、値が命令の識別値であるオペランドを導入することを含んでもよい。
【００２２】
命令のインターロックを含み、深さｐのパイプラインを有するパイプライン化された計算ユニットを含む、プログラム可能なデータプロセッサにおいて、本発明の側面は、入力された命令ストリーム中の反復計算を検出するように構成および配設されたコントローラを含む回路に具体化されてもよい。該コントローラはさらに、オペランドのソースとしての指定と結果の記録のためのあて先としての指定との両方の指定をされた単一のレジスタを有する命令を検出するように構成および配設された回路を含んでもよい。
【００２３】
前記コントローラはさらに、命令の一つが、オペランドのソースとして指定と結果の記録のためのあて先として指定との両方の指定をされた単一のレジスタを失った場合、または異なったあて先レジスタを有する命令が発生した場合に、反復の中断を検出するように構成および配設された回路を含んでもよい。前記コントローラはさらに、リードアフターライトおよびライトアフターリードのインターロックを無効にする回路を含んでもよい。いくつかのバリエーションに従って、該コントローラは、パイプライン中の重複するｐ個までの反復のストリームをインターリーブするように構成および配設される。
【００２４】
前記コントローラはさらに、ｐ個のストリームからのｐ個の中間結果を最終的な結果に結合するように構成および配設された回路を含んでもよい。該回路はさらに、他の計算には用いられないレジスタＴを含んでもよい；コントローラはさらに、中断の後に結果をレジスタＴにリダイレクトするように構成および配設される。最後に、コントローラはさらに、反復が完了した後にインターロックを再配置するように構成および配設された回路を含んでもよい。
【００２５】
本発明の一態様のさらに他の側面においては、パイプライン化された演算実行ユニットにおいて実行するためにソフトウェアの命令の列を準備する方法は：列中の反復される命令を検出すること；および、互いに依存することなく独立した複数のストリームを形成するために反復される命令のインスタンスを配列すること、を含み、ここで、複数の独立したストリームのそれぞれからの結果は、反復命令の全ての反復が完了するまで、パイプラインの外部のレジスタに保存されることはない。
【００２６】
非インターロックパイプラインを導入したプロセッサの場合は、演算実行ユニットは修正されない。しかしながら、累算操作のための命令ストリームは、極めて少ないサイクル数で同じ結果を生成するように、適切な方法で修正される。
【００２７】
詳細な説明
図面と共に以下の種々の側面についての態様の説明を読むことで本発明がより良く理解されるであろう。
【００２８】
本発明の側面は方法または装置として具体化することができる。本発明の側面はパイプライン化された演算実行ユニットを有するプロセッサとして具体化することもできる。パイプライン化された演算実行ユニット及び具体化された本発明の側面を有するプロセッサは、インターロックであっても良いし、そうでなくても良い。本発明の側面を、パイプライン化されたプロセッサにおいて具体化することによって、演算速度の高速化を、実行されるサイクルの総数の観点において、反復演算に対して可能とする。前記実行されるサイクルの総数は、本明細書においては累算と称する。累算とは、一回または二回以上繰り返される累算の命令を含むものである。
【００２９】
累算命令は、少なくとも一つのオペランドレジスタが命令のあて先レジスタと同一であるような命令であり、次の式で表される：Ｒｘ←Ｒｘ（）Ｒｙ；ここで、（）は演算を示し、←はあて先への結果値の割り当てを示す。これのみではないが、典型的には、累算命令には加算及び乗算命令が含まれる。しかしながら、他の命令も累算となることが出来る：例えば、計算ハッシュ値である場合には論理「ＯＲ」命令は累算命令となることが出来る。
【００３０】
本発明の側面を具体化する方法は、独自の方法で、累算命令を検出してそれらを演算実行ユニットパイプラインに入れる。特に、以下に詳細に説明するように、本発明の側面を具体化している方法は深さｐのパイプラインのために、それぞれに分離した累算器を割り当てることなく、該パイプライン中で累算命令のインスタンスのｐ個のストリームをインターリーブする。そして、累算の終了が検出されると、所望の結果を生成するためにｐ個のストリームは結合され、これは指定されたあて先レジスタに割り当てられる。
【００３１】
以下にさらに説明するように、例えば、修正されたインターロック回路、そのような回路の演算上の特徴の少なくともいくつかをまねるような回路、ソフトウェアコンパイラ中の適切なソフトウェアロジックのいずれかによって、累算命令は検出される。命令が要求するデータが従前の命令から未だ取得できない間、該命令がスタートするのを妨げるためにインターロックを採用するプロセッサにおいては、上述の命令のインターリーブされたストリームに関連してインターロックは解除される。しかしながら、ここでブレイクインアキュムレーション（break in accumulation）と呼ぶ累算命令の最終インスタンスに続く命令のスタートに関連して、インターロックは有効であり続けてもよい。
【００３２】
本発明の側面を具体化している装置は、従来のパイプラインプロセッサとは異なった方法でいくつかの演算を実行する制御ロジックの修正と、演算実行ユニットに追加されたいくつかの要素によって従来のパイプラインプロセッサと異なる。特に、発行ステージロジックが以下で議論されるところ、該発行ステージは、演算実行ユニットで演算を実行するために、いつおよび命令のストリームのどの列をパイプラインに発行するかを決定するロジックである。
【００３３】
図１に示すように、演算実行ユニット１００はフィードバック配列で接続されたレジスタファイル１０１及びオペレータユニット１０２を含む。オペレータユニット１０２は、累算において使用しうる加算器、乗算器、またはその他の算術または論理演算回路であってもよい。説明のため、オペレータユニットは二つのオペランド入力１０３、１０４を有すると仮定する。処理されているソフトウェアの命令に従って、オペランドはレジスタファイル１０１のレジスタからフェッチされ、結果はレジスタファイル１０１のあて先レジスタに返される。
【００３４】
本発明の側面に従って、従来の演算実行ユニットには使用されないマルチプレクサ１０５、１０６がオペレータユニット１０２の両入力にそれぞれ備えられ、パイプラインにおいて、インターリーブされたストリームが開始されたときに、例えばオペレータユニット１０２が加算を実行するときには「０」であるような、代替入力値（alternate input value）１０７の導入を可能にする。また、オペレータユニット１０２の出力１１０からオペランド及びあて先レジスタが位置するレジスタファイル１０１への従来のフィードバックパス１０９のみならず、ストリームの結合中の代替フィードバックパス（alternate feedback path）１０８が備えられる。オペレータユニット１０２の出力１１０とマルチプレクサ１０５の一つの入力との間の代替フィードバックパス１０８内には、一つのテンポラリレジスタＴが備えられる。レジスタＴはインターリーブされたストリームを結合するときにのみ使用される。
【００３５】
コントローラ１１１には、累算検出回路が備えられ、累算の開始と終了を検出する。プロセッサがインターロックされる場合は、該コントローラはインターロック回路を含む。その場合、累算検出回路はインターロックされたプロセッサのインターロック回路に対する修正であってもよい。その代わりに、インターロックされたプロセッサまたはインターロックされていないプロセッサにおいては、累算検出回路は検出を行うために特に備えられた独立の回路であってもよい。また、インターロックされたプロセッサにおいては、回路はインターリーブされたストリームの処理およびクリーンアップフェーズ中の再結合を制御するために備えられる。この処理の完了を要求するステップは、処理されている命令ストリームに明示的に備えられるわけではないからである。インターロックされていないプロセッサにおいては、命令はコンパイラによって整理され、例えばインターリーブやクリーンアップを達成する。
【００３６】
本発明の側面の原理に従った方法や装置の操作を、図２及び図３のパイプラインダイアグラムに関連して説明する。
【００３７】
図２および図３に示した例示のパイプラインは４ステージの深さ、すなわちＰ＝４であり、演算実行ステージｅｘ０、ｅｘ１、ｅｘ２、およびｅｘ３を有する。パイプラインの深さは説明のために示すのみである。例示の原理は、二段またはそれ以上のステージのパイプラインおよび任意の深さのパイプラインを含むあらゆる深さのパイプラインに適用できる。例示のパイプラインは加算命令を用いる累算を説明するが、他の命令にも容易に適用できる。
【００３８】
以下に説明するように、この例においては、それぞれのインターリーブされた命令ストリームのスタートにオペランドを提供するために「０」のソースが要求される。インターロックされた機構では、インターリーブを生成しクリーンアップを行う特別な命令がインターロックの遮断または回避を要求する。処理がクリーンアップ中に完了できるように、コントローラはパイプラインの深さや現在のインターリーブの数といったパラメータのトラックを保持する必要がある。
【００３９】
図示の例では、Ｒ０←Ｒ０＋ＲＭの式で表され、ここでＲＭは初期値ｘ０から始まってｘＮの値が連続的にロードされるような命令、すなわち累算命令がパイプラインへの入力のためにフェッチされるのを、コントロールロジックが検出する。ＲＭのロードは演算処理と並行して発生する。例はさらに、何回ものそのような、すなわち、Ｎ＝１〜ｎ、ｎ＞４のような命令が実行されると仮定する。通常は、ｎはいかなる反復の回数であってもよいが、本発明による利益はｎ＞ｐの場合に生じ、好ましくはｎ＞＞ｐである。
【００４０】
図２に示すとおり、命令の最初のインスタンス、すなわちＲ０←Ｒ０＋ｘ０は通常扱われるように扱われる。Ｒ０のイニシャルコンテンツを供給する従前の命令に依存状態が存在する場合は、通常の方法では、Ｒ０←Ｒ０＋ｘ０の命令はストールする。従前の命令が完了すると、Ｒ０←Ｒ０＋ｘ０の命令はパイプラインに入れられる。Ｒ０およびｘ０の値は、サイクル０の演算実行ステージｅｘ０のためにフェッチされる。その後、最初の命令が完了するのを待つことなく、コントロールロジックはその他のｐ−１個の命令、すなわちこの例においてはサイクル１、２、３中の３個の命令を開始する。その際、累算（加算）の識別要素（図１符号１０７）が実行されてＲ０の参照を「０」と置き換える。累算が乗算命令を基にしている場合には、Ｒ０の参照を置き換える識別要素は、乗算の識別要素（図１符号１０７）であり、１である。
【００４１】
分離したストリームの開始からこれら最初の４つの命令はそれぞれストリーム１、２、３、４を指定する。サイクル１では、０＋ｘ１の処理が演算実行ステージｅｘ０で開始される一方で、Ｒ０＋ｘ０の処理が演算実行ステージｅｘ１に到達する。引き続いて、サイクル２では、Ｒ０＋ｘ０の処理が演算実行ステージｅｘ２に到達し、０＋ｘ１の処理が演算実行ステージｅｘ１に到達する一方で、０＋ｘ２の項目が開始される。サイクル３では、Ｒ０＋ｘ０が演算実行ステージｅｘ３でＲ０に割り当てられ、ストリーム１の一つ目の計算が完了する。ストリーム１はサイクル４でレジュームされ、オペランドｘ４を取得しＲ０の値（すなわちＲ０＋ｘ０）にその値を加える。Ｒ０の値は、それぞれの計算の完了により、順番に４つのストリームの間で交代する。
【００４２】
それぞれのストリームは他のストリームから独立して進行し、そのストリームが直前に処理をしたオペランドから４番目のオペランドを取得する。したがって、例えば、ストリーム１は、Ｒ０＋ｘ０＋ｘ４＋ｘ８＋・・・、の値を累算する。処理されている間、異なるストリームの中間値はパイプライン中に保存されるので、これらを保存するための追加のレジスタは必要ではない。パイプラインそれ自身が、処理中の命令の中間値を保存するレジスタを含む。
【００４３】
ブレイクインアキュムレーションは、命令ストリーム中の次の命令がその命令Ｒ０←Ｒ０＋ＲＭの他のインスタンスでないときに発生する。ブレイクインアキュムレーションが検出されると、図３に示すようにクリーンアップフェーズが入力される。
【００４４】
まず、コントローラはシーケンサのフェッチングおよびパイプラインへの命令の導入をストールする。そして、コントローラは、４つのストリームを再結合し、結果を本来指定された指定レジスタに保存するように指定された、クリーンアップ命令の特別な列を発行する。異なる数のストリームがインターリーブされた場合には異なるクリーンアップ命令の特別な列が要求される。
図示の深さｐが４である命令を有するパイプラインのための列は以下の通りである。
【００４５】
ブレイクインアキュムレーションが検出されたとき、サイクル１において最後の累算の計算がパイプラインで開始され、最後のストリームから４番目の完了したストリームはテンポラリレジスタＴに割り当てられる。最後のストリームから３番目はサイクル２において完了できる。そして、サイクル３において、レジスタＲ０は最後のストリームから３番目と４番目とを結合するのに使用される。一方、サイクル３では、最後のストリームから２番目の結果がレジスタＴに割り当てられる。最後に、サイクル４で、最後のストリームがレジスタＲ０内に入って完了する。
【００４６】
サイクル５では、最後から２番目と最後のストリームを結合してレジスタＴに入れることが開始され、サイクル６では、最後のストリームから３番目と４番目との結合が完了する。サイクル８では最後から２番目と最後のストリームとの結合が完了し、サイクル９では残された二つの部分的な累算の結合が開始され、Ｒ０に入れられる。サイクル１０において、次の命令がパイプラインに入力できる。
【００４７】
本発明の態様の側面を備える一つの方法を図４を参照して説明する。例示の方法に関連して操作のモードをより簡潔に説明するために、図４に記載のステップを４つのグループ、４１、４２、４３、および４４にグループ分けする。例示の方法によれば、操作の３つのモードが存在する：通常（グループ４１からグループ４３に続く）、累算（グループ４１からグループ４４に続く）、クリーンアップ（グループ４２からグループ４３に続く）である。
【００４８】
該方法は、累算命令が検出されないときは常に通常モードを使用する。累算命令が検出されるまでの間、通常モード（４１、４３）は従来技術に類似している。通常モード（４１、４３）は、命令の発行、命令間および命令内の依存状態の評価、命令の発効をいつストールするかの決定、および累算フェーズ（４１、４４）またはクリーンアップフェーズ（４２、４３）にいつ入るかの決定を含む。これは以下のようになされる。
【００４９】
まず、命令の発行がストールしているか否かの決定がなされる（ステップ４０４）。命令の発行がストールしていない場合（ステップ４０４）は、命令の実行がクリーンアップフェーズに入っているかどうかの決定がなされる（ステップ４０５）。システムがクリーンアップフェーズにない場合（ステップ４０５）は、次の命令がフェッチされる（ステップ４０６）。命令の実行がストールしている場合（ステップ４０４）、システムは単に現行命令を維持し（ステップ４０７）、次の命令のフェッチへ進むことはない。次の命令がフェッチされる（ステップ４０６）場合および現行命令を維持する（ステップ４０７）場合のいずれの場合であっても、依存状態の評価（ステップ４０８）へと進む。
【００５０】
インターロックされた機構では、データの依存状態はハードウェア内でチェックされる。一つの一般的な方法は、レジスタスコアボードを用いることである。演算実行ユニットに命令が発行されると、レジスタスコアボードとして参照される特殊目的レジスタまたはメモリ内に、あて先レジスタのために使用ビット（in-use bit）がセットされる。使用ビットは、命令の実行が完了し、結果があて先レジスタに書き込まれたときにクリアされる。したがって、レジスタスコアボード内の命令のオペランドのための使用ビットをチェックすることで、発行されるそれぞれの命令のために、依存状態をチェックできる。セットされた使用ビットを有するオペランドがある場合は、命令は依存している。
【００５１】
使用ビットは命令が演算実行ユニットに発行されたときにセットされるので、この依存状態のチェック（ステップ４０８）は自己参照命令、すなわち反復操作や累算はチェックしない。後に見るようにこれは後のステージで行われる。依存状態が検出されて（ステップ４０９）かつ累算フェーズには入っていない場合（ステップ４１０）には、命令の発行はストールされる（ステップ４１１）。命令の発行がストールしていることを識別するビット（ステップ４１１）は、後で演算実行ユニットがステップを戻って（ステップ４０４）これらのステップを再び行う場合にチェックするために保存される。状態の情報は、例えばフラグレジスタ内のビットの状態によって保存するなど、あらゆる適切な方法で保存しうる。
【００５２】
依存状態の評価（ステップ４０８）に戻って、依存状態が見つからず（ステップ４０９）かつ累算フェーズがアクティブでない（ステップ４１２）場合は、自己参照依存がチェックされ、発行される命令が累算命令であるかどうかを決定（ステップ４１３）する。このチェックは単に、命令のあて先レジスタが該命令のオペランドとしても使用されているかどうかを決定する。命令が累算命令ではないと決定された場合は、該命令が発行され（ステップ４１４）、発行ステージはそのサイクルを完了する。
【００５３】
一方、命令が累算命令であると決定された場合（ステップ４１３）は、累算（４１、４４）フェーズに入り、累算レジスタは例えばレジスタスコアボードなどの適切な方法を使用して記録され、カウンタacc-instr-cntは０にセットされ、命令が発行される（ステップ４１５）。カウンタacc-instr-cntは、累算フェーズの早期においていつ識別要素を導入するかを決定するために、所定の値の減算演算実行ユニットコントローラに使用される。この時点で、発行ステージはその通常モード（４１、４３）のサイクルを完了する。
【００５４】
累算フェーズ（４１、４４）に入った場合、発行ステージの後半部分の操作は上記の操作と異なる（グループ４３の代わりにグループ４４を用いる）。しかし、操作の前半部分（グループ４１）は上記のとおり進行する。
【００５５】
依存状態の評価（ステップ４０８）が、発行される命令は依存命令であると決定（ステップ４０９）し、発行ステージは累算フェーズにある（ステップ４１０）場合、発行される命令が評価され、該命令が累算命令であるか否かが決定される（ステップ４１６）。発行される命令が実際に累算命令である（ステップ４１６）場合、累算レジスタスコアボードを参照することで、同一の累算を含むかどうかさらなる決定がなされる（ステップ４１７）。この場合、発行される命令は単に単一の累算を作る命令シリーズ内の次順のものであり、カウンタacc-instr-cntを増加させた上で、該命令は発行される（ステップ４１８）。
【００５６】
一方、発行される命令が累算命令でない（ステップ４１６）か、累算命令である（ステップ４１６）が先行の累算命令と同じ累算レジスタを含まない（ステップ４１７）かのいずれかである場合、現行の累算フェーズは終了し、クリーンアップフェーズに入る（ステップ４１９）。この状態の情報の指定および記録は、例えばフラグレジスタ内にフラグビットをセットするなどの、あらゆる適切な手段によってなされ得る。このとき、カウンタcleanup-instr-cntはゼロにセットされ、カウンタcleanup-instr-compl-cntも同様にセットされる（ステップ４１９）。
【００５７】
カウンタcleanup-instr-compl-cntは、ここに記載されるコントロールロジックとは異なるロジックによってインクリメントされる。それはクリーンアップ中に完了した命令のトラックを保持し、それゆえ、データパスコントロールロジックは上述のようにいくつかの結果をレジスタＴに指定することができる。カウンタcleanup-instr-cntはクリーンアップフェーズの進行のトラックを保持し、それゆえ、特定のクリーンアップ命令が実行できる。累算フェーズから抜け出すトリガーとなる命令はホールドされ、ＮＯＰ命令が発行される。
【００５８】
最後に、依存状態の評価（ステップ４０８）において先行の命令に依存が見つからず（ステップ４０９）かつ発行ステージが累算フェーズにある（ステップ４１２）場合、現行の命令はブレイクインアキュムレーションである。なぜなら、累算命令、すなわち自己参照命令は常に各反復が先行の反復の結果に依存しているからである。したがって、コントロールは、上述のようにクリーンアップフェーズを開始する累算フェーズ終了ルーチン（ステップ４１９）に移る。これで、この発行ステージの累算（４１、４４）サイクルは完了する。
【００５９】
クリーンアップフェーズ（４２、４３）では、発行ステージの処理の前半部分は変更された４２であり、後半部分は通常モードの４３と同様に進行する。発行ステージがストールせず（ステップ４０４）かつクリーンアップフェーズに入っている（ステップ４０５）場合、カウンタcleanup-instr-cntがパイプラインの深さｐより小さいという状態が真であるかどうかのチェックがなされる（ステップ４２０）。該状態が真である場合、クリーンアップフェーズは未だ完了しておらず、発行ステージは累算フェーズ中に生成された独立した命令ストリームを結合する命令を実行させる（ステップ４２１）。
【００６０】
また、カウンタcleanup-instr-cntはインクリメントされる（ステップ４２１）。カウンタcleanup-instr-cntがｐの値にまでなったとき、前記状態は偽となりクリーンアップフェーズは終了する（ステップ４２２）。したがって、ホールドされた命令（ステップ４１９参照）が、ここでリリースされる。いずれの場合においても、発行ステージサイクルの実行は、発行される命令の依存状態の評価（ステップ４０８）へと続き、上述のとおり進行する。これにより発行ステージのクリーンアップ（４２、４３）サイクルは完了する。
【００６１】
本発明の側面の態様によって達成される改善は、演算実行ユニットに先行する機能ユニット内のパイプラインの実際の深さによらない。
【００６２】
本発明の説明を、インターロックされたプロセッサのハードウェア内における側面を具備する態様について記載することによって行った。ここでさらに、インターロックされていないプロセッサでのソフトウェア演算における側面を具備する態様について記載することによって本発明を説明する。上述のとおり、インターロックされたプロセッサをストールする依存状態を含むソフトウェアは、適切な数の処理サイクルによって、ＮＯＰ命令、すなわち命令ストリームの他の部分と関連のない命令を分離し独立した命令に導入することで非インターロックプロセッサでの演算用にコンパイルできて、最初の命令の結果が２番目の命令に要求される前に最初の命令が演算を完了することを可能にする。対照的に、本発明の側面の態様についての以下の記述は、実行されたときに図４の方法を行うソフトウェアを実現する。
【００６３】
この側面に従って、４ステージの演算実行ユニットパイプラインを限定されない例として使用しており、ソフトウェアコンパイラが累算命令のソースコードに出会ったとき、プロセッサによる演算のための命令ストリームの出力は、すでに図２に関連して上述した特別の列を有する。これは、当初において内部依存状態を含まない累算の複数のストリームを生成する。累算の最初の命令は通常通り出力される（図２、サイクル０）。２番目から４番目のものは識別要素によって置き換えられたオペランドを有する。例えば、和算には「０」である（図２、サイクル１〜３）。
【００６４】
コンパイラによって出力された命令は、ブレイクインアキュムレーションが検出されるまでの間、インターリーブされた累算のストリームを完了するために通常要求されるものである。図３に関連して上述したとおり、ブレイクインアキュムレーションが検出されたときコンパイラはクリーンアップ命令を出力する。クリーンアップ命令は、上述のレジスタＴに類似の、特別に与えられたテンポラリレジスタを使用してもよい。代わりに、コンパイラはコンテクストスイッチを備えて、演算実行ユニットのレジスタファイル内のレジスタの制限を解除し、それによってテンポラリレジスタとして使用できるようにしてもよい。その後、ストリームを結合する命令が出力される。
【００６５】
上記の議論を換言すると、非インターロックであるが完全にパイプライン化されたプロセッサにおいて、コンパイラは、命令を生成する間、命令の待ち時間のトラックを保持することとなる。これは、依存関係にある命令対の間に関連のない命令が適切な数存在することを保証し、そのため、与えられた命令によって要求される全てのオペランドは命令が演算実行ユニットに発行される前に取得可能となる。
【００６６】
したがって、Ｎ個の値をアレイ内で累算する例は、通常次のように記載できる：
【化１】
2006506735.tif 000003
【００６７】
この例では、ＮＯＰ命令は命令ストリーム内で要求される関連のない命令であり、何回かの反復により計算されるＲ０は、次の反復の同じ命令において使用するために準備できている。
【００６８】
ロードの操作は複数のサイクルを持つことができるものの、その問題を回避するために、ロードがパイプラインにおける加算よりも早期に起こるようにパイプラインを再構成することで他の適切な技術を使用することができ、したがって、実質的にロードと使用によるサイクルのストールを取り除く。
【００６９】
上記のコードはコンパイラによって再構成することができ、これによって図２および図３と同様のパイプラインが形成される。そのようなコードの例は以下の通りである：
【化２】
2006506735.tif 000004
【００７０】
従来のコードが４Ｎ＋４サイクル要するのに対し、新しいコードはＮ＋１２サイクルである。本発明の側面の一態様である上記のコードは、ハードウェアの変更を何ら必要としない。レジスタＴはあらゆる利用可能なデータレジスタとすることができる。当業者が理解するように、付随の適切なハードウェアの変更と共に、ループになっている命令に引き続く４つの命令（記載せず）をループに組み込むことでコードサイズを小さくすることができる。
【００７１】
本発明の少なくとも一つの態様のいくつかの側面を説明したので、様々な代替、変更、改良が当業者にとって容易に起こることが理解されよう。そのような代替、変更、改良は本開示の部分であることが意図されており、そして本発明の精神および範囲に包含されるものとして意図されている。したがって、上記の説明および添付の図面は、例示を目的とするにすぎないものである。
【図面の簡単な説明】
【００７２】
【図１】本発明の側面を具体化する演算実行ユニットのブロック図であり、該ユニットはパイプライン化されていると仮定している。
【図２】４ステージの演算パイプラインを有する演算実行ユニットによる、レジスタＲ０内の累算の実行のパイプライン図である。
【図３】図１に記載の累算のクリーンアップフェーズのパイプライン図である。
【図４Ａ】本発明の側面を具体化する方法のフローチャートである。
【図４Ｂ】本発明の側面を具体化する方法のフローチャートである。
【図５】演算実行ユニットの演算パイプラインに発明を発行するための従来の方法のフローチャートである。
【図６】従来の演算実行ユニットの例のブロック図である。
【図１】
2006506735.tif 000005
【図２】
2006506735.tif 000006
【図３】
2006506735.tif 000007
【図４Ａ】
2006506735.tif 000008
【図４Ｂ】
2006506735.tif 000009
【図５】
2006506735.tif 000010
【図６】
2006506735.tif 000011
【国際調査報告】
2006506735.tif 000012
2006506735.tif 000013