(58)【調査した分野】(Int.Cl.,DB名)
1組のあり得る状態が、第1のタスクセクションが第1のタスクを実行した完了状態、第1のタスクセクションが第1のタスクを実行するのを待っている保留状態、及び第1のタスクセクションが第1のタスクを実行することを抑制された抑制状態を含む、請求項1又は2に記載の方法。
【発明の概要】
【課題を解決するための手段】
【0004】
一態様においては、概して、コンピューティングシステムによって実行されるタスクを制御するための方法が、データ記憶システムにグラフに基づくプログラムの仕様に関するデータ構造を記憶するステップであって、グラフに基づくプログラムの仕様が、タスクを表す複数のノードを含み、グラフに基づくプログラムの仕様が、ノードによって表される複数のタスクの間の少なくとも部分的な順序を規定するノードの間の有向辺を含む、ステップと、グラフに基づくプログラムの仕様によって規定されたプログラムを少なくとも1つのプロセッサを用いて実行するステップとを含む。実行するステップが、第1のタスクに対応する第1のサブルーチンを実行することであって、第1のサブルーチンが、第1のタスクを実行するための第1のタスクセクション(task section)を含む、実行すること、第1のタスクセクションが第1のタスクを実行するのを待っている保留状態、及び第1のタスクセクションが第1のタスクを実行することを抑制された抑制状態を含む1組のあり得る状態から選択される第1のタスクの状態を示す状態情報を記憶すること、並びに第2のタスクに対応する第2のサブルーチンを実行することであって、第2のサブルーチンが、第2のタスクを実行するための第2のタスクセクション、及び記憶された状態情報によって示された第1のタスクの状態に少なくとも部分的に基づいて第2のタスクセクションの実行を制御する制御セクション(control section)を含む、実行することを含む。
【0005】
態様は、以下の特徴のうちの1又は2以上を含み得る。
【0006】
上流のノードから下流のノードへの有向辺が、部分的な順序で上流のノードによって表されるタスクが下流のノードによって表されるタスクに先行することを示す。
【0007】
1組のあり得る状態が、第1のタスクセクションが第1のタスクを実行した完了状態、第1のタスクセクションが第1のタスクを実行するのを待っている保留状態、及び第1のタスクセクションが第1のタスクを実行することを抑制された抑制状態を含む。
【0008】
1組のあり得る状態が、第1のタスクセクションが第1のタスクを実行する過程にあるアクティブ状態を含む。
【0009】
制御セクションが、第2のタスクセクションが呼び出されるか否かを判定する論理を含む。
【0010】
論理が、フラグの値に基づいて第2のタスクセクションが呼び出されるか否かを判定する。
【0011】
論理が、第2のタスクを表すノードへの有向辺によって接続されるノードによって表されるすべてのタスクの状態に少なくとも部分的に基づいて第2のタスクセクションが呼び出されるか否かを判定する。
【0012】
論理が、第2のタスクを表すノードへの有向辺によって接続されるノードによって表されるすべてのタスクが停止状態にある場合、第2のセクションが呼び出されないと判定する。
【0013】
論理が、第2のタスクを表すノードへの有向辺によって接続されるノードによって表される少なくとも1つのタスクが完了状態であり、第2のタスクを表すノードへの有向辺によって接続されるノードによって表されるタスクのいずれも保留状態にない場合、第2のセクションが呼び出されると判定する。
【0014】
別の態様においては、概して、タスクを制御するための、コンピュータ可読記憶媒体に記憶されるコンピュータプログラム。コンピュータプログラムは、コンピューティングシステムに、グラフに基づくプログラムの仕様に関するデータ構造を記憶させ、グラフに基づくプログラムの仕様が、タスクを表す複数のノードを含み、グラフに基づくプログラムの仕様が、ノードによって表される複数のタスクの間の少なくとも部分的な順序を規定するノードの間の有向辺を含み、グラフに基づくプログラムの仕様によって規定されたプログラムを実行させる命令を含む。実行することが、第1のタスクに対応する第1のサブルーチンを実行することであって、第1のサブルーチンが、第1のタスクを実行するための第1のタスクセクションを含む、実行すること、第1のタスクセクションが第1のタスクを実行するのを待っている保留状態、及び第1のタスクセクションが第1のタスクを実行することを抑制された抑制状態を含む1組のあり得る状態から選択される第1のタスクの状態を示す状態情報を記憶すること、並びに第2のタスクに対応する第2のサブルーチンを実行することであって、第2のサブルーチンが、第2のタスクを実行するための第2のタスクセクション、及び記憶された状態情報によって示された第1のタスクの状態に少なくとも部分的に基づいて第2のタスクセクションの実行を制御する制御セクションを含む、実行することを含む。
【0015】
別の態様においては、概して、タスクを制御するためのコンピューティングシステムが、グラフに基づくプログラムの仕様に関するデータ構造を記憶するデータ記憶システムであって、グラフに基づくプログラムの仕様が、タスクを表す複数のノードを含み、グラフに基づくプログラムの仕様が、ノードによって表される複数のタスクの間の少なくとも部分的な順序を規定するノードの間の有向辺を含む、データ記憶システムと、グラフに基づくプログラムの仕様によって規定されたプログラムを実行するように構成された少なくとも1つのプロセッサとを含む。実行することが、第1のタスクに対応する第1のサブルーチンを実行することであって、第1のサブルーチンが、第1のタスクを実行するための第1のタスクセクションを含む、実行すること、第1のタスクセクションが第1のタスクを実行するのを待っている保留状態、及び第1のタスクセクションが第1のタスクを実行することを抑制された抑制状態を含む1組のあり得る状態から選択される第1のタスクの状態を示す状態情報を記憶すること、並びに第2のタスクに対応する第2のサブルーチンを実行することであって、第2のサブルーチンが、第2のタスクを実行するための第2のタスクセクション、及び記憶された状態情報によって示された第1のタスクの状態に少なくとも部分的に基づいて第2のタスクセクションの実行を制御する制御セクションを含む、実行することを含む。
【0016】
別の態様においては、概して、タスクを制御するためのコンピューティングシステムが、グラフに基づくプログラムの仕様に関するデータ構造を記憶するための手段であって、グラフに基づくプログラムの仕様が、タスクを表す複数のノードを含み、グラフに基づくプログラムの仕様が、ノードによって表される複数のタスクの間の少なくとも部分的な順序を規定するノードの間の有向辺を含む、手段と、グラフに基づくプログラムの仕様によって規定されたプログラムを実行するための手段とを含む。実行することが、第1のタスクに対応する第1のサブルーチンを実行することであって、第1のサブルーチンが、第1のタスクを実行するための第1のタスクセクションを含む、実行すること、第1のタスクセクションが第1のタスクを実行するのを待っている保留状態、及び第1のタスクセクションが第1のタスクを実行することを抑制された抑制状態を含む1組のあり得る状態から選択される第1のタスクの状態を示す状態情報を記憶すること、並びに第2のタスクに対応する第2のサブルーチンを実行することであって、第2のサブルーチンが、第2のタスクを実行するための第2のタスクセクション、及び記憶された状態情報によって示された第1のタスクの状態に少なくとも部分的に基づいて第2のタスクセクションの実行を制御する制御セクションを含む、実行することを含む。
【0017】
態様は、以下の利点のうちの1又は2以上を含む可能性がある。
【0018】
タスクがコンピューティングシステムによって実行されるとき、タスクを実行するための新しいプロセスをスポーニングすることに関連し、タスクのプロセスと、スケジューラ、又はタスクの依存関係及び順序を維持するためのその他の中心的なプロセスとの間を行ったり来たり切り替えることに関連する処理時間のコストが存在する。本明細書において説明される技術は、計算効率の良い方法で、新しいプロセスが選択的にスポーニングされること、又は実行されているプロセスが選択的に再利用されることを可能にする。コンパイラは、タスクを実行するためのサブルーチンに追加される比較的少ない量のコードに基づく分散型のスケジューリングメカニズムによって、集中型のスケジューラにのみ頼る必要性を避けることができる。タスクの完了が、自動的に、同時実行及び条件付き論理を可能にする方法で、制御フローグラフなどの入力の制約に従ってコンピューティングシステムがその他のタスクを実行することを引き起こす。タスクに関連するコンパイラにより生成されたコードが、カウンタ及びフラグに記憶された状態情報に基づいてその他のタスクを実行すべきか否かを判定するための関数をランタイムで呼び出す。したがって、コンパイラによって生成されたコードが、タスクのサブルーチンの呼び出しをランタイムで制御する状態機械を効率的に実装している。スケジューラへの及びスケジューラからの切り替えの余計なオーバーヘッドなしに、コンピューティングシステムは、細かい粒度の潜在的に同時のタスクをより効率的に実行することができる。
【0019】
本発明のその他の特徴及び利点は、以下の説明及び請求項から明らかになるであろう。
【発明を実施するための形態】
【0021】
図1は、タスク制御技術が使用され得るコンピューティングシステム100の例を示す。システム100は、タスクの仕様104を記憶するための記憶システム102と、タスクの仕様を、タスクを実行するためのタスクサブルーチンにコンパイルするためのコンパイラ106と、メモリシステム110にロードされたタスクサブルーチンを実行するための実行環境108とを含む。それぞれのタスクの仕様104は、どのタスクが実行されることになるか、及び異なるタスクの間の順序の制約を含む、いつそれらのタスクが実行され得るかに関する制約についての情報を符号化する。タスクの仕様104の一部は、実行環境108のユーザインターフェース114を介してユーザ112がインタラクションすることによって構築され得る。実行環境108は、例えば、UNIXオペレーティングシステムのバージョンなどの好適なオペレーティングシステムの制御下の1又は2以上の汎用コンピュータでホストされる可能性がある。例えば、実行環境108は、ローカルの(例えば、対称型マルチプロセッシング(SMP,symmetric multi-processing)コンピュータなどのマルチプロセッサシステム)又はローカルに分散された(例えば、クラスタ若しくは超並列処理(MPP,massively parallel processing)システムとして接続された複数のプロセッサ)か、或いは遠隔の又は遠隔に分散された(例えば、ローカルエリアネットワーク(LAN,local area network)及び/若しくは広域ネットワーク(WAN,wide-area network)を介して接続された複数のプロセッサ)か、或いはこれらの任意の組合せかのいずれかの複数の中央演算処理装置(CPU,central processing unit)或いはプロセッサコアを用いるコンピュータシステムの構成を含むマルチノード並列コンピューティング環境を含む可能性がある。記憶システム102を提供する記憶デバイスは、実行環境108のローカルにあり、例えば、実行環境108をホストするコンピュータに接続された記憶媒体(例えば、ハードドライブ)に記憶される可能性があり、又は実行環境108の遠隔にあり、例えば、(例えば、クラウドコンピューティングインフラストラクチャによって提供される)リモート接続を介して実行環境108をホストするコンピュータと通信するリモートシステムでホストされる可能性がある。
【0022】
図2Aは、コンピューティングシステム100によって実行される1組のタスクに対して課される部分的な順序を定義する制御フローグラフ200の例を示す。制御フローグラフ200によって定義される部分的な順序は、記憶されるタスクの仕様104で符号化される。一部の実施形態において、ユーザ112は、制御フローグラフに含まれるさまざまな種類のノードを選択し、接続されたノードの間の順序の制約を表すリンクによってそれらのノードの一部を接続する。ノードの1つの種類は、
図2Aにおいて角の四角いブロックによって表されるタスクノードである。それぞれのタスクノードは、実行される異なるタスクを表す。(有向リンクの始点の)第1のタスクノードから(有向リンクの終点の)第2のタスクノードに接続された有向リンクは、第2のノードのタスクが開始し得るよりも前に第1のノードのタスクが完了しなければならないという順序の制約を課す。ノードの別の種類は、
図2Aにおいて角の丸いブロックによって表される接合ノードである。制御フローグラフが条件付きの動作(behavior)を含まない場合、接合ノードは、単に、順序の制約を課すように働く。単一の入力リンク及び複数の出力リンクを有する接合ノードは、出力リンクによって接続されるタスクノードのいずれのタスクが開始し得るよりも前に入力リンクによって接続されるタスクノードのタスクが完了しなければならないように順序の制約を課す。複数の入力リンク及び単一の出力リンクを有する接合ノードは、出力リンクによって接続されるタスクノードのタスクが開始し得るよりも前に入力リンクによって接続されるタスクノードのすべてのタスクが完了しなければならないように順序の制約を課す。タスクノードは、複数の入力リンクの終点でもあり、そのタスクノードのタスクが開始し得るよりも前に入力リンクによって接続されるタスクノードのすべてのタスクが完了しなければならないように順序の制約を課す可能性がある。以下でより詳細に説明されるように、条件付きの動作によって、複数の入力リンクを有するタスクノードは、複数の入力を有する接合ノードとは異なる論理的な動作をさらに提供する。
【0023】
制御フローグラフが構築された後、コンパイラ106は、タスク情報と、その制御フローグラフによって表される順序の情報とを符号化するタスクの仕様104をコンパイルし、タスクを実行するための命令を生成する。命令は、実行される用意のできている低レベルのマシンコードの形態、又は最終的に実行される低レベルのマシンコードを提供するためにさらにコンパイルされるより高レベルのコードの形態である可能性がある。生成された命令は、それぞれのタスクノードに関するサブルーチン(「タスクサブルーチン」)及びそれぞれの接合ノードに関するサブルーチン(「接合サブルーチン」)を含む。タスクサブルーチンのそれぞれは、対応するタスクを実行するための(タスク本体(task body)とも呼ばれる)タスクセクションを含む。タスクノードは、コンパイラが適切なタスクセクションを生成することができるように実行される対応するタスクの何らかの説明を含む。例えば、一部の実施形態において、タスクノードは、呼び出される特定の関数、実行されるプログラム、又はタスクセクションに含められるその他の実行可能コードを特定する。また、タスクサブルーチンの一部は、制御フローグラフの別のノードに関する後続のサブルーチンの実行を制御する制御セクションを含み得る。いかなる下流のノードにも接続されないタスクノードに関するタスクサブルーチンは、そのタスクノードの完了後に制御がいかなる後続のタスクにも渡される必要がないので制御セクションを必要としない可能性がある。接合ノードの目的は、制御のフローに対する制約を規定することであるので、接合サブルーチンのそれぞれは、制御セクションをその主要部として含む。
【0024】
制御セクションに含まれる関数の例は、制御フローグラフのノードに関連する状態情報に基づいて後続のノードに関するサブルーチンを実行するための新しいプロセスをスポーニングすべきか否かを判定する「chain」関数である。chain関数の引数が、その後続のノードを特定する。下の表は、制御フローグラフ200のノードのそれぞれに関してコンパイラによって書かれるサブルーチンに含まれる関数の例を示し、タスクサブルーチンのタスクセクションが、関数呼び出しT#()によって表され、サブルーチンの残りが、制御セクションを表すと考えられる。(その他の例において、タスクセクションは、最後の関数が返った後にタスクが完了されるようにして複数の関数呼び出しを含む可能性がある。)接合サブルーチンは、タスクセクションを含まず、したがって、すべて制御セクションによって構成される。この例においては、別々の関数呼び出しは、それらの関数が呼び出される順序でセミコロンによって分けられる。
【0026】
タスクの仕様104がコンパイルされた後、コンピューティングシステム100は、生成されたサブルーチンを実行環境108のメモリシステム110にロードする。特定のサブルーチンが呼び出されるとき、プログラムカウンタが、サブルーチンが記憶されるメモリシステム110のアドレス空間の一部の始めの対応するアドレスに設定される。
【0027】
スケジューリングされた時間に、又はユーザ入力若しくは所定のイベントに応じて、コンピューティングシステム100は、制御フローグラフのルートを表すロードされたサブルーチンのうちの少なくとも1つの実行を開始する。例えば、制御フローグラフ200に関して、コンピューティングシステム100は、タスクノードT1に関するタスクサブルーチンを実行するためのプロセスをスポーニングする。サブルーチンが実行を開始するとき、プロセスは、最初に、タスクノードT1のタスクを実行するためのタスクセクションを呼び出し、それから、タスクセクションが返った(タスクノードT1のタスクの完了を示す)後に、プロセスは、サブルーチンの制御セクションのchain関数を呼び出す。特定のノードに関するサブルーチンを実行するために新しいプロセスをスポーニングすべきか否かを判定するためにchain関数によって使用される状態情報は、以下でより詳細に説明されるように、その特定のノードを引数として呼び出された前のchain関数の履歴を捕捉する情報である。
【0028】
この履歴情報は、異なるノードに関連するアクティブ化カウンタに保有され得る。カウンタの値は、例えば、メモリシステム110の一部又はその他の作業用記憶域に記憶される可能性がある。第1のプロセスがスポーニングされる前に、各ノードに関するアクティブ化カウンタの値は、そのノードへの入力リンクの数に初期化される。したがって、制御フローグラフ200に関しては、以下の値に初期化された6つのアクティブ化カウンタが存在する。
【0030】
タスクノードT1は入力リンクを持たないので、そのタスクノードT1のアクティブ化カウンタは、ゼロに初期化される。代替的に、いかなる入力リンクも持たない最初のノードに関しては、そのノードに関連するアクティブ化カウンタが存在する必要がない。入力リンクを介して接続される異なるノードの制御セクションは、下流のリンクされたノードのアクティブ化カウンタをデクリメントし、デクリメントされた値に基づいてアクションを決定する。一部の実施形態においては、カウンタにアクセスする関数が、カウンタをアトミックにデクリメントし、デクリメント操作の前か又は後かのどちらかでカウンタの値を読むアトミックな操作(例えば、アトミックな「decrement−and−test」操作)を使用することができる。一部のシステムにおいては、そのような操作が、システムのネイティブの命令によってサポートされる。代替的に、カウンタの値がゼロに達するまでカウンタをデクリメントする代わりに、カウンタが、ゼロで始まる可能性があり、関数が、(例えば、アトミックな「increment−and−test」操作を用いて)カウンタの値がノードへの入力リンクの数に初期化された所定の閾値に達するまでカウンタをインクリメントする可能性がある。
【0031】
chain関数「chain(N)」の呼び出しは、ノードNのアクティブ化カウンタをデクリメントし、デクリメントされた値がゼロである場合、chain関数は、新しくスポーニングされたプロセスによるノードNのサブルーチンの実行をトリガし、それから返す。デクリメントされた値がゼロよりも大きい場合、chain関数は、新しいサブルーチンの実行をトリガすること又は新しいプロセスのスポーニングすることなしにただ返す。サブルーチンの制御セクションは、表1の接合ノードJ1に関する接合サブルーチンと同様に、chain関数の複数の呼び出しを含む可能性がある。制御セクションの最後の関数が返った後、サブルーチンを実行するプロセスは、終了する可能性があり、又は一部の関数呼び出しに関しては(例えば、以下で説明される「chainTo」関数呼び出しに関しては)、プロセスは、別のサブルーチンの実行を続ける。新しいプロセスのこの条件付きのスポーニングは、新しいプロセスのスポーニングを管理するためのスケジューラプロセスへの切り替え及び新しいプロセスのスポーニングを管理するためのスケジューラプロセスからの切り替えを必要とせずに、所望の部分的な順序に従って(潜在的に同時に)タスクサブルーチンが実行されることを可能にする。
【0032】
表1のサブルーチンに関して、タスクサブルーチンT1に関するタスクセクションが返った後のchain関数の呼び出し「chain(J1)」は、ノードJ1に関するアクティブ化カウンタが1から0にデクリメントされる結果をもたらし、chain関数の呼び出し「chain(T2)」及び「chain(T3)」を含む接合サブルーチンの実行を引き起こす。これらの呼び出しのそれぞれは、ノードT2及びT3に関するそれぞれのアクティブ化カウンタが1から0にデクリメントされる結果をもたらし、ノードT2及びT3に関するタスクサブルーチンの実行を引き起こす。両方のタスクサブルーチンが、ノードJ2に関するアクティブ化カウンタをデクリメントする「chain(J2)」を呼び出す制御セクションを含む。ノードT2及びT3に関するタスク本体のうち最初に終了する方が、ノードJ2に関するアクティブ化カウンタを2から1にデクリメントするchain関数の呼び出しにつながる。2番目に終了するタスクセクションは、ノードJ2に関するアクティブ化カウンタを1から0にデクリメントするchain関数の呼び出しにつながる。したがって、タスクのうちで最後に完了するもののみが、ノードJ2に関する接合サブルーチンの実行を引き起こし、その実行が、chain関数の最後の呼び出し「chain(T4)」及びノードT4に関するアクティブ化カウンタの1から0へのデクリメントにつながり、そのデクリメントが、ノードT4に関するタスクサブルーチンの実行を開始する。ノードT4に関するタスクセクションが返った後、制御フローは、ノードT4に関するタスクサブルーチンに関する制御セクションが存在しないので完了する。
【0033】
表1のサブルーチンの例においては、新しいプロセスが、制御フローグラフ200の各ノードのサブルーチンに関してスポーニングされる。中心的なタスク監視又はスケジューリングプロセスを必要とせずに、新しいプロセスをスポーニングすべきか否かを判定する制御セクションを独自に含む各プロセスのサブルーチンによっていくらかの効率が得られるが、制御セクションに対する特定のコンパイラの最適化によってより一層の効率が得られる可能性がある。例えば、1つのコンパイラの最適化では、第1のサブルーチンの制御セクションにchain関数の単一の呼び出しが存在する場合、次のサブルーチン(すなわち、そのchain関数の引数)が、第1のサブルーチンを実行している同じプロセス内で(アクティブ化カウンタがゼロに達するときに)実行される可能性がある−新しいプロセスは、スポーニングされる必要がない。これを実現する1つの方法は、コンパイラがノードの最後の出力リンクに関する異なる関数呼び出し(例えば、「chain」関数の代わりに「chainTo」関数)を明示的に生成することである。chainTo関数は、アクティブ化カウンタがゼロであるときにその関数の引数のサブルーチンを実行するための新しいプロセスをスポーニングする代わりに、その関数の引数のサブルーチンを同じプロセスに実行させることを除いてchain関数と同様である。ノードが単一の出力リンクを有する場合、そのノードのコンパイルされたサブルーチンは、chainTo関数の単一の呼び出しを有する制御セクションを有する。ノードが複数の出力リンクを有する場合、そのノードのコンパイルされたサブルーチンは、chain関数の1又は2以上の呼び出し及びchainTo関数の単一の呼び出しを有する制御セクションを有する。これは、独立したプロセスでスポーニングされるサブルーチンの数及びそれらのサブルーチンの関連する開始オーバーヘッドを削減する。表3は、このコンパイラの最適化を用いて制御フローグラフ200に関して生成されるサブルーチンの例を示す。
【0035】
表3のサブルーチンの例においては、第1のプロセスがノードT1及びJ1のサブルーチンを実行し、そして、ノードT2のサブルーチンを実行するために新しいプロセスがスポーニングされる一方、第1のプロセスはノードT3のサブルーチンの実行を続ける。これら2つのプロセスのうちでそれらのプロセスのそれぞれのタスクセクションから始めに返すものは、接合ノードJ2のアクティブ化カウンタを(2から1へ)始めにデクリメントするものであり、それからそのプロセスは、終了する。プロセスのタスクセクションから返る第2のプロセスは、接合ノードJ2のアクティブ化カウンタを1から0にデクリメントし、それから、関数呼び出し(「chainTo(T4)」)である接合ノードJ2のサブルーチン及び最後にはタスクノードT4のサブルーチンを実行することによって継続する。
図2Bは、ノードT3のタスクがノードT2のタスクの前に終了する場合に関して、第1の及び第2のプロセスが制御フローグラフ200の異なるノードに関するサブルーチンを実行するときのそれらのプロセスの存続期間の例を示す。プロセスを表す線に沿った点は、(破線によって点に接続された)異なるノードに関するサブルーチンの実行に対応する。点の間の線分の長さは、必ずしも経過時間に比例せず、単に、異なるサブルーチンが実行される相対的な順序と、新しいプロセスがスポーニングされる時点とを示すように意図されている。
【0036】
潜在的に効率をさらに向上させることができる修正の別の例は、特定のサブルーチンが同時実行の恩恵を受け得ることを示す閾値が満たされるまで遅らされた新しいプロセスのスポーニングである。異なるプロセスによる複数のサブルーチンの同時実行は、サブルーチンのそれぞれが完了するのにかなりの量の時間がかかる場合に特に恩恵がある。そうではなく、サブルーチンのいずれかがその他のサブルーチンと比べて完了するのに比較的少ない量の時間がかかる場合、そのサブルーチンは、効率の大きな損失なしに別のサブルーチンと逐次的に実行される可能性がある。遅らされたスポーニングのメカニズムは、かなりの量の時間がかかり、一緒に実行され得る複数のタスクが、プロセスを同時に実行することによって実行されることを可能にするが、さらに、より短いタスクのための新しいプロセスのスポーニングを抑制するように試みる。
【0037】
遅らされたスポーニングを用いるchain関数の代替的な実施形態においては、chainTo関数に似たchain関数が、その関数の引数のサブルーチンの実行を同じプロセスに開始させる。しかし、chainTo関数とは異なり、タイマーが、サブルーチンを実行するのにかかる時間を追跡し、閾値の時間が超えられる場合、chain関数は、サブルーチンの実行を継続するために新しいプロセスをスポーニングする。第1のプロセスは、サブルーチンが完了したかのように継続することができ、第2のプロセスは、第1のプロセスが終了した時点でサブルーチンの実行を引き継ぐことができる。これを実現するために使用され得る1つのメカニズムは、第2のプロセスが第1のプロセスからサブルーチンのスタックフレームを継承することである。実行されているサブルーチンに関するスタックフレームは、特定の命令を指すプログラムカウンタと、サブルーチンの実行に関連するその他の値(例えば、ローカル変数及びレジスタ値)を含む。この例において、T2に関するタスクサブルーチンのスタックフレームは、プロセスがT2に関するタスクサブルーチンの完了後にJ1に関する接合サブルーチンに返すことを可能にするリターンポインタ(return pointer)を含む。遅らされたスポーニングのタイマーが超えられるとき、新しいプロセスがスポーニングされ、T2に関するタスクサブルーチンの既存のスタックフレームに関連付けられ、第1のプロセスが、(「chainTo(T3)」を呼び出すために)J1に関する接合サブルーチンに直ちに戻る。継承されたスタックフレームのリターンポインタは、新しいプロセスがT2に関するタスクサブルーチンの完了後にJ1に関する接合サブルーチンに戻る必要がないので取り除かれる(つまり、ヌルにされる)。したがって、遅らされたスポーニングは、タスクが(構成可能な閾値に比して)迅速である場合に関して、新しいプロセスをスポーニングするオーバーヘッドなしに後続のタスクに関するサブルーチンが実行されることを可能にし、既存のスタックフレームを継承することによって、タスクがより長い場合に関して、新しいプロセスのスポーニングにかかわるオーバーヘッドを削減する。
【0038】
図2Cは、ノードT2のタスクが遅らされたスポーニングの閾値よりも長い場合に関して、第1の及び第2のプロセスが制御フローグラフ200の異なるノードに関するサブルーチンを実行するときのそれらのプロセスの存続期間の例を示す。スポーニングの閾値が達せられるとき、プロセス1が、ノードT2のタスクを実行するサブルーチンのスタックフレームを継承し、そのサブルーチンの実行を続けるプロセス2をスポーニングする。この例においては、(プロセス1によって実行される)ノードT3のタスクが、(プロセス1によって開始され、プロセス2によって完了される)ノードT2のタスクが終了する前に終了する。したがって、この例において、J2のアクティブ化カウンタを2から1にデクリメントする(そして終了する)のはプロセス1であり、J2のアクティブ化カウンタを1から0にデクリメントし、プロセス2がタスクノードT4のタスクを実行する結果となるのはプロセス2である。この例においては、ノードT2のタスク及びノードT3のタスクの同時実行が、そのような同時実行が全体的な効率に寄与すると判定された後に可能にされる。
【0039】
図2Dは、ノードT2のタスクが遅らされたスポーニングの閾値よりも短い場合に関して、単一のプロセスが制御フローグラフ200の異なるノードに関するサブルーチンを実行するときのそのプロセスの存続期間の例を示す。この例においては、(プロセス1によって実行される)ノードT2のタスクが、(プロセス1によってやはり実行される)ノードT3のタスクの前に終了する。したがって、この例においては、プロセス1が、ノードT2のタスクを完了した後にJ2のアクティブ化カウンタを2から1にデクリメントし、プロセス1が、ノードT3のタスクを完了した後にJ2のアクティブ化カウンタを1から0にデクリメントし、その結果、プロセス1が、タスクノードT4のタスクを実行する。この例においては、ノードT2及びノードT3のタスクの同時実行が、ノードT2のタスクが迅速に完了され得ると判定された後に第2のプロセスをスポーニングする必要性を避けることによって得られる効率のために放棄される。
【0040】
制御フローグラフに含まれる可能性があるノードの別の種類は、
図3に示される制御フローグラフ300の円によって表される条件ノードである。条件ノードは、条件ノードの出力に接続されたタスクノードのタスクが実行されるべきであるか否かを判定するための条件を定義する。ランタイムで、定義された条件が真である場合、制御フローは、その条件ノードを過ぎて下流に進むが、ランタイムで、定義された条件が偽である場合、制御フローは、条件ノードを過ぎて進まない。条件が偽である場合、条件ノードの下流のタスクノードのタスクは、それらのタスクノードに至る制御フローグラフを抜ける(その他の偽の条件ノードによってそれら自体が遮断されない)その他の経路が存在する場合にのみ実行される。
【0041】
コンパイラは、それぞれの条件ノードに関する「条件サブルーチン」を生成し、さらに、条件ノードによって定義された条件を用いて条件ノードの下流の特定のその他のノードのサブルーチンを修正する。例えば、コンパイラは、制御フローグラフによって定義された制御の流れに従うためにランタイムで適用される「スキップメカニズム」のための命令を生成し得る。スキップメカニズムにおいて、各ノードは、(もしあれば)対応するタスクセクションが実行されるか否かを制御する関連する「スキップフラグ」を有する。スキップフラグが設定される場合、(ノードが「抑制」状態であるようにして)タスクセクションの実行が抑制され、この抑制は、コンパイラによって制御セクションに入れられた適切な制御コードによってその他のタスクに伝播され得る。前の例においては、タスクサブルーチンのタスクセクションが、制御セクションに先行していた。以下の例においては、一部のタスクのサブルーチンの制御セクションが、タスクセクションの前に現れる制御コード(「プロローグ(prologue)」とも呼ばれる)と、タスクセクションの後に現れる制御コード(「エピローグ(epilogue)」とも呼ばれる)とを含む。例えば、このスキップメカニズムを実装するために、コンパイラは、条件付きの命令(例えば、ステートメント(statement)の場合)と、下流のノードを特定する引数を用いて呼び出される「skip関数」の呼び出しとをプロローグ(すなわち、タスクセクションの前に実行されるコード)に含める。コンパイラは、chain又はchainTo関数の呼び出しをエピローグ(すなわち、タスクセクションの後に実行されるコード)に含める。場合によっては、スキップフラグの値によって表される記憶された状態が原因で、プロローグのみが実行される可能性があり、タスクセクションとエピローグとの両方がスキップされる可能性がある。表4は、制御フローグラフ300に関して生成されるサブルーチンの例を示す。
【0043】
chain及びchainTo関数と同様に、skip関数「skip(N)」は、そのskip関数の引数(ノードN)のアクティブ化カウンタをデクリメントし、デクリメントされた値が0である場合、対応するサブルーチンを実行する。この例において、skip関数は、新しいプロセスをスポーニングすることなく同じプロセスを使用し続けることによってchainTo関数の動作に従うが、コンパイラは、同様の方法でタスクのスポーニングを制御するためにchain及びchainTo関数がするのと同じように振る舞うskip関数の2つのバージョンを使用する可能性がある。コンパイラは、サブルーチンが実行されているノードのスキップフラグが設定される(つまり、ブール真値と評価される)場合、タスクセクションを呼び出すことなく下流のノードのskipを呼び出し、スキップフラグがクリアされる(つまり、ブール偽値と評価される)場合、(ノードがタスクノードである場合)タスクセクションを確かに呼び出し、下流のノードのchainを呼び出すように条件付きノードの下流のノードに関するサブルーチンを生成する。代替的に、コンパイラは、どのノードが条件付きノードの下流にあるかを判定する必要なしにデフォルトでサブルーチンの制御セクションに条件文を含める可能性がある。特に、スキップフラグを調べる「if」文が、コンパイラがその文を含めるべきか否かを判定する必要なしにあらゆるノードのサブルーチンに関してデフォルトで含められる可能性がある(ただし、それは、スキップフラグの不必要な検査を招く可能性がある)。
【0044】
制御フローグラフに条件ノードが存在する場合、複数の入力を有するノードは、ノードの種類に依存する論理的動作をランタイムで取得する。複数の入力リンク及び単一の出力リンクを有する接合ノードは、出力リンクによって接続される出力ノードがそのノードのサブルーチンを(skipの呼び出しではなく)chainの呼び出しの引数にすべきである場合、入力リンクによって接続される少なくとも1つの入力ノードがそのノードのサブルーチンに(skipの呼び出しではなく)chainの呼び出しを実行させなければならないように論理「OR」演算に対応する。複数の入力リンク及び単一の出力リンクを有するタスクノードは、そのタスクノードのサブルーチンが(skipの呼び出しではなく)chainの呼び出しの引数であるべきである場合、入力リンクによって接続される入力ノードのすべてがそれらのノードのサブルーチンに(skipの呼び出しではなく)chainの呼び出しを実行させなければならないように論理「AND」演算に対応する。
【0045】
この論理的動作を確実にするために、ノードに関連するスキップフラグは、所定の規則に従ってランタイムで設定され、クリアされる。スキップフラグの初期値は、制御フローグラフのノードのサブルーチンのいずれかの実行の前に行われる初期化フェーズの間に与えられ、さらに、ノードの種類に依存する。また、コンパイラは、ノードの種類に依存する異なる動作を有するskip関数及びchain関数の異なるバージョンを用いる。ノードNのスキップフラグを変更するための所定の1組の規則と、コンパイラによって使用される異なるバージョンの関数の動作との一例は、以下の通りである。
・複数入力接合ノード(OR演算)に関して、スキップフラグは、最初に設定され、skip_OR(N)は、スキップフラグを変更せず、chain_OR(N)は、スキップフラグをクリアする
・複数入力タスクノード(AND演算)に関して、スキップフラグは、最初にクリアされ、skip_AND(N)は、スキップフラグを設定し、chain_AND(N)は、スキップフラグを変更しない
・単一入力ノードに関して、スキップフラグは、最初に設定され、skip(N)は、スキップフラグを変更せず、chain(N)は、スキップフラグをクリアする
chainTo関数の動作は、スキップフラグに関してchain関数と同じである。単一入力ノードに関して、OR演算及びAND演算の動作は等価であり、(この例のOR演算の動作など)どちらかが使用され得る。この1組の規則に関して、(1又は2以上の)開始ノード(すなわち、いかなる入力リンクもないノード)は、それらのノードのスキップフラグを(そのスキップフラグの初期値がまだクリアされていない場合)クリアする。
【0046】
制御フローグラフ300に関して、ノードC1に関する条件が真であり、ノードC2に関する条件が偽であり、ノードC2の条件の検査が完了される前にノードT3に関するタスクが終了する、つまり、ノードT3に関するサブルーチンが、ノードJ2のスキップフラグをクリアし、ノードJ2に関するアクティブ化カウンタを(2から1に)デクリメントする(skip論理とは対照的な)chain論理に従い、それから、ノードT4に関するサブルーチンが、(スキップフラグを変更しない)skip論理に従い、ノードJ2に関するアクティブ化カウンタを(1から0に)デクリメントし、そのことが、ノードJ2のスキップフラグがノードT3のサブルーチンによってクリアされたのでchain(T5)を引き起こす場合を考える。
【0047】
その他の規則も、あり得る。ノードNのスキップフラグを変更するための所定の1組の規則と、コンパイラによって使用される異なるバージョンの関数の動作との別の例は、以下の通りである。
・接合ノードに関して、スキップフラグは、最初に設定され、skip_J(N)は、スキップフラグを変更せず、chain_J(N)は、スキップフラグをクリアする
・タスクノード又は条件付きノードに関して、スキップフラグは、最初にクリアされ、skip(N)は、スキップフラグを設定し、chain(N)は、スキップフラグを変更しない
この1組の規則に関して、(1又は2以上の)開始ノード(すなわち、いかなる入力リンクもないノード)は、それらのノードのスキップフラグを(そのスキップフラグの初期値がまだクリアされていない場合)やはりクリアする。
【0048】
コンパイラは、制御フローグラフの分析に基づいてサブルーチンの制御セクションの条件文又はその他の命令のさまざまな最適化を実行していてもよい可能性がある。例えば、制御フローグラフ300から、タスクノードT5のタスクは、最終的にタスクノードT5のタスクの実行を引き起こす接合ノードJ1と接合ノードJ3との間のリンクが存在するので、条件ノードC1及びC2の条件が真であるか又は偽であるかにかかわりなくスキップされると判定され得る。したがって、コンパイラは、タスクノードT5のスキップフラグの検査を避け、単にタスクノードT5のタスクセクションT5()を呼び出すタスクノードT5に関するサブルーチンを生成することができる。例えば、スキップされたセクションの後の下流のノードへのすべてのその他の入力が適切に処理される(つまり、下流のノードのカウンタを、スキップされたセクションに関する中間的な呼び出しが含まれていたとした場合にそのカウンタがデクリメントされたであろう回数だけデクリメントする)限り、制御フローグラフのセクション全体が条件付きノードの後でスキップされるべきである場合に関して、中間的なスキップフラグの検査及びskip関数の呼び出しを省くことによって、その他の最適化がコンパイラによってなされ得る。
【0049】
図4は、それぞれが条件ノード(それぞれC1及びC2)に続くタスクノードT1及びT2からの入力リンクを有する多入力タスクノードT3を含む単純な制御フローグラフ400の例を示す。この例において、タスクノードT3は、ノードT3のタスクが実行されるためにノードT1及びT2のタスクが両方とも(スキップされずに)実行されなければならないように論理AND演算に対応する。表5は、制御フローグラフ400に関して生成されるサブルーチンの例を示す。
【0051】
一部の実施形態において、接合ノード(又はその他のノード)は、ノードへの入力の特徴に依存するさまざまな種類の論理演算を行うように構成される可能性がある。例えば、ノードは、すべての入力が「必須」入力として指定されるとき、論理AND演算を行い、すべての入力が「任意選択」入力として指定されるとき、論理OR演算を行うように構成される可能性がある。一部の入力が「必須」と指定され、一部の入力が「任意選択」と指定される場合、1組の所定の規則が、ノードによって実行される論理演算の組合せを解釈するために使用される可能性がある。
【0052】
一部の実施形態においては、制御セクションの制御コードによって表されるコンパイラによって構築された状態機械が、上述のアクティブ化カウンタの値及びスキップフラグによって表される状態と等化の状態を表すためにその他の状態変数を使用する可能性がある。例えば、1組の状態は、「保留」、「アクティブ」、「完了」、及び「抑制」を含む可能性がある。この例において、タスクは、保留状態で始まる。状態の間の許容される遷移は、(1)保留から抑制、又は(2)保留からアクティブ、及びアクティブから完了を含む。アクティブ化カウンタを有するシステム及びアクティブ化カウンタを持たないシステムの動作の間にいくつかの違いが存在する。アクティブ化カウンタがゼロに達したと判定する上流のタスクのエピローグによって下流のタスクのプロローグの実行がトリガされる代わりに、タスクの実行は、そのタスクのプロローグが少なくとも1つの上流のタスクが完了状態であり、どの上流のタスクも保留状態でないと判定することによってトリガされる。代替的に、そのタスクのプロローグが、すべての上流のタスクが抑制状態であると判定する場合、そのタスクの実行が、やはり抑制される。
【0053】
一部の実施形態においては、アクティブ化カウンタの使用が、プロローグが呼び出される必要がある回数を削減する。例えば、アクティブ化カウンタがないと、下流のタスクのプロローグが、入力リンクに直接接続されたあらゆる上流のタスクについて1回呼び出される必要がある可能性がある。一方、アクティブ化カウンタがあると、下流のタスクのプロローグは、そのタスクのアクティブ化カウンタをデクリメントする最後の上流のタスクについてのみ呼び出される必要がある可能性がある。
【0054】
コンパイラは、使用される任意の種類の状態情報のために制御セクションにさらなる最適化を適用する可能性がある。例えば、特定のトポロジーを有する接続されたノードの特定のサブセットに関して、コンパイラは、削減された1組の制御セクションを提供する可能性がある。そのようなトポロジーの一例は、単一の上流のルートノードの下流に1又は2以上のノードを有するノードのツリーである。このツリー部分グラフの一部でない制御フローグラフの任意のノードは、通常のプロローグ及びエピローグを有する。しかし、ツリー部分グラフのノードに関して、コンパイラは、ルートノードに関する単一の組み合わされたプロローグと、ツリー部分グラフの葉ノードだけに関して削減された1組のエピローグとを提供する。コンパイラは、例えば、ルートノードから下流の制御フローグラフを動き回り、ルートノード又はツリーに前に追加された別のノードからの入力のみを有する任意のノードを追加することによってツリー部分グラフのメンバーを判定することができる。ツリー部分グラフに関する組み合わされたプロローグは、ツリーのすべてのノードのタスクセクションをまとめて実行又は抑制し、すべての葉ノードに関するエピローグを呼び出すコードを含む。その他のコンパイラの最適化は、いかなる上流のノードからの入力リンクを持たないあらゆるノードに関するプロローグを省略すること、又はいかなる下流のノードへのいかなる出力リンクも持たないあらゆるノードに関するエピローグを省略することを含む。
【0055】
一部の実施形態において、ノードによって表されるタスクは、制御フローグラフに加えてさまざまな種類のグラフに基づくプログラムの仕様のいずれかによって規定される部分的な順序を有する可能性がある。例えば、グラフに基づくプログラムの仕様の一部の有向辺が、(リンクされたノードがそれらのノードのタスクを同時に実行することを抑制する順序関係を課す可能性がある)制御フローを表す可能性があり、グラフに基づくプログラムの仕様のその他の有向辺は、(リンクされたノードがそれらのノードのタスクを同時に実行することを抑制しない依存関係を課す可能性がある)データフローを表す可能性がある。
【0056】
上述のタスク制御技術は、好適なソフトウェアを実行するコンピューティングシステムを用いて実装され得る。例えば、ソフトウェアは、それぞれが少なくとも1つのプロセッサ、(揮発性及び/又は不揮発性メモリ及び/又は記憶要素を含む)少なくとも1つのデータ記憶システム、(少なくとも1つの入力デバイス又はポートを用いて入力を受け取るため、及び少なくとも1つの出力デバイス又はポートを用いて出力を与えるための)少なくとも1つのユーザインターフェースを含む(分散、クライアント/サーバ、又はグリッドなどのさまざまなアーキテクチャである可能性がある)1又は2以上のプログラミングされた又はプログラミング可能なコンピューティングシステムで実行される1又は2以上のコンピュータプログラムの手順を含み得る。ソフトウェアは、例えば、データフローグラフの設計、構成、及び実行に関連するサービスを提供するより大きなプログラムの1又は2以上のモジュールを含む可能性がある。プログラムのモジュール(例えば、データフローグラフの要素)は、データリポジトリに記憶されたデータモデルに準拠するデータ構造又はその他の編成されたデータとして実装され得る。
【0057】
ソフトウェアは、CD−ROM又は(例えば、汎用若しくは専用のコンピューティングシステム若しくはデバイスによって読み取り可能な)その他のコンピュータ可読媒体などの有形の非一時的媒体で提供されるか、或いはそのソフトウェアが実行されるコンピューティングシステムの有形の非一時的媒体にネットワークの通信媒体を介して配信される(例えば、伝播信号で符号化される)可能性がある。処理の一部又はすべては、専用のコンピュータで、又はコプロセッサ若しくはフィールドプログラマブルゲートアレイ(FPGA,field-programmable gate array)若しくは専用の特定用途向け集積回路(ASIC,application-specific integrated circuit)などの専用のハードウェアを用いて実行される可能性がある。処理は、ソフトウェアによって指定された計算の異なる部分が異なる計算要素によって実行される分散された方法で実装される可能性がある。それぞれのそのようなコンピュータプログラムは、本明細書において説明された処理を実行するために記憶デバイスの媒体がコンピュータによって読み取られるときにコンピュータを構成し、動作させるために、汎用又は専用のプログラミング可能なコンピュータによってアクセス可能な記憶デバイスのコンピュータ可読記憶媒体(例えば、ソリッドステートメモリ若しくは媒体、又は磁気式若しくは光学式媒体)に記憶されるか又はダウンロードされることが好ましい。本発明のシステムは、コンピュータプログラムで構成された有形の非一時的媒体として実装されると考えられる可能性もあり、そのように構成された媒体は、本明細書において説明された処理ステップのうちの1又は2以上を実行するために特定の予め定義された方法でコンピュータを動作させる。
【0058】
本発明のいくつかの実施形態が、説明された。しかしながら、上述の説明は、添付の特許請求の範囲によって定義される本発明の範囲を例示するように意図されており、限定するように意図されていないことを理解されたい。したがって、その他の実施形態も、以下の特許請求の範囲内にある。例えば、本発明の範囲を逸脱することなくさまざまな修正がなされ得る。さらに、上述のステップの一部は、順序に依存しない可能性があり、したがって、説明された順序とは異なる順序で実行され得る。