(57)【要約】【課題】プロセッサ群に含まれる各プロセッサにより協調処理を行うシステムにおいて、プロセッサ群へのデータの転送、またはプロセッサ群からのデータの転送を効率良く行う。【解決手段】識別子添付部３０は、リングバッファである入力キュー２０からデータがプロセッサ群４０に転送される際に、入力キュー２０における、このデータを格納したブロックを示す識別子をタグとしてデータに添付する。プロセッサ群４０に含まれるいずれかのプロセッサにより処理されたデータが出力キュー６０に転送される際に、ブロック選出部５０は、このデータを格納するブロックとして、データに添付されたタグに対応するブロックを出力キュー６０の各ブロックから選出する。【選択図】図２
2007128369.tif 000002
【特許請求の範囲】
【請求項１】
複数のプロセッサと、
所定の配列順位に配列された２以上の個数のブロックに分けられ、それぞれのブロックが、前記複数のプロセッサのいずれかに転送されるデータの転送までの一時的な格納場所として使用され、データの格納がブロックの配列順に、データの転送が格納順に行われる入力キューと、
前記所定の配列順位に配列された前記２以上の個数のブロックに分けられ、それぞれのブロックが、前記複数のプロセッサのいずれかにより処理された前記データの出力までの一時的な格納場所として使用され、データの出力がブロックの配列順に行われる出力キューと、
入力キューから転送されるデータに対して、該データを格納したブロックの配列順位に対応する識別子を添付する識別子添付部と、
出力キューの各ブロックから、プロセッサにより処理されたデータに添付された識別子に対応する配列順位を有するブロックを、該データを格納するブロックとして選出するブロック選出部とを備えることを特徴とするデータ処理システム。
【請求項２】
ブロック選出部は、前記選択後、前記データに添付された識別子を削除することを特徴とする請求項１に記載のデータ処理システム。
【請求項３】
前記入力キューと前記出力キューは、リングバッファとして構成されていることを特徴とする請求項１または２記載のデータ処理システム。
【請求項４】
入力キューへのデータの格納を制御する格納制御部と、
出力キューからデータが出力された総回数をカウントする出力カウンタと、
出力カウンタにより得られた総回数を格納制御部に通知する出力回数通知部とをさらに備え、
格納制御部は、入力キューにデータが格納された総回数をカウントする入力カウンタを有し、
入力カウンタにより得られた総回数と出力カウンタにより得られた総回数との差が、入力キューのブロック数より小さいことを条件として、入力キューへのデータの格納を許可することを特徴とする請求項３に記載のデータ処理システム。
【請求項５】
複数の処理ユニットと、
データを生成して、生成したデータを前記複数の処理ユニットのいずれかに転送する上流処理ユニットと、
前記複数の処理ユニットのいずれかにより処理された前記データを受信する下流処理ユニットとを備え、
前記上流処理ユニットは、複数のブロックに分けられ、それぞれのブロックが、前記複数の処理ユニットのいずれかに転送される前記データの転送までの一時的な格納場所として使用される入力キューと、
所定の振当規則にしたがって、前記複数の処理ユニットから、入力キューから転送される前記データの転送先の処理ユニットを順次振り当てる転送先振当部と、
転送先振当部により振り当てられた処理ユニットに前記データを転送する転送部とを備え、
それぞれの前記複数の処理ユニットは、処理したデータを前記下流処理ユニットに転送する際に、下流処理ユニットにおける、前記データの転送先の場所を示す転送先場所情報を送信する転送先場所情報送信部を備え、
前記下流処理ユニットは、複数のブロックに分けられ、それぞれのブロックが、前記複数の処理ユニットのいずれかにより転送された前記データの転送先の場所として使用され、前記データが読み出されるまでに一時的に格納する出力キューと、
前記複数の処理ユニットのそれぞれに対して設けられた、該処理ユニットから送信されてきた前記転送先場所情報を保持する転送先場所情報保持部と、
前記出力キューからデータを読み出す際に必要な、前記出力キューにおけるデータの格納状況を示す情報を、前記転送先場所情報保持部を参照して取得する格納状況情報取得部と、
該格納状況情報取得部がいずれの転送先場所情報保持部を参照すべきかを、所定の振当規則にしたがって振り当てる参照先振当部とを備えることを特徴とするデータ処理システム。
【請求項６】
前記上流処理ユニットと、それぞれの前記複数の処理ユニットと、前記下流処理ユニットは、ローカルメモリを備え、
前記入力キューは、上流処理ユニットのローカルメモリに構成され、
それぞれの前記複数の処理ユニットのローカルメモリに、上流処理ユニットから転送されてきたデータを一時的に格納する受信キューと、下流処理ユニットに転送するデータを一時的に格納する送信キューとが構成されており、
前記出力キューは、下流処理ユニットのローカルメモリに構成され、
上流処理ユニットと複数の処理ユニット間、および複数の処理ユニットと下流処理ユニット間のデータの転送は、ＤＭＡ（ダイレクト・アクセス・メモリ）方式で行われることを特徴とする請求項５に記載のデータ処理システム。
【請求項７】
前記入力キューの各ブロックは、所定の配列順で配列されており、データの格納がブロックの配列順に、データの転送が格納順に行われるものであり、
前記出力キューは、入力キューのブロックの数と同数のブロックに分けられ、各ブロックが前記所定の配列順で配列されており、データの出力がブロックの配列順に行われるものであり、
前記上流処理ユニットは、入力キューから転送されるデータに対して、該データを格納したブロックの配列順位に対応する識別子を添付する識別子添付部を備え、
それぞれの前記複数の処理ユニットは、出力キューの各ブロックから、処理ユニットにより処理されたデータに添付された識別子に対応する配列順位を有するブロックを、該データを格納するブロックとして選出するブロック選出部を備えることを特徴とする請求項５または６に記載のデータ処理システム。
【請求項８】
前記入力キューと前記出力キューは、リングバッファとして構成されていることを特徴とする請求項５から７のいずれか１項に記載のデータ処理システム。
【請求項９】
前記上流処理ユニットは、入力キューへのデータの格納を制御する格納制御部を備え、
前記下流処理ユニットは、出力キューからデータが読み出された総回数をカウントする出力カウンタと、出力カウンタにより得られた総回数を格納制御部に通知する出力回数通知部とを備え、
格納制御部は、入力キューにデータが格納された総回数をカウントする入力カウンタを有し、
入力カウンタにより得られた総回数と出力カウンタにより得られた総回数との差が、入力キューのブロック数より小さいことを条件として、入力キューへのデータの格納を許可することを特徴とする請求項８に記載のデータ処理システム。
【請求項１０】
複数のプロセッサと、
所定の配列順位に配列された２以上の個数のブロックに分けられ、それぞれのブロックが、前記複数のプロセッサのいずれかに転送されるデータの転送までの一時的な格納場所として使用され、データの格納がブロックの配列順に、データの転送が格納順に行われる入力キューと、
前記所定の配列順位に配列された前記２以上の個数のブロックに分けられ、それぞれのブロックが、前記複数のプロセッサのいずれかにより処理された前記データの出力までの一時的な格納場所として使用され、データの出力がブロックの配列順に行われる出力キューとを備えるデータ処理システムにおいて、
入力キューから転送されるデータに対して、該データを格納したブロックの配列順位に対応する識別子を添付する手順と、
出力キューの各ブロックから、プロセッサにより処理されたデータに添付された識別子に対応する配列順位を有するブロックを、該データを格納するブロックとして選出するブロック手順とをコンピュータに実行せしめることを特徴とするプログラム。
【請求項１１】
前記入力キューと前記出力キューは、リングバッファとして構成されていることを特徴とする請求項１０に記載のプログラム。
【請求項１２】
複数の処理ユニットと、
データを生成して、生成したデータを前記複数の処理ユニットのいずれかに転送する上流処理ユニットと、
前記複数の処理ユニットのいずれかにより処理された前記データを受信する下流処理ユニットとを備え、
前記上流処理ユニットは、複数のブロックに分けられ、それぞれのブロックが、前記複数の処理ユニットのいずれかに転送される前記データの転送までの一時的な格納場所として使用される入力キューと、
前記複数の処理ユニットのいずれかに前記データを転送する転送部とを備え、
それぞれの前記複数の処理ユニットは、処理したデータを前記下流処理ユニットに転送する際に、下流処理ユニットにおける、前記データの転送先の場所を示す転送先場所情報を送信する転送先場所情報送信部を備え、
前記下流処理ユニットは、複数のブロックに分けられ、それぞれのブロックが、前記複数の処理ユニットのいずれかにより転送された前記データの転送先の場所として使用され、前記データが読み出されるまでに一時的に格納する出力キューと、
前記複数の処理ユニットのそれぞれに対して設けられた、該処理ユニットから送信されてきた前記転送先場所情報を保持する転送先場所情報保持部と、
前記出力キューからデータを読み出す際に必要な、前記出力キューにおけるデータの格納状況を示す情報を、前記転送先場所情報保持部を参照して取得する格納状況情報取得部とを備えるデータ処理システムにおいて、
所定の振当規則にしたがって、前記複数の処理ユニットから、入力キューから転送されるデータの転送先の処理ユニットを前記上流処理ユニットの前記転送部に順次振り当てる手順と、
前記下流処理ユニットの格納状況情報取得部がいずれの転送先場所情報保持部を参照すべきかを、所定の振当規則にしたがって振り当てる手順とをコンピュータに実行せしめることを特徴とするプログラム。
【請求項１３】
前記入力キューと前記出力キューは、リングバッファとして構成されていることを特徴とする請求項１２に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサ群に含まれる各プロセッサにより協調処理を行うシステムにおいて、プロセッサ群へのデータの転送技術、またはプロセッサ群からのデータの転送技術に関する。
【背景技術】
【０００２】
１つのシステムに複数のプロセッサを搭載したマルチプロセッサシステムは、並列に、あるいは協調して処理を実行して処理全体の高速化を図ることができる。複数のプロセッサによる協調処理は、システムにおける一部の処理に適用されるシステムが用いられている。このようなシステムにおいて、協調処理を担う複数のプロセッサ（以下プロセッサ群という）に、たとえばこのプロセッサ群の上流のプロセッサにより生成されたデータを転送する処理、およびこのプロセッサ群の下流のプロセッサに転送する処理が伴う。これらの転送の工夫次第、システムの処理効率が変わってくる。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
本発明は上記事情に鑑みてなされたものであり、その目的は、プロセッサ群に含まれる各プロセッサにより協調処理を行うシステムにおいて、プロセッサ群へのデータの転送、またはプロセッサ群からのデータの転送を効率良く行うことができるデータ処理技術を提供することにある。
【課題を解決するための手段】
【０００４】
本発明のある態様は、データ処理システムに関する。このデータ処理システムは、複数のプロセッサと、入力キューと、出力キューと、識別添付部と、ブロック選出部を備える。
【０００５】
入力キューは、所定の配列順位に配列された複数のブロックに分けられ、それぞれのブロックが、複数のプロセッサのいずれかに転送されるデータの転送までの一時的な格納場所として使用され、データの格納がブロックの配列順に、データの転送が格納順に行われる。
【０００６】
出力キューは、入力キューのブロック数と同数であり、かつ入力キューの各ブロックの配列順位と同じ配列順位に配列された複数のブロックに分けられ、それぞれのブロックが、複数のプロセッサのいずれかにより処理されたデータの出力までの一時的な格納場所として使用され、データの出力がブロックの配列順に行われる。
【０００７】
識別添付部は、入力キューから転送されるデータに対して、このデータを格納したブロックの配列順位に対応する識別子を添付する。
【０００８】
ブロック選出部は、出力キューの各ブロックから、プロセッサにより処理されたデータに添付された識別子に対応する配列順位を有するブロックを、このデータを格納するブロックとして選出する。
【０００９】
ブロック選出部は、ブロックの選択後、データに添付された識別子を削除するようにしてもよい。
【００１０】
また、入力キューと出力キューは、リングバッファとして構成されるようにしてもよい。
【００１１】
識別子添付部および／またはブロック選出部は、ライブラリとして構成されるようにしてもよい。
【００１２】
さらに、このデータ処理システムに、入力キューへのデータの格納を制御する格納制御部と、出力キューからデータが出力された総回数をカウントする出力カウンタと、出力カウンタにより得られた総回数を格納制御部に通知する出力回数通知部とを備えてもよい。格納制御部は、入力キューにデータが格納された総回数をカウントする入力カウンタを有し、入力カウンタにより得られた総回数と出力カウンタにより得られた総回数との差が、入力キューのブロック数より小さいことを条件として、入力キューへのデータの格納を許可する。
【００１３】
本発明の別の態様も、データ処理システムに関する。このデータ処理システムは、複数の処理ユニットと、データを生成して、生成したデータを複数の処理ユニットのいずれかに転送する上流処理ユニットと、複数の処理ユニットのいずれかにより処理されたデータを受信する下流処理ユニットとを備える。
【００１４】
上流処理ユニットは、複数のブロックに分けられ、それぞれのブロックが、複数の処理ユニットのいずれかに転送されるデータの転送までの一時的な格納場所として使用される入力キューと、所定の振当規則にしたがって、複数の処理ユニットから、入力キューから転送されるデータの転送先の処理ユニットを順次振り当てる転送先振当部と、転送先振当部により振り当てられた処理ユニットにデータを転送する転送部とを備える。
【００１５】
複数の処理ユニットのそれぞれは、処理したデータを下流処理ユニットに転送する際に、下流処理ユニットにおける、このデータの転送先の場所を示す転送先場所情報を送信する転送先場所情報送信部を備える。
【００１６】
下流処理ユニットは、出力キューと、転送先場所情報保持部と、格納状況情報取得部と、参照先振当部とを備える、
出力キューは、複数のブロックに分けられ、それぞれのブロックが、複数の処理ユニットのいずれかにより転送されたデータの転送先の場所として使用され、このデータが読み出されるまでに一時的に格納する。
【００１７】
転送先場所情報保持部は、複数の処理ユニットのそれぞれに対して設けられ、該処理ユニットから送信されてきた転送先場所情報を保持する。
【００１８】
格納状況情報取得部は、出力キューからデータを読み出す際に必要な、出力キューにおけるデータの格納状況を示す情報を、転送先場所情報保持部を参照して取得する。
【００１９】
参照先振当部は、格納状況情報取得部がいずれの転送先場所情報保持部を参照すべきかを、所定の振当規則にしたがって振り当てる。
【００２０】
また、入力キューと出力キューは、リングバッファとして構成されるようにしてもよい。
【００２１】
転送先振当部と参照先振当部は、ライブラリとして構成されるようにしてもよい。
【００２２】
なお、以上の構成要素の任意の組合せ、本発明を装置、システム、プログラム、プログラムを記憶した記憶媒体として表現したものも、本発明の態様としては有効である。
【発明の効果】
【００２３】
本発明は、プロセッサ群に含まれる各プロセッサにより協調処理を行うシステムにおいて、プロセッサ群へのデータの転送、またはプロセッサ群からのデータの転送において有利である。
【発明を実施するための最良の形態】
【００２４】
まず、図１に示すようなシステムについて考える。このシステムは、上流処理ユニット、協調処理を行う複数（図示の例では２つ）の処理ユニット、下流処理ユニットから構成される。上流処理ユニットと複数の処理ユニットの間に、入力キューが設けられており、複数の処理ユニットと下流処理ユニットの間に、出力キューが設けられている。
【００２５】
上流処理ユニットは、生成したデータを入力キューに一時的に格納させる。入力キューは、リングバッファとして構成され、図中方向Ｌに沿った配列順で配列されている。上流処理ユニットは、ブロックの配列順にデータを入力キューに書き込む。入力キューに格納されたデータは、格納順に、上流処理ユニットによりいずれかの処理ユニットに送信されるように、またはいずれかの処理ユニットにより読み出されるように、処理ユニットに転送される。図示の例では、入力キューにおいて、ブロックの配列順にデータＡ、Ｂ、Ｃ、Ｄが書き込まれている。これらのデータは、格納順にいずれかの処理ユニットに転送される。
【００２６】
処理ユニットは、転送されてきたデータを処理し、処理済みのデータを出力キューに転送する。出力キューは入力キューと同じ構成を有する。
【００２７】
ここで、各処理ユニットは同じ速度で処理ができるとは限らない。そのため、先に処理が終了したデータは先に出力キューに書き込まれる。出力キューへのデータの書込がブロックの配列順に行われるので、出力キューにおけるデータの順序は、これらのデータが入力キューに格納された順序と異なってしまうことが起こりうる。
【００２８】
出力キューに格納されたデータは、格納順、すなわちブロックの配列順に読み出されるので、データの順序の変更は、システムにとって不都合である。
【００２９】
図２に示すデータ処理システム１００は、本発明者が提案した技術を具現化したものであり、この問題を解決することができる。データ処理システム１００は、上流プロセッサ１０と、入力キュー２０と、識別子添付部３０と、プロセッサ群４０と、ブロック選出部５０と、出力キュー６０と、下流プロセッサ７０とを有し、上流プロセッサ１０と下流プロセッサ７０は、共有メモリ８０に接続されている。
【００３０】
また、図２などにおいて、様々な処理を行う機能ブロックとして記載される各要素は、ハードウェア的には、ＣＰＵ、メモリ、その他のＬＳＩで構成することができ、ソフトウェア的には、メモリにロードされた予約管理機能のあるプログラムなどによって実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、いずれかに限定されるものではない。
【００３１】
上流プロセッサ１０は、マルチスレッドを実行可能であり、各スレッドは、プロセッサ群４０に含まれるいずれかのプロセッサにより処理されるデータを生成して入力キュー２０に書き込む。また、上流プロセッサ１０は、入力キュー２０へのデータの書込を制御する格納制御部１２を備える。格納制御部１２は、上流プロセッサ１０が入力キュー２０へデータを書き込んだ回数（以下書込総回数という）をカウントする入力カウンタ１４を有する。
【００３２】
入力キュー２０は、上流プロセッサ１０により書き込まれたデータを、このデータがプロセッサ群に読み出されるまでに一時的に格納する。
【００３３】
プロセッサ群４０は、複数のプロセッサここでは例として２つのプロセッサ（プロセッサ４０Ａ、プロセッサ４０Ｂ）を含み、これらのプロセッサは、入力キュー２０からデータを読み出して処理し、処理済みのデータを出力キュー６０に書き込む。
【００３４】
出力キュー６０は、プロセッサ群４０により処理済みのデータを、このデータが下流プロセッサ７０に読み出されるまでに一時的に格納する。
【００３５】
下流プロセッサ７０は、出力キュー６０からデータを読み出して処理する。また、下流プロセッサ７０は、出力キュー６０からデータが読み出された回数（以下読出総回数という）をカウントする出力カウンタ７２と、出力カウンタ７２により得られた読出総回数を共有メモリ８０に送信する回数通知部７４とを備える。
【００３６】
共有メモリ８０は、回数通知部７４から送信されてきた読出総回数を更新しながら保持する。
【００３７】
識別子添付部３０とブロック選出部５０については後述する。
【００３８】
図３は、入力キュー２０の構成を示す。入力キュー２０は、リングバッファとして構成され、複数ここでは４つのブロックに分けられている。これらのブロックは、２０Ａ、２０Ｂ、２０Ｃ、２０Ｄの順に配列されている。入力キュー２０に対して、ライトポインタ２５Ａとリードポインタ２５Ｂが設けられている。ライトポインタ２５Ａは、入力キュー２０に格納されたデータのうちの最も新しいデータ、すなわち上流プロセッサ１０（具体的には上流プロセッサ１０上で実行される各々のスレッド。以下同じ）により最後に書き込んだデータを格納したブロックを示す。リードポインタ２５Ｂは、入力キュー２０に格納されたデータのうちの最も古いデータを格納したブロックを示す。ライトポインタ２５Ａとリードポインタ２５Ｂは、書込と読出にともなってブロックの配列順に沿った方向（図示の例では方向Ｌ）に、互いに追い抜かない制約の下で進められる。ライトポインタ２５Ａの進行は、上流プロセッサ１０により行われ、リードポインタ２５Ｂの進行は、プロセッサ群４０のうちの、データを読み出すプロセッサにより行われる。
【００３９】
ここでライトポインタ２５Ａおよびリードポインタ２５Ｂの進行について説明する。ライトポインタ２５Ａは、次に書込を行うべきのブロックを上流プロセッサ１０に指示するものであり、上流プロセッサ１０は、ライトポインタ２５Ａにより示されるブロックに書き込む。
【００４０】
ところで、ライトポインタ２５Ａにより示されたブロックに、まだプロセッサ群４０に転送されていないデータが格納されている場合、または、このブロックに格納されたデータが、プロセッサ群４０への転送中である場合において、プロセッサ１０が書込を行ってしまうと、前のデータが消えてしまう。そのため、プロセッサ１０は、書込に際して、ライトポインタＡにより示されるブロックが書込可能な状態にあるか、書込不可能な状態にあるかを確認する必要がある。ここで、「書込可能な状態」は、このブロックに格納されたデータは既に転送された状態を意味し、「書込不可能な状態」は、このブロックに、まだ転送されていないデータが格納されている状態、または、ブロックに格納されたデータが転送中である状態を意味する。
【００４１】
リードポインタ２５Ｂについても同じである。リードポインタ２５Ｂは、次に読出を行うべきのブロックを、入力キュー２０からデータを読み出すプロセッサ（プロセッサ群４０に含まれるいずれかのプロセッサ）に指示するものであり、このプロセッサは、リードポインタ２５Ｂにより示されるブロックからデータを読み出す。読出に際し、プロセッサは、このブロックが読出可能な状態にあるか、読出不可能な状態にあるかを確認する必要がある。ここで、「読出可能な状態」は、このブロックに、新しいデータが既に書き込まれ、まだ読み出されていない状態を意味し、「読出不可能な状態」は、このブロックにデータがまだデータが書き込まれていない状態、または書込中である状態を示す。
【００４２】
データ処理システム１００において、入力キュー２０の各ブロックがどのような状態にあるかの把握について、下記のメカニズムを用いる。
【００４３】
入力キュー２０の各ブロックの状態を示すブロック状態情報を、書込と読出の進行にともなって更新しながら保持する。このブロック状態情報をたとえば図４の上部に示すビットマップ２８を用いる。ビットマップ２８には、２つのビット列２８ａとビット列２８ｂが含まれている。
【００４４】
ビット列２８ａとビット列２８ｂのそれぞれのビット幅は、入力キュー２０のブロック数と同じであり、ここではそれぞれ４ビットとなる。２つのビット列に含まれる各ビットは、入力キュー２０の各ブロックとそれぞれ対応する。
【００４５】
ビット列２８ａは書込側用のビット列であり、初期状態において、各ビットの値が１になっており、各ブロックが「書込可能な状態」にあることを示す。また、これらのビットの値が書込の開始時に「０」にリセットされ、読出の終了時に「１」にセットされる。
【００４６】
ビット列２８ｂは読出側用のビット列であり、初期状態において、各ビットの値が０になっており、各ブロックが「読出不可能な状態」にあることを示す。これらのビット値が書込の終了時に「１」にセットされ、読出の開始時に「０」にリセットされる。
【００４７】
図５は、ビット列２８ａとビット列２８ｂのビットの値と、該ビットに対応するブロックの状態を示す。
【００４８】
なお、図４の下部に示すように、初期状態において、ライトポインタ２５Ａとリードポインタ２５Ｂは、入力キュー２０の先頭のブロック２０Ａに配置されている。
【００４９】
上流プロセッサ１０は、初期状態における入力キュー２０への書込に際し、まずライトポインタ２５Ａを検索し、ライトポインタ２５により示されるブロックの状態を、ビット列２８ａを参照して確認する。ここで、ライトポインタ２５Ａがブロック２０Ａを示しており、ビット列２８ａにいて、ブロック２０Ａに対応するビットの値が「１」（ブロック２０Ａ：書込可能）になっているため、上流プロセッサ１０は、ブロック２０Ａに対する書込を開始するとともに、ライトポインタ２５Ａを次のブロック２０Ｂに進める。さらに、読出の開始にともなって、上流プロセッサ１０は、ビット列２８ａにおける、ブロック２０Ａに対応するビットの値を「１」から「０」にリセットする。
【００５０】
また、上流プロセッサ１０は、ブロック２０Ａに対する書込が終了したとき、ビット列２８ｂにおける、ブロック２０Ａに対応するビットの値を「０」から「１」にセットする。
【００５１】
この状態において、プロセッサ群４０のいずれかのプロセッサは、入力キュー２０からデータを読み出すとき、まず、リードポインタ２５Ｂを検索し、リードポインタ２５Ｂにより示されるブロックの状態を、ビット列２８ｂを参照して確認する。ここで、リードポインタ２８Ｂがブロック２０Ａを示しており、ビット列２８ｂにおいて、ブロック２０Ａに対応するビットの値が、書込を行った上流プロセッサ１０により「１」にセットされているため、読出を行おうとするプロセッサは、ブロック２０Ａからの読出を開始するとともに、リードポインタ２５Ｂを次のブロックに進める。さらに、読出の開始にともなって、このプロセッサは、ビット列２８ｂにおける、ブロック２８Ａに対応するビットの値を「１」から「０」にリセットする。
【００５２】
また、このプロセッサは、ブロック２０Ａからの読出が終了したとき、ビット列２８ａにおける、ブロック２０Ａに対応するビットの値を「０」から「１」にセットする。
【００５３】
なお、ライトポインタ２５Ａとリードポインタ２５Ｂの進行は、同じ方向、かつ互いに追い抜かない制約の下で行われる。
【００５４】
このように、入力キューに対する書込と読出にともなって、ライトポインタ２５Ａとリードポインタ２５Ｂは進められ、ビット列２８ａとビット列２８ｂにおけるビットの値は、セットとリセットが繰り返される。
【００５５】
ビットマップ２８は、たとえば、上流プロセッサ１０とプロセッサ群４０からアクセス可能な共有メモリのアトミック領域に設けられ、ビットの更新がアトミック命令によりなされるようにしてもよいし、ライブラリとして実装されるようにしてもよい。
【００５６】
識別子添付部３０は、入力キュー２０から読み出されるデータに、該データを格納したブロックに対応する識別子を添付する。たとえば、ブロック２０Ａ〜ブロック２０Ｄのそれぞれに対応する識別子を１〜４とした場合、ブロック２０Ａから読み出されるデータには、識別子１が添付される。
【００５７】
図６は、識別子添付部３０により識別子が添付されたデータの構造を示す。図示の例では、識別子は、タグとしてデータに添付されている。
【００５８】
なお、ここでは、識別子添付部３０は、入力キュー２０からデータが読み出される際に識別子を添付しているが、入力キュー２０にデータが書き込まれる際にそのデータに対して識別子を添付してもよい。その場合、入力キュー２０に格納されたデータは、図６に示す構造で格納されることになる。
【００５９】
プロセッサ群４０に含まれるプロセッサは、入力キュー２０から読み出したデータを処理し、処理済みのデータを出力キュー６０に書き込む。書き込む場所は、ブロック選出部５０により選出される。ここで、ブロック選出部５０を説明する前に、まず、出力キュー６０を説明する。
【００６０】
図７は、出力キュー６０の構成を示す。出力キュー６０は、入力キュー２０と同じようにリングバッファとして構成され、入力キュー２０のブロック数と同数の４つのブロックに分けられている。これらのブロックは、入力キュー２０のブロックの配列順と同じ配列順に４０Ａ、４０Ｂ、４０Ｃ、４０Ｄの順に配列されている。出力キュー６０に対して、リードポインタ６５が設けられている。リードポインタ６５は、初期状態においてブロック６０Ａに配置され、読出にともなってブロックの配列順に沿った方向（図中方向Ｌ）に進められる。リードポインタ６５の進行は、下流プロセッサ７０により行われる。
【００６１】
下流プロセッサ７０は、リードポインタ６５により示されるブロックのデータを読み出して処理する。この読出にともなって、下流プロセッサ７０は、現在位置から次のブロックを示す位置にリードポインタ６５を進める。
【００６２】
下流プロセッサ７０も、マルチスレッド実行可能であり、出力キュー６０からの読出は、それぞれのスレッドにより行われる。各スレッドは読出を行う際に、リードポインタ６５により示されるブロックが「読出可能な状態」にあるか否かを知る必要がある。ここで、「読出可能な状態」は、既に書込が終了し、まだ読出が行われていない状態、言い換えれば、「書込中」、「読出中」、「読出完了」のいずれにも該当しない状態を意味する。
【００６３】
この状態を示す情報も、入力キュー２０の状態情報と同じように、ビットマップを用いることができる。
【００６４】
図８は、出力キュー６０の各ブロックの状態を示すビットマップ６８の初期状態を示す。ビットマップ６８も、２つのビット列６８ａとビット列６８ｂを含み、ビット列６８ａのビットの値は、そのブロックに対して書込が開始されたときに「１」から「０」にリセットされ、読出の終了時に「１」から「０」にリセットされる。ビット列６８ｂのビットの値は、書込の終了時に「０」から「１」にセットされ、読出の開始時に「１」から「０」にリセットされる。
【００６５】
図９は、ビット列６８ａおよびビット列６８ｂにおけるビットの値と、このビットに対応するブロックの状態との関係を示す。
【００６６】
下流プロセッサ７０の各スレッドは、リードポインタ６５により示されるブロックが「読出可能」状態にあるときにのみそのブロックの読出をし、読出にともなってリードポインタ６５を次のブロックに進める。なお、「読出可能」状態において、図９に示すように、ビット列６８ａにおいて、そのブロックに対応するビットの値は「１」であり、ビット列６８ｂにおいて、そのブロックに対応するビットの値は「０」である。
【００６７】
このビットマップ６８も、入力キュー２０のためのビットマップ２８と同じように、プロセッサ群４０と下流プロセッサ７０からアクセス可能な共有メモリのアトミック領域に設けられ、その更新がアトミック命令によりなされるようにしてもよいし、ライブラリとして実行されてもよい。
【００６８】
ここで、ブロック選出部５０を説明する。ブロック選出部５０は、プロセッサ群４０に含まれるいずれかのプロセッサから出力キュー６０にデータを書き込む際に、このデータに添付された識別子を参照して、書き込む場所となるブロックを選出する。具体的には、識別子が「１」であれば、この識別子に対応するブロック６０Ａを、データを書き込むブロックとして選出する。なお、ブロック選出部５０は、ブロックの選出後、このブロックに書き込まれるデータに添付された識別子を削除する。
【００６９】
プロセッサ群４０のプロセッサは、ブロック選出部５０により選出したブロックにデータを書き込む。
【００７０】
格納制御部１２は、入力キュー２０へデータを書き込む際に、共有メモリ８０に保持された読出総回数を参照して制御を行う。具体的には、入力カウンタ１４により得られた書込総回数と、共有メモリ８０から得た読出総回数との差「（書込総回数−読出総回数）」が、入力キュー２０のブロック数（ここでは４）より小さいときにのみ、入力キュー２０へのデータの書込を許可する。
【００７１】
図１０は、上流プロセッサ１０が入力キュー２０へ書込を行う際の処理過程を示すフローチャートである。上流プロセッサ１０は、入力キュー２０への書込に際して、まず、格納制御部１２により、共有メモリ８０から、下流プロセッサ７０の読出総回数を取得する（Ｓ１０）。格納制御部１２は、自身に備えられた入力カウンタ１４がカウントした書込総回数からこの読出総回数を引き、得られた値が４より小さいか否かを確認する（Ｓ１４）。ステップＳ１４が肯定されると（Ｓ１４：Ｙｅｓ）、格納制御部１２は、上流プロセッサ１０による書込を許可し、入力キュー２０において、ライトポインタ２５Ａにより示されるブロックにデータが書き込まれる。書込にともなって、格納制御部１２の入力カウンタ１４は、書込総回数に１を加算して更新する（Ｓ１８、Ｓ２０）。
【００７２】
一方、ステップＳ１４が否定されると（Ｓ１４：Ｎｏ）、格納制御部１２は、入力キュー２０への書込を禁止する（Ｓ３０）。
【００７３】
図１１は、入力キュー２０からのデータの読出から、出力キュー６０へのデータの書込までの処理過程を示すフローチャートである。プロセッサ群４０に含まれるいずれかのプロセッサにより入力キュー２０からデータを読み出す際に、識別子添付部３０は、このデータを格納したブロック、すなわちリードポインタ２５Ｂにより示されるブロックに対応する識別子をデータに添付する（Ｓ５０）。
【００７４】
そして、識別子が添付されたデータは、プロセッサ群４０のプロセッサにより読み出されて、処理される（Ｓ５４、Ｓ５８）。
【００７５】
プロセッサ群４０のプロセッサは、処理したデータを出力キュー６０に書き込むが、書き込むブロックは、ブロック選出部５０により選出される（Ｓ６０）。ブロック選出部５０は、具体的には、データに添付された識別子を参照し、識別子に対応するブロックを出力キュー６０の４つのブロックから選出する。この選出の後、ブロック選出部５０は、データに添付された識別子を削除し（Ｓ６４）、プロセッサ群４０のプロセッサは、このデータを、選出されたブロックに書き込む（Ｓ７０）。
【００７６】
図１２は、下流プロセッサ７０が出力キュー６０からデータを読み出す際の処理過程を示すフローチャートである。下流プロセッサ７０は、リードポインタ６５により示されるブロックのデータを読み出す（Ｓ８０）。この読出にともなって、下流プロセッサ７０の出力カウンタ７２は、読出総回数に１を足して新しい読出総回数を得（Ｓ８４）、回数通知部７４は、新しい読出総回数を共有メモリ８０に送信する（Ｓ８８）。
【００７７】
このように、データ処理システム１００によれば、入力キュー２０と出力キュー６０において、同じ個数のブロックが同じ配列順位で配列されており、入力キュー２０から転送されたデータは、入力キュー２０における、このデータを格納したブロックの識別子が添付され、プロセッサ群４０のいずれかのプロセッサにより処理された後は、出力キュー６０における、このデータに添付された識別子に対応するブロックに格納される。そのため、図１に示すようなデータの順序の変更が回避される。
【００７８】
データ処理システム１００の格納制御部１２による制御は、データ処理システム１００にさらなる利益をもたらす。格納制御部１２は、入力キュー２０と出力キュー６０との間に流れるデータの数を、入力キュー２０のブロック数より小さいときにのみ、入力キュー２０へのデータの格納を許可する。ここで格納制御部１２により提供された有利性について説明する。
【００７９】
図１３は、図２に示すデータ処理システム１００において、格納制御部１２を機能させない場合に起こりうる状況を示す。入力キュー２０の４つのブロックにそれぞれＡ、Ｂ、Ｃ、Ｄのデータが格納されている状態において、最も先に書き込まれたデータＡは、プロセッサ４０Ａに転送されたとする。入力キュー２０は、リングバッファであるので、上流プロセッサ１０は、この状態において新しいデータＥを生成した場合には、ラップラウンドしてこのデータＥを空のブロック（データＡが格納されていたブロック）に書き込む。ここでプロセッサ４０Ｂの処理速度がプロセッサ４０Ａの処理速度より速い場合には、入力キュー２０に格納された４つのデータは、Ｂ、Ｃ、Ｄ、Ｅの順でプロセッサ４０Ｂに転送されることが起こりうる。プロセッサ４０Ｂは、この４つのデータを処理して出力キュー６０に転送する際に、この４つのデータは入力キュー２０に格納されたときと同じ順位で出力キュー６０の４つのブロックにそれぞれ格納される。その後、プロセッサ４０Ａは、データＡの処理を終え、処理済みのデータＡを、データＥが格納されたブロックに書き込む。このようなことが起きると、データＥが消失しまう。
【００８０】
格納制御部１２は、結果的に、入力キュー２０と出力キュー６０との間に流れるデータの数を入力キュー２０のブロック数より少ないように制御している。この制御によって、データの順序を保証するとともに、図１３に示すようなデータの消失を防ぐことができる。
【００８１】
また、識別子添付部３０とブロック選出部５０を、ライブラリとして実装することができる。こうすることによって、入力キュー２０からデータが転送される際に、および出力キュー６０にデータが転送される際にそれぞれ識別子添付部３０とブロック選出部５０に対応するライブラリを読み込むだけで、図１に示すシステムにおいてもデータの順序保証ができる。
【００８２】
本発明者が提案したこの技術は、複数のプロセッサによる協調処理が階層的に構築されたシステムにも適用することができる。図１４は、その一例を示す。このシステムにおいて、入力キュー１と出力キュー１との間、入力キュー２と出力キュー２との間にデータの順序保証を、下記のようにタグを入れ子構造につけることよって実現することができる。
【００８３】
入力キュー１からテータが処理ユニット１および処理ユニット２に転送される際に、このデータを格納したブロックの識別子を第１のタグとして添付する。処理ユニット２により処理済みのデータが、出力キュー１に転送される際に、この第１のタグに対応するブロックにデータを書き込む。処理ユニット１により処理済みのデータが入力キュー２に転送される。入力キュー２からデータが処理ユニット４および処理ユニット５に転送される際に、第１のタグが付けられているデータに、さらに、入力キュー２における、このデータを格納したブロックの識別子を第２のタグとして付ける。処理ユニット４または処理ユニット５から出力キュー２にデータが転送される際に、第２のタグを参照し、第２のタグに対応するブロックにこのデータを書き込む。出力キュー２からデータが処理ユニット３に転送され、処理ユニット３による処理後、出力キュー１に転送される際に、第１のタグを参照して、第１のタグに対応するブロックにこのデータを書き込む。
【００８４】
上述した各システムにおいて、入力キューと出力キューを、上流の処理ユニットと下流の処理ユニットにそれぞれ含まれる態様で実装してもよい。
【００８５】
以下、本発明の第２の実施の形態について説明する。図１５は、データ処理システム２００を示す。データ処理システム２００は、上流処理ユニット１１０と、処理ユニット群１４０と、下流処理ユニット１６０とを有し、上流処理ユニット１１０と下流処理ユニット１６０は、共有メモリ１９０に接続されている。
【００８６】
上流処理ユニット１１０は、データを生成して、処理ユニット群１４０のいずれかの処理ユニットに送信する。
【００８７】
処理ユニット群１４０は、複数の処理ユニットここでは例として２つの処理ユニット（処理ユニット１４０Ａ、処理ユニット１４０Ｂ）を含み、これらの処理ユニットは、上流処理ユニット１１０から送信されてきたデータを処理し、処理済みのデータを下流処理ユニット１６０に送信する。
【００８８】
図１６は、上流処理ユニット１１０の構成を示す。上流処理ユニット１１０は、プロセッサコア１１２と、ローカルメモリ１１４と、プロセッサインタフェース１２０と、格納制御部１３４と、転送先振当部１３６と、識別子添付部１３８とを有し、ローカルメモリ１１４は、ソフトウェアにより構成された入力キュー１１８を含む。
【００８９】
プロセッサコア１１２は、マルチスレッドを実行可能であり、各スレッドは、生成したデータを入力キュー１１８に書き込む。
【００９０】
入力キュー１１８は、図２に示すデータ処理システム１００における入力キュー２０と同じ構成を有し、ここでその詳細な説明を省略する。
【００９１】
また、格納制御部１３４と識別子添付部１３８は、図２に示すデータ処理システム１００のおける格納制御部１２と識別子添付部３０とそれぞれ同じ構成を有する。
【００９２】
転送先振当部１３６は、所定の振当規則で、処理ユニット群１４０の各処理ユニットから、上流処理ユニット１１０がデータを送信する先の処理ユニットを振り当てる。振当規則は、処理ユニット群１４０の各処理ユニットに送信する順位、回数などを決め、たとえば、「処理ユニット１４０Ａに２回送信後、処理ユニット１４０Ｂに１回送信する」などのようなルールを繰り返し適用されるものである。データ処理システム２００において、例として２つの処理ユニットに交互１回ずつ送信する振当規則を用いる。
【００９３】
プロセッサインタフェース１２０は、入力キュー１１８に格納されたデータを、転送先振当部１３６により振り当てられた処理ユニットに送信するものであり、その詳細については後述する。
【００９４】
なお、入力キュー１１８から送信されたデータは、識別子添付部１３８により、このデータを格納したブロックに対応する識別を添付されている。
【００９５】
図１７は、処理ユニット群１４０に含まれる処理ユニットここでは例として処理ユニット１４０Ａの構成を示す。処理ユニット１４０Ａは、プロセッサコア１４２と、ローカルメモリ１４４と、プロセッサインタフェース１５０、ブロック選出部１５４とを有し、ローカルメモリ１４４には、ソフトウェアにより構成された受信キュー１４６と送信キュー１４８が含まれる。
【００９６】
プロセッサコア１４２は、上流処理ユニット１１０から送信されてきたデータを処理する。
【００９７】
受信キュー１４６は、上流処理ユニット１１０から送信されてきたデータを、処理されるまでに一時的に格納するものであり、送信キュー１４８は、処理済みのデータを下流処理ユニット１６０に送信する前に一時的に格納するものである。この２つのキューともリングバッファとして構成されている。
【００９８】
プロセッサインタフェース１５０は、送信キュー１４８に格納されたデータを下流処理ユニット１６０に送信し、ブロック選出部１５４は、図２に示すデータ処理システム１００におけるブロック選出部５０と同じ機能を有する。  
ここで、上流処理ユニット１１０のプロセッサインタフェース１２０の詳細について説明する。プロセッサインタフェース１２０は、入力キュー１１８に格納されたデータを送信する際に、転送方式としてはたとえばＤＭＡ（ダイレクト・メモリ・アクセス）を用いる。プロセッサインタフェース１２０は、一つのデータを送信するのに当たり、「データ送信」、「送信通知」の２つの処理を順次行う。
【００９９】
「データ送信」は、入力キュー１１８に格納されたデータを送信する処理であり、たとえばｐｕｔコマンドを用いて行う。この「データ送信」によって、送信先の処理ユニットのローカルメモリに設けられた受信キュー１４６にデータが転送される。
【０１００】
「送信通知」は、送信先の処理ユニットに「データを送信した」ことを知らせる信号を送信する処理であり、たとえばｓｅｎｄｓｉｇコマンドを用いる。
【０１０１】
この２つの処理を実行するコマンドは、プロセッサインタフェース１２０により発行され、実行されるまでプロセッサインタフェースの１２０の図示しないＤＭＡキューに格納される。
【０１０２】
ここで、送信先の処理ユニットは、「送信通知」処理によって送信されてきた信号を受信すると、データが既に自身の受信キュー１４６に送信されたとし、受信キュー１４６からそのデータを読み出すことができるようになる。
【０１０３】
ところで、プロセッサインタフェース１２０のＤＭＡキューに格納されたこの２つの処理を指示するコマンドは、逆の順番で実行される恐れがある。コマンドが逆に実行されると、データが送信される前に「データを送信した」ことを知らせる通知信号が先に送信先の処理ユニットに送信されるというハンドシェイクミスが起きてしまう。
【０１０４】
コマンドの実行順序を保証するために、プロセッサインタフェース１２０は、「送信通知」処理を実行するコマンドに「ｆｅｎｃｅ」属性を付けたｓｅｎｄｓｉｇｆコマンドを用いる。この属性をつけることによって、「データ送信」のためのコマンド「ｐｕｔ」が実行されない限り、「送信通知」処理のコマンドが実行されない。これによって、ハンドシェイクミスを防ぐことができる。
【０１０５】
プロセッサインタフェース１２０はこのようにして入力キュー１１８に格納されたデータを格納順に、処理ユニット群１４０の処理ユニットの受信キュー１４６に書き込む。
【０１０６】
処理ユニット群１４０に含まれる処理ユニット１４０Ａと１４０Ｂは、それぞれのプロセッサコア１４２（マルチスレッドの場合にはプロセッサコア１４２上で動作する各々のスレッド）により、受信キュー１４６に書き込まれたデータを処理し、処理済みのデータを送信キュー１４８に書き込む。
【０１０７】
プロセッサインタフェース１５０は、送信キュー１４８に格納されたデータを下流処理ユニット１６０に送信する。ここで下流処理ユニット１６０を説明しながら、プロセッサインタフェース１５０の詳細を説明する。
【０１０８】
図１８は、下流処理ユニット１６０の構成を示す。下流処理ユニット１６０は、プロセッサコア１６２と、参照先振当部１６４と、プロセッサインタフェース１６６と、ローカルメモリ１７０と、出力カウンタ１８２と、回数通知部１８４とを有し、プロセッサインタフェース１６６には、レジスタ１６８が含まれている。
【０１０９】
図１９は、ローカルメモリ１７０を示す。ローカルメモリ１７０には、フラグ受信バッファ１７２Ａとフラグ受信バッファ１７２Ｂ、および出力キュー１７８が含まれており、これらはソフトウェアにより構成される。
【０１１０】
図２０は、出力キュー１７８を示す。出力キュー１７８は、図２に示すデータ処理システム１００における出力キュー６０と同じ構成を有し、配列順にブロック１７８Ａ〜ブロック１７８Ｄの４つのブロックに分けられており、それぞれに対応する識別子が１〜４である。また、出力キュー１７８には、リードポインタ１７９が設けられている。
【０１１１】
フラグ受信バッファ１７２Ａとフラグ受信バッファ１７２Ｂは、下流処理ユニット１６０にデータを送信する処理ユニット１４０Ａと処理ユニット１４０Ｂに対応するものである。なお、フラグ受信バッファの数は、下流処理ユニット１６０にデータを送信する処理ユニットの数と等しく、ここでは２つとなる。フラグ受信バッファ１７２Ａとフラグ受信バッファ１７２Ｂは、同じ構成を有し、ここでフラグ受信バッファ１７２Ａを例にして説明する。
【０１１２】
図２２は、フラグ受信バッファ１７２Ａを示す。フラグ受信バッファ１７２Ａは、リングバッファで構成されたＦＩＦＯであり、複数のブロックに分けられている。フラグ受信バッファ１７２Ａには、書込をするためのライトポインタ１７４と読出をするためのリードポインタ１７５が設けられている。フラグ受信バッファ１７２Ａへの書込および読出の詳細については後述するが、フラグ受信バッファ１７２ＡがリングバッファのＦＩＦＯであるため、フラグ受信バッファ１７２への書込を行う送信側は、フラグ受信バッファ１７２Ａから読出を行う受信側による読出を待たずに次の書込を続けることができる。
【０１１３】
ここで処理ユニット群１４０に含まれる処理ユニット１４０Ａのプロセッサインタフェース１５０について説明する。プロセッサインタフェース１５０は、下流処理ユニット１６０にデータを送信する際に、転送方式としてはたとえばＤＭＡを用いる。プロセッサインタフェース１５０は、一つのデータを送信するのに当たり、「データ送信」、「フラグデータ送信」「送信通知」の３つの処理を順次行う。
【０１１４】
「データ送信」は、送信キュー１４８に格納されたデータを送信する処理であり、たとえばｐｕｔコマンドを用いて行う。この「データ送信」によって、下流処理ユニット１６０のローカルメモリ１７０に設けられた出力キュー１７８にデータが転送される。
【０１１５】
また、このデータ送信に際して、処理ユニット１４０Ａのブロック選出部１５４は、データに添付されている識別子を参照して、下流処理ユニット１６０の出力キュー１７８の４つのブロックから、書き込む場所となるブロックを選出する。具体的には、識別子が「１」であれば、この識別子に対応するブロック１７８Ａを、データを書き込むブロックとして選出する。なお、ブロック選出部１５４は、ブロックの選出後、このブロックに書き込まれるデータに添付された識別子を削除する。プロセッサインタフェース１５０は、ブロック選出部１５４により選出されたブロックにデータを送信する。
【０１１６】
「フラグデータ送信」は、「データ送信」により送信されたデータを格納するブロック、すなわちブロック選出部１５４により選出したブロックを示すフラグデータを送信する処理であり、ｐｕｔコマンドを用いることができる。出力キュー１７８は４つのブロックを有するため、このフラグデータは４ビットのデータである。たとえばフラグデータが「００１０」であれば、出力キュー１７８の各ブロックの配列順位に沿って３番目のブロックすなわちブロック１７８Ｃにデータを送信したことを意味する。
【０１１７】
なお、フラグデータは、送信側の処理ユニットに対して設けられたフラグ受信バッファ送信される。ここで処理ユニット１４０Ａのプロセッサインタフェース１５０は、フラグデータをフラグ受信バッファ１７２Ａに送信する。
【０１１８】
また、プロセッサインタフェース１５０は、フラグ受信バッファ１７２Ａにおけるライトポインタ１７４の値を保持しており、フラグデータを送信する際に、ライトポインタ１７４により示されるブロックにフラグデータを書き込むとともに、ライトポインタ１７４をブロックの配列方向（図中方向Ｌ）に沿って１つ前に進める。
【０１１９】
「送信通知」は、下流処理ユニット１６０に「データを送信した」ことを知らせる信号を送信する処理であり、ここでもハンドシェイクミスを防ぐため、「ｆｅｎｃｅ」属性をつけたｓｅｎｄｓｉｇｆコマンドを用いる。
【０１２０】
ここで、プロセッサインタフェース１５０は、「データを送信した」ことを知らせる信号データとして、自身が属する処理ユニット１４０Ａを示すマスク値を送信する。このマスク値は、下流処理ユニット１６０がいずれの処理ユニットからデータが送信されてきたかを判別可能にするものであり、たとえば、処理ユニット１４０Ａと処理ユニット１４０Ｂのマスク値をそれぞれ「１０」と「０１」にすることができる。
【０１２１】
このマスク値は、下流処理ユニット１６０のプロセッサインタフェース１６６に設けられたレジスタ１６８に送信される。
【０１２２】
レジスタ１６８は、処理ユニット群１４０に含まれる処理ユニットの数の分だけのビットサイズを有し、ここでは２ビットである。レジスタ１６８は、いずれかの処理ユニットからマスク値を受信すると、このマスク値に対応するビットを１にセットする。
【０１２３】
また、処理ユニット群１４０に含まれる各処理ユニットのプロセッサインタフェース１５０は、マスク値を送信する際に、論理ＯＲモードで送信する。これによって、レジスタ１６８において既に１にセットされたビットが対応する処理ユニットから連続してマスク値を送信されてきた（すなわち、この処理ユニットから下流処理ユニット１６０にデータを連続送信した）場合においても、この処理ユニットに対応するビットが１に保持される。
【０１２４】
さらに、２つの処理ユニット１４０Ａと処理ユニット１４０Ｂから同時にマスク値が送信されてきた場合において、マスク値が論理加算されるため、衝突に起因するマスク値の消失を防ぐことができる。
【０１２５】
フラグ受信バッファ１７２Ａにフラグデータの送信、およびレジスタ１６８へのマスク値の送信の目的を説明するために、出力キュー１７８からのデータの読出に関わる処理を説明する。
【０１２６】
プロセッサコア１６２は、マルチスレッド実行可能であり、これらのスレッドは、出力キュー１７８からデータを読み出して処理する。出力キュー１７８からデータを読み出す際に、スレッドは、リードポインタ１７９により示されるブロックからデータを読み出し、読出の開始とともにリードポインタ１７９を次のブロックに進める。しかし、リードポインタ１７９の現在位置のブロックにデータがまだ書き込まれていない場合に読出を行うと、空のデータまたは無効のデータを読み出してしまう結果になる。これを防ぐために、プロセッサコア１６２は、出力キュー１７８の各ブロックの状態を示すデータたとえば図２１に示すビットマップ１７６を保持している。このビットマップの各ビットは、出力キュー１７８の各ブロックにそれぞれ対応し、初期状態においては全てのビット値が「０」になっている。
【０１２７】
レジスタ１６８がマスク値を受信すると、プロセッサコア１６２にイベントとして通知される。プロセッサコア１６２は、これに応じて、レジスタ１６８を参照する。レジスタ１６８の２ビットのうち、「１」の値にセットされているビットが、該ビットに対応する処理ユニットからデータが送信されたことを示す。ここでたとえば図２３に示すように、処理ユニット１４０Ａに対応するビットが「１」にセットされており、処理ユニット１４０Ｂに対応するビットが「０」にリセットされている。この場合において、プロセッサコア１６２は、処理ユニット１４０Ａに対応するフラグ受信バッファ１７２Ａを参照する。
【０１２８】
プロセッサコア１６２は、フラグ受信バッファ１７２Ａの各ブロックのうち、リードポインタ１７５により示されるブロックに格納されたフラグデータを参照することによって、出力キュー１７８のいずれのブロックにデータが新たに書き込まれたかを知り、ビットマップ１７６における、このブロックに対応するビットの値を「１」にセットする。また、プロセッサコア１６２は、フラグ受信バッファ１７２Ａにおける、参照を行ったブロックに対して、それに格納されたフラグデータを削除するとともに、リードポインタ１７５を１つ前に進める。プロセッサコア１６２は、このような参照、ビットマップの更新、フラグデータの削除、リードポインタ１７５の進行を、ライトポインタ１７４までのブロックについて順次行う。また、プロセッサコア１６２は、フラグ受信バッファ１７２Ａにおける、フラグデータが格納されたすべてのブロックに対して参照を行った場合において、レジスタ１６８における、フラグ受信バッファ１７２Ａに対応するビットの値を「０」にリセットする。なお、フラグデータが格納されたブロックのうち、１つでも参照を行なわなかったブロックが残った場合には、プロセッサコア１６２は、レジスタ１６８のビット値を変更しない。
【０１２９】
ところで、レジスタ１６８の２つのビットとも「１」にセットされているときには、プロセッサコア１６２は、いずれのフラグ受信バッファを参照すべきかについて判断しかねない。このような場合において、下流処理ユニット１６０の参照先振当部１６４は、参照すべきフラグ受信バッファをプロセッサコア１６２に指示する。
【０１３０】
参照先振当部１６４は、所定の振当規則で、２つのフラグ受信バッファから、プロセッサコア１６２が参照を行うフラグ受信バッファを振り当てる。この振当規則は、システムの設計者に委ねる。ここでは例として、参照先振当部１６４はラウンドロビン方式で振当を行う。
【０１３１】
プロセッサコア１６２は、参照先振当部１６４により振り当てられたフラグ受信バッファを参照する。その参照の仕方については、レジスタ１６８の２ビットのうち、１つのビットのみその値が「１」にセットされている場合と同じである。
【０１３２】
このように、プロセッサコア１６２は、レジスタ１６８とフラグ受信バッファを参照することによって、出力キュー１７８についてのビットマップを更新する。
【０１３３】
後に、プロセッサコア１６２上で動作するスレッドは、出力キュー１７８からデータを読み出す際に、図２１に示すビットマップ１７６を参照して、リードポインタ１７９により示されるブロックの状態を確認する。具体的には、リードポインタ１７９により示されたブロックに対応するビット値が「１」である場合に限り読出を行う。なお、スレッドは、読出の開始にともなってリードポインタ１７９を次のブロックに進めるとともに、ビットマップ１７６における、このブロックに対応するビットの値を「０」にリセットする。
【０１３４】
このように、ビットマップ１７６を更新しながら保持することにより、プロセッサコア１６２上で動作するスレッドによる読出が安全にでき、空のデータまたは無効のデータが読み出されることを防ぐことができる。
【０１３５】
下流処理ユニット１６０の出力カウンタ１８２は、出力キュー１７８からデータが読み出される度に読出総回数をカウントし、回数通知部１８４は、出力カウンタ１８２により得られた読出総回数を共有メモリ１９０に送信する。
【０１３６】
共有メモリ１９０は、読出総回数を更新しながら保持し、上流処理ユニット１１０に含まれる格納制御部１３４に供する。
【０１３７】
格納制御部１３４は、入力キュー１１８にデータが書き込まれる度に書込総回数をカウントする入力カウンタ（図示せず）を有し、入力カウンタにより得られた書込総回数と、共有メモリ１９０に保持された読出総回数に基づいて制御を行う。具体的には、書込総回数と、読出総回数との差「（書込総回数−読出総回数）」が、入力キュー１１８のブロック数（ここでは４）より小さいときにのみ、入力キュー１１８へのデータの書込を許可する。
【０１３８】
このデータ処理システム２００において、入力キューからのデータの転送および出力キューへのデータの転送は、データの送信と、データの送信完了を通知する信号の送信を含むいわゆるｓｉｇｎａｌ  ｎｏｔｉｆｉｃａｔｉｏｎ方式で行われている。このような転送方式の転送は、レイテンシが低く、大変優れた技術であるが、送信側と受信側が一対一の場合においてしか適用されない。本実施例では、送信側の上流処理ユニット１１０に転送先振当部１３６を、受信側の下流処理ユニット１６０に参照先振当部１６４を設けることによって、この技術を「一対多」および「多対一」の転送において実現している。これにより、システム全体の効率向上を図ることができる。
【０１３９】
また、図２に示すデータ処理システム１００に用いられた、データ順序を保証する技術と、データの消失を防ぐ技術を適用することによって、さらに有利なシステムを実現している。
【０１４０】
さらに、データ処理システム２００において、入力キュー１１８、受信キュー１４６および送信キュー１４８、出力キュー１７８を、上流処理ユニット１１０と、処理ユニット群１４０の各処理ユニットと、下流処理ユニット１６０のローカルメモリにそれぞれ実装することによって、ＤＭＡでローカルメモリ間において直接データを転送することができ、さらにシステムの効率を高めている。
【０１４１】
データ処理システム２００は、入力キュー１１８と出力キュー１７８は、１つずつしかなく、データ転送ラインが一本しかないが、キューの数を増やして複数の転送ラインを設けてもよい。たとえば、図２４に示すシステムのように、２本の転送ラインを設ける。このような複数の転送ラインが設けられたシステムにおいて、同じライン上の入力キューと出力キュー間で転送されるフラグデータに、転送ラインのＩＤをタグとして添付することによって、異なるラインにおけるキューの同期を単一の通知信号で行うことができる。
【０１４２】
なお、データ処理システム１００とデータ処理システム２００において、共有メモリを利用して読出総回数の通知を行っているが、ｓｉｇｎａｌ  ｎｏｔｉｆｉｃａｔｉｏｎによる直接送信など、下流の処理ユニットまたはプロセッサが上流の処理ユニットまたはプロセッサに読出総回数を通知することができるいかなる方法を用いてもよい。
【０１４３】
また、データ処理システム１００において、上流プロセッサ１０とプロセッサ群４０間のデータの送受信および送受信に伴う入力キュー２０の管理、プロセッサ群４０と下流プロセッサ７０間の送受信および送受信に伴う出力キュー６０の管理について、ｓｉｇｎａｌ  ｎｏｔｉｆｉｃａｔｉｏｎとフラグデータを用いる方法を適用してもよい。
【０１４４】
以上、本発明を実施の形態をもとに説明した。実施の形態は例示であり、本発明の主旨から逸脱しない限り、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【図面の簡単な説明】
【０１４５】
【図１】本発明の実施の形態によるシステムと比較するためのシステムの例を示す図である。
【図２】本発明にかかる第１の実施の形態のデータ処理システムを示す図である。
【図３】図２に示すデータ処理システムにおける入力キューを示す図である。
【図４】図３に示す入力キューに対する書込および読出に用いるビットマップを示す図である。
【図５】図４に示すビットマップのビット値と、入力キューにおけるブロックの状態との関係を示す図である。
【図６】図２に示すデータ処理システムにおいて、入力キューから転送されるデータの構造を示す図である。
【図７】図２に示すデータ処理システムにおける出力キューを示す図である。
【図８】図７に示す出力キューからの読出に用いるビットマップを示す図である。
【図９】図８に示すビットマップのビット値と、出力キューにおけるブロックの状態との関係を示す図である。
【図１０】図２に示すデータ処理システムにおいて、上流プロセッサが入力キューへ書込を行う際の処理過程を示すフローチャートである。
【図１１】図２に示すデータ処理システムにおいて、入力キューからのデータの読出から、出力キューへのデータの書込までの処理過程を示すフローチャートである。
【図１２】図２示すデータ処理システムにおいて、出力キューからデータを読み出す処理の過程を示すフローチャートである。
【図１３】データの消失を説明するための図である。
【図１４】図２に示すデータ処理システムの技術を適用した別のシステムを示す図である。
【図１５】本発明にかかる第２の実施の形態のデータ処理システムを示す図である。
【図１６】図１５に示すデータ処理システムにおける上流処理ユニットを示す図である。
【図１７】図１５に示すデータ処理システムにおける処理ユニット群に含まれる処理ユニットを示す図である。
【図１８】図１５に示すデータ処理システムにおける下流処理ユニットを示す図である。
【図１９】図１８に示す下流処理ユニットにおけるローカルメモリを示す図である。
【図２０】図１９に示すローカルメモリに含まれる出力キューを示す図である。
【図２１】図２０に示す出力キューからの読出に用いるビットマップを示す図である。
【図２２】図１９に示すローカルメモリに含まれるフラグ受信バッファを示す図である。
【図２３】図１８に示す下流処理ユニットにおけるプロセッサインタフェース１６６に含まれるレジスタのビット値と、図２２に示すフラグ受信バッファに格納されたフラグデータとの対応する関係を示す図である。
【図２４】図１５に示すデータ処理システムの技術を適用した別のシステムを示す図である。
【符号の説明】
【０１４６】
１０  上流プロセッサ、  １２  格納制御部、  １４  入力カウンタ、  ２０  入力キュー、  ２８  ビットマップ、  ３０  識別子添付部、  ４０  プロセッサ群、  ５０  ブロック選出部、  ６０  出力キュー、  ６８  ビットマップ、  ７０  下流プロセッサ、  ７２  出力カウンタ、７４  回数通知部、  ８０  共有メモリ、  １００  データ処理システム、  １１０  上流処理ユニット、  １１２  プロセッサコア、  １１４  ローカルメモリ、  １１８  入力キュー、  １２０  プロセッサインタフェース、  １３４  格納制御部、  １３６  転送先振当部、  １３８  識別子添付部、  １４０  処理ユニット群、  １４２  プロセッサコア、  １４４  ローカルメモリ、  １４６  受信キュー、  １４８  送信キュー、  １５０  プロセッサインタフェース、  １５４  ブロック選出部、  １６０  下流処理ユニット、  １６２  プロセッサコア、  １６４  参照先振当部、  １６６  プロセッサインタフェース、  １６８  レジスタ、  １７０  ローカルメモリ、  １７２  フラグ受信バッファ、  １７６  ビットマップ、１７８  出力キュー、  １８２  出力カウンタ、  １８４  回数通知部、  １９０  共有メモリ。
【図１】
2007128369.tif 000003
【図２】
2007128369.tif 000004
【図３】
2007128369.tif 000005
【図４】
2007128369.tif 000006
【図５】
2007128369.tif 000007
【図６】
2007128369.tif 000008
【図７】
2007128369.tif 000009
【図８】
2007128369.tif 000010
【図９】
2007128369.tif 000011
【図１０】
2007128369.tif 000012
【図１１】
2007128369.tif 000013
【図１２】
2007128369.tif 000014
【図１３】
2007128369.tif 000015
【図１４】
2007128369.tif 000016
【図１５】
2007128369.tif 000017
【図１６】
2007128369.tif 000018
【図１７】
2007128369.tif 000019
【図１８】
2007128369.tif 000020
【図１９】
2007128369.tif 000021
【図２０】
2007128369.tif 000022
【図２１】
2007128369.tif 000023
【図２２】
2007128369.tif 000024
【図２３】
2007128369.tif 000025
【図２４】
2007128369.tif 000026