(57)【要約】【課題】プログラムを高速に実行する手法を提供する。【解決手段】ロード命令の追い越しの許可／不許可を示す追い越し許可フラグをもつストア命令、ロード命令の追い越しをブロックする命令を含む命令セットをもつＣＰＵと、そのフラグを設定する追い越し許可フラグ設定手段、その命令を生成する追い越しブロック命令生成手段をもつコンパイラと、追い越しをブロックする命令を命令リオーダバッファに登録する追い越しブロック命令登録手段、追い越し許可フラグの設定されたストア命令を参照しながら、メモリアクセス命令を命令リオーダバッファに登録する命令バイパス手段をもつ命令リオーダユニットを有する。【選択図】図５
2012216009.tif 000002
【特許請求の範囲】
【請求項１】
ロード命令の追い越しの許可又は不許可を示す追い越し許可フラグをもつストア命令と、ロード命令の追い越しをブロックする追い越しブロック命令と、を含む命令セットをもつプロセッサと、
前記追い越し許可フラグを設定する追い越し許可フラグ設定手段と、前記追い越しブロック命令を生成する追い越しブロック命令生成手段と、をもつコンパイラと、
前記追い越しブロック命令を命令リオーダバッファに登録する追い越しブロック命令登録手段と、前記追い越し許可フラグの設定されたストア命令を参照しながら、メモリアクセス命令を命令リオーダバッファに登録する命令バイパス手段と、をもつ命令リオーダユニットと、
を有するプログラム実行システム。
【請求項２】
前記命令リオーダユニットは、前記追い越し許可フラグがＯＮに設定されている第１の命令について、その後続の命令を、前記第１の命令と同時に又は追い越して処理されるよう、前記命令リオーダバッファに登録されることを特徴とする請求項１記載のプログラム実行システム。
【請求項３】
ロード命令の追い越しの許可又は不許可を示す追い越し許可フラグをもつストア命令と、ロード命令の追い越しをブロックする追い越しブロック命令と、を含む命令セットをもつプロセッサを備えるプログラム実行システムにおいて、プログラムを実行する方法であって、
コンパイラにおいて、前記追い越し許可フラグを設定する追い越し許可フラグ設定ステップと、
前記コンパイラにおいて、前記追い越しブロック命令を生成する追い越しブロック命令生成ステップと、
命令リオーダユニットが、前記追い越しブロック命令を命令リオーダバッファに登録する追い越しブロック命令登録ステップと、
前記命令リオーダユニットが、前記追い越し許可フラグの設定されたストア命令を参照しながら、メモリアクセス命令を命令リオーダバッファに登録する命令バイパスステップと、
を備える方法。
【請求項４】
前記命令リオーダユニットが、前記追い越し許可フラグがＯＮに設定されている第１の命令について、その後続の命令を、前記第１の命令と同時に又は追い越して処理されるよう、前記命令リオーダバッファに登録することを特徴とする請求項３記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、記憶装置にデータを書き込むないし記憶装置からデータを読み込む命令をもつＣＰＵを利用する技術分野において、プログラムを高速に実行する技術に関する。
【背景技術】
【０００２】
従来、命令レベルの並列性を高めてプログラムを高速実行するため、複数の命令パイプラインを実装したＣＰＵがある。
【０００３】
図１は、従来例における命令パイプラインの流れを示す図である。命令パイプライン１１は、基本的には、命令フェッチ１２、命令デコード１３、実行１４、リード／ライト１５の４つのステージで構成され、それらの各ステージはいくつか同時に処理できるようになっている。図１は二つの命令を同時処理可能な命令パイプラインの例である。メモリアクセス命令では、そのアドレス計算を実行ステージ１４、メモリの読み込み／書き込みをリード／ライトステージ１５で処理する。各ステージの前後には一時的な記憶域であるバッファが用意され、次のステージが処理可能になるまで、前ステージの結果がバッファ内で待たされる。
【０００４】
このような命令パイプラインを使って、メモリアクセス命令を同時に処理するとき、たとえばロード命令とストア命令でアクセスするメモリ領域が同じであるとき、それらの命令による読み込み／書き込みの順序関係が保たれなければ命令の正しい実行結果は得られない。このため、ロード命令、ストア命令のどちらか一方の命令は、リード／ライトステージ１５の直前のバッファで待たされることになる。一般的に、メモリアクセス命令は実行に時間を要するため、それらの命令の結果を必要とする命令も同じように各ステージの前後のバッファ内で待たされる。このようにして、命令パイプラインの流れが止まってしまうことをパイプラインハザードと呼ぶ。
【０００５】
パイプラインハザードを避けて、プログラムを高速化するための方法として、リード／ライトステージの前後において、メモリアクセス命令のメモリ・ディスアンビギュエションを行い、あるメモリ領域に対するロード、ストアの順序関係を保ちながら、ロード命令をできるだけ先行して開始する方法がある。
【０００６】
図２は、メモリアクセス命令のメモリ・ディスアンビギュエションを行い高速化するときの従来例を示す図である。同図の左上に示す６行の命令列は、命令パイプラインに入力される命令のアセンブライメージである。左端の列の数字２１は、入力される順番であり、次の列２２は、ロード、ストアのどちらであるかを示す。右列の中央部２３はロード、ストアを行う領域のアドレスを示し、右端の数字２４はロード、ストアするサイズを示す。アドレス計算ユニット２５は、実行ステージ１４に相当し、メモリアクセス命令のアクセスするメモリ領域のアドレスを計算する。命令デコードステージ１３の結果が入力される。命令リオーダユニット２６は、メモリ・ディスアンビギュエションを行いロード、ストア命令の実行順番を制御する。メモリアクセスユニット２８は、リード／ライトステージ１５に相当する。アドレス計算ユニット２５、メモリアクセスユニット２８は、二つの命令を同時に処理できるものとする。命令リオーダバッファ２９は、命令パイプラインのリード／ライトステージ１５の直前のバッファに相当する。
【０００７】
命令リオーダユニット２６は、アドレス計算ユニット２５から命令と計算されたアドレスを受け取ると命令リオーダバッファ２９の空きエントリに登録する。図２の右下の表の行の一つ一つがエントリである。エントリが空いていない場合は空くまで待つ。命令リオーダバッファの一つのエントリには、エントリの「番号」２１１、ロード、ストアの「種別」２１２、ロード、ストアする「サイズ」２１３、計算された「アドレス」２１４、先行させなければならない命令に対応する命令リオーダバッファのエントリの番号である「先行Ｎ」(Ｎは１から命令リオーダバッファのエントリ数−１までの整数、図２の場合は１，２，３，４又は５のいずれか)２１５を登録する。「先行させなければならない命令」とは、当該命令の実行開始前に、実行完了していなければならない命令のことである。ここで、「実行完了」とは命令パイプラインのリード／ライトステージ１５の完了を意味する。命令パイプラインの入力となっているアセンブライメージの、入力される順番２１が４のストア命令２１８は、順番が１及び３のロード命令が終わる前にアドレス値address1を更新してはならないため、それらの実行完了を待たなければならない。このため、順番４の命令に対応する命令リオーダバッファの番号５のエントリ２１０の「先行１」、「先行２」には、順番１のロード命令に対応するエントリの番号「１」、順番３のロード命令に対応するエントリの番号「３」が登録される。また、２−１の入力される順番が６のロード命令２１７は、順番が４のストア命令２１８の実行完了前に実行を開始してはならないため、入力される順番が６のロード命令２１７に対応する命令リオーダバッファの番号４のエントリ２１６の「先行１」に、番号「５」が登録される。
【０００８】
命令リオーダユニット２６は、すべての「先行Ｎ」に番号が設定されていない（命令リオーダバッファ２９では「−」と表記。）エントリに対応する命令をメモリアクセスユニット２８に渡す。メモリアクセスユニット２８は、命令の実行が完了すると、命令リオーダユニット２６に命令実行完了通知２７を送る。命令実行完了通知２７を受け取った命令リオーダユニット２６は、完了した命令に対応する命令リオーダバッファのエントリをクリアして「空きエントリ」にするとともに、他のエントリの「先行Ｎ」に登録されていた当該エントリの番号をクリア（「−」に設定。）する。こうして命令リオーダバッファ２９に空きができると、新たな命令を命令リオーダバッファに登録し、順次命令を実行している。
【０００９】
また、ＳＩＭＤ（Single Instruction Multi Data）命令、ベクトル命令のような一つの命令で複数のメモリ領域に対してデータをロード、ストアする命令がある。
【００１０】
図３は、一つの命令で四つのメモリ領域にロード、ストアできるベクトル命令をもつ場合の従来例を示す図である。ＤＯループ３１は、ベクトル収集、ベクトル拡散を行うＦｏｒｔｒａｎ言語で記述されている。ＤＯループ３１に対して、コンパイラは命令列３２を生成する。レジスタ３７のｒｅｇ５は４つの値を保持できるレジスタ（ベクトルレジスタという。）である。レジスタreg1、reg2、reg3、reg4、及びreg6もベクトルレジスタである。ベクトルロード命令３３は、配列IDX2，３８の先頭がアドレス値address1のメモリ領域から、おのおののサイズが８バイトの、連続した４つのデータを１命令で読み込む命令である。図３は、命令列３２の２回目の繰り返しの例であり、アドレスaddress1＋０、address1＋８、address1＋１６、address1＋２４のアドレスから値を読み込み、ベクトルレジスタreg1に書き込んでいる。ベクトルレジスタreg1，３９には、４つの値２、５、６、６が書き込まれている。ベクトル収集命令３４は、４つの値が書き込まれたベクトルレジスタreg1，３９の値を元にアドレスを計算し、４つのメモリ領域から値を集める命令である。ベクトルレジスタreg1，３９には、４つの値２、５、６、６が書き込まれているので、ベクトル収集命令３４は、配列Ｙ，３１０のアドレスaddress3＋（２−１）×８、address3＋（５−１）×８、address3＋（６−１）×８から値を読み込み、ベクトルレジスタreg3，３１１に値を書き込んでいる。このようにして得た結果をもとにベクトル加算命令３５が４つの加算を一命令で行い、その結果をベクトル拡散命令３６がメモリに書き込む。
【００１１】
なお、特許文献１は、アドレス依存性チェックの際の処理待ちの発生を出来るだけ解消し、メモリへのアクセスが伴う処理を高速化する演算処理技術について記載されている。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開２００９−０２６２６０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
しかしながら、メモリアクセス命令のメモリ・ディスアンビギュエションを行う場合には、前述のような仕組みであるため、先行して実行できるロード命令数を増やしプログラムを高速化するには、命令リオーダバッファ２９のエントリ数、および、「先行Ｎ」２１５の列を増やすしかない。しかし、ＣＰＵの物理的な制約からそれらを増やすことは難しいという課題がある。また、それらが増えれば増えるほど、命令リオーダユニット２６の処理量が増え、性能向上の度合いが減少するという課題がある。
【００１４】
また、ＳＩＭＤ命令、ベクトル命令では、上述のような処理を行うので、それらがアクセスするすべてのメモリ領域ごとに先行させなければならない命令の完了を待ちあわせなければならない。そのため、ロード命令をできるだけ先行して開始しプログラムを高速化するには、図４のようにそれらの命令がアクセスするすべての領域のアドレスを命令リオーダバッファに登録しなければならなくなる。さらに、命令リオーダユニット２６がアドレス計算の終わった命令を命令リオーダバッファに登録するとき、各エントリのすべてのアドレスを調べ先行させなければならない命令を得る必要があり、また、命令実行完了通知２７を受け取ったときも各エントリのすべてのアドレスを調べ、クリアしなければならなくなる。このため、アドレスの登録領域が増加するだけでなく、調べるための時間も増加してしまうという課題があり、ＣＰＵの物理的制約、また、性能向上の恩恵も少ないことから、ＳＩＭＤ命令、ベクトル命令タイプのロード命令を先行して実行し、プログラムを高速化することはできない。
【００１５】
本発明は、かかる実情に鑑み、ロード命令による追い越しの許可／不許可を示すフラグをもつストア命令、ロード命令の追い越しをブロックする命令を命令セットに含むＣＰＵと、そのフラグの設定、命令を生成するコンパイラを提供することで、プログラムを高速に実行する手法を提供しようとするものである。
【課題を解決するための手段】
【００１６】
本発明は、ロード命令の追い越しの許可／不許可を示す追い越し許可フラグをもつストア命令、ロード命令の追い越しをブロックする命令を含む命令セットをもつＣＰＵと、そのフラグを設定する追い越し許可フラグ設定手段、その命令を生成する追い越しブロック命令生成手段をもつコンパイラと、追い越しをブロックする命令を命令リオーダバッファに登録する追い越しブロック命令登録手段、追い越し許可フラグの設定されたストア命令を参照しながら、メモリアクセス命令を命令リオーダバッファに登録する命令バイパス手段をもつ命令リオーダユニットを有する。
【００１７】
なお、本明細書において、メモリにデータを書き込むことをストア、それを行う命令をストア命令、メモリからデータを読み込むことをロード、それを行う命令をロード命令という。また、ロード命令、ストア命令をまとめてメモリアクセス命令という。
【発明の効果】
【００１８】
本発明によれば、追い越し許可フラグはＯＮに設定されている第１の命令の後続の命令が、第１の命令と同時に、または、第１の命令を追い越して処理される。これにより、処理時間が短縮され、プログラムが高速化されるという効果を奏し得る。
【図面の簡単な説明】
【００１９】
【図１】従来例における命令パイプラインの流れを示す図である。
【図２】メモリアクセス命令のメモリ・ディスアンビギュエションを行い高速化するときの従来例を示す図である。
【図３】一つの命令で四つのメモリ領域にロード、ストアできるベクトル命令をもつ場合の従来例を示す図である。
【図４】命令リオーダバッファの一例である。
【図５】本発明の一実施形態に係るプログラム実行システムの概略構成を示すブロック図である。
【図６】本実施例における追い越し許可フラグ設定手段の動作を示すフローチャートである。
【図７】本実施例における追い越しブロック命令生成手段の動作を示すフローチャートである。
【図８】本実施例における追い越しブロック命令登録手段の動作を示すフローチャートである。
【図９】本実施例における命令バイパス手段の動作を示すフローチャートである。
【図１０】本実施例において、ベクトル命令の場合における効果を示す図である。
【図１１】（Ａ）は、他の実施例におけるプログラム１１１の一例を示す図である。（Ｂ）は、この実施例において追い越し許可フラグ設定手段の動作を示すフローチャートである。
【図１２】本発明の他の実施例におけるコンパイラの機能構成を示すブロック図である。
【図１３】本発明の他の実施例を示す図である。
【発明を実施するための形態】
【００２０】
以下、本発明の実施の形態について図面を参照しつつ詳細に説明する。なお、同一の要素には同一の符号を付し、重複する説明を省略する。
【００２１】
図５は、本発明の一実施形態に係るプログラム実行システムの概略構成を示すブロック図である。同図に示すように、本実施例において、ＣＰＵの命令セットは、追い越し許可フラグをもつストア命令５４、５５、５６、および、追い越しする命令をブロックする命令（以下「追い越しブロック命令」という。）５７を含む。
【００２２】
また、本実施例におけるコンパイラ５１は、プログラムのあるループ中のストア命令の追い越し許可フラグをＯＮ（追い越しを許可）に設定する指示行５１６が指定されたときループ中のストア命令５４、５５、５６の追い越し許可フラグをＯＮに設定する追い越し許可フラグ設定手段５２と、プログラム中のある地点以降のロード命令の追い越しをブロックすることを指定する指示行５１５が指定されたときその場所に追い越しブロック命令５７を生成する追い越しブロック命令生成手段５３を有する。
【００２３】
命令リオーダユニット５９は、メモリ・ディスアンビギュエションを行いロード、ストア命令の実行順番を制御する。本実施例における命令リオーダユニット５９は、追い越しブロック命令５７を命令リオーダバッファ５１７に登録する追い越しブロック命令登録手段５１０、追い越し許可フラグがＯＮに設定されたストア命令を先行させなければならない命令とせず、かつ、命令リオーダバッファ５１７中の追い越しブロック命令５７を先行させなければならない命令として、ロード命令を命令リオーダバッファ５１７に登録する命令バイパス手段５１１を有する。また、命令リオーダユニット５９は、命令リオーダユニット２６として説明した動作及び機能を包含している。
【００２４】
アドレス計算ユニット５８は、実行ステージ１４に相当し、メモリアクセス命令のアクセスするメモリ領域のアドレスを計算する。命令デコードステージ１３の結果が入力される。メモリアクセスユニット５１３は、リード／ライトステージ１５に相当する。本実施例では、アドレス計算ユニット５８、メモリアクセスユニット５１３は、二つの命令を同時に処理できるものとするが、並列処理可能な命令の数はこれに限定されない。命令リオーダバッファ５１７は、命令パイプラインのリード／ライトステージ１５の直前のバッファに相当する。命令実行完了通知５１２は、命令実行完了通知２７と同様の通知である。
【００２５】
本実施例におけるプログラム実行システムは、コンピュータにより実現される。プログラム実行システムは、システムの動作及び処理を制御するＣＰＵと、プログラムや必要なデータを格納するＲＯＭ及び／又はＲＡＭと、外部からの入力及び外部への出力をするための入出力インタフェースと、外部とデータ通信するための通信インタフェースと、これらを結ぶバス等を備える。また、本明細書等において、手段とは、単に物理的手段を意味するものではなく、その手段が有する機能をソフトウェアによって実現する場合、すなわち、ＣＰＵが、メモリまたは外部記憶装置などに記憶された所定のプログラムを実行することにより実現する場合を含む。このとき、１つの手段が有する機能が２つ以上の物理的手段により実現されても、２つ以上の手段の機能が１つの物理的手段により実現されてもよい。
【００２６】
次に、図５〜９を用いて本実施例における動作について説明する。
【００２７】
図６は、本実施例における追い越し許可フラグ設定手段の動作を示すフローチャートである。本実施例におけるコンパイラ５１の追い越し許可フラグ設定手段５２は、コンパイラがストア命令を処理するときに起動される。図６に示すように、まず、ストア命令がループに含まれるかどうかを判定する（Ｓ６１）。ストア命令がループに含まれないとき、ストア命令の追い越し許可フラグをＯＦＦに設定する（Ｓ６４）。ストア命令がループに含まれるとき、ループに対して追い越し許可フラグをＯＮに設定する指示行５１６が指定されたかどうかを判定する（Ｓ６２）。指定されていないとき、ストア命令の追い越し許可フラグをＯＦＦに設定する（Ｓ６４）。指定されていたとき、ストア命令の追い越し許可フラグをＯＮに設定する（Ｓ６３）。
【００２８】
図７は、本実施例における追い越しブロック命令生成手段の動作を示すフローチャートである。本実施例におけるコンパイラ５１の追い越しブロック命令生成手段５３は、コンパイラが文を処理する直前に起動される。図７に示すように、まず、文の直前にロード命令の追い越しをブロックすることを指定する指示行５１５が指定されているか判定する（Ｓ７１）。指定されていないとき、従来どおり、現在の文に対応する命令を生成する（Ｓ７３）。指定されていたとき、追い越しブロック命令を生成する（Ｓ７２）。その後、従来どおり、現在の文に対応する命令を生成する（Ｓ７３）。
【００２９】
図８は、本実施例における追い越しブロック命令登録手段の動作を示すフローチャートである。本実施例における命令リオーダユニット５９の追い越しブロック命令登録手段５１０は、命令リオーダユニット５９が命令リオーダバッファ５１７に追い越しブロック命令５７を登録するときに起動される。図８に示すように、追い越しブロック命令登録手段５１０は、命令リオーダバッファ５１７からエントリを取り出す（Ｓ８１）。次に取り出したエントリが空のエントリかどうかを判定する（Ｓ８２）。空のエントリでないとき、追い越しブロック命令に先行させなければならない命令として本エントリの番号を登録する（Ｓ８３）。次に、取り出したエントリが命令リオーダバッファ５１７の最後のエントリかどうかを判定する（Ｓ８４）。最後のエントリでなかったとき、命令リオーダバッファ５１７から次のエントリを取り出し（Ｓ８１）、処理を繰り返す。ステップＳ８４で最後のエントリだったとき、処理を終了する。ステップＳ８２でエントリが空のエントリであったとき、取り出したエントリが命令リオーダバッファ５１７の最後のエントリかどうかを判定する（Ｓ８４）。最後のエントリでなかったとき、命令リオーダバッファ５１７から次のエントリを取り出し（Ｓ８１）、処理を繰り返す。ステップＳ８４で最後のエントリだったとき、処理を終了する。
【００３０】
図９は、本実施例における命令バイパス手段の動作を示すフローチャートである。本実施例における命令リオーダユニット５９の命令バイパス手段５１１は、命令リオーダユニット５９が命令リオーダバッファ５１７に命令を登録するときに起動される。図９に示すように、まず、命令リオーダバッファ５１７からエントリを取り出す出したエントリが追い越しブロック命令のものかどうか判定する（Ｓ９３）。エントリが追い越しブロック命令のものであるとき、登録しようとしている命令に先行させなければならない命令として、このエントリの番号を登録するものとする（Ｓ９４）。その後、取り出したエントリが命令リオーダバッファ５１７の最後のエントリだったかどうか判定する（Ｓ９５）。最後のエントリでなかったとき、次のエントリを取り出す（Ｓ９１）。最後のエントリだったとき、従来と同じように、命令を命令リオーダバッファ５１７の空きエントリに登録する（Ｓ９６）。
【００３１】
ステップＳ９３で追い越しブロック命令のエントリでなかったとき、エントリがストア命令のものかどうか判定する（Ｓ９７）。エントリがストア命令のものでなかったとき、すなわち、ロード命令のエントリであったとき、登録しようとしている命令がロード命令であるかどうか判定する（Ｓ９１０）。ロード命令であるとき、取り出したエントリが命令リオーダバッファ５１７の最後のエントリだったかどうか判定し（Ｓ９５）、次のエントリを処理するか（Ｓ９１）、命令を登録して（Ｓ９６）、処理を終了する。
【００３２】
ステップＳ９１０でロード命令でなかったとき、すなわち、ストア命令であったとき、メモリアクセス命令のメモリ・ディスアンビギュエションを行い、必要であれば先行させなければならない命令としてエントリ番号を登録するものとする。また、ＳＩＭＤ命令、ベクトル命令であるときは直前に登録した命令を先行させなければならない命令として登録するものとする（Ｓ９１１）。ステップＳ９１１は、従来どおりの処理である。その後、取り出したエントリが命令リオーダバッファ５１７の最後のエントリだったかどうか判定し（Ｓ９５）、次のエントリを処理するか（Ｓ９１）、命令を登録して（Ｓ９６）、処理を終了する。
【００３３】
ステップＳ９７でエントリがストア命令のものであったとき、登録しようとしている命令がロード命令かどうか判定する（Ｓ９８）。ロード命令でないとき、すなわち、ストア命令であるとき、メモリアクセス命令のメモリ・ディスアンビギュエションを行い、必要であれば先行させなければならない命令としてエントリ番号を登録するものとする。また、ＳＩＭＤ命令、ベクトル命令であるときは直前に登録した命令を先行させなければならない命令として登録するものとする（Ｓ９１１）。その後、取り出したエントリが命令リオーダバッファ５１７の最後のエントリだったかどうか判定し（Ｓ９５）、次のエントリを処理するか（Ｓ９１）、命令を登録して（Ｓ９６）、処理を終了する。
【００３４】
ステップＳ９８でロード命令であったとき、エントリに登録されていたストア命令の追い越し許可フラグがＯＮであるかどうか判定する（Ｓ９９）。追い越し許可フラグがＯＦＦ（追い越し不可）であったとき、メモリアクセス命令のメモリ・ディスアンビギュエションを行い、必要であれば先行させなければならない命令としてエントリ番号を登録するものとする。また、ＳＩＭＤ命令、ベクトル命令であるときは直前に登録した命令を先行させなければならない命令として登録するものとする（Ｓ９１１）。その後、取り出したエントリが命令リオーダバッファ５１７の最後のエントリだったかどうか判定し（Ｓ９５）、次のエントリを処理するか（Ｓ９１）、命令を登録して（Ｓ９６）、処理を終了する。
【００３５】
ステップＳ９９で追い越し許可フラグがＯＮ（追い越し許可）であったとき、取り出したエントリが命令リオーダバッファ５１７の最後のエントリだったかどうか判定し（Ｓ９５）、次のエントリを処理するか（Ｓ９１）、命令を登録して（Ｓ９６）、処理を終了する。
【００３６】
このようにして、追い越し許可フラグがＯＮのストア命令があったとき、ロード命令のメモリ・ディスアンビギュエションを省くことができ、また、ＳＩＭＤ命令、ベクトル命令タイプのロード命令を先行して実行することができ、プログラム実行が高速化される。
【００３７】
図１０は、本実施例において、ベクトル命令の場合における効果を示す図である。ソースコード１０１は、サンプルのＣプログラムのループである。同図においてｘ、ｙ、ｚ、ｉｄｘはポインタである。このループ内では、二つのポインタの指示先から値をベクトルロードし、そのベクトル加算結果を、命令１０２でストアしている。命令１０２のストアは、一般的に、ベクトル拡散と呼ばれる。指示行１０３は、ループ中のストア命令の追い越し許可フラグをＯＮ（追い越しを許可）に設定する。このループに対して、本発明のコンパイラは、ソースコード１０１のループの一回の繰り返しに対して、ベクトル命令列１０４を生成する。ＶＳＣ命令１０５は、追い越し許可フラグがＯＮに設定されたストア命令（ベクトル拡散命令）である。ＶＬＤはベクトルロード命令、ＶＡＤＤはベクトル加算命令である。プログラムの実行では、命令列１０４が命令パイプラインに繰り返し投入される。命令列１０６は、命令列１０４が命令パイプラインに投入される順番を示す。左端例１０１０は投入される順番を示す。最初に、ＶＬＤ命令１０９が投入される。命令１０８は次の繰り返しの最初のＶＬＤ命令であり、命令１０７はその次の繰り返しの最初のＶＬＤ命令である。
【００３８】
時系列１０１１は、従来技術のときの命令パイプラインのリード／ライトステージでの処理状況である。命令は、右から左に流れていく。従来は、ベクトル命令の追い越しは行われなかったため、ＶＳＣ命令１０１２と同時に、あるいはそれより先に、ＶＬＤ命令１０１３は処理されなかった。後続のＶＳＣ命令１０２１に続くＶＬＤ命令１０２２も同じである。
【００３９】
これに対して、時系列１０１４は、本発明での命令パイプラインのリード／ライトステージでの処理状況である。ＶＳＣ命令１０１６の追い越し許可フラグはＯＮに設定されているため、その後続のＶＬＤ命令１０１５が、ＶＳＣ命令１０１６と同時に処理される。ＶＳＣ命令１０１７も追い越し許可フラグがＯＮに設定されているため、その後続のＶＬＤ命令１０１８、ＶＬＤ命令１０１９がＶＳＣ命令１０１７を追い越して処理される。これにより、時間１０２０に相当する時間が短縮され、プログラムが高速化される。
【００４０】
本発明の他の実施例として、プログラマが追い越し許可フラグをＯＮに設定する指示行をループに対して指定する代わりに、文ごとに指定する方法がある。
【００４１】
図１１（Ａ）は、他の実施例におけるプログラム１１１の一例を示す図である。図１１（Ｂ）は、この実施例において追い越し許可フラグ設定手段の動作を示すフローチャートである。指示行１１２は、直後の文に対して指定された指示行である。このときの追い越し許可フラグ設定手段の動作は、最初に文に対して追い越し許可フラグをＯＮに設定する指示行が指定されていたかどうかを判定する（Ｓ１１３）。指定されていたとき、文に対して生成するストア命令の追い越し許可フラグをＯＮに設定する（Ｓ１１４）。そうでないとき、ストア命令の追い越し許可フラグをＯＦＦに設定する（Ｓ１１５）。
【００４２】
図１２は、本発明の他の実施例におけるコンパイラの機能構成を示すブロック図である。この実施例においては、プログラマが追い越し許可フラグをＯＮに設定する指示行、ロード命令の追い越しをブロックすることを指定する指示行をループ、文に対して指定する代わりに、図１２のコンパイラのように追い越し可能ストア命令検出手段１２１をコンパイラに追加し、それによりコンパイラがプログラムを解析し、追い越しブロック命令をどの位置に作るのか、どのストア命令の追い越し許可フラグをＯＮに設定するのか、ＯＦＦに設定するのかを自動的に判定する方法がある。このとき、その検出結果を追い越し許可フラグ設定手段１２２、追い越しブロック命令生成手段１２３で利用する。
【００４３】
図１３は、本発明の他の実施例を示す図である。この実施例は、ストア命令に追い越し許可フラグを設ける代わりに、追い越し許可を示す命令（追い越し許可命令）を追加し、その命令と追い越しブロック命令の間の区間のストア命令を追い越し許可と判断する方法である。同図において、ＯＶＴ１３５が追い越し許可命令である。追い越し許可命令は、指示行１３１７の指定された位置に、コンパイラ１３１の追い越し許可命令生成手段１３２によって生成される。命令列１３４は、本実施例のコンパイラ１３１によって生成されたループ１３１６に対する命令列である。ＬＡＢＥＬから末尾のＩＦまでの命令１３８がループの一回の繰り返しに相当する命令列である。その直前に追い越し許可命令であるＯＶＴ１３５が生成される。そしてループの出口には指示行１３１８に相当する追い越しブロック命令ＳＯＶＴ１３７が生成される。追い越しブロック命令は、指定された位置に、コンパイラ１３１の追い越しブロック命令生成手段１３３によって生成される。このとき、ＯＶＴ１３５とＳＯＶＴ１３７の間で実行されるすべてのストア命令１３６は追い越し許可となる。
【００４４】
アドレス計算ユニット１３９、命令実行完了通知１３１４、メモリアクセスユニット１３１５、命令リオーダバッファ１３１９は、図５に記載の実施例の対応する構成と同様の構成を備える。
【００４５】
本実施例の命令リオーダユニット１３１０は、追い越し許可／ブロック命令登録手段１３１１を備える。追い越し許可命令は、追い越し許可／ブロック命令登録手段１３１１により、図８の追い越しブロック命令登録手段と同じ手順で命令リオーダバッファ１３１９に登録される。追い越しブロック命令は、追い越し許可／ブロック命令登録手段１３１１により、図８の追い越しブロック命令登録手段と同じ手順で命令リオーダバッファ１３１９に登録される。
【００４６】
本実施例の命令バイパス手段１３１２は、図９の追い越し許可フラグがＯＮであるかの判定（Ｓ９９）の代わりに、追い越し許可命令実行後に一度も追い越しブロック命令を実行していないかどうかを判定する。実行していないとき、追い越し許可であるので取り出したエントリが命令リオーダバッファ１３１９の最後のエントリだったかどうか判定し（Ｓ９５）、次のエントリを処理するか（Ｓ９１）、命令を登録して（Ｓ９６）、処理を終了する。追い越しブロック命令を実行していたとき、メモリアクセス命令のメモリ・ディスアンビギュエションを行い、必要であれば先行させなければならない命令としてエントリ番号を登録するものとする。
【００４７】
また、ＳＩＭＤ命令、ベクトル命令であるときは直前に登録した命令を先行させなければならない命令として登録するものとする（Ｓ９１１）。その後、取り出したエントリが命令リオーダバッファ１３１９の最後のエントリだったかどうか判定し（Ｓ９５）、次のエントリを処理するか（Ｓ９１）、命令を登録して（Ｓ９６）、処理を終了する。それ以外は、図９の命令バイパス手段と同じ動作をする。
【００４８】
本発明の他の実施例として、プログラマが追い越し許可命令、追い越しブロック命令の位置を指示行で支持する代わりに、図１２のコンパイラのように追い越し可能ストア命令検出手段をコンパイラに追加し、それによりコンパイラがプログラムを解析し、追い越し許可命令、追い越しブロック命令をどの位置に作るのかを自動的に判定する方法もある。
【００４９】
なお、本発明は、上記した実施の形態に限定されるものではなく、本発明の要旨を逸脱しない範囲内において、他の様々な形で実施することができる。このため、上記実施形態はあらゆる点で単なる例示にすぎず、限定的に解釈されるものではない。例えば、上述の各処理ステップは処理内容に矛盾を生じない範囲で任意に順番を変更して又は並列に実行することができる。
【００５０】
上記の実施形態の一部又は全部は、以下の付記のようにも記載され得るが、以下には限
られない。
【００５１】
（付記１）ロード命令の追い越しの許可又は不許可を示す追い越し許可フラグをもつストア命令と、ロード命令の追い越しをブロックする追い越しブロック命令と、を含む命令セットをもつプロセッサと、前記追い越し許可フラグを設定する追い越し許可フラグ設定手段と、前記追い越しブロック命令を生成する追い越しブロック命令生成手段と、をもつコンパイラと、前記追い越しブロック命令を命令リオーダバッファに登録する追い越しブロック命令登録手段と、前記追い越し許可フラグの設定されたストア命令を参照しながら、メモリアクセス命令を命令リオーダバッファに登録する命令バイパス手段と、をもつ命令リオーダユニットと、を有するプログラム実行システム。
【００５２】
（付記２）前記命令リオーダユニットは、前記追い越し許可フラグがＯＮに設定されている第１の命令について、その後続の命令を、前記第１の命令と同時に又は追い越して処理されるよう、前記命令リオーダバッファに登録されることを特徴とする付記１記載のプログラム実行システム。
【００５３】
（付記３）ロード命令の追い越しの許可又は不許可を示す追い越し許可フラグをもつストア命令と、ロード命令の追い越しをブロックする追い越しブロック命令と、を含む命令セットをもつプロセッサを備えるプログラム実行システムにおいて、プログラムを実行する方法であって、コンパイラにおいて、前記追い越し許可フラグを設定する追い越し許可フラグ設定ステップと、前記コンパイラにおいて、前記追い越しブロック命令を生成する追い越しブロック命令生成ステップと、命令リオーダユニットが、前記追い越しブロック命令を命令リオーダバッファに登録する追い越しブロック命令登録ステップと、前記命令リオーダユニットが、前記追い越し許可フラグの設定されたストア命令を参照しながら、メモリアクセス命令を命令リオーダバッファに登録する命令バイパスステップと、を備える方法。
【００５４】
（付記４）前記命令リオーダユニットが、前記追い越し許可フラグがＯＮに設定されている第１の命令について、その後続の命令を、前記第１の命令と同時に又は追い越して処理されるよう、前記命令リオーダバッファに登録することを特徴とする付記３記載の方法。
【符号の説明】
【００５５】
５１，１３１  コンパイラ、５２，１２２  追い越し許可フラグ設定手段、５３，１２３，１３３  追い越しブロック命令生成手段、５８，１３９  アドレス計算ユニット、５９，１３１０  命令リオーダユニット、５１０  追い越しブロック命令登録手段、５１１，１３１２  命令バイパス手段、５１２，１３１４  命令実行完了通知、５１３，１３１５  メモリアクセスユニット、５１７，１３１９  命令リオーダバッファ、１２１  追い越し可能ストア命令検出手段、１３２  追い越し許可命令生成手段、１３１１  追い越し許可／ブロック命令登録手段
【図１】
2012216009.tif 000003
【図２】
2012216009.tif 000004
【図３】
2012216009.tif 000005
【図４】
2012216009.tif 000006
【図５】
2012216009.tif 000007
【図６】
2012216009.tif 000008
【図７】
2012216009.tif 000009
【図８】
2012216009.tif 000010
【図９】
2012216009.tif 000011
【図１０】
2012216009.tif 000012
【図１１】
2012216009.tif 000013
【図１２】
2012216009.tif 000014
【図１３】
2012216009.tif 000015