(57)【要約】  プログラマが同期ポイントを明示的に設定することなく、複数のキャッシュの内容を同期させることができ、全キャッシュブロックをスキャンすることなく、キャッシュの内容を同期させることができる、キャッシュの同期制御方法を提供する。キャッシュ同期制御方法は、キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備えたマルチプロセッサにおけるキャッシュ同期制御方法であって、タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該入力データに相当するデータを削除する第１の工程と、前記タスクの実行後に、前記タスクを実行したプロセッサは前記タスクの出力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該出力データに相当するデータを削除する第２の工程と、を含む（図３）。
2009057762.tif 000002
【特許請求の範囲】
【請求項１】
キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備えたマルチプロセッサにおけるキャッシュ同期制御方法であって、
タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該入力データに相当するデータを削除する第１の工程と、
前記タスクの実行後に、前記タスクを実行したプロセッサは前記タスクの出力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該出力データに相当するデータを削除する第２の工程と、を含むことを特徴とする、キャッシュ同期制御方法。
【請求項２】
前記第１の工程において、前記タスクを管理するプロセッサはそれ以外のプロセッサに自己のキャッシュから前記入力データに相当するデータを削除するように通知し、
前記第２の工程において、前記タスクを実行したプロセッサはそれ以外のプロセッサに自己のキャッシュから前記出力データに相当するデータを削除するように通知することを特徴とする、請求項１に記載のキャッシュ同期制御方法。
【請求項３】
複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるマルチプロセッサにおいて、プログラムをタスクと呼ばれる複数の小プログラムに分割し、タスクへ他タスクから与えられたデータを入力データとし、タスクが他タスクへ受け渡すデータを出力データとし、前記タスクを前記マルチプロセッサにおいて実行する場合に前記キャッシュの同期を制御する方法であって、
タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを記憶装置に書き戻し、該タスクの入力データの古いコピーを他のプロセッサのキャッシュから削除する第１の工程と、
タスクの実行後に、タスクの出力データをキャッシュから記憶装置に書き戻し、タスクの出力データの古いコピーを他のプロセッサのキャッシュから削除する第２の工程と、を含むことを特徴とするキャッシュ同期制御方法。
【請求項４】
前記第１の工程において、どの入力データを記憶装置に書き戻すべきかという情報が与えられており、その情報において指定された入力データのみをキャッシュから記憶装置に書き戻すことを特徴とする、請求項３に記載のキャッシュ同期制御方法。
【請求項５】
キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備え、
タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該入力データに相当するデータを削除し、
前記タスクの実行後に、前記タスクを実行したプロセッサは前記タスクの出力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該出力データに相当するデータを削除するように構成されたことを特徴とするマルチプロセッサ。
【請求項６】
前記複数のプロセッサはマスタプロセッサとスレーブプロセッサとを含み、
前記スレーブプロセッサは前記タスクを実行し、
前記マスタプロセッサは前記タスクを前記スレーブプロセッサに割り当てることを特徴とする、請求項５に記載のマルチプロセッサ。
【請求項７】
前記複数のプロセッサ及び前記記憶装置が結合されたバスを備えることを特徴とする、請求項５又は６に記載のマルチプロセッサ。
【請求項８】
複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるとともに、プログラムをタスクと呼ばれる複数の小プログラムに分割し、各タスクを前記プロセッサのいずれかにおいて実行するように構成されたマルチプロセッサであって、
前記プロセッサはデータ書き戻し部とデータ削除部とを備え、
前記データ書き戻し部は各タスクの実行前にそのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻し、さらに、各タスクの実行後にそのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻すように構成されるとともに、
前記データ削除部は各タスクの実行前に前記データ書き戻し部によって記憶装置に書き戻された入力データの古いコピーを保持するキャッシュからその古いコピーを削除し、さらに、各タスクの実行後に前記データ書き戻し部によって記憶装置に書き戻された出力データの古いコピーを保持するキャッシュからその古いコピーを削除するように構成されることを特徴とするマルチプロセッサ。
【請求項９】
プログラムをタスクと呼ばれる複数の小プログラムに分割し、タスクへ他タスクから与えられたデータを入力データとし、タスクが他タスクへ受け渡すデータを出力データとしたときに、タスクの入力データと出力データとにもとづいてタスクの実行順序を制御するように構成されたマスタプロセッサと、
タスクを実行するように構成された１個以上のスレーブプロセッサと、
タスクの入力データ及び出力データを記録するように構成された記憶装置と、
前記両プロセッサと記憶装置とを接続するように構成された結合網と、を備えたマルチプロセッサであって、
前記両プロセッサはキャッシュとデータ書き戻し部とデータ削除部とを備え、
前記データ書き戻し部は各タスクの実行前にそのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻し、さらに、各タスクの実行後にそのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻すように構成されるとともに、
前記データ削除部は各タスクの実行前に前記データ書き戻し部によって記憶装置に書き戻された入力データの古いコピーを保持するキャッシュからその古いコピーを削除し、さらに、各タスクの実行後に前記データ書き戻し部によって記憶装置に書き戻された出力データの古いコピーを保持するキャッシュからその古いコピーを削除するように構成されることを特徴とするマルチプロセッサ。
【請求項１０】
キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備えたマルチプロセッサにおけるキャッシュ同期制御プログラムであって、
タスクの実行前に、該タスクを管理するプロセッサに対して該タスクの入力データを前記記憶装置に書き戻す処理を実行させるとともに、それ以外のプロセッサに対して自己のキャッシュから該入力データに相当するデータを削除する処理を実行させ、
前記タスクの実行後に、前記タスクを実行したプロセッサに対して前記タスクの出力データを前記記憶装置に書き戻す処理をさせるとともに、それ以外のプロセッサに対して自己のキャッシュから該出力データに相当するデータを削除する処理を実行させることを特徴とする、キャッシュ同期制御プログラム。
【請求項１１】
複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるマルチプロセッサにおいて、プログラムをタスクと呼ばれる複数の小プログラムに分割し、各タスクを前記プロセッサのいずれかにおいて実行する場合に前記キャッシュの同期制御を前記プロセッサに実行させるキャッシュ同期制御プログラムであって、
各タスクの実行前に、そのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻す処理と、
その入力データの古いコピーを保持するキャッシュからその古いコピーを削除する処理と、を前記プロセッサに実行させるとともに、
各タスクの実行後に、そのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻す処理と、
その出力データの古いコピーを保持するキャッシュからその古いコピーを削除する処理と、を前記プロセッサに実行させることを特徴とするキャッシュ同期制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
［関連出願の記載］
本発明は、日本国特許出願：特願２００７−２８５２９９号（２００７年１１月  １日出願）の優先権主張に基づくものであり、同出願の全記載内容は引用をもって本書に組み込み記載されているものとする。
本発明は、マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラムに関する。
【背景技術】
【０００２】
マルチプロセッサにおいて、各プロセッサがキャッシュを有する場合には、キャッシュの一貫性（キャッシュコヒーレンス）を維持する機構が必要である。これまでに、キャッシュの一貫性を維持するためのさまざまな機構（キャッシュ同期機構）が考えられている（非特許文献１）。【０００３】
キャッシュ同期機構の一つとしてバリア同期方式がある。バリア同期方式においては、複雑なハードウェアが必要とされない。特許文献１において、バリア同期方式の具体例が開示されている。特許文献１に開示されたバリア同期方式においては、プロセッサのプログラムカウンタが同期ポイントと呼ばれる位置に到達した時に、その時点で変更されているキャッシュブロックを全て主記憶へ書き戻す。【０００４】
特許文献２において開示されたバリア同期方式は、特許文献１のバリア同期方式を改良したものである。特許文献２のバリア同期方式においては、キャッシュブロックに対して共有データか否かという情報が付加され、この情報を利用することによって、同期ポイントにおいて主記憶へ書き戻されるキャッシュブロックの数を減らすことができる。【０００５】
【特許文献１】特開平０９−６２５７６号公報
【特許文献２】特開平０９−６２５８０号公報
【特許文献３】特開２００１−１７５６１９号公報
【特許文献４】特開２０００−２８５０８４号公報
【非特許文献１】Ｐｅｒ  Ｓｔｅｎｓｔｒｏｅｍ、“Ａ  Ｓｕｒｖｅｙ  ｏｆ  Ｃａｃｈｅ  Ｃｏｈｅｒｅｎｃｅ  Ｓｃｈｅｍｅｓ  ｆｏｒ  Ｍｕｌｔｉｐｒｏｃｅｓｓｏｒｓ”  ＩＥＥＥ  Ｃｏｍｐｕｔｅｒ、（米国）、１９９０年、Ｖｏｌ．２３、Ｎｏ．６、ｐ．１２−２４
【発明の開示】
【発明が解決しようとする課題】
【０００６】
以上の特許文献１から４及び非特許文献１の全開示内容は、本書に引用をもって繰り込み記載されているものとする。以下に本発明による関連技術の分析を与える。
以下の分析は、本発明者によってなされたものである。【０００７】
特許文献１及び特許文献２のバリア同期方式は、以下の問題を抱えている。【０００８】
第１の問題は、同期ポイントを適切に設定するのはプログラマであるという点である。第２の問題は、どのキャッシュブロックを主記憶へ書き戻すかを判定するために、キャッシュブロックの全てをスキャンする必要があるという点である。これらのいずれの問題も、一般的なバリア同期方式において共通に現れる問題である。【０００９】
第１の問題によって、プログラムの開発が困難となる。プログラマが同期ポイントを適切に設定すれば、不必要な同期処理を排除することができる。しかし、同期ポイントが適切に設定されていない場合は、プログラムが誤動作してしまう。同期ポイントを適切に設定するには、データの共有方法並びにデータを処理する順序及びタイミングをプログラマが十分に把握している必要がある。データ処理のタイミングを正しく理解するのは特に面倒であるため、同期ポイントの適切な設定はプログラマにとって煩雑な作業となる。【００１０】
第２の問題によって、バリア同期に要する時間が増大する。例えば、ブロックサイズを３２バイトとすると、容量８Ｋバイトのキャッシュには２５６個のキャッシュブロックが存在する。一つのキャッシュブロックのスキャンに１サイクルかかる場合、全てのキャッシュブロックをスキャンするのに２５６サイクルを要する。【００１１】
そこで、プログラマが同期ポイントを明示的に設定することなく複数のキャッシュの内容を同期させることができ、全キャッシュブロックをスキャンすることなくキャッシュの内容を同期させることができる、キャッシュの同期制御方法を提供することが課題となる。
【課題を解決するための手段】
【００１２】
本発明の第１の視点に係るキャッシュ同期制御方法は、キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備えたマルチプロセッサにおけるキャッシュ同期制御方法であって、タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該入力データに相当するデータを削除する第１の工程と、前記タスクの実行後に、前記タスクを実行したプロセッサは前記タスクの出力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該出力データに相当するデータを削除する第２の工程と、を含む。
第１の展開形態のキャッシュ同期制御方法は、前記第１の工程において、前記タスクを管理するプロセッサはそれ以外のプロセッサに自己のキャッシュから前記入力データに相当するデータを削除するように通知し、前記第２の工程において、前記タスクを実行したプロセッサはそれ以外のプロセッサに自己のキャッシュから前記出力データに相当するデータを削除するように通知することが好ましい。
本発明の第２の視点に係るキャッシュ同期制御方法は、複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるマルチプロセッサにおいて、プログラムをタスクと呼ばれる複数の小プログラムに分割し、タスクへ他タスクから与えられたデータを入力データとし、タスクが他タスクへ受け渡すデータを出力データとし、前記タスクを前記マルチプロセッサにおいて実行する場合に前記キャッシュの同期を制御する方法であって、タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データをキャッシュから記憶装置に書き戻し、タスクの入力データの古いコピーを他のプロセッサのキャッシュから削除する第１の工程と、タスクの実行後に、タスクの出力データをキャッシュから記憶装置に書き戻し、タスクの出力データの古いコピーを他のプロセッサのキャッシュから削除する第２の工程と、を含む。【００１３】
本発明の一展開形態においてキャッシュ同期制御方法は、前記第１の工程において、どの入力データを記憶装置に書き戻すべきかという情報が与えられており、その情報において指定された入力データのみをキャッシュから記憶装置に書き戻すことが好ましい。【００１４】
本発明の第３の視点に係るマルチプロセッサは、キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備え、タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該入力データに相当するデータを削除し、前記タスクの実行後に、前記タスクを実行したプロセッサは前記タスクの出力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該出力データに相当するデータを削除するように構成される。
第３の展開形態のマルチプロセッサにおいて、前記複数のプロセッサはマスタプロセッサとスレーブプロセッサとを含み、前記スレーブプロセッサは前記タスクを実行し、前記マスタプロセッサは前記タスクを前記スレーブプロセッサに割り当てることが好ましい。
第４の展開形態のマルチプロセッサは、前記複数のプロセッサ及び前記記憶装置が結合されたバスを備えることが好ましい。
本発明の第４の視点に係るマルチプロセッサは、複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるとともに、プログラムをタスクと呼ばれる複数の小プログラムに分割し、各タスクを前記プロセッサのいずれかにおいて実行するように構成されたマルチプロセッサであって、前記プロセッサはデータ書き戻し部とデータ削除部とを備え、前記データ書き戻し部は各タスクの実行前にそのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻し、さらに、各タスクの実行後にそのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻すように構成されるとともに、前記データ削除部は各タスクの実行前に前記データ書き戻し部によって記憶装置に書き戻された入力データの古いコピーを保持するキャッシュからその古いコピーを削除し、さらに、各タスクの実行後に前記データ書き戻し部によって記憶装置に書き戻された出力データの古いコピーを保持するキャッシュからその古いコピーを削除するように構成される。【００１５】
本発明の第５の視点に係るマルチプロセッサは、プログラムをタスクと呼ばれる複数の小プログラムに分割し、タスクへ他タスクから与えられたデータを入力データとし、タスクが他タスクへ受け渡すデータを出力データとしたときに、タスクの入力データと出力データとにもとづいてタスクの実行順序を制御するように構成されたマスタプロセッサと、タスクを実行するように構成された１個以上のスレーブプロセッサと、タスクの入力データ及び出力データを記録するように構成された記憶装置と、前記両プロセッサと記憶装置とを接続するように構成された結合網と、を備えたマルチプロセッサであって、前記両プロセッサはキャッシュとデータ書き戻し部とデータ削除部とを備え、前記データ書き戻し部は各タスクの実行前にそのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻し、さらに、各タスクの実行後にそのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻すように構成されるとともに、前記データ削除部は各タスクの実行前に前記データ書き戻し部によって記憶装置に書き戻された入力データの古いコピーを保持するキャッシュからその古いコピーを削除し、さらに、各タスクの実行後に前記データ書き戻し部によって記憶装置に書き戻された出力データの古いコピーを保持するキャッシュからその古いコピーを削除するように構成される。【００１６】
本発明の第６の視点に係るキャッシュ同期制御プログラムは、キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備えたマルチプロセッサにおけるキャッシュ同期制御プログラムであって、タスクの実行前に、該タスクを管理するプロセッサに対して該タスクの入力データを前記記憶装置に書き戻す処理を実行させるとともに、それ以外のプロセッサに対して自己のキャッシュから該入力データに相当するデータを削除する処理を実行させ、前記タスクの実行後に、前記タスクを実行したプロセッサに対して前記タスクの出力データを前記記憶装置に書き戻す処理をさせるとともに、それ以外のプロセッサに対して自己のキャッシュから該出力データに相当するデータを削除する処理を実行させる。
本発明の第７の視点に係るキャッシュ同期制御プログラムは、複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるマルチプロセッサにおいて、プログラムをタスクと呼ばれる複数の小プログラムに分割し、各タスクを前記プロセッサのいずれかにおいて実行する場合に前記キャッシュの同期制御を前記プロセッサに実行させるキャッシュ同期制御プログラムであって、各タスクの実行前に、そのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻す処理と、その入力データの古いコピーを保持するキャッシュからその古いコピーを削除する処理と、を前記プロセッサに実行させるとともに、各タスクの実行後に、そのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻す処理と、その出力データの古いコピーを保持するキャッシュからその古いコピーを削除する処理と、を前記プロセッサに実行させる。
【発明の効果】
【００１７】
本発明に係るキャッシュ同期制御方法によって、プログラマが同期ポイントを明示的に設定することなく複数のキャッシュの内容を同期させることができる。また、本発明に係るキャッシュ同期制御方法によって、全キャッシュブロックをスキャンすることなくキャッシュの内容を同期させることができる。
【図面の簡単な説明】
【００１８】
【図１】タスクの概念図である。
【図２】タスクのデータフローグラフの一例を表す図である。
【図３】本発明の実施形態に係るマルチプロセッサの構成図である。
【図４】本発明の実施形態に係るキャッシュ同期制御方法のフローチャートである。
【図５】本発明の実施形態に係るキャッシュ同期制御方法におけるタスク生成のフローチャートである。
【図６】本発明の実施形態に係るキャッシュ同期制御方法におけるタスク実行のフローチャートである。
【図７】本発明の実施形態に係るキャッシュ同期制御方法におけるキャッシュ同期処理のフローチャートである。
【図８】４個のベクトルと１個のスカラ値を加算するＣ言語の関数を表す図である。
【図９】図８と等価なＣ言語の関数であって、本発明の実施形態に係るキャッシュ同期制御方法を使うように変形された関数を表す図である。
【図１０】二つのデータが記憶装置上で同じアドレスを共有する状態を表す図である。
【図１１】二つのデータが記憶装置上で全く同じアドレスを共有しない状態を表す図である。
【図１２】二つのデータが記憶装置上で同じＬバイトのメモリブロックに格納されていることを表す図である。
【図１３】二つのデータが記憶装置上で異なるＬバイトのメモリブロックに格納されていることを表す図である。
【図１４】ダイレクトマップ方式のキャッシュのタグ計算方法を示す図である。
【図１５】本発明の実施形態に係るマルチプロセッサのメモリ配置を表す図である。
【符号の説明】
【００１９】
１０  マスタプロセッサ
１１  命令キャッシュ
１２  データキャッシュ
１３  データ書き戻し部
１４  データ削除部
２１〜２４  スレーブプロセッサ
３０  記憶装置
４０  バス
【発明を実施するための最良の形態】
【００２０】
本発明の実施形態に係るマルチプロセッサのキャッシュ同期制御方法について、図面を参照して詳細に説明する。【００２１】
図４は本実施形態に係るキャッシュ同期制御方法のフローチャートである。【００２２】
キャッシュ同期制御方法は、タスクを生成する工程（ステップＳ１００）と、タスクを実行する工程（ステップＳ２００）とを含む。【００２３】
図５は、タスク生成工程（ステップＳ１００）における具体的な手順を示す。【００２４】
タスク生成工程（ステップＳ１００）は、図５を参照すると、入力データに関するタスク実行可能性判定（ステップＳ１０）と、出力データに関するタスク実行可能性判定（ステップＳ１１）、入力データのキャッシュ同期処理（ステップＳ１２）、タスク割り当て（ステップＳ１３）、タスクのパラメータ受け渡し（ステップＳ１４）の工程を含む。【００２５】
図６は、タスク実行工程（ステップＳ２００）における具体的な手順を示す。【００２６】
タスク実行工程（ステップＳ２００）は、図６を参照すると、タスクのパラメータ受け取り（ステップＳ２０）、タスクの実行（ステップＳ２１）、出力データのキャッシュ同期処理（ステップＳ２２）、タスクの完了通知（ステップＳ２３）の工程を含む。【００２７】
図７は、入力データのキャッシュ同期処理（ステップＳ１２）又は出力データのキャッシュ同期処理（ステップＳ２２）の詳細な手順を示す。これらのキャッシュ同期処理の工程は、アドレス変数ＡＤＤＲの初期化（ステップＳ３０）、アドレス変数ＡＤＤＲ＿ＥＮＤの初期化（ステップＳ３１）、データの書き戻し（ステップＳ３２）、データの古いコピーの削除（ステップＳ３３）、終了判定（ステップＳ３４）、アドレス変数ＡＤＤＲの更新（ステップＳ３５）の工程を含む。【００２８】
以上の手順によって、タスクと呼ばれる小プログラムごとに複数キャッシュの内容の一貫性が保持される。したがって、プログラマが同期ポイントを明示的に設定することなく、複数のデータキャッシュの内容を同期させることができる。さらに、キャッシュ同期処理が必要なデータがタスクの入力データと出力データとに限定されるため、キャッシュの全てのキャッシュブロックをスキャンすることなく、特定のデータについてだけキャッシュの内容を同期させることができる。【００２９】
本発明のタスク実行にもとづいたキャッシュ同期制御方法の全てのステップあるいは一部のステップをプロセッサ上で動作するプログラムとして実現してもよい。
【実施例】
【００３０】
図面を参照して、本発明のタスク実行にもとづいたキャッシュ同期制御方法の実施例について説明する。【００３１】
本発明の実施例におけるタスクについて説明する。本発明におけるタスクとはＣ言語における関数と同様のものである。すなわち、タスクは小規模のプログラムであって、入力データと出力データをもつ。入力データは外部からタスクへ与えられるデータであって、タスクが参照する外部のデータの全てが、入力データに含まれる。出力データはタスクが外部へ受け渡す全てのデータである。図１はタスクの概念図を示す。【００３２】
タスクに対する入力データや出力データは無くてもよいし、複数個あってもよい。ある入力データが出力データに含まれてもよい。タスクの中だけで生成されて消滅するようなデータ（ローカルデータ）は、上記の入力データや出力データには含まれない。【００３３】
入力データや出力データは開始アドレスとデータサイズで指定される。開始アドレスは入力データや出力データが記憶装置のどの位置に格納されているかを表す。データサイズは入力データや出力データの大きさを表す。【００３４】
本発明の実施例におけるタスクは、外部から与えられる入力データと外部へ受け渡す出力データをもつ。この入力データと出力データの情報を使って複数のタスクの依存関係をグラフに表現することができる。このグラフは一般にデータフローグラフと呼ばれる。データフローグラフはタスクの依存関係を示す。また、その依存関係はタスクの実行順序やタスクの並列実行可能性を示す。データフローグラフの例を図２に示す。【００３５】
タスクやデータフローグラフの概念は従来から知られているものである。例えば、特許文献３で説明されているマクロタスクは本発明のタスクと同じようなものである。特許文献３は、一つのプログラムを複数のマクロタスクに分割して、そのマクロタスクを並列処理するマルチプロセッサについて説明している。さらに、特許文献４は、データフローにもとづいたプログラムの実行方法や開発方法について説明している。【００３６】
タスクとデータフローグラフを使うことにより、どのデータがタスク間で共有されるデータであるのかを知ることができる。本発明はタスクとデータフローグラフのこのような特徴を利用して、複数のキャッシュの一貫性を維持する。【００３７】
本発明の実施例においては、入力データや出力データに関するタスクの依存関係にもとづいてタスクの実行順序を決定する。そして、タスクの実行開始時点と実行完了時点とを特許文献１及び２に開示されたバリア同期方式における同期ポイントとみなす。さらに、二つ以上のタスクが記憶装置上の同一のアドレスへ異なる値を書き込むことがないように、本発明の実施例においては、タスクの実行を制御する。タスクの実行開始時点と実行完了時点という暗黙的な同期ポイントにおいては、タスクの入力データと出力データだけについてキャッシュの一貫性を維持すれば良い。どのデータについてのキャッシュの一貫性をいつ維持すれば良いのかを明示的に知ることができるので、本発明の実施例においては、キャッシュ一貫性維持のための複雑な回路を必要としない。【００３８】
本発明の実施例に係るマルチプロセッサの構成について説明する。本発明の実施例におけるマルチプロセッサの構成を図３に示す。【００３９】
本発明の実施例におけるマルチプロセッサは、一つのマスタプロセッサ１０と複数のスレーブプロセッサ２１〜２４を備える。マスタプロセッサ１０はプログラム全体の進行とタスクの実行を管理する。スレーブプロセッサ２１〜２４はタスクを実行する。図３は、４個のスレーブプロセッサ２１〜２４を示している。しかし、本発明の実施例におけるマルチプロセッサは、１個以上の任意個数のスレーブプロセッサを備えることができる。マスタプロセッサ１０とスレーブプロセッサ２１〜２４はそれぞれ命令キャッシュ１１とデータキャッシュ１２を備える。マスタプロセッサ１０とスレーブプロセッサ２１〜２４はバス４０に接続されている。記憶装置３０も、バス４０に接続されている。記憶装置３０は、マスタプロセッサ１０やスレーブプロセッサ２１〜２４のためのプログラムやデータを保持する。記憶装置３０は、主記憶だけで構成されても良いし、２次キャッシュと主記憶の組み合わせで構成されてもよい。２次キャッシュと主記憶との組合せからなる記憶装置３０においては、主記憶は２次キャッシュを経由してアクセスされる。２次キャッシュは、最近アクセスされた主記憶のデータのコピーを保持する。プロセッサが２次キャッシュを経由して主記憶からデータを読み出そうとするときに、そのデータのコピーが２次キャッシュの中に存在する場合には、２次キャッシュはそのデータのコピーをプロセッサへ返す。一方、そのデータのコピーが２次キャッシュの中に存在しない場合には、２次キャッシュは主記憶からそのデータを読み出して、そのデータを２次キャッシュの中にコピーし、そのデータをプロセッサへ返す。【００４０】
各プロセッサのデータ書き戻し部１３は、タスク実行前のタスクの入力データもしくはタスク実行後のタスクの出力データをデータキャッシュ１２から記憶装置３０に書き戻す。データ書き戻し部１３は、データキャッシュ１２から記憶装置３０にデータを書き戻す際に、ｃａｃｈｅ−ｓｙｎｃ信号を他のプロセッサに送信する。データ書き戻し部１３はソフトウェア又は回路として、プロセッサに組み込んでも良い。本実施例では、データ書き戻し部はソフトウェアとしてプロセッサに組み込まれているものと仮定する。【００４１】
各プロセッサのデータ削除部１４は、他プロセッサのデータ書き戻し部１３によって記憶装置３０に書き戻されたデータを自身のデータキャッシュ１２から削除する。あるプロセッサのデータ書き戻し部１３から他のプロセッサにｃａｃｈｅ−ｓｙｎｃ信号が送信されると、その信号を受けとった他のプロセッサのデータ削除部１４はデータ書き戻し部１３によって記憶装置３０に書き戻されるデータを自身のデータキャッシュ１２から削除する。【００４２】
データ削除部１４はソフトウェアとしてあるいは回路としてプロセッサに組み込んでも良い。本実施例においては、データ削除部１４は回路としてプロセッサに組み込まれているものと仮定する。【００４３】
命令キャッシュ１１は、プログラムを格納するためのキャッシュである。各プロセッサは命令キャッシュ１１を経由してプログラムを記憶装置３０から読み込む。データキャッシュ１２はデータを格納するためのキャッシュである。各プロセッサはデータキャッシュ１２を経由してデータを記憶装置３０から読み込んだり、記憶装置３０に書き込んだりする。命令キャッシュ１１とデータキャッシュ１２のキャッシュブロックサイズは、一例として、それぞれ３２バイトとする。【００４４】
データキャッシュ１２は、一般的なライトバック方式のキャッシュとする。つまり、データキャッシュ１２の各キャッシュブロックはｖａｌｉｄフラグとｄｉｒｔｙフラグとタグという情報をもつ。ｖａｌｉｄフラグは、記憶装置３０上のデータのコピーがキャッシュブロックに存在することを表す１ビットの情報である。ｄｉｒｔｙフラグは、そのコピーの内容が変更されていることを表す１ビットの情報である。タグはキャッシュブロックに格納されるデータのアドレスを表す情報である。タグは、アドレスに基づいて一意に計算することができる情報である。【００４５】
図１４は、タグの構成の一例を示す。図１４は、ダイレクトマップ方式のキャッシュにおけるタグ計算方法を示す図である。図１４によると、３２ビットのアドレスをＬＳＢ側から順番にｏｆｆｓｅｔフィールド、ｉｎｄｅｘフィールド、ｔａｇフィールドの三つに分割することによって、アドレスからタグを得る。ｏｆｆｓｅｔフィールドは、キャッシュブロック内のデータの位置を表す。ｉｎｄｅｘフィールドは、キャッシュブロックの番号を表す。ｔａｇフィールドは、そのアドレスのタグを表す。ｏｆｆｓｅｔフィールドの幅Ｐは、キャッシュブロックのサイズによって決まる。ｉｎｄｅｘフィールドの幅Ｂは、キャッシュブロックのサイズとキャッシュの容量によって決まる。ｔａｇフィールドの幅は、（３２−Ｂ−Ｐ）ビットである。図１４のタグ計算方法は一つの例であり、どのようにタグを計算するかはキャッシュのブロックサイズや連想セット数に依存する。【００４６】
キャッシュブロックにデータが格納されていない状態では、そのキャッシュブロックのｖａｌｉｄフラグとｄｉｒｔｙフラグはいずれも０である。キャッシュブロックにデータを格納した場合には、そのキャッシュブロックのｖａｌｉｄフラグを１にする。キャッシュブロックのデータを変更した場合には、そのキャッシュブロックのｄｉｒｔｙフラグを１にする。【００４７】
あるキャッシュブロックのｖａｌｉｄフラグを０にすると、そのキャッシュブロックのデータをキャッシュから削除したことになる。ｄｉｒｔｙフラグが１のキャッシュブロックのデータをデータキャッシュから記憶装置３０へ書き戻した場合、そのキャッシュブロックのデータは記憶装置３０のデータと一致することになる。したがって、そのキャッシュブロックのｄｉｒｔｙフラグを０にする。【００４８】
ｄｉｒｔｙフラグが０のキャッシュブロックへ記憶装置３０上のデータのコピーを格納する場合、そのキャッシュブロックへそのデータのアドレスのタグとデータとを格納するとともにそのキャッシュブロックのｖａｌｉｄフラグを１にする。一方、ｖａｌｉｄフラグが１であり、ｄｉｒｔｙフラグが１であるキャッシュブロックへ記憶装置３０上の新たなデータのコピーを格納する場合には、そのキャッシュブロックの古いデータを記憶装置３０に書き戻してｄｉｒｔｙフラグを０にしてから、そのキャッシュブロックにそのデータのアドレスのタグとデータとを格納するとともにそのキャッシュブロックのｖａｌｉｄフラグを１とする。【００４９】
命令キャッシュ１１は命令の読み込みのためだけに使われ、プロセッサが命令キャッシュ１１に格納されたプログラムの断片を記憶装置とは異なる内容に変更してしまうことはない。したがって、複数のキャッシュの内容の一貫性を維持するには、データキャッシュ１２のみを対象とすればよい。以降の説明では、図３における複数のデータキャッシュ１２の内容の一貫性を維持する方法について説明する。【００５０】
本発明の実施例に係るタスクの生成と実行の手順について、図４を参照して説明する。ステップＳ１００においてタスクを生成し、ステップＳ２００においてタスクを実行する。ステップＳ１００を実行するのはマスタプロセッサ１０である。ステップＳ２００を実行するのはいずれかのスレーブプロセッサである。ステップＳ１００においては、タスク生成パラメータが必要である。ステップＳ２００においては、タスク実行パラメータが必要である。タスク生成パラメータは以下の４つからなる。【００５１】
「タスク処理内容ｔａｓｋ＿Ｘ」は、タスクの処理内容を表すパラメータである。このパラメータは例えばＣ言語における関数ポインタとして表される。【００５２】
「入力データ（ａ＃１、ａ＃２、．．．、ａ＃Ｐ）」は、タスクに対するＰ個の入力データである。Ｐは１以上の任意の整数である。入力データは記憶装置３０上の開始アドレスとデータサイズによって表される。【００５３】
「出力データ（ｂ＃１、ｂ＃２、．．．、ｂ＃Ｑ）」は、タスクのＱ個の出力データである。Ｑは１以上の任意の整数である。出力データは、記憶装置３０上の開始アドレスとデータサイズによって表される。【００５４】
「キャッシュ同期処理が必要な入力データの情報」は、どの入力データに関してキャッシュ同期処理が必要かを表す情報である。タスクを生成する際に、この情報にもとづいてキャッシュ同期処理を行う。キャッシュ同期処理については後述する。【００５５】
タスク実行パラメータは、タスク処理内容（ｔａｓｋ＿Ｘ）、入力データ（ａ＃１、ａ＃２、．．．、ａ＃Ｐ）、出力データ（ｂ＃１、ｂ＃２、．．．、ｂ＃Ｑ）の３つからなる。キャッシュ同期処理が必要な入力データの情報がタスク実行パラメータには含まれない。【００５６】
ステップＳ１００やステップＳ２００については、以下において詳しく説明する。【００５７】
タスク生成工程（ステップＳ１００）の手順について説明する。図４に示すようにステップＳ１００においては、四つのパラメータを受けとる。ステップＳ１００におけるタスクの生成手順を図５に示す。図５の手順にもとづいて、マスタプロセッサ１０はそのタスクを生成し、そのタスクをあるスレーブプロセッサに実行させる。図５の各ステップの処理内容は以下のとおりである。【００５８】
入力データに関するタスク実行可能性判定（ステップＳ１０）において、マスタプロセッサ１０は、タスクの入力データが既に準備できているかを調べる。タスクの入力データが現在実行中のタスクの出力データに含まれる場合には、マスタプロセッサ１０はその入力データの準備がまだできていないものと判断する。それ以外の場合には、マスタプロセッサ１０は、その入力データの準備ができているものと判断する。【００５９】
「含まれる」という言葉の意味について、図１０と図１１とを使って説明する。もしタスクの入力データと現在実行中のタスクの出力データの一部とが図１０に示すように記憶装置３０上で同じアドレスを共有する場合には、タスクの入力データは別のタスクの出力データに含まれているものとマスタプロセッサ１０は判断する。それ以外の場合には（図１１を参照）、タスクの入力データは別のタスクの出力データに含まれていないものとマスタプロセッサ１０は判断する。【００６０】
マスタプロセッサ１０は、タスクの全ての入力データが準備できるまで、このステップＳ１０を繰り返す。マスタプロセッサ１０がステップＳ１０を何度も繰り返している間に、やがて実行中のタスクが完了し、その完了は割り込み信号によってマスタプロセッサ１０に通知され、現在実行中のタスクの数は減少していく。したがって、いずれはステップＳ１０は終了し、次のステップＳ１１に遷移することができる。【００６１】
次に、出力データに関するタスク実行可能性判定（ステップＳ１１）において、マスタプロセッサ１０は、タスクの出力データが現在実行中の他のタスクの出力データと重なっているか否かを調べる。【００６２】
「重なっている」という言葉の意味について、図１２と図１３とを使って説明する。もしタスクの出力データの一部と現在実行中の別のタスクのいずれかの出力データの一部とが、図１２に示すように記憶装置３０上で同じＬバイトのメモリブロックに格納されるならば、マスタプロセッサ１０は、タスクの出力データが別の出力データと重なっているものと判断する。ここで、Ｌバイトのメモリブロックはスレーブプロセッサのキャッシュブロックと等しいサイズのメモリブロックであり、Ｌバイトのメモリブロックの開始アドレスはＬバイトにアラインされているものとする。【００６３】
一方、タスクの出力データの一部と現在実行中の別のタスクのいずれかの出力データの一部とが、図１３に示すように記憶装置３０上で異なるＬバイトのメモリブロックに格納されている場合には、タスクの出力データは別の出力データと重なっていないものと、マスタプロセッサ１０は判断する。マスタプロセッサ１０は、タスクの出力データが別の出力データと重なっていないものと判断できるまで、このステップＳ１１を繰り返す。【００６４】
マスタプロセッサ１０がステップＳ１１を何度も繰り返している間に、やがて実行中のタスクが完了し、その完了は割り込み信号によってマスタプロセッサ１０に通知され、現在実行中のタスクの数は減少していく。したがって、いずれはステップＳ１１が終了し、次のステップＳ１２に遷移することができる。【００６５】
入力データのキャッシュ同期処理（ステップＳ１２）において、タスクへの入力データの中にマスタプロセッサ１０が書き込んだデータがある場合には、マスタプロセッサ１０はその入力データを記憶装置３０に書き戻すためにデータ書き戻し部を使ってキャッシュ同期処理を行う。キャッシュ同期処理の対象となる入力データは、ステップＳ１００においてタスクに渡されるタスク生成パラメータに示されている。キャッシュ同期処理については後述する。【００６６】
タスク割り当て工程（ステップＳ１３）において、マスタプロセッサ１０は、タスクを実行させるスレーブプロセッサをどれか一つ選択する。選択されたスレーブプロセッサをｐ＿ｎとする。【００６７】
タスクのパラメータ受渡し工程（ステップＳ１４）において、マスタプロセッサ１０は、タスクの実行に必要なパラメータをスレーブプロセッサｐ＿ｎに受け渡す。パラメータの格納場所は記憶装置３０でも良いし、パラメータ格納専用のメモリやレジスタでも良い。本実施例では記憶装置３０にパラメータを格納する。そして、マスタプロセッサ１０は、スレーブプロセッサｐ＿ｎにタスクの実行開始を指示する。タスクの実行に必要なパラメータは、タスクの処理内容を表す関数の先頭アドレス、タスクの出力データ、タスクへの入力データの３つである。【００６８】
次に、タスク実行工程（ステップＳ２００）の手順について説明する。図４に示すように、ステップＳ２００においては、３つのパラメータを受けとる。既に説明したステップＳ１０からステップＳ１４までの手順によってタスクが生成され、生成されたそのタスクをいずれかのスレーブプロセッサが実行する。ここでは、タスクを実行するスレーブプロセッサをｐ＿ｎとする。ステップＳ２００におけるタスクの実行手順を図６に示す。図６を参照すると、スレーブプロセッサがタスクを実行する各ステップの処理内容は以下のとおりである。【００６９】
タスクのパラメータ受け取り工程（ステップＳ２０）において、スレーブプロセッサｐ＿ｎは、ステップＳ１４において渡されたタスクのパラメータを受けとる。【００７０】
タスクの実行工程（ステップＳ２１）において、スレーブプロセッサｐ＿ｎは、タスクのパラメータにもとづいてタスクを実行する。【００７１】
出力データのキャッシュ同期処理工程（ステップＳ２２）において、タスクの実行が完了した後、スレーブプロセッサｐ＿ｎは、タスクの全ての出力データを記憶装置３０に書き戻すためにデータ書き戻し部１３を使ってキャッシュ同期処理を実行する。キャッシュ同期処理の対象となるデータはタスクの全ての出力データである。キャッシュ同期処理については後述する。【００７２】
タスクの完了通知工程（ステップＳ２３）において、スレーブプロセッサｐ＿ｎは、マスタプロセッサ１０にタスクの実行完了を通知する。【００７３】
次に、上記の説明のステップＳ１２とステップＳ２２に登場したキャッシュ同期処理について説明する。キャッシュ同期処理は、マスタプロセッサ１０あるいはスレーブプロセッサのデータ書き戻し部１３とデータ削除部１４とによって実行される処理である。キャッシュ同期処理を実行するプロセッサをｐ＿ｃｃとする。キャッシュ同期処理の手順を図７に示す。キャッシュ同期処理の対象となるデータが複数個ある場合には、その一つ一つのデータについて図７の手順を繰り返す。図７の各ステップの処理内容は以下のとおりである。【００７４】
ＡＤＤＲの初期化工程（ステップＳ３０）において、キャッシュ同期処理の対象となるデータの開始アドレスを変数ＡＤＤＲへ代入する。【００７５】
ＡＤＤＲ＿ＥＮＤの初期化工程（ステップＳ３１）において、キャッシュ同期処理の対象となるデータの開始アドレスとデータサイズの和から１を減算した値を変数ＡＤＤＲ＿ＥＮＤに代入する。変数ＡＤＤＲ＿ＥＮＤは、キャッシュ同期処理の対象となるデータの終了アドレスを表す。【００７６】
データの書き戻し工程（ステップＳ３２）において、プロセッサｐ＿ｃｃは、変数ＡＤＤＲが示すアドレスのデータをデータキャッシュから記憶装置３０に書き戻す。この書き戻しはプロセッサｐ＿ｃｃのデータ書き戻し部１３によって、次のように行なわれる。まず、データ書き戻し部１３は、変数ＡＤＤＲのタグと同じタグをもつキャッシュブロックがデータキャッシュ内に存在するか否かを調べる。そのようなキャッシュブロックが存在し、かつ、そのキャッシュブロックのｖａｌｉｄフラグとｄｉｒｔｙフラグがともに１である場合には、データ書き戻し部１３は、そのキャッシュブロックのデータを記憶装置３０に書き戻してからそのキャッシュブロックのｄｉｒｔｙフラグを０にする。プロセッサｐ＿ｃｃは、キャッシュブロックのデータを記憶装置３０に書き戻したことを他のプロセッサに知らせるため、この書き戻しの実行中に、データ書き戻し部１３は、他のプロセッサにｃａｃｈｅ−ｓｙｎｃ信号を送信する。【００７７】
データの古いコピーの削除工程（ステップＳ３３）において、プロセッサｐ＿ｃｃ以外のプロセッサのデータキャッシュから変数ＡＤＤＲが示すアドレスのデータのコピーを削除する。この削除は、プロセッサ内のデータ削除部１４によって次のように行なわれる。プロセッサｐ＿ｃｃのデータ書き戻し部１３によって送信されたｃａｃｈｅ−ｓｙｎｃ信号を受信した他の全てのプロセッサのデータ削除部１４は、バス４０上を流れているデータのアドレスを読みとる。そして、データ削除部１４は、そのアドレスのタグと同じタグをもつキャッシュブロックが自身のデータキャッシュ内に存在するか否かを調べる。そのようなキャッシュブロックが存在し、かつ、そのキャッシュブロックのｖａｌｉｄフラグが１である場合には、データ削除部１４はそのキャッシュブロックのｖａｌｉｄフラグを０にする。【００７８】
終了判定工程（ステップＳ３４）において、もし変数ＡＤＤＲと変数ＡＤＤＲ＿ＥＮＤとが示すアドレスが同一のキャッシュブロックに含まれる場合には、キャッシュ同期処理を終了する。【００７９】
ＡＤＤＲの更新工程（ステップＳ３５）において、データキャッシュのキャッシュブロックの大きさを変数ＡＤＤＲに加算し、ステップＳ３２へ戻る。【００８０】
本発明の実施例の動作を具体的な例にもとづいて説明する。４個のベクトルと１個のスカラ値の加算を実行するＣ言語の関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）を図８に示す。本発明の実施例のタスク実行にもとづいたキャッシュ同期制御方法を使うために、図８を変形したものが図９である。図９においては、４個のベクトルを２個ずつにわけてそれぞれの和を求めてから、求めた和の合計を計算する。関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）は２個のベクトルと１個のスカラ値の和を計算する関数である。関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）は関数ｅｘｅｃ＿ｔａｓｋ（）を経由して関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）から呼び出される。関数ｅｘｅｃ＿ｔａｓｋ（）は、タスクを実行する関数である。【００８１】
関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）は、タスクの入力データや出力データを表すためにｏｐｅｒａｎｄという構造体を使用する。この構造体は、開始アドレスとデータサイズを表す二つのメンバ変数をもつ。構造体ｏｐｅｒａｎｄを使うことによって、入力データや出力データの開始アドレスとデータサイズをタスクへ伝えることができる。タスクは、構造体ｏｐｅｒａｎｄの配列から入力データや出力データを取り出し、何らかの計算を実行する。【００８２】
図９の関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）について説明する。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）は以下の４つの処理に分類される。それぞれの処理の内容を以下に述べる。【００８３】
まず、一時データ格納用メモリを確保する。ベクトルｗ［］とｘ［］の和を格納するベクトルｓｕｍ＿ｗｘ［］と、ベクトルｙ［］とｚ［］の和を格納するベクトルｓｕｍ＿ｙｚ［］とのためのメモリ領域を関数ｍａｌｌｏｃ（）を使って確保する。【００８４】
次に、タスクのパラメータを作成する。４個のベクトルｗ［］、ｘ［］、ｙ［］、ｚ［］とスカラ値ｋの加算を以下の３つのタスクで実行するにあたって、３つのタスクへ与えるパラメータを作成する。ｏｐｅｒａｎｄという構造体の配列にパラメータを格納する。配列の最後には終端を表す０を格納する。【００８５】
タスク＃１は、ベクトルｗ［］とｘ［］とスカラ値ｖａｌｕｅの和をｓｕｍ＿ｗｘ［］に代入するタスクとする（ここでｖａｌｕｅ＝＝ｋとする）。【００８６】
タスク＃２は、ベクトルｙ［］とｚ［］とスカラ値ｖａｌｕｅの和をｓｕｍ＿ｙｚ［］に代入するタスクとする（ここでｖａｌｕｅ＝＝０とする）。【００８７】
タスク＃３は、ベクトルｓｕｍ＿ｗｘ［］とｓｕｍ＿ｙｚ［］とスカラ値ｖａｌｕｅの和をｏｕｔ［］に代入するタスクとする（ここでｖａｌｕｅ＝＝０とする）。【００８８】
次に、タスクの生成と実行を行う。上記の三つのタスクを順番に呼び出す。上記の三つのタスクの動作はいずれも同じであって入力データと出力データが異なる。三つのタスクに共通する動作は関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）である。タスクの生成には関数ｅｘｅｃ＿ｔａｓｋ（）を使う。この関数ｅｘｅｃ＿ｔａｓｋ（）は、ステップＳ１０からステップＳ１４までを実行する。そして、いずれかのスレーブプロセッサが、ステップＳ２０からステップＳ２３にもとづいて生成されたタスクを実行する。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）は３つのタスクを生成することから、関数ｅｘｅｃ＿ｔａｓｋ（）が３回呼び出される。【００８９】
次に、一時データ格納用メモリを解放する。ベクトルｓｕｍ＿ｗｘ［］とｓｕｍ＿ｙｚ［］とスカラ値ｖａｌｕｅのためのメモリ領域を解放する。【００９０】
関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）におけるタスク生成とタスク実行について詳しく説明する。【００９１】
本発明の実施例におけるマルチプロセッサのメモリ配置を図１５に示す。マスタプロセッサ１０とスレーブプロセッサ２１、２２、２３、２４のスタック領域をそれぞれ６４Ｋバイトずつ記憶装置３０上に配置する。そして、関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の引数として与えられる配列ｏｕｔ［］、ｗ［］、ｘ［］、ｙ［］、ｚ［］、の大きさをそれぞれ４Ｋバイトとして、アドレス０ｘ１００００から順番に配置する。さらに、関数ｍａｌｌｏｃ（）が使用するヒープ領域をアドレス０ｘ９０００００以降に配置する。つまり、関数ｍａｌｌｏｃ（）によって割り当てられる配列ｓｕｍ＿ｗｘ［］とｓｕｍ＿ｙｚ［］とスカラ値ｖａｌｕｅはアドレス０ｘ９０００００以降に配置されることになる。このようなメモリ配置のもとで、関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）を実行するものと仮定する。さらに、関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の実行開示時点においては、タスクは全く実行されていないと仮定する。【００９２】
以上のような仮定のもとで、関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）における第一回目の関数ｅｘｅｃ＿ｔａｓｋ（）について説明する。関数ｅｘｅｃ＿ｔａｓｋ（）は指定されたタスクを生成する関数であり、その処理内容はステップＳ１０からステップＳ１４までである。関数ｅｘｅｃ＿ｔａｓｋ（）は４つの引数をもつ。すなわち、４つの引数は、タスクの処理内容を表す関数ポインタ、出力データに関する構造体ｏｐｅｒａｎｄのポインタ、入力データに関する構造体ｏｐｅｒａｎｄのポインタ、キャッシュ同期処理が必要な入力データに関する構造体ｏｐｅｒａｎｄのポインタ、である。【００９３】
関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第１回目のｅｘｅｃ＿ｔａｓｋ（）においては、タスクの動作は関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）である。また、出力データの情報は配列ｏｐ＿ｏｕｔ０［］に、入力データの情報は配列ｏｐ＿ｉｎ０［］に、キャッシュ同期処理が必要な入力データの情報は配列ｏｐ＿ｓｙｎｃ０［］に、それぞれ格納されている。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第１回目のｅｘｅｃ＿ｔａｓｋ（）によって生成されるタスクをタスク＃１と呼ぶことにする。【００９４】
まず、関数ｅｘｅｃ＿ｔａｓｋ（）はステップＳ１０を実行する。ステップＳ１０は、入力データに関してタスク＃１が実行可能であるかを判定する処理である。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第１回目のｅｘｅｃ＿ｔａｓｋ（）における入力データは配列ｗ［］とｘ［］とスカラ値ｖａｌｕｅである。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の実行開示時点では全くタスクは実行されていないと仮定しているので、この時点では配列ｗ［］やｘ［］やスカラ値ｖａｌｕｅを出力データとする別のタスクは実行されていない。したがって、関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第１回目のｅｘｅｃ＿ｔａｓｋ（）では、タスク＃１は入力データに関して実行可能である。【００９５】
次に、関数ｅｘｅｃ＿ｔａｓｋ（）はステップＳ１１を実行する。ステップＳ１１は、出力データに関してタスク＃１が実行可能か否かを判定する処理である。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第１回目のｅｘｅｃ＿ｔａｓｋ（）における出力データは配列ｓｕｍ＿ｗｘ［］である。ステップＳ１１において、関数ｅｘｅｃ＿ｔａｓｋ（）はこの配列が現在実行中の他のタスクの出力データと重なっているかを調べる。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の実行開示時点では全くタスクは実行されていないと仮定していることから、配列ｓｕｍ＿ｗｘ［］は現在実行中の他のタスクの出力データと重なっていないことになる。したがって、関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第一回目のｅｘｅｃ＿ｔａｓｋ（）においては、タスク＃１は出力データに関して実行可能である。【００９６】
次に、関数ｅｘｅｃ＿ｔａｓｋ（）はステップＳ１２を実行する。ステップＳ１２は、入力データに関するキャッシュ同期処理を行う処理である。第１回目のｅｘｅｃ＿ｔａｓｋ（）の直前でスカラ値ｖａｌｕｅに変数ｋが代入されている。スカラ値ｖａｌｕｅは、第１回目のｅｘｅｃ＿ｔａｓｋ（）の入力データの一つである。したがって、このスカラ値ｖａｌｕｅの新しい値を記憶装置３０へ格納するためにスカラ値ｖａｌｕｅに対するキャッシュ同期処理が必要となる。このような理由によってキャッシュ同期処理が必要な入力データの情報は配列ｏｐ＿ｓｙｎｃ０［］に格納されていて、それはスカラ値ｖａｌｕｅのアドレスとデータサイズである。そこで、スカラ値ｖａｌｕｅについてステップＳ３０からステップＳ３５までの処理を実行する。【００９７】
次に、スカラ値ｖａｌｕｅに関するキャッシュ同期処理について説明する。まず、スカラ値ｖａｌｕｅの開始アドレス０ｘ９０２０００を変数ＡＤＤＲに代入する（ステップＳ３０）。次に、スカラ値ｖａｌｕｅの終了アドレス（０ｘ９０２０００＋４−１）＝０ｘ９０２００３を変数ＡＤＤＲ＿ＥＮＤに代入する（ステップＳ３１）。次に、マスタプロセッサ１０のデータ書き戻し部は、変数ＡＤＤＲが示すアドレス０ｘ９０２０００のタグと同じタグをもつキャッシュブロックをマスタプロセッサ１０のデータキャッシュから記憶装置３０に書き戻す（ステップＳ３２）。マスタプロセッサ１０のデータキャッシュにそのようなタグをもつキャッシュブロックがある場合には、マスタプロセッサ１０のデータ書き戻し部は、そのキャッシュブロックのデータを記憶装置３０に書き戻し、そのキャッシュブロックのｄｉｒｔｙフラグを０にし、さらに他の全てのプロセッサへｃａｃｈｅ−ｓｙｎｃ信号を送信する。次に、スカラ値ｖａｌｕｅの古いコピーを他のプロセッサから削除するために、変数ＡＤＤＲが示すアドレス０ｘ９０２０００のタグと同じタグをもつキャッシュブロックをマスタプロセッサ１０以外のデータキャッシュから削除する（ステップＳ３３）。マスタプロセッサ１０から送信されたｃａｃｈｅ−ｓｙｎｃ信号を受信したプロセッサのデータキャッシュに、そのようなキャッシュブロックが存在し、かつそのキャッシュブロックのｖａｌｉｄフラグが１であるならば、マスタプロセッサ１０以外の全てのプロセッサのデータ削除部は自身のデータキャッシュに存在するそのキャッシュブロックのｖａｌｉｄフラグを０にする。次に、変数ＡＤＤＲと変数ＡＤＤＲ＿ＥＮＤとが示すアドレスが同じキャッシュブロックに存在する場合には、キャッシュ同期処理を終了する（ステップＳ３４）。この時点においては、ＡＤＤＲ＝０ｘ９０２０００であり、ＡＤＤＲ＿ＥＮＤ＝０ｘ９０２００３であり、キャッシュブロックのサイズは３２バイトであることから、変数ＡＤＤＲと変数ＡＤＤＲ＿ＥＮＤとが示すアドレスは同じキャッシュブロックに存在する。したがって、キャッシュ同期処理を終了する（ステップＳ３４）。【００９８】
次に、関数ｅｘｅｃ＿ｔａｓｋ（）は、ステップＳ１３を実行する。ステップＳ１３はいずれかのスレーブプロセッサにタスクを割り当てる処理である。どのスレーブプロセッサを選ぶかについてはさまざまな方法が考えられる。どのような基準でスレーブプロセッサを選択しても良いが、できるだけタスクを早期に実行完了できるようなスレーブプロセッサを選択することができる方法が望ましい。本実施例においては、ラウンドロビンアルゴリズムを使用する。ラウンドロビンアルゴリズムは、２１、２２、２３、２４、２１、２２、．．．、というように、番号順にスレーブプロセッサにタスクを割り当てるアルゴリズムである。選択されたスレーブプロセッサがタスクを実行している場合には、その次の番号のスレーブプロセッサにタスクを割り当てる。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第１回目のｅｘｅｃ＿ｔａｓｋ（）においては、スレーブプロセッサ２１にタスク＃１を割り当てることにする。マスタプロセッサ１０はどのタスクをどのスレーブプロセッサへ割り当てたかという情報やどのスレーブプロセッサが空いているかという情報を記憶する。これらの情報は新たなタスクのためのステップＳ１０やステップＳ１１において参照される。【００９９】
次に、関数ｅｘｅｃ＿ｔａｓｋ（）はステップＳ１４を実行する。ステップＳ１４はタスクの実行に必要なパラメータをスレーブプロセッサに受け渡す処理である。タスクの実行に必要なパラメータは、（１）タスクの処理内容を表す関数の先頭アドレス、（２）タスクの出力データ、（３）タスクへの入力データ、である。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第１回目のｅｘｅｃ＿ｔａｓｋ（）においては、（１）は関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）の先頭アドレスであり、（２）は配列ｏｐ＿ｏｕｔ０［］の各要素であり、（３）は配列ｏｐ＿ｉｎ０［］の各要素である。【０１００】
パラメータの受渡しには記憶装置３０を使用する。スレーブプロセッサごとにタスクのパラメータを格納するメモリ領域を決めておく。例えば、アドレス０ｘ８８００００から０ｘ８８００ＦＦのメモリ領域はスレーブプロセッサ２１のためのタスクのパラメータを格納する領域である。関数ｅｘｅｃ＿ｔａｓｋ（）はスレーブプロセッサ２１へ渡すべきパラメータを記憶装置３０へ書き込み、スレーブプロセッサ２１はそのパラメータを記憶装置３０から読み込む。パラメータを渡す際に、関数ｅｘｅｃ＿ｔａｓｋ（）はこれらのパラメータをキャッシュ経由ではなく直接記憶装置３０へ格納する。キャッシュを経由しない理由は、パラメータを即座に記憶装置３０へ書き込むためである。【０１０１】
ステップＳ１４の最後に、関数ｅｘｅｃ＿ｔａｓｋ（）は選択したスレーブプロセッサ２１にタスク＃１の実行開始を指示する。この指示は、割り込み信号としてスレーブプロセッサ２１に伝達される。この後、マスタプロセッサ１０は、第２回目のｅｘｅｃ＿ｔａｓｋ（）を実行する。【０１０２】
次に、スレーブプロセッサにおけるタスクの実行について詳しく説明する。スレーブプロセッサにおいてタスクはステップＳ２０からステップＳ２３の手順で実行される。ここでは、関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第１回目のｅｘｅｃ＿ｔａｓｋ（）によって生成されたタスク＃１を例として説明する。既に説明したように、タスク＃１はスレーブプロセッサ２１に割り当てられている。【０１０３】
まず、スレーブプロセッサ２１はステップＳ２０を実行する。ステップＳ２０は、タスクのパラメータを受けとる処理である。スレーブプロセッサ２１は自身のデータキャッシュ経由ではなく直接記憶装置３０からパラメータを読み込む（ステップＳ２０）。データキャッシュを経由しない理由は、古いパラメータのコピーをデータキャッシュに残さないためである。【０１０４】
次に、スレーブプロセッサ２１はタスクの実行（ステップＳ２１）を行う。スレーブプロセッサ２１は記憶装置３０から読み出したパラメータから配列ｏｐ＿ｏｕｔ０［］と配列ｏｐ＿ｉｎ０［］のそれぞれの先頭アドレスを取り出し、それらを引数として関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）を呼び出す。そして、スレーブプロセッサ２１は、関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）を実行する。【０１０５】
次に、スレーブプロセッサ２１はステップＳ２２を実行する。ステップＳ２２はタスクの出力データに関するキャッシュ同期処理である。スレーブプロセッサ２１は、配列ｏｐ＿ｏｕｔ０［］に格納された出力データの開始アドレスとサイズにもとづいて、キャッシュ同期処理を行う。スレーブプロセッサ２１のデータキャッシュから記憶装置３０に出力データを書き戻し、他のプロセッサのデータキャッシュから出力データの古いコピーを削除する。この書き戻しと削除はステップＳ３０からステップＳ３５までの処理である。配列ｏｐ＿ｏｕｔ０［］には１個の出力データｓｕｍ＿ｗｘ［］の開始アドレスとサイズが格納されている。そこで、配列ｓｕｍ＿ｗｘ［］について、ステップＳ３０からステップＳ３５までの処理を実行する。【０１０６】
次に、配列ｓｕｍ＿ｗｘ［］に関するキャッシュ同期処理について説明する。まず、配列ｓｕｍ＿ｗｘ［］の開始アドレス０ｘ９０００００を変数ＡＤＤＲに代入する（ステップＳ３０）。次に、配列ｓｕｍ＿ｗｘ［］の終了アドレス（０ｘ９０００００＋０ｘ１０００−１）＝０ｘ９００ＦＦＦを変数ＡＤＤＲ＿ＥＮＤに代入する（ステップＳ３１）。次に、変数ＡＤＤＲが示すアドレス０ｘ９０００００と同じタグをもつキャッシュブロックをスレーブプロセッサ２１のデータキャッシュから記憶装置３０へ書き戻す（ステップＳ３２）。スレーブプロセッサ２１のデータキャッシュにそのようなタグをもつキャッシュブロックがある場合には、スレーブプロセッサ２１のデータ書き戻し部は、そのキャッシュブロックのデータを記憶装置３０に書き戻し、そのキャッシュブロックのｄｉｒｔｙフラグを０とし、さらに他の全てのプロセッサにｃａｃｈｅ−ｓｙｎｃ信号を送信する。次に、配列ｓｕｍ＿ｗｘ［］の古いコピーを他のプロセッサから削除するために、変数ＡＤＤＲが示すアドレス０ｘ９０００００のタグと同じタグをもつキャッシュブロックをスレーブプロセッサ２１以外のデータキャッシュから削除する（ステップＳ３３）。スレーブプロセッサ２１から送信されたｃａｃｈｅ−ｓｙｎｃ信号を受信したプロセッサのデータキャッシュにそのようなキャッシュブロックが存在し、かつそのキャッシュブロックのｖａｌｉｄフラグが１である場合には、スレーブプロセッサ２１以外の全てのプロセッサのデータ削除部は、自身のデータキャッシュに存在するそのキャッシュブロックのｖａｌｉｄフラグを０にする。次に、変数ＡＤＤＲと変数ＡＤＤＲ＿ＥＮＤとが示すアドレスが同じキャッシュブロックに存在する場合には、キャッシュ同期処理を終了する（ステップＳ３４）。この時点においては、ＡＤＤＲ＝０ｘ９０００００、ＡＤＤＲ＿ＥＮＤ＝０ｘ９００ＦＦＦであり、キャッシュブロックのサイズは３２バイトであることから、変数ＡＤＤＲと変数ＡＤＤＲ＿ＥＮＤとが示すアドレスは異なるキャッシュブロックに存在する。したがって、キャッシュ同期処理を継続する。次に、変数ＡＤＤＲにキャッシュブロックのサイズ３２バイトを加算し（ステップＳ３５）、ステップＳ３２に戻る。そして、終了判定（ステップＳ３４）が下されるまでステップＳ３２からステップＳ３５までを繰り返す。終了判定が下される時の変数ＡＤＤＲは０ｘ９００ＦＥ０である。変数ＡＤＤＲがこの値になった場合には、変数ＡＤＤＲと変数ＡＤＤＲ＿ＥＮＤとが示すアドレスは同じキャッシュブロックに存在することから、キャッシュ同期処理は終了する（ステップＳ３４）。【０１０７】
次に、スレーブプロセッサ２１は、ステップＳ２３を実行する。ステップＳ２３は、タスクの完了をマスタプロセッサ１０へ通知する処理である。スレーブプロセッサ２１は、割り込み信号を使ってマスタプロセッサ１０へタスクの完了を通知する。【０１０８】
次に、関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第２回目のｅｘｅｃ＿ｔａｓｋ（）について説明する。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第２回目のｅｘｅｃ＿ｔａｓｋ（）においては、タスクの動作が関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）であるまた、出力データの情報は配列ｏｐ＿ｏｕｔ１［］に、入力データの情報は配列ｏｐ＿ｉｎ１［］に、キャッシュ同期処理が必要な入力データの情報は配列ｏｐ＿ｓｙｎｃ０［］に、それぞれ格納されている。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第２回目のｅｘｅｃ＿ｔａｓｋ（）によって生成されるタスクをタスク＃２と呼ぶ。【０１０９】
まず、ステップＳ１０において、入力データに関してタスク＃２が実行可能か否かを判定する。二回目のｅｘｅｃ＿ｔａｓｋ（）における入力データは、配列ｙ［］とｚ［］とスカラ値ｖａｌｕｅである。この時点においては、配列ｙ［］やｚ［］やスカラ値ｖａｌｕｅを出力データとする別のタスクは存在しないことから、二回目のｅｘｅｃ＿ｔａｓｋ（）においては、タスク＃２は入力データに関して実行可能である。【０１１０】
次に、出力データに関してタスク＃２が実行可能か否かを判定する（ステップＳ１１）。２回目のｅｘｅｃ＿ｔａｓｋ（）における出力データは配列ｓｕｍ＿ｙｚ［］である。この時点において、実行中のタスクは一回目のｅｘｅｃ＿ｔａｓｋ（）で生成されたタスク＃１であって、その出力データは配列ｓｕｍ＿ｗｘ［］である。図１５によると、配列ｓｕｍ＿ｗｘ［］とｓｕｍ＿ｙｚ［］は、記憶装置３０上において重なっていない。したがって、２回目のｅｘｅｃ＿ｔａｓｋ（）においては、タスク＃２は出力データに関して実行可能である。【０１１１】
次に、入力データに関するキャッシュ同期処理を行う（ステップＳ１２）。２回目のｅｘｅｃ＿ｔａｓｋ（）の直前でスカラ値ｖａｌｕｅへ０が代入されている。スカラ値ｖａｌｕｅは、２回目のｅｘｅｃ＿ｔａｓｋ（）の入力データの一つである。したがって、このスカラ値ｖａｌｕｅの新しい値を記憶装置３０に格納するためにスカラ値ｖａｌｕｅに対するキャッシュ同期処理が必要となる。このような理由によって、キャッシュ同期処理が必要な入力データの情報は、配列ｏｐ＿ｓｙｎｃ０［］に格納されている。その情報は、スカラ値ｖａｌｕｅのアドレスとデータサイズである。そこで、一回目のｅｘｅｃ＿ｔａｓｋ（）と同じように、スカラ値ｖａｌｕｅについてステップＳ３０からステップＳ３５までの処理を実行する。【０１１２】
次に、タスク＃２をいずれかのスレーブプロセッサに割り当てる（ステップＳ１３）。１回目のｅｘｅｃ＿ｔａｓｋ（）においてはスレーブプロセッサ２１を選択したことから、ラウンドロビンアルゴリズムにもとづいて、次のスレーブプロセッサ２２にタスク＃２を割り当てることにする。【０１１３】
次に、タスク＃２の実行に必要なパラメータをスレーブプロセッサ２２に渡す（ステップＳ１４）。必要なパラメータは、（１）関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）の先頭アドレス、（２）配列ｏｐ＿ｏｕｔ１［］の各要素、（３）配列ｏｐ＿ｉｎ１［］の各要素、である。パラメータを渡す際に、これらのパラメータをキャッシュ経由ではなく、記憶装置３０に直接格納する。アドレス０ｘ８８０１００から０ｘ８８０１ＦＦまでの領域がスレーブプロセッサ２２のためのパラメータの格納領域である。【０１１４】
ステップＳ１４の最後に、関数ｅｘｅｃ＿ｔａｓｋ（）は、選択したスレーブプロセッサ２２にタスク＃２の実行開始を指示する。この指示は割り込み信号としてスレーブプロセッサ２２に伝達される。この後、マスタプロセッサ１０は第３回目のｅｘｅｃ＿ｔａｓｋ（）を実行する。【０１１５】
１回目のｅｘｅｃ＿ｔａｓｋ（）によって生成されたタスク＃１をスレーブプロセッサ２１が実行したのと同様にして、ステップＳ２０からステップＳ２３にもとづいて、スレーブプロセッサ２２は２回目のｅｘｅｃ＿ｔａｓｋ（）によって生成されたタスク＃２を実行する。スレーブプロセッサ２２は、データキャッシュ経由ではなく直接記憶装置３０からタスク＃２のパラメータを読み出し、配列ｏｐ＿ｏｕｔ１［］と配列ｏｐ＿ｉｎ１［］のそれぞれの先頭アドレスを取り出し、それらを引数として関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）を実行する。そして、タスク＃２の実行後に、スレーブプロセッサ２２は、タスク＃２の出力データである配列ｓｕｍ＿ｙｚ［］に関するキャッシュ同期処理を行ってから、マスタプロセッサ１０にタスク＃２の完了を通知する。【０１１６】
次に、関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第３回目のｅｘｅｃ＿ｔａｓｋ（）について説明する。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第３回目のｅｘｅｃ＿ｔａｓｋ（）においては、タスクの動作は関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）である。また、出力データの情報は配列ｏｐ＿ｏｕｔ２［］に、入力データの情報は配列ｏｐ＿ｉｎ２［］に、それぞれ格納されている。第三回目のｅｘｅｃ＿ｔａｓｋ（）においては、キャッシュ同期処理が必要な入力データはない。関数ａｄｄ＿ｖｅｃｔｏｒｓ＿４（）の第三回目のｅｘｅｃ＿ｔａｓｋ（）によって生成されるタスクをタスク＃３と呼ぶ。【０１１７】
まず、入力データに関してタスク＃３が実行可能か否かを判定する（ステップＳ１０）。３回目のｅｘｅｃ＿ｔａｓｋ（）における入力データは、配列ｓｕｍ＿ｗｘ［］とｓｕｍ＿ｙｚ［］とスカラ値ｖａｌｕｅである。この時点においては、配列ｓｕｍ＿ｗｘ［］を出力データとするタスク＃１と配列ｓｕｍ＿ｙｚ［］を出力データとするタスク＃２が存在している。配列ｓｕｍ＿ｗｘ［］を出力データとするタスク＃１とは第１回目のｅｘｅｃ＿ｔａｓｋ（）によって起動されたタスクであり、配列ｓｕｍ＿ｙｚ［］を出力データとするタスク＃２とは第２回目のｅｘｅｃ＿ｔａｓｋ（）によって起動されたタスクである。これらのタスクが完了するまで、３回目のｅｘｅｃ＿ｔａｓｋ（）の入力データは利用可能とならない。したがって、３回目のｅｘｅｃ＿ｔａｓｋ（）は、タスク＃１とタスク＃２とが完了するまでステップＳ１０を繰り返す。やがてタスク＃１とタスク＃２の実行完了が割り込み信号によってマスタプロセッサ１０に通知される。両方のタスクが完了した後に、三回目のｅｘｅｃ＿ｔａｓｋ（）は、タスク＃３が入力データに関して実行可能であると判定する。【０１１８】
次に、出力データに関してタスク＃３が実行可能か否かを判定する（ステップＳ１１）。３回目のｅｘｅｃ＿ｔａｓｋ（）における出力データは配列ｏｕｔ［］である。この時点において実行中のタスクは一つもない。なぜなら、ステップＳ１０において、タスク＃１とタスク＃２とが完了してから、ステップＳ１１に遷移しているからである。したがって、配列ｏｕｔ［］は現在実行中の他のタスクの出力データと重なっていないことから、３回目のｅｘｅｃ＿ｔａｓｋ（）においては、タスク＃３は出力データに関して実行可能であると判定される。【０１１９】
次に、ステップＳ１２においては、入力データに関するキャッシュ同期処理が行われるはずである。しかし、３回目のｅｘｅｃ＿ｔａｓｋ（）においては、キャッシュ同期処理が必要な入力データは与えられていない。したがって、キャッシュ同期処理を行うことなく、次のステップＳ１３に遷移する。【０１２０】
次に、タスク＃３をいずれかのスレーブプロセッサに割り当てる（ステップＳ１３）。２回目のｅｘｅｃ＿ｔａｓｋ（）はスレーブプロセッサ２２を選択したので、ラウンドロビンアルゴリズムにもとづいて、次のスレーブプロセッサ２３にタスク＃３を割り当てることとする。【０１２１】
次に、タスク＃３の実行に必要なパラメータをスレーブプロセッサ２３に渡す（ステップＳ１４）。必要なパラメータは、（１）関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）の先頭アドレス、（２）配列ｏｐ＿ｏｕｔ２［］の各要素、（３）配列ｏｐ＿ｉｎ２［］の各要素、である。パラメータを渡す際に、これらのパラメータをキャッシュ経由ではなく、記憶装置３０に直接格納する。図１５を参照すると、アドレス０ｘ８８０２００から０ｘ８８０２ＦＦまでの領域は、スレーブプロセッサ２３のためのパラメータの格納領域である。【０１２２】
ステップＳ１４の最後において、関数ｅｘｅｃ＿ｔａｓｋ（）は、選択したスレーブプロセッサ２３にタスク＃３の実行開始を指示する。この指示は割り込み信号としてスレーブプロセッサ２３に伝達される。この後、マスタプロセッサ１０は、残りのプログラムを実行する。【０１２３】
１回目のｅｘｅｃ＿ｔａｓｋ（）によって生成されたタスク＃１をスレーブプロセッサ２１が実行したのと同様にして、ステップＳ２０からステップＳ２３にもとづいて、スレーブプロセッサ２３は、３回目のｅｘｅｃ＿ｔａｓｋ（）によって生成されたタスク＃３を実行する。スレーブプロセッサ２３は、データキャッシュ経由ではなく直接記憶装置３０からタスク＃３のパラメータを読み出し、配列ｏｐ＿ｏｕｔ２［］と配列ｏｐ＿ｉｎ２［］のそれぞれの先頭アドレスを取り出し、それらを引数として関数ａｄｄ＿ｖｅｃ＿２＿ｓｃａｌａｒ（）を実行する。そして、タスク＃３の実行後に、スレーブプロセッサ２３は、タスク＃３の出力データである配列ｏｕｔ［］に関するキャッシュ同期処理を行った後、マスタプロセッサ１０にタスクの完了を通知する（ステップＳ２３）。【０１２４】
以上の記載は実施例に基づいて行ったが、本発明は、上記実施例に限定されるものではない。
【産業上の利用可能性】
【０１２５】
本発明は、キャッシュをもつ複数のプロセッサから成るマルチプロセッサに適用することができる。さらに、そのようなマルチプロセッサ向けのコードを生成するコンパイラにも応用可能である。マルチプロセッサと呼ばれるものには、組み込み用途からスーパーコンピュータまで幅広く存在する。本発明は、その規模に依らず適用することができる。
本発明の全開示（請求の範囲を含む）の枠内において、さらにその基本的技術思想に基づいて、実施形態ないし実施例の変更・調整が可能である。また、本発明の請求の範囲の枠内において種々の開示要素の多様な組み合わせないし選択が可能である。
【図１】
2009057762.tif 000003
【図２】
2009057762.tif 000004
【図３】
2009057762.tif 000005
【図４】
2009057762.tif 000006
【図５】
2009057762.tif 000007
【図６】
2009057762.tif 000008
【図７】
2009057762.tif 000009
【図８】
2009057762.tif 000010
【図９】
2009057762.tif 000011
【図１０】
2009057762.tif 000012
【図１１】
2009057762.tif 000013
【図１２】
2009057762.tif 000014
【図１３】
2009057762.tif 000015
【図１４】
2009057762.tif 000016
【図１５】
2009057762.tif 000017
【国際調査報告】
2009057762.tif 000018
2009057762.tif 000019