(57)【要約】【課題】データのアクセス時間を短縮することができる演算処理装置、演算処理装置の制御方法及びプログラムを提供することを課題とする。【解決手段】演算処理装置は、複数のキャッシュラインにデータを記憶可能なキャッシュメモリ（２９）と、前記キャッシュメモリのアドレスが連続するｐ個のキャッシュラインでキャッシュミスが発生すると、前記キャッシュミスしたキャッシュラインの後のキャッシュラインにデータをプリフェッチするハードウェアプリフェッチ回路（２７）と、キャッシュミス回数指定命令を入力すると、前記ハードウェアプリフェッチ回路のｐ個の値を変更する制御部（２６）とを有する。【選択図】図１
2015060529.tif 000002
【特許請求の範囲】
【請求項１】
複数のキャッシュラインにデータを記憶可能なキャッシュメモリと、
前記キャッシュメモリのアドレスが連続するｐ個のキャッシュラインでキャッシュミスが発生すると、前記キャッシュミスしたキャッシュラインの後のキャッシュラインにデータをプリフェッチするハードウェアプリフェッチ回路と、
キャッシュミス回数指定命令を入力すると、前記ハードウェアプリフェッチ回路のｐ個の値を変更する制御部と
を有することを特徴とする演算処理装置。
【請求項２】
前記ハードウェアプリフェッチ回路は、前記キャッシュミスしたキャッシュラインのｑ個後のキャッシュラインにデータをプリフェッチし、
前記制御部は、プリフェッチ位置指定命令を入力すると、前記ハードウェアプリフェッチ回路のｑ個の値を変更することを特徴とする請求項１記載の演算処理装置。
【請求項３】
前記制御部は、プリフェッチ停止命令を入力すると、前記ハードウェアプリフェッチ回路によるプリフェッチを停止させることを特徴とする請求項１又は２記載の演算処理装置。
【請求項４】
前記ハードウェアプリフェッチ回路は、前記連続するｐ個のキャッシュラインの中にｒ個のキャッシュラインの空きがあっても、前記連続するｐ個のキャッシュラインでキャッシュミスが発生したと判断し、
前記制御部は、キャッシュライン空き数指定命令を入力すると、前記ハードウェアプリフェッチ回路のｒ個の値を変更することを特徴とする請求項１〜３のいずれか１項に記載の演算処理装置。
【請求項５】
複数のキャッシュラインにデータを記憶可能なキャッシュメモリと、
前記キャッシュメモリのアドレスが連続するｐ個のキャッシュラインでキャッシュミスが発生すると、前記キャッシュミスしたキャッシュラインの後のキャッシュラインにデータをプリフェッチするハードウェアプリフェッチ回路とを有する演算処理装置の制御方法であって、
制御部が、ダミーロード命令を入力すると、指定アドレスの前のアドレスのデータを一又は複数の前記キャッシュラインに書き込ませることを特徴とする演算処理装置の制御方法。
【請求項６】
キャッシュメモリのアドレスが連続するｐ個のキャッシュラインでキャッシュミスが発生すると、前記キャッシュミスしたキャッシュラインの後のキャッシュラインにデータをプリフェッチするハードウェアプリフェッチ回路を有する演算処理装置に入力する命令を生成するプログラムであって、
ソースプログラム内のループ処理のループ回数が第１の閾値より多く、かつ前記ループ処理により連続アクセスするデータの長さが第２の閾値より短いか否かを比較し、
前記ソースプログラム内のループ処理のループ回数が第１の閾値より多く、かつ前記ループ処理により連続アクセスするデータの長さが第２の閾値より短い場合には、前記ループ処理の前に、前記ハードウェアプリフェッチ回路のｐ個の値を変更するキャッシュミス回数指定命令を挿入する、
処理をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置、演算処理装置の制御方法及びプログラムに関する。
【背景技術】
【０００２】
予めメインメモリからキャッシュメモリへデータを転送するように指示するプリフェッチ命令を動的に命令列中に挿入して実行する演算処理装置が知られている（例えば、特許文献１参照）。プリフェッチ対象選択手段は、キャッシュミスを起こす命令のうちプリフェッチ処理の対象とすべき命令を選択する。アドレス予測手段は、プリフェッチ対象選択手段によってプリフェッチ処理の対象とされた命令の実行時におけるメモリアクセスアドレスを予測する。プリフェッチ命令挿入位置決定手段は、プリフェッチ対象選択手段によってプリフェッチ処理の対象とされた命令に対応するプリフェッチ命令の命令列中への挿入位置を決定する。プリフェッチ命令挿入手段は、アドレス予測手段によって予測されたメモリアクセスアドレスをオペランドに有するプリフェッチ命令を、プリフェッチ命令挿入位置決定手段によって決定された挿入位置に挿入する。
【０００３】
また、動き補償方式を用いる動画像データ復号装置が知られている（例えば、特許文献２参照）。キャッシュメモリは、画像データを一時的に格納する。参照マクロブロック位置決定手段は、符号化ビットストリームを解析して得られる動きベクトルに基づいて、復号対象マクロブロックに対応する参照フレーム上の参照マクロブロックの位置を決定する。プリロードアドレス指定手段は、参照マクロブロックのデータがキャッシュメモリに格納されていない時に、参照マクロブロックがキャッシュライン境界を含んでいるかを判定し、含んでいる場合にキャッシュライン境界の位置を参照マクロブロックのデータを格納するメモリからのデータプリロード先頭アドレスとして指定する。
【０００４】
また、プロセッサ及び主記憶装置に接続されるキャッシュメモリが知られている（例えば、特許文献３参照）。データアレイは、主記憶装置が保存するデータのコピーをライン単位に保持する。メモリ制御手段は、主記憶装置からデータを読み出し、データのコピーをデータアレイの各ラインに書き込む。制御情報メモリは、各ラインに保持されるデータのコピーを管理する管理情報と、各ラインに保持されたデータのコピーの使用状況を示す使用情報とを保持する。キャッシュ制御手段は、プロセッサからの要求に応じて、データのコピーがデータアレイに保持されているかを管理情報に基づいて判断し、保持されている場合、データアレイからデータを読み出し、保持されていない場合、主記憶装置からデータを読み出すことをメモリ制御手段に指示する。プリフェッチ制御手段は、使用情報に基づいて、メモリ制御手段がプリフェッチするプリフェッチライン数を決定する。メモリ制御手段は、キャッシュ制御手段からの指示に応じて主記憶装置からデータを読み出すときに、プリフェッチライン数に従って、プリフェッチを行う。
【０００５】
また、動的タグ照合回路が知られている（例えば特許文献４参照）。アドレス比較回路は、第１のアドレス信号と第２のアドレス信号を受信して、第１のアドレス信号が、第２のアドレス信号と異なる場合、アドレス比較回路の出力として、アドレス・ミス信号を生成する。強制ミス回路は、第１のアドレス信号が、第２のアドレス信号と異なるか否かに関係なく、第１のアドレス信号と第２のアドレス信号との間にミスを強制する少なくとも１つの強制ミス入力信号を受信すると、強制ミス回路の出力として、強制ミス信号を生成する。強制ミス回路、及びアドレス比較回路が、それぞれの出力を互いに同時に発生するように、強制ミス回路は、アドレス比較回路がアドレス・ミス信号を出力する時と同期した時間で、強制ミス信号を出力する。
【０００６】
また、メインメモリに記憶されるデータのうち利用頻度の高いデータを記憶するキャッシュメモリを有する命令制御装置が知られている（例えば、特許文献５参照）。第一空き領域判定部は、キャッシュメモリから受信した命令フェッチデータを保存する命令バッファに空きがあるか否かを判定する。第二空き領域判定部は、第一空き領域判定部によって、命令バッファに空きがあると判定された場合に、キャッシュメモリからメインメモリに送出する命令フェッチリクエストキューを管理する、キャッシュメモリ内のムーブインバッファに少なくとも２エントリ以上の空きがあるか否かを判定する。命令制御部は、第二空き領域判定部によってキャッシュメモリ内のムーブインバッファに少なくとも２エントリ以上の空きがあると判定された場合に、キャッシュラインのラインサイズに従ったアドレス境界で命令プリフェッチ要求をキャッシュメモリに出力する。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００３−２２３３５９号公報
【特許文献２】特開２００６−４１８９８号公報
【特許文献３】特開２０１０−１４６１４５号公報
【特許文献４】特開平１０−９１５２０号公報
【特許文献５】特開２０１１−１３８６４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
演算処理装置では、メインメモリよりも高速なキャッシュメモリをプロセッサとメインメモリの間に配置し、最近参照したデータをキャッシュメモリ上に置くことによって、メインメモリ参照による待ち時間を減少させている。ところが、数値計算処理など大規模データを使用する計算では、データの参照局所性が低いためキャッシュミスが多発し、メインメモリ参照による待ち時間を十分に減少することが出来ない課題がある。
【０００９】
１つの側面では、本発明の目的は、データのアクセス時間を短縮することができる演算処理装置、演算処理装置の制御方法及びプログラムを提供することである。
【課題を解決するための手段】
【００１０】
演算処理装置は、複数のキャッシュラインにデータを記憶可能なキャッシュメモリと、前記キャッシュメモリのアドレスが連続するｐ個のキャッシュラインでキャッシュミスが発生すると、前記キャッシュミスしたキャッシュラインの後のキャッシュラインにデータをプリフェッチするハードウェアプリフェッチ回路と、キャッシュミス回数指定命令を入力すると、前記ハードウェアプリフェッチ回路のｐ個の値を変更する制御部とを有する。
【発明の効果】
【００１１】
キャッシュミス回数指定命令によりハードウェアプリフェッチ回路のｐ個の値を変更することができるので、データのアクセス時間を短縮することができる。
【図面の簡単な説明】
【００１２】
【図１】図１は、本実施形態による演算処理装置の構成例を示す図である。
【図２】図２（Ａ）は図１の演算処理装置が実行するソースプログラム及びそれに対応するアセンブリ言語を示す図であり、図２（Ｂ）は演算処理装置の一次オペランドキャッシュメモリを示す図である。
【図３】図３（Ａ）は図１の演算処理装置が実行するソースプログラム及びそれに対応するアセンブリ言語を示す図であり、図３（Ｂ）は演算処理装置の一次オペランドキャッシュメモリを示す図である。
【図４】図４（Ａ）は図１の演算処理装置が実行するソースプログラム及びそれに対応するアセンブリ言語を示す図であり、図４（Ｂ）は演算処理装置の一次オペランドキャッシュメモリを示す図である。
【図５】図５（Ａ）は図１の演算処理装置が実行するソースプログラム及びそれに対応するアセンブリ言語を示す図であり、図５（Ｂ）は演算処理装置の一次オペランドキャッシュメモリを示す図である。
【図６】図６は、図１のハードウェアプリフェッチ回路の構成例を示す図である。
【図７】図７は、演算処理装置の制御方法を示すフローチャートである。
【図８】図８（Ａ）及び（Ｂ）は、リードアドレス及びプリフェッチアドレスを示す図である。
【図９】図９（Ａ）は図６のキャッシュミスバッファ、キャッシュミスカウンタ及びプリフェッチキューを示す図であり、図９（Ｂ）はプリフェッチキューの登録処理を示すフローチャートである。
【図１０】図１０は、キャッシュライン空き個数ｒが１の場合の処理例を示す図である。
【図１１】図１１は、図６のチェック部の処理を示すフローチャートである。
【図１２】図１２は、図２（Ａ）〜図５（Ａ）のソースプログラムの生成方法を示すフローチャートである。
【図１３】図１３は、コンパイラの機能構成図である。
【図１４】図１４は、図１３のプロファイラの処理を示すフローチャートである。
【図１５】図１５は、図１３のコンパイラの命令挿入部の処理を示すフローチャートである。
【図１６】図１６（Ａ）及び（Ｂ）は、命令「hpf_start #p-1,#q」及び命令「hpf_stop」の挿入例を示す図である。
【図１７】図１７は、図１３のコンパイラの命令挿入部の処理を示すフローチャートである。
【図１８】図１８は、図１３のコンパイラの命令挿入部の処理を示すフローチャートである。
【図１９】図１９は、図１２のコンピュータのハードウェア構成例を示す図である。
【発明を実施するための形態】
【００１３】
図１は、本実施形態による演算処理装置１１の構成例を示す図である。演算処理装置１１は、例えば、プロセッサであり、命令のアウトオブオーダ実行やパイプライン処理の機能を有する。
【００１４】
命令フェッチステージでは、命令フェッチ部２１、命令バッファ２４、分岐予測部２２、一次命令キャッシュメモリ２３、及び二次キャッシュメモリ３４等が動作する。命令フェッチ部２１は、分岐予測部２２からフェッチする命令の予測分岐先アドレス、分岐制御部３０から分岐演算により確定した分岐先アドレス等を受け取る。命令フェッチ部２１は、受け取った予測分岐先アドレス、分岐先アドレス、及び命令フェッチ部２１内で作成した分岐しない場合にフェッチする命令の連続した次のアドレス等から、１つのアドレスを選択して次の命令フェッチアドレスを確定する。命令フェッチ部２１は、確定した命令フェッチアドレスを一次命令キャッシュメモリ２３に出力し、出力された確定後の命令フェッチアドレスに対応する命令コードをフェッチする。
【００１５】
一次命令キャッシュメモリ２３は、二次キャッシュメモリ３４の一部のデータを格納しているものであり、二次キャッシュメモリ３４は、メモリコントローラ３５を介してアクセス可能なメインメモリの一部のデータを格納しているものである。一次命令キャッシュメモリ２３に該当するアドレスのデータが存在しない場合には二次キャッシュメモリ３４からデータをフェッチし、二次キャッシュメモリ３４に該当するデータが存在しない場合にはメインメモリからデータをフェッチする。本実施形態では、メインメモリは演算処理装置１１の外部に配置しているため、外部にあるメインメモリとの入出力制御はメモリコントローラ３５を介して行われる。一次命令キャッシュメモリ２３や二次キャッシュメモリ３４、メインメモリの該当するアドレスからフェッチされた命令コードは、命令バッファ２４に格納される。
【００１６】
分岐予測部２２は、命令フェッチ部２１から出力された命令フェッチアドレスを受け取り、命令フェッチと並行して分岐予測を実行する。分岐予測部２２は、受け取った命令フェッチアドレスを基に分岐予測を行い、分岐の成立又は不成立を示す分岐方向と予測分岐先アドレスとを命令フェッチ部２１へ返す。命令フェッチ部２１は、予測された分岐方向が成立であった場合には次の命令フェッチアドレスとして予測された分岐先アドレスを選択する。
【００１７】
命令発行ステージでは、命令デコーダ２５及び命令発行制御部２６が動作する。命令デコーダ２５は、命令バッファ２４から命令コードを受け取って命令の種別や必要な実行資源等を解析し、解析結果を命令発行制御部２６に出力する。命令発行制御部２６は、リザベーションステーションの構造を持つ。命令発行制御部２６は、命令で参照するレジスタ等の依存関係を見て、依存関係のあるレジスタの更新状況や同じ実行資源を用いる命令の実行状況等から実行資源が命令を実行可能かどうかを判断する。命令発行制御部２６は、実行資源が命令を実行可能であると判断した場合には、レジスタ番号やオペランドアドレス等の命令の実行に必要な情報を演算器２６、ハードウェアプリフェッチ回路２７及び一次オペランドキャッシュメモリ２９等の実行資源に対して出力する。また、命令発行制御部２６は、実行可能な状態になるまで命令を格納しておくバッファの機能も有する。
【００１８】
命令実行ステージでは、ハードウェアプリフェッチ回路２７、演算器２８、一次オペランドキャッシュメモリ（一次データキャッシュメモリ）２９、及び分岐制御部３０等の実行資源が動作する。演算器２８は、レジスタ３１や一次オペランドキャッシュメモリ２９からデータを受け取り、四則演算、論理演算、三角関数演算、及びアドレス計算等の命令に対応した演算を実行し、演算結果をレジスタ３１や一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９は、命令キャッシュメモリ２３と同様に、二次キャッシュメモリ３４の一部のデータを記憶可能である。一次オペランドキャッシュメモリ２９は、ロード命令によるメインメモリから演算器２８やレジスタ３１へのデータのロードや、ストア命令による演算器２８やレジスタ３１からメインメモリへのデータのストア等に用いられる。二次キャッシュメモリ３４は、メモリコントローラ３５を介してアクセス可能なメインメモリの一部のデータを格納しているものである。一次オペランドキャッシュメモリ２９に該当するアドレスのデータが存在しない場合には二次キャッシュメモリ３４からデータをフェッチし、二次キャッシュメモリ３４に該当するデータが存在しない場合にはメインメモリからデータをフェッチする。ハードウェアプリフェッチ回路２７は、一次オペランドキャッシュメモリ２９で連続するアドレスでｐ（ｐは自然数）回連続してキャッシュミスが発生すると、キャッシュミスした後のデータを二次キャッシュメモリ３４又はメインメモリから一次オペランドキャッシュメモリ２９にプリフェッチする。すなわち、ハードウェアプリフェッチ回路２７は、メインメモリ上の連続するアドレスのデータをアクセスする場合には、将来アクセスするデータを予め二次キャッシュメモリ３４又はメインメモリから一次オペランドキャッシュメモリ２９にプリフェッチしておく。これにより、データのアクセス時間を短縮することができる。各実行資源は、命令実行の完了通知を命令完了制御部３２へ出力する。なお、ハードウェアプリフェッチ回路２７は、一次キャッシュメモリに限定するものでなく、同様にメモリから二次キャッシュ、三次キャッシュ以降の将来アクセスするデータをプリフェッチする制御を含む。
【００１９】
分岐制御部３０は、命令デコーダ２５から分岐命令の種別を受け取り、演算器２８から分岐先アドレスや分岐条件となる演算の結果を受け取って、演算結果が分岐条件を満たしていれば分岐成立、満たしていなければ分岐不成立の判断を行い、分岐方向を確定する。また、分岐制御部３０は、演算結果と分岐予測時の分岐先アドレスと分岐方向が一致するかどうかの判断や、分岐命令の順序関係の制御も行う。分岐制御部３０は、演算結果と予測とが一致した場合には命令完了制御部３２へ分岐命令の完了通知を出力する。一方、演算結果と予測とが一致しなかった場合には分岐予測失敗を意味するので、分岐制御部３０は、命令完了制御部３２へ分岐命令の完了通知とともに後続命令のキャンセル及び再命令フェッチ要求を命令フェッチ部２１に出力する。
【００２０】
命令完了ステージでは、命令完了制御部３２、レジスタ３１、及び分岐履歴更新部３３が動作する。命令完了制御部３２は、命令の各実行資源から受け取った完了通知を基に、コミットスタックエントリに格納された命令コード順に命令完了処理を行い、レジスタ３１の更新指示を出力する。レジスタ３１は、命令完了制御部３２からレジスタ更新指示を受け取ると、演算器２８や一次オペランドキャッシュメモリ２９から受け取る演算結果のデータを基にレジスタの更新を実行する。分岐履歴更新部３３は、分岐制御部３０から受け取る分岐演算の結果を基に分岐予測の履歴更新データを作成し、分岐予測部２２に出力する。
【００２１】
図２（Ａ）は図１の演算処理装置１１が実行するソースプログラム２０１及びそれに対応するアセンブリ言語２０２を示す図であり、図２（Ｂ）は演算処理装置１１の一次オペランドキャッシュメモリ２９を示す図である。一次オペランドキャッシュメモリ２９は、複数のキャッシュラインＣＬ１〜ＣＬ３等を有する。各キャッシュラインＣＬ１〜ＣＬ３等は、それぞれ例えば１６個のデータを記憶することができ、キャッシュラインＣＬ１〜ＣＬ３等単位で二次キャッシュメモリ３４又はメインメモリのデータを記憶する。ソースプログラム２０１は、ＦＯＲＴＲＡＮ言語の例を示す。まず、「!ocl hpf_warm(0,1)」の命令がない場合を説明する。変数ｉ及びｊのループ処理により、「X=A(i,j)+X」の命令が実行される。１００個の配列A(1,1)〜A(100,1)のデータは、メインメモリ内の１００個の連続するアドレスに記憶されている。なお、本実施形態は、C,FORTRAN等の言語によらないため、以降では、例としてFORTRANで説明する。そのため以降のFORTRANの説明では、oclによるソース記述指定で説明しているが、他言語では、例えばC言語では#pragmaに置き換えてもよい。またハードウェア命令の表記、そのフォーマット、さらにソース記述子oclの記述名、記述形式は上記例に限定せずに任意に変更可能である。
【００２２】
まず、変数ｊ＝１及び変数ｉ＝１が設定され、命令発行制御部２６は、配列A(1,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。最初、一次オペランドキャッシュメモリ２９には配列A(1,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(1,1)を含む１６個の連続するアドレスの配列A(1,1)〜A(16,1)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ１に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(1,1)のデータを入力し、「X=A(1,1)+X」の命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(2,1)〜A(16,1)のデータを入力し、「X=A(i,j)+X」の命令を実行する。
【００２３】
次に、変数ｊ＝１及び変数ｉ＝１７が設定され、命令発行制御部２６は、配列A(17,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９には配列A(17,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(17,1)を含む１６個の連続するアドレスの配列A(17,1)〜A(32,1)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ２に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(17,1)のデータを入力し、「X=A(17,1)+X」の命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(18,1)〜A(32,1)のデータを入力し、「X=A(i,j)+X」の命令を実行する。
【００２４】
ここで、ハードウェアプリフェッチ回路２７は、アドレスが連続する２個のキャッシュラインＣＬ１及びＣＬ２でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインＣＬ１及びＣＬ２の後のキャッシュラインＣＬ３に１６個の配列A(33,1)〜A(48,1)のデータのプリフェッチ処理を開始する。
【００２５】
次に、変数ｊ＝１及び変数ｉ＝３３が設定され、命令発行制御部２６は、配列A(33,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。この場合もキャッシュミスするが、その直後に、一次オペランドキャッシュメモリ２９のキャッシュラインＣＬ３にはメインメモリの配列A(33,1)〜A(48,1)のデータが上記のプリフェッチにより書き込まれるので、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(33,1)のデータを入力し、「X=A(33,1)+X」の命令を実行する。上記のプリフェッチにより、一次オペランドキャッシュメモリ２９には配列A(33,1) 〜A(48,1)のデータが書き込まれるので、データアクセス時間を短縮することができる。また、上記と同様に、ハードウェアプリフェッチ回路２７は、後のキャッシュラインＣＬ４に１６個の配列A(49,1)〜A(64,1)のデータをプリフェッチする。以上の動作を繰り返す。
【００２６】
上記のように、ハードウェアプリフェッチ回路２７は、アドレスが連続する２個のキャッシュラインＣＬ１及びＣＬ２でキャッシュミスが発生すると、プリフェッチする。上記の２個の値をソフトウェアのキャッシュミス回数指定命令「!ocl hpf_warm(0,1)」により変更可能にすることにより、データアクセス時間をさらに短縮する。
【００２７】
ハードウェアプリフェッチ回路２７は、一次オペランドキャッシュメモリ２９のアドレスが連続するｐ個のキャッシュラインでキャッシュミスが発生すると、キャッシュミスしたキャッシュラインの後のキャッシュラインにデータをプリフェッチする。「!ocl hpf_warm(p-1,1)」の命令により、ｐの値を変更することができる。例えば、「!ocl hpf_warm(0,1)」の命令は、１個目の引数が「０」であるので、ｐ＝１に設定される。
【００２８】
この場合、まず、変数ｊ＝１及び変数ｉ＝１が設定され、命令発行制御部２６は、配列A(1,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。最初、一次オペランドキャッシュメモリ２９には配列A(1,1)のデータが存在しないので、キャッシュミスする。
【００２９】
すると、ハードウェアプリフェッチ回路２７は、アドレスが連続するｐ（＝１）個のキャッシュラインＣＬ１でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインＣＬ１の後のキャッシュラインＣＬ２に１６個の配列A(17,1)〜A(32,1)のデータをプリフェッチする。以降、同様に、ハードウェアプリフェッチ回路２７は、順次、キャッシュラインＣＬ３以降もプリフェッチする。連続してアクセスする配列A(i,j)のデータ長が１７個以上であることが分かっている場合には、「!ocl hpf_warm(p-1,1)」の命令によりｐ＝１に設定すれば、データアクセス時間をさらに短縮することができる。
【００３０】
また、ハードウェアプリフェッチ回路２７は、上記のように、キャッシュミスしたキャッシュラインＣＬ１の１個後のキャッシュラインＣＬ２にデータをプリフェッチする。上記の１個の値をソフトウェアのプリフェッチ位置指定命令「!ocl hpf_warm(0,1)」により変更可能にすることにより、データアクセス時間の最適化を図ることができる。
【００３１】
ハードウェアプリフェッチ回路２７は、キャッシュミスしたキャッシュラインＣＬ１のｑ個後のキャッシュラインにデータをプリフェッチする。「!ocl hpf_warm(p-1,q)」の命令により、ｑの値を変更することができる。例えば、「!ocl hpf_warm(0,1)」の命令は、２個目の引数が「１」であるので、ｑ＝１に設定される。
【００３２】
例えば、ｐ＝１及びｑ＝１の場合、ハードウェアプリフェッチ回路２７は、キャッシュミスしたキャッシュラインＣＬ１の１個後のキャッシュラインＣＬ２にデータをプリフェッチし、その後、キャッシュラインＣＬ３以降にもデータをプリフェッチする。ｐ＝１及びｑ＝２の場合、ハードウェアプリフェッチ回路２７は、キャッシュミスしたキャッシュラインＣＬ１の２個後のキャッシュラインＣＬ３にデータをプリフェッチし、その後、キャッシュラインＣＬ４以降にもデータをプリフェッチする。
【００３３】
ソースプログラム２０１は、コンピュータのコンパイラにより、アセンブリ言語２０２に対応する機械語に変換される。ソースプログラム２０１の「!ocl hpf_warm(p-1,q)」は、アセンブリ言語２０２の「hpf_start #p-1,#q」に変換される。例えば、ｐ＝１、ｑ＝１である。演算処理装置１１は、「hpf_start #p-1,#q」に対応する機械語を入力すると、ハードウェアプリフェッチ回路２７のｐ及びｑの値を設定することができる。具体的には、命令発行制御部２６は、「hpf_start #p-1,#q」に対応する機械語を入力すると、ハードウェアプリフェッチ回路２７のｐ個の値及びｑ個の値を変更する。なお、ハードウェアプリフェッチ回路２７は、ｐの初期値が２であり、ｑの初期値が１である。
【００３４】
図３（Ａ）は図１の演算処理装置１１が実行するソースプログラム３０１及びそれに対応するアセンブリ言語３０２を示す図であり、図３（Ｂ）は演算処理装置１１の一次オペランドキャッシュメモリ２９を示す図である。一次オペランドキャッシュメモリ２９は、複数のキャッシュラインＣＬ１〜ＣＬ３，ＣＬ１１〜ＣＬ１３等を有する。ソースプログラム３０１は、ＦＯＲＴＲＡＮ言語の例を示す。まず、「!ocl hpf_stop」の命令がない場合を説明する。例えば、ｐ＝２、ｑ＝１である。
【００３５】
まず、変数ｊ＝１及び変数ｉ＝１が設定され、命令発行制御部２６は、配列A(1,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。最初、一次オペランドキャッシュメモリ２９には配列A(1,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(1,1)を含む１６個の連続するアドレスの配列A(1,1)〜A(16,1)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ１に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(1,1)のデータを入力し、「X=A(1,1)+X」の命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(2,1)〜A(16,1)のデータを入力し、「X=A(i,j)+X」の命令を実行する。
【００３６】
次に、変数ｊ＝１及び変数ｉ＝１７が設定され、命令発行制御部２６は、配列A(17,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９には配列A(17,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(17,1)を含む１６個の連続するアドレスの配列A(17,1)〜A(32,1)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ２に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(17,1)のデータを入力し、「X=A(17,1)+X」の命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(18,1)のデータを入力し、「X=A(18,1)+X」の命令を実行する。
【００３７】
ここで、ハードウェアプリフェッチ回路２７は、アドレスが連続するｐ（＝２）個のキャッシュラインＣＬ１及びＣＬ２でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインＣＬ１及びＣＬ２の後のキャッシュラインＣＬ３に１６個の配列A(33,1)〜A(48,1)のデータをプリフェッチする。しかし、変数ｉは、１〜１８の範囲で変化するので、配列A(1,1)〜A(18,1)のデータのアクセスのみ行われ、キャッシュラインＣＬ３の１６個の配列A(33,1)〜A(48,1)のデータのプリフェッチは無駄である。
【００３８】
その後、変数ｊ＝２及び変数ｉ＝１が設定され、命令発行制御部２６は、配列A(1,2)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９には配列A(1,2)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(1,2)を含む１６個の連続するアドレスの配列A(1,2)〜A(16,2)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ１１に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(1,2)のデータを入力し、「X=A(1,2)+X」の命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(2,2)〜A(16,2)のデータを入力し、「X=A(i,j)+X」の命令を実行する。
【００３９】
次に、変数ｊ＝２及び変数ｉ＝１７が設定され、命令発行制御部２６は、配列A(17,2)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９には配列A(17,2)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(17,2)を含む１６個の連続するアドレスの配列A(17,2)〜A(32,2)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ１２に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(17,2)のデータを入力し、「X=A(17,2)+X」の命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(18,2)のデータを入力し、「X=A(18,2)+X」の命令を実行する。
【００４０】
ここで、ハードウェアプリフェッチ回路２７は、アドレスが連続するｐ（＝２）個のキャッシュラインＣＬ１１及びＣＬ１２でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインＣＬ１１及びＣＬ１２の後のキャッシュラインＣＬ１３に１６個の配列A(33,2)〜A(48,2)のデータをプリフェッチする。しかし、変数ｉは、１〜１８の範囲で変化するので、配列A(1,2)〜A(18,2)のデータのアクセスのみ行われ、キャッシュラインＣＬ１３の１６個の配列A(33,2)〜A(48,2)のデータのプリフェッチは無駄である。
【００４１】
プリフェッチ停止命令「!ocl hpf_stop」は、ハードウェアプリフェッチ回路２７によるプリフェッチを停止させることができる。変数ｉのループ処理の後に、プリフェッチ停止命令「!ocl hpf_stop」を置くことにより、変数ｉが１８になった後、上記のキャッシュラインＣＬ３及びＣＬ１３のプリフェッチを停止させることができる。仮に、キャッシュラインＣＬ３及びＣＬ１３のプリフェッチの処理中に、停止が指示されても、プリフェッチ時間は比較的長いので、途中でプリフェッチを停止できることの効果は大きい。
【００４２】
ソースプログラム３０１は、コンピュータのコンパイラにより、アセンブリ言語３０２に対応する機械語に変換される。ソースプログラム３０１の「!ocl hpf_stop」は、アセンブリ言語３０２の「hpf_stop」に変換される。演算処理装置１１は、「hpf_stop」に対応する機械語を入力すると、ハードウェアプリフェッチ回路２７によるプリフェッチを停止させる。具体的には、命令発行制御部２６は、「hpf_stop」に対応する機械語を入力すると、ハードウェアプリフェッチ回路２７によるプリフェッチを停止させる。
【００４３】
図４（Ａ）は図１の演算処理装置１１が実行するソースプログラム４０１及びそれに対応するアセンブリ言語４０２を示す図であり、図４（Ｂ）は演算処理装置１１の一次オペランドキャッシュメモリ２９を示す図である。一次オペランドキャッシュメモリ２９は、複数のキャッシュラインＣＬ１〜ＣＬ６等を有する。ソースプログラム４０１は、ＦＯＲＴＲＡＮ言語の例を示す。まず、「!ocl hpf_range(1)」の命令がない場合を説明する。例えば、ｐ＝２、ｑ＝１である。また配列Ａの一次元サイズは１６とする。例えば、配列サイズの定義をA(16,8192)とする。またキャッシュライン長を一例としてここでは１２８バイトとする。すると、一次元サイズがキャッシュライン長（１２８＝１６＊８）と等しいため、例ではA(16,1)からA(1,2)の二次元に配列アクセスが移行してもメモリアクセスのアドレスが連続となるケースとなる。
【００４４】
まず、変数ｊ＝１及び変数ｉ＝１が設定され、変数ｊ（＝１）を４で割った余りが１であり、０でないので、命令発行制御部２６は、配列A(1,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９には配列A(1,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(1,1)を含む１６個の連続するアドレスの配列A(1,1)〜A(16,1)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ１に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(1,1)のデータを入力し、配列A(1,1)を用いた命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(2,1)〜A(16,1)のデータを入力し、配列A(i,j)を用いた命令を実行する。
【００４５】
次に、変数ｊ＝２及び変数ｉ＝１が設定され、変数ｊ（＝２）を４で割った余りが２であり、０でないので、命令発行制御部２６は、配列A(1,2)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９には配列A(1,2)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(1,2)を含む１６個の連続するアドレスの配列A(1,2)〜A(16,2)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ２に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(1,2)のデータを入力し、配列A(1,2)を用いた命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(2,2)〜A(16,2)のデータを入力し、配列A(i,j)を用いた命令を実行する。
【００４６】
ＣＬ１とＣＬ２のキャッシュラインに格納されている配列のメモリアドレスは連続する。そのため、ハードウェアプリフェッチ回路２７は、アドレスが連続するｐ（＝２）個のキャッシュラインＣＬ１及びＣＬ２でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインＣＬ１及びＣＬ２の後のキャッシュラインＣＬ３に１６個の配列A(1,3)〜A(16,3)のデータのプリフェッチ処理を開始する。
【００４７】
次に、変数ｊ＝３及び変数ｉ＝１が設定され、変数ｊ（＝３）を４で割った余りが３であり、０でないので、命令発行制御部２６は、配列A(1,3)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。この場合もキャッシュミスするが、その直後に、一次オペランドキャッシュメモリ２９のキャッシュラインＣＬ３にはメインメモリの配列A(1,3)のデータが上記のプリフェッチにより書き込まれるので、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(1,3)のデータを入力し、配列A(1,3)を用いた命令を実行する。上記のプリフェッチにより、データアクセス時間を短縮することができる。また、上記と同様に、ハードウェアプリフェッチ回路２７は、後のキャッシュラインＣＬ４に１６個の配列A(1,4)〜A(16,4)のデータをプリフェッチする。
【００４８】
次に、変数ｊ＝４及び変数ｉ＝１が設定され、変数ｊ（＝４）を４で割った余りが０であるので、配列A(4,i)のアクセスは行われない。
【００４９】
次に、変数ｊ＝５及び変数ｉ＝１が設定され、変数ｊ（＝５）を４で割った余りが１であり、０でないので、命令発行制御部２６は、配列A(1,5)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９には配列A(1,5)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(1,5)を含む１６個の連続するアドレスの配列A(1,5)〜A(16,5)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ５に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(1,5)のデータを入力し、配列A(1,5)を用いた命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(2,5)〜A(16,5)のデータを入力し、配列A(i,j)を用いた命令を実行する。ここでハードウェアプリフェッチ回路２７では、キャッシュミスしたキャッシュラインＣＬ３とＣＬ５はアドレスが連続したＰ（＝２）個のキャッシュラインとならないため、この場合、ハードウェアプリフェッチ回路２７は、停止し、キャッシュラインＣＬ５のプリフェッチを行わない。
【００５０】
次に、変数ｊ＝６及び変数ｉ＝１が設定され、変数ｊ（＝６）を４で割った余りが２であり、０でないので、命令発行制御部２６は、配列A(1,6)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９には配列A(1,6)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(1,6)を含む１６個の連続するアドレスの配列A(1,6)〜A(16,6)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ６に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(1,6)のデータを入力し、配列A(1,6)を用いた命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(2,6)〜A(16,6)のデータを入力し、配列A(i,j)を用いた命令を実行する。
【００５１】
ここで、ハードウェアプリフェッチ回路２７は、アドレスが連続するｐ（＝２）個のキャッシュラインＣＬ５及びＣＬ６でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインＣＬ５及びＣＬ６の後のキャッシュラインＣＬ７に１６個の配列A(1,7)〜A(16,7)のデータをプリフェッチする。
【００５２】
以上のように、キャッシュラインＣＬ４のデータがアクセスされない場合には、ハードウェアプリフェッチ回路２７は、一旦停止してしまい、再び起動することになり、データアクセス時間が長くなってしまう。そこで、アドレスが連続するキャッシュラインＣＬ１〜ＣＬ６中の１個のキャッシュラインＣＬ４だけがアクセスされなかった場合にも、ハードウェアプリフェッチ回路２７は、キャッシュラインＣＬ１〜ＣＬ６が連続してアクセスされたものとして扱い、停止することなく、キャッシュラインＣＬ３〜ＣＬ６等を連続してプリフェッチする。すなわち、ハードウェアプリフェッチ回路２７は、連続するｐ個のキャッシュラインの中にｒ個のキャッシュラインの空きがあっても、連続するｐ個のキャッシュラインでキャッシュミスが発生したと判断する。図４（Ｂ）の場合、ｒ＝１である。これにより、ハードウェアプリフェッチ回路２７の一旦停止及び再起動がなくなるので、データアクセス時間を短縮することができる。キャッシュライン空き数指定命令「!ocl hpf_range(r)」により、ｒの値を変更することができる。例えば、「!ocl hpf_range(1)」の命令は、引数が「１」であるので、ｒ＝１に設定される。
【００５３】
ソースプログラム４０１は、コンピュータのコンパイラにより、アセンブリ言語４０２に対応する機械語に変換される。ソースプログラム４０１の「!ocl hpf_range(r)」は、アセンブリ言語２０２の「hpf_range #r」に変換される。例えば、ｒ＝１である。演算処理装置１１は、「hpf_range #r」に対応する機械語を入力すると、ハードウェアプリフェッチ回路２７のｒ個の値を設定することができる。具体的には、命令発行制御部２６は、「hpf_range #r」に対応する機械語を入力すると、ハードウェアプリフェッチ回路２７のｒ個の値を変更する。なお、ハードウェアプリフェッチ回路２７は、ｒの初期値が０である。
【００５４】
図５（Ａ）は図１の演算処理装置１１が実行するソースプログラム５０１及びそれに対応するアセンブリ言語５０２を示す図であり、図５（Ｂ）は演算処理装置１１の一次オペランドキャッシュメモリ２９を示す図である。一次オペランドキャッシュメモリ２９は、複数のキャッシュラインＣＬ１，ＣＬ２，ＣＬ９〜ＣＬ１２等を有する。ソースプログラム５０１は、ＦＯＲＴＲＡＮ言語の例を示す。例えば、ｐ＝２、ｑ＝１である。
【００５５】
まず、変数ｊ＝１及び変数ｉ＝１が設定され、命令発行制御部２６は、配列A(1,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９には配列A(1,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(1,1)を含む１６個の連続するアドレスの配列A(1,1)〜A(16,1)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ１に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(1,1)のデータを入力し、「X=A(1,1)+X」の命令を実行する。以下、同様に、演算器２８は、一次オペランドキャッシュメモリ２９から配列A(2,1)〜A(16,1)のデータを入力し、「X=A(i,j)+X」の命令を実行する。
【００５６】
次に、変数ｊ＝１及び変数ｉ＝１７が設定され、命令発行制御部２６は、配列A(17,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ２９に出力する。一次オペランドキャッシュメモリ２９には配列A(17,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ３４又はメインメモリから配列A(17,1)を含む１６個の連続するアドレスの配列A(17,1)〜A(32,1)のデータを読み出し、一次オペランドキャッシュメモリ２９内のキャッシュラインＣＬ２に書き込む。演算器２８は、一次オペランドキャッシュメモリ２９から配列A(17,1)のデータを入力し、「X=A(17,1)+X」の命令を実行する。
【００５７】
ここで、ハードウェアプリフェッチ回路２７は、アドレスが連続するｐ（＝２）個のキャッシュラインＣＬ１及びＣＬ２でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインＣＬ１及びＣＬ２の後のキャッシュラインＣＬ３に１６個の配列A(33,1)〜A(48,1)のデータをプリフェッチする。
【００５８】
その後、変数ｊ＝２及び変数ｉ＝１が設定され、ダミーロード命令「!ocl contact(A(i,j),(-2),2)」が実行される。命令発行制御部２６は、配列A(1,2)の２要素前のアドレスのデータをメインメモリから読み出して２個のキャッシュラインＣＬ９及びＣＬ１０に書き込む。この際、２個のキャッシュラインＣＬ９及びＣＬ１０はキャッシュミスするので、ハードウェアプリフェッチ回路２７は、キャッシュラインＣＬ１１及びＣＬ１２に配列A(1,2)〜A(16,2)及び配列A(17,2)〜A(32,2)のデータを順次プリフェッチする。これにより、データアクセス時間を短縮することができる。以下、同様に、変数ｊの値が変更される毎に、ダミーロード命令「!ocl contact(A(i,j),(-2),2)」が実行され、配列A(1,j)〜A(16,j)及び配列A(17,j)〜A(32,j)のデータがキャッシュラインにプリフェッチされる。
【００５９】
ソースプログラム５０１は、コンピュータのコンパイラにより、アセンブリ言語５０２に対応する機械語に変換される。ソースプログラム５０１の「!ocl contact(A(i,j),(-2),2)」は、アセンブリ言語５０２の「lddf [%l1-256],f2」、「lddf [%l1-128],f2」に変換される。命令発行制御部２６は、ダミーロード命令「lddf [%l1-256],f2」に対応する機械語を入力すると、配列A(i,j)の指定アドレスの2要素前のアドレスのデータを、ダミーロード命令「lddf [%l1-128],f2」に対応する機械語を入力すると、配列A(i,j)の指定アドレスの1要素前のアドレスのデータを、それぞれ一又は複数のキャッシュラインに書き込ませる。書き込ませる要素の相対位置は、ダミーロード命令「!ocl contact(A(i,j),(-2),2)」の２個目の引数の「−２」により指定することができる。書き込ませるキャッシュラインの数は、ダミーロード命令「!ocl contact(A(i,j),(-2),2)」の３個目の引数の「２」により指定することができる。本例では、２個のキャッシュラインＣＬ９及びＣＬ１０に書き込ませる。ダミーロード命令「lddf [%l1-256],f2」及び「lddf [%l1-128],f2」は、通常のロード命令を使用してもよい。なお、ここでcontactの指定方法は任意であり、特にパラメータの指定方法や表記は限定しない。例えば、明示的に書き込むキャッシュライン数を１固定にした指定形式「!ocl contact(A(i,j),(-n))」でもよい。その場合、上記に示した「!ocl contact(A(i,j),(-2),2)」は、例えば「!ocl contact(A(i,j),(-2))」及び「!ocl contact(A(i,j),(-1))」の指定と同値となる。またlddfはメモリからデータを取り出す命令であれば特に限定しない。
【００６０】
図６は図１のハードウェアプリフェッチ回路２７の構成例を示す図であり、図７は演算処理装置１１の制御方法を示すフローチャートである。時刻ｔ１〜ｔ３は、それぞれ時間経過に伴う処理を示す。
【００６１】
ステップＳ７０１では、演算処理装置１１は、アセンブリ言語２０２に対応する機械語の命令を入力して実行する。命令発行制御部２６は、アセンブリ言語２０２の命令「hpf_start #p-1,#q」が入力されると、レジスタ４１にキャッシュミス回数ｐの値を設定し、レジスタ４２にプリフェッチ位置ｑの値を設定する。レジスタ４１のキャッシュミス回数ｐの初期値は２である。レジスタ４２にプリフェッチ位置ｑの初期値は１である。
【００６２】
次に、ステップＳ７０２では、ハードウェアプリフェッチ回路２７は、一次オペランドキャッシュメモリ２９にキャッシュミスが発生した場合には、キャッシュミスバッファ４９にキャッシュミスしたキャッシュラインの番号を登録する。例えば、時刻ｔ１において、キャッシュライン番号Ａのキャッシュラインがキャッシュミスした場合、キャッシュミスバッファ４９にキャッシュミスしたキャッシュライン番号Ａを登録する。
【００６３】
キャッシュミスカウンタ４４は、キャッシュライン番号ｉ毎にカウント値ｃｎｔ（ｉ）を記憶する。ハードウェアプリフェッチ回路２７は、キャッシュラインカウンタ４４において、キャッシュミスしたキャッシュライン番号Ａのカウント値ｃｎｔ（Ａ）に１を設定する。キャッシュミスカウンタ４４のカウント値ｃｎｔ（Ａ）は、キャッシュライン番号Ａがキャッシュミスバッファ４９から削除された場合に０にクリアされる。
【００６４】
次に、ステップＳ７０３では、比較回路４５は、レジスタ４１のキャッシュミス回数ｐ及びキャッシュミスカウンタ４４のカウント値ｃｎｔ（ｉ）を基に、キャッシュメモリのアドレスが連続するｐ個のキャッシュラインでキャッシュミスが発生したか否かをチェックする。ｐが２の場合、ｐ（＝２）個のキャッシュラインでキャッシュミスが発生していないので、比較回路４５はプリフェッチを指示しない。その後、ステップＳ７０４及びＳ７０５をバイパスし、ステップＳ７０１において次の命令を実行する。
【００６５】
次に、時刻ｔ２において、ハードウェアプリフェッチ回路２７は、キャッシュライン番号Ａ＋１のキャッシュラインがキャッシュミスした場合、キャッシュミスバッファ４９にキャッシュミスしたキャッシュライン番号Ａ＋１を登録する（ステップＳ７０２）。そして、ハードウェアプリフェッチ回路２７は、キャッシュラインカウンタ４４において、キャッシュミスしたキャッシュライン番号Ａ＋１のカウント値ｃｎｔ（Ａ＋１）に１を設定する。
【００６６】
次に、比較回路４５は、レジスタ４１のキャッシュミス回数ｐ及びキャッシュミスカウンタ４４のカウント値ｃｎｔ（ｉ）を基に、キャッシュメモリのアドレスが連続するｐ個のキャッシュラインでキャッシュミスが発生したか否かをチェックする。ｐが２の場合、連続するｐ（＝２）個のキャッシュライン番号Ａ及びＡ＋１でキャッシュミスが発生しているので、比較回路４５はプリフェッチを指示する。
【００６７】
次に、ステップＳ７０４では、ハードウェアプリフェッチ回路２７は、比較回路４５によりプリフェッチを指示されると、キャッシュミスしたキャッシュライン番号Ａ＋１に対してレジスタ４２のプリフェッチ位置ｑ（＝１）を加算し、キャッシュライン番号Ａ＋２をプリフェッチキュー４３に登録する。
【００６８】
次に、ステップＳ７０５では、ハードウェアプリフェッチ回路２７は、プリフェッチキュー４３内のキャッシュライン番号Ａ＋２のプリフェッチを発行部４６により発行し、プリフェッチ処理を開始する。その後、ハードウェアプリフェッチ回路２７は、プリフェッチキュー４３内のキャッシュライン番号Ａ＋２を削除する。その後、ステップＳ７０１において次の命令を実行する。
【００６９】
次に、時刻ｔ３において、キャッシュライン番号Ａ＋２のアクセス要求が発行されると、ハードウェアプリフェッチ回路２７は、キャッシュライン番号Ａ＋２のプリフェッチが完了していないので、キャッシュライン番号Ａ＋２のキャッシュラインがキャッシュミスし、キャッシュミスバッファ４９にキャッシュミスしたキャッシュライン番号Ａ＋２を登録する（ステップＳ７０２）。そして、ハードウェアプリフェッチ回路２７は、キャッシュラインカウンタ４４において、キャッシュミスしたキャッシュライン番号Ａ＋２のカウント値ｃｎｔ（Ａ＋２）に１を設定する。
【００７０】
次に、比較回路４５は、レジスタ４１のキャッシュミス回数ｐ及びキャッシュミスカウンタ４４のカウント値ｃｎｔ（ｉ）を基に、キャッシュメモリのアドレスが連続するｐ個のキャッシュラインでキャッシュミスが発生したか否かをチェックする。ｐが２の場合、連続するｐ（＝２）個のキャッシュライン番号Ａ＋１及びＡ＋２でキャッシュミスが発生しているので、比較回路４５はプリフェッチを指示する。
【００７１】
次に、ステップＳ７０４では、ハードウェアプリフェッチ回路２７は、比較回路４５によりプリフェッチを指示されると、キャッシュミスしたキャッシュライン番号Ａ＋２に対してレジスタ４２のプリフェッチ位置ｑ（＝１）を加算し、キャッシュライン番号Ａ＋３をプリフェッチキュー４３に登録する。
【００７２】
次に、ステップＳ７０５では、ハードウェアプリフェッチ回路２７は、プリフェッチキュー４３内のキャッシュライン番号Ａ＋３のプリフェッチを発行部４６により発行し、プリフェッチ処理を開始する。その後、ハードウェアプリフェッチ回路２７は、プリフェッチキュー４３内のキャッシュライン番号Ａ＋３を削除する。
【００７３】
なお、上記では、キャッシュミスバッファ４９にキャッシュライン番号Ａ、Ａ＋１、Ａ＋２の昇順で登録される場合を例に説明したが、降順の場合にも対応することができる。キャッシュミスバッファ４９にキャッシュライン番号Ａ、Ａ−１が登録された場合には、次回、キャッシュライン番号Ａ−２をプリフェッチキュー４３に登録すればよい。
【００７４】
図８（Ａ）は、キャッシュミス回数ｐが２（初期値）であり、プリフェッチ位置ｑが１（初期値）である場合のリードアドレス及びプリフェッチアドレスを示す図である。リードアドレスがキャッシュライン番号Ａの場合、キャッシュライン番号Ａの１回のキャッシュミスであるので、プリフェッチは行われない。次に、リードアドレスがキャッシュライン番号Ａ＋１の場合、キャッシュライン番号Ａ及びＡ＋１のｐ（＝２）回のキャッシュミスが連続するので、キャッシュミスしたキャッシュライン番号Ａ＋１に対してプリフェッチ位置ｑ（＝１）を加算したキャッシュライン番号Ａ＋２のプリフェッチが行われる。次に、キャッシュライン番号Ａ＋２のキャッシュミスが発生すると、同様に、キャッシュライン番号Ａ＋３のプリフェッチが行われる。次に、キャッシュライン番号Ａ＋３のキャッシュミスが発生すると、同様に、キャッシュライン番号Ａ＋４のプリフェッチが行われる。
【００７５】
図８（Ｂ）は、キャッシュミス回数ｐが１であり、プリフェッチ位置ｑがｘである場合のリードアドレス及びプリフェッチアドレスを示す図である。リードアドレスがキャッシュライン番号Ａの場合、キャッシュライン番号Ａのｐ（＝１）回のキャッシュミスが発生するので、キャッシュミスしたキャッシュライン番号Ａに対してプリフェッチ位置ｑ（＝ｘ）を加算したキャッシュライン番号Ａ＋ｘのプリフェッチが行われる。次に、キャッシュライン番号Ａ＋１のキャッシュミスが発生すると、同様に、キャッシュライン番号Ａ＋１＋ｘのプリフェッチが行われる。次に、キャッシュライン番号Ａ＋２のキャッシュミスが発生すると、同様に、キャッシュライン番号Ａ＋２＋ｘのプリフェッチが行われる。次に、キャッシュライン番号Ａ＋３のキャッシュミスが発生すると、同様に、キャッシュライン番号Ａ＋３＋ｘのプリフェッチが行われる。
【００７６】
図９（Ａ）は、図６のキャッシュミスバッファ４９、キャッシュミスカウンタ４４及びプリフェッチキュー４３を示す図である。キャッシュミスバッファ４９には、キャッシュミスしたキャッシュライン番号が登録される。キャッシュミスカウンタ４４は、キャッシュライン番号ｉ及びカウント値ｃｎｔ（ｉ）のすべての組みを有し、カウント値ｃｎｔ（ｉ）の初期値が０であり、キャッシュミスバッファ４９に登録されたキャッシュライン番号ｉのカウント値ｃｎｔ（ｉ）が１になる。キャッシュライン空き個数ｒの初期値は０である。その場合、キャッシュミスカウンタ４４のキャッシュライン番号２及び３のカウント値ｃｎｔ（２）及びｃｎｔ（３）が共に１になっているので、ｐ（＝２）回連続するキャッシュラインでキャッシュミスが発生したと判断し、ｑ＝１の場合、プリフェッチキュー４３にキャッシュライン番号４（＝３＋１）を登録する。同様に、キャッシュミスカウンタ４４のカウント値ｃｎｔ（３）及びｃｎｔ（４）が共に１になっているので、ｐ（＝２）回連続するキャッシュラインでキャッシュミスが発生したと判断し、プリフェッチキュー４３にキャッシュライン番号５（＝４＋１）を登録する。
【００７７】
図９（Ｂ）は、プリフェッチキュー４３の登録処理を示すフローチャートである。まず、昇順でアクセスする例を説明する。ステップＳ９０１では、ハードウェアプリフェッチ回路２７は、キャッシュミスバッファ４９に登録したキャッシュライン番号ｉについて、直前のキャッシュミスカウンタ４４のカウント値ｃｎｔ（ｉ−１）が１であるか否かをチェックする。１である場合にはステップＳ９０２へ進む。ステップＳ９０２では、ハードウェアプリフェッチ回路２７は、キャッシュライン番号ｉにプリフェッチ位置ｑ（＝１）を加算したキャッシュライン番号ｉ＋１をプリフェッチキュー４３に登録する。
【００７８】
次に、降順でアクセスする例を説明する。ステップＳ９０１では、ハードウェアプリフェッチ回路２７は、キャッシュミスバッファ４９に登録したキャッシュライン番号ｉについて、直後のキャッシュミスカウンタ４４のカウント値ｃｎｔ（ｉ＋１）が１であるか否かをチェックする。１である場合にはステップＳ９０２へ進む。ステップＳ９０２では、ハードウェアプリフェッチ回路２７は、キャッシュライン番号ｉにプリフェッチ位置ｑ（＝１）を減算したキャッシュライン番号ｉ−１をプリフェッチキュー４３に登録する。
【００７９】
なお、プリフェッチキュー４３は、一つに限らず複数用意してもよい。その場合は、同時に複数のデータストリームのアクセスに対してハードウェアプリフェッチ回路２７によるプリフェッチ処理が実行される。
【００８０】
また、図３（Ａ）のプリフェッチ停止命令「hpf_stop」が実行されると、ハードウェアプリフェッチ回路２７は、直ちに発行部４６を停止させ、プリフェッチキュー４３のキャッシュライン番号を削除する。これにより、ハードウェアプリフェッチを停止させることができる。
【００８１】
図１０は、図９（Ａ）に対応し、キャッシュライン空き個数ｒが１の場合の処理例を示す図である。図４（Ａ）のキャッシュライン空き数指定命令「hpf_range #r」が実行されると、ハードウェアプリフェッチ回路２７は、図６のレジスタ５１にキャッシュライン空き個数ｒを格納する。図６のチェック部５５は、連続するｐ（＝２）個のキャッシュラインの中にｒ（＝１）個のキャッシュラインの空きがあっても、連続するｐ個のキャッシュラインでキャッシュミスが発生したと判断し、プリフェッチキュー４３への登録を行う。例えば、キャッシュライン番号５がアクセスされなかった場合、連続するｐ（＝２）個のキャッシュライン番号４及び５の中にｒ（＝１）個のキャッシュライン番号５の空きがあっても、キャッシュライン番号５にプリフェッチ位置ｑ（＝１）を加算したキャッシュライン番号６（＝５＋１）をプリフェッチキュー４３に登録する。また、キャッシュライン番号６のキャッシュミスが発生した場合、連続するｐ（＝２）個のキャッシュライン番号５及び６の中にｒ（＝１）個のキャッシュライン番号５の空きがあっても、キャッシュライン番号６にプリフェッチ位置ｑ（＝１）を加算したキャッシュライン番号７（＝６＋１）をプリフェッチキュー４３に登録する。
【００８２】
図１１は、図６のチェック部５５の処理を示すフローチャートである。ステップＳ１１０１では、チェック部５５は、昇順アクセスの場合、現在ハードウェアプリフェッチ発行中のキャッシュライン番号ｉのデータストリームについて、直前のキャッシュミスカウンタ４４のカウント値ｃｎｔ（ｉ−１）が１であるか否かをチェックする。降順アクセスの場合、チェック部５５は、直後のキャッシュミスカウンタ４４のカウント値ｃｎｔ（ｉ＋１）が１であるか否かをチェックする。ステップＳ１１０２において、１である場合にはステップＳ１１０６に進み、０である場合にはステップＳ１１０３に進む。
【００８３】
ステップＳ１１０３では、チェック部５５は、キャッシュミスカウンタ４４のキャッシュライン番号ｉについて、直前のキャッシュライン番号ｉ−１からレジスタ５１の空き個数ｒを減算した番号ｉ−１−ｒのカウント値ｃｎｔ（ｉ−１−ｒ）が１であるか否かをチェックする。ステップＳ１１０４において、１である場合にはステップＳ１１０５に進み、０である場合にはステップＳ１１０６に進む。
【００８４】
ステップＳ１１０５では、チェック部５５は、連続するｐ（＝２）個のキャッシュラインの中にｒ（＝１）個のキャッシュラインの空きがあると判断し、キャッシュライン番号ｉ＋１−ｋ（ｋ＝ｒ，ｒ−１，・・・，０）のｒ＋１個をプリフェッチキュー４３に追加登録する。その後、ステップＳ１１０３の処理に戻る。
【００８５】
ステップＳ１１０６では、ハードウェアプリフェッチ回路２７は、ハードウェアプリフェッチを継続する。ステップＳ１１０７では、ハードウェアプリフェッチ回路２７は、プリフェッチキュー４３が空になれば、ハードウェアプリフェッチを停止する。
【００８６】
図１２は、図２（Ａ）〜図５（Ａ）のソースプログラム２０１，３０１，４０１，５０１の生成方法を示すフローチャートである。ステップＳ１２０１では、ユーザは、コンピュータ１２００を用いて、デバッガ、プロファイル又はｗｒｉｔｅ文などにより、長時間を費やす高コストループ処理の箇所を突き止める。次に、ステップＳ１２０２では、ユーザは、コンピュータ１２００を用いて、デバッガ又はプロファイルツールなどを使用し、高コストループ処理内で下記の（１）又は（２）の対象箇所を検出する。
【００８７】
（１）連続域のデータアクセスが微小区間で歯抜けで途切れている。
（２）連続域のデータアクセスが発生及び／又は終了している。
【００８８】
次に、ステップＳ１２０３では、ユーザが対象箇所を特定した場合には、ステップＳ１２０４に進む。ステップＳ１２０４では、ユーザは、ソースプログラム２０１，３０１，４０１又は５０１内の対象箇所にｏｃｌ文を記述する。次に、ステップＳ１２０５では、ユーザは、コンピュータ１２００を用いて、コンパイラによりソースプログラム２０１，３０１，４０１又は５０１を機械語に変換する。機械語は、メインメモリに格納される。次に、ステップＳ１２０６では、演算処理装置１１は、メインメモリ内の機械語を入力して実行する。
【００８９】
図１９は、図１２のコンピュータ１２００のハードウェア構成例を示す図である。バス１９０１には、中央処理装置（ＣＰＵ）１９０２、ＲＯＭ１９０３、ＲＡＭ１９０４、ネットワークインタフェース１９０５、入力装置１９０６、出力装置１９０７及び外部記憶装置１９０８が接続されている。ＣＰＵ１９０２は、データの処理又は演算を行うと共に、バス１９０１を介して接続された各種構成要素を制御するものである。ＲＯＭ１９０３には、予めＣＰＵ１９０２の制御手順（コンピュータプログラム）を記憶させておき、このコンピュータプログラムをＣＰＵ１９０２が実行することにより、起動する。外部記憶装置１９０８にコンピュータプログラムが記憶されており、そのコンピュータプログラムがＲＡＭ１９０４にコピーされて実行される。ＲＡＭ１９０４は、データの入出力、送受信のためのワークメモリ、各構成要素の制御のための一時記憶として用いられる。外部記憶装置１９０８は、例えばハードディスク記憶装置やＣＤ−ＲＯＭ等であり、電源を切っても記憶内容が消えない。ＣＰＵ１９０２は、ＲＡＭ１９０４内のコンピュータプログラムを実行することにより処理を行う。ネットワークインタフェース１９０５は、インターネット等のネットワークに接続するためのインタフェースである。入力装置１９０６は、例えばキーボード及びマウス等であり、各種指定又は入力等を行うことができる。出力装置１９０７は、ディスプレイ及びプリンタ等である。
【００９０】
図１３は、コンパイラ１３０２の機能構成図である。コンパイラ１３０２は、コンパイラのプログラムを図１９のコンピュータに実行させることにより処理する。コンパイラ１３０２は、パーサー部７６、中間コード変換部７８、最適化部６８及びコード生成部９０を有し、ソースプログラム１３０１を入力し、機械語プログラム９２及びチューニング情報９２を出力する。最適化部６８は、命令挿入部８６を有する。
【００９１】
ソースプログラム１３０１は、図２（Ａ）〜図５（Ａ）のソースプログラム２０１，３０１，４０１，５０１に対応し、例えばＦＯＲＴＲＡＮ言語やＣ言語等の高級言語で記述されている。パーサー部７６は、ソースプログラム１３０１に対して、予約語（キーワード）等を抽出して字句解析する。中間コード変換部７８は、パーサー部７６から入力したソースプログラム１３０１の各ステートメントを一定規則に基づいて中間コードに変換する。ここで、中間コードは、典型的には、関数呼び出しの形式で表現されるコード（例えば、「+(int a, int b)」を示すコード；「整数ａに整数ｂを加算する」ことを示す。）である。ただし、中間コードには、このような関数呼び出し形式のコードだけでなく、演算処理装置１１の機械語命令も含まれる。中間コード変換部７８は、中間コードを生成する際にプロファイル情報１３０４を参照して、最適な中間コードを生成する。
【００９２】
最適化部６８は、中間コード変換部７８より出力された中間コードについて、命令結合、冗長除去、命令並べ替え、レジスタ割り付け等の処理を行うことにより、実行速度の向上やコードサイズの削減等を行う。命令挿入部８６は、プロファイル情報１３０４を参照し、図２（Ａ）〜図５（Ａ）のｏｃｌ文を挿入する。なお、最適化部６８は、キャッシュメモリ２９のキャッシュミスに関する情報など、ユーザがソースプログラム１３０１を再作成する際のヒントとなるチューニング情報９４を出力する。コード生成部９０は、最適化部６８から出力された中間コードに対して、内部に保持する変換テーブル等を参照することで、全てのコードを機械語命令に置き換えることで、機械語プログラム９２を生成する。
【００９３】
プロファイラ１３０３は、図１９のコンピュータがプロファイラのプログラムを実行することにより処理する。プロファイラ１３０３は、機械語プログラム９２を実行し、プロファイル情報１３０４を生成する。プロファイル情報１３０４の詳細は、後に図１４を参照しながら説明する。まず、コンパイラ１３０２は、ソースプログラム１３０１を機械語プログラム９２に変換する。次に、プロファイラ１３０３は、機械語プログラム９２を実行することにより、プロファイル情報１３０４を生成する。次に、コンパイラ１３０２は、プロファイル情報１３０４を参照し、ｏｃｌ文を挿入し、機械語ブログラム９２を生成する。次に、演算処理装置１１が機械語プログラム９２を実行する。
【００９４】
図１４は、図１３のプロファイラ１３０３の処理を示すフローチャートである。ステップＳ１４０１では、ユーザは、プロファイラ１３０３に対して、プロファイル情報取得の翻訳オプションを指定して、機械語プログラム９２を翻訳させる。ステップＳ１４０２では、プロファイラ１３０３は、機械語プログラム９２の実行により、プロファイル情報１３０４を出力する。プロファイル情報１３０４は、ループ回数、実行ＰＣ（プログラムカウンタ）アドレス、ループ内の配列要素ごとのアクセスアドレス等を有する。なお、アクセスアドレスをトレースするとプロファイル情報１３０４のファイルの出力サイズが大きくなるので、直前のアクセスアドレスとの差分情報やアクセス属性（直前アクセスアドレスと連続するストリームを抽出）だけにして、プロファイル情報１３０４のファイルサイズを縮小してもよく、形式は特に限定しない。
【００９５】
プロファイル情報１３０４の内容は、例えばプロフィル情報１４０４又は１４０５である。プロファイル情報１４０４は、アクセスデータアドレスを有し、各アドレスに４バイトデータが記憶されている場合には４番地毎のアドレスにデータが記憶される。したがって、プロファイル情報１４０４は、「２０」番地から「２ｃ」番地までの連続するアドレスの４個のデータが順にアクセスされていることを示す。
【００９６】
プロファイル情報１４０５は、データストリームの先頭アドレス、アクセスする単位、属性、連続領域の長さ、アクセス回数、連続アクセスするストリームＩＤを有する。また、プロファイル情報１３０４は、キャッシュミス数をアクセスアドレスごとに集計してもよく、その他パフォーマンスカウンタのイベントや翻訳時の静的構文情報を組み合わせてもよい。
【００９７】
図１５は、図１３のコンパイラ１３０２の命令挿入部８６の処理を示すフローチャートであり、図２（Ａ）の命令「hpf_start #p-1,#q」及び図３（Ａ）の命令「hpf_stop」の挿入処理を示す。プロファイル情報１３０４は、例えばプロファイル情報１５０５である。ステップＳ１５０１では、命令挿入部８６は、プロファイル情報１３０４を参照し、ソースプログラム内のループ処理のループ回数が第１の閾値より多く、かつループ処理により連続アクセスするデータの長さが第２の閾値より短いことの条件を満たすか否かをチェックする。ステップＳ１５０２において、条件を満たす場合にはステップＳ１５０３に進み、条件を満たさない場合には命令の挿入を行わずに処理を終了する。ステップＳ１５０３では、命令挿入部８６は、図１６（Ａ）及び（Ｂ）に示すように、データアクセス時間を短縮するため、対象ループ処理に対してユーザから翻訳オプションで指定されたキャッシュミス回数ｐ及びプリフェッチ位置ｑを命令「hpf_start #p-1,#q」に設定し、対象ループの直前に挿入する。同様に、命令挿入部８６は、命令「hpf_stop」を対象ループの直後に挿入する。
【００９８】
なお、上記の第１及び第２の閾値は、コンパイラ内部で持っても、ユーザが翻訳オプション等で外部からコンパイラに与えてもよい。また、対象ループは、コンパイラが選択したループのうちすべてを対象としてもよく、ユーザが翻訳オプション等で指定した数で指定された対象ループの上位だけに限定してもよい。また、ステップＳ１５０２における判断するデータとしては、上記の第１及び第２の閾値以外にもループの実行時間や、キャッシュミス数、その他パフォーマンスカウンタのイベントや翻訳時の静的構文情報をさらに追加、組み合わせてもよく、判定方法も上記に限定しない。また、同様にこれら閾値はコンパイラ内部で持っても、ユーザが翻訳オプション等で外部からコンパイラに与えてもよい。
【００９９】
図１６（Ａ）は、対象ループｎ及び対象ループｋに対して、それぞれ異なるキャッシュミス回数ｐ及びプリフェッチ位置ｑを指定する例を示す図である。対象ループｎの前には命令「hpf_start #p1-1,#q1」が挿入され、対象ループｎの後には命令「hpf_stop」が挿入される。また、対象ループｋの前には命令「hpf_start #p2-1,#q2」が挿入され、対象ループｎの後には命令「hpf_stop」が挿入される。
【０１００】
図１６（Ｂ）は、対象ループｎ及び対象ループｋ等に対して、相互に同じキャッシュミス回数ｐ及びプリフェッチ位置ｑを指定する例を示す図である。対象ループｎ及び対象ループｋ等の前には命令「hpf_start #p-1,#q」が挿入され、対象ループｎ及び対象ループｋ等の後には命令「hpf_stop」が挿入される。
【０１０１】
図１７は、図１３のコンパイラ１３０２の命令挿入部８６の処理を示すフローチャートであり、図４（Ａ）の命令「hpf_range #r」の挿入処理を示す。ステップＳ１７０１では、命令挿入部８６は、プロファイル情報１３０４を参照して、連続アクセスのデータストリームを、１つのデータストリームアクセスとしてハードウェアプリフェッチを結合できないかチェックする。プロファイル情報１３０４は、例えばプロファイル情報１７０５である。
【０１０２】
次に、ステップＳ１７０２では、命令挿入部８６は、次式により、データストリームｉ及びデータストリームｊの隙間のサイズをキャッシュラインのサイズＳＺに換算する。ここの例では、キャッシュラインのサイズは１２８とする。addr(j)はデータストリームｊの先頭アドレス、addr(i)はデータストリームｉの先頭アドレス、len(i)はデータストリームｉの長さ、len(j)はデータストリームｊの長さである。
ＳＺ＝｛addr(j)−（addr(i)＋len(i)）｝／１２８
【０１０３】
命令挿入部８６は、アドレスaddr(i)とアドレスaddr(j)＋len(j)の区間内で、アクセスID(i)からアクセスID(j)の間にて、他のデータストリームアクセスがない場合には、以下の処理を行う。その場合、命令挿入部８６は、ストリーム隙間ラインサイズＳＺがゼロの場合、データストリームｉ及びデータストリームｊを１つのデータストリームとみなしてそのままハードウェアプリフェッチ回路２７に任せるため、命令「hpf_range #r」を挿入しない。また、命令挿入部８６は、ストリーム隙間ラインサイズＳＺが１よりも大きい場合は、命令「hpf_range #r」に指定するキャッシュライン空き個数ｒに、求めたストリーム隙間ラインサイズＳＺを指定する。この場合、データストリームｉとデータストリームｊは、１つのデータストリームとみなすことができる。ｉ及びｊをすべてのデータストリーム間で検査する。
【０１０４】
例えば、プロファイル情報１７０５の場合では、ID1のデータストリーム（0x20から0x20+10までのストリーム)とID2のストリーム(0x30から0x38までのストリーム）は、６バイトの空き空間がある。しかも、ID1からID2までのアクセス間にアドレス範囲（0x20〜0x38）と重なるアクセスがない。したがって、ID1及びID2の２つのストリームアクセスを１つのストリームとみなすことができる。ストリームの隙間をキャッシュラインサイズに換算して１よりも大きい場合は、命令「hpf_range #r」に指定するキャッシュライン空き個数ｒに、ストリーム隙間ラインサイズＳＺに換算した値を指定する。このように、命令「hpf_range #r」のキャッシュライン空き個数ｒを任意に調整することができる。
【０１０５】
次に、ステップＳ１７０３では、命令挿入部８６は、対象となるストリームについて、ストリームｉのアクセス命令とストリームｊのアクセス命令の間でハードウェアプリフェッチを継続させるための命令「hpf_range #r」を挿入する。
【０１０６】
図１８は、図１３のコンパイラ１３０２の命令挿入部８６の処理を示すフローチャートであり、図５（Ａ）の命令「!ocl contact(A(i,j),(-n),k)」の展開処理を示す。ステップＳ１８０１では、命令挿入部８６は、「!ocl contact(A(i,j),(-n),k)」等で指定されたプリフェッチすべき変数アドレスを算出する。
【０１０７】
次に、ステップＳ１８０２では、命令挿入部８６は、次式により、事前プリフェッチすべきアドレス（指定された変数アドレスのキャッシュライン番号から１次元要素のｎ要素前のアクセスアドレス）addrを算出する。
addr＝[（ｉ−１−ｎ）＋（ｊ−１）×ｘ ｝×Ｌ
【０１０８】
ここで、ｉ及びｊ方向順にアクセスする配列Ａの配列サイズが（ｘ，ｙ）、要素サイズがＬである２次元配列Ａ（ｉ，ｊ）の場合、配列の先頭位置からの配列添字ｉ，ｊの相対位置は、｛（ｉ−１）＋（ｊ−１）×ｘ｝×Ｌで表現できる。なお、２次元配列と同様に、一次元及び３次元以上の配列にも同様に適用できる。
【０１０９】
次に、ステップＳ１８０３では、命令挿入部８６は、「!ocl contact(A(i,j),(-n),k)」でユーザ指定された位置に、２個目の引数の「−n」であり、また書き込ませるキャッシュラインの数は「k」であるため、n要素前の算出した上記で算出したプリフェッチアドレスaddrを指定したプリフェッチに相当する命令「lddf [%l1-256],f2」及び次のキャッシュラインアクセスとなる「lddf [%l1-128],f2」及び次々のキャッシュラインアクセスとなる「lddf [%l1],f2」…の機械語をk個展開する。
【０１１０】
本実施形態は、コンピュータがコンパイラ１３０２及びプロファイラ１３０３のプログラムを実行することによって実現することができる。また、上記のプログラムを記録したコンピュータ読み取り可能な記録媒体及び上記のプログラム等のコンピュータプログラムプロダクトも本発明の実施形態として適用することができる。記録媒体としては、例えばフレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、磁気テープ、不揮発性のメモリカード、ＲＯＭ等を用いることができる。
【０１１１】
なお、上記実施形態は、何れも本発明を実施するにあたっての具体化の例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、又はその主要な特徴から逸脱することなく、様々な形で実施することができる。
【符号の説明】
【０１１２】
１１  演算処理装置
２１  命令フェッチ部
２２  分岐予測部
２３  一次命令キャッシュメモリ
２４  命令バッファ
２５  命令デコーダ
２６  命令発行制御部
２７  ハードウェアプリフェッチ回路
２８  演算器
２９  一次オペランドキャッシュメモリ
３０  分岐制御部
３１  レジスタ
３２  命令完了制御部
３３  分岐履歴更新部
３４  二次キャッシュメモリ
３５  メモリコントローラ
【図１】
2015060529.tif 000003
【図２】
2015060529.tif 000004
【図３】
2015060529.tif 000005
【図４】
2015060529.tif 000006
【図５】
2015060529.tif 000007
【図６】
2015060529.tif 000008
【図７】
2015060529.tif 000009
【図８】
2015060529.tif 000010
【図９】
2015060529.tif 000011
【図１０】
2015060529.tif 000012
【図１１】
2015060529.tif 000013
【図１２】
2015060529.tif 000014
【図１３】
2015060529.tif 000015
【図１４】
2015060529.tif 000016
【図１５】
2015060529.tif 000017
【図１６】
2015060529.tif 000018
【図１７】
2015060529.tif 000019
【図１８】
2015060529.tif 000020
【図１９】
2015060529.tif 000021