(57)【要約】【課題】メモリに格納されたストリームデータに対するアクセス効率を向上することができる情報処理装置及びデータアクセス方法を提供すること。【解決手段】本発明にかかる情報処理装置は、ストリーム識別情報によって識別されるストリームデータを複数格納するメモリ２と、複数のストリームデータのストリーム識別情報に応じて、当該複数のストリームデータに割り当てられ、当該割り当てられたストリームデータをメモリ２から先読みする複数のチャネルユニット２１、２２、２３、２４であって、異なるストリーム識別情報によって示されるストリームデータに対して異なるチャネルユニットが割り当てられる複数のチャネルユニット２１、２２、２３、２４と、チャネルユニットが先読みしたストリームデータにアクセスするプロセッサ１と、を備える。【選択図】図１
2011215805.tif 000002
【特許請求の範囲】
【請求項１】
ストリーム識別情報によって識別されるストリームデータを格納するメモリと、
前記ストリーム識別情報にもとづいて前記ストリームデータを先読みしつつ記憶するひとつ以上のチャネルユニットと、
前記チャネルユニットが記憶したストリームデータにアクセスするプロセッサと、
を備えることを特徴とする情報処理装置。
【請求項２】
前記プロセッサから送信されるストリームアクセス要求に対して、前記ストリームアクセス要求に含まれるストリーム識別情報を前記チャネルユニットのいずれかに割り当てるとともに、前記ストリーム識別情報に対応するストリームデータを記憶し先読みできるように当該チャネルユニットを制御するメイン制御ユニット、をさらに備えることを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記メイン制御ユニットは、前記ストリーム識別情報を前記チャネルユニットに割り当てる際に、当該ストリームデータに関するストリーム情報を前記メモリから読み出して当該チャネルユニットに格納する、ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記ストリーム情報は前記ストリームデータの位置情報を含み、
前記チャネルユニットは、前記プロセッサからストリームアクセス要求が送信された時に、前記位置情報にもとづいて前記ストリームデータを先読みするとともに、当該位置情報を更新する、ことを特徴とする請求項３に記載の情報処理装置。
【請求項５】
前記チャネルユニットは、所定のサイズのデータが格納される第１のデータ記憶部及び第２のデータ記憶部を備え、前記位置情報が示す位置のデータを第１データ記憶部に格納し、第１データ記憶部に格納されたデータの後続データを第２データ記憶部に格納する、ことを特徴とする請求項４に記載の情報処理装置。
【請求項６】
メモリに格納され、ストリーム識別情報で識別されるストリームデータに対してプロセッサがアクセスするデータアクセス方法であって、
前記ストリーム識別情報にもとづいて前記ストリームデータに対してチャネルユニットを割り当てて、
前記チャネルユニットがメモリに格納された前記ストリームデータを先読みしつつ記憶し、
前記プロセッサが前記チャネルユニットに記憶されたストリームデータにアクセスする、データアクセス方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置及びデータアクセス方法に関する。
【背景技術】
【０００２】
近年のＣＰＵ（Central Processing Unit）やＤＳＰ（Digital Signal Processor）などのプロセッサは、頻繁に利用するデータへ高速にアクセスするために、キャッシュメモリを持っている。もし要求されたデータがキャッシュメモリに存在すれば、キャッシュメモリからデータを読み出して、プロセッサへ渡す。もし要求されたデータがキャッシュメモリに存在しなければ、メモリからデータを読み出して、キャッシュメモリへ保存し、プロセッサへ渡す。頻繁に使用されるデータはキャッシュメモリに存在する確率が高く、滅多に使用されないデータはキャッシュメモリに存在する確率が低くなる。この性質によって、キャッシュメモリはメモリアクセスにかかる平均的時間を小さくすることができる。
【０００３】
キャッシュメモリの問題のひとつは、再利用されない連続的なデータアクセスの効率が悪い、ということである。ここでは、再利用されない連続的なデータアクセスをストリーム的なデータアクセスと呼ぶことにする。具体的な例をあげてこれを説明する。例えば、メモリ上に連続的に配置された配列データＡの各要素を先頭から順番にキャッシュメモリを経由してプロセッサが読む場合を考える。
【０００４】
このとき、配列データＡのサイズに応じた記憶領域（複数のキャッシュライン）がキャッシュメモリに割り当てられる。もしプロセッサが配列データＡを一度しか読まない場合は、キャッシュメモリに割り当てられた複数のキャッシュラインは再利用されることはない。再利用されないデータをキャッシュメモリに長い時間格納しておくことは、キャッシュメモリの効率を低下させる要因となる。例えば、再利用されないデータをキャッシュメモリに格納することによって、それ以外の使用頻度が高いデータをキャッシュメモリに格納できなくなってしまう可能性が高まり、キャッシュメモリの効率が低下してしまう。その場合、使用頻度が高いデータをメモリからキャッシュメモリへ転送する回数が多くなってしまい、キャッシュメモリのメリットが生かせなくなってしまう。また、配列データＡのサイズに応じて、割り当てられるキャッシュラインの数は増加する。一般的に、配列データのような連続的なデータは、キャッシュメモリの容量を多く消費してしまう。したがって、キャッシュメモリにおいて、連続的に配置されたサイズの大きなデータを1度だけ読むことは、キャッシュメモリの利用効率を低下させる。
【０００５】
このような問題は、上述したような配列データ同士でも発生し得る。例えば、配列データＡをキャッシュメモリに読み込み後、配列データＡの利用途中で他の配列データＢがキャッシュメモリに読み込まれて、配列データＡが上書きされてしまった場合である。この場合、配列データＡが再利用されないものであっても、配列データＡの利用が終わっていない。そのため、配列データＡを再度読み込む必要がでてしまう。このように、メモリに連続して格納されるような配列データに対するアクセス効率が低下してしまっているという問題がある。
【０００６】
ストリーム的データアクセスに対するキャッシュメモリの効率を向上するために、いくつかの装置や方法が提案されている。プロセッサの中には、将来使用されるデータを予測して先読み（プリフェッチ）を効率良く行う機能をもつものがある。そのようなプロセッサでは、プログラムにおけるデータアクセス順序を調整するといった最適化を行わずとも、キャッシュメモリの効率を向上させることができる。
【０００７】
一方、メディア処理/通信処理などの特定用途向けのプロセッサのなかには、データのアクセス方法を工夫するようなプログラム最適化とデータの先読み機能などを組み合わせて、ストリーム的データアクセスに適したキャッシュメモリを構成する例がある。以下に示す特許文献１と２は、そのような装置や方法の例である。 
【０００８】
特許文献１は、キャッシュメモリ位置を第１及び第２のグループのうち異なるものに動的に割り当て、メインメモリアドレスを１つのグループ内の特定のキャッシュメモリ位置にマップする技術を開示している。特許文献１は、ストリームとその他の一般的なデータをひとつのキャッシュで扱うために、互いにキャッシュのラインを奪い合う状況が発生するという問題がある。
【０００９】
特許文献２は、ストリームをストリーム識別子で区別して、ストリーム識別子ごとに異なるキャッシュラインを割り当てることを特徴としている。特許文献２はストリームのキャッシュミスを低減させるための方法については言及していないので、特許文献２がストリームのキャッシュミスを低減できるか否かは不明である。特許文献２は、ストリームの先読み機能をもたないことが問題である。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特表２００３−５１７６８２号公報
【特許文献２】特表２００６−５２００４４号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
背景技術として説明したように、メモリに連続的に格納されるストリームデータに対するアクセス効率が低下してしまっているという問題がある。
【００１２】
本発明の目的は、上述したような課題を解決するために、メモリに格納されたストリームデータに対するアクセス効率を向上することができる情報処理装置及びデータアクセス方法を提供することにある。
【課題を解決するための手段】
【００１３】
本発明の第１の態様にかかる情報処理装置は、
ストリーム識別情報によって識別されるストリームデータを複数格納するメモリと、
前記ストリーム識別情報にもとづいて前記ストリームデータを先読みしつつ記憶するひとつ以上のチャネルユニットと、
前記チャネルユニットが記憶したストリームデータにアクセスするプロセッサと、
を備えた情報処理装置。
前記チャネルユニットは、前記プロセッサからストリームデータを受け取って記憶しつつ、以前に記憶したストリームデータを前記ストリーム識別情報にもとづいて前記メモリへ格納してもよい。
【００１４】
本発明の第２の態様にかかるデータアクセス方法は、
メモリに格納され、ストリーム識別情報で識別されるストリームデータに対してプロセッサがアクセスするデータアクセス方法であって、
前記ストリーム識別情報にもとづいて前記ストリームデータに対してチャネルユニットを割り当てて、
前記チャネルユニットがメモリに格納された前記ストリームデータを先読みしつつ記憶し、
前記プロセッサが前記チャネルユニットに記憶されたストリームデータにアクセスするような、データアクセス方法。
前記チャネルユニットは、前記プロセッサからストリームデータを受け取って記憶しつつ、以前に記憶したストリームデータを前記ストリーム識別情報にもとづいて前記メモリへ格納してもよい。
【発明の効果】
【００１５】
上述した本発明の各態様により、メモリに格納されたストリームデータに対するアクセス効率を向上することができる情報処理装置及びデータアクセス方法を提供することができる。
【図面の簡単な説明】
【００１６】
【図１】本発明の実施の形態にかかる情報処理装置の概要を示す構成図である。
【図２】本発明の実施の形態にかかる情報処理装置の構成図である。
【図３】本発明の実施の形態にかかるチャネルユニットの構成図である。
【図４】本発明の実施の形態にかかるチャネル記憶ユニットの構成図である。
【図５】本発明の実施の形態にかかる「チャネル割り当て」のフローチャートである。
【図６】本発明の実施の形態にかかる「データ取得処理」のフローチャートである。
【図７】本発明の実施の形態にかかるストリームを利用開始する処理「ＯＰＥＮ」のフローチャートである。
【図８】本発明の実施の形態にかかるストリームからデータを読み込む処理「ＲＥＡＤ」のフローチャートである。
【図９】本発明の実施の形態にかかるストリームへデータを書込む処理「ＷＲＩＴＥ」のフローチャートである。
【図１０】本発明の実施の形態にかかるストリームの現在位置（ストリームポインタの値）を変更する処理「ＳＥＥＫ」のフローチャートである。
【図１１】本発明の実施の形態にかかるストリームを利用停止する処理「ＣＬＯＳＥ」のフローチャートである。
【発明を実施するための形態】
【００１７】
まず、図１を参照して、本発明の実施の形態にかかる情報処理装置の概要を示す。図１は、本発明の実施の形態１にかかる情報処理装置の概要を示す構成図である。
【００１８】
情報処理装置は、プロセッサ１、メモリ２及びチャネルユニット２１〜２４を備える。なお、チャネルユニットの数は、ここで例示する数に限定されない。
プロセッサ１は、チャネルユニットが先読みしたストリームデータにアクセスする。
メモリ２は、ストリーム識別情報によって識別されるストリームデータを複数格納する。
チャネルユニット２１〜２４は、自身に割り当てられたストリームデータをメモリ２から先読みする。また、チャネルユニット２１〜２４は、メモリ２に格納される複数のストリームデータのストリーム識別情報に応じて、ストリームデータに割り当てられる。なお、異なるストリーム識別情報によって示されるストリームデータに対して異なるチャネルユニットが割り当てられる。
【００１９】
続いて、本発明の実施の形態にかかる情報処理装置の処理の概要について説明する。
チャネルユニット２１〜２４のうちのいずれかは、ストリームデータのストリーム識別情報に応じて、異なるストリーム識別情報によって示されるストリームデータに対して異なるチャネルユニットが割り当てられるようにストリームデータを自身に割り当てる。
ストリームデータが割り当てられたチャネルユニットは、自身に割り当てられたストリームデータを先読みする。
プロセッサは、チャネルユニットが先読みしたストリームデータにアクセスする。
【００２０】
続いて、本発明の実施の形態にかかる情報処理装置ついて図面を参照して説明する。図２は、本発明の実施の形態にかかる情報処理装置の構成図である。
【００２１】
情報処理装置は、プロセッサ１、メモリ２及びストリームアクセスユニット１０を備える。ストリームアクセスユニット１０は、メイン制御ユニット１１と、チャネルユニット１２Ａ、１２Ｂ、１２Ｃ、１２Ｄと、メモリアクセスユニット１３と、を備える。
【００２２】
ストリームアクセスユニット１０は、プロセッサ１から指示を受けて、メモリ２からデータを読み出したり、メモリ２へデータを書き込んだりするように構成される。 
プロセッサ１は、演算器、レジスタ、制御ユニット、などを備えたＣＰＵやＤＳＰなどの計算機であり、制御ユニットが外部に接続されたメモリ２に格納されたプログラムを解釈し、それにもとづいて演算器を動作させ、レジスタや外部に接続されたメモリ２へ演算結果を書込む。以降の説明において、プロセッサ１が何かの処理を行うと表記されている場合には、実際には、その処理がプログラムとして記述されていて、そのプログラムをプロセッサ１が実行することによって、その処理が行われる、ということを意味する。
【００２３】
メモリ２は、連続的なデータ（ストリーム）を保持する記憶装置である。ストリームに加えて、ストリームアクセスユニット１０を動作させるための制御情報（ストリームＩＤテーブル、各ストリームのストリーム情報）も、メモリ２に格納される。ここで、本実施の形態において、「ストリーム」又は「ストリームデータ」とは、メモリ２に連続的に格納されるデータである。「ストリーム」又は「ストリームデータ」は、例えば、配列データ、映像データ、音声データ及び通信データ等が含まれる。つまり、「ストリーム」又は「ストリームデータ」は、例えば、連続するデータであって、先頭から順番にアクセスされるデータである。また、「ストリーム」又は「ストリームデータ」は、例えば、いちど利用されるだけで再利用される可能性の低いデータである。
【００２４】
ストリームアクセスユニット１０において、メイン制御ユニット１１は、プロセッサ１から与えられた指示を解釈し、その指示にもとづいてチャネルユニット１２Ａ、１２Ｂ、１２Ｃ、１２Ｄのいずれかを選択し、プロセッサ１から与えられた指示の動作を選択したチャネルユニットに行なわせるよう制御する。メモリアクセスユニット１３は、チャネルユニット１２Ａ、１２Ｂ、１２Ｃ、１２Ｄから与えられた制御信号とデータにもとづいて、メモリ２からデータを読み出したり、あるいはメモリ２へデータを書込んだりする。
【００２５】
図３に示すように、チャネルユニット１２Ａ、１２Ｂ、１２Ｃ、１２Ｄは、それぞれ、チャネル制御ユニット１２１と、チャネル記憶ユニット１２２と、を備える。チャネルユニット１２Ａ、１２Ｂ、１２Ｃ、１２Ｄは、自身に割り当てられたストリームをメモリ２に代わって記憶(キャッシュ)したり先読みしたりする。これによって、チャネルユニット１２Ａ、１２Ｂ、１２Ｃ、１２Ｄは、プロセッサ１に対してストリームに対する高速なアクセスを実現する。チャネル記憶ユニット１２２は、メモリ上に連続的に格納されたデータ配列（ストリーム）に関する情報を格納する。図４に示すように、チャネル記憶ユニット１２２に格納されるストリーム情報は以下の項目を含む。チャネル記憶ユニット１２２には、チャネルユニットに割り当てられたストリームのストリーム情報が格納される。
【００２６】
・ストリームを識別するためのストリームＩＤ 
・ストリームの現在位置（アドレス）を表すストリームポインタ 
・ストリームの内容をゼロで初期化するか否かを表すゼロクリアフラグ 
・チャネル記憶ユニットにストリーム情報が格納されていることを示すＣＨＶＡＬＩＤフラグ 
・ストリームの６４バイトのデータを格納するためのバッファ０ 
・バッファ０に格納されたデータの開始アドレスのタグを格納するためのタグ０ 
・バッファ０にデータが格納されているか否かを表すフラグを格納するためのＢＦＶＡＬＩＤフラグ０ 
・バッファ０に格納されたデータがメモリ２に格納されたデータと不一致となっているか否かを表すフラグを格納するＤＩＲＴＹフラグ０
・ストリームの６４バイトのデータを格納するためのバッファ１ 
・バッファ１に格納されたデータの開始アドレスのタグを格納するためのタグ１ 
・バッファ１にデータが格納されているか否かを表すフラグを格納するためのＢＦＶＡＬＩＤフラグ１ 
・バッファ１に格納されたデータがメモリ２に格納されたデータと不一致となっているか否かを表すフラグを格納するＤＩＲＴＹフラグ１
【００２７】
タグとは、バッファに格納されたデータの開始アドレスから計算されたビットパターンである。一般的には、バッファに格納されたデータの開始アドレスの上位ビットがそのままタグとなる。例えば、バッファのサイズを６４バイトとすると、６４バイトは６ビットのアドレスに相当するので、バッファに格納されたデータの開始アドレスの下位６ビットを除いたビットパターンをタグとする。タグの計算方法はこれだけではなく、従来の一般的なタグの計算方法を本実施の形態で使用してもよい。
本実施の形態では、バッファ０あるいはバッファ１のサイズを６４バイトとしているが、バッファのサイズは６４バイトには限定されない。６４バイトではなく、バッファのサイズを３２バイトあるいは１２８バイトなどの２のべき乗の数にしてもよい。
【００２８】
上記の項目に加えて、ストリームの開始アドレスや ストリームのデータサイズをストリーム情報に含んでも良い。もしこれらの項目をチャネル記憶ユニット１２２に格納しておくと、ストリームの現在位置がストリームから外れたか否かを チャネル制御ユニット１２１がすみやかに知ることができる。さらには、ストリームの現在位置がストリームの終端に達した場合に、ストリームの先頭に現在位置を移動する、という制御をチャネル制御ユニット１２１が行うことが可能になる。ストリームの開始アドレスをストリーム情報に含めておくと、このようなメリットがあるものの、以降の説明では、ストリームの開始アドレスとデータサイズをストリーム情報に含めない、という仮定で説明する。 
【００２９】
＜＜ストリームアクセスユニット１０によるストリーム処理に共通の動作の説明＞＞
ストリームアクセスユニット１０がもつ機能に共通の動作を説明する。共通の機能とは、「チャネル割り当て」と「データ取得処理」である。これらの動作をまず説明した後で、ストリームアクセスユニット１０の機能を説明する。
【００３０】
＜チャネル割り当て＞
まず、ストリームアクセスユニット１０がもつ機能に共通の動作である「チャネル割り当て」について説明する。チャネル割り当ては、ストリームアクセスユニット１０がもつチャネルユニットの中からひとつを選んで、ストリームのアクセスに割り当てる処理である。チャネル割り当てでは、割り当て対象のストリームはＳＩＤ０というストリームＩＤで指定される。ＳＩＤ０はプロセッサ１からストリームアクセスユニット１０へ与えられる制御信号に含まれている。このチャネル割り当てによって、プロセッサ１がアクセスするストリームをキャッシュ及び先読みするチャネルユニットを選択する。つまり、プロセッサ１がアクセスするストリームに、ストリームを先読みするチャネルユニットを割り当てる。チャネル割り当ての処理のフローチャートを図５に示す。チャネル割り当ての処理の流れは以下のとおりである。各項目の内容を以降で具体的に説明する。
【００３１】
・ステップＳ１１１：置換えチャネルユニットを選択 
・ステップＳ１１２：置換えチャネルユニットのバッファの内容を書き戻す 
・ステップＳ１１３：置換えチャネルユニットのストリーム情報を退避 
・ステップＳ１１４：新たなストリーム情報を置換えチャネルユニットへ格納 
【００３２】
[ステップＳ１１１：置換えチャネルユニットを選択]
ステップＳ１１１において、ストリームアクセスユニット１０のメイン制御ユニット１１は、チャネルユニット１２Ａ、１２Ｂ、１２Ｃ、１２Ｄの中から、所定の基準にもとづいて、ひとつのチャネルユニットを選択する。選択したチャネルユニットをＣＨ９９と呼ぶことにする。ここで、所定の基準とは、例えば、最近最も使用されていないチャネルユニットを選ぶとか、番号順にチャネルユニットを選ぶとか、ランダムにチャネルユニットを選ぶ、などが考えられる。一般的なキャッシュのライン置換えアルゴリズムを、チャネルユニットの選択に応用してもよい。メイン制御ユニット１１は、選択したチャネルユニットに、ストリームの割り当てを指示する制御信号を出力する。この制御信号には、ＳＩＤ０が含まれる。チャネルユニット１２Ａ、１２Ｂ、１２Ｃ、１２Ｄは、この制御信号に応じて、ステップＳ１１２以降の処理を実行する。なお、チャネルユニット１２Ａ、１２Ｂ、１２Ｃ、１２Ｄは、この制御信号に含まれるＳＩＤ０が示すストリームを自身に割り当てる。
【００３３】
[ステップＳ１１２：置換えチャネルユニットのバッファの内容を書き戻す]
ステップＳ１１２において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、もしチャネル記憶ユニット１２２のいずれかのバッファのＤＩＲＴＹフラグがゼロでなければ、メモリアクセスユニット１３を使って、そのバッファの内容をタグが示すメモリ２上のアドレスへ書き戻し、そのバッファのＤＩＲＴＹフラグをゼロにする。そうでなければ、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、何もしない。
【００３４】
ここで、この書き戻しは、選択したチャネルユニットに既にストリームが割り当てられている場合に行われる。この場合、ＳＩＤ０のストリームを新たに割り当てるため、既に割り当てられているストリームは、どのチャネルユニットへも割り当てられていない状態に変更される。そのため、既に割り当てられているストリームについて、チャネルユニットがキャッシュしているデータをメモリ２に反映するようにしている。具体的には、プロセッサ１から既に割り当てられているストリームに対する書き込みがあり、書き込み内容がバッファからメモリ２に反映されておらず、ＤＩＲＴＹフラグがゼロ以外となっている場合に、書き込み内容をバッファからメモリ２に反映するようにしている。つづいて、ステップＳ１１３へ進む。
【００３５】
[ステップＳ１１３：置換えチャネルユニットのストリーム情報を退避]
ステップＳ１１３において、もしチャネルユニットＣＨ９９のチャネル記憶ユニット１２２のＣＨＶＡＬＩＤフラグがゼロでなければ、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、チャネル記憶ユニット１２２のストリームＩＤが示すメモリ領域へ チャネル記憶ユニット１２２のストリーム情報を格納する。ストリーム情報は後述する「ＯＰＥＮ」という処理によって作成される情報である。ストリーム情報は「ＲＥＡＤ」や「ＷＲＩＴＥ」などの処理によって変更される。ストリーム情報の中身についてはステップS１１４で説明する。ここで、ストリームＩＤは、後述するように、メモリ２においてストリーム情報が格納されるアドレスを示す。なお、ここでのストリーム情報のメモリ２への格納は、選択したチャネルユニットに既にストリームが割り当てられている場合(ＣＨＶＡＬＩＤフラグがゼロでない場合)に行われる。この場合、次のステップＳ１１４において、新たに割り当てるＳＩＤ０のストリームのストリーム情報をチャネル記憶ユニット１１２に格納するため、既に割り当てられているストリームのストリーム情報をメモリ２に退避するようにしている。
【００３６】
[ステップＳ１１４：新たなストリーム情報を置換えチャネルユニットへ格納]
ステップＳ１１４において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、メモリアクセスユニット１３を使って、ＳＩＤ０というストリームＩＤが示すメモリ領域からストリーム情報を読み出し、それをチャネル記憶ユニット１２２に格納するとともに、チャネル記憶ユニット１２２のＣＨＶＡＬＩＤフラグへ１を代入する。なお、ＳＩＤ０というストリームＩＤに対応したストリーム情報は「ＯＰＥＮ」という処理によってメモリ２上に作成されたものである。「ＯＰＥＮ」は新たなストリームを利用開始する処理である。チャネルユニットＣＨ９９がＳＩＤ０というストリームＩＤのストリームを扱うためには、それに対応するストリーム情報をメモリ２から読み出して、チャネル記憶ユニット１２２に格納するのである。ここで、チャネル記憶ユニット１２２に格納されるストリーム情報は以下の項目を含む。
【００３７】
・ストリームＩＤ：ストリームを識別するためのストリーム識別子 
・ストリームポインタ：ストリームの現在位置を表すアドレス 
・ゼロクリアフラグ：ストリームの内容をゼロで初期化するか否かを表すフラグ 
以上が「チャネル割り当て」の処理内容である。
【００３８】
＜データ取得処理＞
次に、「データ取得処理」について説明する。データ取得処理は、ストリームアクセスユニット１０のチャネルユニット（１２Ａ、１２Ｂ、１２Ｃ、１２Ｄのいずれか）において、チャネル記憶ユニット１２２のストリームポインタに対応するバッファをバッファ０あるいはバッファ１から選択し、選択したバッファにデータを格納する処理である。格納されるデータは、ゼロか、あるいはストリームポインタが示すメモリ２上のアドレスから読み込んだデータである。どちらのデータが格納されるかは、チャネル記憶ユニット１２２のゼロクリアフラグによって決まる。例えば、ゼロクリアフラグがゼロの場合は、メモリ２のストリームポインタが示すアドレスから読み込んだデータが選択したバッファに格納される。また、例えば、ゼロクリアフラグがゼロ以外の場合は、選択したバッファ全体にゼロが格納される。データ取得処理のフローチャートを図６に示す。データ取得処理の流れは以下のとおりである。各項目の内容を以降で具体的に説明する。以降の説明では、データ取得処理の対象となるチャネルユニットをＣＨ９９と呼ぶことにする。 
【００３９】
・ステップＳ１２１：バッファ選択 
・ステップＳ１２２：選択したバッファにデータを転送 
・ステップＳ１２３：選択したバッファのＤＩＲＴＹフラグをクリア 
・ステップＳ１２４：選択したバッファをクリア 
・ステップＳ１２５：選択したバッファのＤＩＲＴＹフラグをセット 
・ステップＳ１２６：選択したバッファのタグをセット 
・ステップＳ１２７：選択したバッファのＢＦＶＡＬＩＤフラグをセット 
【００４０】
[ステップＳ１２１：バッファ選択]
ステップＳ１２１において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、チャネル記憶ユニット１２２のストリームポインタに対応するバッファをチャネル記憶ユニット１２２のバッファ０もしくはバッファ１の中から選択する。ここで、選択方法としては、ストリームポインタの所定のビットの値にもとづいてバッファ０かバッファ１を選択する、あるいは最近もっともアクセスされていない方のバッファを選択する、という方法などが考えられる。ストリームポインタの所定のビットの値を使う方法の具体的な例をひとつ示す。本実施の形態では、バッファ０、１の容量が６４バイトの場合について例示しているので、ストリームポインタの下位６ビット（６４バイト分）以外のひとつのビットの値を使って、バッファ０あるいはバッファ１のいずれかを選択してもよい。このようにして選択したバッファをＢＦ９９と呼ぶことにする。
つづいて、もしチャネル記憶ユニット１２２のゼロクリアフラグがゼロならば、ステップＳ１２２へ進む。もしそうでないならば、ステップＳ１２４へ進む。 
【００４１】
[ステップＳ１２２：選択したバッファにデータを転送]
ステップＳ１２２において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、もしチャネル記憶ユニット１２２のゼロクリアフラグがゼロならば、メモリアクセスユニット１３を使って、チャネル記憶ユニット１２２のストリームポインタが示すメモリ２上のアドレスから始まる６４バイトのデータを読み出し、そのデータをバッファＢＦ９９へ格納する。つづいて、ステップＳ１２３へ進む。
【００４２】
[ステップＳ１２３：選択したバッファのＤＩＲＴＹフラグをクリア]
ステップＳ１２３において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、もしチャネル記憶ユニット１２２のゼロクリアフラグがゼロならば、バッファＢＦ９９のＤＩＲＴＹフラグへゼロを書込む。つづいて、ステップＳ１２６へ進む。 
【００４３】
[ステップＳ１２４：選択したバッファをクリア]
ステップＳ１２４において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、もしチャネル記憶ユニット１２２のゼロクリアフラグがゼロでないならば、バッファＢＦ９９の全体にゼロを書込む。ここで、バッファのゼロクリアは、例えば、後述するストリームへデータを書き込む処理「ＷＲＩＴＥ」において、プロセッサ１がストリームに対して新規にデータの書き込みを行う場合に行われる。「ＷＲＩＴＥ」はデータを書き込む処理なので、書き込む以前のデータの値を必要としないことが多い。そこで、書き込む以前のデータの値が必要ない場合には、それらをゼロだと仮定することによって、メモリ２から書き込む以前のデータを読み込む処理を省略することができる。さらに、ストリームに対して書き込みをする場合において、プロセッサ１が書き込んだデータ以外のデータを全てゼロとしたい場合にも有効である。このようにすることで、メモリ２からストリームを読み出す処理(ステップＳ１２２)を省略することができる。つづいて、ステップＳ１２５へ進む。
【００４４】
[ステップＳ１２５：選択したバッファのＤＩＲＴＹフラグをセット]
ステップＳ１２５において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、もしチャネル記憶ユニット１２２のゼロクリアフラグがゼロでないならば、バッファＢＦ９９のＤＩＲＴＹフラグへ１を書込む。つづいて、ステップＳ１２６へ進む。 
【００４５】
[ステップＳ１２６：選択したバッファのタグをセット]
ステップＳ１２６において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、チャネル記憶ユニット１２２のストリームポインタに対応するタグの値を計算し、バッファＢＦ９９のタグへ書き込む。タグの計算方法としては、例えば、ストリームポインタの上位数ビットの値をそのままタグとする、などの方法でもよい。つづいて、ステップＳ１２７に進む。 
【００４６】
[ステップＳ１２７：選択したバッファのＢＦＶＡＬＩＤフラグをセット]
ステップＳ１２７において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、バッファＢＦ９９のＢＦＶＡＬＩＤフラグへ１を書込む。
以上が「データ取得処理」の処理内容である。
【００４７】
＜＜ストリームアクセスユニット１０によるストリーム処理の動作の説明＞＞
ストリームアクセスユニット１０によるストリーム処理の動作について説明する。ここでは、以下の五つの処理に分けて、ストリームアクセスユニット１０の動作を説明する。
【００４８】
・ストリームを利用開始する：ＯＰＥＮ 
・ストリームからデータを読み込む：ＲＥＡＤ 
・ストリームへデータを書込む：ＷＲＩＴＥ 
・ストリームのカレントポジションを移動する：ＳＥＥＫ 
・ストリームを利用停止する：ＣＬＯＳＥ 
【００４９】
＜ストリームを利用開始する：ＯＰＥＮ＞
「ＯＰＥＮ」は、ストリームをストリームアクセスユニット１０が扱えるようにするための初期化処理である。ストリームアクセスユニット１０は、ストリームＩＤを使ってストリームを識別する。したがって、ストリームアクセスユニット１０が扱うストリームにはＩＤを割り当てる必要がある。ストリームＩＤは、ストリームを利用開始する処理の中で割り当てられる。 
【００５０】
ストリームを利用開始するための処理のフローチャートを図７に示す。ストリームを利用開始するための処理の流れは以下のとおりである。ステップＳ１１からステップＳ１３はプロセッサ１が実行し、ステップＳ１４からステップＳ１５はストリームアクセスユニット１０が実行する。各項目の内容を以降で具体的に説明する。
【００５１】
・ステップＳ１１：ストリーム情報の記憶領域割り当て
・ステップＳ１２：ストリーム情報作成
・ステップＳ１３：チャネル割り当て要求
・ステップＳ１４：チャネル割り当て
・ステップＳ１５：データ取得処理
【００５２】
[ステップＳ１１：ストリーム情報の記憶領域割り当て]
ステップＳ１１において、プロセッサ１は、新たなストリームに関する情報を格納するためのメモリ領域を割り当てる。具体的には、ストリーム情報を格納するためのメモリ領域のアドレスを予めテーブル（ストリームＩＤテーブル）に格納しておいて、そのテーブルの中から利用可能なアドレスを見つけて、新たなストリーム情報に割り当てる。このアドレスをストリームＩＤとして使用する。つまり、ストリームＩＤは、ストリームを識別するストリーム識別情報として機能する。テーブルの各エントリには、アドレスと、アドレスを使用中か否かを表すフラグ、を格納しておく。アドレスをストリームＩＤとして使用する際には、そのアドレスに対応するフラグに１を代入する。
【００５３】
[ステップＳ１２：ストリーム情報作成]
ステップＳ１２において、プロセッサ１は、新たなストリームに関するストリーム情報を作成し、そのストリーム情報をストリームＩＤが示すメモリ２上のアドレスへ格納する。ここで、メモリ２に格納されるストリーム情報は以下の項目を含む。
【００５４】
・ストリームを識別するためのストリームＩＤ 
・ストリームの内容をゼロで初期化するか否かを表すゼロクリアフラグ 
・ストリームの現在のアドレスを表すストリームポインタ（初期値はストリーム開始アドレスの下位６ビット(バッファサイズの６４バイト分に相当)をゼロにした値） 
【００５５】
上記の項目に加えて、ストリームの開始アドレスやストリームのデータサイズをストリーム情報に含んでも良い。 
[ステップＳ１３：チャネル割り当て要求]
ステップＳ１３において、プロセッサ１は、ストリームアクセスユニット１０に対して、新たなストリームにチャネルユニットをひとつ割り当てるように指示する。この指示は、新たなストリームを特定するために、ストリームＩＤ（ＳＩＤ０）を含んでいる。言い換えると、プロセッサ１は、ストリームの割り当てを指示する制御信号をメイン制御ユニット１０に出力する。メイン制御ユニット１１は、この制御信号に応じて、ステップＳ１４の処理を実行する。
【００５６】
[ステップＳ１４：チャネル割り当て]
ステップＳ１４において、ストリームアクセスユニット１０のメイン制御ユニット１１は、与えられたＳＩＤ０というストリームＩＤにチャネルユニットを割り当てる。この割り当て処理は、共通処理のステップＳ１１１〜Ｓ１１４のチャネル割り当てである。
【００５７】
[ステップＳ１５：データ取得処理]
ステップＳ１５において、ステップ１５で割り当てられたチャネルユニットＣＨ９９のチャネル制御ユニット１２１は、チャネル記憶ユニット１２２のストリームポインタに対応するバッファを選択し、そのバッファへデータを格納する。このデータ取得処理は、共通処理のステップＳ１２１〜Ｓ１２７のデータ取得処理である。この処理によって選択されたチャネルユニットＣＨ９９のバッファをＢＦ９９と呼ぶことにする。
以上が「ＯＰＥＮ」の処理内容である。
【００５８】
＜ストリームからデータを読み込む：ＲＥＡＤ＞
「ＲＥＡＤ」は、ストリームからデータを読み出す処理である。プロセッサ１は、ストリームを特定するためのストリームＩＤ（ＳＩＤ０）と、読み出したいデータのサイズ（ＳＩＺＥ０）と、ストリームリードコマンドと、をストリームアクセスユニット１０へ送信する。ストリームアクセスユニット１０は、これらを受け取って、ＳＩＤ０というストリームから指定されたサイズのデータを読み出して、そのデータをプロセッサ１へ送信する。ストリームからデータを読み出す処理「ＲＥＡＤ」のフローチャートを図８に示す。
ストリームアクセスユニット１０がＳＩＤ０というストリームから指定されたサイズＳＩＺＥ０のデータを読み出す処理の流れは以下のとおりである。各項目の内容を以降で具体的に説明する。 
【００５９】
・ステップＳ２１：チャネルユニット探索
・ステップＳ２２：チャネル割り当て
・ステップＳ２３：データ取得処理
・ステップＳ２４：バッファからデータ読み出し
・ステップＳ２５：データ先読み要否判定
・ステップＳ２６：データ先読み処理
・ステップＳ２７：ストリームの現在位置更新
【００６０】
[ステップＳ２１：チャネルユニット探索]
ステップＳ２１において、メイン制御ユニット１１は、 与えられたストリームＩＤ（ＳＩＤ０）をチャネル記憶ユニット１２２の中にもつチャネルユニットを探す。なお、メイン制御ユニット１１は、プロセッサ１から出力されたストリームリードコマンドに応じて、ステップＳ２１の処理を実行する。もしそのようなチャネルユニットが見つかれば、それをＣＨ９９として、ステップＳ２４に進む。チャネルユニットＣＨ９９が見つかった場合、メイン制御ユニット１１は、データの読み出しを指示する制御信号をチャネルユニットＣＨ９９に出力する。この制御信号には、プロセッサ１から出力されたＳＩＺＥ０が含まれる。チャネルユニットＣＨ９９は、この制御信号に応じて、ステップＳ２４の処理を実行する。もしそのようなチャネルユニットが見つからなければ、ステップＳ２２に進む。
【００６１】
[ステップＳ２２：チャネルユニット割り当て]
ステップＳ２２において、メイン制御ユニット１１は、与えられたＳＩＤ０というストリームＩＤを使って、共通処理のステップＳ１１１〜Ｓ１１４のチャネル割り当てを行う。この処理によって割り当てられたチャネルユニットをＣＨ９９と呼ぶことにする。つづいて、ステップＳ２３へ進む。
【００６２】
[ステップＳ２３：データ取得処理]
ステップＳ２３において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、共通処理のステップＳ１２１〜Ｓ１２７のデータ取得処理を行う。つづいて、ステップＳ２４へ進む。ここで、チャネルユニットＣＨ９９がデータの取得完了を通知する制御信号をメイン制御ユニット１１に出力するようにして、メイン制御ユニット１１が、この制御信号に応じて、データの読み出しを指示する制御信号をチャネルユニットＣＨ９９に出力するようにしてもよい。また、ストリームの割り当てを指示する制御信号に、続けて、データ取得が完了したら、ステップＳ２４の処理を実行することを指示する情報を含めてもよい。
【００６３】
[ステップＳ２４：バッファからデータ読み出し]
ステップＳ２４において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、 チャネル記憶ユニット１２２のストリームポインタのタグと同じタグをもつバッファをチャネル記憶ユニット１２２のバッファ０もしくはバッファ１の中から選択する。ここで、ストリームポインタのタグと同じタグをもつバッファとは、ストリームポインタが示すアドレスのデータが格納されるバッファのことである。選択したバッファをＢＦ９９とする。 
【００６４】
もしストリームポインタから計算したタグと同じタグをもつようなバッファＢＦ９９が見つからないならば、そのようなバッファＢＦ９９が見つかるまで、チャネル制御ユニット１２１は待つ。もし選択したバッファＢＦ９９のＢＦＶＡＬＩＤフラグがゼロならば、バッファＢＦ９９にデータが格納されていないので、データが格納されてＢＦＶＡＬＩＤフラグがゼロでなくなるまで、チャネル制御ユニット１２１は待つ。このように待つ理由は、バッファＢＦ９９へのデータ転送が他の処理と並行して行われているために、データ転送の完了を確認するためである。バッファＢＦ９９へのデータ転送は、後述するステップＳ２６の「データ先読み処理」において、メモリアクセスユニット１３によって行われる。メモリアクセスユニット１３は他の処理と並行して「データ先読み処理」を実行するため、ステップＳ２４の時点において、先読みされたデータが確実にバッファＢＦ９９に格納されていることを確認するひつようがある。
【００６５】
その後、バッファＢＦ９９のＢＦＶＡＬＩＤフラグがゼロでなくなったら、バッファＢＦ９９の中から、チャネル制御ユニット１２１は、ストリームポインタが示すアドレスから始まるＳＩＺＥ０バイト分のデータＤＡＴＡ０を読み出す。チャネル制御ユニット１２１はデータＤＡＴＡ０をメイン制御ユニット１１へ渡し、メイン制御ユニット１１はそのデータＤＡＴＡ０をプロセッサ１へ送信する。つづいて、ステップＳ２５に進む。 
【００６６】
もしも、ストリームポインタが示すアドレスから始まるＳＩＺＥ０バイト分のデータＤＡＴＡ０が、二つのバッファ０とバッファ１にまたがって格納されている場合には、バッファ０とバッファ１からＤＡＴＡ０を読み出す。その場合には、バッファ０とバッファ１のそれぞれのＢＦＶＡＬＩＤフラグがゼロでない必要がある。また、チャネル制御ユニット１２１は、バッファＢＦ９９の末尾にあるデータを読み出した際に、バッファＢＦ９９のＢＦＶＡＬＩＤフラグへゼロを代入してもよい。これによって、全てのデータを読み出されたバッファＢＦ９９を、後述するステップＳ２６の「データ先読み処理」においてすぐに再利用することが可能となる。
【００６７】
[ステップＳ２５：データ先読み要否判定]
ステップＳ２５において、チャネル制御ユニット１２１は、チャネル記憶ユニット１２２のストリームポインタを６４バイト分（バッファのサイズ分）進めたアドレスに対応するバッファを選択する。ここで選択したバッファをＢＦ９８とする。アドレスからバッファを選択する方法は、共通処理のステップＳ１２１「バッファ選択」と同じでもよいし、より簡易的な方法を用いてもよい。例えば、本実施の形態ではチャネル記憶ユニット１２２のバッファの数は２個でそのサイズは６４バイトなので、バッファＢＦ９８とストリームポインタに対応するバッファＢＦ９９とは互いに異なるはずである。したがって、バッファの数が２個の場合には、バッファＢＦ９９ではないバッファを選択し、それをＢＦ９８としてもよい。もしバッファＢＦ９８のＢＦＶＡＬＩＤフラグがゼロであるならば、データ先読み処理が必要なので、ステップＳ２６に進む。もしそうでなければ、データ先読み処理は不要なので、ステップＳ２７に進む。
【００６８】
つまり、ストリームポインタが示すデータをバッファＢＦ９９から読む際に、もしそのデータの後続データが別のバッファＢＦ９８に格納されていないならば、チャネル制御ユニット１２１は、後続データをメモリ２から先読みして、バッファＢＦ９８に格納する。
【００６９】
[ステップＳ２６：データ先読み処理]
ステップＳ２６において、チャネル制御ユニット１２１は、チャネル記憶ユニット１２２のゼロクリアフラグにもとづいて、チャネル記憶ユニット１２２のストリームポインタを６４バイト分(バッファのサイズ分)進めたアドレスから始まる６４バイトのデータか、もしくはゼロ(６４バイト分)、のいずれかをステップＳ２５で選択したバッファＢＦ９８へ格納する。この処理は、共通処理のステップＳ１２１〜Ｓ１２７のデータ取得処理とほぼ同じである。異なる点は、ステップＳ１２１〜Ｓ１２７のデータ取得処理ではストリームポインタの値をアドレスとして使うのに対して、ステップＳ２６ではストリームポインタを６４バイト分進めたアドレスを、メモリ２からデータを読み出すアドレスとして使う、ということである。データ先読み処理において、メモリからバッファＢＦ９８へのデータ転送は、他の処理と並行して行われてもよい。例えば、データ先読み処理の完了を待たずに、チャネル制御ユニット１２１は、ステップＳ２７を開始してもよい。
【００７０】
具体的には、チャネル制御ユニット１２１は、データの読み込みを指示する制御信号を、メモリアクセスユニット１３に出力する。メモリアクセスユニット１３は、この制御信号に応じて、メモリ２からデータを読み出す。そして、メモリアクセスユニット１３は、データの読み込みを指示されたチャネルユニットに読み出したデータを出力する。そして、チャネル制御ユニット１２１は、メモリアクセスユニット１３から出力されたデータをバッファに格納して、そのバッファに対応するＢＦＶＡＬＩＤフラグを０以外の値に更新する。
【００７１】
[ステップＳ２７：ストリームの現在位置更新]
ステップＳ２７において、チャネル制御ユニット１２１は、チャネル記憶ユニット１２２のストリームポインタに、データサイズを表すＳＩＺＥ０を加算する。
以上が「ＲＥＡＤ」の処理内容である。
【００７２】
＜ストリームへデータを書込む：ＷＲＩＴＥ＞
「ＷＲＩＴＥ」は、ストリームへデータを書込む処理である。プロセッサ１は、ストリームを特定するためのストリームＩＤ（ＳＩＤ０）と、書き込みたいデータと、そのデータのサイズ（ＳＩＺＥ０）と、ストリームライトコマンドと、をストリームアクセスユニット１０へ送信する。ストリームアクセスユニット１０は、これらを受け取って、ＳＩＤ０というストリームへ与えられたデータを書込む。ストリームへデータを書込む処理「ＷＲＩＴＥ」のフローチャートを図９に示す。 
ストリームアクセスユニット１０がＳＩＤ０というストリームへ与えられたデータを書込む処理の流れは以下のとおりである。各項目の内容を以降で具体的に説明する。
【００７３】
・ステップＳ３１：チャネルユニット探索
・ステップＳ３２：チャネル割り当て
・ステップＳ３３：データ取得処理
・ステップＳ３４：バッファへデータ書き込み
・ステップＳ３５：データ書き戻し要否判定
・ステップＳ３６：データ書き戻し処理
・ステップＳ３７：データ先読み要否判定
・ステップＳ３８：データ先読み処理
・ステップＳ３９：ストリームの現在位置更新
【００７４】
[ステップＳ３１：チャネルユニット探索]
ステップＳ３１において、メイン制御ユニット１１は、与えられたストリームＩＤ（ＳＩＤ０）をチャネル記憶ユニット１２２の中にもつチャネルユニットを探す。なお、メイン制御ユニット１１は、プロセッサ１から出力されたストリームライトコマンドに応じて、ステップＳ３１の処理を実行する。もしそのようなチャネルユニットが見つかれば、それをＣＨ９９として、ステップＳ３４に進む。チャネルユニットＣＨ９９が見つかった場合、メイン制御ユニット１１は、データの書き出しを指示する制御信号をチャネルユニットＣＨ９９に出力する。この制御信号には、プロセッサ１から出力された書き込みデータ及びＳＩＺＥ０が含まれる。チャネルユニットＣＨ９９は、この制御信号に応じて、ステップＳ３４の処理を実行する。もしそのようなチャネルユニットが見つからなければ、ステップＳ３２に進む。
【００７５】
[ステップＳ３２：チャネル割り当て]
ステップＳ３２において、メイン制御ユニット１１は、与えられたＳＩＤ０というストリームＩＤを使って、共通処理のステップＳ１１１〜Ｓ１１４のチャネル割り当てを行う。この処理によって割り当てられたチャネルユニットをＣＨ９９と呼ぶことにする。つづいて、ステップＳ３３へ進む。
【００７６】
[ステップＳ３３：データ取得処理]
ステップＳ３３において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、 共通処理のステップＳ１２１〜Ｓ１２７のデータ取得処理を行う。つづいて、ステップＳ３４へ進む。ここで、チャネルユニットＣＨ９９がデータの取得完了を通知する制御信号をメイン制御ユニット１１に出力するようにして、メイン制御ユニット１１が、この制御信号に応じて、データの書き出しを指示する制御信号をチャネルユニットＣＨ９９に出力するようにしてもよい。また、ストリームの割り当てを指示する制御信号に、続けて、データ取得が完了したら、ステップＳ３４の処理を実行することを指示する情報を含めてもよい。
【００７７】
[ステップＳ３４：バッファへデータ書き込み]
ステップＳ３４において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、チャネル記憶ユニット１２２のストリームポインタから計算したタグと同じタグをもつバッファをチャネル記憶ユニット１２２のバッファ０もしくはバッファ１の中から選択する。選択したバッファをＢＦ９９とする。
【００７８】
もしストリームポインタから計算したタグと同じタグをもつようなバッファＢＦ９９が見つからないならば、そのようなバッファＢＦ９９が見つかるまで、チャネル制御ユニット１２１は待つ。もし選択したバッファＢＦ９９のＢＦＶＡＬＩＤフラグがゼロならば、バッファＢＦ９９にデータが格納されていないので、データが格納されてＢＦＶＡＬＩＤフラグがゼロでなくなるまで、チャネル制御ユニット１２１は待つ。このように待つ理由は、「ＲＥＡＤ」のステップＳ２４と同様に、バッファＢＦ９９へのデータ転送の完了を確認するためである。その後、バッファＢＦ９９のＢＦＶＡＬＩＤフラグがゼロでなくなったら、チャネル制御ユニット１２１は、ストリームポインタが示すアドレスにもとづいて、バッファＢＦ９９への書込み位置を決定し、バッファＢＦ９９へプロセッサ１から与えられたデータを書込み、バッファＢＦ９９のＤＩＲＴＹフラグへ１を書込む。具体的には、チャネル制御ユニット１２１は、メイン制御ユニット１１から出力された書き込みデータを、ＳＩＺＥ０のサイズ分バッファに書き込む。
【００７９】
[ステップＳ３５：データ書き戻し要否判定]
ステップＳ３５において、チャネル制御ユニット１２１は、チャネル記憶ユニット１２２のストリームポインタから６４バイト分(バッファのサイズ分)遡ったアドレスを減算した値で表されるアドレスに対応するバッファを選択し、そのバッファのＤＩＲＴＹフラグがゼロであるか否かを調べる。アドレスからバッファを選択する方法は、共通処理のステップＳ２５における「バッファ選択」と同じである。ここで選択したバッファをＢＦ９８とする。もしＢＦ９８のＤＩＲＴＹフラグがゼロならば、データ書き戻し処理は不要なので、ステップＳ３７に進む。もしそうでなければ、データ書き戻し処理が必要なので、ステップＳ３６に進む。
【００８０】
つまり、ストリームポインタが示すデータをバッファＢＦ９８に書き込む際に、もしそのデータの先行データ(既にバッファＢＦ９８に書き込まれているデータ)が格納されるバッファＢＦ９８にデータがメモリ２に書き戻されていないならば、チャネル制御ユニット１２１は、バッファＢＦ９８に格納されたデータをメモリ２に書き戻す必要があると判断する。
【００８１】
[ステップＳ３６：データ書き戻し処理]
ステップＳ３６において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、メモリアクセスユニット１３を使って、バッファＢＦ９８のタグが示すメモリ２上のアドレスへバッファＢＦ９８の内容を書き戻し、バッファＢＦ９８のＤＩＲＴＹフラグおよびＢＦＶＡＬＩＤフラグをどちらもゼロにする。データ書き戻し処理において、バッファＢＦ９８からメモリ２へのデータ転送は、他の処理と並行して行われてもよい。例えば、データ書き戻し処理の完了を待たずに、チャネル制御ユニット１２１は、ステップＳ３７を開始してもよい。
【００８２】
具体的には、チャネル制御ユニット１２１は、メモリ２に書き戻すデータを、メモリアクセスユニット１３に出力する。メモリアクセスユニット１３は、このデータの出力に応じて、このデータをメモリ２に書き込む。
【００８３】
[ステップＳ３７：データ先読み要否判定]
ステップＳ３７において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、ＢＦＶＡＬＩＤフラグがゼロであるようなバッファが存在する場合にだけ、ステップＳ２５と同様の「データ先読み要否判定」を行う。つまり、もし先読みしたデータを格納可能なバッファが存在するならば、データ先読みの要否を判断する。そうでない場合には、データ先読みは不要と判断し、ステップＳ３９へ進む。ステップＳ２５の「データ先読み要否判定」については既に説明しているので、ここでは説明を省略する。
なお、「ＷＲＩＴＥ」はストリームへデータを書き込む処理であるため、先読みしたデータは上書きされ、メモリから先読みされたデータが無駄になってしまう。したがって、書き込み対象となるストリームに対しては、「ＯＰＥＮ」において、ゼロクリアフラグをセットしておくことが望ましい。そうすれば、「ＷＲＩＴＥ」におけるデータ先読みにおいて、メモリからのデータ先読みは行われず、ゼロという値がバッファへ格納される。
【００８４】
[ステップＳ３８：データ先読み処理]
ステップＳ３８におけるデータ先読み処理は、ステップＳ２６のデータ先読み処理と同様であるため、説明を省略する。
【００８５】
[ステップＳ３９：ストリームの現在位置更新]
ステップＳ３９において、チャネル制御ユニット１２１は、チャネル記憶ユニット１２２のストリームポインタに、データサイズを表すＳＩＺＥ０を加算する。
以上が「ＷＲＩＴＥ」の処理内容である。
【００８６】
＜ストリームの現在位置を変更する：ＳＥＥＫ＞
「ＳＥＥＫ」は、ストリームの現在位置（ストリームポインタの値）を変更する処理である。プロセッサ１は、ストリームを特定するためのストリームＩＤ（ＳＩＤ０）と、新たなストリームポインタの値（ＳＰＴＲ０）と、ストリームシークコマンドと、をストリームアクセスユニット１０へ送信する。ストリームアクセスユニット１０は、これらを受け取って、ＳＩＤ０というストリームのストリームポインタへＳＰＴＲ０を代入する。ストリームの現在位置を変更する処理「ＳＥＥＫ」のフローチャートを図１０に示す。
ストリームアクセスユニット１０がＳＩＤ０というストリームのストリームポインタの値を変更する処理の流れは以下のとおりである。各項目の内容を以降で具体的に説明する。
【００８７】
・ステップＳ４１：チャネルユニット探索
・ステップＳ４２：チャネルユニット割り当て
・ステップＳ４３：ストリーム現在位置更新
・ステップＳ４４：データ取得処理
【００８８】
[ステップＳ４１：チャネルユニット探索]
ステップＳ４１において、メイン制御ユニット１１は、与えられたストリームＩＤ（ＳＩＤ０）をチャネル記憶ユニット１２２の中にもつチャネルユニットを探す。なお、メイン制御ユニット１１は、プロセッサ１から出力されたストリームシークコマンドに応じて、ステップＳ４１の処理を実行する。もしそのようなチャネルユニットが見つかれば、それをＣＨ９９として、ステップＳ４３に進む。チャネルユニットＣＨ９９が見つかった場合、メイン制御ユニット１１は、ストリームの現在位置の更新を指示する制御信号をチャネルユニットＣＨ９９に出力する。この制御信号には、プロセッサ１から出力されたストリームポインタの値が含まれる。チャネルユニットＣＨ９９は、この制御信号に応じて、ステップＳ４３の処理を実行する。もしそのようなチャネルユニットが見つからなければ、ステップＳ４２に進む。
【００８９】
[ステップＳ４２：チャネルユニット割り当て]
ステップＳ４２において、メイン制御ユニット１１は、与えられたＳＩＤ０というストリームＩＤを使って、共通処理のステップＳ１１１〜Ｓ１１４のチャネル割り当てを行う。ここの処理によって割り当てられたチャネルユニットをＣＨ９９と呼ぶことにする。つづいて、ステップＳ４３へ進む。ここで、チャネルユニットＣＨ９９がチャネルユニットの割り当てを通知する制御信号をメイン制御ユニット１１に出力するようにして、メイン制御ユニット１１が、この制御信号に応じて、ストリームの現在位置の更新を指示する制御信号をチャネルユニットＣＨ９９に出力するようにしてもよい。また、ストリームの割り当てを指示する制御信号に、続けて、チャネルユニットの割り当てが完了したら、ステップＳ４３の処理を実行することを指示する情報を含めてもよい。
【００９０】
[ステップＳ４３：ストリーム現在位置更新]
ステップＳ４３において、チャンルユニットＣＨ９９のチャネル制御ユニット１２１は、チャネル記憶ユニット１２２のストリームポインタに、与えられたストリームポインタの値ＳＰＴＲ０を代入する。具体的には、メイン制御ユニット１１から出力されたストリームポインタの値を、チャネル記憶ユニット１２２のストリームポインタに格納する。
【００９１】
[ステップＳ４４：データ取得処理]
ステップＳ４４において、チャネルユニットＣＨ９９のチャネル制御ユニット１２１は、共通処理のステップＳ１２１〜Ｓ１２７のデータ取得処理を行う。データ取得処理において、メモリからバッファへのデータ転送は、他の処理と並行して行われてもよい。例えば、データ取得処理の完了を待たずに、チャネル制御ユニット１２１は、「ＳＥＥＫ」という処理を終了し、別の処理を開始してもよい。 
以上が「ＳＥＥＫ」の処理内容である。
【００９２】
＜ストリームを利用停止する：ＣＬＯＳＥ＞
「ＣＬＯＳＥ」は、ストリームアクセスユニット１０があるストリームの利用を停止する処理である。プロセッサ１は、ストリームを特定するためのストリームＩＤ（ＳＩＤ０）と、ストリームクローズコマンドと、をストリームアクセスユニット１０へ送信する。ストリームクローズコマンドを受け取ったら、ストリームアクセスユニット１０は、ＳＩＤ０というストリームに割り当てられたチャネルユニットを解放する。
【００９３】
続いて、プロセッサ１は、ＳＩＤ０というストリームＩＤを解放する。具体的には、ストリーム情報を格納するためのメモリ領域のアドレス（ストリームＩＤ）を格納したテーブルの中から、ＳＩＤ０というストリームＩＤに対応するアドレスを見つけ、そのアドレスに対応するフラグにゼロを代入する。ストリームの利用を停止する処理「ＣＬＯＳＥ」のフローチャートを図１１に示す。
ストリームアクセスユニット１０がストリームクローズコマンドを受信した時の処理の流れは以下のとおりである。各項目の内容を以降で具体的に説明する。
【００９４】
・ステップＳ５１：チャネルユニット探索
・ステップＳ５２：データ書き戻し処理
・ステップＳ５３：チャネルユニット解放
【００９５】
[ステップＳ５１：チャネルユニット探索]
ステップＳ５１において、メイン制御ユニット１１は、与えられたストリームＩＤ（ＳＩＤ０）をチャネル記憶ユニット１２２の中にもつチャネルユニットを探す。なお、メイン制御ユニット１１は、プロセッサ１から出力されたストリームクローズコマンドに応じて、ステップＳ５１の処理を実行する。もしそのようなチャネルユニットが見つかれば、それをＣＨ９９として、ステップＳ５２に進む。チャネルユニットＣＨ９９が見つかった場合、メイン制御ユニット１１は、ストリームの割り当て解除を指示する制御信号をチャネルユニットＣＨ９９に出力する。チャネルユニットＣＨ９９は、この制御信号に応じて、ステップＳ５２の処理を実行する。もしそのようなチャネルユニットが見つからなければ、処理を終了する。
【００９６】
[ステップＳ５２：データ書き戻し処理]
ステップＳ５２において、選択されたチャネルユニットＣＨ９９のチャネル制御ユニット１２１は、もしチャネル記憶ユニット１２２のいずれかのバッファのＤＩＲＴＹフラグがゼロでなければ、そのバッファの内容をタグが示すメモリ上のアドレスへ書き戻し、そのバッファのＤＩＲＴＹフラグおよびＢＦＶＡＬＩＤフラグをゼロにする。もしチャネルユニットＣＨ９９のいずれのバッファのＤＩＲＴＹフラグもゼロであれば、チャネル制御ユニット１２１はなにもしない。つづいて、ステップＳ５３へ進む。
【００９７】
[ステップＳ５３：チャネルユニット解放]
ステップＳ５３において、選択されたチャネルユニットＣＨ９９のチャネル制御ユニット１２１は、チャネル記憶ユニット１２２のＣＨＶＡＬＩＤフラグへゼロを代入する。ＣＨＶＡＬＩＤフラグがゼロであるようなチャネルユニットはストリームＩＤが割り当てられていないことを意味する。
【００９８】
以上に説明したように、本実施の形態によれば、メモリに格納されるストリームデータに対してプロセッサがアクセスする場合に、ストリームデータの先読みを行う機能を備えたチャネルユニットを介して、プロセッサ１はストリームデータへアクセスする。そしてストリームデータはストリームＩＤによって識別され、限られた個数のチャネルユニットによって任意の数のストリームデータおよびストリームＩＤを扱えるようにしている。チャネルユニットは、プロセッサ１からストリームデータを要求される際に、要求されたデータの後続のデータを先読みすることによって、将来のプロセッサ１からの要求に迅速に応えられるようにしている。
【００９９】
また、本実施の形態によれば、ストリームを利用開始する処理「ＯＰＥＮ」と、ストリームを利用停止する処理「ＣＬＯＳＥ」によって、プロセッサからアクセスするストリームデータの数を任意に調整することができる。
【０１００】
また、本発明は、ひとつのストリームのデータを記憶するために、ひとつのチャネルユニットを使用するようにすることができる。チャネルユニットは、一般的なキャッシュメモリのキャッシュライン(あるいはキャッシュブロック)に相当する記憶要素である。一般的なキャッシュメモリは、データのアドレスにもとづいて、キャッシュラインの割当を決定する。一方、本発明では、ストリームＩＤにもとづいて、チャネルユニットの割当を決定する。データのアドレスは一般的に大きな空間に広がっているため、適当なヒット率を得るために必要なキャッシュラインの数は多くなる。一方、ストリームＩＤの個数はアドレス空間よりも小さいため、適当なヒット率を得るために必要なチャネルユニットの数は比較的少ない。本発明では、同時に使用するストリームの数にもとづいて必要なチャネルユニットの数を決めれば良いので、一般的なキャッシュのキャッシュラインの数よりもチャネルユニットの数を非常に少なくできる。
したがって、一般的なキャッシュメモリに比べて、本発明は少ない記憶要素でストリームデータを記憶することができる。このことによって、小回路規模のキャッシュを実現できる。
【０１０１】
以上説明したように、本発明を使用すれば、ストリームデータに適した小回路規模のキャッシュを構成することができる。ストリームデータは、画像／映像／音楽／通信などの処理で広く使われるため、そうした分野のプロセッサに対して、本発明を応用することが可能である。
【０１０２】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
【０１０３】
＜ストリームアクセスユニットの応用＞
図１には、チャネルユニットを４個備えるストリームアクセスユニット１０が描かれているが、ストリームアクセスユニット１０のチャネルユニットの数は１個でも、複数個でもよい。チャネルユニットの数を増やすと、同時に記憶可能なストリームの数を増やすことができる。チャネルユニットの数を減らすと、回路規模を削減することができる。
【０１０４】
これまでの説明では、チャネル記憶ユニット１２２は、バッファ０とバッファ１の２つのバッファをもつことになっているが、チャネル記憶ユニット１２２がもつバッファの数は２個以上でもよい。バッファの数を増やすと、先読み可能なデータサイズを増やせるというメリットがある。
【０１０５】
これまでの説明では、チャネル記憶ユニット１２２のバッファ０とバッファ１の容量はそれぞれ６４バイトであるが、バッファ０とバッファ１のサイズは６４バイト以外でもよい。バッファのサイズを増やすと、先読み可能なデータサイズを増やせるというメリットがある。バッファのサイズを変更すると、それにあわせて、バッファの選択方法や、タグの計算方法を変更する必要がある。
【０１０６】
また、プロセッサ１と、メモリ２との間にストリームアクセスユニット１０とは別のキャッシュメモリを備えるようにしてもよい。また、ストリームデータ以外の非ストリームデータをキャッシュメモリに格納するようにしてもよい。そして、プロセッサ１がメモリ２に格納された非ストリームデータにアクセスする場合、メモリ２の非ストリームデータをキャッシュメモリに読み込んで、キャッシュメモリに読み込んだ非ストリームデータをプロセッサ１がアクセスするようにしてもよい。この場合、本実施の形態によれば、キャッシュメモリに読み込んだ非ストリームデータが、ストリームデータで上書きされてしまうことがなくなるため、キャッシュメモリの利用効率を向上させることができる。
【０１０７】
上記の実施の形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。
【０１０８】
（付記１）ストリーム識別情報によって識別されるストリームデータを複数格納するメモリと、前記複数のストリームデータのストリーム識別情報に応じて、当該複数のストリームデータに割り当てられ、当該割り当てられたストリームデータを前記メモリから先読みする複数のチャネルユニットであって、異なるストリーム識別情報によって示されるストリームデータに対して異なるチャネルユニットが割り当てられる複数のチャネルユニットと、前記チャネルユニットが先読みしたストリームデータにアクセスするプロセッサと、を備えた情報処理装置。
【０１０９】
（付記２）前記メモリは、非ストリームデータをさらに格納し、前記情報処理装置は、前記メモリに格納された前記非ストリームデータをキャッシュするキャッシュメモリをさらに備え、前記プロセッサは、前記キャッシュメモリから、当該キャッシュメモリがキャッシュした非ストリームデータを取得する付記１に記載の情報処理装置。
【０１１０】
（付記３）前記情報処理装置は、メイン制御ユニットをさらに備え、前記プロセッサは、前記ストリームデータに前記チャネルユニットを割り当てる場合に、当該ストリームデータのストリーム識別情報を含む割り当て要求情報を前記メイン制御ユニットに出力し、  前記チャネルユニットは、前記プロセッサからの割り当て要求情報に応じて、当該割り当て要求に含まれるストリーム識別情報が示すストリームデータに、前記複数のチャネルユニットのうちのいずれかを割り当てる付記１又は２に記載の情報処理装置。
【０１１１】
（付記４）前記プロセッサは、前記チャネルユニットが先読みしたストリームデータにアクセスする場合に、当該ストリームデータのストリーム識別情報を含むアクセス要求情報を前記メイン制御ユニットに出力し、前記メイン制御ユニットは、前記プロセッサからのアクセス要求情報に応じて、当該アクセス要求情報に含まれるストリーム識別情報が示すストリームデータに割り当てられたチャネルユニットがない場合、前記複数のチャネルユニットのうちのいずれかを、当該ストリーム識別情報が示すストリームデータに割り当てる付記３に記載の情報処理装置。
【０１１２】
（付記５）前記プロセッサは、前記ストリームデータに前記チャネルユニットを割り当てる場合に、当該ストリームデータに関するストリーム情報を前記メモリに格納し、前記チャネルユニットは、当該ストリームデータが割り当てられた場合に、当該ストリームデータに関するストリーム情報を前記メモリから取得し、取得したストリーム情報に基づいて、当該ストリームデータを先読みする付記３又は４に記載の情報処理装置。
【０１１３】
（付記６）前記チャネルユニットは、当該チャネルユニットに割り当てられたストリームデータに関するストリーム情報を格納するチャネル記憶ユニットを有し、前記ストリームデータに前記チャネルユニットを割り当てるときに、当該チャネルユニットに他のストリームデータが割り当てられている場合、前記チャネル記憶ユニットに格納され、当該他のストリームデータに関するストリーム情報を前記メモリに格納するとともに、前記チャネルユニットに割り当てるストリームデータに関するストリーム情報を前記メモリから取得して、取得したストリーム情報を前記チャネル記憶ユニットに格納する付記５に記載の情報処理装置。
【０１１４】
（付記７）前記ストリーム情報は、前記ストリーム識別情報を含み、前記ストリーム識別情報は、当該ストリーム識別情報を含むストリーム情報が前記メモリにおいて格納されるアドレスを示し、前記チャネルユニットは、前記他のストリームデータに関するストリーム情報を、前記メモリの対応するアドレスに格納するとともに、前記プロセッサから出力されたストリーム識別情報が示すアドレスのストリーム情報を前記メモリから取得して前記チャネル記憶ユニットに格納する付記６に記載の情報処理装置。
【０１１５】
（付記８）前記ストリーム情報は、前記ストリームデータのうち、前記プロセッサがアクセスする位置を示すアクセス位置情報を含み、前記チャネルユニットは、前記プロセッサから前記先読みしたストリームデータにアクセスがあった場合、当該アクセスされたデータのサイズに応じて、前記アクセス位置情報を更新するとともに、当該アクセス位置情報に基づいて、前記ストリームデータを先読みするか否かを判定する付記６又は７に記載の情報処理装置。
【０１１６】
（付記９）前記チャネル記憶ユニットは、所定のサイズのデータが格納される第１のデータ記憶部及び第２のデータ記憶部を含み、前記チャネルユニットは、前記ストリームデータのうち、所定サイズのデータを先読みして前記第１のデータ記憶部に格納するとともに、前記アクセス位置情報が示す位置が、前記第１のデータ記憶部に格納されたデータに含まれる場合、前記ストリームデータにおいて当該データに後続するデータを先読みして前記第２のデータ記憶部に格納する付記８に記載の情報処理装置。
【０１１７】
（付記１０）前記プロセッサは、前記チャネルユニットが先読みしたストリームデータに書き込みによるアクセスを行い、前記チャネル記憶ユニットは、所定のサイズのデータが格納される第１のデータ記憶部及び第２のデータ記憶部を含み、前記チャネルユニットは、前記ストリームデータのうち、所定サイズのデータを先読みして前記第１のデータ記憶部に格納し、当該データに後続するデータを先読みして前記第２の記憶部に格納するとともに、前記プロセッサから書き込みによるアクセスがあったときに、前記アクセス位置情報が示す位置が、前記第２のデータ記憶部に格納されたデータに含まれる場合、前記第１のデータ記憶部に格納されたデータを前記メモリに書き戻す付記８に記載の情報処理装置。
【０１１８】
（付記１１）前記プロセッサは、前記ストリーム識別情報を含む割り当て解除要求情報を前記メイン制御ユニットに出力し、前記メイン制御ユニットは、前記プロセッサからの割り当て解除要求情報に応じて、当該割り当て解除要求情報に含まれるストリーム識別情報が示すストリームデータのチャネルユニットへの割り当てを解除する付記１乃至１０のいずれか１項に記載の情報処理装置。
【符号の説明】
【０１１９】
１        プロセッサ
２        メモリ
１０        ストリームアクセスユニット
１１        メイン制御ユニット
１２Ａ、１２Ｂ、１２Ｃ、１２Ｄ、２１、２２、２３、２４    チャネルユニット
１３        メモリアクセスユニット
１２１        チャネル制御ユニット
１２２        チャネル記憶ユニット
【図１】
2011215805.tif 000003
【図２】
2011215805.tif 000004
【図３】
2011215805.tif 000005
【図４】
2011215805.tif 000006
【図５】
2011215805.tif 000007
【図６】
2011215805.tif 000008
【図７】
2011215805.tif 000009
【図８】
2011215805.tif 000010
【図９】
2011215805.tif 000011
【図１０】
2011215805.tif 000012
【図１１】
2011215805.tif 000013