(57)【特許請求の範囲】
【請求項１】
データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する際に、
二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を行うとともに、
第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を行い、
各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで行うとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで行い、
前記同期待ち処理及び前記同期通知処理は、あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからのデータ依存関係がある場合、当該複数のデータ供給側タスクのなかで最も後で実行されるデータ供給側タスクのみに関して行われる、
ことを特徴とする、タスク並列処理方法。
【請求項２】
データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する際に、
二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を行うとともに、
第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を行い、
各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで行うとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで行い、
前記同期待ち処理及び前記同期通知処理は、あるデータ供給側タスクから、同じスレッドに属する複数のデータ使用側タスクへのデータ依存関係がある場合、当該複数のデータ使用側タスクのなかで最も先に実行されるデータ使用側タスクのみに関して行われる、
ことを特徴とする、タスク並列処理方法。
【請求項３】
データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する際に、
二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を行うとともに、
第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を行い、
各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで行うとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで行い、
前記同期待ち処理及び前記同期通知処理は、
あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからのデータ依存関係がある場合、当該複数のデータ供給側タスクのなかで最も後で実行されるデータ供給側タスクのみに関して行われるとともに、
あるデータ供給側タスクから、同じスレッドに属する複数のデータ使用側タスクへのデータ依存関係がある場合、当該複数のデータ使用側タスクのなかで最も先に実行されるデータ使用側タスクのみに関して行われる、
ことを特徴とする、タスク並列処理方法。
【請求項４】
前記同期待ち処理及び前記同期通知処理は、前記グループ内で最初に実行されるデータ使用側タスクのみに関して、ハンドシェイク付きで行われる、
ことを特徴とする、請求項１乃至３のいずれか１項に記載のタスク並列処理方法。
【請求項５】
データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する実行部を備え、
前記実行部は、二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を行うとともに、第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を行い、
前記実行部は、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで行うとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで行い、
前記同期待ち処理及び前記同期通知処理は、あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからのデータ依存関係がある場合、当該複数のデータ供給側タスクのなかで最も後で実行されるデータ供給側タスクのみに関して行われる、
ことを特徴とする、タスク並列処理装置。
【請求項６】
データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する際に、
二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に実行される、前記データ供給タスクからの同期待ち処理と、
第１スレッドにおいて、前記データ供給タスクが実行された後に実行される、前記データ使用タスクへの同期通知処理と、をコンピュータに実行させ、
各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで実行させるとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで実行させ、
前記同期待ち処理及び前記同期通知処理は、あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからのデータ依存関係がある場合、当該複数のデータ供給側タスクのなかで最も後で実行されるデータ供給側タスクのみに関して行われる、
ことを特徴とする、タスク並列処理プログラム。
【請求項７】
複数のスレッドを含むプログラムを生成するプログラム生成方法であって、
データの計算を表すタスクをひとつ以上含むグループをスレッドに割当て、
前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定し、
二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定し、
各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定し、
前記同期待ち処理及び前記同期通知処理は、あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからのデータ依存関係がある場合、当該複数のデータ供給側タスクのなかで最も後で実行されるデータ供給側タスクのみに関して行われる、
ことを特徴とする、プログラム生成方法。
【請求項８】
複数のスレッドを含むプログラムを生成するプログラム生成装置であって、
データの計算を表すタスクをひとつ以上含むグループをスレッドに割当てるグループ割当て部と、
前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定する実行順序決定部と、
二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定する同期処理設定部と、を備え、
前記同期処理設定部は、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定し、
前記同期待ち処理及び前記同期通知処理は、あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからのデータ依存関係がある場合、当該複数のデータ供給側タスクのなかで最も後で実行されるデータ供給側タスクのみに関して行われる、
ことを特徴とする、プログラム生成装置。
【請求項９】
複数のスレッドを含むプログラムを生成するプログラム生成プログラムであって、
データの計算を表すタスクをひとつ以上含むグループをスレッドに割当てる割当て処理と、
前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定する実行順序決定処理と、
二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定する同期処理設定処理と、をコンピュータに実行させ、
前記同期処理設定処理では、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定し、
前記同期待ち処理及び前記同期通知処理は、あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからのデータ依存関係がある場合、当該複数のデータ供給側タスクのなかで最も後で実行されるデータ供給側タスクのみに関して行われる、
ことを特徴とする、プログラム生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、いくつかのグループに分けられた複数のタスクを、同時並行的に処理するタスク並列処理方法、タスク並列処理装置及びタスク並列処理プログラム、並びに、プログラム生成方法、プログラム生成装置及びプログラム生成プログラムに関する。
【背景技術】
【０００２】
本願出願人は、複数のタスクそれぞれを同時並行的に実行する方法として、特願２０１０−２２９７８４における方法を提案した。この方法は、タスクそれぞれを同時並行的に動作させ、データの供給側と使用側というデータ依存関係にもとづいて、タスクがハンドシェイク型の同期通信をすることにより、タスク内の計算を実行する、というパイプライン的な並列データ処理方法である。より具体的には、データ供給側タスクにおけるデータの計算後に、データ供給側タスクが割り当てられたスレッドと、データ使用側タスクが割り当てられたスレッド間でハンドシェイク型の同期通信を行うことによって、ロック／アンロックをすることなく、排他的なデータアクセスが行えるようにしている。
【０００３】
この並列データ処理方法では、タスクそれぞれを同時並行的に動作する小規模プログラムとする。この小規模プログラムは、Ｌｉｎｕｘ（登録商標）におけるスレッド、あるいはＲＴＯＳ(Ｒｅａｌｔｉｍｅ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ)におけるタスク、である。仮に、タスクの数が多くなり、タスク内の計算量が小さくなると、小規模プログラムの管理コストが大きくなり、同期通信の回数も増加し、タスク処理システム全体の実行時間が増加する。同期通信はプロセッサへの負荷が大きいため、できるだけ回数が少ない方がよい。
【０００４】
本願出願人は、小規模プログラムの管理コスト増大を抑制するには、複数のタスクをグループ化して、グループ化された複数のタスクを１つの小規模プログラムとすることが効果的であることを見い出した。タスクをグループ化する技術は、例えば特許文献１に公開されている。特許文献１においては、それぞれが小ループとなる複数のマクロタスクを、データローカライザブルグループとしてグループ化し、同一のデータローカライザブルグループに属する小ループ同士を、可能な限り同一のプロセッサ上で連続して実行されるようにスケジューリングする技術が公開されている。本願出願人は、さらにグループ化したタスクを１つの小規模プログラムとすることにより、小規模プログラムの個数はクループの数だけになるため、小規模プログラムの管理コストが低減し、小規模プログラムの切替の頻度を低減できることを見い出した。
【０００５】
タスクのグループ化は、小規模プログラムの切替を少なくする良い手段であるが、特願２０１０−２２９７８４に対してタスクのグループ化を単純に導入するだけでは、異なるグループに属するタスク間の依存関係を表す同期通信はそのまま残ることになる。タスクのグループ化に合わせて、負荷の大きい同期通信の回数を減らすことが可能な、グループ化や同期の方法が必要である。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特許第４１７７６８１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
複数のタスクのデータ依存関係にもとづいてタスクどうしが同期通信することによりデータを処理するパイプライン的な並列データ処理方法において、タスクそれぞれを同時並行的に動作する小規模プログラムにすると、タスク増加にともなって小規模プログラムの管理コスト(プログラム管理データ、スタック)が増え、タスクのデータ依存関係を表す同期通信の回数も増えてしまう。
【０００８】
それに対して、複数のタスクをいくつかのグループに分けることによって、小規模プログラムの数を低減することができるが、異なるグループに属するタスク間のデータ依存関係を表す同期通信はそのままである。したがって、特願２０１０−２２９７８４のパイプライン的な並列データ処理方法と単純なタスクのグループ化を組み合わせただけでは、同期通信の数を削減しにくい、という課題がある。 
【０００９】
本発明の目的は、上述した課題を解決するために、パイプライン的な並列データ処理に関して、同期通信の数を削減可能な、タスク並列処理方法、タスク並列処理装置及びタスク並列処理プログラム、並びに、プログラム生成方法、プログラム生成装置及びプログラム生成プログラムを提供することにある。
【課題を解決するための手段】
【００１０】
本発明の第１の態様にかかるタスク並列処理方法は、データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する際に、二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を行うとともに、第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を行い、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで行うとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで行う、ことを特徴とする。
【００１１】
本発明の第２の態様にかかるタスク並列処理装置は、データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する実行部を備え、前記実行部は、二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を行うとともに、第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を行い、前記実行部は、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで行うとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで行う、ことを特徴とする。
【００１２】
本発明の第３の態様にかかるタスク並列処理プログラムは、データの計算を表すタスクをひとつ以上含むグループがひとつずつ割り当てられた複数のスレッドを実行する際に、二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に実行される、前記データ供給タスクからの同期待ち処理と、第１スレッドにおいて、前記データ供給タスクが実行された後に実行される、前記データ使用タスクへの同期通知処理と、をコンピュータに実行させ、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで実行させるとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで実行させる、ことを特徴とする。
【００１３】
本発明の第４の態様にかかるプログラム生成方法は、複数のスレッドを含むプログラムを生成するプログラム生成方法であって、データの計算を表すタスクをひとつ以上含むグループをスレッドに割当て、前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定し、二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定し、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定する、ことを特徴とする。
【００１４】
本発明の第５の態様にかかるプログラム生成装置は、複数のスレッドを含むプログラムを生成するプログラム生成装置であって、データの計算を表すタスクをひとつ以上含むグループをスレッドに割当てるグループ割当て部と、前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定する実行順序決定部と、二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定する同期処理設定部と、を備え、前記同期処理設定部は、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定する、ことを特徴とする。
【００１５】
本発明の第６の態様にかかるプログラム生成プログラムは、複数のスレッドを含むプログラムを生成するプログラム生成プログラムであって、データの計算を表すタスクをひとつ以上含むグループをスレッドに割当てる割当て処理と、前記タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定する実行順序決定処理と、二つのスレッドの一方である第１スレッドのデータ供給タスクからのデータ依存関係をもつデータ使用タスクが割り当てられたもう一方のスレッドである第２スレッドにおいて、前記データ使用タスクが実行される前に、前記データ供給タスクからの同期待ち処理を設定するとともに、第１スレッドにおいて、前記データ供給タスクが実行された後に、前記データ使用タスクへの同期通知処理を設定する同期処理設定処理と、をコンピュータに実行させ、前記同期処理設定処理では、各スレッドにおいて最初に実行されるデータ使用タスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク付きで設定するとともに、当該データ使用タスク以外のタスクに関する前記同期待ち処理及び前記同期通知処理をハンドシェイク無しで設定する、ことを特徴とする。
【発明の効果】
【００１６】
上述した本発明の各態様によれば、パイプライン的な並列データ処理に関して、同期通信の数を削減可能なタスク並列処理方法、タスク並列処理装置及びタスク並列処理プログラム、並びに、プログラム生成方法、プログラム生成装置及びプログラム生成プログラムを提供することができる。
【図面の簡単な説明】
【００１７】
【図１】本発明の模範的な実施形態にもとづいて、グループに分けられた複数のタスクからなるデータ依存関係グラフから、タスク並列処理ソフトウェアの構成を得るためのフローチャートである。
【図２】いくつかのグループに分けられかつデータ依存関係をもつ複数のタスクを並列処理する 本発明の模範的な概念を表す図である。
【図３】本発明の模範的な本実施形態において、データ依存関係グラフから抽出したタスク並列処理と実際のコードとの関係を表す図である。
【図４】図３スレッドＡ、Ｂ、Ｃが繰返し動作する様子を表す図である。
【図５】ハンドシェイク付き同期処理をハンドシェイク無し同期処理に置換えて、図３スレッドＡ、Ｂ、Ｃを繰返し動作させる様子を表す図である。
【図６】あるひとつのタスクに対して別スレッドの複数のタスクから同期処理がある場合において、冗長なハンドシェイク無し同期処理の例を表す図である。
【図７】あるひとつのタスクから別スレッドの複数のタスクへ同期処理がある場合において、冗長なハンドシェイク無し同期処理の例を表す図である。
【図８】本実施の形態にかかるタスク並列処理システムの構成例を示す図である。
【図９】本実施の形態にかかるタスク並列処理システムの概略構成を示す図である。
【発明を実施するための形態】
【００１８】
本発明の実施の形態について図面を参照して説明する。本発明の模範的な実施形態における並列処理の概念を説明する。本実施形態は、いくつかのグループに分けられた複数のタスクを並列処理の対象とし、ひとつのグループに属するタスクをひとつのプログラム実行単位であるスレッドに割当て、グループ数分のスレッドを並列実行する。複数のタスクをグループに分ける方法については、本発明の対象範囲ではないので、記載しない。以降では、なんからの方法を用いて複数のタスクをいくつかのグループに分けたとして、説明する。
【００１９】
本実施形態は、タスクが使用するデータにもとづいてタスクの依存関係を決定する。 例えば、タスクＴ１の計算結果Ｒ１をタスクＴ２が使用するなら、タスクＴ１からタスクＴ２に対してデータ依存関係が存在する。この場合、データＲ１に関して、タスクＴ１はデータ供給側タスクであり、タスクＴ２はデータ使用側タスクである。タスクＴ１からタスクＴ２に対してデータ依存関係が存在するなら、タスクＴ２はタスクＴ１の後で実行されなければならない。このようなデータ依存関係にもとづいて、タスクの実行順序を決定することができる。
【００２０】
本明細書においては、ハンドシェイク付き同期通知処理とハンドシェイク付き同期待ち処理とを合わせたものを、ハンドシェイク付き同期処理と呼ぶことにする。そして、ハンドシェイク無し同期通知処理は、ハンドシェイクを行わずにフラグをセットする処理を意味し、ハンドシェイク付き同期通知処理よりも負荷は非常に軽い。同様に、ハンドシェイク無し同期待ち処理は、フラグがセットされているか否か確認しつつフラグがセットされるまで待つという処理を意味し、ハンドシェイク付き同期待ち処理よりも負荷は若干軽い。ハンドシェイク無し同期通知処理とハンドシェイク無し同期待ち処理とを合わせたものを、本明細書では、ハンドシェイク無し同期処理と呼ぶことにする。なお、ハンドシェイク付き同期処理と、ハンドシェイク無し同期処理の詳細については、後述する。
【００２１】
＜タスクのデータ依存関係グラフにもとづいたタスク並列処理のためのソフトウェア構成抽出＞
図１は、本発明の模範的な実施形態にもとづいて、グループに分けられた複数のタスクからなるデータ依存関係グラフから、タスク並列処理ソフトウェアの構成を得るためのフローチャートである。まず、ステップＳ１において、本実施形態は、タスクをグループごとにスレッドに割り当てる。ステップＳ２において、本実施形態は、タスクのデータ依存関係にもとづいてスレッド内での タスクの実行順序を決定する。ステップＳ３において、異なるグループのタスク間のデータ依存関係に対応する同期処理を追加する。ステップＳ４において、同期処理の中で、各スレッドの中で最初に実行されるタスクへの同期処理をハンドシェイク付き同期処理にする。このような手順により、タスクを並列処理するためのソフトウェア構成が得られる。
【００２２】
図２を用いて、図１の手順を具体的に説明する。図２は、いくつかのグループに分けられかつデータ依存関係をもつ複数のタスクを並列処理する本発明の模範的な概念を表す図である。図２（１）は、並列処理対象となるタスクのデータ依存関係グラフである。図２（２）は、本発明の模範的な実施形態にもとづいたタスク間の同期処理の概念を表すスレッド依存関係グラフである。 
【００２３】
本実施形態においては、図２（１）における三つのグループＡ、Ｂ、Ｃに属するタスクを、それぞれスレッドＡ、Ｂ、Ｃに割り当てる（図１ステップＳ１）。そして、本実施形態は、各スレッドにおいて、タスクのデータ依存間係にもとづいて、スレッド内でのタスク実行順序を決定する（図１ステップＳ２）。例えば、グループＡでは、タスク１からタスク２、タスク２からタスク５、というデータ依存関係が存在する。したがって、スレッドＡにおけるタスクの実行順序は、(１)タスク１、(２)タスク２、(３)タスク５、である。また、グループＢでは、タスク３からタスク７、タスク７からタスク８、というデータ依存関係が存在する。したがって、スレッドＢにおけるタスクの実行順序は、（１）タスク３、（２）タスク７、（３）タスク８、である。また、グループＣでは、タスク４からタスク６、というデータ依存関係が存在する。したがって、スレッドＣにおけるタスクの実行順序は、（１）タスク４、（２）タスク６、である。つまり、本実施形態は、同一のグループに属するタスクどおしのデータ依存関係を、スレッド内部のタスクの実行順序に置換える。スレッドＢ、Ｃにおいても同様にスレッド内のタスク実行順序を定める。
【００２４】
つづいて、異なるグループに属するタスク間のデータ依存関係の扱い方を説明する。 本実施形態では、異なるグループに属するタスク間のデータ依存関係を、ハンドシェイク無し同期処理に置換える（図１ステップＳ３）。例えば、図２（１）において、グループＡのタスク１からグループＢのタスク３、グループＣのタスク６からグループＢのタスク７、などにデータ依存関係が存在する。これらは異なるグループ間のデータ依存関係なので、本実施形態は、このデータ依存関係をハンドシェイク無し同期処理に置換える。さらに、異なるグループ間のデータ依存関係であって、なおかつグループ内の実行順序が１番のタスクへのデータ依存関係については、そのハンドシェイク無し同期処理をハンドシェイク付き同期処理に置換える（図１ステップＳ４）。以上のようにして、データ依存関係をもつ複数のタスクを、複数のスレッドに配置する。
【００２５】
その結果、図２（２）に示すように、ハンドシェイク無し同期処理及びハンドシェイク付き同期処理が実行されるスレッドが生成される。すなわち、スレッドＡには、タスク１の実行終了（タスク１によるデータの計算終了）をタスク３に通知するハンドシェイク付き同期通知処理と、タスク１の実行終了（タスク１によるデータの計算終了）をタスク４に通知するハンドシェイク付き同期通知処理と、タスク５の実行終了（タスク５によるデータの計算終了）をタスク７に通知するハンドシェイク無し同期通知処理が追加され、スレッドＣには、タスク６の実行終了（タスク６によるデータの計算終了）をタスク７に通知するハンドシェイク無し同期通知処理が追加される。また、スレッドＢには、タスク３の実行終了（タスク３によるデータの計算終了）を待ち合わせるハンドシェイク付き同期待ち処理と、タスク５の実行終了（タスク５によるデータの計算終了）を待ち合わせるハンドシェイク無し同期待ち処理と、タスク６の実行終了（タスク６によるデータの計算終了）を待ち合わせるハンドシェイク無し同期待ち処理が追加され、スレッドＣには、タスク１の実行終了（タスク１によるデータの計算終了）を待ち合わせるハンドシェイク無し同期待ち処理が追加される。
【００２６】
＜タスク並列処理のためのソフトウェア構成と実際のコードとの関係＞
本実施形態において、データ依存関係グラフから抽出したタスク並列処理のためのソフトウェア構成が、実際のコードとどのような関係にあるかを説明する。図３は、この関係を表す図である。図３（１）はスレッド依存関係グラフであり、図３（２）はこれに対応する各スレッドの抽象化コードを示すリスト（Ａ）、（Ｂ）、（Ｃ）である。なお、スレッド依存関係グラフとは、スレッドへのタスク割当と同期処理の構成を表すグラフ構造を示すものである。また、リストは、スレッド内のタスクと同期処理の実行順序を示す。図３（２）において、Ｓｅｔ（）は、ハンドシェイク無し同期処理の送信側処理（ハンドシェイク無し同期通知処理）を示し、Ｗａｉｔ（）は、ハンドシェイク無し同期処理の受信側処理（ハンドシェイク無し同期待ち処理）を示し、ＨｓＳｅｔ（）は、ハンドシェイク付き同期処理の送信側処理（ハンドシェイク付き同期通知処理）を示し、ＨｓＷａｉｔ（）は、ハンドシェイク付き同期処理の受信側処理（ハンドシェイク付き同期待ち処理）を示す。
【００２７】
図３リスト（Ａ）はスレッドＡの抽象化コードである。スレッドＡは、タスク１、２、５を含んでおり、図３リスト（Ａ）では、これらのタスクが図３（１）のデータ依存関係にもとづいて順番に実行される。タスク１は、スレッドＢのタスク３へのデータ依存関係をもつので、タスク１の実行後にタスク１からタスク３へ同期処理（送信処理）を行う。 タスク３はスレッドＢの先頭タスク（各スレッドにおいて最初に実行されるタスク）であるので、タスク１からタスク３への同期処理（送信処理）はハンドシェイク付きである。 さらに、タスク１は、スレッドＣのタスク４へのデータ依存関係をもつので、タスク１の実行後にタスク１からタスク４へ同期処理（送信処理）を行う。タスク４はスレッドＣにおいて最初に実行されるタスクであるので、タスク１からタスク４への同期処理（送信処理）もハンドシェイク付きとなる。タスク５は、スレッドＢのタスク７へのデータ依存関係をもつので、タスク５の実行後にタスク５からタスク７へ同期処理（送信処理）を行う。タスク７はスレッドＢの先頭タスクではないので、タスク５からタスク７への同期処理（送信処理）はハンドシェイク無しである。
【００２８】
図３リスト（Ｂ）はスレッドＢの抽象化コードである。スレッドＢはタスク３、７、８を含んでおり、図３リスト（Ｂ）では、これらのタスクが図３（１）の依存関係にもとづいて順番に実行される。タスク３はスレッドＡのタスク１からデータ依存関係をもつので、タスク３の実行前にタスク１からタスク３へ同期処理（受信処理）を行う。タスク３はスレッドＢの先頭タスクであるので、タスク１からタスク３への同期処理（受信処理）はハンドシェイク付きである。そして、タスク７は、スレッドＡのタスク５およびスレッドＣのタスク６からのデータ依存関係をもつので、タスク７の実行前にタスク５からタスク７へ、およびタスク６からタスク７へ、同期処理（受信処理）を行う。タスク７はスレッドＢの先頭タスクではないので、タスク５からタスク７、およびタスク６からタスク７、 のどちらの同期処理（受信処理）もハンドシェイク無しである。
【００２９】
図３リスト（Ｃ）はスレッドＣの抽象化コードである。スレッドＣはタスク４、６を含んでおり、図３リスト（Ｃ）では、これらのタスクが図３（１）のデータ依存関係にもとづいて順番に実行される。タスク４はスレッドＡのタスク１からデータ依存関係をもつので、タスク４の実行前にタスク１からタスク４へ同期処理（受信処理）を行う。タスク４はスレッドＣの先頭タスクであるので、タスク１からタスク４への同期処理（受信処理）はハンドシェイク付きである。そして、タスク６は、スレッドＢのタスク７へデータ依存関係をもつので、タスク６の実行後にタスク６からタスク７へ同期処理（送信処理）を行う。タスク７はスレッドＢの先頭タスクではないので、タスク６からタスク７への同期処理（送信処理）はハンドシェイク無しである。 
【００３０】
図３リスト（Ａ）、（Ｂ）、（Ｃ）において、ハンドシェイク付き同期処理を行う際に，特願２０１０−２２９７８４に記載されているデータ領域切替方法を使ってもよい。このデータ領域切替方法は、ハンドシェイク付き同期処理を行う際に、データ領域番号を送信側スレッドから受信側スレッドへ通知し、受信側スレッドはその番号に対応するデータ領域のデータを使用する、というものである。データ領域番号とは、データを格納した領域を一意に識別する番号である。送信側スレッドは、前回に計算したデータと、今回に計算したデータとを、それぞれ異なる領域に格納して、同期処理でそれに応じたデータ領域番号を受信側スレッドに通知することで、より排他的なデータアクセスを保障することができる。
【００３１】
＜ハンドシェイク付き同期処理の効果＞ 
図３スレッドＡ、Ｂ、Ｃは、ハンドシェイク付き同期処理を行っているため、なんども繰り返して実行することが可能である。すなわち、スレッドＡはリスト（Ａ）で示す処理を繰り返し、スレッドＢはリスト（Ｂ）で示す処理を繰り返し、スレッドＣはリスト（Ｃ）で示す処理を繰り返す。
【００３２】
図４は、図３スレッドＡ、Ｂ、Ｃが繰返し動作する様子を表す図である。スレッドＢとＣは、それぞれの先頭タスクを実行する前に、スレッドＡからのハンドシェイク付き同期処理を行う。したがって、図４では、スレッドＡの動作開始後（厳密にはスレッドＡのタスク１の実行後）に、ハンドシェイク付き同期処理を行ってから、スレッドＢとスレッドＣが動作開始する。スレッドＢ及びスレッドＣは、その実行を終えた後に、次回のスレッドＡとのハンドシェイク付き同期処理を行うまで、待機することになる。また、スレッドＡは、その実行開始後に、スレッドＢ及びスレッドＣが前回の実行を終了してハンドシェイク付き同期処理を行うまで、待機することになる。そのため、以上のように、ハンドシェイク付き同期処理を行うことで、スレッドＡ、Ｂ、Ｃを繰返し実行しても、各スレッドの動作タイミングをそろえることができる。
【００３３】
一方、図５は、ハンドシェイク付き同期処理をハンドシェイク無し同期処理に置換えて、 図３スレッドＡ、Ｂ、Ｃを繰返し動作させる様子を表す図である。スレッドＡからスレッドＢとＣに対してハンドシェイク無し同期処理が毎回行われるが、スレッドＡはスレッドＢとＣとハンドシェイクせずに、次の動作をはじめる。すなわち、ハンドシェイク無し同期処理は、ハンドシェイク付き同期処理のように受信側（スレッドＢとＣ）が同期処理を行うまで待機することなく、その処理を終了する。言い換えると、ハンドシェイク無し同期処理は、受信側（スレッドＢとＣ）のみが、送信側（スレッドＡ）が同期処理を行うまで、待機することになる。
【００３４】
これを繰り返していくと、スレッドＡとスレッドＢの実行開始時刻の間隔が徐々にずれていく。このズレが蓄積すると、スレッドＡからスレッドＢへのハンドシェイク無し同期をスレッドＢが取りこぼす可能性がある。すなわち、スレッドＡとスレッドＢの実行開始時刻の間隔が徐々に大きくなり、やがて、スレッドＢの実行開始が間に合わなくなってしまう。したがって、ハンドシェイクを全く行わずに、図３スレッドＡ、Ｂ、Ｃを実行すると、同期ズレが発生する可能性がある。本実施形態におけるハンドシェイク付き同期処理は、このような同期ズレを防ぐ効果がある。
【００３５】
＜冗長なハンドシェイク無し同期処理の判定＞ 
つづいて、異なるスレッドに属するタスク間でのハンドシェイク無し同期処理のなかから、冗長なものを見つける方法について説明する。本実施形態は、図２のようにして、タスクのデータ依存関係グラフからスレッド依存関係グラフを導く。この過程で、冗長なハンドシェイク無し同期処理が発生する可能性がある。以降の説明では、ハンドシェイク無し同期処理を単に同期処理と記述する。
【００３６】
図６を使って、冗長な同期処理について説明する。図６（１）のグラフ構造では、タスク４からタスク７へ、タスク６からタスク７へ、それぞれ同期処理がある。タスク４とタスク６はどちらもスレッドＣに属しており、スレッドＣ内での実行順序は、タスク４、タスク６、の順番である。この場合、図６（１）に示すように、タスク４からタスク７への同期処理が冗長であり不要である。なぜなら、タスク４を実行した後にタスク６が実行され、その後にタスク６からタスク７への同期処理が行われるからである。タスク６の実行後には既にタスク４は実行完了しているため、タスク４からタスク７への同期処理をあえて行う必要はない。図６（２）は、タスク４からタスク７への同期処理を削除した後のグラフ構造である。このように、上述したステップＳ３では、このようにして冗長となる同期処理を削除した後のグラフ構造に従って、同期処理を追加するようにしてもよい。図６の冗長な同期処理の例を一般的に表現すると、あるデータ使用側タスクに対して、同じスレッドに属する複数のデータ供給側タスクからの同期処理がある場合には、当該複数データ供給側タスクのなかで最も後で実行されるデータ供給側タスクからの同期処理だけを残し、それ以外の当該複数データ供給側タスクからの同期処理を冗長と見なしてよい。
【００３７】
つづいて、図７を使って、別の冗長な同期処理について説明する。図７（１）のグラフ構造では、タスク６からタスク７へ、タスク６からタスク８へ、それぞれ同期処理がある。 タスク７とタスク８はどちらもスレッドＢに属しており、スレッドＢ内での実行順序は、タスク７、タスク８、の順番である。この場合、図７（１）に示すように、タスク６からタスク７への同期処理が冗長であり不要である。なぜなら、タスク６の実行後に、タスク６からタスク７へ同期処理が行われ、タスク８は必ずタスク７の後で実行されるからである。タスク８の実行前には、タスク６からタスク７への同期処理が行われているため、タスク６の実行完了を確認できおり、タスク６からタスク８への同期処理をあえて行う必要はない。図７（２）は、タスク６からタスク７への同期処理を削除した後のグラフ構造である。このように、上述したステップＳ３では、このようにして冗長となる同期処理を削除した後のグラフ構造に従って、同期処理を追加するようにしてもよい。図７の冗長な同期処理の例を一般的に表現すると、あるデータ供給側タスクから、同じスレッドに属する複数のデータ使用側タスクへの同期処理がある場合には、当該複数データ使用側タスクの中で最も先に実行されるデータ使用側タスクへの同期処理だけを残し、それ以外の当該複数データ使用側タスクへの同期処理を冗長と見なして良い。
【００３８】
＜ハンドシェイク付き同期処理の実施形態＞ 
本実施形態では、ハンドシェイク付き同期処理は、ハンドシェイク付き同期通知処理と、ハンドシェイク付き同期待ち処理の二つで構成される、と説明した。送信側タスクがハンドシェイク付き同期通知処理を、受信側タスクがハンドシェイク付き同期待ち処理を、それぞれ行う。送信側タスクは、ハンドシェイク付き同期通知処理において、同期することを示す信号（同期信号）を受信側タスクへ伝える。そして、受信側タスクは、ハンドシェイク付き同期待ち処理において、その同期信号が伝えられるまで待合せ、読取る。同期信号を受け取った受信側タスクは、ハンドシェイク付き同期待ち処理において、同期信号を受け取ったことを示す信号（確認信号）を送信側タスクへ伝える。最後に、送信側タスクは、ハンドシェイク付き同期通知処理において、その確認信号が伝えられるまで待合せ、読取る。このように、ハンドシェイク付き同期処理は、送信側から受信側へ同期信号を送り、受信側から送信側へ確認信号を送る。送信側と受信側との間でこのようなやり取りを行えば、それはハンドシェイク付き同期処理のひとつの実施形態となる。
【００３９】
ハンドシェイク付き同期処理を何度も繰り返す場合には、送信側における同期信号送信と確認信号受信の順番を逆にするような実施形態も可能である。つまり、送信側タスクにおいて、まず、前回受信側タスクが送信した確認信号を待合せて読取り、つづいて、同期信号を受信側タスクへ伝える。このようにすることにより、送信側タスクは、同期信号を受信側タスクへ伝えた後、すぐに、ハンドシェイク付き同期通知処理を終えることができるとともに、受信側タスクが同期信号を読取ってから確認信号を送信側タスクへ伝えるまでの時間に 送信側タスクが確認信号を待合せないので、送信側タスクが受信側タスクを待ち合わせる時間が減少すると考えられる。このように、送信側での確認信号の確認タイミングをずらした実装形態も可能である。
【００４０】
なお、ここでは、送信側タスク及び受信側タスクとして説明したが、厳密には、信号の送受信は、送信側タスクが割り当てられたスレッドと、受信側タスクが割り当てられたスレッドとの間で行われる。
【００４１】
上記で述べたハンドシェイク付き同期処理のいずれの実施形態であっても、本発明のタスク並列処理方法の実施形態に適用可能である。 
【００４２】
＜ハンドシェイク無し同期処理の実施形態＞ 
本実施形態では、ハンドシェイク無し同期処理は、ハンドシェイク無し同期通知処理と、ハンドシェイク無し同期待ち処理の二つで構成される、と説明した。送信側タスクがハンドシェイク無し同期通知処理を、受信側タスクがハンドシェイク無し同期待ち処理を、それぞれ行う。ハンドシェイク無し同期通知処理は、送信側タスクと受信側タスクがハンドシェイクを行なわずに、送信側タスクが単に変数に値をセットするような処理である。ハンドシェイク無し同期待ち処理は、当該変数に値がセットされるまで受信側タスクが待つ、という処理である。 
【００４３】
変数への値のセットのやり方にはいくつか方法がある。変数の値を０（リセット）と１（セット）とで表す方法、変数をカウンタとして使用することにより前回変数値との違いを認識し易くする方法、などがある。変数の値を０と１で表現する場合には、１にした変数を０に戻すリセット処理が必ず必要になる。一方、変数をカウンタとして使用する場合には、変数を０に戻すリセット処理が不要である。なぜなら、同期待ち処理において、前回の変数と今回の変数の値を計算し、変化していれば、当該変数に値がセットされた、と判断できるからである。つまり、変数をカウンタとして使う方が、リセット処理が不要な分だけ、負荷が小さいと考えられる。 
【００４４】
上記で述べたハンドシェイク無し同期処理のいずれの実施形態であっても、本発明のタスク並列処理方法の実施形態に適用可能である。
【００４５】
以上に説明したように、ハンドシェイク無し同期処理では、ハンドシェイク付き同期処理と比較して、受信側から送信側への同期通信が不要となる。それに対して、本実施の形態では、グループ内で最初に実行されるデータ使用側タスクのみに関して、同期待ち処理及び同期通知処理をハンドシェイク付きで行い、その他のデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク無しで行うようにしている。そのため、同期通信の数を削減することが可能となる。
【００４６】
＜タスク並列処理のためのシステム構成例＞
続いて、図８を参照して、上述した本発明の実施の形態のシステム構成例について説明する。図８は、本実施の形態にかかるタスク並列処理システム１の構成例を示す図である。
【００４７】
タスク並列処理システム１は、プログラム生成装置１０及びタスク並列処理装置２０を有する。プログラム生成装置１０は、プロセッサ１１、記憶装置１２、及びメモリ１３を有する。タスク並列処理装置２０は、プロセッサ２１〜２３、記憶装置２４、及びメモリ２５を有する。
【００４８】
プロセッサ１１は、コンパイラ１０１を実行する。記憶装置１２は、ソースプログラム３０１が格納される。メモリ１３は、プロセッサ１１がコンパイラ１０１を実行するために使用される。すなわち、メモリ１３には、コンパイラ１０１がロードされて、プロセッサ１１がそれを実行する。
【００４９】
コンパイラ１０１は、ソースプログラム３０１からコンパイルして目的プログラム３０２を生成するためのコードを含んだプログラムである。また、コンパイラ１０１は、図１を参照して説明したステップＳ１〜Ｓ４を実行するためのコードを含む。すなわち、プロセッサ１１は、コンパイラ１０１を実行することによって、上述したステップＳ１〜Ｓ４を実行して、ソースプログラム３０１から目的プログラム３０２（タスク並列ソフトウェア）を生成する。これによって、図３のリスト（Ａ）〜（Ｃ）で示す処理を実行するスレッドを含んだソフトウェア構成の目的プログラム３０２が生成される。
【００５０】
ソースプログラム３０１は、グループに分けられた複数のタスクにおける処理が記述されている。ここで、ソースプログラム３０１には、図２で示すタスク１〜８が記述されているものとする。すなわち、プロセッサ１１は、コンパイラ１０１を実行することによって、これら複数のタスク１〜８をそれぞれのグループ毎にスレッドに割り当てる。これによって、図３に示すように、タスク１、２、５が割り当てられたスレッドＡと、タスク３、７、８が割り当てられたスレッドＢと、タスク４、６が割り当てられたスレッドＣとを含む目的プログラム３０２が生成される。また、これらのスレッドＡ〜Ｃには、図３のリスト（Ａ）〜（Ｃ）で示すように、ハンドシェイク無し同期処理とハンドシェイク有り同期処理が設定される。
【００５１】
ここで、プロセッサ１１は、タスク間のデータ依存関係に従って、同期処理を設定することになるが、プロセッサ１１がタスク間のデータ依存関係を認識する方法は、どのようにして実現するようにしてもよい。例えば、記憶装置１２にデータ依存関係グラフを示す情報を予め格納しておき、プロセッサ１１がその情報を参照することによってタスク間のデータ依存関係を認識可能としてもよい。
【００５２】
このようにして生成された目的プログラム３０２は、タスク並列処理装置２０の記憶装置２４に格納される。これは、どのようにして実現してもよい。例えば、プログラム生成装置１０とタスク並列処理装置２０とを、インターネット、イントラネット、電話回線網等の任意の通信手段によって接続して、プロセッサ１１が通信手段を介してプログラム生成装置１０からタスク並列処理装置２０に目的プログラム３０２を送信して記憶装置２４に格納するようにしてもよい。また、プロセッサ１１がプログラム生成装置１０において、フロッピー（登録商標）ディスク、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、及びＵＳＢメモリ等の任意の記録媒体に格納して、ユーザがその記録媒体をプログラム生成装置１０から取り出してタスク並列処理装置２０に挿入し、プロセッサ２１〜２３のいずれかがその記録媒体から目的プログラム３０２を取得して記憶装置２４に格納するようにしてもよい。
【００５３】
プロセッサ２１〜２３は、記憶装置２４に格納された目的プログラム３０２を実行する。これによって、図３のリスト（Ａ）〜（Ｃ）で示す処理がプロセッサ２１〜２３によって実行される。なお、図８では、プロセッサ２１がスレッドＡを実行し、プロセッサ２２がスレッドＢを実行し、プロセッサ２３がスレッドＣを実行する場合について例示しているが、１つのプロセッサが実行するスレッドの数は、これに限られない。すなわち、１つのプロセッサが複数のスレッドを実行するようにしてもよい。例えば、タスク並列処理装置２０が１つのプロセッサを有するようにし、その１つのプロセッサでスレッドＡ〜Ｃを時分割で切り替えて並列的に実行するようにしてもよい。
【００５４】
記憶装置２４は、目的プログラム３０２が格納される。ここで、記憶装置１２、２４は、ハードディスク又はフラッシュメモリ等の任意の記憶装置である。メモリ２５は、プロセッサ２１〜２３が目的プログラム３０２を実行するために使用される。すなわち、メモリ２５には、目的プログラム３０２がロードされて、プロセッサ１１がそれを実行する。また、メモリ２５には、各タスク１〜９で、計算されたデータも格納される。すなわち、メモリ２５を介して、データ供給側タスクからデータ使用側タスクへのデータの受け渡しが行われる。
【００５５】
また、メモリ２５には、ハンドシェイク付き同期処理における同期信号の値及び確認信号の値、並びに、ハンドシェイク無し同期処理における変数が格納される。すなわち、上述した同期信号及び確認信号は、メモリ２５を介して、スレッド間で受け渡される。
【００５６】
＜タスク並列処理のためのシステムの概略構成＞
続いて、図９を参照して、上述したタスク並列処理システム１の概略構成について説明する。図９は、本実施の形態にかかるタスク並列処理システム１の概略構成を示す図である。
【００５７】
タスク並列処理システム９は、プログラム生成装置９１及びタスク並列処理装置９２を有する。プログラム生成装置９１は、グループ割当て部９１１、実行順序決定部９１２、及び、同期処理設定部９１３を有する。実行順序決定部９１２、及び、同期処理設定部９１３は、プロセッサ１１に対応する。タスク並列処理装置９２は、実行部９２１を有する。実行部９２１は、プロセッサ２１〜２３に対応する。
【００５８】
プログラム生成装置９１は、複数のスレッドを含むプログラム９００を生成する。プログラム９００は、目的プログラム３０２に対応する。グループ割当て部９１１は、データの計算を表す複数のタスクが分けられたいくつかのグループのうち、ひとつのグループをひとつのスレッドに割当てる。実行順序決定部９１２は、タスク間のデータ依存関係にもとづいて各グループに属するタスクの実行順序を決定する。
【００５９】
同期処理設定部９１３は、他グループのデータ供給側タスクからのデータ依存関係をもつデータ使用タスクが割当てられたスレッドにおいて、そのデータ使用タスクを実行する前に、他グループのデータ供給側タスクからの同期待ち処理を設定するとともに、他グループのデータ使用側タスクへのデータ依存関係をもつデータ供給側タスクが割当てられたスレッドにおいて、そのデータ供給側タスクを実行した後に、他グループのデータ使用側タスクへの同期通知処理を設定する。ここで、同期処理設定部９１３は、少なくともグループ内で最初に実行されるデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク付きで設定するとともに、その他のデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク無しで設定する。
【００６０】
タスク並列処理装置９２は、プログラム生成装置９１によって生成されたプログラム９００を実行する。すなわち、実行部９２１は、それぞれ、データの計算を表す複数のタスクが分けられたいくつかのグループのうち、ひとつのグループが割当てられ、その割当てられたグループに属するタスクをタスク間のデータ依存関係にもとづいた実行順序で実行する複数のスレッドを実行する。また、実行部９２１は、他グループのデータ供給側タスクからのデータ依存関係をもつデータ使用タスクが割当てられたスレッドにおいて、そのデータ使用タスクを実行する前に、他グループのデータ供給側タスクからの同期待ち処理を行うとともに、他グループのデータ使用側タスクへのデータ依存関係をもつデータ供給側タスクが割当てられたスレッドにおいて、そのデータ供給側を実行した後に、他グループのデータ使用側タスクへの同期通知処理を行う。また、実行部９２１は、少なくともグループ内で最初に実行されるデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク付きで行うとともに、その他のデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク無しで行う。
【００６１】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
【００６２】
本実施の形態では、グループ内で最初に実行されるデータ使用側タスクのみに関して、同期待ち処理及び同期通知処理をハンドシェイク付きで行い、その他のデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク無しで行うようにしているが、これに限られない。少なくともグループ内で最初に実行されるデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク付きで行い、その他のデータ使用側タスクに関する同期待ち処理及び同期通知処理をハンドシェイク無しで行うようにしてもよい。例えば、１グループ内に、ハンドシェイク付きで同期待ち処理又は同期通知処理を行うタスクが複数含まれていてもよい。そのようにしても、それ以外にハンドシェイク無しで同期待ち処理又は同期通知処理を行うタスクがあれば、その分、同期通信の数を削減することができるからである。
【００６３】
本実施の形態では、ステップＳ３でハンドシェイク無し同期処理を設定してから、ステップＳ４でグループ内で最初に実行されるタスクに関するハンドシェイク無し同期処理をハンドシェイク付き同期処理に置き換えるようにしているが、これに限られない。例えば、ステップＳ３でハンドシェイク付き同期処理を設定してから、ステップＳ４でグループ内で最初に実行されるタスク以外のタスクに関するハンドシェイク付き同期処理をハンドシェイク無し同期処理に置き換えるようにしてもよい。また、ステップＳ３でグループ内で最初に実行されるタスク以外のタスクに関してハンドシェイク無し同期処理を設定してから、ステップＳ４でグループ内で最初に実行されるタスクに関してハンドシェイク付き同期処理を設定するようにしてもよい。この場合、このステップＳ４と、このステップＳ３の順序を逆にして実行するようにしてもよい。
【００６４】
本実施の形態では、プログラム生成装置１０とタスク並列処理装置２０が異なる装置である場合について例示したが、これに限られない。すなわち、タスク並列処理ソフトウェアの生成及び実行を同一の装置で行うようにしてもよい。
【００６５】
本発明の実施の形態にかかるプログラム生成装置１０及びタスク並列処理装置２０は、上述したように本実施の形態の機能を実現するプログラム（コンパイラ１０１、目的プログラム３０２）を、コンピュータ（プログラム生成装置、タスク並列処理装置）が実行することによって、構成することが可能である。
【００６６】
また、このプログラムは、様々なタイプの非一時的なコンピュータ可読媒体（non-transitory computer readable medium）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（tangible storage medium）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Read Only Memory）、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Programmable ROM）、ＥＰＲＯＭ（Erasable PROM）、フラッシュＲＯＭ、ＲＡＭ（Random Access Memory））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（transitory computer readable medium）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００６７】
また、コンピュータが上述の実施の形態の機能を実現するプログラムを実行することにより、上述の実施の形態の機能が実現される場合だけでなく、このプログラムが、コンピュータ上で稼動しているＯＳ（Operating System）もしくはアプリケーションソフトウェアと共同して、上述の実施の形態の機能を実現する場合も、本発明の実施の形態に含まれる。さらに、このプログラムの処理の全てもしくは一部がコンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットによって行われて、上述の実施の形態の機能が実現される場合も、本発明の実施の形態に含まれる。
【産業上の利用可能性】
【００６８】
以上説明したように，本発明を使用すれば、いくつかのグループに分かれた複数のタスクで構成されるデータ依存関係グラフにもとづいて、グループごとにタスクを並列処理する際に、異なるグループに属するタスク間の高負荷な同期通信の数を減らすことができる。本発明は、組込み向けのマルチプロセッサから汎用のマルチコアＰＣ（Personal Computer）など、複数のスレッドが動作するような計算機で幅広く応用可能である。
【符号の説明】
【００６９】
１、９        タスク並列処理システム
１０、９１    プログラム生成装置
１１、２１、２２、２３    プロセッサ
１２、２４    記憶装置
１３、２５    メモリ
２０、９２    タスク並列処理装置
１０１        コンパイラ
２０１、２０２、２０３    スレッド
３０１        ソースプログラム
３０２        目的プログラム
９００        プログラム
９１１        グループ割当て部
９１２        実行順序決定部
９１３        同期処理設定部
９２１        実行部
【図１】
0005857698.tif 000002
【図２】
0005857698.tif 000003
【図３】
0005857698.tif 000004
【図４】
0005857698.tif 000005
【図５】
0005857698.tif 000006
【図６】
0005857698.tif 000007
【図７】
0005857698.tif 000008
【図８】
0005857698.tif 000009
【図９】
0005857698.tif 000010