"データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する際に、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を行うとともに、第1スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を行い、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで行うとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで行う、ことを特徴とする、タスク並列処理方法。前記同期待ち処理及び前記同期通知処理は、あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからのデータ依存関係がある場合、当該複数のデータ供給側タスクのなかで最も後で実行されるデータ供給側タスクのみに関して行われる、ことを特徴とする、請求項1に記載のタスク並列処理方法。前記同期待ち処理及び前記同期通知処理は、あるデータ供給側タスクから、同じスレッドに属する複数のデータ使用側タスクへのデータ依存関係がある場合、当該複数のデータ使用側タスクのなかで最も先に実行されるデータ使用側タスクのみに関して行われる、ことを特徴とする、請求項1に記載のタスク並列処理方法。前記同期待ち処理及び前記同期通知処理は、あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからのデータ依存関係がある場合、当該複数のデータ供給側タスクのなかで最も後で実行されるデータ供給側タスクのみに関して行われるとともに、あるデータ供給側タスクから、同じスレッドに属する複数のデータ使用側タスクへのデータ依存関係がある場合、当該複数のデータ使用側タスクのなかで最も先に実行されるデータ使用側タスクのみに関して行われる、ことを特徴とする、請求項1に記載のタスク並列処理方法。前記同期待ち処理及び前記同期通知処理は、前記グループ内で最初に実行されるデータ使用側タスクのみに関して、ハンドシェイク付きで行われる、ことを特徴とする、請求項1乃至4のいずれか1項に記載のタスク並列処理方法。データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する実行部を備え、前記実行部は、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を行うとともに、第1スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を行い、前記実行部は、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで行うとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで行う、ことを特徴とする、タスク並列処理装置。データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する際に、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に実行される、前記データ供給タスクからの同期待ち処理と、第1スレッドにおいて、前記データ供給タスクが実行された後に実行される、前記データ使用タスクへの同期通知処理と、をコンピュータに実行させ、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで実行させるとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで実行させる、ことを特徴とする、タスク並列処理プログラム。複数のスレッドを含むプログラムを生成するプログラム生成方法であって、データの計算を表すタスクをひとつ以上含むグループをスレッドに割当て、前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定し、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第1スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定し、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定する、ことを特徴とする、プログラム生成方法。複数のスレッドを含むプログラムを生成するプログラム生成装置であって、データの計算を表すタスクをひとつ以上含むグループをスレッドに割当てるグループ割当て部と、前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定する実行順序決定部と、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第1スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定する同期処理設定部と、を備え、前記同期処理設定部は、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定する、ことを特徴とする、プログラム生成装置。複数のスレッドを含むプログラムを生成するプログラム生成プログラムであって、データの計算を表すタスクをひとつ以上含むグループをスレッドに割当てる割当て処理と、前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定する実行順序決定処理と、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第1スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定する同期処理設定処理と、をコンピュータに実行させ、前記同期処理設定処理では、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定する、ことを特徴とする、プログラム生成プログラム。複数のタスクのデータ依存関係にもとづいてタスクどうしが同期通信することによりデータを処理するパイプライン的な並列データ処理方法において、タスクそれぞれを同時並行的に動作する小規模プログラムにすると、タスク増加にともなって小規模プログラムの管理コストが増え、タスクのデータ依存関係を表す同期通信の回数も増えてしまう。それに対して、複数のタスクをいくつかのグループに分けることによって、小規模プログラムの数を低減することができるが、異なるグループに属するタスク間のデータ依存関係を表す同期通信はそのままである。したがって、特願2010-229784のパイプライン的な並列データ処理方法と単純なタスクのグループ化を組み合わせただけでは、同期通信の数を削減しにくい、という課題がある。本発明の目的は、上述した課題を解決するために、パイプライン的な並列データ処理に関して、同期通信の数を削減可能な、タスク並列処理方法、タスク並列処理装置及びタスク並列処理プログラム、並びに、プログラム生成方法、プログラム生成装置及びプログラム生成プログラムを提供することにある。本発明の第1の態様にかかるタスク並列処理方法は、データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する際に、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を行うとともに、第1スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を行い、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで行うとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで行う、ことを特徴とする。本発明の第2の態様にかかるタスク並列処理装置は、データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する実行部を備え、前記実行部は、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を行うとともに、第1スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を行い、前記実行部は、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで行うとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで行う、ことを特徴とする。本発明の第3の態様にかかるタスク並列処理プログラムは、データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する際に、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に実行される、前記データ供給タスクからの同期待ち処理と、第1スレッドにおいて、前記データ供給タスクが実行された後に実行される、前記データ使用タスクへの同期通知処理と、をコンピュータに実行させ、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで実行させるとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで実行させる、ことを特徴とする。本発明の第4の態様にかかるプログラム生成方法は、複数のスレッドを含むプログラムを生成するプログラム生成方法であって、データの計算を表すタスクをひとつ以上含むグループをスレッドに割当て、前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定し、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第1スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定し、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定する、ことを特徴とする。本発明の第5の態様にかかるプログラム生成装置は、複数のスレッドを含むプログラムを生成するプログラム生成装置であって、データの計算を表すタスクをひとつ以上含むグループをスレッドに割当てるグループ割当て部と、前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定する実行順序決定部と、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第1スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定する同期処理設定部と、を備え、前記同期処理設定部は、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定する、ことを特徴とする。本発明の第6の態様にかかるプログラム生成プログラムは、複数のスレッドを含むプログラムを生成するプログラム生成プログラムであって、データの計算を表すタスクをひとつ以上含むグループをスレッドに割当てる割当て処理と、前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定する実行順序決定処理と、二つのスレッドの一方である第1スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第2スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第1スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定する同期処理設定処理と、をコンピュータに実行させ、前記同期処理設定処理では、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定する、ことを特徴とする。上述した本発明の各態様によれば、パイプライン的な並列データ処理に関して、同期通信の数を削減可能なタスク並列処理方法、タスク並列処理装置及びタスク並列処理プログラム、並びに、プログラム生成方法、プログラム生成装置及びプログラム生成プログラムを提供することができる。本発明の実施の形態について図面を参照して説明する。本発明の模範的な実施形態における並列処理の概念を説明する。本実施形態は、いくつかのグループに分けられた複数のタスクを並列処理の対象とし、ひとつのグループに属するタスクをひとつのプログラム実行単位であるスレッドに割当て、グループ数分のスレッドを並列実行する。複数のタスクをグループに分ける方法については、本発明の対象範囲ではないので、記載しない。以降では、なんからの方法を用いて複数のタスクをいくつかのグループに分けたとして、説明する。本実施形態は、タスクが使用するデータにもとづいてタスクの依存関係を決定する。例えば、タスクT1の計算結果R1をタスクT2が使用するなら、タスクT1からタスクT2に対してデータ依存関係が存在する。この場合、データR1に関して、タスクT1はデータ供給側タスクであり、タスクT2はデータ使用側タスクである。タスクT1からタスクT2に対してデータ依存関係が存在するなら、タスクT2はタスクT1の後で実行されなければならない。このようなデータ依存関係にもとづいて、タスクの実行順序を決定することができる。本明細書においては、ハンドシェイク付き同期通知処理とハンドシェイク付き同期待ち処理とを合わせたものを、ハンドシェイク付き同期処理と呼ぶことにする。そして、ハンドシェイク無し同期通知処理は、ハンドシェイクを行わずにフラグをセットする処理を意味し、ハンドシェイク付き同期通知処理よりも負荷は非常に軽い。同様に、ハンドシェイク無し同期待ち処理は、フラグがセットされているか否か確認しつつフラグがセットされるまで待つという処理を意味し、ハンドシェイク付き同期待ち処理よりも負荷は若干軽い。ハンドシェイク無し同期通知処理とハンドシェイク無し同期待ち処理とを合わせたものを、本明細書では、ハンドシェイク無し同期処理と呼ぶことにする。なお、ハンドシェイク付き同期処理と、ハンドシェイク無し同期処理の詳細については、後述する。<タスクのデータ依存関係グラフにもとづいたタスク並列処理のためのソフトウェア構成抽出>図1は、本発明の模範的な実施形態にもとづいて、グループに分けられた複数のタスクからなるデータ依存関係グラフから、タスク並列処理ソフトウェアの構成を得るためのフローチャートである。まず、ステップS1において、本実施形態は、タスクをグループごとにスレッドに割り当てる。ステップS2において、本実施形態は、タスクのデータ依存関係にもとづいてスレッド内でのタスクの実行順序を決定する。ステップS3において、異なるグループのタスク間のデータ依存関係に対応する同期処理を追加する。ステップS4において、同期処理の中で、各スレッドの中で最初に実行されるタスクへの同期処理をハンドシェイク付き同期処理にする。このような手順により、タスクを並列処理するためのソフトウェア構成が得られる。図2を用いて、図1の手順を具体的に説明する。図2は、いくつかのグループに分けられかつデータ依存関係をもつ複数のタスクを並列処理する本発明の模範的な概念を表す図である。図21は、並列処理対象となるタスクのデータ依存関係グラフである。図22は、本発明の模範的な実施形態にもとづいたタスク間の同期処理の概念を表すスレッド依存関係グラフである。本実施形態においては、図21における三つのグループA、B、Cに属するタスクを、それぞれスレッドA、B、Cに割り当てる図1ステップS1。そして、本実施形態は、各スレッドにおいて、タスクのデータ依存間係にもとづいて、スレッド内でのタスク実行順序を決定する図1ステップS2。例えば、グループAでは、タスク1からタスク2、タスク2からタスク5、というデータ依存関係が存在する。したがって、スレッドAにおけるタスクの実行順序は、タスク1、タスク2、タスク5、である。また、グループBでは、タスク3からタスク7、タスク7からタスク8、というデータ依存関係が存在する。したがって、スレッドBにおけるタスクの実行順序は、1タスク3、2タスク7、3タスク8、である。また、グループCでは、タスク4からタスク6、というデータ依存関係が存在する。したがって、スレッドCにおけるタスクの実行順序は、1タスク4、2タスク6、である。つまり、本実施形態は、同一のグループに属するタスクどおしのデータ依存関係を、スレッド内部のタスクの実行順序に置換える。スレッドB、Cにおいても同様にスレッド内のタスク実行順序を定める。つづいて、異なるグループに属するタスク間のデータ依存関係の扱い方を説明する。本実施形態では、異なるグループに属するタスク間のデータ依存関係を、ハンドシェイク無し同期処理に置換える図1ステップS3。例えば、図21において、グループAのタスク1からグループBのタスク3、グループCのタスク6からグループBのタスク7、などにデータ依存関係が存在する。これらは異なるグループ間のデータ依存関係なので、本実施形態は、このデータ依存関係をハンドシェイク無し同期処理に置換える。さらに、異なるグループ間のデータ依存関係であって、なおかつグループ内の実行順序が1番のタスクへのデータ依存関係については、そのハンドシェイク無し同期処理をハンドシェイク付き同期処理に置換える図1ステップS4。以上のようにして、データ依存関係をもつ複数のタスクを、複数のスレッドに配置する。その結果、図22に示すように、ハンドシェイク無し同期処理及びハンドシェイク付き同期処理が実行されるスレッドが生成される。すなわち、スレッドAには、タスク1の実行終了タスク1によるデータの計算終了をタスク3に通知するハンドシェイク付き同期通知処理と、タスク1の実行終了タスク1によるデータの計算終了をタスク4に通知するハンドシェイク付き同期通知処理と、タスク5の実行終了タスク5によるデータの計算終了をタスク7に通知するハンドシェイク無し同期通知処理が追加され、スレッドCには、タスク6の実行終了タスク6によるデータの計算終了をタスク7に通知するハンドシェイク無し同期通知処理が追加される。また、スレッドBには、タスク3の実行終了タスク3によるデータの計算終了を待ち合わせるハンドシェイク付き同期待ち処理と、タスク5の実行終了タスク5によるデータの計算終了を待ち合わせるハンドシェイク無し同期待ち処理と、タスク6の実行終了タスク6によるデータの計算終了を待ち合わせるハンドシェイク無し同期待ち処理が追加され、スレッドCには、タスク1の実行終了タスク1によるデータの計算終了を待ち合わせるハンドシェイク無し同期待ち処理が追加される。<タスク並列処理のためのソフトウェア構成と実際のコードとの関係>本実施形態において、データ依存関係グラフから抽出したタスク並列処理のためのソフトウェア構成が、実際のコードとどのような関係にあるかを説明する。図3は、この関係を表す図である。図31はスレッド依存関係グラフであり、図32はこれに対応する各スレッドの抽象化コードを示すリストA、B、Cである。なお、スレッド依存関係グラフとは、スレッドへのタスク割当と同期処理の構成を表すグラフ構造を示すものである。また、リストは、スレッド内のタスクと同期処理の実行順序を示す。図32において、Setは、ハンドシェイク無し同期処理の送信側処理ハンドシェイク無し同期通知処理を示し、Waitは、ハンドシェイク無し同期処理の受信側処理ハンドシェイク無し同期待ち処理を示し、HsSetは、ハンドシェイク付き同期処理の送信側処理ハンドシェイク付き同期通知処理を示し、HsWaitは、ハンドシェイク付き同期処理の受信側処理ハンドシェイク付き同期待ち処理を示す。図3リストAはスレッドAの抽象化コードである。スレッドAは、タスク1、2、5を含んでおり、図3リストAでは、これらのタスクが図31のデータ依存関係にもとづいて順番に実行される。タスク1は、スレッドBのタスク3へのデータ依存関係をもつので、タスク1の実行後にタスク1からタスク3へ同期処理送信処理を行う。タスク3はスレッドBの先頭タスク各スレッドにおいて最初に実行されるタスクであるので、タスク1からタスク3への同期処理送信処理はハンドシェイク付きである。さらに、タスク1は、スレッドCのタスク4へのデータ依存関係をもつので、タスク1の実行後にタスク1からタスク4へ同期処理送信処理を行う。タスク4はスレッドCにおいて最初に実行されるタスクであるので、タスク1からタスク4への同期処理送信処理もハンドシェイク付きとなる。タスク5は、スレッドBのタスク7へのデータ依存関係をもつので、タスク5の実行後にタスク5からタスク7へ同期処理送信処理を行う。タスク7はスレッドBの先頭タスクではないので、タスク5からタスク7への同期処理送信処理はハンドシェイク無しである。図3リストBはスレッドBの抽象化コードである。スレッドBはタスク3、7、8を含んでおり、図3リストBでは、これらのタスクが図31の依存関係にもとづいて順番に実行される。タスク3はスレッドAのタスク1からデータ依存関係をもつので、タスク3の実行前にタスク1からタスク3へ同期処理受信処理を行う。タスク3はスレッドBの先頭タスクであるので、タスク1からタスク3への同期処理受信処理はハンドシェイク付きである。そして、タスク7は、スレッドAのタスク5およびスレッドCのタスク6からのデータ依存関係をもつので、タスク7の実行前にタスク5からタスク7へ、およびタスク6からタスク7へ、同期処理受信処理を行う。タスク7はスレッドBの先頭タスクではないので、タスク5からタスク7、およびタスク6からタスク7、のどちらの同期処理受信処理もハンドシェイク無しである。図3リストCはスレッドCの抽象化コードである。スレッドCはタスク4、6を含んでおり、図3リストCでは、これらのタスクが図31のデータ依存関係にもとづいて順番に実行される。タスク4はスレッドAのタスク1からデータ依存関係をもつので、タスク4の実行前にタスク1からタスク4へ同期処理受信処理を行う。タスク4はスレッドCの先頭タスクであるので、タスク1からタスク4への同期処理受信処理はハンドシェイク付きである。そして、タスク6は、スレッドBのタスク7へデータ依存関係をもつので、タスク6の実行後にタスク6からタスク7へ同期処理送信処理を行う。タスク7はスレッドBの先頭タスクではないので、タスク6からタスク7への同期処理送信処理はハンドシェイク無しである。図3リストA、B、Cにおいて、ハンドシェイク付き同期処理を行う際に,特願2010-229784に記載されているデータ領域切替方法を使ってもよい。このデータ領域切替方法は、ハンドシェイク付き同期処理を行う際に、データ領域番号を送信側スレッドから受信側スレッドへ通知し、受信側スレッドはその番号に対応するデータ領域のデータを使用する、というものである。データ領域番号とは、データを格納した領域を一意に識別する番号である。送信側スレッドは、前回に計算したデータと、今回に計算したデータとを、それぞれ異なる領域に格納して、同期処理でそれに応じたデータ領域番号を受信側スレッドに通知することで、より排他的なデータアクセスを保障することができる。<ハンドシェイク付き同期処理の効果>図3スレッドA、B、Cは、ハンドシェイク付き同期処理を行っているため、なんども繰り返して実行することが可能である。すなわち、スレッドAはリストAで示す処理を繰り返し、スレッドBはリストBで示す処理を繰り返し、スレッドCはリストCで示す処理を繰り返す。図4は、図3スレッドA、B、Cが繰返し動作する様子を表す図である。スレッドBとCは、それぞれの先頭タスクを実行する前に、スレッドAからのハンドシェイク付き同期処理を行う。したがって、図4では、スレッドAの動作開始後厳密にはスレッドAのタスク1の実行後に、ハンドシェイク付き同期処理を行ってから、スレッドBとスレッドCが動作開始する。スレッドB及びスレッドCは、その実行を終えた後に、次回のスレッドAとのハンドシェイク付き同期処理を行うまで、待機することになる。また、スレッドAは、その実行開始後に、スレッドB及びスレッドCが前回の実行を終了してハンドシェイク付き同期処理を行うまで、待機することになる。そのため、以上のように、ハンドシェイク付き同期処理を行うことで、スレッドA、B、Cを繰返し実行しても、各スレッドの動作タイミングをそろえることができる。一方、図5は、ハンドシェイク付き同期処理をハンドシェイク無し同期処理に置換えて、図3スレッドA、B、Cを繰返し動作させる様子を表す図である。スレッドAからスレッドBとCに対してハンドシェイク無し同期処理が毎回行われるが、スレッドAはスレッドBとCとハンドシェイクせずに、次の動作をはじめる。すなわち、ハンドシェイク無し同期処理は、ハンドシェイク付き同期処理のように受信側スレッドBとCが同期処理を行うまで待機することなく、その処理を終了する。言い換えると、ハンドシェイク無し同期処理は、受信側スレッドBとCのみが、送信側スレッドAが同期処理を行うまで、待機することになる。これを繰り返していくと、スレッドAとスレッドBの実行開始時刻の間隔が徐々にずれていく。このズレが蓄積すると、スレッドAからスレッドBへのハンドシェイク無し同期をスレッドBが取りこぼす可能性がある。すなわち、スレッドAとスレッドBの実行開始時刻の間隔が徐々に大きくなり、やがて、スレッドBの実行開始が間に合わなくなってしまう。したがって、ハンドシェイクを全く行わずに、図3スレッドA、B、Cを実行すると、同期ズレが発生する可能性がある。本実施形態におけるハンドシェイク付き同期処理は、このような同期ズレを防ぐ効果がある。<冗長なハンドシェイク無し同期処理の判定>つづいて、異なるスレッドに属するタスク間でのハンドシェイク無し同期処理のなかから、冗長なものを見つける方法について説明する。本実施形態は、図2のようにして、タスクのデータ依存関係グラフからスレッド依存関係グラフを導く。この過程で、冗長なハンドシェイク無し同期処理が発生する可能性がある。以降の説明では、ハンドシェイク無し同期処理を単に同期処理と記述する。図6を使って、冗長な同期処理について説明する。図61のグラフ構造では、タスク4からタスク7へ、タスク6からタスク7へ、それぞれ同期処理がある。タスク4とタスク6はどちらもスレッドCに属しており、スレッドC内での実行順序は、タスク4、タスク6、の順番である。この場合、図61に示すように、タスク4からタスク7への同期処理が冗長であり不要である。なぜなら、タスク4を実行した後にタスク6が実行され、その後にタスク6からタスク7への同期処理が行われるからである。タスク6の実行後には既にタスク4は実行完了しているため、タスク4からタスク7への同期処理をあえて行う必要はない。図62は、タスク4からタスク7への同期処理を削除した後のグラフ構造である。このように、上述したステップS3では、このようにして冗長となる同期処理を削除した後のグラフ構造に従って、同期処理を追加するようにしてもよい。図6の冗長な同期処理の例を一般的に表現すると、あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからの同期処理がある場合には、当該複数データ供給側タスクのなかで最も後で実行されるデータ供給側タスクからの同期処理だけを残し、それ以外の当該複数データ供給側タスクからの同期処理を冗長と見なしてよい。つづいて、図7を使って、別の冗長な同期処理について説明する。図71のグラフ構造では、タスク6からタスク7へ、タスク6からタスク8へ、それぞれ同期処理がある。タスク7とタスク8はどちらもスレッドBに属しており、スレッドB内での実行順序は、タスク7、タスク8、の順番である。この場合、図71に示すように、タスク6からタスク7への同期処理が冗長であり不要である。なぜなら、タスク6の実行後に、タスク6からタスク7へ同期処理が行われ、タスク8は必ずタスク7の後で実行されるからである。タスク8の実行前には、タスク6からタスク7への同期処理が行われているため、タスク6の実行完了を確認できおり、タスク6からタスク8への同期処理をあえて行う必要はない。図72は、タスク6からタスク7への同期処理を削除した後のグラフ構造である。このように、上述したステップS3では、このようにして冗長となる同期処理を削除した後のグラフ構造に従って、同期処理を追加するようにしてもよい。図7の冗長な同期処理の例を一般的に表現すると、あるデータ供給側タスクから、同じスレッドに属する複数のデータ使用側タスクへの同期処理がある場合には、当該複数データ使用側タスクの中で最も先に実行されるデータ使用側タスクへの同期処理だけを残し、それ以外の当該複数データ使用側タスクへの同期処理を冗長と見なして良い。<ハンドシェイク付き同期処理の実施形態>本実施形態では、ハンドシェイク付き同期処理は、ハンドシェイク付き同期通知処理と、ハンドシェイク付き同期待ち処理の二つで構成される、と説明した。送信側タスクがハンドシェイク付き同期通知処理を、受信側タスクがハンドシェイク付き同期待ち処理を、それぞれ行う。送信側タスクは、ハンドシェイク付き同期通知処理において、同期することを示す信号同期信号を受信側タスクへ伝える。そして、受信側タスクは、ハンドシェイク付き同期待ち処理において、その同期信号が伝えられるまで待合せ、読取る。同期信号を受け取った受信側タスクは、ハンドシェイク付き同期待ち処理において、同期信号を受け取ったことを示す信号確認信号を送信側タスクへ伝える。最後に、送信側タスクは、ハンドシェイク付き同期通知処理において、その確認信号が伝えられるまで待合せ、読取る。このように、ハンドシェイク付き同期処理は、送信側から受信側へ同期信号を送り、受信側から送信側へ確認信号を送る。送信側と受信側との間でこのようなやり取りを行えば、それはハンドシェイク付き同期処理のひとつの実施形態となる。ハンドシェイク付き同期処理を何度も繰り返す場合には、送信側における同期信号送信と確認信号受信の順番を逆にするような実施形態も可能である。つまり、送信側タスクにおいて、まず、前回受信側タスクが送信した確認信号を待合せて読取り、つづいて、同期信号を受信側タスクへ伝える。このようにすることにより、送信側タスクは、同期信号を受信側タスクへ伝えた後、すぐに、ハンドシェイク付き同期通知処理を終えることができるとともに、受信側タスクが同期信号を読取ってから確認信号を送信側タスクへ伝えるまでの時間に送信側タスクが確認信号を待合せないので、送信側タスクが受信側タスクを待ち合わせる時間が減少すると考えられる。このように、送信側での確認信号の確認タイミングをずらした実装形態も可能である。なお、ここでは、送信側タスク及び受信側タスクとして説明したが、厳密には、信号の送受信は、送信側タスクが割り当てられたスレッドと、受信側タスクが割り当てられたスレッドとの間で行われる。上記で述べたハンドシェイク付き同期処理のいずれの実施形態であっても、本発明のタスク並列処理方法の実施形態に適用可能である。<ハンドシェイク無し同期処理の実施形態>本実施形態では、ハンドシェイク無し同期処理は、ハンドシェイク無し同期通知処理と、ハンドシェイク無し同期待ち処理の二つで構成される、と説明した。送信側タスクがハンドシェイク無し同期通知処理を、受信側タスクがハンドシェイク無し同期待ち処理を、それぞれ行う。ハンドシェイク無し同期通知処理は、送信側タスクと受信側タスクがハンドシェイクを行なわずに、送信側タスクが単に変数に値をセットするような処理である。ハンドシェイク無し同期待ち処理は、当該変数に値がセットされるまで受信側タスクが待つ、という処理である。変数への値のセットのやり方にはいくつか方法がある。変数の値を0リセットと1セットとで表す方法、変数をカウンタとして使用することにより前回変数値との違いを認識し易くする方法、などがある。変数の値を0と1で表現する場合には、1にした変数を0に戻すリセット処理が必ず必要になる。一方、変数をカウンタとして使用する場合には、変数を0に戻すリセット処理が不要である。なぜなら、同期待ち処理において、前回の変数と今回の変数の値を計算し、変化していれば、当該変数に値がセットされた、と判断できるからである。つまり、変数をカウンタとして使う方が、リセット処理が不要な分だけ、負荷が小さいと考えられる。上記で述べたハンドシェイク無し同期処理のいずれの実施形態であっても、本発明のタスク並列処理方法の実施形態に適用可能である。以上に説明したように、ハンドシェイク無し同期処理では、ハンドシェイク付き同期処理と比較して、受信側から送信側への同期通信が不要となる。それに対して、本実施の形態では、グループ内で最初に実行されるデータ使用側タスクのみに関して、同期待ち処理及び同期通知処理をハンドシェイク付きで行い、その他のデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク無しで行うようにしている。そのため、同期通信の数を削減することが可能となる。<タスク並列処理のためのシステム構成例>続いて、図8を参照して、上述した本発明の実施の形態のシステム構成例について説明する。図8は、本実施の形態にかかるタスク並列処理システム1の構成例を示す図である。タスク並列処理システム1は、プログラム生成装置10及びタスク並列処理装置20を有する。プログラム生成装置10は、プロセッサ11、記憶装置12、及びメモリ13を有する。タスク並列処理装置20は、プロセッサ21~23、記憶装置24、及びメモリ25を有する。プロセッサ11は、コンパイラ101を実行する。記憶装置12は、ソースプログラム301が格納される。メモリ13は、プロセッサ11がコンパイラ101を実行するために使用される。すなわち、メモリ13には、コンパイラ101がロードされて、プロセッサ11がそれを実行する。コンパイラ101は、ソースプログラム301からコンパイルして目的プログラム302を生成するためのコードを含んだプログラムである。また、コンパイラ101は、図1を参照して説明したステップS1~S4を実行するためのコードを含む。すなわち、プロセッサ11は、コンパイラ101を実行することによって、上述したステップS1~S4を実行して、ソースプログラム301から目的プログラム302タスク並列ソフトウェアを生成する。これによって、図3のリストA~Cで示す処理を実行するスレッドを含んだソフトウェア構成の目的プログラム302が生成される。ソースプログラム301は、グループに分けられた複数のタスクにおける処理が記述されている。ここで、ソースプログラム301には、図2で示すタスク1~8が記述されているものとする。すなわち、プロセッサ11は、コンパイラ101を実行することによって、これら複数のタスク1~8をそれぞれのグループ毎にスレッドに割り当てる。これによって、図3に示すように、タスク1、2、5が割り当てられたスレッドAと、タスク3、7、8が割り当てられたスレッドBと、タスク4、6が割り当てられたスレッドCとを含む目的プログラム302が生成される。また、これらのスレッドA~Cには、図3のリストA~Cで示すように、ハンドシェイク無し同期処理とハンドシェイク有り同期処理が設定される。ここで、プロセッサ11は、タスク間のデータ依存関係に従って、同期処理を設定することになるが、プロセッサ11がタスク間のデータ依存関係を認識する方法は、どのようにして実現するようにしてもよい。例えば、記憶装置12にデータ依存関係グラフを示す情報を予め格納しておき、プロセッサ11がその情報を参照することによってタスク間のデータ依存関係を認識可能としてもよい。このようにして生成された目的プログラム302は、タスク並列処理装置20の記憶装置24に格納される。これは、どのようにして実現してもよい。例えば、プログラム生成装置10とタスク並列処理装置20とを、インターネット、イントラネット、電話回線網等の任意の通信手段によって接続して、プロセッサ11が通信手段を介してプログラム生成装置10からタスク並列処理装置20に目的プログラム302を送信して記憶装置24に格納するようにしてもよい。また、プロセッサ11がプログラム生成装置10において、フロッピー登録商標ディスク、CD-R、CD-R/W、及びUSBメモリ等の任意の記録媒体に格納して、ユーザがその記録媒体をプログラム生成装置10から取り出してタスク並列処理装置20に挿入し、プロセッサ21~23のいずれかがその記録媒体から目的プログラム302を取得して記憶装置24に格納するようにしてもよい。プロセッサ21~23は、記憶装置24に格納された目的プログラム302を実行する。これによって、図3のリストA~Cで示す処理がプロセッサ21~23によって実行される。なお、図8では、プロセッサ21がスレッドAを実行し、プロセッサ22がスレッドBを実行し、プロセッサ23がスレッドCを実行する場合について例示しているが、1つのプロセッサが実行するスレッドの数は、これに限られない。すなわち、1つのプロセッサが複数のスレッドを実行するようにしてもよい。例えば、タスク並列処理装置20が1つのプロセッサを有するようにし、その1つのプロセッサでスレッドA~Cを時分割で切り替えて並列的に実行するようにしてもよい。記憶装置24は、目的プログラム302が格納される。ここで、記憶装置12、24は、ハードディスク又はフラッシュメモリ等の任意の記憶装置である。メモリ25は、プロセッサ21~23が目的プログラム302を実行するために使用される。すなわち、メモリ25には、目的プログラム302がロードされて、プロセッサ11がそれを実行する。また、メモリ25には、各タスク1~9で、計算されたデータも格納される。すなわち、メモリ25を介して、データ供給側タスクからデータ使用側タスクへのデータの受け渡しが行われる。また、メモリ25には、ハンドシェイク付き同期処理における同期信号の値及び確認信号の値、並びに、ハンドシェイク無し同期処理における変数が格納される。すなわち、上述した同期信号及び確認信号は、メモリ25を介して、スレッド間で受け渡される。<タスク並列処理のためのシステムの概略構成>続いて、図9を参照して、上述したタスク並列処理システム1の概略構成について説明する。図9は、本実施の形態にかかるタスク並列処理システム1の概略構成を示す図である。タスク並列処理システム9は、プログラム生成装置91及びタスク並列処理装置92を有する。プログラム生成装置91は、グループ割当て部911、実行順序決定部912、及び、同期処理設定部913を有する。実行順序決定部912、及び、同期処理設定部913は、プロセッサ11に対応する。タスク並列処理装置92は、実行部921を有する。実行部921は、プロセッサ21~23に対応する。プログラム生成装置91は、複数のスレッドを含むプログラム900を生成する。プログラム900は、目的プログラム302に対応する。グループ割当て部911は、データの計算を表す複数のタスクが分けられたいくつかのグループのうち、ひとつのグループをひとつのスレッドに割当てる。実行順序決定部912は、タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定する。同期処理設定部913は、他グループのデータ供給側タスクからのデータ依存関係をもつデータ使用タスクが割当てられたスレッドにおいて、そのデータ使用タスクを実行する前に、他グループのデータ供給側タスクからの同期待ち処理を設定するとともに、他グループのデータ使用側タスクへのデータ依存関係をもつデータ供給側タスクが割当てられたスレッドにおいて、そのデータ供給側タスクを実行した後に、他グループのデータ使用側タスクへの同期通知処理を設定する。ここで、同期処理設定部913は、少なくともグループ内で最初に実行されるデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク付きで設定するとともに、その他のデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク無しで設定する。タスク並列処理装置92は、プログラム生成装置91によって生成されたプログラム900を実行する。すなわち、実行部921は、それぞれ、データの計算を表す複数のタスクが分けられたいくつかのグループのうち、ひとつのグループが割当てられ、その割当てられたグループに属するタスクをタスク間のデータ依存関係にもとづいた実行順序で実行する複数のスレッドを実行する。また、実行部921は、他グループのデータ供給側タスクからのデータ依存関係をもつデータ使用タスクが割当てられたスレッドにおいて、そのデータ使用タスクを実行する前に、他グループのデータ供給側タスクからの同期待ち処理を行うとともに、他グループのデータ使用側タスクへのデータ依存関係をもつデータ供給側タスクが割当てられたスレッドにおいて、そのデータ供給側を実行した後に、他グループのデータ使用側タスクへの同期通知処理を行う。また、実行部921は、少なくともグループ内で最初に実行されるデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク付きで行うとともに、その他のデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク無しで行う。なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。本実施の形態では、グループ内で最初に実行されるデータ使用側タスクのみに関して、同期待ち処理及び同期通知処理をハンドシェイク付きで行い、その他のデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク無しで行うようにしているが、これに限られない。少なくともグループ内で最初に実行されるデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク付きで行い、その他のデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク無しで行うようにしてもよい。例えば、1グループ内に、ハンドシェイク付きで同期待ち処理又は同期通知処理を行うタスクが複数含まれていてもよい。そのようにしても、それ以外にハンドシェイク無しで同期待ち処理又は同期通知処理を行うタスクがあれば、その分、同期通信の数を削減することができるからである。本実施の形態では、ステップS3でハンドシェイク無し同期処理を設定してから、ステップS4でグループ内で最初に実行されるタスクに関するハンドシェイク無し同期処理をハンドシェイク付き同期処理に置き換えるようにしているが、これに限られない。例えば、ステップS3でハンドシェイク付き同期処理を設定してから、ステップS4でグループ内で最初に実行されるタスク以外のタスクに関するハンドシェイク付き同期処理をハンドシェイク無し同期処理に置き換えるようにしてもよい。また、ステップS3でグループ内で最初に実行されるタスク以外のタスクに関してハンドシェイク無し同期処理を設定してから、ステップS4でグループ内で最初に実行されるタスクに関してハンドシェイク付き同期処理を設定するようにしてもよい。この場合、このステップS4と、このステップS3の順序を逆にして実行するようにしてもよい。本実施の形態では、プログラム生成装置10とタスク並列処理装置20が異なる装置である場合について例示したが、これに限られない。すなわち、タスク並列処理ソフトウェアの生成及び実行を同一の装置で行うようにしてもよい。本発明の実施の形態にかかるプログラム生成装置10及びタスク並列処理装置20は、上述したように本実施の形態の機能を実現するプログラムコンパイラ101、目的プログラム302を、コンピュータプログラム生成装置、タスク並列処理装置が実行することによって、構成することが可能である。また、このプログラムは、様々なタイプの非一時的なコンピュータ可読媒体nontransitorycomputerreadablemediumを用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体tangiblestoragemediumを含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ、光磁気記録媒体例えば光磁気ディスク、CD-ROMReadOnlyMemory、CD-R、CD-R/W、半導体メモリ例えば、マスクROM、PROMProgrammableROM、EPROMErasablePROM、フラッシュROM、RAMRandomAccessMemoryを含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体transitorycomputerreadablemediumによってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。また、コンピュータが上述の実施の形態の機能を実現するプログラムを実行することにより、上述の実施の形態の機能が実現される場合だけでなく、このプログラムが、コンピュータ上で稼動しているOSOperatingSystemもしくはアプリケーションソフトウェアと共同して、上述の実施の形態の機能を実現する場合も、本発明の実施の形態に含まれる。さらに、このプログラムの処理の全てもしくは一部がコンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットによって行われて、上述の実施の形態の機能が実現される場合も、本発明の実施の形態に含まれる。"