特許第6761878号(P6761878)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ アビニシオ テクノロジー エルエルシーの特許一覧

特許6761878コンピューティングシステムによって実行されるタスクの制御
<>
  • 特許6761878-コンピューティングシステムによって実行されるタスクの制御 図000007
  • 特許6761878-コンピューティングシステムによって実行されるタスクの制御 図000008
  • 特許6761878-コンピューティングシステムによって実行されるタスクの制御 図000009
  • 特許6761878-コンピューティングシステムによって実行されるタスクの制御 図000010
  • 特許6761878-コンピューティングシステムによって実行されるタスクの制御 図000011
  • 特許6761878-コンピューティングシステムによって実行されるタスクの制御 図000012
  • 特許6761878-コンピューティングシステムによって実行されるタスクの制御 図000013
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6761878
(24)【登録日】2020年9月9日
(45)【発行日】2020年9月30日
(54)【発明の名称】コンピューティングシステムによって実行されるタスクの制御
(51)【国際特許分類】
   G06F 9/48 20060101AFI20200917BHJP
【FI】
   G06F9/48 370
【請求項の数】22
【全頁数】24
(21)【出願番号】特願2019-4419(P2019-4419)
(22)【出願日】2019年1月15日
(62)【分割の表示】特願2016-510749(P2016-510749)の分割
【原出願日】2014年4月23日
(65)【公開番号】特開2019-71120(P2019-71120A)
(43)【公開日】2019年5月9日
【審査請求日】2019年2月8日
(31)【優先権主張番号】61/815,052
(32)【優先日】2013年4月23日
(33)【優先権主張国】US
(73)【特許権者】
【識別番号】509123208
【氏名又は名称】アビニシオ テクノロジー エルエルシー
(74)【代理人】
【識別番号】100107984
【弁理士】
【氏名又は名称】廣田 雅紀
(74)【代理人】
【識別番号】100102255
【弁理士】
【氏名又は名称】小澤 誠次
(74)【代理人】
【識別番号】100096482
【弁理士】
【氏名又は名称】東海 裕作
(74)【代理人】
【識別番号】100188352
【弁理士】
【氏名又は名称】松田 一弘
(74)【代理人】
【識別番号】100131093
【弁理士】
【氏名又は名称】堀内 真
(74)【代理人】
【識別番号】100150902
【弁理士】
【氏名又は名称】山内 正子
(74)【代理人】
【識別番号】100141391
【弁理士】
【氏名又は名称】園元 修一
(74)【代理人】
【識別番号】100198074
【弁理士】
【氏名又は名称】山村 昭裕
(72)【発明者】
【氏名】スタンフィル クレイグ ダブリュ.
【審査官】 井上 宏一
(56)【参考文献】
【文献】 特開2010−244563(JP,A)
【文献】 特表2011−517352(JP,A)
【文献】 特開2010−286931(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/455−9/54
(57)【特許請求の範囲】
【請求項1】
コンピューティングシステムによって実行されるタスクを制御するための方法であって、
グラフに基づくプログラムの仕様に関するデータ構造をデータストレージシステムに記憶するステップであって、前記グラフに基づくプログラムの仕様が、タスクを表す複数のノードを含み、前記グラフに基づくプログラムの仕様が、前記ノードによって表される複数のタスクの間の少なくとも部分的な順序を規定するノードの間の有向辺を含む、前記記憶するステップと、
前記グラフに基づくプログラムの仕様によって規定されたプログラムを少なくとも1つのプロセッサを使用して実行するステップであって、
第1のタスクに対応する第1のサブルーチンを第1のプロセスによって実行することであって、前記第1のサブルーチンが、前記第1のタスクを実行するための第1のタスクセクション、及び前記グラフに基づくプログラムの仕様の中で前記第1のタスクのために1又は2以上の対応する後続のタスクの実行を制御するための論理を含む前記第1のサブルーチンに含まれる第1の制御セクションを含み、前記第1の制御セクションが、第2のタスクに対応する第2のサブルーチンを呼び出すための第1の関数呼び出しを含み、前記第2のタスクの実行時間を追跡する遅延タイマーにより遅延閾値を超える時間が計測され、前記第1のプロセスに前記第2のタスクの実行を引き継ぐ第2のプロセスをスポーニングさせるまで、前記第2のタスクは前記第1のプロセスを使用して実行を進められ、前記第1のサブルーチンが、前記遅延タイマーが前記遅延閾値を超える時間を計測したことに応答して、前記第1のプロセスが、前記第2のタスクの実行を引き継ぐ前記第2のプロセスをスポーニングした後に、前記第2のタスク第3のタスクが並列に実行されるように、前記第1のプロセス上で実行が進められる前記第3のタスクに対応する第3のサブルーチンを呼び出すための第2の関数呼び出しをさらに含む、前記実行すること、
前記第1のタスクセクションが前記第1のタスクを実行するのを待っている保留状態及び前記第1のタスクセクションが前記第1のタスクを実行することを防止された抑制状態を含む1組の可能な状態から選択された前記第1のタスクの状態を示す状態情報を記憶することを含む、前記実行するステップと、
前記第2のタスクに対応する前記第2のサブルーチンを実行するステップであって、前記第2のサブルーチンが、前記第2のタスクを実行するための第2のタスクセクション、及び記憶された状態情報によって示される前記第1のタスクの前記状態に少なくとも部分的に基づいて前記第2のタスクセクションの実行を制御する第2の制御セクションを含む、前記実行するステップとを含む、前記方法。
【請求項2】
上流のノードから下流のノードへの制御有向辺が、部分的な順序で前記上流のノードによって表されるタスクが前記下流のノードによって表される別のタスクに先立つことを示す、請求項1に記載の方法。
【請求項3】
1組の可能な状態が、第1のタスクセクションが第1のタスクを実行し終えた完了状態又は前記第1のタスクセクションが前記第1のタスクを実行する過程にあるアクティブ状態のうちの1又は2以上をさらに含む、請求項1に記載の方法。
【請求項4】
第2のサブルーチンの第2の制御セクションの論理が、第2のタスクセクションが呼び出されるか否かをフラグの値に基づいて判定する、請求項1に記載の方法。
【請求項5】
第2のサブルーチンの第2の制御セクションの論理が、第2のタスクを表すノードに制御有向辺によって接続されるノードによって表されるすべてのタスクが抑制状態にある場合、第2のタスクセクションが呼び出されないと判定する、請求項1に記載の方法。
【請求項6】
第2のサブルーチンの第2の制御セクションの論理が、第2のタスクを表すノードに制御有向辺によって接続されるノードによって表される少なくとも1つのタスクが完了状態にあり、前記第2のタスクを表すノードに制御有向辺によって接続されるノードによって表されるタスクのいずれも保留状態にない場合、第2のタスクセクションが呼び出されると判定する、請求項1に記載の方法。
【請求項7】
第2のサブルーチンの第2の制御セクションが、抑制状態を1又は2以上のその他のタスクに伝播させるために、記憶される状態情報を判定する論理を含む、請求項1に記載の方法。
【請求項8】
1群の複数のタスクの各々の状態情報が、前記1群の複数のタスクの前記各々のそれぞれ1つによって記憶され、第2のサブルーチンに含まれる第2の制御セクションによってアクセスされる、請求項1に記載の方法。
【請求項9】
第2のタスクが、第2のタスクセクションが呼び出されるかどうかを前記第2のタスクに関連するアクティベーションカウンタに基づいて判定し、前記アクティベーションカウンタが、複数のタスクの状態の変化に応じて調整されるカウンタ値を含み、前記第2のタスクを実行することが、調整されたアクティベーションカウンタが所定の値に一致することに応じて前記第2のタスクを実行することを含む、請求項1に記載の方法。
【請求項10】
第2のタスクの実行を引き継ぐように構成されたスポーニングされた第2のプロセスが、前記第2のタスクに関連するスタックフレームを取得し、前記スタックフレームに保有されたリターンポインタを取り除くように構成される、請求項1に記載の方法。
【請求項11】
タスクを制御するためのコンピューティングシステムであって、
グラフに基づくプログラムの仕様に関するデータ構造を記憶するための手段であって、前記グラフに基づくプログラムの仕様が、タスクを表す複数のノードを含み、前記グラフに基づくプログラムの仕様が、前記ノードによって表される複数のタスクの間の少なくとも部分的な順序を規定するノードの間の有向辺を含む、前記記憶するための手段と、前記グラフに基づくプログラムの仕様によって規定されたプログラムを実行するための手段とを含み、実行することが、
第1のタスクに対応する第1のサブルーチンを第1のプロセスによって実行することであって、前記第1のサブルーチンが、前記第1のタスクを実行するための第1のタスクセクション、及び前記グラフに基づくプログラムの仕様の中で前記第1のタスクのために1又は2以上の対応する後続のタスクの実行を制御するための論理を含む前記第1のサブルーチンに含まれる第1の制御セクションを含み、前記第1の制御セクションが、第2のタスクに対応する第2のサブルーチンを呼び出すための第1の関数呼び出しを含み、前記第2のタスクの実行時間を追跡する遅延タイマーにより遅延閾値を超える時間が計測され、前記第1のプロセスに前記第2のタスクの実行を引き継ぐ第2のプロセスをスポーニングさせるまで、前記第2のタスクは前記第1のプロセスを使用して実行を進められ、前記第1のサブルーチンが、前記遅延タイマーが前記遅延閾値を超える時間を計測したことに応答して、前記第1のプロセスが、前記第2のタスクの実行を引き継ぐ前記第2のプロセスをスポーニングした後に、前記第2のタスク第3のタスクが並列に実行されるように、前記第1のプロセス上で実行が進められる前記第3のタスクに対応する第3のサブルーチンを呼び出すための第2の関数呼び出しをさらに含む、前記実行すること、
前記第1のタスクセクションが前記第1のタスクを実行するのを待っている保留状態及び前記第1のタスクセクションが前記第1のタスクを実行することを防止された抑制状態を含む1組の可能な状態から選択された前記第1のタスクの状態を示す状態情報を記憶すること、並びに
前記第2のタスクに対応する前記第2のサブルーチンを実行することであって、前記第2のサブルーチンが、前記第2のタスクを実行するための第2のタスクセクション、及び記憶された状態情報によって示される前記第1のタスクの前記状態に少なくとも部分的に基づいて前記第2のタスクセクションの実行を制御する第2の制御セクションを含む、前記実行することを含む、前記コンピューティングシステム。
【請求項12】
上流のノードから下流のノードへの制御有向辺が、部分的な順序で前記上流のノードによって表されるタスクが前記下流のノードによって表される別のタスクに先立つことを示す、請求項11に記載のコンピューティングシステム。
【請求項13】
1組の可能な状態が、第1のタスクセクションが第1のタスクを実行し終えた完了状態又は前記第1のタスクセクションが前記第1のタスクを実行する過程にあるアクティブ状態のうちの1又は2以上をさらに含む、請求項11に記載のコンピューティングシステム。
【請求項14】
第2のサブルーチンの第2の制御セクションの論理が、第2のタスクセクションが呼び出されるか否かをフラグの値に基づいて判定する、請求項11に記載のコンピューティングシステム。
【請求項15】
第2のサブルーチンの第2の制御セクションの論理が、第2のタスクを表すノードに制御有向辺によって接続されるノードによって表されるすべてのタスクが抑制状態にある場合、第2のタスクセクションが呼び出されないと判定する、請求項11に記載のコンピューティングシステム。
【請求項16】
第2のサブルーチンの第2の制御セクションの論理が、第2のタスクを表すノードに制御有向辺によって接続されるノードによって表される少なくとも1つのタスクが完了状態にあり、前記第2のタスクを表すノードに制御有向辺によって接続されるノードによって表されるタスクのいずれも保留状態にない場合、第2のタスクセクションが呼び出されると判定する、請求項11に記載のコンピューティングシステム。
【請求項17】
第2のサブルーチンの第2の制御セクションが、抑制状態を1又は2以上のその他のタスクに伝播させるために、記憶される状態情報を判定する論理を含む、請求項11に記載のコンピューティングシステム。
【請求項18】
1群の複数のタスクの各々の状態情報が、前記1群の複数のタスクの前記各々のそれぞれ1つによって記憶され、第2のサブルーチンに含まれる第2の制御セクションによってアクセスされる、請求項11に記載のコンピューティングシステム。
【請求項19】
第2のタスクが、第2のタスクセクションが呼び出されるかどうかを前記第2のタスクに関連するアクティベーションカウンタに基づいて判定し、前記アクティベーションカウンタが、複数のタスクの状態の変化に応じて調整されるカウンタ値を含み、前記第2のタスクを実行することが、調整されたアクティベーションカウンタが所定の値に一致することに応じて前記第2のタスクを実行することを含む、請求項11に記載のコンピューティングシステム。
【請求項20】
第2のタスクの実行を引き継ぐように構成されたスポーニングされた第2のプロセスが、前記第2のタスクに関連するスタックフレームを取得し、前記スタックフレームに保有されたリターンポインタを取り除くように構成される、請求項11に記載のコンピューティングシステム。
【請求項21】
タスクを制御するための、コンピュータ可読ストレージ媒体に記憶されたコンピュータプログラムであって、コンピューティングシステムに請求項1〜10のいずれかに記載の方法を実行させるための命令を含む、前記コンピュータプログラム。
【請求項22】
タスクを制御するためのコンピューティングシステムであって、
グラフに基づくプログラムの仕様に関するデータ構造を記憶するデータストレージシステムと、
請求項1〜10のいずれかに記載の方法を実行するように構成された少なくとも1つのプロセッサとを含む、前記コンピューティングシステム。
【発明の詳細な説明】
【技術分野】
【0001】
関連出願の相互参照
本出願は、2013年4月23日に出願した米国特許出願第61/815,052号の優先権を主張するものである。
【0002】
この説明は、コンピューティングシステムによって実行されるタスクの制御に関する。
【背景技術】
【0003】
コンピューティングシステムによって実行されるタスクを制御するための一部の技術においては、個々のタスクはプロセス又はスレッドによって実行され、プロセス又はスレッドは、そのタスクのためにスポーニング(spawn)され、そのタスクが完了された後に終
了する。コンピューティングシステムのオペレーティングシステム、又はオペレーティングシステムの機能を使用するその他の集中型の制御エンティティが、異なるタスクをスケジューリングし、又は異なるタスクの間の通信を管理するために使用される可能性がある。その他の下流のタスク(例えば、タスクB)が始まる前に完了しなければならない特定の上流のタスク(例えば、タスクA)を示すことによってタスクの部分的な順序を定義するために、制御フローグラフが使用される可能性がある。制御フローグラフに従ってタスクを実行するための新しいプロセスのスポーニングを管理する制御プロセスが、存在する可能性がある。制御プロセスは、タスクAを実行するためのプロセスAをスポーニングした後、プロセスAが終了したというオペレーティングシステムによる通知を待つ。プロセスAが終了した後、オペレーティングシステムが、制御プロセスに通知し、そして、制御プロセスが、タスクBを実行するためのプロセスBをスポーニングする。
【発明の概要】
【課題を解決するための手段】
【0004】
一態様においては、概して、コンピューティングシステムによって実行されるタスクを制御するための方法が、複数のタスクの間の少なくとも部分的な順序を規定する順序情報を受信するステップと、順序情報に少なくとも部分的に基づいてタスクの少なくとも一部を実行するための命令を少なくとも1つのプロセッサを用いて生成するステップとを含む。生成するステップは、第1のタスクに対応する第1のサブルーチンを実行するための命令を記憶することであって、第1のサブルーチンが、第2のタスクに対応する少なくとも第2のサブルーチンの実行を制御する第1の制御セクション(control section)を含み
、第1の制御セクションが、第2のタスクに関連する状態情報を変更し、変更された状態情報に基づいて第2のサブルーチンの実行を開始すべきか否かを判定するように構成された関数を含む、記憶すること、並びに第2のサブルーチンを実行するための命令を記憶することであって、第2のサブルーチンが、第2のタスクを実行するためのタスクセクション(task section)、及び第3のタスクに対応する第3のサブルーチンの実行を制御する第2の制御セクションを含む、記憶することを含む。
【0005】
態様は、以下の特徴のうちの1又は2以上を含み得る。
【0006】
順序情報は、それぞれのタスクを表すノードのペアの間の有向辺を含む制御フローグラフを含み、上流のノードから下流のノードへの有向辺が、部分的な順序で上流のノードによって表されるタスクが下流のノードによって表されるタスクに先行することを示す。
【0007】
制御フローグラフは、第1のタスクを表す第1のノードと第2のタスクを表す第2のノードとの間の有向辺、及び第2のノードと第3のタスクを表す第3のノードとの間の有向
辺を含む。
【0008】
関数は、第2のタスクに関連するカウンタをデクリメント又はインクリメントし、カウンタの値に基づいて第2のサブルーチンの実行を開始すべきか否かを判定するように構成される。
【0009】
関数は、カウンタをアトミックにデクリメント又はインクリメントし、カウンタの値を読むアトミックな操作を実行するように構成される。
【0010】
変更された状態情報は、第2のタスクを特定する引数を用いた関数の前の呼び出しの履歴を含む。
【0011】
関数は、複数の異なる関数のうちの1つであり、状態情報は、第2のタスクを特定する引数を用いた複数の異なる関数のいずれかの前の呼び出しの履歴を捕捉する。
【0012】
第2の制御セクションは、タスクを実行するためのタスクセクションが呼び出されるか否かを判定する論理を含む。
【0013】
論理は、第2のタスクに関連するフラグの値に基づいて、タスクを実行するためのタスクセクションが呼び出されるか否かを判定する。
【0014】
第1の制御セクションは、少なくとも、第2のタスクに対応する第2のサブルーチン及び第4のタスクに対応する第4のサブルーチンの実行を制御する。
【0015】
順序情報は、部分的な順序で第1のタスクが第2のタスクに先行することを示し、部分的な順序で第1のタスクが第4のタスクに先行することを示し、部分的な順序で互いに対する第2のタスク及び第4のタスクの順序を制約しない。
【0016】
第1の制御セクションは、第2のサブルーチンを実行するための新しいプロセスをスポーニングすべきか否かを判定する第1の関数と、第1のサブルーチンを実行した同じプロセスを用いて第4のサブルーチンの実行を開始する第2の関数とを含む。
【0017】
別の態様においては、概して、コンピュータプログラムが、タスクを制御するために、コンピュータ可読記憶媒体に記憶される。コンピュータプログラムは、コンピューティングシステムに、複数のタスクの間の少なくとも部分的な順序を規定する順序情報を受信させ、順序情報に少なくとも部分的に基づいてタスクの少なくとも一部を実行するための命令を生成するための命令を含む。生成することは、第1のタスクに対応する第1のサブルーチンを実行するための命令を記憶することであって、第1のサブルーチンが、第2のタスクに対応する少なくとも第2のサブルーチンの実行を制御する第1の制御セクションを含み、第1の制御セクションが、第2のタスクに関連する状態情報を変更し、変更された状態情報に基づいて第2のサブルーチンの実行を開始すべきか否かを判定するように構成された関数を含む、記憶すること、並びに第2のサブルーチンを実行するための命令を記憶することであって、第2のサブルーチンが、第2のタスクを実行するためのタスクセクション、及び第3のタスクに対応する第3のサブルーチンの実行を制御する第2の制御セクションを含む、記憶することを含む。
【0018】
別の態様においては、概して、タスクを制御するためのコンピューティングシステムが、複数のタスクの間の少なくとも部分的な順序を規定する順序情報を受信するように構成された入力デバイス又はポートと、順序情報に少なくとも部分的に基づいてタスクの少なくとも一部を実行するための命令を生成するように構成された少なくとも1つのプロセッ
サとを含む。生成することは、第1のタスクに対応する第1のサブルーチンを実行するための命令を記憶することであって、第1のサブルーチンが、第2のタスクに対応する少なくとも第2のサブルーチンの実行を制御する第1の制御セクションを含み、第1の制御セクションが、第2のタスクに関連する状態情報を変更し、変更された状態情報に基づいて第2のサブルーチンの実行を開始すべきか否かを判定するように構成された関数を含む、記憶すること、並びに第2のサブルーチンを実行するための命令を記憶することであって、第2のサブルーチンが、第2のタスクを実行するためのタスクセクション、及び第3のタスクに対応する第3のサブルーチンの実行を制御する第2の制御セクションを含む、記憶することを含む。
【0019】
別の態様においては、概して、タスクを制御するためのコンピューティングシステムが、複数のタスクの間の少なくとも部分的な順序を規定する順序情報を受信するための手段と、順序情報に少なくとも部分的に基づいてタスクの少なくとも一部を実行するための命令を生成するための手段とを含む。生成することは、第1のタスクに対応する第1のサブルーチンを実行するための命令を記憶することであって、第1のサブルーチンが、第2のタスクに対応する少なくとも第2のサブルーチンの実行を制御する第1の制御セクションを含み、第1の制御セクションが、第2のタスクに関連する状態情報を変更し、変更された状態情報に基づいて第2のサブルーチンの実行を開始すべきか否かを判定するように構成された関数を含む、記憶すること、並びに第2のサブルーチンを実行するための命令を記憶することであって、第2のサブルーチンが、第2のタスクを実行するためのタスクセクション、及び第3のタスクに対応する第3のサブルーチンの実行を制御する第2の制御セクションを含む、記憶することを含む。
【0020】
別の態様においては、概して、タスクを実行するための方法が、複数のタスクを実行するための命令を少なくとも1つのメモリに記憶するステップであって、命令が、タスクの少なくとも一部のそれぞれに関して、そのタスクを実行するためのタスクセクション、及び後続のタスクのサブルーチンの実行を制御する制御セクションを含むそれぞれのサブルーチンを含む、記憶するステップと、記憶されたサブルーチンの少なくとも一部を少なくとも1つのプロセッサによって実行するステップとを含む。実行することは、第1のタスクに関する第1のサブルーチンを実行するための第1のプロセスをスポーニングすることであって、第1のサブルーチンが、第1のタスクセクション及び第1の制御セクションを含む、スポーニングすること、並びに第1のタスクセクションが返った後に、第2のサブルーチンを実行するための第2のプロセスをスポーニングすべきか否かを判定する第1の制御セクションに含まれる少なくとも1つの関数を呼び出すことを含む。
【0021】
態様は、以下の特徴のうちの1又は2以上を含み得る。
【0022】
関数は、第2のサブルーチンに関連するカウンタをデクリメントし、カウンタの値に基づいて第2のサブルーチンの実行を開始すべきか否かを判定するように構成される。
【0023】
関数は、第2のサブルーチンに対応する第2のタスクを特定する引数を用いて呼び出されるときに、第2のタスクを特定する引数を用いた関数の前の呼び出しの履歴を捕捉する状態情報に基づいて第2のサブルーチンの実行を開始すべきか否かを判定するように構成される。
【0024】
関数は、複数の異なる関数のうちの1つであり、状態情報は、第2のタスクを特定する引数を用いた複数の異なる関数のいずれかの前の呼び出しの履歴を捕捉する。
【0025】
関数は、第1のプロセスにおいて第2のサブルーチンの実行を開始し、第2のサブルーチンの実行時間が所定の閾値を超えることに応じて、第2のサブルーチンの実行を続ける
ための第2のプロセスをスポーニングするように構成される。
【0026】
関数は、第1のプロセスに関連付けられたスタックフレームを第2のプロセスに与えるように構成される。
【0027】
関数は、第1のプロセスが第2のプロセスと同時に実行され続けることを可能にするために第2のプロセスをスポーニングした後に返るように構成される。
【0028】
第1の制御セクションは、第1のタスクセクションが呼び出されるか否かを判定する論理を含む。
【0029】
論理は、第1のタスクに関連するフラグの値に基づいて、第1のタスクセクションが呼び出されるか否かを判定する。
【0030】
第2のサブルーチンは、第2のタスクに対応し、第1の制御セクションは、第1のタスク及び第2のタスクを含む複数のタスクの間の少なくとも部分的な順序を規定する順序情報に少なくとも部分的に基づく。
【0031】
順序情報は、それぞれのタスクを表すノードのペアの間の有向辺を含む制御フローグラフを含み、上流のノードから下流のノードへの有向辺が、部分的な順序で上流のノードによって表されるタスクが下流のノードによって表されるタスクに先行することを示す。
【0032】
別の態様においては、概して、コンピュータプログラムが、タスクを実行するために、コンピュータ可読記憶媒体に記憶される。コンピュータプログラムは、コンピューティングシステムに、複数のタスクを実行するための命令を記憶させ、命令が、タスクの少なくとも一部のそれぞれに関して、そのタスクを実行するためのタスクセクション、及び後続のタスクのサブルーチンの実行を制御する制御セクションを含むそれぞれのサブルーチンを含み、記憶されたサブルーチンの少なくとも一部を実行させる命令を含む。実行することは、第1のタスクに関する第1のサブルーチンを実行するための第1のプロセスをスポーニングすることであって、第1のサブルーチンが、第1のタスクセクション及び第1の制御セクションを含む、スポーニングすること、並びに第1のタスクセクションが返った後に、第2のサブルーチンを実行するための第2のプロセスをスポーニングすべきか否かを判定する第1の制御セクションに含まれる少なくとも1つの関数を呼び出すことを含む。
【0033】
別の態様においては、概して、タスクを実行するためのコンピューティングシステムが、複数のタスクを実行するための命令を記憶する少なくとも1つのメモリであって、命令が、タスクの少なくとも一部のそれぞれに関して、そのタスクを実行するためのタスクセクション、及び後続のタスクのサブルーチンの実行を制御する制御セクションを含むそれぞれのサブルーチンを含む、少なくとも1つのメモリと、記憶されたサブルーチンの少なくとも一部を実行するように構成された少なくとも1つのプロセッサとを含む。実行することは、第1のタスクに関する第1のサブルーチンを実行するための第1のプロセスをスポーニングすることであって、第1のサブルーチンが、第1のタスクセクション及び第1の制御セクションを含む、スポーニングすること、並びに第1のタスクセクションが返った後に、第2のサブルーチンを実行するための第2のプロセスをスポーニングすべきか否かを判定する第1の制御セクションに含まれる少なくとも1つの関数を呼び出すことを含む。
【0034】
別の態様においては、概して、タスクを実行するためのコンピューティングシステムが、複数のタスクを実行するための命令を記憶するための手段であって、命令が、タスクの
少なくとも一部のそれぞれに関して、そのタスクを実行するためのタスクセクション、及び後続のタスクのサブルーチンの実行を制御する制御セクションを含むそれぞれのサブルーチンを含む、手段と、記憶されたサブルーチンの少なくとも一部を実行するための手段とを含む。実行することは、第1のタスクに関する第1のサブルーチンを実行するための第1のプロセスをスポーニングすることであって、第1のサブルーチンが、第1のタスクセクション及び第1の制御セクションを含む、スポーニングすること、並びに第1のタスクセクションが返った後に、第2のサブルーチンを実行するための第2のプロセスをスポーニングすべきか否かを判定する第1の制御セクションに含まれる少なくとも1つの関数を呼び出すことを含む。
【0035】
態様は、以下の利点のうちの1又は2以上を含む可能性がある。
【0036】
タスクがコンピューティングシステムによって実行されるとき、タスクを実行するための新しいプロセスをスポーニングすることに関連し、タスクのプロセスと、スケジューラ、又はタスクの依存関係及び順序を維持するためのその他の中心的なプロセスとの間を行ったり来たり切り替えることに関連する処理時間のコストが存在する。本明細書において説明される技術は、計算効率の良い方法で、新しいプロセスが選択的にスポーニングされること、又は実行されているプロセスが選択的に再利用されることを可能にする。コンパイラは、タスクを実行するためのサブルーチンに追加される比較的少ない量のコードに基づく分散型のスケジューリングメカニズムによって、集中型のスケジューラにのみ頼る必要性を避けることができる。タスクの完了が、自動的に、同時実行及び条件付き論理を可能にする方法で、制御フローグラフなどの入力の制約に従ってコンピューティングシステムがその他のタスクを実行することを引き起こす。タスクに関連するコンパイラにより生成されたコードが、カウンタ及びフラグに記憶された状態情報に基づいてその他のタスクを実行すべきか否かを判定するための関数をランタイムで呼び出す。したがって、コンパイラによって生成されたコードが、タスクのサブルーチンの呼び出しをランタイムで制御する状態機械を効率的に実装している。スケジューラへの及びスケジューラからの切り替えの余計なオーバーヘッドなしに、コンピューティングシステムは、細かい粒度の潜在的に同時のタスクをより効率的に実行することができる。
【0037】
本発明のその他の特徴及び利点は、以下の説明及び請求項から明らかになるであろう。
【図面の簡単な説明】
【0038】
図1】コンピューティングシステムのブロック図である。
図2A】制御フローグラフの図である。
図2B-2D】図2Aの制御フローグラフのノードに関するサブルーチンの実行に関連するプロセスの存続期間の図である。
図3-4】制御フローグラフの図である。
【発明を実施するための形態】
【0039】
図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をホストするコンピュータと通信するリモートシステムでホストされる可能性がある。
【0040】
図2Aは、コンピューティングシステム100によって実行される1組のタスクに対して課される部分的な順序を定義する制御フローグラフ200の例を示す。制御フローグラフ200によって定義される部分的な順序は、記憶されるタスクの仕様104で符号化される。一部の実施形態において、ユーザ112は、制御フローグラフに含まれるさまざまな種類のノードを選択し、接続されたノードの間の順序の制約を表すリンクによってそれらのノードの一部を接続する。ノードの1つの種類は、図2Aにおいて角の四角いブロックによって表されるタスクノードである。それぞれのタスクノードは、実行される異なるタスクを表す。(有向リンクの始点の)第1のタスクノードから(有向リンクの終点の)第2のタスクノードに接続された有向リンクは、第2のノードのタスクが開始し得るよりも前に第1のノードのタスクが完了しなければならないという順序の制約を課す。ノードの別の種類は、図2Aにおいて角の丸いブロックによって表される接合ノードである。制御フローグラフが条件付きの動作(behavior)を含まない場合、接合ノードは、単に、順序の制約を課すように働く。単一の入力リンク及び複数の出力リンクを有する接合ノードは、出力リンクによって接続されるタスクノードのいずれのタスクが開始し得るよりも前に入力リンクによって接続されるタスクノードのタスクが完了しなければならないように順序の制約を課す。複数の入力リンク及び単一の出力リンクを有する接合ノードは、出力リンクによって接続されるタスクノードのタスクが開始し得るよりも前に入力リンクによって接続されるタスクノードのすべてのタスクが完了しなければならないように順序の制約を課す。タスクノードは、複数の入力リンクの終点でもあり、そのタスクノードのタスクが開始し得るよりも前に入力リンクによって接続されるタスクノードのすべてのタスクが完了しなければならないように順序の制約を課す可能性がある。以下でより詳細に説明されるように、条件付きの動作によって、複数の入力リンクを有するタスクノードは、複数の入力を有する接合ノードとは異なる論理的な動作をさらに提供する。
【0041】
制御フローグラフが構築された後、コンパイラ106は、タスク情報と、その制御フローグラフによって表される順序の情報とを符号化するタスクの仕様104をコンパイルし、タスクを実行するための命令を生成する。命令は、実行される用意のできている低レベルのマシンコードの形態、又は最終的に実行される低レベルのマシンコードを提供するためにさらにコンパイルされるより高レベルのコードの形態である可能性がある。生成された命令は、それぞれのタスクノードに関するサブルーチン(「タスクサブルーチン」)及びそれぞれの接合ノードに関するサブルーチン(「接合サブルーチン」)を含む。タスクサブルーチンのそれぞれは、対応するタスクを実行するための(タスク本体(task body
)とも呼ばれる)タスクセクションを含む。タスクノードは、コンパイラが適切なタスクセクションを生成することができるように実行される対応するタスクの何らかの説明を含
む。例えば、一部の実施形態において、タスクノードは、呼び出される特定の関数、実行されるプログラム、又はタスクセクションに含められるその他の実行可能コードを特定する。また、タスクサブルーチンの一部は、制御フローグラフの別のノードに関する後続のサブルーチンの実行を制御する制御セクションを含み得る。いかなる下流のノードにも接続されないタスクノードに関するタスクサブルーチンは、そのタスクノードの完了後に制御がいかなる後続のタスクにも渡される必要がないので制御セクションを必要としない可能性がある。接合ノードの目的は、制御のフローに対する制約を規定することであるので、接合サブルーチンのそれぞれは、制御セクションをその主要部として含む。
【0042】
制御セクションに含まれる関数の例は、制御フローグラフのノードに関連する状態情報に基づいて後続のノードに関するサブルーチンを実行するための新しいプロセスをスポーニングすべきか否かを判定する「chain」関数である。chain関数の引数が、その後続のノードを特定する。下の表は、制御フローグラフ200のノードのそれぞれに関してコンパイラによって書かれるサブルーチンに含まれる関数の例を示し、タスクサブルーチンのタスクセクションが、関数呼び出しT#()によって表され、サブルーチンの残りが、制御セクションを表すと考えられる。(その他の例において、タスクセクションは、最後の関数が返った後にタスクが完了されるようにして複数の関数呼び出しを含む可能性がある。)接合サブルーチンは、タスクセクションを含まず、したがって、すべて制御セクションによって構成される。この例においては、別々の関数呼び出しは、それらの関数が呼び出される順序でセミコロンによって分けられる。
【0043】
【表1】
【0044】
タスクの仕様104がコンパイルされた後、コンピューティングシステム100は、生成されたサブルーチンを実行環境108のメモリシステム110にロードする。特定のサブルーチンが呼び出されるとき、プログラムカウンタが、サブルーチンが記憶されるメモリシステム110のアドレス空間の一部の始めの対応するアドレスに設定される。
【0045】
スケジューリングされた時間に、又はユーザ入力若しくは所定のイベントに応じて、コンピューティングシステム100は、制御フローグラフのルートを表すロードされたサブルーチンのうちの少なくとも1つの実行を開始する。例えば、制御フローグラフ200に関して、コンピューティングシステム100は、タスクノードT1に関するタスクサブルーチンを実行するためのプロセスをスポーニングする。サブルーチンが実行を開始するとき、プロセスは、最初に、タスクノードT1のタスクを実行するためのタスクセクション
を呼び出し、それから、タスクセクションが返った(タスクノードT1のタスクの完了を示す)後に、プロセスは、サブルーチンの制御セクションのchain関数を呼び出す。特定のノードに関するサブルーチンを実行するために新しいプロセスをスポーニングすべきか否かを判定するためにchain関数によって使用される状態情報は、以下でより詳細に説明されるように、その特定のノードを引数として呼び出された前のchain関数の履歴を捕捉する情報である。
【0046】
この履歴情報は、異なるノードに関連するアクティブ化カウンタに保有され得る。カウンタの値は、例えば、メモリシステム110の一部又はその他の作業用記憶域に記憶される可能性がある。第1のプロセスがスポーニングされる前に、各ノードに関するアクティブ化カウンタの値は、そのノードへの入力リンクの数に初期化される。したがって、制御フローグラフ200に関しては、以下の値に初期化された6つのアクティブ化カウンタが存在する。
【0047】
【表2】
【0048】
タスクノードT1は入力リンクを持たないので、そのタスクノードT1のアクティブ化カウンタは、ゼロに初期化される。代替的に、いかなる入力リンクも持たない最初のノードに関しては、そのノードに関連するアクティブ化カウンタが存在する必要がない。入力リンクを介して接続される異なるノードの制御セクションは、下流のリンクされたノードのアクティブ化カウンタをデクリメントし、デクリメントされた値に基づいてアクションを決定する。一部の実施形態においては、カウンタにアクセスする関数が、カウンタをアトミックにデクリメントし、デクリメント操作の前か又は後かのどちらかでカウンタの値を読むアトミックな操作(例えば、アトミックな「decrement−and−test」操作)を使用することができる。一部のシステムにおいては、そのような操作が、システムのネイティブの命令によってサポートされる。代替的に、カウンタの値がゼロに達するまでカウンタをデクリメントする代わりに、カウンタが、ゼロで始まる可能性があり、関数が、(例えば、アトミックな「increment−and−test」操作を用いて)カウンタの値がノードへの入力リンクの数に初期化された所定の閾値に達するまでカウンタをインクリメントする可能性がある。
【0049】
chain関数「chain(N)」の呼び出しは、ノードNのアクティブ化カウンタをデクリメントし、デクリメントされた値がゼロである場合、chain関数は、新しくスポーニングされたプロセスによるノードNのサブルーチンの実行をトリガし、それから
返す。デクリメントされた値がゼロよりも大きい場合、chain関数は、新しいサブルーチンの実行をトリガすること又は新しいプロセスのスポーニングすることなしにただ返す。サブルーチンの制御セクションは、表1の接合ノードJ1に関する接合サブルーチンと同様に、chain関数の複数の呼び出しを含む可能性がある。制御セクションの最後の関数が返った後、サブルーチンを実行するプロセスは、終了する可能性があり、又は一部の関数呼び出しに関しては(例えば、以下で説明される「chainTo」関数呼び出しに関しては)、プロセスは、別のサブルーチンの実行を続ける。新しいプロセスのこの条件付きのスポーニングは、新しいプロセスのスポーニングを管理するためのスケジューラプロセスへの切り替え及び新しいプロセスのスポーニングを管理するためのスケジューラプロセスからの切り替えを必要とせずに、所望の部分的な順序に従って(潜在的に同時に)タスクサブルーチンが実行されることを可能にする。
【0050】
表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に関するタスクサブルーチンに関する制御セクションが存在しないので完了する。
【0051】
表1のサブルーチンの例においては、新しいプロセスが、制御フローグラフ200の各ノードのサブルーチンに関してスポーニングされる。中心的なタスク監視又はスケジューリングプロセスを必要とせずに、新しいプロセスをスポーニングすべきか否かを判定する制御セクションを独自に含む各プロセスのサブルーチンによっていくらかの効率が得られるが、制御セクションに対する特定のコンパイラの最適化によってより一層の効率が得られる可能性がある。例えば、1つのコンパイラの最適化では、第1のサブルーチンの制御セクションにchain関数の単一の呼び出しが存在する場合、次のサブルーチン(すなわち、そのchain関数の引数)が、第1のサブルーチンを実行している同じプロセス内で(アクティブ化カウンタがゼロに達するときに)実行される可能性がある−−新しいプロセスは、スポーニングされる必要がない。これを実現する1つの方法は、コンパイラがノードの最後の出力リンクに関する異なる関数呼び出し(例えば、「chain」関数の代わりに「chainTo」関数)を明示的に生成することである。chainTo関数は、アクティブ化カウンタがゼロであるときにその関数の引数のサブルーチンを実行するための新しいプロセスをスポーニングする代わりに、その関数の引数のサブルーチンを同じプロセスに実行させることを除いてchain関数と同様である。ノードが単一の出力リンクを有する場合、そのノードのコンパイルされたサブルーチンは、chainTo関数の単一の呼び出しを有する制御セクションを有する。ノードが複数の出力リンクを有する場合、そのノードのコンパイルされたサブルーチンは、chain関数の1又は2以上の呼び出し及びchainTo関数の単一の呼び出しを有する制御セクションを有する
。これは、独立したプロセスでスポーニングされるサブルーチンの数及びそれらのサブルーチンの関連する開始オーバーヘッドを削減する。表3は、このコンパイラの最適化を用いて制御フローグラフ200に関して生成されるサブルーチンの例を示す。
【0052】
【表3】
【0053】
表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の異なるノードに関するサブルーチンを実行するときのそれらのプロセスの存続期間の例を示す。プロセスを表す線に沿った点は、(破線によって点に接続された)異なるノードに関するサブルーチンの実行に対応する。点の間の線分の長さは、必ずしも経過時間に比例せず、単に、異なるサブルーチンが実行される相対的な順序と、新しいプロセスがスポーニングされる時点とを示すように意図されている。
【0054】
潜在的に効率をさらに向上させることができる修正の別の例は、特定のサブルーチンが同時実行の恩恵を受け得ることを示す閾値が満たされるまで遅らされた新しいプロセスのスポーニングである。異なるプロセスによる複数のサブルーチンの同時実行は、サブルーチンのそれぞれが完了するのにかなりの量の時間がかかる場合に特に恩恵がある。そうではなく、サブルーチンのいずれかがその他のサブルーチンと比べて完了するのに比較的少ない量の時間がかかる場合、そのサブルーチンは、効率の大きな損失なしに別のサブルーチンと逐次的に実行される可能性がある。遅らされたスポーニングのメカニズムは、かなりの量の時間がかかり、一緒に実行され得る複数のタスクが、プロセスを同時に実行することによって実行されることを可能にするが、さらに、より短いタスクのための新しいプロセスのスポーニングを抑制するように試みる。
【0055】
遅らされたスポーニングを用いるchain関数の代替的な実施形態においては、chainTo関数に似たchain関数が、その関数の引数のサブルーチンの実行を同じプロセスに開始させる。しかし、chainTo関数とは異なり、タイマーが、サブルーチンを実行するのにかかる時間を追跡し、閾値の時間が超えられる場合、chain関数は、サブルーチンの実行を継続するために新しいプロセスをスポーニングする。第1のプロセスは、サブルーチンが完了したかのように継続することができ、第2のプロセスは、第1のプロセスが終了した時点でサブルーチンの実行を引き継ぐことができる。これを実現するために使用され得る1つのメカニズムは、第2のプロセスが第1のプロセスからサブルーチンのスタックフレームを継承することである。実行されているサブルーチンに関するスタックフレームは、特定の命令を指すプログラムカウンタと、サブルーチンの実行に関連するその他の値(例えば、ローカル変数及びレジスタ値)を含む。この例において、T2に関するタスクサブルーチンのスタックフレームは、プロセスがT2に関するタスクサブルーチンの完了後にJ1に関する接合サブルーチンに返すことを可能にするリターンポインタ(return pointer)を含む。遅らされたスポーニングのタイマーが超えられるとき、新しいプロセスがスポーニングされ、T2に関するタスクサブルーチンの既存のスタックフレームに関連付けられ、第1のプロセスが、(「chainTo(T3)」を呼び出すために)J1に関する接合サブルーチンに直ちに戻る。継承されたスタックフレームのリターンポインタは、新しいプロセスがT2に関するタスクサブルーチンの完了後にJ1に関する接合サブルーチンに戻る必要がないので取り除かれる(つまり、ヌルにされる)。したがって、遅らされたスポーニングは、タスクが(構成可能な閾値に比して)迅速である場合に関して、新しいプロセスをスポーニングするオーバーヘッドなしに後続のタスクに関するサブルーチンが実行されることを可能にし、既存のスタックフレームを継承することによって、タスクがより長い場合に関して、新しいプロセスのスポーニングにかかわるオーバーヘッドを削減する。
【0056】
図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のタスクの同時実行が、そのような同時実行が全体的な効率に寄与すると判定された後に可能にされる。
【0057】
図2Dは、ノードT2のタスクが遅らされたスポーニングの閾値よりも短い場合に関して、単一のプロセスが制御フローグラフ200の異なるノードに関するサブルーチンを実行するときのそのプロセスの存続期間の例を示す。この例においては、(プロセス1によって実行される)ノードT2のタスクが、(プロセス1によってやはり実行される)ノードT3のタスクの前に終了する。したがって、この例においては、プロセス1が、ノードT2のタスクを完了した後にJ2のアクティブ化カウンタを2から1にデクリメントし、プロセス1が、ノードT3のタスクを完了した後にJ2のアクティブ化カウンタを1から0にデクリメントし、その結果、プロセス1が、タスクノードT4のタスクを実行する。この例においては、ノードT2及びノードT3のタスクの同時実行が、ノードT2のタスクが迅速に完了され得ると判定された後に第2のプロセスをスポーニングする必要性を避けることによって得られる効率のために放棄される。
【0058】
制御フローグラフに含まれる可能性があるノードの別の種類は、図3に示される制御フローグラフ300の円によって表される条件ノードである。条件ノードは、条件ノードの出力に接続されたタスクノードのタスクが実行されるべきであるか否かを判定するための条件を定義する。ランタイムで、定義された条件が真である場合、制御フローは、その条件ノードを過ぎて下流に進むが、ランタイムで、定義された条件が偽である場合、制御フローは、条件ノードを過ぎて進まない。条件が偽である場合、条件ノードの下流のタスクノードのタスクは、それらのタスクノードに至る制御フローグラフを抜ける(その他の偽の条件ノードによってそれら自体が遮断されない)その他の経路が存在する場合にのみ実行される。
【0059】
コンパイラは、それぞれの条件ノードに関する「条件サブルーチン」を生成し、さらに、条件ノードによって定義された条件を用いて条件ノードの下流の特定のその他のノードのサブルーチンを修正する。例えば、コンパイラは、制御フローグラフによって定義された制御の流れに従うためにランタイムで適用される「スキップメカニズム」のための命令を生成し得る。スキップメカニズムにおいて、各ノードは、(もしあれば)対応するタスクセクションが実行されるか否かを制御する関連する「スキップフラグ」を有する。スキップフラグが設定される場合、(ノードが「抑制」状態であるようにして)タスクセクションの実行が抑制され、この抑制は、コンパイラによって制御セクションに入れられた適切な制御コードによってその他のタスクに伝播され得る。前の例においては、タスクサブルーチンのタスクセクションが、制御セクションに先行していた。以下の例においては、一部のタスクのサブルーチンの制御セクションが、タスクセクションの前に現れる制御コード(「プロローグ(prologue)」とも呼ばれる)と、タスクセクションの後に現れる制御コード(「エピローグ(epilogue)」とも呼ばれる)とを含む。例えば、このスキップメカニズムを実装するために、コンパイラは、条件付きの命令(例えば、ステートメント(statement)の場合)と、下流のノードを特定する引数を用いて呼び出される「ski
p関数」の呼び出しとをプロローグ(すなわち、タスクセクションの前に実行されるコード)に含める。コンパイラは、chain又はchainTo関数の呼び出しをエピローグ(すなわち、タスクセクションの後に実行されるコード)に含める。場合によっては、スキップフラグの値によって表される記憶された状態が原因で、プロローグのみが実行される可能性があり、タスクセクションとエピローグとの両方がスキップされる可能性がある。表4は、制御フローグラフ300に関して生成されるサブルーチンの例を示す。
【0060】
【表4】
【0061】
chain及びchainTo関数と同様に、skip関数「skip(N)」は、そのskip関数の引数(ノードN)のアクティブ化カウンタをデクリメントし、デクリメントされた値が0である場合、対応するサブルーチンを実行する。この例において、skip関数は、新しいプロセスをスポーニングすることなく同じプロセスを使用し続けることによってchainTo関数の動作に従うが、コンパイラは、同様の方法でタスクのスポーニングを制御するためにchain及びchainTo関数がするのと同じように振る舞うskip関数の2つのバージョンを使用する可能性がある。コンパイラは、サブルーチンが実行されているノードのスキップフラグが設定される(つまり、ブール真値と評価される)場合、タスクセクションを呼び出すことなく下流のノードのskipを呼び出し、スキップフラグがクリアされる(つまり、ブール偽値と評価される)場合、(ノードがタスクノードである場合)タスクセクションを確かに呼び出し、下流のノードのcha
inを呼び出すように条件付きノードの下流のノードに関するサブルーチンを生成する。代替的に、コンパイラは、どのノードが条件付きノードの下流にあるかを判定する必要なしにデフォルトでサブルーチンの制御セクションに条件文を含める可能性がある。特に、スキップフラグを調べる「if」文が、コンパイラがその文を含めるべきか否かを判定する必要なしにあらゆるノードのサブルーチンに関してデフォルトで含められる可能性がある(ただし、それは、スキップフラグの不必要な検査を招く可能性がある)。
【0062】
制御フローグラフに条件ノードが存在する場合、複数の入力を有するノードは、ノードの種類に依存する論理的動作をランタイムで取得する。複数の入力リンク及び単一の出力リンクを有する接合ノードは、出力リンクによって接続される出力ノードがそのノードのサブルーチンを(skipの呼び出しではなく)chainの呼び出しの引数にすべきである場合、入力リンクによって接続される少なくとも1つの入力ノードがそのノードのサブルーチンに(skipの呼び出しではなく)chainの呼び出しを実行させなければならないように論理「OR」演算に対応する。複数の入力リンク及び単一の出力リンクを有するタスクノードは、そのタスクノードのサブルーチンが(skipの呼び出しではなく)chainの呼び出しの引数であるべきである場合、入力リンクによって接続される入力ノードのすべてがそれらのノードのサブルーチンに(skipの呼び出しではなく)chainの呼び出しを実行させなければならないように論理「AND」演算に対応する。
【0063】
この論理的動作を確実にするために、ノードに関連するスキップフラグは、所定の規則に従ってランタイムで設定され、クリアされる。スキップフラグの初期値は、制御フローグラフのノードのサブルーチンのいずれかの実行の前に行われる初期化フェーズの間に与えられ、さらに、ノードの種類に依存する。また、コンパイラは、ノードの種類に依存する異なる動作を有する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以上の)開始ノード(すなわち、いかなる入力リンクもないノード)は、それらのノードのスキップフラグを(そのスキップフラグの初期値がまだクリアされていない場合)クリアする。
【0064】
制御フローグラフ300に関して、ノードC1に関する条件が真であり、ノードC2に関する条件が偽であり、ノードC2の条件の検査が完了される前にノードT3に関するタスクが終了する、つまり、ノードT3に関するサブルーチンが、ノードJ2のスキップフラグをクリアし、ノードJ2に関するアクティブ化カウンタを(2から1に)デクリメントする(skip論理とは対照的な)chain論理に従い、それから、ノードT4に関するサブルーチンが、(スキップフラグを変更しない)skip論理に従い、ノードJ2に関するアクティブ化カウンタを(1から0に)デクリメントし、そのことが、ノードJ2のスキップフラグがノードT3のサブルーチンによってクリアされたのでchain(T5)を引き起こす場合を考える。
【0065】
その他の規則も、あり得る。ノードNのスキップフラグを変更するための所定の1組の規則と、コンパイラによって使用される異なるバージョンの関数の動作との別の例は、以下の通りである。
・接合ノードに関して、スキップフラグは、最初に設定され、skip_J(N)は、スキップフラグを変更せず、chain_J(N)は、スキップフラグをクリアする
・タスクノード又は条件付きノードに関して、スキップフラグは、最初にクリアされ、skip(N)は、スキップフラグを設定し、chain(N)は、スキップフラグを変更しない
この1組の規則に関して、(1又は2以上の)開始ノード(すなわち、いかなる入力リンクもないノード)は、それらのノードのスキップフラグを(そのスキップフラグの初期値がまだクリアされていない場合)やはりクリアする。
【0066】
コンパイラは、制御フローグラフの分析に基づいてサブルーチンの制御セクションの条件文又はその他の命令のさまざまな最適化を実行していてもよい可能性がある。例えば、制御フローグラフ300から、タスクノードT5のタスクは、最終的にタスクノードT5のタスクの実行を引き起こす接合ノードJ1と接合ノードJ3との間のリンクが存在するので、条件ノードC1及びC2の条件が真であるか又は偽であるかにかかわりなくスキップされると判定され得る。したがって、コンパイラは、タスクノードT5のスキップフラグの検査を避け、単にタスクノードT5のタスクセクションT5()を呼び出すタスクノードT5に関するサブルーチンを生成することができる。例えば、スキップされたセクションの後の下流のノードへのすべてのその他の入力が適切に処理される(つまり、下流のノードのカウンタを、スキップされたセクションに関する中間的な呼び出しが含まれていたとした場合にそのカウンタがデクリメントされたであろう回数だけデクリメントする)限り、制御フローグラフのセクション全体が条件付きノードの後でスキップされるべきである場合に関して、中間的なスキップフラグの検査及びskip関数の呼び出しを省くことによって、その他の最適化がコンパイラによってなされ得る。
【0067】
図4は、それぞれが条件ノード(それぞれC1及びC2)に続くタスクノードT1及びT2からの入力リンクを有する多入力タスクノードT3を含む単純な制御フローグラフ400の例を示す。この例において、タスクノードT3は、ノードT3のタスクが実行されるためにノードT1及びT2のタスクが両方とも(スキップされずに)実行されなければならないように論理AND演算に対応する。表5は、制御フローグラフ400に関して生成されるサブルーチンの例を示す。
【0068】
【表5】
【0069】
一部の実施形態において、接合ノード(又はその他のノード)は、ノードへの入力の特徴に依存するさまざまな種類の論理演算を行うように構成される可能性がある。例えば、ノードは、すべての入力が「必須」入力として指定されるとき、論理AND演算を行い、すべての入力が「任意選択」入力として指定されるとき、論理OR演算を行うように構成される可能性がある。一部の入力が「必須」と指定され、一部の入力が「任意選択」と指定される場合、1組の所定の規則が、ノードによって実行される論理演算の組合せを解釈するために使用される可能性がある。
【0070】
上述のタスク制御技術は、好適なソフトウェアを実行するコンピューティングシステムを用いて実装され得る。例えば、ソフトウェアは、それぞれが少なくとも1つのプロセッサ、(揮発性及び/又は不揮発性メモリ及び/又は記憶要素を含む)少なくとも1つのデータ記憶システム、(少なくとも1つの入力デバイス又はポートを用いて入力を受け取る
ため、及び少なくとも1つの出力デバイス又はポートを用いて出力を与えるための)少なくとも1つのユーザインターフェースを含む(分散、クライアント/サーバ、又はグリッドなどのさまざまなアーキテクチャである可能性がある)1又は2以上のプログラミングされた又はプログラミング可能なコンピューティングシステムで実行される1又は2以上のコンピュータプログラムの手順を含み得る。ソフトウェアは、例えば、データフローグラフの設計、構成、及び実行に関連するサービスを提供するより大きなプログラムの1又は2以上のモジュールを含む可能性がある。プログラムのモジュール(例えば、データフローグラフの要素)は、データリポジトリに記憶されたデータモデルに準拠するデータ構造又はその他の編成されたデータとして実装され得る。
【0071】
ソフトウェアは、CD−ROM又は(例えば、汎用若しくは専用のコンピューティングシステム若しくはデバイスによって読み取り可能な)その他のコンピュータ可読媒体などの有形の非一時的媒体で提供されるか、或いはそのソフトウェアが実行されるコンピューティングシステムの有形の非一時的媒体にネットワークの通信媒体を介して配信される(例えば、伝播信号で符号化される)可能性がある。処理の一部又はすべては、専用のコンピュータで、又はコプロセッサ若しくはフィールドプログラマブルゲートアレイ(FPGA,field-programmable gate array)若しくは専用の特定用途向け集積回路(ASIC
,application-specific integrated circuit)などの専用のハードウェアを用いて実行
される可能性がある。処理は、ソフトウェアによって指定された計算の異なる部分が異なる計算要素によって実行される分散された方法で実装される可能性がある。それぞれのそのようなコンピュータプログラムは、本明細書において説明された処理を実行するために記憶デバイスの媒体がコンピュータによって読み取られるときにコンピュータを構成し、動作させるために、汎用又は専用のプログラミング可能なコンピュータによってアクセス可能な記憶デバイスのコンピュータ可読記憶媒体(例えば、ソリッドステートメモリ若しくは媒体、又は磁気式若しくは光学式媒体)に記憶されるか又はダウンロードされることが好ましい。本発明のシステムは、コンピュータプログラムで構成された有形の非一時的媒体として実装されると考えられる可能性もあり、そのように構成された媒体は、本明細書において説明された処理ステップのうちの1又は2以上を実行するために特定の予め定義された方法でコンピュータを動作させる。
【0072】
本発明のいくつかの実施形態が、説明された。しかしながら、上述の説明は、添付の特許請求の範囲によって定義される本発明の範囲を例示するように意図されており、限定するように意図されていないことを理解されたい。したがって、その他の実施形態も、以下の特許請求の範囲内にある。例えば、本発明の範囲を逸脱することなくさまざまな修正がなされ得る。さらに、上述のステップの一部は、順序に依存しない可能性があり、したがって、説明された順序とは異なる順序で実行され得る。
図1
図2A
図2B
図2C
図2D
図3
図4