(57)【要約】【課題】回路規模の増大を抑制しつつ、大きなデータに対して繰り返し同じ処理を行うことに適した演算処理装置を提供する。【解決手段】演算処理装置は、予め定められたアクセスパターンに基づいて、メモリにアクセスして、データを順次読み出すメモリアクセス回路と、前記メモリアクセス回路が読み出したデータを格納するための格納部であって、当該格納部の空き容量が無くなるまで、前記メモリアクセス回路が前記メモリからデータを順次読み出し、この読み出したデータが格納される、格納部と、前記格納部に格納されているデータを取得する、プロセッサと、を備えて構成されている。【選択図】図１
2007264909.tif 000002
【特許請求の範囲】
【請求項１】
予め定められたアクセスパターンに基づいて、メモリにアクセスして、データを順次読み出すメモリアクセス回路と、
前記メモリアクセス回路が読み出したデータを格納するための格納部であって、当該格納部の空き容量が無くなるまで、前記メモリアクセス回路が前記メモリからデータを順次読み出し、この読み出したデータが格納される、格納部と、
前記格納部に格納されているデータを取得する、プロセッサと、
を備えることを特徴とする演算処理装置。
【請求項２】
前記プロセッサがデータを取得するための複数のレジスタが格納されているレジスタファイルであって、前記レジスタにはそれぞれレジスタ番号が付されており、前記プロセッサがレジスタ番号を指定した場合には、指定されたレジスタ番号のデータを出力する、レジスタファイルと、
前記格納部から出力されたデータと前記レジスタファイルからの出力されたデータのうち、いずれかのデータを選択して、前記プロセッサに出力する、セレクタと、
をさらに備えることを特徴とする請求項１に記載の演算処理装置。
【請求項３】
前記メモリアクセス回路は、前記プロセッサから出力される起動制御信号により起動される、ことを特徴とする請求項１又は請求項２に記載の演算処理装置。
【請求項４】
前記メモリアクセス回路が起動されている状態で、前記プロセッサが指定したレジスタ番号が、予め定められているレジスタ番号と一致した場合には、前記セレクタは、前記格納部から出力されたデータを、前記プロセッサに出力する、ことを特徴とする請求項３に記載の演算処理装置。
【請求項５】
前記格納部は、格納されたデータが、格納された順に出力されるバッファにより構成されている、ことを特徴とする請求項１乃至請求項４のいずれかに記載の演算処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置に関し、特に、大量のデータを処理する演算処理装置に関する。
【背景技術】
【０００２】
オーディオデータやビデオデータなどのデータのストリームを再生する場合、メディアストリーミング処理を行うが、このメディアストリーミング処理では、複数の処理を繰り返して１つのデータに対して行うというよりは、むしろ、少ない限定された処理を大量のデータに対して行うという特質を有している。
【０００３】
このようなデータストリーミング処理をプロセッサで行う場合、（１）データのロード、（２）演算、（３）ポインタのインクリメントを繰り返すこととなる。ＤＳＰなどの専用プロセッサには、このような処理のための専用命令群が用意されており、この処理を１命令で実行することができる。しかし、汎用ＲＩＳＣプロセッサなどの演算処理装置でこの処理を行おうとすると、３命令以上必要となってしまう。汎用ＲＩＳＣプロセッサで、例えば、ストリームデータの総和を求めるプログラムを示すと、次のようになる。
int totalsum(int *streamData, int dataNum)
{
int i;
_R1=0;
_R2=streamdata;
for (i=0; i<dataNum; i++){
_R3=*(_R2);
_R1=_R1+_R3
_R2=_R2+1;
}
return(_R1);
}
【０００４】
ここで例示したプログラムは、配列streamDataの総和を求める関数totalsum()のプログラムである。dataNumは、streamDataのデータ個数を示している。また、R1、R2、R3は、それぞれレジスタを示している。具体的には、R1は総和が格納されるレジスタであり、R2は配列streamDataの位置を示すポインタが格納されているレジスタであり、R3はstreamDataからロードされたデータが格納されるレジスタである。
【０００５】
このプログラムにおいては、まず、総和を格納するレジスタR1のデータを、ゼロにリセットする。続いて、レジスタR2に、streamDataの値（つまりポインタ）を格納する。
【０００６】
次に、for文によるループ内の命令から分かるように、（１）_R3=*(_R2)で_R2で指定された位置にあるstreamDataがレジスタR3にロードされる。続いて、（２）_R1=_R1+_R3により、レジスタR1の現在のデータに、ロードしたレジスタR3のデータを加算する。続いて、（３）ポインタを格納しているレジスタR2の値を、１つインクリメントする。
【０００７】
そして、このような（１）から（３）の処理を、for文の条件を満たす限り、つまりi<dataNumという条件を満たす限り、繰り返して行う。具体的には、dataNumの数だけ、これら（１）から（３）の処理を繰り返すこととなる。
【０００８】
この例からも分かるように、データストリーミング処理を汎用ＲＩＳＣプロセッサで行う場合、（１）データのロード、（２）演算、（３）ポインタのインクリメントという３つの命令を繰り返すこととなる。
【０００９】
このように繰り返す命令の数を削減するために、汎用ＲＩＳＣプロセッサでも、ＤＳＰにあるような専用命令群を用意することも考えられるが、複雑な命令群を実装すると、ＲＩＳＣプロセッサの回路規模が大きくなってしまうという問題が生じる。
【００１０】
このような問題は、データストリーミング処理に限らず、大きなデータに対して、繰り返して同じ処理を行うあらゆるデータ処理で、生じる可能性がある。
【００１１】
また、類似の問題を解決するため、米国特許第５，１５５，８１６号公報では、通常のロード命令とは別系統の浮動小数点のロード命令ＰＦｌｏａｄを用意するとともに、ＰＦｌｏａｄ命令によるデータの供給とデータ処理のミスマッチを低減するために、ＰＦｌｏａｄ命令によって得られたデータを、ＦＩＦＯバッファに格納し、順次出力するようにしている。また、米国特許第６，２８２，６３１号公報では、ＦＩＦＯバッファがメモリ空間にマップされており、デコード対象のビットストリームを順次読み出すためにこのＦＩＦＯバッファが使用されている。これらの文献では、いずれもメモリアクセスのレイテンシを隠蔽するため、ＦＩＦＯバッファが用いられているが、レイテンシ改善効果が必ずしも十分ではいか、或いは、回路規模の大型化が避けられない。
【特許文献１】米国特許第５，１５５，８１６号公報
【特許文献２】米国特許第６，２８２，６３１号公報
【発明の開示】
【発明が解決しようとする課題】
【００１２】
そこで、本発明では、回路規模の増大を抑制しつつ、大きなデータに対して繰り返し同じ処理を行うことに適した演算処理装置を提供することを目的とする。
【課題を解決するための手段】
【００１３】
上記課題を解決するため、本発明に係る演算処理装置は、
予め定められたアクセスパターンに基づいて、メモリにアクセスして、データを順次読み出すメモリアクセス回路と、
前記メモリアクセス回路が読み出したデータを格納するための格納部であって、当該格納部の空き容量が無くなるまで、前記メモリアクセス回路が前記メモリからデータを順次読み出し、この読み出したデータが格納される、格納部と、
前記格納部に格納されているデータを取得する、プロセッサと、
を備えることを特徴とする。
【発明の効果】
【００１４】
本発明によれば、回路規模の増大を抑制しつつ、大きなデータに対して繰り返し同じ処理を行うことに適した演算処理装置を提供することができる。
【発明を実施するための最良の形態】
【００１５】
本実施形態では、ストリームデータへのアクセスパターンは予め定まった規則性を有しているという特徴を利用して、回路規模の増大を最小限に抑えながら、ストリーミング処理の高速化を図らんとしたものである。より詳しくを以下に説明する。
【００１６】
図１は、本実施形態に係る演算処理装置の回路構成の一例を説明するブロック図である。この図１に基づいて、上述したストリームデータの総和を求める処理を行う場合における演算処理装置の動作について説明する。
【００１７】
この図１に示すように、本実施形態に係る演算処理装置は、プロセッサ１０と、レジスタファイル１２と、メモリ１４と、メモリアクセス回路２０と、ＦＩＦＯイネーブルレジスタ２４と、比較器２６と、論理積回路２８と、ＦＩＦＯバッファ３０と、セレクタ３２と、論理積回路３４とを備えて、構成されている。
【００１８】
本実施形態では、図１に示す各構成要素は、１つの集積回路として１チップで構成されているが、その構成態様は任意である。例えば、メモリ１４については、この演算処理装置に含める必要はなく、別チップとして構成してもよい。
【００１９】
まず、本実施形態における起動制御信号であるアクセスパターン指定信号に基づいて、メモリアクセス回路２０は起動する。このメモリアクセス回路２０が起動されると、メモリアクセス回路２０は、メモリ１４にアクセスして、予め定められている規則性に基づいて、streamDataのデータを読み出し、ＦＩＦＯバッファ３０に格納し、これをＦＩＦＯバッファ３０の空きがなくなるまで繰り返す。本実施形態では、streamDataの先頭から順番にという規則性が予め定められている。このＦＩＦＯバッファ３０が本実施形態における格納部を構成している。
【００２０】
具体的には、メモリアクセス回路２０は、アクセス信号をメモリ１４に出力する。メモリ１４は、プロセッサ１０からもアクセス信号が入力されることがあるので、これらメモリアクセス回路２０からのアクセスと、プロセッサ１０からのアクセスとの調停も行う。２つのアクセスが競合した場合の優先順位は様々なものが考えられるが、例えば、プロセッサ１０からのアクセスを優先したり、メモリアクセス回路２０からのアクセスを優先したりするアルゴリズムが考えられる。
【００２１】
本実施形態では、アクセス信号にアクセスすべきメモリ１４のアドレスが含まれているので、メモリ１４は、指定されたアドレスのデータを読み出し、メモリ出力データとして、メモリアクセス回路２０又はプロセッサ１０に出力する。
【００２２】
なお、図１の例では、プロセッサ１０からのアクセス信号とメモリアクセス回路２０からのアクセス信号が競合した場合の調停機能を、メモリ１４が備えているが、メモリ１４がこのような調停機能を備えていない場合には、図２に示すように、調停ユニット２２をこのメモリ１４とは別個に設けて、プロセッサ１０とメモリアクセス回路２０は、この調停ユニット２２を介して、メモリ１４にアクセスするようにすればよい。
【００２３】
図１に示すように、メモリ１４から出力されたメモリ出力データを取得したメモリアクセス回路２０は、これをＦＩＦＯ入力データとしてＦＩＦＯバッファ３０に出力し、読み出しデータ（streamData）として、ＦＩＦＯバッファ３０に格納する。streamDataは、dataNum個の配列で構成されているので、ＦＩＦＯバッファ３０に空き領域があれば、メモリアクセス回路２０は、メモリ１４からstreamDataを順番に読み出して、ＦＩＦＯバッファ３０に格納する。
【００２４】
メモリアクセス回路２０は、ＦＩＦＯバッファ３０に空き領域があるかどうかを、ＦＩＦＯバッファ３０の出力する空き容量信号に基づいて判断する。
【００２５】
一方、プロセッサ１０は、データ読み出しの必要なレジスタが発生すると、そのレジスタ番号を、処理入力レジスタ番号として、レジスタファイル１２に出力する。レジスタファイル１２では、処理入力レジスタ番号で指定された番号のレジスタのデータを、レジスタファイル出力データとして、セレクタ３２に出力する。
【００２６】
また、プロセッサ１０から出力された処理入力レジスタ番号は、比較器２６にも入力される。本実施形態では、メモリ１４から先読みされたデータが格納されるレジスタ番号は１５番と定められている。このため、比較器２６は、入力された処理入力レジスタ番号が１５番であるかどうかを判断し、入力された処理入力レジスタ番号が１５番である場合にはハイレベルの比較結果信号を出力し、入力された処理入力レジスタ番号が１５番でない場合にはローレベルの比較結果信号を出力する。
【００２７】
また、プロセッサ１０は、メモリアクセス回路２０を起動した先読み用のＦＩＦＯバッファ３０を用いた処理を行う場合には、この処理に先立って、ハイレベルのイネーブルレジスタ制御信号をＦＩＦＯイネーブルレジスタ２４に入力する。このため、先読み用のＦＩＦＯバッファ３０を用いる処理を行っている場合には、ＦＩＦＯイネーブルレジスタ２４の出力信号は、ハイレベルになっている。このＦＩＦＯイネーブルレジスタ２４の出力信号と、比較器２６の比較結果信号とは、論理積回路２８に入力されている。
【００２８】
したがって、論理積回路２８の出力であるＦＩＦＯ出力イネーブル信号は、先読み用のＦＩＦＯバッファ３０を用いる処理を行っている間に、１５番の処理入力レジスタ番号がプロセッサ１０から出力された場合には、ハイレベルとなる。
【００２９】
ＦＩＦＯバッファ３０は、このハイレベルのＦＩＦＯ出力イネーブル信号が入力されると、保持しているデータを格納された順に、ＦＩＦＯ出力データとして、セレクタ３２に出力する。そして、ＦＩＦＯバッファ３０は、出力したデータをクリアして、次のデータを受け入れるために、空き容量信号をメモリアクセス回路２０に出力する。ＦＩＦＯ出力イネーブル信号は、プロセッサ１０が１５番の処理入力レジスタ番号を出力するたびに、ローレベルからハイレベルに切り替わることになるので、ＦＩＦＯバッファ３０は、ＦＩＦＯ出力イネーブル信号がローレベルからハイレベルに切り替わるたびに、最も始めに格納されたデータを、ＦＩＦＯ出力データとして出力することとなる。
【００３０】
上述したところから分かるように、セレクタ３２には、レジスタファイル１２からのレジスタファイル出力データと、ＦＩＦＯバッファ３０からのＦＩＦＯ出力データとが入力されているが、これらに加えて、論理積回路２８からのＦＩＦＯ出力イネーブル信号も入力されている。そして、セレクタ３２は、このＦＩＦＯ出力イネーブル信号に基づいて、レジスタファイル出力データとＦＩＦＯ出力データのうちのどちらか一方を、処理入力データとして、プロセッサ１０に出力する。
【００３１】
具体的には、ＦＩＦＯ出力イネーブル信号がハイレベルの場合には、ＦＩＦＯ出力データを処理入力データとしてプロセッサ１０に出力し、ＦＩＦＯ出力イネーブル信号がローレベルの場合には、レジスタファイル出力データを処理入力データとしてプロセッサ１０に出力する。これにより、プロセッサ１０は、メモリアクセス回路２０を起動した先読み用のＦＩＦＯバッファ３０を用いる処理を実行している場合には、先読みしてＦＩＦＯバッファ３０に格納されているデータをレジスタ１５として取得することができる。一方、通常の処理を行っている場合には、レジスタファイル１２に格納されているレジスタ１５のデータを取得することができる。
【００３２】
論理積回路３４は、ＦＩＦＯバッファ３０に先読みしたデータが格納されていない場合に、プロセッサ１０の命令の実行を待たせるために設けられている。すなわち、論理積回路３４には、ＦＩＦＯバッファ３０から出力されたＦＩＦＯバッファ３０が空であることを示す信号と、論理積回路３４から出力されたＦＩＦＯ出力イネーブル信号とが入力されている。このＦＩＦＯバッファ３０が空であることを示す信号は、ＦＩＦＯバッファ３０が空である場合にハイレベルになる信号である。したがって、ＦＩＦＯ出力イネーブル信号がハイレベルのとき（つまり、メモリアクセス回路２０を起動したＦＩＦＯバッファ３０を用いた先読み処理を実行している間に、レジスタ１５の読み出しをＣＰＵ１０がしたとき）に、ＦＩＦＯバッファ３０が空になると、論理積回路３４は、ハイレベルのデータハザードストール信号を出力する。
【００３３】
ＣＰＵ１０では、データハザードストール信号がハイレベルである場合には、先読み用のＦＩＦＯバッファ３０が空であるので、その命令の実行を待つこととなる。逆に、データハザードストール信号がローレベルである場合には、上述したように、先読みされたデータに基づいて命令を実行する。
【００３４】
なお、レジスタファイル１２のレジスタにデータを書き込む場合には、プロセッサ１０は、書き込むレジスタの番号を処理出力レジスタ番号として、レジスタファイル１２に出力するとともに、書き込むべきデータを、処理出力データとして、レジスタファイル１２に出力する。
【００３５】
本実施形態においては、このレジスタファイル１２には、複数のレジスタが設けられており、これら複数のレジスタのそれぞれにはレジスタ番号が付されている。このため、プロセッサ１０は、レジスタ番号を指定することにより、データを書き込んだり読み込んだりするレジスタを指定することができる。
【００３６】
以下に、上述した演算処理装置において、streamDataの総和を求める処理を実行するプログラムの一例を示す。
int totalsum_fifo(int *streamData, int dataNum)
{
int i;
_R1=0;
enablefifo();
prefetchfifo(streamdata, dataNum);
for (i=0; i<dataNum; i++){
_R1=_R1+_R15;
}
disablefifo()
return(_R1);
}
【００３７】
このプログラムは、*streamDataとdataNumとを引数とした関数であり、streamDataの総和を返す関数である。
【００３８】
このプログラムにおいては、まず、int i により、変数iが整数であることを宣言している。続いて、_R1=0により、総和を格納するためのレジスタ_R1をゼロに初期化している。続いて、enablefifo()により、上述したイネーブルレジスタ制御信号をイネーブルにしている。すなわち、イネーブルレジスタ制御信号をローレベルからハイレベルに切り替えている。
【００３９】
次に、prefetchfifo(streamdata, dataNum)により、メモリアクセス回路２０を稼働させる。具体的には、上述したアクセスパターン指定信号により、メモリアクセス回路２０を起動するとともに、引数として先読みするデータstreamdataと、データの個数 dataNumとをメモリアクセス回路２０に指定する。このstreamdataでは、メモリ１４の先頭アドレスが指定されていることとなる。これにより、メモリアクセス回路２０は、予め定められた規則に従って、メモリ１４からstreamDataで指定されたアドレスから、順番に、dataNum個、データを読み出して、ＦＩＦＯバッファ３０に順次格納する処理を開始する。
【００４０】
次に、for (i=0; i<dataNum; i++)と、_R1=_R1+_R15とにより、_R1=_R1+_R15の処理がdataNum回繰り返される。すなわち、レジスタ_R15には、ＦＩＦＯバッファ３０に先読みされたstreamDataが順次格納されてくるので、このレジスタ_R15を、総和を算出するレジスタ_R1に加算していく。
【００４１】
_R1=_R1+_R15の処理がdataNum回繰り返された後、disablefifo()により、イネーブルレジスタ制御信号をディセーブルにする。すなわち、イネーブルレジスタ制御信号をハイレベルからローレベルに切り替える。そして、return(_R1)により、算出された総和をレジスタ_R1により返す。
【００４２】
図３は、ＦＩＦＯバッファ３０の処理内容を説明するためのフローチャートを示す図である。この図３に示す処理は、この演算処理装置に電源が供給された段階で自動的に起動される処理である。
【００４３】
図３に示すように、ＦＩＦＯバッファ３０では、ＦＩＦＯバッファ３０内のデータの数を表すＣＯＵＮＴの値を初期化して、ゼロにする（ステップＳ１０）。ここでは、データを格納するためのＮ個の配列ＦＩＦＯＤＡＴＡ〔０…Ｎ−１〕が設けられていることを仮定しているので、ＣＯＵＮＴは０…Ｎ−１の整数である。また、配列ＦＩＦＯＤＡＴＡ〔０…Ｎ−１〕のそれぞれの大きさは、レジスタファイル１２のレジスタのビット数と同じ（つまり汎用レジスタのビット幅と同じ）であるものとする。
【００４４】
次に、ＦＩＦＯバッファ３０では、メモリアクセス回路２０からのＦＩＦＯ入力データがあるかどうかをチェックする（ステップＳ１２）。
【００４５】
メモリアクセス回路２０からのＦＩＦＯ入力データがある場合には、ＦＩＦＯバッファ３０は、ＦＩＦＯＤＡＴＡ〔ＣＯＵＮＴ〕に、ＦＩＦＯ入力データを格納し、ＣＯＵＮＴを１つインクリメントする（ステップＳ１４）。一方、ＦＩＦＯ入力データが無い場合には、このステップＳ１４はバイパスする。
【００４６】
次に、ＦＩＦＯバッファ３０は、ＦＩＦＯ出力データを出力する指示があるかどうかをチェックする（ステップＳ１６）。具体的には、ハイレベルのＦＩＦＯ出力イネーブル信号が入力されているかどうかをチェックする。
【００４７】
ＦＩＦＯ出力データを出力する指示がない場合には、ＦＩＦＯバッファ３０は、上述したステップＳ１２に戻る。一方、ＦＩＦＯ出力データを出力する指示がある場合には、ＦＩＦＯバッファ３０は、ＣＯＵＮＴの値がゼロであるかどうかをチェックする（ステップＳ１８）。
【００４８】
ＣＯＵＮＴの値がゼロでない場合には、ＦＩＦＯバッファ３０は、ＦＩＦＯＤＡＴＡ〔０〕の値を、ＦＩＦＯ出力データとして、セレクタ３２に出力する（ステップＳ２０）。続いて、ＦＩＦＯバッファ３０は、配列ＦＩＦＯＤＡＴＡ〔１〕からＦＩＦＯＤＡＴＡ〔Ｎ−１〕の値を、ＦＩＦＯＤＡＴＡ〔０〕方向に１つシフトして、ＣＯＵＮＴを１つデクリメントする（ステップＳ２２）。すなわち、ｉ＝０からｉ＝Ｎ−２について、ＦＩＦＯＤＡＴＡ〔ｉ〕＝ＦＩＦＯＤＡＴＡ〔ｉ＋１〕を行う。このＣＯＵＮＴの値は、メモリアクセス回路２０に出力される。すなわち、本実施形態においては、ＣＯＵＮＴの値がＮ−１より小さい場合には、空き容量信号がＦＩＦＯバッファ３０からメモリアクセス回路２０に出力されていることとなる。そして、上述したステップＳ１２に戻る。
【００４９】
これに対して、ステップＳ１８でＣＯＵＮＴの値がゼロであった場合には、ＦＩＦＯバッファ３０は、ＦＩＦＯが空であることを示す信号を、論理積回路３４に出力する（ステップＳ２４）。そして、上述したステップＳ１２に戻る。
【００５０】
図４は、メモリアクセス回路２０の処理内容を説明するためのフローチャートを示す図である。この図４に示す処理は、この演算処理装置に電源が供給された段階で自動的に起動される処理である。
【００５１】
図４に示すように、メモリアクセス回路２０は、プロセッサ１０からのアクセスパターン指定信号の入力があるかどうかをチェックする（ステップＳ３０）。すなわち、プロセッサ１０は、アクセスパターン指定信号を用いて、メモリアクセス回路２０を起動するので、このアクセスパターン指定信号が入力されたかどうかをチェックする。このアクセスパターン指定信号の入力がない場合には、このステップＳ３０を繰り返して待機する。
【００５２】
一方、アクセスパターン指定信号の入力があった場合には、メモリアクセス回路２０は、開始アドレスをＡＤＤＲＥＳＳに取り込み、データ数をＤＡＴＡＣＯＵＮＴに取り込む（ステップＳ３２）。本実施形態では、この開始アドレスやデータ数は、アクセスパターン指定信号に含まれているデータである。メモリアクセス回路２０を用いた先読みを行う場合、プロセッサ１０は、アクセスパターン指定信号をアクセス回路２０に出力するので、メモリアクセス回路２０は、このアクセスパターン指定信号に含まれている開始アドレスとデータ数を取り込む。上述したプログラムにおいては、開始アドレスは引数のstreamDataで指定されており、データ数は引数のdataNumで指定されている。
【００５３】
次に、メモリアクセス回路２０は、ＤＡＴＡＣＯＵＮＴの値がゼロであるかどうかをチェックする（ステップＳ３４）。ＤＡＴＡＣＯＵＮＴの値がゼロである場合には、メモリ１４から指定されたデータをすべて読み込んで、ＦＩＦＯバッファ３０に送ったことになるので、上述したステップＳ３０に戻る。
【００５４】
一方、ＤＡＴＡＣＯＵＮＴの値がゼロでない場合には、ＦＩＦＯバッファ３０の空き容量をチェックする（ステップＳ３６）。ＦＩＦＯバッファ３０の空き容量は、上述したように、ＦＩＦＯバッファ３０から出力されたＣＯＵＮＴの値により確認できる。具体的には、ＣＯＵＮＴの値がＮ−１であれば、ＦＩＦＯバッファ３０の空き容量はゼロであり、ＣＯＵＮＴの値がＮ−２以下であれば、ＦＩＦＯバッファ３０に空き容量があることになる。ＦＩＦＯバッファ３０の空き容量がゼロである場合には、このステップＳ３６を繰り返して、ＦＩＦＯバッファ３０に空き容量ができるまで待機する。
【００５５】
一方、ＦＩＦＯバッファ３０に空き容量がゼロではない場合には、メモリアクセス回路２０は、メモリ１４からＡＤＤＲＥＳＳで指定されたアドレスのデータを取得して、ＦＩＦＯバッファ３０にＦＩＦＯ入力データとして送信する（ステップＳ３８）。
【００５６】
次に、メモリアクセス回路２０は、ＤＡＴＡＣＯＵＮＴを１つデクリメントする（ステップＳ４０）。続いて、メモリアクセス回路２０は、ＡＤＤＲＥＳＳに、レジスタファイル１２のレジスタのデータ幅の大きさだけ、加算する（ステップＳ４２）。すなわち、ＡＤＤＲＥＳＳがメモリ１４内の次のデータを指し示すようにする。そして、上述したステップＳ３４からを繰り返す。
【００５７】
以上のように、本実施形態に係る演算処理装置によれば、メモリ１４に対するアクセスパターンが予め定まっているようなデータアクセスについては、メモリアクセス回路２０がメモリ１４からこのアクセスパターンに従って先読みし、ＦＩＦＯバッファ３０に格納しておくこととしたので、プロセッサ１０は極めて高速に、アクセスすべきアドレスのデータを取得することができる。また、汎用のプロセッサに対して大規模な回路の追加をすることなく、本実施形態に係る演算処理装置は実現できるので、演算処理装置の小型化を図ることができる。
【００５８】
なお、本発明は上記実施形態に限定されず種々に変形可能である。例えば、上述した実施形態では、予め定まっているメモリ１４へのアクセスパターンは、単純なリニアアクセスであったが、このアクセスパターンはリニアアクセスに限るものではなく、スライド型や矩形といった複雑なアクセスパターンでも、予め定まったパターンがあれば、本発明を適用することができる。また、バイト、ハーフワード、ワードといった語長の指定や、シャッフルなどのデータの整形操作を、メモリアクセス回路２０で行うこともできる。その場合は、メモリアクセス回路２０は、メモリ１４から必要なデータを取得し、指定された操作を行った上で、ＦＩＦＯバッファ３０にＦＩＦＯ入力データを出力すればよい。
【００５９】
図５は、アクセスパターンの変形例として、１次元スライドアクセスを説明するための図である。この図５に示すように、１次元スライドアクセスでは、アクセスパターン指定信号において、開始アドレスとデータ数に加えて、ステップＳ４２で加算するアドレスも指定されている。この例では、開始アドレスが「２０」であり、データ数が「３０」であり、加算するアドレスが「１０」である。このため、ＡＤＤＲＥＳＳは開始アドレス「２０」から始まり、ステップＳ４２でＡＤＤＲＥＳＳが「１０」ずつ加算され、最終的にＡＤＤＲＥＳＳが「３１０」になるまで先読みが繰り返される。
【００６０】
図６は、アクセスパターンの別の変形例として、２次元スライドアクセスを説明するための図である。この図６に示すように、２次元スライドアクセスでは、アクセスパターン指定信号において、開始アドレスに加えて、水平方向のデータ数と、ステップＳ４２で加算する水平方向のアドレスの大きさと、垂直方向のデータ数と、ステップＳ４２で加算する垂直方向のアドレスの大きさとが、指定されている。
【００６１】
この例では、開始アドレスが「２０」であり、水平方向のデータ数が「６」であり、水平方向に加算するアドレスの大きさ（ステップ数）が「２０」であり、垂直方向のデータ数が「５」であり、垂直方向に加算するアドレスの大きさ（ステップ数）が「２００」である。このため、ＡＤＤＲＥＳＳは開始アドレス「２０」から始まり、水平方向に「２０」アドレスずつ増え、ＡＤＤＲＥＳＳが「６」個目の「１２０」に到達した時点で、垂直方向に「２００」アドレスを加算し、また、水平方向に「２０」アドレスずつ増える処理を繰り返す。そして、最終的に水平方向に「６」個、垂直方向に「５」個の２次元アドレスにアクセスするまで、この処理を繰り返す。この図６の例では、最終アドレスＡＤＤＲＥＳＳは「９２０」となる。
【００６２】
図７及び図８は、メモリアクセス回路２０が行うデータの整形操作の一例を説明するための図である。この図７及び図８の例では、プロセッサ１０のレジスタ幅を３２ビットであると仮定している。
【００６３】
図７に示すように、必要とされているデータが、符号なし８ビットのバイトデータである場合には、第８ビットから第３１ビットをクリアして、第０ビットから第７ビットを残す操作を行う。一方、必要とされているデータが、符号なし１６ビットのハーフワードデータである場合には、第１６ビットから第３１ビットをクリアして、第０ビットから第１５ビットを残す操作をする。
【００６４】
また、図８に示すように、必要とされているデータが、符号付き８ビットのバイトデータである場合には、第７ビットの値を左端の第３１ビットにコピーするとともに、第８ビットから第３０ビットをクリアして、第０ビットから第６ビットを残す処理を行う。一方、必要とされているデータが、符号付き１６ビットのハーフワードデータである場合には、第１５ビットの値を左端の第３１ビットにコピーするとともに、第１６ビットから第３０ビットをクリアして、第０ビットから第１４ビットを残す処理を行う。
【００６５】
図９は、メモリアクセス回路２０が行うデータのシャッフルパターンの一例を示す図である。この図９の例では、メモリ１４から前回ロードした３２ビットのデータと、メモリ１４から今回ロードした３２ビットのデータとをシャッフルして、３２ビットのＦＩＦＯ入力データを生成している。
【００６６】
具体的には、今回ロードしたデータの第３バイトを、ＦＩＦＯ入力データの第１バイトに挿入し、前回ロードしたデータの第３バイトを、ＦＩＦＯ入力データの第２バイトに挿入し、今回ロードしたデータの第４バイトを、ＦＩＦＯ入力データの第３バイトに挿入し、前回ロードしたデータの第４バイトを、ＦＩＦＯ入力データの第４バイトに挿入することにより、ＦＩＦＯ入力データを生成する。この対応付けは予め定められており、メモリアクセス回路２０に指定されているものとする。
【００６７】
このような複数のデータアクセスパターンに、メモリアクセス回路２０が対応している場合には、どのアクセスパターンでメモリ１４から先読みするかは、プロセッサ１０が出力するアクセスパターン指定信号を用いて指定するように、すればよい。
【図面の簡単な説明】
【００６８】
【図１】本実施形態に係る演算処理装置の内部構成の一例を説明するためのブロック図。
【図２】演算処理装置の内部構成の変形例を説明するための図。
【図３】図１のＦＩＦＯバッファで実行される処理内容の一例を説明するフローチャートを示す図。
【図４】図１のメモリアクセス回路で実行される処理内容の一例を説明するフローチャートを示す図。
【図５】メモリアクセスパターンの変形例として、１次元スライドアクセスの内容を示す図。
【図６】メモリアクセスパターンの変形例として、２次元スライドアクセスの内容を示す図。
【図７】メモリアクセス回路が行うデータ整形操作の一例として、符号なし８ビットデータと符号なし１６ビットデータに対するデータ操作の内容を示す図。
【図８】メモリアクセス回路が行うデータ整形操作の一例として、符号付き８ビットデータと符号付き１６ビットデータに対するデータ操作の内容を示す図。
【図９】メモリアクセス回路が行うデータ整形操作の一例として、データのシャッフルパターンの内容を示す図。
【符号の説明】
【００６９】
１０  プロセッサ
１２  レジスタファイル
１４  メモリ
２０  メモリアクセス回路
２４  ＦＩＦＯイネーブルレジスタ
２６  比較器
２８  論理積回路
３０  ＦＩＦＯバッファ
３２  セレクタ
３４  論理積回路
【図１】
2007264909.tif 000003
【図２】
2007264909.tif 000004
【図３】
2007264909.tif 000005
【図４】
2007264909.tif 000006
【図５】
2007264909.tif 000007
【図６】
2007264909.tif 000008
【図７】
2007264909.tif 000009
【図８】
2007264909.tif 000010
【図９】
2007264909.tif 000011