(57)【特許請求の範囲】
【請求項１】
複数のタスクが相互に通信しながら同時に動作するように構成したタスクセットにおいてタスク間の通信を行うタスク通信方法であって、
前記タスクが受信処理の後に送信処理を行うように構成し、
前記タスクセットを構成する複数のタスクのうち、少なくとも二つのタスクの間にイタレーション間データ依存関係が存在し、
なおかつ、前記タスクセットの前記イタレーション間データ依存関係を無視して得られる非循環有向グラフをトポロジカルソートして得られる順序番号を前記タスクに付与し、
前記タスクは、当該タスクへ入力データを供給するデータ供給タスクを、イタレーション間データ依存関係をもつ第一グループと、それ以外の第二グループとに分け、まず第一グループの前記データ供給タスクから、次に第二グループの前記データ供給タスクから、そしてグループ内では前記データ供給タスクに付与された前記順序番号の順番にしたがって、前記データ供給タスクから１対１同期受信を行い、
かつ、前記タスクは、当該タスクの出力データを使用するデータ使用タスクを、イタレーション間データ依存関係をもつ第三グループと、それ以外の第四グループとに分け、まず第三グループの前記データ使用タスクへ、次に第四グループの前記データ使用タスクへ、そしてグループ内では前記データ使用タスクに付与された前記順序番号の順番にしたがって、前記データ使用タスクへ１対１同期送信を行う、
ことを特徴とするタスク通信方法。
【請求項２】
複数のタスクが相互に通信しながら同時に動作するように構成したタスクセットにおいてタスク間の通信を行う情報処理装置であって、
前記タスクが受信処理の後に送信処理を行うように構成し、
なおかつ、前記タスクセットを表す非循環有向グラフをトポロジカルソートして得られる順序番号を前記タスクに付与する手段を備え、
前記タスクは、当該タスクへ入力データを供給するデータ供給タスクに付与された前記順序番号の順番にしたがって、前記データ供給タスクから１対１同期受信を行う手段を備え、
かつ、前記タスクは、当該タスクの出力データを使用するデータ使用タスクに付与された前記順序番号の順番にしたがって、前記データ使用タスクへ１対１同期送信を行う手段を備え、
前記タスクセットを構成する複数のタスクのうち、少なくとも二つのタスクの間にイタレーション間データ依存関係が存在し、
前記順序番号を前記各タスクに付与する前記手段は、前記イタレーション間データ依存関係を無視して得られる非循環有向グラフをトポロジカルソートすることによって、前記順序番号を得て、前記タスクに付与する動作を行い、
さらに、前記データ供給タスクから１対１同期受信を行う前記手段は、前記タスクに関し、当該タスクへ入力データを供給するデータ供給タスクを、イタレーション間データ依存関係をもつ第一グループと、それ以外の第二グループとに分け、まず第一グループの前記データ供給タスクから、次に第二グループの前記データ供給タスクから、そしてグループ内では前記データ供給タスクに付与された前記順序番号にしたがって、前記データ供給タスクから１対１同期受信を行わせ、
かつ、前記データ使用タスクへ１対１同期送信を行う前記手段は、前記タスクに関し、当該タスクの出力データを使用するデータ使用タスクを、イタレーション間データ依存関係をもつ第三グループと、それ以外の第四グループとに分け、まず第三グループの前記データ使用タスクへ、次に第四グループの前記データ使用タスクへ、そしてグループ内では前記データ使用タスクに付与された前記順序番号にしたがって、前記データ使用タスクへ１対１同期送信を行わせる
ことを特徴とする情報処理装置。
【請求項３】
複数のタスクが相互に通信しながら同時に動作するように構成したタスクセットにおいてタスク間の通信を行うタスク通信方法をコンピュータによって実行可能なプログラムとして実施するタスク通信プログラムであって、
前記タスクが受信処理の後に送信処理を行うように構成し、
なおかつ、前記タスクセットを表す非循環有向グラフをトポロジカルソートして得られる順序番号を前記タスクに付与するステップを有し、
前記タスクは、当該タスクへ入力データを供給するデータ供給タスクに付与された前記順序番号の順番にしたがって、前記データ供給タスクから１対１同期受信を行うステップを有し、
かつ、前記タスクは、当該タスクの出力データを使用するデータ使用タスクに付与された前記順序番号の順番にしたがって、前記データ使用タスクへ１対１同期送信を行うステップを有し、
前記タスクセットを構成する複数のタスクのうち、少なくとも二つのタスクの間にイタレーション間データ依存関係が存在し、
前記順序番号を前記各タスクに付与する前記ステップは、前記イタレーション間データ依存関係を無視して得られる非循環有向グラフを前記トポロジカルソートすることによって、前記順序番号を得て、前記タスクに付与する動作を行い、
さらに、前記データ供給タスクから１対１同期受信を行う前記ステップは、前記タスクに関し、当該タスクへ入力データを供給するデータ供給タスクを、イタレーション間データ依存関係をもつ第一グループと、それ以外の第二グループとに分け、まず第一グループの前記データ供給タスクから、次に第二グループの前記データ供給タスクから、そしてグループ内では前記データ供給タスクに付与された前記順序番号にしたがって、前記データ供給タスクから１対１同期受信を行わせ、
かつ、前記データ使用タスクへ１対１同期送信を行う前記ステップは、前記タスクに関し、当該タスクの出力データを使用するデータ使用タスクを、イタレーション間データ依存関係をもつ第三グループと、それ以外の第四グループとに分け、まず第三グループの前記データ使用タスクへ、次に第四グループの前記データ使用タスクへ、そしてグループ内では前記データ使用タスクに付与された前記順序番号にしたがって、前記データ使用タスクへ１対１同期送信を行わせる
ことを特徴とするタスク通信プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、タスク通信方法、情報処理装置およびタスク通信プログラムに関し、特に、複数のタスクが通信を行いながら処理を実行するように構成されたソフトウェアにおいて、タスク間の通信を１対１同期通信で行う場合のタスク通信方法、情報処理装置およびタスク通信プログラムに関する。
【背景技術】
【０００２】
本出願人は、先に、複数のタスクそれぞれを同時並行的に実行する方法として、特願２０１０−２２９７８４号「データ処理方法、データ処理装置及び、データ処理プログラム」に記載した処理方法を提案している。該処理方法は、タスクそれぞれを同時並行的に動作させ、データの供給側と使用側というデータ依存関係に基づいて、タスクがハンドシェイク型の同期通信を行うことにより、タスク内の計算を実行する、というパイプライン的な並列データ処理方法を採用している。
【０００３】
より具体的には、データ供給タスクにおけるデータの計算後に、データ供給タスクが割り当てられたスレッドと、データ使用タスクが割り当てられたスレッドとの間で、ハンドシェイク型の同期通信を行うことによって、ロック／アンロックをすることなく、排他的なデータアクセスを行うことを可能にするようにしている。
【０００４】
かくのごとき並列データ処理方法において、タスクそれぞれは、同時並行的に動作する小規模プログラムである。この小規模プログラムの具体的な例としては、例えば、ＬｉｎｕｘにおけるスレッドあるいはＲＴＯＳ(Real Time Operating  System)におけるタスク等、が挙げられる。 
【０００５】
複数のタスクが通信を行いながら処理を実行するように構成されたソフトウェアにおいては、或る一つのタスクと他の一つのタスクとが通信する１対１の通信を行う以外に、タスクとして多対１や１対多の通信を行うことがある。 例えば、ＣＳＰ（Communicating  Sequential  Processes）理論に基づいた並列処理は、複数のタスクが通信を行ないながら処理を同時に実行するように構成された並列処理の一つである。
【０００６】
このような複数のタスクとタスク間の通信とによって構成された並列処理を特定の実行環境に実装する場合に、実行環境如何によっては、多対１や１対多の通信手段が提供されていなかったり、提供される通信手段の仕様が所望の仕様と異なっているために利用することができなかったり、 あるいは、利用することができたとしても効率が悪かったり、といったことが発生する可能性がある。
【０００７】
多対１や１対多の通信ＡＰＩ（Application  Programming  Interface）を利用できない実行環境においては、多くの実行環境で利用可能と考えられる１対１通信ＡＰＩのみを用いて全てのタスク間通信を行うことになる。 ところが、１対１通信ＡＰＩを使って多対１や１対多の通信を表現しようとすると、場合によっては、デッドロックが発生する可能性がある。 
【０００８】
例えば、図１０に示す４個のタスクＡ、Ｂ、Ｃ、Ｄによる計算を行う場合を考える。図１０は、通信を行いながら同時に動作する４個のタスクＡ、Ｂ、Ｃ、Ｄで構成されたタスクセットにおいて、デッドロックが発生する１対１同期通信の送受信順序を説明するための説明図である。図１０の例において、これらのタスクが、Ａ→Ｂ、Ｂ→Ｄ、Ａ→Ｄ、Ａ→Ｃ、Ｃ→Ｄ、という通信を行うものと仮定する。また、タスクＡ、Ｂ、Ｃ、Ｄの各タスクは、（１）受信処理、（２）計算、（３）送信処理、を繰り返すものとする。さらに、全てのタスク間通信を同期通信（送信処理も受信処理も相手側を待ち合わせる）で行うものとする。
【０００９】
例えば、１対１同期通信のみが可能な状態において、図１０に示すように、タスクＡの送信順序を、
（ａ１）タスクＢと１対１同期通信
（ａ２）タスクＤと１対１同期通信
（ａ３）タスクＣと１対１同期通信
と決めて、タスクＤの受信順序を、
（ｄ１）タスクＣと１対１同期通信
（ｄ２）タスクＡと１対１同期通信
（ｄ３）タスクＢと１対１同期通信
と決めたとする。
【００１０】
かくのごとき通信順序で、タスク間の通信を１対１同期通信で行う場合には、デッドロックが発生する。すなわち、前述のように、タスクＡは、（ａ１）タスクＢ、（ａ２）タスクＤ、（ａ３）タスクＣ、の順で、タスクＤは、（ｄ１）タスクＣ、（ｄ２）タスクＡ、（ｄ３）タスクＢ、の順で１対１同期通信を行うと、図１１に示すように、 タスクＢへの通信を完了した後のタスクＡは、（ａ２）の時点でタスクＤの受信状態への移行を待ち続け、一方、タスクＤは（ｄ１）の時点でタスクＣからの送信を待ち続け、さらに、タスクＣはタスクＡからの送信を待ち続ける、という状態になり、デッドロックに陥る。図１１は、図１０のタスクセットにおいてタスク間通信のデッドロックが発生する様子を説明するための説明図である。
【００１１】
図１１の実線矢印は、タスク間の同期通信が成功した場合を示しているが、破線矢印は、デッドロックに陥った通信を表している。同期通信がデッドロックに陥った原因は、各タスクの受信処理や送信処理において、不適切な順番で１対１同期通信を使ったためである。デッドロック回避対策として、特許文献１の特開平６−８５８４１号公報「通信制御装置」のように、たとえ、各通信データを一時的に保存する通信用のバッファメモリを備えたとしても、図１０に示した不適切な順番で１対１同期通信が繰り返されると、通信用のバッファメモリのオーバフローが発生し、デッドロックに陥る事態を完全には防ぐことはできない。ただし、もし、多対１および１対多同期通信ＡＰＩを使うことが可能であれば、不適切な順番に陥ることはなく、デッドロックの発生を防止することが可能になる。
【００１２】
あるいは、全てのタスク間通信を、非同期通信（送信処理は受信処理を待ち合わせない、一方、受信処理は送信処理を待ち合わせる通信）を用いて行うならば、 どんな順番で１対１非同期通信ＡＰＩを使っても、デッドロックを発生させないようにすることが可能になる。ただし、非同期通信を行う場合にはタスク間の同期制御上の別の問題（適切な通信バッファメモリ等の実装および管理等）を対策することが必要になる。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開平６−８５８４１号公報（第３−５頁）
【発明の開示】
【発明が解決しようとする課題】
【００１４】
以上説明したように、 複数のタスクと同期通信とによって構成された処理において、多対１や１対多の同期通信を１対１同期通信で代用せざるを得ない場合には、各タスク内の不適切な通信順序が原因となり、タスク間通信のデッドロックが発生する可能性がある、という課題がある。 
【００１５】
（本発明の目的）
本発明は、かかる事情に鑑みてなされたものであり、複数のタスクと同期通信とによって構成された処理におけるタスク間同期通信にデッドロックを発生させずに１対１同期通信ＡＰＩを用いることが可能なタスク通信方法、情報処理装置およびタスク通信プログラムを提供することを、その目的としている。 
【課題を解決するための手段】
【００１６】
前述の課題を解決するため、本発明によるタスク通信方法、情報処理装置およびタスク通信プログラムは、主に、次のような特徴的な構成を採用している。
【００１７】
（１）本発明によるタスク通信方法は、複数のタスクが相互に通信しながら同時に動作するように構成したタスクセットにおいてタスク間の通信を行うタスク通信方法であって、前記タスクが受信処理の後に送信処理を行うように構成し、なおかつ、前記タスクセットを表す非循環有向グラフにおいて前記タスクの順序を決定する手法であるトポロジカルソート（Topological  Sort）の結果に基づいて得られる順序番号を前記タスクに付与し、前記タスクは、当該タスクへ入力データを供給するデータ供給タスクに付与された前記順序番号の順番にしたがって、前記データ供給タスクから１対１同期受信を行い、かつ、前記タスクは、当該タスクの出力データを使用するデータ使用タスクに付与された前記順序番号の順番にしたがって、前記データ使用タスクへ１対１同期送信を行うことを特徴とする。
【００１８】
（２）本発明による情報処理装置は、複数のタスクが相互に通信しながら同時に動作するように構成したタスクセットにおいてタスク間の通信を行う情報処理装置であって、前記タスクが受信処理の後に送信処理を行うように構成し、なおかつ、前記タスクセットを表す非循環有向グラフにおいて各前記タスクの順序を決定する手法であるトポロジカルソート（Topological  Sort）の結果に基づいて得られる順序番号を前記各タスクに付与する手段を備え、前記タスクは、当該タスクへ入力データを供給するデータ供給タスクに付与された前記順序番号の順番にしたがって、前記データ供給タスクから１対１同期受信を行う手段を備え、かつ、前記タスクは、当該タスクの出力データを使用するデータ使用タスクに付与された前記順序番号の順番にしたがって、前記データ使用タスクへ１対１同期送信を行う手段を備えていることを特徴とする。
【００１９】
（３）本発明によるタスク通信プログラムは、複数のタスクが相互に通信しながら同時に動作するように構成したタスクセットにおいてタスク間の通信を行うタスク通信方法をコンピュータによって実行可能なプログラムとして実施するタスク通信プログラムであって、前記タスクが受信処理の後で送信処理を行うように構成し、なおかつ、前記タスクセットを表す非循環有向グラフにおいて各前記タスクの順序を決定する手法であるトポロジカルソート（Topological  Sort）の結果に基づいて得られる順序番号を前記各タスクに付与するステップを有し、前記タスクは、当該タスクへ入力データを供給するデータ供給タスクに付与された前記順序番号の順番にしたがって、前記データ供給タスクから１対１同期受信を行うステップを有し、かつ、各前記タスクは、当該タスクの出力データを使用するデータ使用タスクに付与された前記順序番号の順番にしたがって、前記データ使用タスクへ１対１同期送信を行うステップを有していることを特徴とする。
【発明の効果】
【００２０】
本発明のタスク通信方法、情報処理装置およびタスク通信プログラムによれば、以下のような効果を奏することができる。
【００２１】
すなわち、本発明においては、複数のタスクからなるタスクセットを、各タスクが相互に通信しながら同時に動作するように構成し、かつ、各タスクが受信処理の後で送信処理を行うように構成し、なおかつ、該タスクセットを表す非循環有向グラフの各ノードの実行順序を決定する手法であるトポロジカルソート（Topological  Sort）の結果に基づいた順序にしたがって順序付けられた１対１同期通信ＡＰＩ（Application  Programming  Interface）によって、各タスクにおける複数タスクからの受信処理および複数タスクへの送信処理を実施する仕組みを採用しており、該トポロジカルソートで得られる順序は、非循環有向グラフで表されたタスクを逐次的に実行する際の適切な実行順序を表すものとなっている。
【００２２】
したがって、複数のタスクとタスク間同期通信とによって構成された処理において、タスクが受信処理の後で送信処理を行うようにし、かつ、各タスクにおける多対１あるいは１対多の同期通信をトポロジカルソートによって決定された順序の１対１同期通信で置き換えることにより、多対１や１対多の同期通信が必要な状況下に対して１対１同期通信ＡＰＩを適用した場合であっても、各タスク内の不適切な通信順序が原因になってデッドロックを引き起こすことを確実に防止することができる。つまり、複数のタスクとタスク間同期通信とによって構成された処理を、多対１や１対多の通信ＡＰＩが利用可能でない環境下で実行する場合に、各タスクにおける多対１あるいは１対多の同期通信をトポロジカルソートによって決定された順序の１対１同期通信で置き換えることにより、デッドロックを発生させることがない１対１同期通信ＡＰＩを各タスク間通信に適用することができる。
【図面の簡単な説明】
【００２３】
【図１】本発明の模範的な実施形態におけるタスクの動作を説明する説明図である。
【図２】本発明の第一の実施形態のタスク通信方法を示すフローチャートである。
【図３】非循環有向グラフによって表現されたタスクセットの一例を示す図である。
【図４】図３に例示したタスクセットをトポロジカルソートした結果の一例を示す図である。
【図５】図３に例示したタスクセットのタスク間の通信順序を説明する説明図である。
【図６】本発明の第二の実施形態のタスク通信方法を示すフローチャートである。
【図７】イタレーション間データ依存関係を有するタスクセットの一例を示す図である。
【図８】図７に例示したタスクセットを、破線エッジ（イタレーション間データ依存関係）を無視してトポロジカルソートした結果の一例を示す図である。
【図９】図７に例示したタスクセットのタスク間の通信順序を説明する説明図である。
【図１０】通信を行いながら同時に動作する４個のタスクＡ、Ｂ、Ｃ、Ｄで構成されたタスクセットにおいて、デッドロックが発生する１対１同期通信の送受信順序を説明するための説明図である。
【図１１】図１０のタスクセットにおいてタスク間通信のデッドロックが発生する様子を説明するための説明図である。
【発明を実施するための形態】
【００２４】
以下、本発明によるタスク通信方法、情報処理装置およびタスク通信プログラムの好適な実施形態について添付図を参照して説明する。なお、以下の説明においては、本発明によるタスク通信方法について説明するが、かかるタスク通信方法を実施する手段を備えた情報処理装置として実現するようにしても良いし、また、かかるタスク通信方法をコンピュータにより実行可能なタスク通信プログラムとして実施するようにしても良いし、あるいは、タスク通信プログラムをコンピュータにより読み取り可能な記録媒体に記録するようにしても良いことは言うまでもない。
【００２５】
（本発明の特徴）
本発明の実施形態の説明に先立って、本発明の特徴についてその概要をまず説明する。本発明は、タスク間の通信において、受信処理の後で送信処理を行うという順序則と非循環有向グラフにおけるトポロジカルソート（Topological  Sort）による順序則とを組み合せることによって、従来技術において１対１同期通信にて発生する可能性があったデッドロックの発生を確実に回避し、高信頼のタスク通信の仕組みを実現することを主要な特徴としている。
【００２６】
つまり、複数のタスクからなるタスクセットを、各タスクが相互に同期通信しながら同時に動作するように構成し、かつ、タスクが受信処理の後で送信処理を行うように構成し、なおかつ、トポロジカルソートによって得られる順序番号を各タスクに付与して、各タスクは、当該タスクへ入力データを供給するデータ供給タスクに付与された前記順序番号の順番にしたがって、前記データ供給タスクから１対１同期受信を行い、かつ、各タスクは、当該タスクの出力データを使用するデータ使用タスクに付与された前記順序番号の順番にしたがって、前記データ使用タスクへ１対１同期送信を行うことを、主要な特徴としている。而して、複数のタスクと同期通信とによって構成された処理において、デッドロックを発生させことなくタスク間通信に１対１同期通信ＡＰＩを適用することができる。
【００２７】
さらに、本発明は、少なくとも二つのタスクの間にイタレーション（iteration）間データ依存関係が存在するような複数のタスクからなるタスクセットによって構成されている場合についても、以下のような仕組みを採用することによって、デッドロックを発生させことなく各タスク間通信に１対１同期通信ＡＰＩを適用することができる。イタレーションとは、タスクセット全体の一回分の実行を表す。イタレーション間データ依存関係とは、第Ｎ回目のタスクセットの実行と（Ｎは整数）、第（Ｎ＋１）回目のタスクセットの実行との間のデータ依存関係を表す。
【００２８】
すなわち、複数のタスクからなるタスクセットにおいて少なくとも二つのタスクの間にイタレーション（iteration）間データ依存関係が存在する場合には、当該複数のタスクからなるタスクセットを、各タスクが相互に同期通信しながら同時に動作するように構成し、かつ、タスクが受信処理の後で送信処理を行うように構成し、なおかつ、前記タスクセットからイタレーション間データ依存関係を除いたタスクセットを表す非循環有向グラフに対するトポロジカルソートによって得られる順序番号を各タスクにあらかじめ付与する。
【００２９】
さらに、各タスクについて、当該タスクへ入力データを供給するタスク（データ供給タスク）を、イタレーション間データ依存関係に対応する第一のグループと、それ以外の第二のグループとに分ける。そして、各タスクは、まず、第一のグループのタスク（データ供給タスク）からの受信を優先して、その後に、第二のグループのタスク（データ供給タスク）からの受信を行う順序として、それぞれのグループ内においては、付与された前記順序番号の順番にしたがって、それぞれ１対１同期受信を行う。
【００３０】
さらに、各タスクについて、当該タスクの出力データを使用するタスク（データ使用タスク）を、イタレーション間データ依存関係に対応する第三のグループと、それ以外の第四のグループとに分ける。そして、各タスクは、まず、第三のグループのタスク（データ使用タスク）への送信を優先して、その後に、第四のグループのタスク（データ使用タスク）への送信を行う順序として、それぞれのグループ内においては、付与された前記順序番号の順番にしたがって、それぞれ１対１同期送信を行う。
【００３１】
（本発明の実施形態）
次に、本発明の実施形態について説明する。
【００３２】
＜本発明が対象とする並列処理モデル＞
まず、本発明の模範的な実施形態における並列処理の概念について説明する。 本発明の実施形態が対象とする並列処理は、何らかの計算を行う複数のタスクが同時並行的に動作し、なおかつ、データ依存関係を有するタスク同士が同期通信を行うことによって、複数のタスクの実行タイミングを調整する。
【００３３】
ここで、データ依存関係とは、タスクが使用するデータに関するデータ供給タスクとデータ使用タスクとの間の依存関係のことを意味している。例えば、タスクＴ１の計算結果のデータＲ１をタスクＴ２が使用する場合には、タスクＴ１からタスクＴ２に対してデータ依存関係が存在する。 この場合、データＲ１に関して、タスクＴ１はデータ供給タスクであり、タスクＴ２はデータ使用タスクである。タスクＴ１からタスクＴ２に対してデータ依存関係が存在する場合には、タスクＴ２はタスクＴ１の後で実行されなければならない。
【００３４】
本発明が対象とする並列処理モデルにおいては、 各タスクは、Ｗｉｎｄｏｗｓ（商標）やＬｉｎｕｘ（商標）等のオペレーティングシステムにおけるスレッド、 あるいは、リアルタイムオペレーティングシステム（ＲＴＯＳ）におけるタスクといったプログラムのことである。 複数のタスクは、同時並行的に動作し、タスクの内部の処理や計算は逐次的に実行される。つまり、各タスク（各ノード）は、図１（Ａ）に示すように、その内部において、受信処理の後で送信処理を行うように構成され、以下の（１）〜（３）の三つの処理を繰り返す。図１は、本発明の模範的な実施形態におけるタスクの動作を説明する説明図である。
（１）受信： 入力データの計算完了を待つ。
（２）計算： タスクの計算を実行する。
（３）送信：出力データの計算完了を通知する。
【００３５】
タスクは、図１（Ｂ）の矢印に示すように、１ないし複数のタスクからのデータを必要とする場合、はじめに、（１）受信状態において、当該タスクが必要とする入力データが計算完了の状態になるまで待つ。 次いで、タスクは、当該タスクへ入力データを供給する全てのデータ供給タスクからの計算完了通知を受信することによって、当該タスクの入力データが計算完了の状態になっているものと判断する。計算完了通知は、データ供給タスクが計算を完了したことを表す通知であれば良く、通知の中に計算結果あるいは計算結果の格納場所を表すポインタを含んでいても良いし、他に、通信の宛先や発信元の情報を含んでいても良い。
【００３６】
続いて、全てのデータ供給タスクからの計算完了通知を受信したタスクは、（２）計算状態において、計算を実行する。この計算により、当該タスクの出力データが作成される。そして、タスクは、（３）送信状態において、計算完了通知を送信することにより、出力データの計算が完了したことを当該出力データを使用する全てのデータ使用タスクに対して通知する。
【００３７】
以上の処理を繰り返すことにより、複数のタスクによる並列処理が行われる。 なお、前述の（１）受信状態において、「タスクの計算を終了せよ」というメッセージを受信した場合には、タスクを終了させるようにしても良い。 
【００３８】
＜トポロジカルソート（Topological  Sort）について＞
次に、本発明において重要な概念であるトポロジカルソートについて説明する。 トポロジカルソートとは、非循環有向グラフ（Directed  Acyclic  Graph、ＤＡＧ)のノード（タスク）とエッジ（データなど何らかの依存関係）との関係に基づいて、各ノード（タスク）の順序付けを行うものであり、順序付けとして、どのノード（タスク）もその出力エッジの先のノード（タスク）よりも前に位置するように並べ替えることである。例えば、トポロジカルソートの典型的な利用例としては、タスクのスケジューリングや、コンパイラにおける命令スケジューリング等がある。
【００３９】
つまり、データ依存関係を有する複数のタスクからなるタスクセットを非循環有向グラフによって表現し、該非循環有向グラフをトポロジカルソートすることによって、 タスクを実行すべき順序を判別することが可能になる。なお、トポロジカルソートで得られる順序は、一つだけとは限らず、複数の正しい順序が存在し得る。トポロジカルソートの結果に基づいて、タスク間（ノード間）の１対１同期通信の実行順序を決定することにより、各タスク（ノード）は、デッドロックを確実に回避可能しながらタスク間同期通信を行うことができる。
【００４０】
＜第一の実施形態＞
次に、本発明のタスク通信方法の第一の模範的な実施形態について、図２のフローチャートを用いて説明する。図２は、本発明の第一の実施形態のタスク通信方法を示すフローチャートである。第一の実施形態のタスク通信方法は、複数のタスクからなるタスクセットにおけるタスク間の多対１および１対多の通信を、トポロジカルソートによってあらかじめ得られている順序に基づいて、複数の１対１同期通信にて行う場合を示している。
【００４１】
図２のフローチャートにおいて、第一の実施形態が扱うタスクセットは、事前に、トポロジカルソートされて、各タスクにトポロジカルソートの順序番号が付与されている（ステップＳ０）。順序番号があらかじめ付与された各タスクは、図１に示したように、まず、（１）受信状態において当該タスクへ入力データを供給する全てのデータ供給タスクの計算完了通知を受信した後（ステップＳ１）、（２）計算において全てのデータ供給タスクからの入力データを用いた計算を実施し（ステップＳ２）、しかる後に、（３）送信状態において全てのデータ使用タスクに対して出力データの計算完了通知を送信する（ステップＳ３）という三つの処理を繰り返す。
【００４２】
ステップＳ０において事前にトポロジカルソートによって当該タスクに付与されている順序番号にしたがって通信を行うのは、ステップＳ１の（１）受信とステップＳ３の（３）送信の処理である。
【００４３】
ステップＳ１の（１）受信状態においては、非循環有向グラフで表現されたタスクセットの中において、各タスクは、前述のように、データ供給タスクから計算完了通知を受信する。もし、或るタスクが入力エッジを有していない場合であれば、当該タスクにはデータ供給タスクは存在していないので、当該タスクはステップＳ１の（１）受信状態においては何もしないで、次のステップＳ２の（２）計算処理へ進む。
【００４４】
これに対して、もし、タスクが入力エッジを一つ以上有している場合であれば、当該タスクは、各入力エッジにつながるデータ供給タスクから、タスクセットをトポロジカルソートして得られた順序に基づいて、計算完了通知を１対１同期通信によって受信する。具体的には、ステップＳ０において、事前に、タスクセットをトポロジカルソートして、各タスクにトポロジカルソートの順序番号を付与しておき、ステップＳ１の（１）受信状態において、各タスクは、データ供給タスクのトポロジカルソートの順序番号が小さい方から順番に、１対１同期通信により計算完了通知を受信する。
【００４５】
一方、ステップＳ３の（３）送信状態においては、各タスクは、前述のように、データ使用タスクに対して計算完了通知を送信する。もし、或るタスクが出力エッジを有していない場合であれば、当該タスクにはデータ使用タスクは存在していないので、当該タスクはステップＳ３の（３）送信状態においては何もしないで、ステップＳ１に復帰して、再び、次のイタレーション（反復動作）の（１）受信状態に戻る。
【００４６】
これに対して、もし、タスクが出力エッジを一つ以上有している場合であれば、当該タスクは、各出力エッジにつながるデータ使用タスクに対して、タスクセットをトポロジカルソートして得られた順序に基づいて、計算完了通知を１対１同期通信によって送信する。具体的には、ステップＳ０において、事前に、タスクセットをトポロジカルソートして、各タスクにトポロジカルソートの順序番号を付与しておき、ステップＳ３の（３）送信状態において、各タスクは、データ使用タスクのトポロジカルソートの順序番号が小さい方から順番に、１対１同期通信により計算完了通知を送信する。
【００４７】
＜第一の実施形態の具体的動作＞
次に、図２に示した第一の実施形態のタスク通信方法の通信に関する具体的な動作について図面を参照しながらさらに詳細に説明する。図３は、非循環有向グラフ（ＤＡＧ）によって表現されたタスクセットの一例を示す図であり、タスクセットが６個のタスクＡ〜Ｆからなっている場合について例示している。ここで、図３に一例を示すタスクセットにおいて、丸で囲まれたノードはそれぞれタスクＡ〜Ｆを示し、矢印付きの実線でノード間を結ぶエッジは、タスク間のデータ依存関係を示している。
【００４８】
まず、タスクセットのトポロジカルソートおよびタスクへの順序番号の付与に関する処理について説明する。これらの処理は、図２において説明したように、タスクセットに対して事前に行う処理である。図３のタスクセットをトポロジカルソートした結果を、図４に示している。つまり、図４は、図３に例示したタスクセットをトポロジカルソートした結果の一例を示す図である。なお、丸で囲まれたノード（タスク）間を結んでいる矢印付きの実線は、タスク間のデータ依存関係を示すエッジであり、図３における矢印付きの実線と同じ状態にある。
【００４９】
図４の各ノード内の括弧付きの数字（１）〜（６）の順序番号によって示しているように、図４に例示したタスクセットのトポロジカルソートの結果として、タスクＡ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆという順序が得られる。得られた順序にしたがって、各タスクＡ〜Ｆに対してトポロジカルソートの順序番号を付与する。つまり、図４に示すように、順序番号として、タスクＡに（１）を、タスクＢに（２）を、タスクＣに（３）を、タスクＤに（４）を、タスクＥに（５）を、タスクＦに（６）を、それぞれ付与する。
【００５０】
続いて、図５を用いて、各タスクの（１）受信状態および（３）送信状態における各タスク間の１対１同期通信時の通信順序について説明する。図５は、図３に例示したタスクセットのタスク間の通信順序を説明する説明図である。
【００５１】
タスクＡは、図３に示したように、入力エッジを一つも有していないが、出力エッジを三つ有している。また、タスクＡの三つの出力エッジは、図３に示したように、タスクＣ、Ｄ、Ｅにそれぞれつながっている。一方、図４に説明したように、タスクＣ、Ｄ、Ｅのトポロジカルソートの順序番号は、それぞれ、３、４、５である。したがって、図５（Ａ）に示すように、タスクＡが（３）送信状態において１対１同期通信により送信処理を行う順番は、（ａ１）タスクＣに対する送信、（ａ２）タスクＤに対する送信、（ａ３）タスクＥに対する送信の順番になる。
【００５２】
また、タスクＢは、図３に示したように、入力エッジを一つも有していないが、出力エッジを二つ有している。また、タスクＢの二つの出力エッジは、図３に示したように、タスクＤ、Ｅにそれぞれつながっている。一方、図４に説明したように、タスクＤ、Ｅのトポロジカルソートの順序番号は、それぞれ４、５である。したがって、図５（Ｂ）に示すように、タスクＢが（３）送信状態において１対１同期通信により送信処理を行う順番は、（ｂ１）タスクＤに対する送信、（ｂ２）タスクＥに対する送信の順番になる。
【００５３】
また、タスクＣは、図３に示したように、入力エッジを一つ、出力エッジを二つ有している。また、図３に示したように、タスクＣの一つの入力エッジはタスクＡに、また、二つの出力エッジはタスクＥ、Ｆそれぞれにつながっている。ここで、入力エッジあるいは出力エッジが一つだけの場合には、受信順序あるいは送信順序を決めるまでもない。一方、図４に説明したように、タスクＥ、Ｆのトポロジカルソートの順序番号は、それぞれ５、６である。 したがって、図５（Ｃ）に示すように、タスクＣは、（１）受信状態において１対１同期通信により受信処理を行う順番はなく、（ｃ１１）タスクＡからの受信のみであり、（３）送信状態において１対１同期通信により送信処理を行う順番は、（ｃ３１）タスクＥに対する送信、（ｃ３２）タスクＦに対する送信の順番になる。
【００５４】
タスクＤ、タスクＥ、タスクＦ、においても、各タスクが（１）受信状態において１対１同期通信により受信処理を行う順番は、入力エッジにつながるタスクのトポロジカルソートの順序番号の若い順番である。そして、各タスクが（３）送信状態において１対１同期通信により送信処理を行う順番は、出力エッジにつながるタスクのトポロジカルソートの順序番号の若い順番である。
【００５５】
つまり、図５（Ｄ）に示すように、タスクＤが行う１対１同期通信の受信処理の順番は、（ｄ１１）タスクＡからの受信、（ｄ１２）タスクＢからの受信の順番になり、１対１同期通信の送信信処理の順番は、（ｄ３１）タスクＥに対する送信、（ｄ３２）タスクＦに対する送信の順番になる。また、図５（Ｅ）に示すように、タスクＥが行う１対１同期通信の受信処理の順番は、（ｅ１）タスクＡからの受信、（e２）タスクＢからの受信、（ｅ３）タスクＣからの受信、（e４）タスクＤからの受信の順番になり、１対１同期通信の送信処理はない。また、図５（Ｆ）に示すように、タスクＦが行う１対１同期通信の受信処理の順番は、（ｆ１）タスクＣからの受信、（ｆ２）タスクＤからの受信の順番になり、１対１同期通信の送信処理はない。
【００５６】
以上のように、複数のタスクからなるタスクセットを、各タスクが相互に同期通信しながら同時に動作するように構成し、かつ、タスクが受信処理の後で送信処理を行うように構成し、なおかつ、前記タスクセットを表す非循環有向グラフをトポロジカルソートすることによって得られる順序番号を各タスクに付与して、各タスクは、当該タスクへ入力データを供給するデータ供給タスクに付与された前記順序番号の順番にしたがって、前記データ供給タスクから１対１同期受信を行い、かつ、各タスクは、当該タスクの出力データを使用するデータ使用タスクに付与された前記順序番号の順番にしたがって、前記データ使用タスクに対して１対１同期送信を行うことによって、複数のタスクとタスク間同期通信とによって構成された処理において、デッドロックを発生させることなく各タスク間通信に１対１同期通信ＡＰＩを適用することができる。
【００５７】
＜第二の実施形態＞
次に、本発明のタスク通信方法の第二の模範的な実施形態について、図６のフローチャートを用いて説明する。図６は、本発明の第二の実施形態のタスク通信方法を示すフローチャートである。第二の実施形態のタスク通信方法は、異なるイタレーション間のデータ依存関係（イタレーション間データ依存関係）を有する複数のタスクを含むタスクセットを対象として、トポロジカルソートによってあらかじめ得られている順序に基づいて、複数の１対１同期通信にて行う場合を示している。ここで、イタレーションとは、タスクセット全体の一回分の実行を意味するものであり、イタレーション間データ依存関係とは、第Ｎ回目（Ｎ：正整数）のタスクセットの実行と、第（Ｎ＋１）回目のタスクセットの実行との間のデータ依存関係を意味している。
【００５８】
先に説明した第一の実施形態のタスク通信方法は、イタレーション間データ依存関係を有していない場合のタスクセットを対象としているものであって、イタレーション間データ依存関係を有するタスクを扱うことを想定していない。これに対して、本第二の実施形態のタスク通信方法は、前述のように、イタレーション間のデータ依存関係を有するタスクを含むタスクセットを対象としており、前記第一の実施形態のタスク通信方法を、イタレーション間データ依存関係を取り扱うために改良を施したタスク通信方法の一例を説明するものである。
【００５９】
図６のフローチャートにおいて、第二の実施形態が扱うタスクセットは、第一の実施形態の場合と同様に、事前に、トポロジカルソートされて、各タスクにトポロジカルソートの順序番号が付与されている（ステップＳ１０）。順序番号があらかじめ付与された各タスクは、図２に第一の実施形態のフローチャートとして示した場合と同様に、まず、（１）受信状態において当該タスクへ入力データを供給する全てのデータ供給タスクの計算完了通知を受信した後（ステップＳ１１）、（２）計算において全てのデータ供給タスクからの入力データを用いた計算を実施し（ステップＳ１２）、しかる後に、（３）送信状態において全てのデータ使用タスクに対して出力データの計算完了通知を送信する（ステップＳ１３）という三つの処理を繰り返す。
【００６０】
なお、図６のステップＳ１０において、第二の実施形態が扱うタスクセットをトポロジカルソートする際には、当該タスクセットを非循環有向グラフと見做すために、当該タスクセットに含まれるイタレーション間データ依存関係を無視する。例えば、後述する図７にイタレーション間データ依存関係を有するタスクを含むタスクセットの一例を示しているが、図７においてイタレーション間データ依存関係を有するタスク（ノード）のエッジは、タスクＦからタスクＢへの破線で示すエッジである。図７のタスクセットをトポロジカルソートする際には、この破線エッジを無視することにより、タスクセットを非循環有向グラフとみなせるようにする。一つのイタレーション内部におけるタスクセットのデータ依存関係を扱う際には、イタレーション間データ依存関係は無関係であるので、図７のタスクＦからタスクＢへの破線で示すエッジ（イタレーション間データ依存関係）を無視することができる。
【００６１】
ステップＳ１０において事前にトポロジカルソートによって当該タスクに付与されている順序番号にしたがって通信を行うのは、第一の実施形態の場合と同様、ステップＳ１１の（１）受信とステップＳ１３の（３）送信の処理である。
【００６２】
ステップＳ１１の（１）受信状態においては、非循環有向グラフで表現されたタスクセットの中において、各タスクは、前述のように、入力エッジにつながるデータ供給タスクから計算完了通知を受信する。ここで、タスクセットにおいて、少なくとも一つのタスクの入力エッジには、図７のタスクセットの例で示したように、実線エッジ（イタレーション内部のデータ依存関係）以外の破線エッジ（イタレーション間のデータ依存関係）を含むものも存在しているものとする。もし、或るタスクが入力エッジを有していない場合であれば、第一の実施形態の場合と同様、当該タスクにはデータ供給タスクは存在していないので、当該タスクはステップＳ１１の（１）受信状態においては何もしないで、次のステップＳ１２の（２）計算処理へ進む。
【００６３】
これに対して、もし、タスクが入力エッジを一つ以上有していれば、当該タスクは、イタレーション間のデータ依存関係を対象としていない第一の実施形態の場合とは異なり、次に説明する順序にしたがって、各入力エッジにつながるデータ供給タスクから計算完了通知を受信する。
【００６４】
まず、タスクへの入力エッジを、実線エッジ（イタレーション内部のデータ依存関係を表すエッジ）と破線エッジ（イタレーション間のデータ依存関係を表すエッジ）との二つのグループに分ける。しかる後、最初に、破線エッジにつながるデータ供給タスクのグループ（すなわち、イタレーション間のデータ依存関係を有する１ないし複数のデータ供給タスクのグループ）に着目して、破線エッジにつながるデータ供給用タスクに付与された順序番号の順番にしたがって、データ供給タスクから計算完了通知を１対１同期通信によって受信する。具体的には、ステップＳ１１の（１）受信状態において、各タスクは、まず、破線エッジにつながるデータ供給タスクに付与された順序番号が小さい方から順番に、１対１同期通信により、データ供給タスクから計算完了通知を受信する（ステップＳ１１１）。
【００６５】
続いて、実線エッジにつながるデータ供給タスクのグループ（すなわち、イタレーション間のデータ依存関係を有していなく、イタレーション内部のデータ依存関係のみを有する１ないし複数のデータ供給タスクのグループ）に着目して、実線エッジにつながるデータ供給タスクに付与された順序番号の順番にしたがって、データ供給タスクから計算完了通知を１対１同期通信によって受信する。具体的には、ステップＳ１１の（１）受信状態において、ステップＳ１１１の処理を終了してから、各タスクは、実線エッジにつながるデータ供給タスクに付与された順序番号が小さい方から順番に、１対１同期通信により、データ供給タスクから計算完了通知を受信する（ステップＳ１１２）。
【００６６】
一方、ステップＳ１３の（３）送信状態においては、各タスクは、前述のように、データ使用タスクに対して計算完了通知を送信する。ここで、タスクセットにおいて、少なくとも一つのタスクの出力エッジには、図７のタスクセットの例で示したように、実線エッジ（イタレーション内部のデータ依存関係）以外の破線エッジ（イタレーション間のデータ依存関係）を含むものも存在しているものとする。もし、或るタスクが出力エッジを有していない場合であれば、第一の実施形態の場合と同様、当該タスクにはデータ使用タスクは存在していないので、当該タスクはステップＳ１３の（３）送信状態においては何もしないで、ステップＳ１１に復帰して、再び、次のイタレーション（反復動作）の（１）受信状態に戻る。
【００６７】
これに対して、もし、タスクが出力エッジを一つ以上有している場合であれば、当該タスクは、イタレーション間のデータ依存関係を対象としていない第一の実施形態の場合とは異なり、次に説明する順序にしたがって、各出力エッジにつながるデータ使用タスクに対して計算完了通知を送信する。
【００６８】
まず、タスクからの出力エッジを、ステップＳ１１の（１）受信状態の場合と同様に、実線エッジ（イタレーション内部のデータ依存関係を表すエッジ）と破線エッジ（イタレーション間のデータ依存関係を表すエッジ）との二つのグループに分ける。しかる後、最初に、破線エッジにつながるデータ使用タスクのグループ（すなわち、イタレーション間のデータ依存関係を有する１ないし複数のデータ使用タスクのグループ）に着目して、破線エッジにつながるデータ使用タスクに付与された順序番号の順番にしたがって、データ使用タスクに対して計算完了通知を１対１同期通信によって送信する。具体的には、ステップＳ１３の（３）送信状態において、各タスクは、まず、破線エッジにつながるデータ使用タスクに付与された順序番号が小さい方から順番に、１対１同期通信により、データ使用タスクへ計算完了通知を送信する（ステップＳ１３１）。
【００６９】
続いて、実線エッジにつながるデータ使用タスクのグループ（すなわち、イタレーション間のデータ依存関係を有していなく、イタレーション内部のデータ依存関係のみを有する１ないし複数のデータ使用タスクのグループ）に着目して、実線エッジにつながるデータ使用タスクに付与された順序番号の順番にしたがって、データ使用タスクに対して計算完了通知を１対１同期通信によって送信する。具体的には、ステップＳ１３の（３）送信状態において、ステップＳ１３１の処理を終了してから、各タスクは、実線エッジにつながるデータ使用タスクに付与された順序番号が小さい方から順番に、１対１同期通信により、データ使用タスクへ計算完了通知を送信する（ステップＳ１３２）。
【００７０】
＜第二の実施形態の具体的動作＞
次に、図６に示した第二の実施形態のタスク通信方法の通信に関する具体的な動作について図面を参照しながらさらに詳細に説明する。図７は、イタレーション間データ依存関係を有するタスクセットの一例を示す図であり、タスクセットが６個のタスクＡ〜Ｆからなっている場合について例示している。
【００７１】
ここで、図７に一例を示すタスクセットにおいて、丸で囲まれたノードはそれぞれタスクＡ〜Ｆを示し、矢印付きの実線でノード間を結ぶエッジ（実線エッジ）は、イタレーション内部におけるタスク間のデータ依存関係を、また、矢印付きの破線でノード間を結ぶエッジ（破線エッジ）は、異なるイタレーションのタスク間のデータ依存関係を、それぞれ示している。図７の例において、イタレーション間データ依存関係になる破線エッジは、タスクＦからタスクＢへの破線で示すエッジである。かくのごとき破線エッジを無視することによって、図７についても、第一の実施形態の図３の場合と同様、非循環有向グラフと見做すことができる。
【００７２】
まず、タスクセットのトポロジカルソートおよびタスクへの順序番号の付与に関する処理について説明する。これらの処理は、図６において説明したように、タスクセットに対して事前に行う処理である。図７のタスクセットを、破線エッジ（イタレーション間データ依存関係）を無視してトポロジカルソートした結果を図８に示している。つまり、図８は、図７に例示したタスクセットを、破線エッジ（イタレーション間データ依存関係）を無視してトポロジカルソートした結果の一例を示す図である。なお、丸で囲まれたノード（タスク）間を結んでいる矢印付きの実線は、イタレーション内部におけるタスク間のデータ依存関係（（イタレーション内データ依存関係）を示すエッジであり、図７における矢印付きの実線と同じ状態にある。また、丸で囲まれたノード（タスク）間を結んでいる矢印付きの破線は、異なるイタレーションのタスク間のデータ依存関係（イタレーション間データ依存関係）を示すエッジであり、図７における矢印付きの破線と同じ状態にある。
【００７３】
図８の各ノード内の括弧付きの数字（１）〜（６）の順序番号によって示しているように、図８に例示したタスクセットのイタレーション間データ依存関係を無視したトポロジカルソートの結果として、タスクＡ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆという順序が得られる。得られた順序にしたがって、各タスクＡ〜Ｆに対してトポロジカルソートの順序番号を付与する。つまり、図８に示すように、順序番号として、タスクＡに（１）を、タスクＢに（２）を、タスクＣに（３）を、タスクＤに（４）を、タスクＥに（５）を、タスクＦに（６）を、それぞれ付与する。
【００７４】
続いて、図９を用いて、各タスクの（１）受信状態および（３）送信状態における各タスク間の１対１同期通信の順序について説明する。図９は、図７に例示したタスクセットのタスク間の通信順序を説明する説明図である。
【００７５】
タスクＡは、図７に示したように、入力エッジを一つも有していないが、出力エッジを三つ有している。また、タスクＡの三つの出力エッジは、図７に示したように、タスクＢ、Ｃ、Ｄにそれぞれつながっている。一方、図８に説明したように、タスクＢ、Ｃ、Ｄのトポロジカルソートの順序番号は、それぞれ、２、３、４である。したがって、図９（Ａ）に示すように、タスクＡが（３）送信状態において１対１同期通信により送信処理を行う順番は、（ａ１）タスクＢに対する送信、（ａ２）タスクＣに対する送信、（ａ３）タスクＤに対する送信の順番になる。
【００７６】
また、タスクＢは、図７に示したように、入力エッジを二つ有し、出力エッジを一つ有している。ここで、タスクＢの二つの入力エッジは、一つがタスクＡにつながる実線エッジであり、もう一つがタスクＦにつながる破線エッジである。また、タスクＢの一つの出力エッジは、図７に示したように、タスクＤにつながっている。一方、図７に説明したように、タスクＡ、Ｄ、Ｆのトポロジカルソートの順序番号は、それぞれ１、４、６である。図６のフローチャートにおいて説明したように、イタレーション間データ依存関係を示す破線エッジが含まれている場合は、まず、破線エッジにつながるタスクとの通信を行い、しかる後に、イタレーション内データ依存関係を示す実線エッジにつながるタスクとの通信を行うことになる。また、入力エッジあるいは出力エッジが一つだけの場合には、受信順序あるいは送信順序を決めるまでもない。
【００７７】
したがって、図９（Ｂ）に示すように、タスクＢは、（１）受信状態において１対１同期通信により受信処理を行う順番は、まず、（ｂ１１）トポロジカルソートの順序番号は大きいものの、破線エッジにつながるタスクＦからの１対１同期受信を先に行い、しかる後に、（ｂ１２）実線エッジにつながるタスクＡからの１対１同期受信を行うという順番になる。（３）送信状態においては、出力エッジは一つだけなので、（ｂ３１）タスクＤに対する１対１同期送信を行うことになる。
【００７８】
タスクＣは、図７に示したように、入力エッジを一つ、出力エッジを一つ有している。図７に示したように、タスクＣの一つの入力エッジはタスクＡに、また、一つの出力エッジはタスクＤにそれぞれつながっている。入力エッジあるいは出力エッジが一つだけの場合には、受信順序あるいは送信順序を決めるまでもない。したがって、図９（Ｃ）に示すように、タスクＣは、（１）受信状態において、（ｃ１１）タスクＡから１対１同期受信を行い、（３）送信状態において、（ｃ３１）タスクＤに対して１対１同期送信を行う。
【００７９】
タスクＤ、タスクＥ、タスクＦ、においても、各タスクが（１）受信状態において１対１同期通信により受信処理を行う順番は、イタレーション間データ依存関係を有する入力エッジ（破線エッジ）につながるデータ供給タスクのグループが先であり、イタレーション内データ依存関係を有する入力エッジ（実線エッジ）につながるデータ供給タスクのグループが後である。破線エッジ、実線エッジそれぞれにつながるデータ供給タスクのグループ内においては、入力エッジにつながるデータ供給タスクに付与された順序番号の若い順番に１対１同期受信する。そして、各タスクが（３）送信状態において１対１同期通信により送信処理を行う順番は、イタレーション間データ依存関係を有する出力エッジ（破線エッジ）につながるデータ使用タスクのグループが先であり、イタレーション内データ依存関係を有する出力エッジ（実線エッジ）につながるデータ使用タスクのグループが後である破線エッジ、実線エッジそれぞれのグループ内においては、出力エッジにつながるデータ使用タスクに付与された順序番号の若い順番に１対１同期送信する。
【００８０】
つまり、図９（Ｄ）に示すように、タスクＤのエッジは全て実線エッジであり、入力エッジが三つ、出力エッジが一つである。したがって、タスクＤが行う１対１同期通信の受信処理の順番は、入力エッジにつながるタスクのトポロジカルソートの順序番号の若い順番の（ｄ１１）タスクＡからの受信、（ｄ１２）タスクＢからの受信、（ｄ１３）タスクＣからの受信の順番である。タスクＤが行う１対１同期通信の送信処理については、（ｄ３１）タスクＥに対する送信のみである。
【００８１】
また、図９（Ｅ）に示すように、タスクＥのエッジは全て実線エッジであり、入力エッジ、出力エッジが一つずつである。したがって１対１同期通信の順番を決めるまでもなく、タスクＥが行う１対１同期通信の送受信処理は、（ｅ１１）タスクＤからの受信と、（ｅ３１）タスクＦに対する送信である。
【００８２】
また、図９（Ｆ）に示すように、タスクＥのエッジは、入力エッジが実線エッジであり、出力エッジが破線エッジであるが、入力エッジ、出力エッジが一つずつである。したがって１対１同期通信の順番を決めるまでもなく、タスクＦが行う１対１同期通信の送受信処理は、（ｆ１１）タスクＥからの受信と、（ｆ３１）タスクＢに対する送信である。
【００８３】
以上のように、第二の実施形態は、少なくとも二つのタスクの間にイタレーション間データ依存関係が存在するような複数のタスクからなるタスクセットを、各タスクが相互に通信しながら同時に動作するように構成し、かつ、タスクが受信処理の後で送信処理を行うように構成し、なおかつ、イタレーション間データ依存関係を無視したトポロジカルソートによって得られる順序番号を各タスクにあらかじめ付与する。
【００８４】
さらに、第二の実施形態は、各タスクへ入力データを供給するタスク（データ供給タスク）を、イタレーション間データ依存関係に対応する第一グループと、それ以外の第二グループとに分け、各タスクにおける１対１同期受信順序を、第一グループのデータ供給タスクからの受信の後に第二グループのデータ供給タスクからの受信として、それぞれのグループ内の１対１同期受信順序を、データ供給タスクに付与された順序番号の順番にしたがうものとする。
【００８５】
さらに、第二の実施形態は、各タスクの出力データを使用するタスク（データ使用タスク）を、イタレーション間データ依存関係に対応する第三グループと、それ以外の第四グループとに分け、各タスクにおける１対１同期送信順序を、第三グループのデータ使用タスクへの送信の後に第四グループのデータ使用タスクへの送信として、それぞれのグループ内の１対１同期送信順序を、データ使用タスクに付与された順序番号の順番にしたがうものとする。
【００８６】
かくのごとき仕組みを採用することによって、イタレーション間データ依存関係を持つ複数のタスクからなるタスクセットに対しても、第二の実施形態は、デッドロックを発生させることなく各タスク間通信に１対１同期通信ＡＰＩを適用することができる。
【産業上の利用可能性】
【００８７】
以上に詳細に説明したように、本発明を使用すれば、複数のタスクが同期通信を行いながら処理を実行するように構成されたソフトウェアにおいて、タスクが受信処理の後で送信処理を行うように構成し、かつ、トポロジカルソートによってタスク間の１対１同期通信の順序を決定することにより、 デッドロックを発生させることなく、各タスク間通信に１対１同期通信ＡＰＩを適用することができる。かくのごときタスク通信方法は、多対１や１対多の同期通信ＡＰＩが提供されないような実装環境において非常に有益である。したがって、本発明は、組込み向けのマルチプロセッサや汎用のマルチコアＰＣなど、複数のタスクが通信しながら動作する計算機システムにおいて幅広く応用することが可能である。
【００８８】
以上、本発明の好適な実施形態の構成を説明した。しかし、かかる実施形態は、本発明の単なる例示に過ぎず、何ら本発明を限定するものではないことに留意されたい。本発明の要旨を逸脱することなく、特定用途に応じて種々の変形変更が可能であることが、当業者には容易に理解できよう。
【符号の説明】
【００８９】
Ａ      タスク（ノード）
Ｂ      タスク（ノード）
Ｃ      タスク（ノード）
Ｄ      タスク（ノード）
Ｅ      タスク（ノード）
Ｆ      タスク（ノード）
【図１】
0005888052.tif 000002
【図２】
0005888052.tif 000003
【図３】
0005888052.tif 000004
【図４】
0005888052.tif 000005
【図５】
0005888052.tif 000006
【図６】
0005888052.tif 000007
【図７】
0005888052.tif 000008
【図８】
0005888052.tif 000009
【図９】
0005888052.tif 000010
【図１０】
0005888052.tif 000011
【図１１】
0005888052.tif 000012