図1は、本実施形態による演算処理装置11の構成例を示す図である。演算処理装置11は、例えば、プロセッサであり、命令のアウトオブオーダ実行やパイプライン処理の機能を有する。
命令フェッチステージでは、命令フェッチ部21、命令バッファ24、分岐予測部22、一次命令キャッシュメモリ23、及び二次キャッシュメモリ34等が動作する。命令フェッチ部21は、分岐予測部22からフェッチする命令の予測分岐先アドレス、分岐制御部30から分岐演算により確定した分岐先アドレス等を受け取る。命令フェッチ部21は、受け取った予測分岐先アドレス、分岐先アドレス、及び命令フェッチ部21内で作成した分岐しない場合にフェッチする命令の連続した次のアドレス等から、1つのアドレスを選択して次の命令フェッチアドレスを確定する。命令フェッチ部21は、確定した命令フェッチアドレスを一次命令キャッシュメモリ23に出力し、出力された確定後の命令フェッチアドレスに対応する命令コードをフェッチする。
一次命令キャッシュメモリ23は、二次キャッシュメモリ34の一部のデータを格納しているものであり、二次キャッシュメモリ34は、メモリコントローラ35を介してアクセス可能なメインメモリの一部のデータを格納しているものである。一次命令キャッシュメモリ23に該当するアドレスのデータが存在しない場合には二次キャッシュメモリ34からデータをフェッチし、二次キャッシュメモリ34に該当するデータが存在しない場合にはメインメモリからデータをフェッチする。本実施形態では、メインメモリは演算処理装置11の外部に配置しているため、外部にあるメインメモリとの入出力制御はメモリコントローラ35を介して行われる。一次命令キャッシュメモリ23や二次キャッシュメモリ34、メインメモリの該当するアドレスからフェッチされた命令コードは、命令バッファ24に格納される。
分岐予測部22は、命令フェッチ部21から出力された命令フェッチアドレスを受け取り、命令フェッチと並行して分岐予測を実行する。分岐予測部22は、受け取った命令フェッチアドレスを基に分岐予測を行い、分岐の成立又は不成立を示す分岐方向と予測分岐先アドレスとを命令フェッチ部21へ返す。命令フェッチ部21は、予測された分岐方向が成立であった場合には次の命令フェッチアドレスとして予測された分岐先アドレスを選択する。
命令発行ステージでは、命令デコーダ25及び命令発行制御部26が動作する。命令デコーダ25は、命令バッファ24から命令コードを受け取って命令の種別や必要な実行資源等を解析し、解析結果を命令発行制御部26に出力する。命令発行制御部26は、リザベーションステーションの構造を持つ。命令発行制御部26は、命令で参照するレジスタ等の依存関係を見て、依存関係のあるレジスタの更新状況や同じ実行資源を用いる命令の実行状況等から実行資源が命令を実行可能かどうかを判断する。命令発行制御部26は、実行資源が命令を実行可能であると判断した場合には、レジスタ番号やオペランドアドレス等の命令の実行に必要な情報を演算器26、ハードウェアプリフェッチ回路27及び一次オペランドキャッシュメモリ29等の実行資源に対して出力する。また、命令発行制御部26は、実行可能な状態になるまで命令を格納しておくバッファの機能も有する。
命令実行ステージでは、ハードウェアプリフェッチ回路27、演算器28、一次オペランドキャッシュメモリ(一次データキャッシュメモリ)29、及び分岐制御部30等の実行資源が動作する。演算器28は、レジスタ31や一次オペランドキャッシュメモリ29からデータを受け取り、四則演算、論理演算、三角関数演算、及びアドレス計算等の命令に対応した演算を実行し、演算結果をレジスタ31や一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29は、命令キャッシュメモリ23と同様に、二次キャッシュメモリ34の一部のデータを記憶可能である。一次オペランドキャッシュメモリ29は、ロード命令によるメインメモリから演算器28やレジスタ31へのデータのロードや、ストア命令による演算器28やレジスタ31からメインメモリへのデータのストア等に用いられる。二次キャッシュメモリ34は、メモリコントローラ35を介してアクセス可能なメインメモリの一部のデータを格納しているものである。一次オペランドキャッシュメモリ29に該当するアドレスのデータが存在しない場合には二次キャッシュメモリ34からデータをフェッチし、二次キャッシュメモリ34に該当するデータが存在しない場合にはメインメモリからデータをフェッチする。ハードウェアプリフェッチ回路27は、一次オペランドキャッシュメモリ29で連続するアドレスでp(pは自然数)回連続してキャッシュミスが発生すると、キャッシュミスした後のデータを二次キャッシュメモリ34又はメインメモリから一次オペランドキャッシュメモリ29にプリフェッチする。すなわち、ハードウェアプリフェッチ回路27は、メインメモリ上の連続するアドレスのデータをアクセスする場合には、将来アクセスするデータを予め二次キャッシュメモリ34又はメインメモリから一次オペランドキャッシュメモリ29にプリフェッチしておく。これにより、データのアクセス時間を短縮することができる。各実行資源は、命令実行の完了通知を命令完了制御部32へ出力する。なお、ハードウェアプリフェッチ回路27は、一次キャッシュメモリに限定するものでなく、同様にメモリから二次キャッシュ、三次キャッシュ以降の将来アクセスするデータをプリフェッチする制御を含む。
分岐制御部30は、命令デコーダ25から分岐命令の種別を受け取り、演算器28から分岐先アドレスや分岐条件となる演算の結果を受け取って、演算結果が分岐条件を満たしていれば分岐成立、満たしていなければ分岐不成立の判断を行い、分岐方向を確定する。また、分岐制御部30は、演算結果と分岐予測時の分岐先アドレスと分岐方向が一致するかどうかの判断や、分岐命令の順序関係の制御も行う。分岐制御部30は、演算結果と予測とが一致した場合には命令完了制御部32へ分岐命令の完了通知を出力する。一方、演算結果と予測とが一致しなかった場合には分岐予測失敗を意味するので、分岐制御部30は、命令完了制御部32へ分岐命令の完了通知とともに後続命令のキャンセル及び再命令フェッチ要求を命令フェッチ部21に出力する。
命令完了ステージでは、命令完了制御部32、レジスタ31、及び分岐履歴更新部33が動作する。命令完了制御部32は、命令の各実行資源から受け取った完了通知を基に、コミットスタックエントリに格納された命令コード順に命令完了処理を行い、レジスタ31の更新指示を出力する。レジスタ31は、命令完了制御部32からレジスタ更新指示を受け取ると、演算器28や一次オペランドキャッシュメモリ29から受け取る演算結果のデータを基にレジスタの更新を実行する。分岐履歴更新部33は、分岐制御部30から受け取る分岐演算の結果を基に分岐予測の履歴更新データを作成し、分岐予測部22に出力する。
図2(A)は図1の演算処理装置11が実行するソースプログラム201及びそれに対応するアセンブリ言語202を示す図であり、図2(B)は演算処理装置11の一次オペランドキャッシュメモリ29を示す図である。一次オペランドキャッシュメモリ29は、複数のキャッシュラインCL1〜CL3等を有する。各キャッシュラインCL1〜CL3等は、それぞれ例えば16個のデータを記憶することができ、キャッシュラインCL1〜CL3等単位で二次キャッシュメモリ34又はメインメモリのデータを記憶する。ソースプログラム201は、FORTRAN言語の例を示す。まず、「!ocl hpf_warm(0,1)」の命令がない場合を説明する。変数i及びjのループ処理により、「X=A(i,j)+X」の命令が実行される。100個の配列A(1,1)〜A(100,1)のデータは、メインメモリ内の100個の連続するアドレスに記憶されている。なお、本実施形態は、C,FORTRAN等の言語によらないため、以降では、例としてFORTRANで説明する。そのため以降のFORTRANの説明では、oclによるソース記述指定で説明しているが、他言語では、例えばC言語では#pragmaに置き換えてもよい。またハードウェア命令の表記、そのフォーマット、さらにソース記述子oclの記述名、記述形式は上記例に限定せずに任意に変更可能である。
まず、変数j=1及び変数i=1が設定され、命令発行制御部26は、配列A(1,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。最初、一次オペランドキャッシュメモリ29には配列A(1,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(1,1)を含む16個の連続するアドレスの配列A(1,1)〜A(16,1)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL1に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(1,1)のデータを入力し、「X=A(1,1)+X」の命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(2,1)〜A(16,1)のデータを入力し、「X=A(i,j)+X」の命令を実行する。
次に、変数j=1及び変数i=17が設定され、命令発行制御部26は、配列A(17,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29には配列A(17,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(17,1)を含む16個の連続するアドレスの配列A(17,1)〜A(32,1)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL2に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(17,1)のデータを入力し、「X=A(17,1)+X」の命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(18,1)〜A(32,1)のデータを入力し、「X=A(i,j)+X」の命令を実行する。
ここで、ハードウェアプリフェッチ回路27は、アドレスが連続する2個のキャッシュラインCL1及びCL2でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインCL1及びCL2の後のキャッシュラインCL3に16個の配列A(33,1)〜A(48,1)のデータのプリフェッチ処理を開始する。
次に、変数j=1及び変数i=33が設定され、命令発行制御部26は、配列A(33,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。この場合もキャッシュミスするが、その直後に、一次オペランドキャッシュメモリ29のキャッシュラインCL3にはメインメモリの配列A(33,1)〜A(48,1)のデータが上記のプリフェッチにより書き込まれるので、演算器28は、一次オペランドキャッシュメモリ29から配列A(33,1)のデータを入力し、「X=A(33,1)+X」の命令を実行する。上記のプリフェッチにより、一次オペランドキャッシュメモリ29には配列A(33,1) 〜A(48,1)のデータが書き込まれるので、データアクセス時間を短縮することができる。また、上記と同様に、ハードウェアプリフェッチ回路27は、後のキャッシュラインCL4に16個の配列A(49,1)〜A(64,1)のデータをプリフェッチする。以上の動作を繰り返す。
上記のように、ハードウェアプリフェッチ回路27は、アドレスが連続する2個のキャッシュラインCL1及びCL2でキャッシュミスが発生すると、プリフェッチする。上記の2個の値をソフトウェアのキャッシュミス回数指定命令「!ocl hpf_warm(0,1)」により変更可能にすることにより、データアクセス時間をさらに短縮する。
ハードウェアプリフェッチ回路27は、一次オペランドキャッシュメモリ29のアドレスが連続するp個のキャッシュラインでキャッシュミスが発生すると、キャッシュミスしたキャッシュラインの後のキャッシュラインにデータをプリフェッチする。「!ocl hpf_warm(p-1,1)」の命令により、pの値を変更することができる。例えば、「!ocl hpf_warm(0,1)」の命令は、1個目の引数が「0」であるので、p=1に設定される。
この場合、まず、変数j=1及び変数i=1が設定され、命令発行制御部26は、配列A(1,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。最初、一次オペランドキャッシュメモリ29には配列A(1,1)のデータが存在しないので、キャッシュミスする。
すると、ハードウェアプリフェッチ回路27は、アドレスが連続するp(=1)個のキャッシュラインCL1でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインCL1の後のキャッシュラインCL2に16個の配列A(17,1)〜A(32,1)のデータをプリフェッチする。以降、同様に、ハードウェアプリフェッチ回路27は、順次、キャッシュラインCL3以降もプリフェッチする。連続してアクセスする配列A(i,j)のデータ長が17個以上であることが分かっている場合には、「!ocl hpf_warm(p-1,1)」の命令によりp=1に設定すれば、データアクセス時間をさらに短縮することができる。
また、ハードウェアプリフェッチ回路27は、上記のように、キャッシュミスしたキャッシュラインCL1の1個後のキャッシュラインCL2にデータをプリフェッチする。上記の1個の値をソフトウェアのプリフェッチ位置指定命令「!ocl hpf_warm(0,1)」により変更可能にすることにより、データアクセス時間の最適化を図ることができる。
ハードウェアプリフェッチ回路27は、キャッシュミスしたキャッシュラインCL1のq個後のキャッシュラインにデータをプリフェッチする。「!ocl hpf_warm(p-1,q)」の命令により、qの値を変更することができる。例えば、「!ocl hpf_warm(0,1)」の命令は、2個目の引数が「1」であるので、q=1に設定される。
例えば、p=1及びq=1の場合、ハードウェアプリフェッチ回路27は、キャッシュミスしたキャッシュラインCL1の1個後のキャッシュラインCL2にデータをプリフェッチし、その後、キャッシュラインCL3以降にもデータをプリフェッチする。p=1及びq=2の場合、ハードウェアプリフェッチ回路27は、キャッシュミスしたキャッシュラインCL1の2個後のキャッシュラインCL3にデータをプリフェッチし、その後、キャッシュラインCL4以降にもデータをプリフェッチする。
ソースプログラム201は、コンピュータのコンパイラにより、アセンブリ言語202に対応する機械語に変換される。ソースプログラム201の「!ocl hpf_warm(p-1,q)」は、アセンブリ言語202の「hpf_start #p-1,#q」に変換される。例えば、p=1、q=1である。演算処理装置11は、「hpf_start #p-1,#q」に対応する機械語を入力すると、ハードウェアプリフェッチ回路27のp及びqの値を設定することができる。具体的には、命令発行制御部26は、「hpf_start #p-1,#q」に対応する機械語を入力すると、ハードウェアプリフェッチ回路27のp個の値及びq個の値を変更する。なお、ハードウェアプリフェッチ回路27は、pの初期値が2であり、qの初期値が1である。
図3(A)は図1の演算処理装置11が実行するソースプログラム301及びそれに対応するアセンブリ言語302を示す図であり、図3(B)は演算処理装置11の一次オペランドキャッシュメモリ29を示す図である。一次オペランドキャッシュメモリ29は、複数のキャッシュラインCL1〜CL3,CL11〜CL13等を有する。ソースプログラム301は、FORTRAN言語の例を示す。まず、「!ocl hpf_stop」の命令がない場合を説明する。例えば、p=2、q=1である。
まず、変数j=1及び変数i=1が設定され、命令発行制御部26は、配列A(1,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。最初、一次オペランドキャッシュメモリ29には配列A(1,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(1,1)を含む16個の連続するアドレスの配列A(1,1)〜A(16,1)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL1に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(1,1)のデータを入力し、「X=A(1,1)+X」の命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(2,1)〜A(16,1)のデータを入力し、「X=A(i,j)+X」の命令を実行する。
次に、変数j=1及び変数i=17が設定され、命令発行制御部26は、配列A(17,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29には配列A(17,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(17,1)を含む16個の連続するアドレスの配列A(17,1)〜A(32,1)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL2に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(17,1)のデータを入力し、「X=A(17,1)+X」の命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(18,1)のデータを入力し、「X=A(18,1)+X」の命令を実行する。
ここで、ハードウェアプリフェッチ回路27は、アドレスが連続するp(=2)個のキャッシュラインCL1及びCL2でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインCL1及びCL2の後のキャッシュラインCL3に16個の配列A(33,1)〜A(48,1)のデータをプリフェッチする。しかし、変数iは、1〜18の範囲で変化するので、配列A(1,1)〜A(18,1)のデータのアクセスのみ行われ、キャッシュラインCL3の16個の配列A(33,1)〜A(48,1)のデータのプリフェッチは無駄である。
その後、変数j=2及び変数i=1が設定され、命令発行制御部26は、配列A(1,2)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29には配列A(1,2)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(1,2)を含む16個の連続するアドレスの配列A(1,2)〜A(16,2)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL11に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(1,2)のデータを入力し、「X=A(1,2)+X」の命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(2,2)〜A(16,2)のデータを入力し、「X=A(i,j)+X」の命令を実行する。
次に、変数j=2及び変数i=17が設定され、命令発行制御部26は、配列A(17,2)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29には配列A(17,2)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(17,2)を含む16個の連続するアドレスの配列A(17,2)〜A(32,2)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL12に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(17,2)のデータを入力し、「X=A(17,2)+X」の命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(18,2)のデータを入力し、「X=A(18,2)+X」の命令を実行する。
ここで、ハードウェアプリフェッチ回路27は、アドレスが連続するp(=2)個のキャッシュラインCL11及びCL12でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインCL11及びCL12の後のキャッシュラインCL13に16個の配列A(33,2)〜A(48,2)のデータをプリフェッチする。しかし、変数iは、1〜18の範囲で変化するので、配列A(1,2)〜A(18,2)のデータのアクセスのみ行われ、キャッシュラインCL13の16個の配列A(33,2)〜A(48,2)のデータのプリフェッチは無駄である。
プリフェッチ停止命令「!ocl hpf_stop」は、ハードウェアプリフェッチ回路27によるプリフェッチを停止させることができる。変数iのループ処理の後に、プリフェッチ停止命令「!ocl hpf_stop」を置くことにより、変数iが18になった後、上記のキャッシュラインCL3及びCL13のプリフェッチを停止させることができる。仮に、キャッシュラインCL3及びCL13のプリフェッチの処理中に、停止が指示されても、プリフェッチ時間は比較的長いので、途中でプリフェッチを停止できることの効果は大きい。
ソースプログラム301は、コンピュータのコンパイラにより、アセンブリ言語302に対応する機械語に変換される。ソースプログラム301の「!ocl hpf_stop」は、アセンブリ言語302の「hpf_stop」に変換される。演算処理装置11は、「hpf_stop」に対応する機械語を入力すると、ハードウェアプリフェッチ回路27によるプリフェッチを停止させる。具体的には、命令発行制御部26は、「hpf_stop」に対応する機械語を入力すると、ハードウェアプリフェッチ回路27によるプリフェッチを停止させる。
図4(A)は図1の演算処理装置11が実行するソースプログラム401及びそれに対応するアセンブリ言語402を示す図であり、図4(B)は演算処理装置11の一次オペランドキャッシュメモリ29を示す図である。一次オペランドキャッシュメモリ29は、複数のキャッシュラインCL1〜CL6等を有する。ソースプログラム401は、FORTRAN言語の例を示す。まず、「!ocl hpf_range(1)」の命令がない場合を説明する。例えば、p=2、q=1である。また配列Aの一次元サイズは16とする。例えば、配列サイズの定義をA(16,8192)とする。またキャッシュライン長を一例としてここでは128バイトとする。すると、一次元サイズがキャッシュライン長(128=16*8)と等しいため、例ではA(16,1)からA(1,2)の二次元に配列アクセスが移行してもメモリアクセスのアドレスが連続となるケースとなる。
まず、変数j=1及び変数i=1が設定され、変数j(=1)を4で割った余りが1であり、0でないので、命令発行制御部26は、配列A(1,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29には配列A(1,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(1,1)を含む16個の連続するアドレスの配列A(1,1)〜A(16,1)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL1に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(1,1)のデータを入力し、配列A(1,1)を用いた命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(2,1)〜A(16,1)のデータを入力し、配列A(i,j)を用いた命令を実行する。
次に、変数j=2及び変数i=1が設定され、変数j(=2)を4で割った余りが2であり、0でないので、命令発行制御部26は、配列A(1,2)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29には配列A(1,2)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(1,2)を含む16個の連続するアドレスの配列A(1,2)〜A(16,2)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL2に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(1,2)のデータを入力し、配列A(1,2)を用いた命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(2,2)〜A(16,2)のデータを入力し、配列A(i,j)を用いた命令を実行する。
CL1とCL2のキャッシュラインに格納されている配列のメモリアドレスは連続する。そのため、ハードウェアプリフェッチ回路27は、アドレスが連続するp(=2)個のキャッシュラインCL1及びCL2でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインCL1及びCL2の後のキャッシュラインCL3に16個の配列A(1,3)〜A(16,3)のデータのプリフェッチ処理を開始する。
次に、変数j=3及び変数i=1が設定され、変数j(=3)を4で割った余りが3であり、0でないので、命令発行制御部26は、配列A(1,3)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。この場合もキャッシュミスするが、その直後に、一次オペランドキャッシュメモリ29のキャッシュラインCL3にはメインメモリの配列A(1,3)のデータが上記のプリフェッチにより書き込まれるので、演算器28は、一次オペランドキャッシュメモリ29から配列A(1,3)のデータを入力し、配列A(1,3)を用いた命令を実行する。上記のプリフェッチにより、データアクセス時間を短縮することができる。また、上記と同様に、ハードウェアプリフェッチ回路27は、後のキャッシュラインCL4に16個の配列A(1,4)〜A(16,4)のデータをプリフェッチする。
次に、変数j=4及び変数i=1が設定され、変数j(=4)を4で割った余りが0であるので、配列A(4,i)のアクセスは行われない。
次に、変数j=5及び変数i=1が設定され、変数j(=5)を4で割った余りが1であり、0でないので、命令発行制御部26は、配列A(1,5)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29には配列A(1,5)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(1,5)を含む16個の連続するアドレスの配列A(1,5)〜A(16,5)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL5に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(1,5)のデータを入力し、配列A(1,5)を用いた命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(2,5)〜A(16,5)のデータを入力し、配列A(i,j)を用いた命令を実行する。ここでハードウェアプリフェッチ回路27では、キャッシュミスしたキャッシュラインCL3とCL5はアドレスが連続したP(=2)個のキャッシュラインとならないため、この場合、ハードウェアプリフェッチ回路27は、停止し、キャッシュラインCL5のプリフェッチを行わない。
次に、変数j=6及び変数i=1が設定され、変数j(=6)を4で割った余りが2であり、0でないので、命令発行制御部26は、配列A(1,6)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29には配列A(1,6)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(1,6)を含む16個の連続するアドレスの配列A(1,6)〜A(16,6)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL6に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(1,6)のデータを入力し、配列A(1,6)を用いた命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(2,6)〜A(16,6)のデータを入力し、配列A(i,j)を用いた命令を実行する。
ここで、ハードウェアプリフェッチ回路27は、アドレスが連続するp(=2)個のキャッシュラインCL5及びCL6でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインCL5及びCL6の後のキャッシュラインCL7に16個の配列A(1,7)〜A(16,7)のデータをプリフェッチする。
以上のように、キャッシュラインCL4のデータがアクセスされない場合には、ハードウェアプリフェッチ回路27は、一旦停止してしまい、再び起動することになり、データアクセス時間が長くなってしまう。そこで、アドレスが連続するキャッシュラインCL1〜CL6中の1個のキャッシュラインCL4だけがアクセスされなかった場合にも、ハードウェアプリフェッチ回路27は、キャッシュラインCL1〜CL6が連続してアクセスされたものとして扱い、停止することなく、キャッシュラインCL3〜CL6等を連続してプリフェッチする。すなわち、ハードウェアプリフェッチ回路27は、連続するp個のキャッシュラインの中にr個のキャッシュラインの空きがあっても、連続するp個のキャッシュラインでキャッシュミスが発生したと判断する。図4(B)の場合、r=1である。これにより、ハードウェアプリフェッチ回路27の一旦停止及び再起動がなくなるので、データアクセス時間を短縮することができる。キャッシュライン空き数指定命令「!ocl hpf_range(r)」により、rの値を変更することができる。例えば、「!ocl hpf_range(1)」の命令は、引数が「1」であるので、r=1に設定される。
ソースプログラム401は、コンピュータのコンパイラにより、アセンブリ言語402に対応する機械語に変換される。ソースプログラム401の「!ocl hpf_range(r)」は、アセンブリ言語202の「hpf_range #r」に変換される。例えば、r=1である。演算処理装置11は、「hpf_range #r」に対応する機械語を入力すると、ハードウェアプリフェッチ回路27のr個の値を設定することができる。具体的には、命令発行制御部26は、「hpf_range #r」に対応する機械語を入力すると、ハードウェアプリフェッチ回路27のr個の値を変更する。なお、ハードウェアプリフェッチ回路27は、rの初期値が0である。
図5(A)は図1の演算処理装置11が実行するソースプログラム501及びそれに対応するアセンブリ言語502を示す図であり、図5(B)は演算処理装置11の一次オペランドキャッシュメモリ29を示す図である。一次オペランドキャッシュメモリ29は、複数のキャッシュラインCL1,CL2,CL9〜CL12等を有する。ソースプログラム501は、FORTRAN言語の例を示す。例えば、p=2、q=1である。
まず、変数j=1及び変数i=1が設定され、命令発行制御部26は、配列A(1,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29には配列A(1,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(1,1)を含む16個の連続するアドレスの配列A(1,1)〜A(16,1)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL1に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(1,1)のデータを入力し、「X=A(1,1)+X」の命令を実行する。以下、同様に、演算器28は、一次オペランドキャッシュメモリ29から配列A(2,1)〜A(16,1)のデータを入力し、「X=A(i,j)+X」の命令を実行する。
次に、変数j=1及び変数i=17が設定され、命令発行制御部26は、配列A(17,1)のデータ読み出しのリクエスト信号を一次オペランドキャッシュメモリ29に出力する。一次オペランドキャッシュメモリ29には配列A(17,1)のデータが存在しないので、キャッシュミスする。すると、二次キャッシュメモリ34又はメインメモリから配列A(17,1)を含む16個の連続するアドレスの配列A(17,1)〜A(32,1)のデータを読み出し、一次オペランドキャッシュメモリ29内のキャッシュラインCL2に書き込む。演算器28は、一次オペランドキャッシュメモリ29から配列A(17,1)のデータを入力し、「X=A(17,1)+X」の命令を実行する。
ここで、ハードウェアプリフェッチ回路27は、アドレスが連続するp(=2)個のキャッシュラインCL1及びCL2でキャッシュミスが発生すると、キャッシュミスしたキャッシュラインCL1及びCL2の後のキャッシュラインCL3に16個の配列A(33,1)〜A(48,1)のデータをプリフェッチする。
その後、変数j=2及び変数i=1が設定され、ダミーロード命令「!ocl contact(A(i,j),(-2),2)」が実行される。命令発行制御部26は、配列A(1,2)の2要素前のアドレスのデータをメインメモリから読み出して2個のキャッシュラインCL9及びCL10に書き込む。この際、2個のキャッシュラインCL9及びCL10はキャッシュミスするので、ハードウェアプリフェッチ回路27は、キャッシュラインCL11及びCL12に配列A(1,2)〜A(16,2)及び配列A(17,2)〜A(32,2)のデータを順次プリフェッチする。これにより、データアクセス時間を短縮することができる。以下、同様に、変数jの値が変更される毎に、ダミーロード命令「!ocl contact(A(i,j),(-2),2)」が実行され、配列A(1,j)〜A(16,j)及び配列A(17,j)〜A(32,j)のデータがキャッシュラインにプリフェッチされる。
ソースプログラム501は、コンピュータのコンパイラにより、アセンブリ言語502に対応する機械語に変換される。ソースプログラム501の「!ocl contact(A(i,j),(-2),2)」は、アセンブリ言語502の「lddf [%l1-256],f2」、「lddf [%l1-128],f2」に変換される。命令発行制御部26は、ダミーロード命令「lddf [%l1-256],f2」に対応する機械語を入力すると、配列A(i,j)の指定アドレスの2要素前のアドレスのデータを、ダミーロード命令「lddf [%l1-128],f2」に対応する機械語を入力すると、配列A(i,j)の指定アドレスの1要素前のアドレスのデータを、それぞれ一又は複数のキャッシュラインに書き込ませる。書き込ませる要素の相対位置は、ダミーロード命令「!ocl contact(A(i,j),(-2),2)」の2個目の引数の「−2」により指定することができる。書き込ませるキャッシュラインの数は、ダミーロード命令「!ocl contact(A(i,j),(-2),2)」の3個目の引数の「2」により指定することができる。本例では、2個のキャッシュラインCL9及びCL10に書き込ませる。ダミーロード命令「lddf [%l1-256],f2」及び「lddf [%l1-128],f2」は、通常のロード命令を使用してもよい。なお、ここでcontactの指定方法は任意であり、特にパラメータの指定方法や表記は限定しない。例えば、明示的に書き込むキャッシュライン数を1固定にした指定形式「!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はメモリからデータを取り出す命令であれば特に限定しない。
図6は図1のハードウェアプリフェッチ回路27の構成例を示す図であり、図7は演算処理装置11の制御方法を示すフローチャートである。時刻t1〜t3は、それぞれ時間経過に伴う処理を示す。
ステップS701では、演算処理装置11は、アセンブリ言語202に対応する機械語の命令を入力して実行する。命令発行制御部26は、アセンブリ言語202の命令「hpf_start #p-1,#q」が入力されると、レジスタ41にキャッシュミス回数pの値を設定し、レジスタ42にプリフェッチ位置qの値を設定する。レジスタ41のキャッシュミス回数pの初期値は2である。レジスタ42にプリフェッチ位置qの初期値は1である。
次に、ステップS702では、ハードウェアプリフェッチ回路27は、一次オペランドキャッシュメモリ29にキャッシュミスが発生した場合には、キャッシュミスバッファ49にキャッシュミスしたキャッシュラインの番号を登録する。例えば、時刻t1において、キャッシュライン番号Aのキャッシュラインがキャッシュミスした場合、キャッシュミスバッファ49にキャッシュミスしたキャッシュライン番号Aを登録する。
キャッシュミスカウンタ44は、キャッシュライン番号i毎にカウント値cnt(i)を記憶する。ハードウェアプリフェッチ回路27は、キャッシュラインカウンタ44において、キャッシュミスしたキャッシュライン番号Aのカウント値cnt(A)に1を設定する。キャッシュミスカウンタ44のカウント値cnt(A)は、キャッシュライン番号Aがキャッシュミスバッファ49から削除された場合に0にクリアされる。
次に、ステップS703では、比較回路45は、レジスタ41のキャッシュミス回数p及びキャッシュミスカウンタ44のカウント値cnt(i)を基に、キャッシュメモリのアドレスが連続するp個のキャッシュラインでキャッシュミスが発生したか否かをチェックする。pが2の場合、p(=2)個のキャッシュラインでキャッシュミスが発生していないので、比較回路45はプリフェッチを指示しない。その後、ステップS704及びS705をバイパスし、ステップS701において次の命令を実行する。
次に、時刻t2において、ハードウェアプリフェッチ回路27は、キャッシュライン番号A+1のキャッシュラインがキャッシュミスした場合、キャッシュミスバッファ49にキャッシュミスしたキャッシュライン番号A+1を登録する(ステップS702)。そして、ハードウェアプリフェッチ回路27は、キャッシュラインカウンタ44において、キャッシュミスしたキャッシュライン番号A+1のカウント値cnt(A+1)に1を設定する。
次に、比較回路45は、レジスタ41のキャッシュミス回数p及びキャッシュミスカウンタ44のカウント値cnt(i)を基に、キャッシュメモリのアドレスが連続するp個のキャッシュラインでキャッシュミスが発生したか否かをチェックする。pが2の場合、連続するp(=2)個のキャッシュライン番号A及びA+1でキャッシュミスが発生しているので、比較回路45はプリフェッチを指示する。
次に、ステップS704では、ハードウェアプリフェッチ回路27は、比較回路45によりプリフェッチを指示されると、キャッシュミスしたキャッシュライン番号A+1に対してレジスタ42のプリフェッチ位置q(=1)を加算し、キャッシュライン番号A+2をプリフェッチキュー43に登録する。
次に、ステップS705では、ハードウェアプリフェッチ回路27は、プリフェッチキュー43内のキャッシュライン番号A+2のプリフェッチを発行部46により発行し、プリフェッチ処理を開始する。その後、ハードウェアプリフェッチ回路27は、プリフェッチキュー43内のキャッシュライン番号A+2を削除する。その後、ステップS701において次の命令を実行する。
次に、時刻t3において、キャッシュライン番号A+2のアクセス要求が発行されると、ハードウェアプリフェッチ回路27は、キャッシュライン番号A+2のプリフェッチが完了していないので、キャッシュライン番号A+2のキャッシュラインがキャッシュミスし、キャッシュミスバッファ49にキャッシュミスしたキャッシュライン番号A+2を登録する(ステップS702)。そして、ハードウェアプリフェッチ回路27は、キャッシュラインカウンタ44において、キャッシュミスしたキャッシュライン番号A+2のカウント値cnt(A+2)に1を設定する。
次に、比較回路45は、レジスタ41のキャッシュミス回数p及びキャッシュミスカウンタ44のカウント値cnt(i)を基に、キャッシュメモリのアドレスが連続するp個のキャッシュラインでキャッシュミスが発生したか否かをチェックする。pが2の場合、連続するp(=2)個のキャッシュライン番号A+1及びA+2でキャッシュミスが発生しているので、比較回路45はプリフェッチを指示する。
次に、ステップS704では、ハードウェアプリフェッチ回路27は、比較回路45によりプリフェッチを指示されると、キャッシュミスしたキャッシュライン番号A+2に対してレジスタ42のプリフェッチ位置q(=1)を加算し、キャッシュライン番号A+3をプリフェッチキュー43に登録する。
次に、ステップS705では、ハードウェアプリフェッチ回路27は、プリフェッチキュー43内のキャッシュライン番号A+3のプリフェッチを発行部46により発行し、プリフェッチ処理を開始する。その後、ハードウェアプリフェッチ回路27は、プリフェッチキュー43内のキャッシュライン番号A+3を削除する。
なお、上記では、キャッシュミスバッファ49にキャッシュライン番号A、A+1、A+2の昇順で登録される場合を例に説明したが、降順の場合にも対応することができる。キャッシュミスバッファ49にキャッシュライン番号A、A−1が登録された場合には、次回、キャッシュライン番号A−2をプリフェッチキュー43に登録すればよい。
図8(A)は、キャッシュミス回数pが2(初期値)であり、プリフェッチ位置qが1(初期値)である場合のリードアドレス及びプリフェッチアドレスを示す図である。リードアドレスがキャッシュライン番号Aの場合、キャッシュライン番号Aの1回のキャッシュミスであるので、プリフェッチは行われない。次に、リードアドレスがキャッシュライン番号A+1の場合、キャッシュライン番号A及びA+1のp(=2)回のキャッシュミスが連続するので、キャッシュミスしたキャッシュライン番号A+1に対してプリフェッチ位置q(=1)を加算したキャッシュライン番号A+2のプリフェッチが行われる。次に、キャッシュライン番号A+2のキャッシュミスが発生すると、同様に、キャッシュライン番号A+3のプリフェッチが行われる。次に、キャッシュライン番号A+3のキャッシュミスが発生すると、同様に、キャッシュライン番号A+4のプリフェッチが行われる。
図8(B)は、キャッシュミス回数pが1であり、プリフェッチ位置qがxである場合のリードアドレス及びプリフェッチアドレスを示す図である。リードアドレスがキャッシュライン番号Aの場合、キャッシュライン番号Aのp(=1)回のキャッシュミスが発生するので、キャッシュミスしたキャッシュライン番号Aに対してプリフェッチ位置q(=x)を加算したキャッシュライン番号A+xのプリフェッチが行われる。次に、キャッシュライン番号A+1のキャッシュミスが発生すると、同様に、キャッシュライン番号A+1+xのプリフェッチが行われる。次に、キャッシュライン番号A+2のキャッシュミスが発生すると、同様に、キャッシュライン番号A+2+xのプリフェッチが行われる。次に、キャッシュライン番号A+3のキャッシュミスが発生すると、同様に、キャッシュライン番号A+3+xのプリフェッチが行われる。
図9(A)は、図6のキャッシュミスバッファ49、キャッシュミスカウンタ44及びプリフェッチキュー43を示す図である。キャッシュミスバッファ49には、キャッシュミスしたキャッシュライン番号が登録される。キャッシュミスカウンタ44は、キャッシュライン番号i及びカウント値cnt(i)のすべての組みを有し、カウント値cnt(i)の初期値が0であり、キャッシュミスバッファ49に登録されたキャッシュライン番号iのカウント値cnt(i)が1になる。キャッシュライン空き個数rの初期値は0である。その場合、キャッシュミスカウンタ44のキャッシュライン番号2及び3のカウント値cnt(2)及びcnt(3)が共に1になっているので、p(=2)回連続するキャッシュラインでキャッシュミスが発生したと判断し、q=1の場合、プリフェッチキュー43にキャッシュライン番号4(=3+1)を登録する。同様に、キャッシュミスカウンタ44のカウント値cnt(3)及びcnt(4)が共に1になっているので、p(=2)回連続するキャッシュラインでキャッシュミスが発生したと判断し、プリフェッチキュー43にキャッシュライン番号5(=4+1)を登録する。
図9(B)は、プリフェッチキュー43の登録処理を示すフローチャートである。まず、昇順でアクセスする例を説明する。ステップS901では、ハードウェアプリフェッチ回路27は、キャッシュミスバッファ49に登録したキャッシュライン番号iについて、直前のキャッシュミスカウンタ44のカウント値cnt(i−1)が1であるか否かをチェックする。1である場合にはステップS902へ進む。ステップS902では、ハードウェアプリフェッチ回路27は、キャッシュライン番号iにプリフェッチ位置q(=1)を加算したキャッシュライン番号i+1をプリフェッチキュー43に登録する。
次に、降順でアクセスする例を説明する。ステップS901では、ハードウェアプリフェッチ回路27は、キャッシュミスバッファ49に登録したキャッシュライン番号iについて、直後のキャッシュミスカウンタ44のカウント値cnt(i+1)が1であるか否かをチェックする。1である場合にはステップS902へ進む。ステップS902では、ハードウェアプリフェッチ回路27は、キャッシュライン番号iにプリフェッチ位置q(=1)を減算したキャッシュライン番号i−1をプリフェッチキュー43に登録する。
なお、プリフェッチキュー43は、一つに限らず複数用意してもよい。その場合は、同時に複数のデータストリームのアクセスに対してハードウェアプリフェッチ回路27によるプリフェッチ処理が実行される。
また、図3(A)のプリフェッチ停止命令「hpf_stop」が実行されると、ハードウェアプリフェッチ回路27は、直ちに発行部46を停止させ、プリフェッチキュー43のキャッシュライン番号を削除する。これにより、ハードウェアプリフェッチを停止させることができる。
図10は、図9(A)に対応し、キャッシュライン空き個数rが1の場合の処理例を示す図である。図4(A)のキャッシュライン空き数指定命令「hpf_range #r」が実行されると、ハードウェアプリフェッチ回路27は、図6のレジスタ51にキャッシュライン空き個数rを格納する。図6のチェック部55は、連続するp(=2)個のキャッシュラインの中にr(=1)個のキャッシュラインの空きがあっても、連続するp個のキャッシュラインでキャッシュミスが発生したと判断し、プリフェッチキュー43への登録を行う。例えば、キャッシュライン番号5がアクセスされなかった場合、連続するp(=2)個のキャッシュライン番号4及び5の中にr(=1)個のキャッシュライン番号5の空きがあっても、キャッシュライン番号5にプリフェッチ位置q(=1)を加算したキャッシュライン番号6(=5+1)をプリフェッチキュー43に登録する。また、キャッシュライン番号6のキャッシュミスが発生した場合、連続するp(=2)個のキャッシュライン番号5及び6の中にr(=1)個のキャッシュライン番号5の空きがあっても、キャッシュライン番号6にプリフェッチ位置q(=1)を加算したキャッシュライン番号7(=6+1)をプリフェッチキュー43に登録する。
図11は、図6のチェック部55の処理を示すフローチャートである。ステップS1101では、チェック部55は、昇順アクセスの場合、現在ハードウェアプリフェッチ発行中のキャッシュライン番号iのデータストリームについて、直前のキャッシュミスカウンタ44のカウント値cnt(i−1)が1であるか否かをチェックする。降順アクセスの場合、チェック部55は、直後のキャッシュミスカウンタ44のカウント値cnt(i+1)が1であるか否かをチェックする。ステップS1102において、1である場合にはステップS1106に進み、0である場合にはステップS1103に進む。
ステップS1103では、チェック部55は、キャッシュミスカウンタ44のキャッシュライン番号iについて、直前のキャッシュライン番号i−1からレジスタ51の空き個数rを減算した番号i−1−rのカウント値cnt(i−1−r)が1であるか否かをチェックする。ステップS1104において、1である場合にはステップS1105に進み、0である場合にはステップS1106に進む。
ステップS1105では、チェック部55は、連続するp(=2)個のキャッシュラインの中にr(=1)個のキャッシュラインの空きがあると判断し、キャッシュライン番号i+1−k(k=r,r−1,・・・,0)のr+1個をプリフェッチキュー43に追加登録する。その後、ステップS1103の処理に戻る。
ステップS1106では、ハードウェアプリフェッチ回路27は、ハードウェアプリフェッチを継続する。ステップS1107では、ハードウェアプリフェッチ回路27は、プリフェッチキュー43が空になれば、ハードウェアプリフェッチを停止する。
図12は、図2(A)〜図5(A)のソースプログラム201,301,401,501の生成方法を示すフローチャートである。ステップS1201では、ユーザは、コンピュータ1200を用いて、デバッガ、プロファイル又はwrite文などにより、長時間を費やす高コストループ処理の箇所を突き止める。次に、ステップS1202では、ユーザは、コンピュータ1200を用いて、デバッガ又はプロファイルツールなどを使用し、高コストループ処理内で下記の(1)又は(2)の対象箇所を検出する。
(1)連続域のデータアクセスが微小区間で歯抜けで途切れている。
(2)連続域のデータアクセスが発生及び/又は終了している。
次に、ステップS1203では、ユーザが対象箇所を特定した場合には、ステップS1204に進む。ステップS1204では、ユーザは、ソースプログラム201,301,401又は501内の対象箇所にocl文を記述する。次に、ステップS1205では、ユーザは、コンピュータ1200を用いて、コンパイラによりソースプログラム201,301,401又は501を機械語に変換する。機械語は、メインメモリに格納される。次に、ステップS1206では、演算処理装置11は、メインメモリ内の機械語を入力して実行する。
図19は、図12のコンピュータ1200のハードウェア構成例を示す図である。バス1901には、中央処理装置(CPU)1902、ROM1903、RAM1904、ネットワークインタフェース1905、入力装置1906、出力装置1907及び外部記憶装置1908が接続されている。CPU1902は、データの処理又は演算を行うと共に、バス1901を介して接続された各種構成要素を制御するものである。ROM1903には、予めCPU1902の制御手順(コンピュータプログラム)を記憶させておき、このコンピュータプログラムをCPU1902が実行することにより、起動する。外部記憶装置1908にコンピュータプログラムが記憶されており、そのコンピュータプログラムがRAM1904にコピーされて実行される。RAM1904は、データの入出力、送受信のためのワークメモリ、各構成要素の制御のための一時記憶として用いられる。外部記憶装置1908は、例えばハードディスク記憶装置やCD−ROM等であり、電源を切っても記憶内容が消えない。CPU1902は、RAM1904内のコンピュータプログラムを実行することにより処理を行う。ネットワークインタフェース1905は、インターネット等のネットワークに接続するためのインタフェースである。入力装置1906は、例えばキーボード及びマウス等であり、各種指定又は入力等を行うことができる。出力装置1907は、ディスプレイ及びプリンタ等である。
図13は、コンパイラ1302の機能構成図である。コンパイラ1302は、コンパイラのプログラムを図19のコンピュータに実行させることにより処理する。コンパイラ1302は、パーサー部76、中間コード変換部78、最適化部68及びコード生成部90を有し、ソースプログラム1301を入力し、機械語プログラム92及びチューニング情報92を出力する。最適化部68は、命令挿入部86を有する。
ソースプログラム1301は、図2(A)〜図5(A)のソースプログラム201,301,401,501に対応し、例えばFORTRAN言語やC言語等の高級言語で記述されている。パーサー部76は、ソースプログラム1301に対して、予約語(キーワード)等を抽出して字句解析する。中間コード変換部78は、パーサー部76から入力したソースプログラム1301の各ステートメントを一定規則に基づいて中間コードに変換する。ここで、中間コードは、典型的には、関数呼び出しの形式で表現されるコード(例えば、「+(int a, int b)」を示すコード;「整数aに整数bを加算する」ことを示す。)である。ただし、中間コードには、このような関数呼び出し形式のコードだけでなく、演算処理装置11の機械語命令も含まれる。中間コード変換部78は、中間コードを生成する際にプロファイル情報1304を参照して、最適な中間コードを生成する。
最適化部68は、中間コード変換部78より出力された中間コードについて、命令結合、冗長除去、命令並べ替え、レジスタ割り付け等の処理を行うことにより、実行速度の向上やコードサイズの削減等を行う。命令挿入部86は、プロファイル情報1304を参照し、図2(A)〜図5(A)のocl文を挿入する。なお、最適化部68は、キャッシュメモリ29のキャッシュミスに関する情報など、ユーザがソースプログラム1301を再作成する際のヒントとなるチューニング情報94を出力する。コード生成部90は、最適化部68から出力された中間コードに対して、内部に保持する変換テーブル等を参照することで、全てのコードを機械語命令に置き換えることで、機械語プログラム92を生成する。
プロファイラ1303は、図19のコンピュータがプロファイラのプログラムを実行することにより処理する。プロファイラ1303は、機械語プログラム92を実行し、プロファイル情報1304を生成する。プロファイル情報1304の詳細は、後に図14を参照しながら説明する。まず、コンパイラ1302は、ソースプログラム1301を機械語プログラム92に変換する。次に、プロファイラ1303は、機械語プログラム92を実行することにより、プロファイル情報1304を生成する。次に、コンパイラ1302は、プロファイル情報1304を参照し、ocl文を挿入し、機械語ブログラム92を生成する。次に、演算処理装置11が機械語プログラム92を実行する。
図14は、図13のプロファイラ1303の処理を示すフローチャートである。ステップS1401では、ユーザは、プロファイラ1303に対して、プロファイル情報取得の翻訳オプションを指定して、機械語プログラム92を翻訳させる。ステップS1402では、プロファイラ1303は、機械語プログラム92の実行により、プロファイル情報1304を出力する。プロファイル情報1304は、ループ回数、実行PC(プログラムカウンタ)アドレス、ループ内の配列要素ごとのアクセスアドレス等を有する。なお、アクセスアドレスをトレースするとプロファイル情報1304のファイルの出力サイズが大きくなるので、直前のアクセスアドレスとの差分情報やアクセス属性(直前アクセスアドレスと連続するストリームを抽出)だけにして、プロファイル情報1304のファイルサイズを縮小してもよく、形式は特に限定しない。
プロファイル情報1304の内容は、例えばプロフィル情報1404又は1405である。プロファイル情報1404は、アクセスデータアドレスを有し、各アドレスに4バイトデータが記憶されている場合には4番地毎のアドレスにデータが記憶される。したがって、プロファイル情報1404は、「20」番地から「2c」番地までの連続するアドレスの4個のデータが順にアクセスされていることを示す。
プロファイル情報1405は、データストリームの先頭アドレス、アクセスする単位、属性、連続領域の長さ、アクセス回数、連続アクセスするストリームIDを有する。また、プロファイル情報1304は、キャッシュミス数をアクセスアドレスごとに集計してもよく、その他パフォーマンスカウンタのイベントや翻訳時の静的構文情報を組み合わせてもよい。
図15は、図13のコンパイラ1302の命令挿入部86の処理を示すフローチャートであり、図2(A)の命令「hpf_start #p-1,#q」及び図3(A)の命令「hpf_stop」の挿入処理を示す。プロファイル情報1304は、例えばプロファイル情報1505である。ステップS1501では、命令挿入部86は、プロファイル情報1304を参照し、ソースプログラム内のループ処理のループ回数が第1の閾値より多く、かつループ処理により連続アクセスするデータの長さが第2の閾値より短いことの条件を満たすか否かをチェックする。ステップS1502において、条件を満たす場合にはステップS1503に進み、条件を満たさない場合には命令の挿入を行わずに処理を終了する。ステップS1503では、命令挿入部86は、図16(A)及び(B)に示すように、データアクセス時間を短縮するため、対象ループ処理に対してユーザから翻訳オプションで指定されたキャッシュミス回数p及びプリフェッチ位置qを命令「hpf_start #p-1,#q」に設定し、対象ループの直前に挿入する。同様に、命令挿入部86は、命令「hpf_stop」を対象ループの直後に挿入する。
なお、上記の第1及び第2の閾値は、コンパイラ内部で持っても、ユーザが翻訳オプション等で外部からコンパイラに与えてもよい。また、対象ループは、コンパイラが選択したループのうちすべてを対象としてもよく、ユーザが翻訳オプション等で指定した数で指定された対象ループの上位だけに限定してもよい。また、ステップS1502における判断するデータとしては、上記の第1及び第2の閾値以外にもループの実行時間や、キャッシュミス数、その他パフォーマンスカウンタのイベントや翻訳時の静的構文情報をさらに追加、組み合わせてもよく、判定方法も上記に限定しない。また、同様にこれら閾値はコンパイラ内部で持っても、ユーザが翻訳オプション等で外部からコンパイラに与えてもよい。
図16(A)は、対象ループn及び対象ループkに対して、それぞれ異なるキャッシュミス回数p及びプリフェッチ位置qを指定する例を示す図である。対象ループnの前には命令「hpf_start #p1-1,#q1」が挿入され、対象ループnの後には命令「hpf_stop」が挿入される。また、対象ループkの前には命令「hpf_start #p2-1,#q2」が挿入され、対象ループnの後には命令「hpf_stop」が挿入される。
図16(B)は、対象ループn及び対象ループk等に対して、相互に同じキャッシュミス回数p及びプリフェッチ位置qを指定する例を示す図である。対象ループn及び対象ループk等の前には命令「hpf_start #p-1,#q」が挿入され、対象ループn及び対象ループk等の後には命令「hpf_stop」が挿入される。
図17は、図13のコンパイラ1302の命令挿入部86の処理を示すフローチャートであり、図4(A)の命令「hpf_range #r」の挿入処理を示す。ステップS1701では、命令挿入部86は、プロファイル情報1304を参照して、連続アクセスのデータストリームを、1つのデータストリームアクセスとしてハードウェアプリフェッチを結合できないかチェックする。プロファイル情報1304は、例えばプロファイル情報1705である。
次に、ステップS1702では、命令挿入部86は、次式により、データストリームi及びデータストリームjの隙間のサイズをキャッシュラインのサイズSZに換算する。ここの例では、キャッシュラインのサイズは128とする。addr(j)はデータストリームjの先頭アドレス、addr(i)はデータストリームiの先頭アドレス、len(i)はデータストリームiの長さ、len(j)はデータストリームjの長さである。
SZ={addr(j)−(addr(i)+len(i))}/128
命令挿入部86は、アドレスaddr(i)とアドレスaddr(j)+len(j)の区間内で、アクセスID(i)からアクセスID(j)の間にて、他のデータストリームアクセスがない場合には、以下の処理を行う。その場合、命令挿入部86は、ストリーム隙間ラインサイズSZがゼロの場合、データストリームi及びデータストリームjを1つのデータストリームとみなしてそのままハードウェアプリフェッチ回路27に任せるため、命令「hpf_range #r」を挿入しない。また、命令挿入部86は、ストリーム隙間ラインサイズSZが1よりも大きい場合は、命令「hpf_range #r」に指定するキャッシュライン空き個数rに、求めたストリーム隙間ラインサイズSZを指定する。この場合、データストリームiとデータストリームjは、1つのデータストリームとみなすことができる。i及びjをすべてのデータストリーム間で検査する。
例えば、プロファイル情報1705の場合では、ID1のデータストリーム(0x20から0x20+10までのストリーム)とID2のストリーム(0x30から0x38までのストリーム)は、6バイトの空き空間がある。しかも、ID1からID2までのアクセス間にアドレス範囲(0x20〜0x38)と重なるアクセスがない。したがって、ID1及びID2の2つのストリームアクセスを1つのストリームとみなすことができる。ストリームの隙間をキャッシュラインサイズに換算して1よりも大きい場合は、命令「hpf_range #r」に指定するキャッシュライン空き個数rに、ストリーム隙間ラインサイズSZに換算した値を指定する。このように、命令「hpf_range #r」のキャッシュライン空き個数rを任意に調整することができる。
次に、ステップS1703では、命令挿入部86は、対象となるストリームについて、ストリームiのアクセス命令とストリームjのアクセス命令の間でハードウェアプリフェッチを継続させるための命令「hpf_range #r」を挿入する。
図18は、図13のコンパイラ1302の命令挿入部86の処理を示すフローチャートであり、図5(A)の命令「!ocl contact(A(i,j),(-n),k)」の展開処理を示す。ステップS1801では、命令挿入部86は、「!ocl contact(A(i,j),(-n),k)」等で指定されたプリフェッチすべき変数アドレスを算出する。
次に、ステップS1802では、命令挿入部86は、次式により、事前プリフェッチすべきアドレス(指定された変数アドレスのキャッシュライン番号から1次元要素のn要素前のアクセスアドレス)addrを算出する。
addr=[(i−1−n)+(j−1)×x }×L
ここで、i及びj方向順にアクセスする配列Aの配列サイズが(x,y)、要素サイズがLである2次元配列A(i,j)の場合、配列の先頭位置からの配列添字i,jの相対位置は、{(i−1)+(j−1)×x}×Lで表現できる。なお、2次元配列と同様に、一次元及び3次元以上の配列にも同様に適用できる。
次に、ステップS1803では、命令挿入部86は、「!ocl contact(A(i,j),(-n),k)」でユーザ指定された位置に、2個目の引数の「−n」であり、また書き込ませるキャッシュラインの数は「k」であるため、n要素前の算出した上記で算出したプリフェッチアドレスaddrを指定したプリフェッチに相当する命令「lddf [%l1-256],f2」及び次のキャッシュラインアクセスとなる「lddf [%l1-128],f2」及び次々のキャッシュラインアクセスとなる「lddf [%l1],f2」…の機械語をk個展開する。
本実施形態は、コンピュータがコンパイラ1302及びプロファイラ1303のプログラムを実行することによって実現することができる。また、上記のプログラムを記録したコンピュータ読み取り可能な記録媒体及び上記のプログラム等のコンピュータプログラムプロダクトも本発明の実施形態として適用することができる。記録媒体としては、例えばフレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、CD−ROM、磁気テープ、不揮発性のメモリカード、ROM等を用いることができる。
なお、上記実施形態は、何れも本発明を実施するにあたっての具体化の例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、又はその主要な特徴から逸脱することなく、様々な形で実施することができる。