JP5178852B2 - 情報処理装置およびプログラム - Google Patents

情報処理装置およびプログラム Download PDF

Info

Publication number
JP5178852B2
JP5178852B2 JP2011004159A JP2011004159A JP5178852B2 JP 5178852 B2 JP5178852 B2 JP 5178852B2 JP 2011004159 A JP2011004159 A JP 2011004159A JP 2011004159 A JP2011004159 A JP 2011004159A JP 5178852 B2 JP5178852 B2 JP 5178852B2
Authority
JP
Japan
Prior art keywords
information
node
access
data
task
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2011004159A
Other languages
English (en)
Other versions
JP2012146137A (ja
Inventor
健司 船岡
信明 東條
進 武田
亮 黒田
秀則 松崎
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Original Assignee
Toshiba Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Toshiba Corp filed Critical Toshiba Corp
Priority to JP2011004159A priority Critical patent/JP5178852B2/ja
Priority to US13/347,416 priority patent/US9043803B2/en
Publication of JP2012146137A publication Critical patent/JP2012146137A/ja
Application granted granted Critical
Publication of JP5178852B2 publication Critical patent/JP5178852B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/456Parallelism detection

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明の実施の形態は、情報処理装置およびプログラムに関する。
逐次計算機用のプログラムを、複数のコアまたプロセッサにより並列的に処理が可能なように並列化する技術が知られている。このプログラムの並列化を行う場合、プログラムの中で計算時間の多くを占めているループを並列化することが一般的に行われる。ループを含むプログラムの並列化を行う際に、ループのイタレーション間に依存があるか否かが不明な場合、開発者がループのイタレーション間に依存が無いと判断した場合に、並列化を行う技術が既に知られている。
Georgios Tournavitis, Zheng Wang, Bjorn Franke, and Michael F.P. O’Boyle. Towards a Holistic Approach to Auto-Parallelization: Integrating Profile-Driven Parallelism Detection and Machine-Learning Based Mapping. In Proc. of the 2009 ACM SIGPLAN Conference on Programming Language Design and Implementation, pp. 177-187, 2009.
しかしながら、従来の技術においては、ループのイタレーション間にデータの依存がある場合のプログラムの並列化が困難であった。一方、イタレーション間の依存を無視して並列化を実行することも可能である。ところが、この場合、全てのデータの依存関係を考慮して開発者が手作業で同期を挿入することになり、開発者の負荷が大きくなる。また、並列化するか否かという判断を開発者が行う方法では、開発者に指示を仰ぐ並列化の単位をループなどに限定しなければ現実的ではない。このように、従来、高性能な並列プログラムを低コストで生成する方法や装置が求められていた。
実施の形態の情報処理装置は、入力部が、複数のタスクのタスク境界を示す情報と、1のデータに対するデータアクセスに対応するN個(Nは1以上の整数)のノードと該ノード間のデータアクセスの順序制約を表現する第1の依存関係を示すエッジとを含み、該ノードのうち少なくとも1のノードは対応するデータアクセスが確実か不確実かを示すアクセス確実性フラグを持つ第1依存関係情報とを入力し、生成部が、第1依存関係情報に基づき、タスク境界を跨ぐエッジのうち、データアクセスが不確実なノードである不確実アクセスノードを少なくとも一方に接続しているタスク境界エッジを特定し、タスク境界エッジに接続される少なくとも1の不確実アクセスノードを示す提示情報を生成する。指示部が、1のデータに対応するデータアクセスの依存関係の有無を示す依存有無情報を入力して、不確実アクセスノードに対して、依存有無情報に従い、不確実アクセスノードへのデータアクセスが無いことを示す情報を含む変換情報を出力し、変換部が、変換情報に従い、第1依存関係情報を、1のデータに対するデータアクセスに対応するM(0≦M≦N)個のノードと、ノード間の第2の依存関係を示すエッジとを含む第2依存関係情報に変換する。
第1の実施形態に係る並列化装置の機能ブロック図。 第1の実施形態によるプログラム並列化処理のフローチャート。 第1の実施形態の説明に用いるプログラムコードを示す図。 第1の実施形態のタスク境界情報を示す図。 第1の実施形態のタスク分割結果の例を示す図。 第1の実施形態によりプログラムコードを解析した依存関係情報を示す図。 第1の実施形態の第1依存関係情報を示す図。 第1の実施形態の第1依存関係情報を示す図。 第1の実施形態の第1依存関係情報を示す図。 第1の実施形態のタスク境界ノードの情報を示す提示情報を示す図。 第1の実施形態の依存有無情報を示す図。 第1の実施形態の依存有無情報から生成した変換情報を示す図。 第1の実施形態の変換情報を反映させて更新した提示情報を示す図。 第1の実施形態の依存有無情報を示す図。 第1の実施形態の依存有無情報から生成した変換情報を示す図。 第1の実施形態により全てのデータについて生成した変換情報を示す図。 第1の実施形態の第2依存関係情報に基づく依存グラフを示す図。 第1の実施形態の第2依存関係情報に基づく依存グラフを示す図。 第1の実施形態の第2依存関係情報に基づく依存グラフを示す図。 第1の実施形態のタスク境界エッジをプログラムコードに対応付けた図。 第1の実施形態の必要最小限のタスク間の実行順序制約を示す図。 第1の実施形態による並列プログラムを示す図。 第1の実施形態を適用しない場合の並列プログラムを示す図。 第1の実施形態の連続しない複数の処理が含まれるタスクを示す図。 第1の実施形態を説明するためのプログラムを示す図。 第1の実施形態の第1依存関係情報に基づく依存グラフを示す図。 第1の実施形態の第1依存関係情報の他の例を示す図。 第1の実施形態のタスク毎に分割された依存グラフを示す図。 第1の実施形態のプログラムコードを含めた提示情報を示す図。 第2の実施形態による同期最適化装置の一例の構成を示す図。 第2の実施形態による同期最適化処理を示すフローチャート。 第2の実施形態を説明するためのプログラムコードを示す図。 第2の実施形態による同期情報の対応関係の解析結果を示す図。 第2の実施形態により解析された実行順序制約を示す図。 第2の実施形態の実行順序制約から解析した第1依存関係情報を示す図。 第2の実施形態により同期が最適化された並列プログラムを示す図。 第3の実施形態による並列化システムの機能ブロック図。 第3の実施形態によるインターフェイス挿入部の一例の構成を示す図。 第3の実施形態を説明するためのプログラムコードを示す図。 第3の実施形態のタスク境界情報の例を示す図。 第3の実施形態の変数毎のデータアクセス依存関係を示す図。 第3の実施形態のタスク境界情報によるタスク分割を示す図。 第3の実施形態のプログラムコードの第1依存関係情報を示す図。 第3の実施形態による並列プログラムを示す図。 第3の実施形態の各依存グラフおよびノードに識別子を対応付けた図。 第3の実施形態による関係情報の例を示す図。 第3の実施形態のプログラムコードの実行イメージを示す図。 第3の実施形態の変更を加えた第2依存関係情報を示す図。 第3の実施形態の変更を加えた第2依存関係情報を示す図。 第3の実施形態の変更を加えた第2依存関係情報を示す図。 第3の実施形態のプログラムコードの実行イメージを示す図。 第3の実施形態の変更を加えた第2依存関係情報を示す図。 第3の実施形態の変更を加えた第2依存関係情報を示す図。 第3の実施形態の変更を加えた第2依存関係情報を示す図。 第3の実施形態の変更を加えた第2依存関係情報を示す図。 第4の実施形態による解析システムの機能ブロック図。 第4の実施形態による関係情報の例を示す図。 第4の実施形態によるプロファイルプログラムの例を示す図。 第4の実施形態による第2依存関係情報の例を示す図。 各実施形態に共通して適用可能なハードウェア構成を示す図。
(第1の実施形態)
図1は、第1の実施形態に係る情報処理装置としての並列化装置10の機能を説明するための一例の機能ブロック図を示す。並列化装置10は、入力されたプログラムコードの並列化を行い、並列プログラムを生成し、出力する。並列化装置10は、入力部101、解析部102、生成部103、指示部104、変換部105および並列化部106を備える。
図2は、第1の実施形態によるプログラム並列化処理の例を概略的に示すフローチャートである。ステップS101で、入力部101に対して並列化対象のプログラムコード111と、当該プログラムコード111によるプログラムに対するタスク境界を示すタスク境界情報110とが入力される。次のステップS102で、解析部102は、入力されたプログラムコード111を解析してデータアクセスに関する依存関係情報を得る。解析部102により出力された依存関係情報を、以下、第1依存関係情報112と呼ぶ。
次のステップS103で、生成部103は、タスク境界情報110と、解析部102が解析した第1依存関係情報112とに基づき、提示を行うための提示情報114を生成する。次のステップS104で、指示部104は、依存有無情報115の入力があったか否かを判定し、入力があったと判定した場合、処理をステップS105に移行させる。ステップS105で、指示部104は、入力された依存有無情報115に従い変換情報107を生成または更新し、処理をステップS103に戻す。生成部103は、依存有無情報115の入力に伴い更新された変更情報107を提示情報114に反映させる。
一方、依存有無情報115の入力が終了し、ステップS104で依存有無情報115の入力が無いと判定されたら、処理がステップS106に移行される。ステップS106で、変換部105は、指示部104により生成または更新された変換情報107を用いて、解析部102が解析した第1依存関係情報112を第2依存関係情報113に変換する。次のステップS107で、並列化部106は、変換部105が変換した第2依存関係情報113を用いて、同期を挿入した並列プログラム116を生成する。
以下の説明では、並列化装置10の各機能ブロックを図1の順番で直列に接続した最も基本的な形態での各機能ブロックの説明を行う。本第1の実施形態は、この例に限定されない。例えば、複数の機能ブロックが協調しながら動作を行う構成、一部の機能ブロックの順番を入れ替える構成、ある機能ブロックを複数の機能ブロックに分割する構成、これら3つの形態を組み合わせる構成などで本第1の実施形態を実施することもできる。また、機能ブロックを複数のモジュールに分割して実施することもできる。
並列化装置10の各部の処理について、より詳細に説明する。入力部101は、プログラムコード111とタスク境界情報110とを並列化装置10に対して入力する。図3は、プログラムコード111の例を、図4は、タスク境界情報110の例をそれぞれ示す。
図3に例示されるプログラムコード111は、プログラミング言語として一般的に用いられるC言語を模した疑似言語で記述されており、各行の先頭の数字およびコロン「:」は、説明のため各行を特定するために付した行番号である。また、図3の例では、プログラムコード111は、データアクセス表現“a”、“b”、“c”、“s”、“t”、“u”、“v”、“p”、“q”、“*p”および“*q”と、代入演算子“=”と、加算演算子“+”とを含んでいる。データアクセス表現は、直接アクセス表現と間接アクセス表現とに大別される。以下の例では、間接アクセス表現に対してアスタリスク“*”を付して、直接アクセス表現と区別する。
直接アクセス表現とは、動的なデータを利用せずにアクセスするデータの位置を決定するデータアクセス表現である。例えば、直接アクセス表現“a”は、動的なデータを利用せずにデータaにアクセスする。一方、間接アクセス表現とは、動的なデータを利用して、アクセスするデータの位置を決定するデータアクセス表現である。例えば、第5行目に記述される間接アクセス表現“*p”は、動的なデータpを利用して、動的なデータpが指し示す位置にあるデータにアクセスする。データpが指し示す位置にあるデータとは、例えば、そのデータのメモリアドレスをデータpが保持しているということである。
直接アクセス表現では、アクセスするデータを必ず特定可能であるのに対して、間接アクセス表現では、アクセスするデータを特定できない場合がある。そのため、間接アクセス表現“*p”がアクセスするデータを、抽象的にデータ*pと表現することがある。
図4に例示されるタスク境界情報110は、図3に示したプログラムコード111中の第6行目および第10行目に記述されるラベル“label_2”および“label_3”がタスク境界であることを示している。図5は、図4のタスク境界情報110を利用して図3のプログラムコード111をタスクに分割した場合の例を概念的に示す。この例では、タスク境界情報110により、プログラムコード111による処理が、タスク211とタスク212とタスク213とに分割されている。なお、タスクは、コンピュータ(CPU:Central Processing Unit)が処理を実行する単位であり、1以上の処理を含む。タスク境界とは、プログラムコードが表現するデータアクセスなどの処理をタスクに分割する境界を示す情報である。
図3のプログラムコード111では、タスク211、タスク212、タスク213の順序で処理が行われる。図示とその説明の都合上、任意の異なる2つのタスクの境界にはタスク境界が存在するとして以下の説明を行う。図5の例では、タスク211とタスク212の境界であるタスク境界201と、タスク212とタスク213の境界であるタスク境界202と、タスク211とタスク213の境界であるタスク境界203とが存在している。図4においてタスク境界203に対応する情報が含まれていないように、タスク境界情報に全てのタスク境界の情報を含める必要はなく、暗黙的なタスク境界が存在してもよい。
なお、タスク境界情報110は、例えば所定のUI(User Interface)からユーザ(開発者)により入力される。これに限らず、プログラムコード111を解析し、解析結果に基づきタスク境界情報110を自動的に発生させ入力するようにしてもよい。
解析部102は、プログラムコード111を解析して依存関係情報を出力する。図6は、図3のプログラムコード111を解析した依存関係情報の例を示す。なお、上述したように、解析部102から出力される依存関係情報を、第1依存関係情報112と呼ぶ。
解析部102は、プログラムコード111に記述される各データに対して、そのデータにアクセスする可能性があるデータアクセス表現をノードとし、正しい実行結果を得るために守らなければならないデータアクセスの順序を、ノード間のエッジで表現する依存グラフを生成する。ここで、あるデータにアクセスしないとは解析されていない場合に、そのデータにアクセスする可能性があると解析される。
ノードとは、1のデータに対するデータアクセスに対応し、当該データアクセスが確実であるか不確実であるかを示すアクセス確実性フラグを持つ情報であり、1のデータに対してN個(Nは1以上の整数)が存在する。エッジとは、正しい実行結果を得るために守らなければならないデータアクセスの順序制約を表現する情報である。
図6において、プログラムコード111におけるデータa、データbおよびデータcの依存グラフは、それぞれ依存グラフ301a、依存グラフ302bおよび依存グラフ303cとして示される。説明を簡略化するため、その他のデータの依存関係は、タスク間の依存関係とならないと仮定する。図6および以下の同様の図において、各ノード内の文字は、「W」であれば書き込みアクセス、「R」であれば読み込みアクセスを示す。
図において、書き込みの後の読み込みである真依存、読み込みの後の書き込みである逆依存、書き込みの後の書き込みである出力依存をエッジとして示している。例えば、第1行目の“a=0”と第4行目の“a=2”は、データaにそれぞれ値「0」と値「2」を代入するという意味であり、依存グラフ301aにおいて、書き込み後の書き込みである出力依存が、“a=0”に対応するノードと、“a=2”に対応するノードとを接続するエッジとして表されている。
解析部102は、依存グラフの各ノードがアクセスするデータを解析して、各ノードにアクセス確実性フラグを設定する。アクセス確実性フラグは、値が「確実」を示す値および「不確実」を示す値の何れか一方に設定される。アクセス確実性フラグに「確実」を示す値が設定されたノードを確実アクセスノード、アクセス確実性フラグに「不確実」を示す値が設定されたノードを不確実アクセスノードと呼ぶ。図6および以下の同様の図において、確実アクセスノードを「●(黒丸)」で示し、不確実アクセスノードを「○(白丸)」で示している。また、以下では、アクセス確実性フラグに「確実」または「不確実」を示す値を設定することを、「アクセス確実性フラグの値を「確実」(または「不確実」)に設定する」と記述する。
解析部102は、解析しているプログラムコード111への少なくとも1つの外部入力値において、ノードが対応するデータにアクセスすると見做せる場合には、当該ノードのアクセス確実性フラグの値を「確実」に設定し、見做せない場合には、当該ノードのアクセス確実性フラグの値を「不確実」に設定する。なお、外部入力とは、プログラムコード111の外部から値を入力するデータであり、外部入力値とは、外部入力で入力されるデータの値である。図3のプログラムコード111の例では、外部入力は、第5行目および第8行目にそれぞれ記述されるデータpおよびデータqである。
直接アクセス表現は、外部入力値に関わらずアクセスするデータを特定可能であるため、アクセス確実性フラグの値を「確実」に設定する。間接アクセス表現は、アクセス先の決定に利用する動的なデータの解析結果に応じて、アクセス確実性フラグを設定する。図6の例では、間接アクセス表現に対応するノードのアクセス確実性フラグは、アクセス先の決定に利用する動的なデータpおよびデータqが任意の値を取るのか、限られた値を取るのかを判断できない。そのため、データa、データbおよびデータcそれぞれにおいて、データアクセス表現“*p”に対応するノードと、データアクセス表現“*q”に対応するノードは、各々不確実アクセスノードとして生成されている。
一方、間接アクセス表現のアクセス先の決定に利用する動的なデータを解析できた場合には、当該間接アクセス表現に対応するノードを確実アクセスノードとしたり、当該ノードを生成しないことが可能となる。データ毎に依存グラフを構築するため、1つの間接アクセス表現に対して、データ毎にノードの種類や有無が異なる可能性がある。
並列化装置10は、ユーザが生成部103と指示部104とを利用してインタラクティブに出す指示に応じて、変換部105が利用する変換情報107を生成する。ここで、ユーザとは、並列化装置10を利用する人または他の装置である。例えば、ユーザは、並列プログラムを開発する開発者や、データのデータアクセスにおける依存の有無を自動的に決定する依存有無決定装置である。
生成部103は、解析部102が生成した第1依存関係情報112と入力部101から入力したタスク境界情報110とから、提示情報114を生成する。図7、図8および図9は、それぞれデータa、データbおよびデータcについて、第1依存関係情報112とタスク境界情報110とを組み合わせて示した例である。すなわち、図7〜図9は、それぞれ図6で示したデータa、データbおよびデータcの依存グラフ301a、302bおよび303cに対してタスク境界情報110を加味して表現したものである。
図7の例では、データaに関する依存グラフ301aにおいて、プログラムコード111における第1行目の“a=0”のデータアクセス表現“a”、第4行目の“a=2”のデータアクセス表現“a”、第5行目の“s=*p”のデータアクセス表現“*p”、第8行目の“*q=4”のデータアクセス表現“*q”、第11行目の“t=a”のデータアクセス表現“a”、ならびに、第13行目の“v=a+c”のデータアクセス表現“a”が、それぞれノード401a、402a、403a、404a、405aおよび406aとして示されている。
同様に、図8の例では、データbに関する依存グラフ302bにおいて、プログラムコード111における第2行目の“b=1”のデータアクセス表現“b”、第5行目の“s=*p”のデータアクセス表現“*p”、第8行目の“*q=4”のデータアクセス表現“*p”、ならびに、第12行目の“u=b”のデータアクセス表現“b”が、それぞれノード411b、412b、413bおよび414bとして示されている。
さらに、図9の例では、データcに関する依存グラフ303cにおいて、プログラムコード111における第5行目の“s=*p”のデータアクセス表現“*p”、第7行目の“c=3”のデータアクセス表現“c”、第8行目の“*q=4”データアクセス表現“*q”、第9行目の“c=5”のデータアクセス表現c、ならびに、第13行目の“v=a+c”のデータアクセス表現“c”が、それぞれノード421c、422c、423c、424cおよび425cとして示されている。
生成部103は、全ての第1依存関係情報112を提示情報114に変換するのではなく、提示情報114に変換する第1依存関係情報112を限定する。これにより、ユーザは、容易若しくは高速に変換情報107を生成する指示を終えられるようにできる。
次に、提示情報114に変換する第1依存関係情報112を限定する方法について説明する。以下、タスク境界に跨るエッジをタスク境界エッジ、タスク境界エッジに接続されているノードをタスク境界ノードという。少なくとも1つの不確実アクセスノードが接続されているエッジを不確実エッジという。タスク境界エッジ且つ不確実エッジであるエッジを不確実タスク境界エッジという。
生成部103は、ユーザが簡単もしくは高速に指示を終えられるようにするため、少なくとも1つの不確実タスク境界エッジに接続されている少なくとも1つの不確実アクセスノードに関する提示情報114を生成する。少なくとも1つの不確実タスク境界エッジに接続されている少なくとも1つの不確実アクセスノードに対してユーザが順次指示を与えていけば、最小のユーザ指示で不確実タスク境界エッジを無くすことができる。
一方、不確実タスク境界エッジに接続されていない不確実アクセスノードへの指示は、当該不確実アクセスノードよりタスク境界に近いノードへの指示結果によっては無駄となる可能性がある。
生成部103が依存グラフ301aに関する提示情報を生成する例について説明する。図7に示される依存グラフ301aには、それぞれ不確実アクセスノードであるノード403aおよび404aが含まれており、タスク境界を跨ぎ、且つこれらノード403aおよび404aのうち少なくとも一方に接続されるタスク境界エッジとして、タスク境界201と交わる1つの不確実タスク境界エッジと、タスク境界202と交わる2つの不確実タスク境界エッジの、合計で3つの不確実タスク境界エッジが存在する。
図10は、タスク境界201に跨る不確実タスク境界エッジのタスク境界ノードに関する情報を示す提示情報114の例を示す。図10の例では、提示情報114により、不確実アクセスノードであるノード403aおよび404aと、これらノード403aおよび404aに接続される不確実タスク境界エッジ450とが提示されている。
なお、提示情報114は、例えば、並列化装置10がプログラムとして動作する際のOSの描画API(Application Programming Interface)から生成された表示情報である。例えば、提示情報114は、ディスプレイに表示される画像情報としてユーザに対して伝達される。提示情報114は、ファイルやメモリ上のデータとして伝達させることもできる。
上述したように、不確実タスク境界エッジに接続されている少なくとも1つの不確実アクセスノードに関する提示情報114を生成すればよい。そのため、図10の例のように不確実タスク境界エッジ450の両側のノード403aおよび404aを提示せずに、例えば、ノード404aを除外してノード403aのみに関する提示情報114を生成してもよい。
生成部103は、不確実タスク境界エッジに対して直接的に接続されていないノードに関しても、タスク境界エッジに関与する可能性があるノードと確実に関与しないノードとを認識して、それぞれに異なる提示情報の生成方法を与えてもよい。
例えば、図7に示されるノード401aや、図9に示されるノード423cは、タスク境界エッジに接続されることが無く、タスク境界エッジに関与しない。そのため、ノード401aやノード423cを提示情報114に含めないようにしたり、ノード401aやノード423cの表示色を他のノードの表示色とは異なる色にするなど、提示方法を変更するようにしてもよい。このように、タスク境界エッジに関与しないノードの提示方法を、タスク境界エッジに関与する可能性のあるノード提示方法と異ならせることで、ユーザが指示を与える上で有益な提示情報114を生成できる。
タスク境界エッジに接続されることが無いノードを生成部103が検出する一例の方法について説明する。生成部103は、全ての確実書き込みノードを特定する。確実書き込みノードとは、書き込みを行う確実アクセスノードである。図7の例では、ノード401aおよびノード402aが確実書き込みノードである。
生成部103は、タスクT1に含まれるあるノードNから他のタスクT2に侵入する少なくとも1つの経路に、少なくとも1つの特定した確実書き込みノードが存在する場合に、ノードNがタスクT1およびタスクT2のタスク境界エッジには接続されることはないと判定する。
例えば、図7の例では、ノード401aからノード402aとノード403aとを経由してタスク212へ到達する経路には、特定した確実書き込みノード402aが存在する。そのため、ノード401aは、タスク境界201のタスク境界エッジに接続されない。同様にして、ノード401aは、図7の依存グラフ301aに含まれる全てのタスク境界に接続されないと判定できる。また、図9に例示されるノード423cについても、依存グラフ303cに含まれる全てのタスク境界に接続されないと判定できる。
ここで、経路とは、同じ方向を向いたエッジのみを経由しながら到達可能な経路をいう。例えば、図9の例では、ノード425cからノード424c、ノード423cおよびノード422cを経由してノード421cに向かうには、同じ方向を向いたエッジのみを経由して到達可能であるため、ここでの経路に該当する。一方、図7に例示されるノード403aからノード402aを経由してノード404aに向かうには、ノード403aからノード402aに向かい、その後、ノード402aからノード403aを介してノード404aに向かうことになる。この場合、ノード403aからノード402aに向かうエッジと、ノード402aからノード403aを経由してノード404aに向かうエッジとが異なる方向を向いているため、ここでの経路には含めない。
上述した、生成部103がタスク境界エッジに接続されることが無いノードを検出する方法は、2つのスレッドとその間のタスク境界に注目した場合、次のように考えることができる。すなわち、この方法は、先ず、タスク境界エッジに隣接する一方のタスク方向に対して、タスク境界距離が最小となる確実書き込みノードを特定する。そして、第1依存関係情報112(依存グラフ)に含まれる各ノードからタスク境界エッジへの少なくとも1つの経路上に少なくとも1つの特定した確実書き込みノードが存在するか否かを判定する。若し、存在しないと判定したら、特定されたノードがタスク境界エッジに接続される可能性があると判定する。一方、存在すると判定したら、当該ノードがタスク境界エッジに接続されないと判定する。
ここで、1つのノード若しくはエッジと、1つのタスク境界との間の距離であるタスク境界距離を、当該1つのノード若しくはエッジから当該1つのタスク境界に到達するまでに経由する最小のノード数と定義する。1つのノードに対して、タスク境界距離は、タスク境界の数だけ定義される。例えば、図9の例では、ノード422cからタスク境界201までのタスク境界距離は「0」であり、ノード422cからタスク境界202までのタスク境界距離は「2」である。
指示部104は、依存有無情報115を入力して変換情報107を生成する。依存有無情報115とは、依存グラフの要素であるノード若しくはエッジの有無を示す情報である。変換情報107とは、変換部105が第1依存関係情報112を第2依存関係情報113に変換する方法を示した情報である。
図11は、依存有無情報の例を示す。依存有無情報115は、あるデータに関する依存グラフにおいて、不確実アクセスノード(ノードAとする)から当該データに対するアクセスの有無を示す情報である。より具体的には、図11に例示される依存有無情報115の「access ノードA」は、図10を参照し、依存グラフ301aの要素であるノードAすなわちノード403aによる、当該依存グラフ301aの対象データであるデータaへのアクセスがあることを示している。
指示部104は、依存有無情報115から、依存有無情報115に含まれるノードのアクセス確実性フラグの値を反転させるための変換情報107を生成する。図12は、図11に例示した依存有無情報115から生成した変換情報107の例を示す。図12の例では、図11に例示する依存有無情報115からノードA(ノード403a)のアクセス確実性フラグの値を反転させる変換情報107の「change flag ノードA」を生成する。例えば、ユーザは、指示部104が有するUIを操作して、提示情報114により提示された、タスク境界201に跨る不確実タスク境界エッジのタスク境界ノードに関する情報に応じて、アクセス確実性フラグの値を反転させるノードを選択する。
なお、図11および図12の例では、依存有無情報115と変換情報107とが異なる形式の情報となっているが、これはこの例に限定されず、依存有無情報115と変換情報107とが同一の形式の情報であってもよい。
ユーザは、生成部103と指示部104とにより、指示部104への依存有無情報115の入力が終了するまで、並列化装置10とのやり取りを行う。すなわち、指示部104により生成された変換情報107は、生成部103に入力される。生成部103は、入力された変換情報107を提示情報114に反映させ、提示情報114を更新する。図13は、図10に例示した提示情報114に対して図12に例示した変換情報107を反映させて更新した、新たな提示情報114の例を示す。この例では、図12に例示した変換情報107がノードA(ノード403a)のアクセス確実性フラグの値を反転させることを示しているため、図13に例示される新たな提示情報114におけるノードA(ノード403a)が、不確実アクセスノードから確実アクセスノードに更新されている。
さらに、図14に例示されるように、指示部104に対して、ノードB(ノード404a)がデータaにアクセスしないことを示す依存有無情報115の「no access ノードB」を入力したとする。指示部104は、入力された依存有無情報115に従い、図15に例示されるように、図12に例示した変換情報107に対してノードB(ノード404a)を削除するコマンドを追加して、変換情報107を更新する。更新された変換情報107は、生成部103に入力される。生成部103は、入力された変換情報107を提示情報114に反映させ、提示情報114を更新する。
この図15に例示する提示情報114の更新により、データaに関する不確実タスク境界ノードが無くなる。そのため、他のデータ(例えばデータb)に関する変換情報107および提示情報114の生成を行う。ユーザは、提示情報114に応じて順次依存有無情報115を入力していく。全てのデータ(図16の例では、データa、データbおよびデータc)の依存グラフについて依存有無情報115が入力され変換情報107の更新が完了すると、依存有無情報115の入力が終了したと判定され、ユーザとのやりとりが終了される。
図16は、データa、データbおよびデータcに対して依存有無情報115が入力され、更新が完了された変換情報107の例を示す。
変換部105は、指示部104が生成した変換情報107を利用して、第1依存関係情報112を第2依存関係情報113に変換する。すなわち、変換情報107に従い、第1依存関係情報112を、1のデータに対するデータアクセスに対応するM(0≦M≦N)個のノードと、当該ノード間の第2の依存関係を示すエッジとを含む第2依存関係情報113に変換する。
変換情報107において、「change flag」に示されるノードは、アクセス確実性フラグの値が反転される。例えば、アクセス確実性フラグの値が「不確実」を示している場合は、「change flag」により当該値が「確実」に変更される。また、「delete」に示されるノードは、削除される。図16の例では、変換情報107において、データaに関し、ノードA(ノード403a)のアクセス確実性フラグの値の反転と、ノードB(ノード404a)の削除とが示される。データbに関し、ノードC(ノード412b)のアクセス確実性フラグの値の反転と、ノードD(ノード413b)の削除とが示される。また、データcに関し、ノードE(ノード421c)の削除が示される。
図17、図18および図19は、図7、図8および図9で示した第1依存関係情報112に基づく依存グラフ301a、302bおよび303cを、図16に示した変換情報107を用いてそれぞれ第2依存関係情報113に基づく依存グラフ311a、312bおよび313cに変換した例を示す。変換部105による変換処理によって、図16の変換情報107において「change flag」と指示された不確実アクセスノードが確実アクセスノードに変換され、「delete」と指示されたノードが削除される。削除されたノードの前後の依存関係は、削除されずに残ったノードで正しく依存関係が再構築されるように変換される。
図17を参照し、データaに関し、図16の変換情報107における「change flag ノードA」の記述に従い、図7のノード403aのアクセス確実性フラグの値が反転されて、「確実」を示す値とされる(ノード503a)。また、「delete ノードB」の記述に従い、図7のノード404aが削除される(図17のタスク212参照)。ノード403aのアクセス確実性フラグの値の反転と、ノード404aの削除とに伴い、ノード403aおよびノード404aに係るエッジ情報も変更される。
図18を参照し、データbに関し、図16の変換情報107における「change flag ノードC」の記述に従い、図8のノード412bのアクセス確実性フラグの値が反転されて、「確実」を示す値とされる(ノード512b)。また、「delete ノードD」の記述に従い、図8のノード413bが削除される(図18のタスク212参照)。ノード412bのアクセス確実性フラグの値の反転と、ノード413bの削除とに伴い、ノード412bおよびノード413bに係るエッジ情報も変更される。
図19を参照し、データcに関し、図16の変換情報107における「delete ノードE」の記述に従い、図9のノード421cが削除される(図19のタスク211参照)と共に、ノード421cに係るエッジ情報も変更される。
並列化部106は、上述のようにして変換情報107に基づき変換部105が変換した後の第2依存関係情報113を利用して同期の位置を決定し、同期を挿入した並列プログラム116を生成する。
並列化部106は、第2依存関係情報113に含まれるタスク境界エッジを抽出し、実行時に守らなければならない実行順序制約を解析する。図20は、上述した図17、図18および図19に示されるタスク境界エッジを図3のプログラムコード111に対応付けた例を示す。
タスク境界エッジ601a、602aおよび603bは、タスク211とタスク213との間のエッジである。タスク境界エッジ601aは、ノード502aとノード505aとをノード502aからノード505aに向けて接続し、タスク境界エッジ602aは、ノード502aとノード506aとをノード502aからノード506aに向けて接続する。タスク境界エッジ603bは、ノード511bとノード514bとをノード511bからノード514bに向けて接続する。また、タスク境界エッジ604cは、タスク212とタスク213との間のエッジである。タスク境界エッジ604cは、ノード524cとノード525cとをノード524cからノード525cに向けて接続する。
実行順序制約は、タスク境界エッジの方向に従う。タスク211とタスク212との間にはタスク境界エッジが存在しないため、実行順序制約がない。タスク211とタスク213との間には、タスク境界エッジ601a、602aおよび603bの順序制約がある。タスク212とタスク213の間には、タスク境界エッジ604cの順序制約がある。正しい計算結果を得るためには、これらの順序制約を守る必要がある。
並列化部106は、出力される同期の最適化を行ってもよい。例えば、必要最小限の同期を挿入する方法が知られている。実行順序制約には包含関係があり、ある実行順序制約を満たせば他の実行順序制約も満たされる場合がある。図20の例では、タスク境界エッジ601aが表す実行順序制約を守れば、タスク境界エッジ602aとタスク境界エッジ603bが表す実行順序制約も守られる。そのため、図21に例示するように、必要最小限のタスク間の実行順序制約は、タスク境界エッジ601aおよび604cのみとなる。
このような実行順序制約の包含関係を検出する包含関係検出アルゴリズムの例について説明する。タスクAおよびタスクB、ならびに、タスクAからタスクBに向かう2つの依存関係D1、D2を考える。ここで、2つの依存関係D1およびD2の始点と終点を比較したとき、依存関係D1の始点の実行順序が依存関係D2の始点の実行順序と同じか若しくは遅く、依存関係D1の終点の実行順序が依存関係D2の終点の実行順序と同じか若しくは早い場合、依存関係D1は依存関係D2を包含する。そのため、依存関係D1の依存関係が示す実行順序制約を満たせば、依存関係D2の依存関係が示す実行順序制約も満たされる。
これは、図20で示したような簡単な例の場合の包含関係検出アルゴリズムであり、タスクが後述する図24のように複数個所に分かれている場合や、C言語のローカル変数を考慮する場合など、並列化装置がサポートする入出力情報に応じた包含関係検出アルゴリズムが必要となる。
並列化部106は、タスク境界エッジが示す実行順序制約を満たす同期を挿入した並列プログラム116を出力する。図22は、図21に示した各タスク境界エッジから必要最小限のタスク境界エッジを抽出して生成した並列プログラム116の例を示す。実行順序制約をトークン(TOKID_x:但しID_xは識別子)の受け渡しで表現しており、タスク境界エッジ601aとトークン701とが対応し、タスク境界エッジ604cとトークン702とが対応している。トークンが同じ識別子を持つコマンドput_tokenとコマンドget_tokenが対応しており、対応したコマンドput_tokenが実行された後にコマンドget_tokenの実行を抜けることが保証される。
本第1の実施形態によれば、生成部103と指示部104とにおいて、ユーザが全ての情報を見て必要な同期の位置を判断するのではなく、ユーザが個々の情報を見て判断可能な依存関係情報を与えることにより、質の良い同期を容易に挿入可能となる。
図23は、本第1の実施形態による並列化装置10を利用しない場合の並列プログラムの例を示す。例えば、並列化装置10における生成部103、指示部104および変換部105を用いずに、解析部102による解析結果(第1依存関係情報112)を直接的に並列化部106が利用した場合について考える。この場合、図7〜図9に示した全てのタスク境界エッジの実行順序関係を満たす必要がある。そのため、図5に示したプログラムコードから、図23に示される、トークン710、711および712を用いた並列プログラムが生成される。
この並列プログラムは、図22に示した本第1の実施形態による並列プログラム116に比べ、並列実行可能な区間が少ない。すなわち、図22の並列プログラム116は、図中に示されるパートRおよびパートS、パートTおよびパートU、パートTおよびパートS、ならびに、パートSおよびパートUがそれぞれ並列実行可能である。さらに、パートTと、タスク213内の「v=a+c」とが並列実行可能である。これに対して、図23の、本第1の実施形態によらない並列プログラムは、図中に示されるパートVおよびパートWのみが並列実行可能となる。したがって、図22の本第1の実施形態による並列プログラム116の方が、本第1の実施形態によらない並列プログラムよりも、並列化の点で高性能であるといえる。
本第1の実施形態は、上述した例に限定されない。プログラムコード111は、例えば、C言語やJava(登録商標)のようなプログラミング言語で書かれたテキストデータが格納されたテキストファイルとして提供される。並列化装置10に独自のプログラミング言語で書かれたテキストデータによるファイルとして提供されてもよい。また、プログラムコード111は、人が見て構造を容易に理解できるテキストデータである必要はなく、バイナリデータが格納されたバイナリファイルとして提供することもできる。
また、プログラムコード111は、1つのファイルに全ての情報が入っている必要はなく、分割されて複数のファイルに格納してあってもよい。また、プログラムコード111は、ファイルという形式である必要はなく、メモリ上のデータであってもよい。例えば、C言語の構文解析装置が生成したメモリ上のデータである構文木をプログラムコード111として入力してもよい。プログラムコード111は、必要な処理を全て記述してある必要はなく、大きなプログラムコードの一部分であってもよい。
タスク境界情報110は、例えば、プログラムコード111上のタスク境界位置を示したテキストデータが格納されたテキストファイルとして提供される。また、タスク境界情報110は、人が見て構造を容易に理解できるテキストデータによるファイルである必要はなく、バイナリデータが格納されたバイナリファイルであってもよい。
また、タスク境界情報110は、ファイルという形式である必要はなく、メモリ上のデータであってもよい。例えば、GUI(Graphical User Interface)を利用したタスク境界位置指定装置を用意し、このタスク境界位置指定装置を用いてタスク境界情報110を作成することが考えられる。この場合、例えばタスク境界位置指定装置によりプログラムコード111を画面に表示させ、この表示に従いマウスなどのポインティングデバイスでタスク境界に指定したい位置を指定すると、指定した位置をタスク境界としてメモリ上に出力するようにできる。また、タスク境界情報110は、人が指定する必要はなく、別の装置がプログラムコード111を解析して出力したものでもよい。例えば、タスク境界情報生成装置を利用して、図3にあるようなラベルlabel_1、label_2、label_3をタスク境界と認識して、その位置をメモリ上に出力したものでもよい。例えば、C言語で書かれたプログラムコード111を解析してループの位置を探索し、ループ回転数の半分の位置にタスク境界があると認識して、メモリ上に出力したものでもよい。
プログラムコード111およびタスク境界情報110は、1つのデータとして纏められていてもよい。例えば、プログラムコード111の一部分をラベル付き中括弧{}で括っており、その中括弧によりタスクを分割している例では、プログラムコード111とタスク境界情報110とが纏められていることになる。
タスクは、プログラムコード111が表現する処理の一部分である。1つのタスクに、連続しない複数の処理が含まれていてもよい。例えば、図5の例では、タスク211とタスク213とが異なるタスクとされているが、これに限らず、図24に例示されるように、タスク211とタスク213とを1つのタスク214としてもよい。タスク211とタスク213とが1つのタスク214とされている場合、タスク211とタスク213とを並列実行することができない。この場合、タスク211とタスク213との間の依存を考慮する必要がないため、タスク214の前半部分とタスク212との境界であるタスク境界201、ならびに、タスク212とタスク214の後半部分との境界であるタスク境界202がそれぞれプログラムコード111のタスク境界となる。
プログラムコード111もしくはタスク境界情報110は、タスクの親子関係情報を含んでいてもよい。例えば、前処理とループと後処理とを含むプログラムコード111のループ部分のみを並列化する場合、前処理と後処理とを含む親タスクからループを並列実行する子タスクを起動することになる。並列化部106は、並列化を行う子タスク間の依存関係のみを考慮して、親タスクと子タスクとの間の依存関係を最適化しなくてもよいし、親タスクと子タスクとの間の依存関係を考慮して最適化してもよい。親タスクと子タスクとの二階層ではなく、さらに子タスクから孫タスクを起動するなど、親子関係は任意の階層数で構成することができる。
タスク境界は、プログラムコード111を分割するのではなく、プログラムコード111が表現する処理を分割する。図5の例のように、プログラムコード111の分割とプログラムコード111が表現する処理の分割とが等価になる例もある一方で、これらが等価にはならない場合も存在する。例えば、プログラムコード111に対してC言語のループが含まれると、プログラムコード111の分割とプログラムコード111が表現する処理の分割とが等価ではなくなる。C言語で書かれたループの内部は、プログラムコード111上では1回転分の処理しか示していないが、実際は、複数回転分の処理になる可能性がある。そのため、ループの回転途中をタスク境界と指定するようにしてもよい。例えば、ループが100回転であるならば50回転目の終了時をタスク境界とすることが考えられる。このような指定を行うことによって、配列を利用したデータ分割並列化を実現できる。
タスク境界は、各データアクセスが所属しているタスクを特定できる情報であれば、形式は問わない。例えば、各データアクセスが所属するタスクの情報を保持しておくことにより、所属しているタスクが切り替わる部分をタスク境界エッジと見做すことができる。
データアクセス表現には、様々な種類が存在する。図3の例で利用したデータアクセス表現以外にも、例えば、C言語の関数コールもデータアクセス表現の一種になり得る。関数f()の内部でデータaとデータbとにアクセスしている場合、関数コールf()をデータaとデータbとのデータアクセス表現と見做してもよいし、関数コールf()をデータアクセス表現と見做さずに、関数中のデータアクセス表現を直接利用してもよい。関数コールf()をデータaとデータbとのデータアクセス表現と見做すように、1つのデータアクセス表現が複数のデータにアクセスすることがあってもよい。
直接アクセス表現と間接アクセス表現との違いは、プログラムコード111の種類によって異なる。図3の例では、データアクセス表現“a”を直接アクセス表現に分類したが、これはこの例に限らず、例えばC++言語では、変数aの型定義によっては、図3におけるデータアクセス表現“a”が間接アクセス表現である可能性もある。
データアクセス表現を構成する識別子とアクセスするデータとは、必ずしも1対1の対応関係になっている必要はない。図3の例では、データアクセス表現“a”がデータaにアクセスするとしたが、例えば、C言語ではこのような対応関係にならない。C言語では、データアクセス表現“a”がローカル変数aにアクセスするのかグローバル変数aにアクセスするのか、識別子“a”だけでは判定できない。そのため、プログラムコード111にある変数宣言も解析する必要がある。解析部102でC言語を解析可能としておけば、データアクセス表現“a”がローカル変数aおよびグローバル変数aの何れにアクセスするのか、動的なデータを利用せずに判別できるため、データアクセス表現とデータとを結びつけられる。
依存グラフは、上述では、図6に示したように、真依存、逆依存および出力依存をエッジとして表した構造で表現したが、これはこの例に限定されない。すなわち、依存グラフすなわち第1依存関係情報112は、その構造と等価な表現がされていればよく、さらにより厳しい依存を表現していてもよい。例えば、データの定義および利用の関係と、定義同士の順序関係とを表現する定義利用ツリーでは、逆依存を明示的にエッジとして示していないが、定義同士の順序関係から逆依存を導くことが可能である。例えば、プログラムコード111上におけるデータアクセスの順序関係を示した順序列では、読み込み同士の順序関係も表現されるが、順序関係から依存関係を導いて同期を挿入することもできるし、順序関係のみを利用して同期を挿入することもできる。
上述では、図6に示したように、直接アクセス表現がアクセスするデータのみについて依存グラフを構築したが、これはこの例に限定されない。すなわち、間接アクセス表現がアクセスするデータについての依存グラフを構築してもよい。例えば、図6では、第5行目のデータアクセス表現“*p”と第8行目データアクセス表現“*q”とが共に、プログラムコード上では表現されていないデータzを読み書きする可能性がある。そのため、データ*pやデータ*qに関する依存グラフを構築することにより、データ*pとデータ*qがデータzにアクセスしても、正しい並列プログラムを生成可能となる。
依存グラフのノードは、書き込みアクセスか読み込みアクセスかを示す情報を保持していなくてもよい。読み書きの情報が無い場合であっても、情報の提示方法や並列化の方法によって読み書きの情報を生成部103や並列化部106が利用できる場合がある。例えば、順序関係を依存関係情報として利用した場合がこれに該当する。
依存グラフのエッジは、ループ依存や制御依存を表現していてもよい。並列化部106は、ループ依存や制御依存を表現しているエッジを認識し、適切に同期を挿入するようにできる。
依存グラフは、少なくとも1のノードがアクセス確実性フラグを有していればよい。あるノードがアクセス確実性フラグを有していない場合、当該ノードを「確実」を示すアクセス確実性フラグを持つノードと同様に扱ったり、他の情報からアクセス確実性フラグの情報を補完することができる。例えば、アクセス確実性フラグを有していない読み込みアクセスのノードに関し、間接アクセス表現の依存グラフの読み込みアクセスのノードを、「不確実」を示すアクセス確実性フラグを持つノードであると見做して扱うことができる。この例では、依存有無情報として、間接アクセス表現の依存グラフの各読み込みアクセスのノードが対応するデータを入力することもできる。
解析部102は、解析できていない外部入力値に依存するアクセス確実性フラグを「確実」と設定してもよい。例えば、図25に例示されるプログラムコード2002は、図3に示したプログラムコード111に対して、第1行目の「データzの値が「0」であるならば、データpはデータaを指し示す」if文を追加したものである。この図25のプログラムコード2002によれば、データzの値が「0」の場合にデータアクセス表現“*p”がデータaにアクセスする。この場合、厳密には外部入力zの値が「0」を取り得ない可能性があるため、データaの依存関係情報においてデータアクセス表現“*p”に対応するノードのアクセス確実性フラグは「不確実」となる。しかしながら、図25のプログラムコード2002におけるif文は、データzの値が「0」という条件が成立することがあるという前提で書かれたものと解釈してもよいため、データaのデータアクセス表現“*p”に対応するノードを確実アクセスノードとしてもよい。
図26は、図25のプログラムコード2002に基づく第1依存関係情報112の例を示す。図26の例では、図3のプログラムコード111に基づき図6に示した第1依存関係情報112におけるデータaの依存グラフ301aに対し、依存グラフ301a’において、「s=*p」に対応するノードのアクセス確実性フラグが「確実」とされ、当該ノードが確実アクセスノードとされている。データbおよびデータcにそれぞれ対応する依存グラフ302bおよび303cについては、図6と同一である。
上述では、提示情報114と第1依存関係情報112とが同様の構造を表現するように説明したが、これはこの例に限定されず、これらが異なる構造を表現していてもよい。例えば、データaに関する第1依存関係情報112を、図27に依存グラフ901aとして例示されるように、データアクセスの順序列として保持しておき、提示情報114では、図28に例示されるように、タスク毎に分割された依存グラフ3000に変換してもよい。このように、提示情報114と第1依存関係情報112とで異なる構造を用いて表現したとき、指示部104は、提示情報114に対する依存有無情報115を受け取ってもよく、適切に依存有無情報115を変換情報107に変換する必要がある。
生成部103は、提示情報114に対し、第1依存関係情報112が保持する一部の情報を含めなくてもよい。例えば、第1依存関係情報112がノードの読み書き情報を保持していても、生成部103は、この読み書き情報を提示情報114に含めないことができる。例えば、依存有無情報115を与えることが可能な依存グラフの要素を限定することにより、アクセス確実性フラグを提示情報114に含めずに並列化装置10として機能させることが可能である。より具体的には、提示情報114にノードの情報を直接的に含めなくても、図29に例示されるように、プログラムコード3001を提示情報114に含めて、プログラムコード3001上のデータアクセス表現を結ぶエッジを提示情報114に含めることが考えられる。他の例として、提示情報114にエッジの情報を含めずに、ノードの情報だけを含めてもよい。
入力部101から提示情報114の補助情報を入力するようにし、生成部103は、この補助情報を提示情報114に含めてもよい。提示情報114に対する補助情報の例としては、クリティカルパス情報や実行パス情報が考えられる。
生成部103は、少なくとも1つのノードを特定し、第1依存関係情報112に含まれる各ノードからタスク境界エッジへの少なくとも1つの経路上に少なくとも1つの特定したノードが存在するか否かに応じて各ノードの提示情報114を生成する際に、特定するノードを、確実書き込みノードとは異なるノードとしてもよい。どのようなノードを特定するかに関わらず、特定したノードを境目として、提示情報114の生成方法を変更することができる。例えば、特定したノードからタスク境界側のノードのみを提示情報114に含めることができる。ノードを特定する代わりにエッジを特定しても、同様である。
生成部103が利用する、少なくとも1つのノードを特定して、第1依存関係情報112に含まれる各ノードからタスク境界までの少なくとも1つの経路上に特定したノードが存在するかに応じて提示情報114を生成する方法は、第1依存関係情報112を保持する際にどのようなデータ構造を用いるかによって、表現方法が異なり実質的に同じ処理を行う複数の方法が存在する。
例えば、第1依存関係情報112として順序関係を利用した場合、特定したノードと、各ノードおよびタスク境界の順序関係とに応じて提示情報114を生成する方法は、少なくとも1つの経路上に特定したノードが存在するか否かに応じて提示情報114を生成する方法と同じである。すなわち、あるノード、少なくとも1つの特定したノード、タスク境界、の順になっているならば、あるノードからタスク境界までの少なくとも1つの経路上に特定したノードが存在することになる。逆に、全ての特定したノード、あるノード、タスク境界、の順になっているならば、あるノードからタスク境界までの全ての経路上に特定したノードが存在しないことになる。
生成部103は、提示ポリシを利用して提示する情報と方法の選択を行い、提示情報114を生成してもよい。第1の例として、選択した1つの不確実タスク境界エッジに関する情報のみを提示するという提示ポリシが考えられる。第2の例として、データaに関する全ての依存関係情報のみ提示しないという提示ポリシが考えられる。第3の例として、タスク境界エッジを赤など強調色とし、その他のエッジを黒など非強調色とする提示ポリシが考えられる。第4の例として、指示部104から依存有無情報115を入力する必要があるノードもしくはエッジのみを提示するという提示ポリシが考えられる。第5の例として、タスク境界からの距離に応じてノードの大きさを変更するという提示ポリシが考えられる。これら第1〜第5の提示ポリシは、例であって、さらに他の提示ポリシを適用することもできるし、複数の提示ポリシを組み合わせてもよい。また、提示ポリシは、生成部103に組み込まれていてもよいし、外部から提示ポリシを入力できてもよい。
生成部103は、少なくとも1つのノードを特定し、第1依存関係情報112に含まれる各ノードからタスク境界エッジへの少なくとも1つの経路上に少なくとも1つの特定したノードが存在するか否かに応じて各ノードの提示情報114を生成する方法と、提示ポリシに応じて各ノードの提示情報を生成する方法とを組み合わせてもよい。例えば、特定したタスクよりも内側の不確実アクセスノードのみ提示情報114に含めるという方法が考えられる。
上述の、特定したノードが存在するか否かは、ノードに対する処理を、人による判断が必要な部分と不必要な部分とを区別することに対応する。また、提示ポリシによって、人による判断が必要な部分と不必要な部分とを区別することで、より容易または高速な処理が可能となる。
指示部104は、依存有無情報115として、ノードの依存有無情報ではなくエッジの依存有無情報を受け取ってもよい。例えば、図7の依存グラフ301aにおいて、タスク境界202を跨る2本のエッジは存在しないという指示を与えることにより、ノード404aによるデータaへのアクセスも存在しないということが解析できる。
指示部104は、依存有無情報115として、複数のノードやエッジの依存有無情報を受け取ってもよい。例えば、指示部104は、図7の依存グラフ301aにある全ての不確実アクセスノードは依存に関与しないという依存有無情報を受け取ることが可能である。この場合、依存グラフ301aからノード403aとノード404aとを削除することができる。
指示部104は、データとデータの対応情報を依存有無情報115として入力してもよい。例えば、「データ*pとデータaは対応関係にない」という依存有無情報115を入力したとき、変換部105は、データaの依存グラフからデータアクセス表現“*p”のノードを取り除き、データ*pの依存グラフからデータアクセス表現“a”のノードを取り除くことが可能である。
指示部104では、全ての不確実タスク境界エッジに関する指示を受け取らない状態で依存有無情報115の入力を終了して、図2のステップS105に示される依存関係情報の変換処理に進むことができる。この場合、タスク境界エッジに不確実アクセスノードが接続される可能性がある。このような不確実アクセスノードをどのように扱うかは、装置全体の実装方針に依存する。例えば、不確実アクセスノードからデータのアクセスがあると見做すのであれば、不確実アクセスノードを確実アクセスノードに変換する。また例えば、不確実アクセスノードからデータのアクセスが無いと見做すのであれば、不確実アクセスノードを削除して依存関係情報を再構築する。但しこの場合には、正しく動作しない可能性があるため、警告を行うということもできる。
並列プログラム116は、例えば実行可能ファイルである。これに限らず、並列プログラム116は、C言語やJava(登録商標)のようなプログラミング言語で書かれたテキストデータが格納されたテキストファイルでもよいし、並列化装置10独自のプログラミング言語で書かれたテキストデータが格納されたテキストファイルであってもよい。また、並列プログラム116は、1つのファイルに全ての情報が入っている必要はなく、分割されて複数のファイルに格納されていてもよい。さらに、並列プログラム116は、ファイルという形式である必要はなく、メモリ上のデータであってもよい。例えば、並列プログラム116は、実行時コンパイラが出力した、メモリ上の実行可能なデータでもよい。さらにまた、並列プログラム116は、必要な処理を全て記述してある必要はなく、他のオブジェクトファイルと組み合わせて用いられるオブジェクトファイルであってもよい。
上述したように、本第1の実施形態によれば、プログラムコード111に含まれるデータアクセスに関する莫大な情報の中から、必要最小限の情報を選択して提示するようにしている。そのため、タスク間におけるデータアクセスの依存関係の変更指示を、ユーザが容易または高速に与えることができるようになり、低コストで高性能な並列プログラムを生成することが可能となる。
また、本第1の実施形態によれば、必要最小限のノードを提示すると共に、当該ノードに対する周辺のノードの情報をさらに提示することにより、ユーザは、当該周辺のノードに関する情報も認識できるようになる。
(第2の実施形態)
図30は、本第2の実施形態による情報処理装置としての同期最適化装置20の一例の構成を示す。なお、図30において、上述の図1と共通する部分には同一の符号を付し、詳細な説明を省略する。同期最適化装置20は、入力された並列プログラムに対して同期最適化処理を行い、同期が最適化された並列化プログラム116’を生成、出力する。同期最適化装置20は、入力部5001、解析部5002、生成部5003、指示部5004、変換部5005および再配置部5006を備える。
図31は、第2の実施形態による同期最適化処理の例を概略的に示すフローチャートである。ステップS201で、入力部5001に対して同期最適化対象のプログラムコード111’と、当該プログラムコード111’によるプログラムに対するタスク境界を示すタスク境界情報110’とが入力される。次のステップS202で、解析部5002は、入力されたプログラムコード111’を解析してデータアクセスに関する依存関係情報(第1依存関係情報112)を得る。
次のステップS203で、生成部5003は、タスク境界情報110’と、解析部5002が解析した第1依存関係情報112とに基づき、提示を行うための提示情報114を生成する。次のステップS204で、指示部5004は、依存有無情報115の入力があったか否かを判定し、入力があったと判定した場合、処理をステップS205に移行させる。ステップS205で、指示部5004は、入力された依存有無情報115に従い変換情報107を生成または更新し、処理をステップS203に戻す。生成部5003は、依存有無情報115の入力に伴い更新された変更情報107を提示情報114に反映させる。
一方、依存有無情報115の入力が終了し、ステップS204で依存有無情報115の入力が無いと判定されたら、処理がステップS206に移行される。ステップS206で、変換部5005は、指示部5004により生成または更新された変換情報107を用いて、解析部102が解析した第1依存関係情報112を第2依存関係情報113に変換する。次のステップS207で、再配置部5006は、変換部5005が変換した第2依存関係情報113を用いて、同期を再配置した並列プログラム116’を生成、出力する。
以下の説明では、同期最適化装置20の各機能ブロックを図30に示した順番で直列に接続した最も基本的な形態での各機能ブロックの説明を行う。本第2の実施形態は、この例に限定されない。例えば、複数の機能ブロックが協調しながら動作を行う構成、一部の機能ブロックの順番を入れ替える構成、ある機能ブロックを複数の機能ブロックに分割する構成、これら3つの形態を組み合わせる構成などで本第2の実施形態を実施することもできる。また、機能ブロックを複数のモジュールに分割して実施することもできる。
入力部5001は、プログラムコード111’とタスク境界情報110’とを同期最適化装置20に入力する。ここで、プログラムコード111’は、既に何らかの方法でタスク毎に分割され、各タスクより並列化されている並列プログラムである。したがって、プログラムコード111’は、タスク境界情報110’を含んでいる。
図32は、タスク境界情報110’を含むプログラムコード111’の例を示す。図32に例示されるプログラムコード111’は、3つのタスクから構成される並列プログラムコードである。プログラムコード111’中のコード“task1”、コード“task2”およびコード“task3”と、これらのコードに付随する括弧“{ … }”がタスク境界情報110’を示しており、括弧内“{ … }”のコードが同じタスクに所属している。それぞれのタスクは、コマンドput_tokenおよびコマンドget_tokenを利用して同期を行いながら並列実行される。
解析部5002は、プログラムコード111’とタスク境界情報110’とを解析して第1依存関係情報112を出力する。
解析部5002は、プログラムコード111’中の同期情報を利用して、プログラムコード111’によるプログラムの実行順序制約を解析する。図32の例では、同期情報は、コマンドput_tokenおよびコマンドget_tokenと、これらコマンドによって受け渡されるトークンを識別する識別子とを含む。コマンドput_tokenは、トークンを渡すコマンドであり、コマンドget_tokenは、コマンドを受け取るコマンドである。解析部5002は、同じ識別子を持つコマンドput_tokenとコマンドget_tokenとが対応関係にあると解析する。
図33は、図32のプログラムコード111’における同期情報の対応関係を解析した結果を模式的に示す。なお、図33において、行番号は、元のプログラムコード111’における行番号を示している。プログラムコード111’は、コード“task1”で定義されるタスク912と、コード“task2”で定義されるタスク913と、コード“task3”で定義されるタスク911とに分割され、タスク911とタスク912との境界がタスク境界901、タスク912とタスク913との境界がタスク境界902、タスク911とタスク913との境界がタスク境界903とされている。
ここで、同期コードを含まない連続した処理をブロックと呼ぶ。解析部5002は、プログラムコード111’の各タスクから、ブロックを抽出する。図33の例では、タスク911における第17行〜第20行が1つのブロック921とされる。タスク912における第3行目および第4行目、ならびに、第6行目が、それぞれ1つのブロック922および923とされる。また、タスク913における第11行目および第12行目、ならびに、第14行目が、それぞれ1つのブロック924および925とされる。
図33において、対応関係にあるコマンドput_tokenおよびコマンドget_tokenが矢印で接続され、同期位置が示される。解析部5002は、図33の同期情報の対応関係から、図32のプログラムコード111’における実行順序制約を解析する。
図34は、プログラムコード111’から解析された実行順序制約の例を示す。解析部5002は、下記のルールに従って実行順序制約の解析を行う。
(1)同じタスクに含まれるブロックは、上から下(行番号が小さいブロックから、行番号が大きいブロック)の順に実行されるという実行順序制約がある。
(2)異なるタスクに含まれるブロックは、対応するコマンドput_tokenの前の処理の次にコマンドget_tokenの後の処理が実行されるという実行順序制約がある。
例えば、タスク911に含まれるブロック921と、タスク912に含まれるブロック922とでは、ブロック921とブロック922とが異なるタスクに含まれている。そのため、ブロック921とブロック922との間には、上述した(2)の、識別子TOKID_1を持つコマンドput_tokenおよびコマンドget_tokenによる実行順序制約が存在する。一方、それぞれタスク912に含まれるブロック922とブロック923とでは、ブロック922およびブロック923が同じタスクに含まれているため、上述した(1)の、タスク912の上から下の順による実行順序制約が存在する。
このように、プログラムコード111’における実行順序制約の解析を行った結果、図34に例示されるようなブロック間の実行順序制約が得られる。すなわち、ブロック921、ブロック922の順に実行され、ブロック922の実行後、ブロック923およびブロック924がそれぞれ実行される。ブロック923およびブロック924の実行後、ブロック925が実行される。
解析部5002は、解析した実行順序制約を利用して、さらに第1依存関係情報112を解析する。図35は、図34に示した実行順序制約から解析した第1依存関係情報112の例を示す。なお、図35において、左側に示したプログラムコードは、単に各ノードとの対応関係を分かりやすくするために併記したものであり、実際には、第1依存関係情報112は、このプログラムコードの情報を保持していない。
解析部5002は、実行順序制約の順にデータアクセス表現が実行された際に、データアクセス表現の実行順序を利用して依存グラフを生成する。例えば、データaは、ブロック921で“a=0”、“a=2”、“s=*p”の順にアクセスされ、次にブロック922で“*q=4”がアクセスされ、次にブロック924で“t=a”がアクセスされ、次にブロック925で“v=a+c”がアクセスされる。このアクセス順序から、図35の依存グラフ951aが生成される。データbに関する依存グラフ952b、データcに関する依存グラフ953cも同様である。
解析部5002は、第1依存関係情報112のエッジに接続されるノードが異なるタスクに所属するとき、当該エッジにタスク境界が存在すると解析する。図33の例では、上述したように、タスク911とタスク912との間のタスク境界をタスク境界901、タスク912とタスク913との間のタスク境界902、タスク911とタスク913との間のタスク境界をタスク境界903としてそれぞれ示した。
生成部5003、指示部5004および変換部5005は、図1に示した第1の実施形態における生成部103、指示部104および変換部105と同一の機能を持つ。処理内容も、第1の実施形態における並列化装置10と同様であるため、ここでの説明を省略する。
再配置部5006は、変換部5005が変換した後の第2依存関係情報113を利用して同期の位置を再決定し、再決定された同期を挿入した並列プログラム116’を生成する。再配置部5006における処理は、並列化装置10の並列化部106における処理に対して、下記の点が相違する。
(1)不要な最適化前の同期を削除する。
(2)並列化処理は不要である。
例えばタスク境界情報110’を含むプログラムコード111’に対し、第1の実施形態で説明したのと同様の依存有無情報115が与えられ、この依存有無情報115に基づき図16に示した変換情報107が生成される。再配置部5006は、この変換情報107に基づき変換部5005で第1依存関係情報112を変換した第2依存関係情報113に対し、第1の実施形態で説明したのと同様にして必要な同期を解析して、図36に例示される、同期が最適化された並列プログラム116’を出力する。
このように、本第2の実施形態によれば、逐次プログラムではなく、並列化が既に行われた並列プログラムを入力した場合であっても、意味のある処理を行うことができる。すなわち、入力された並列プログラムに対し、同期を最適化することにより、当該並列プログラムの性能を向上させることができる。
(第3の実施形態)
本第3の実施形態では、並列プログラムにおけるデータアクセスの依存関係を示す依存関係情報を、当該並列プログラムの動作中にランタイムライブラリが変更できるようにした。
図37は、本第3の実施形態による情報処理装置としての並列化システム1230の機能を示す一例の機能ブロック図である。並列化システム1230は、コード変換部1220およびランタイムライブラリ部1221と、並列プログラム116”内のインターフェイス(I/F)部1210とを含む。なお、図37において、上述の図1と共通する部分には同一の符号を付し、詳細な説明を省略する。
図37の並列化システム1230を図1に示した第1の実施形態における並列化装置10と比較すると、並列化装置10の一部がコード変換部1220に含まれ、他の部分がランタイムライブラリ部1221に含まれている。並列プログラム116”内に設けられるインターフェイス部1210は、例えばランタイムライブラリ部1221のAPI(Application Programming Interface)であって、並列プログラム116”は、このインターフェイス部1210を介してランタイムライブラリ部1221と通信を行うことができる。
また、図37の並列化システム1230は、図1の並列化装置10に対して、インターフェイス(I/F)挿入部1500および情報生成部1501が追加されている。
本第3の実施形態では、コード変換部1220において、並列化部106’がタスク境界情報110”を利用してプログラムコード111”を並列化した並列プログラム116Aを生成する。インターフェイス挿入部1500は、解析部102がプログラムコード111”およびタスク境界情報110”に基づき解析した第1依存関係情報112と、第1依存関係情報112を生成部103が変換した提示情報114とを用いて、並列化部106’が生成した並列プログラム116Aに対してインターフェイス部1210を挿入した並列プログラム116”を生成する。
なお、逐次プログラムとして入力されるプログラムコード111”と、当該プログラムコード111”を変換した並列プログラム116Aとでは、互いに機能的に等価であるメモリアクセスを行う。例えば、プログラムコード111”に間接アクセス表現“*p”にデータaのアクセスがあった場合、当該プログラムコード111”を並列化した並列プログラム116Aにおいても、間接アクセス表現“*p”は、同じデータaを参照する。
図38は、インターフェイス挿入部1500の一例の構成をより詳細に示す。インターフェイス挿入部1500は、同期インターフェイス(I/F)挿入部1600と、依存有無情報更新インターフェイス挿入部1601と、関係情報生成部1603とを含む。
同期インターフェイス挿入部1600は、第1依存関係情報112を利用して、並列プログラム116Aに対して同期インターフェイス部1610を挿入する。関係情報生成部1603は、提示情報114を入力し、間接アクセス表現のアクセス先を決定する動的なデータへの書き込みアクセスと、この書き込みアクセスによってアクセスの有無が決定する間接アクセス表現によるノードとの対応関係を表現する関係情報1602を生成する。依存有無情報更新インターフェイス挿入部1601は、関係情報1602に基づき並列プログラム116Aに対して依存有無情報更新インターフェイス部1611を挿入する。
インターフェイス部1210は、インターフェイス挿入部1500により並列プログラム116Aに挿入された、同期インターフェイス部1610および依存有無情報更新インターフェイス部1611を含む。
コード変換部1220で生成された第1依存関係情報112は、XML(Extensible Markup Language)などのフォーマットを用いてデータアクセス間の依存関係を表現した第1依存関係情報ファイル1202を介して、ランタイムライブラリ部1221に渡される。解析部102で生成された第1依存関係情報112は、依存情報出力部1200により第1依存関係情報ファイル1202に格納されて、ランタイムライブラリ部1221に渡され、変換部1203に入力される。
依存有無情報115は、第1の実施形態では、ユーザが作成し指示部104から入力していた。これに対して、本第3の実施形態では、依存有無情報115は、並列プログラム116”が依存有無情報更新インターフェイス部1611を介して情報生成部1501が生成し、指示部1202に入力される。
ランタイムライブラリ部1221と並列プログラム116”は、コンパイルされて実行可能状態となり、これをプロセッサなどのプログラム実行環境で実行する。並列プログラム116”は、例えばランタイムライブラリ部1221と一部または全部が共通の実行環境において、ランタイムライブラリ部1221と共に実行される。実行が開始されると、ランタイムライブラリ部1221において、第1依存関係情報ファイル1202に記録されている第1依存関係情報112を、変換部1203が読み込む。
一方、並列プログラム116”の実行に伴い、挿入されている依存有無情報更新インターフェイス部1611の実行結果がランタイムライブラリ部1221内の情報生成部1501に渡される。依存有無情報更新インターフェイス部1611の実行結果は、例えば当該インターフェイス部1210が実行されたか否かを示す情報を含む。情報生成部1501は、このインターフェイス部1210の実行結果に応じて依存有無情報115を生成する。生成された依存有無情報115は、指示部1204に入力される。
指示部1204は、入力された依存有無情報115から変換情報107を生成する。変換部1203は、この変換情報107に基づき、第1依存関係情報ファイル1202から読み込んだ第1依存関係情報112を第2依存関係情報113に変換する。第2依存関係情報113は、並列プログラム116”の同期インターフェイス部1610に入力される。同期インターフェイス部1610は、入力された第2依存関係情報113を並列プログラム116”のタスクの同期に反映させる。
本第3の実施形態による並列化システム1230は、様々なバリエーションが考え得る。例えば、並列プログラム116”の実行環境にコード変換部1220が含まれていてもよいし、コード変換部1220と実行環境との間での第1依存関係情報112の受け渡し方法としては、第1依存関係情報112をファイルに格納して受け渡すに限らず、メモリ上のデータとしてメモリを介して受け渡すなど様々な方法が考えられる。並列プログラム116”に対するインターフェイス部1210の挿入方法についても、様々な方法が考えられる。例えば、インターフェイス部1210を、プログラムコードの1行単位で挿入してもよいし、プログラムコードの複数行からなるブロック単位で挿入してもよい。
また、インターフェース部1210とその機能となるランタイムライブラリ部1221の処理も、様々に考えられる。例えば、不確実アクセスノードを削除するインターフェイスと、確実アクセスノードに変更するインターフェイスとに分けてもよいし、これら2の機能を持つ1のインターフェイスとなっていてもよい。
本第3の実施形態による並列化システム1230は、インターフェイス部1210を挿入することにより並列プログラム116”の実行を監視しているが、これはこの例に限定されず、他の方法により並列プログラム116”の実行を監視してもよい。例えば、並列プログラム116”には何も挿入しない代わりに、当該並列プログラム116”のプログラムコードの実行をOS(Operating System)が監視しておき、監視しているCPUの命令を実行したときに、同期もしくは依存有無の更新を行う方法がある。OSが実行状況を監視する場合、関係情報1602を利用して、OSが監視する命令とこの命令が実行されたときに行う処理をOSに設定する。
さらに、図37で示した並列化システム1230の各機能をそれぞれハードウェアにより実装することもできるし、CPUで動作されるソフトウェアにより実装してもよい。ハードウェアによる実装とソフトウェアによる実装とのハイブリッドでもよい。さらにまた、プログラムコード111”、タスク境界情報110”、入力部101、解析部102および第1依存関係情報112と、これらから作成および使用される情報などに関しては、上述の第1の実施形態で説明したような、様々なバリエーションが考えられる。
また、ランタイムライブラリ部1221により変換された第2依存関係情報113の利用方法も、上述の例に限定されない。例えば、第2依存関係情報113が更新される毎に、更新内容などをトレース情報として記録しておいてもよい。このようなトレース情報は、並列プログラムの作成時などに、動的な情報を反映した依存関係情報として利用可能である。
次に、サンプルコードを用いて、並列プログラムの形態やランタイムライブラリ部1221の動作について説明する。図39は、コード変換部1220に入力されるプログラムコード111”の例を示す。プログラムコード111”のデータpは、間接アクセス表現*pのアクセス先を決定する動的なデータであり、間接アクセス表現*pによるデータアクセスは、不確実アクセスノードとなる。このプログラムコード111”においては、第2行目〜第6行目のif文の条件の分岐結果により、データpがアクセスするデータが決定される。
すなわち、if文の条件が真になったのであればコード“p=&a”が実行されて、間接アクセス表現*pは、データaにアクセスする。一方、if文の条件が偽になったのであればコード“p=&b”が実行されて、間接アクセス表現*pは、データbにアクセスする。したがって、間接アクセス表現*pのノードは、if文の条件分岐結果によりアクセスの有無が決定可能である。
図40は、プログラムコード111”に対するタスク境界情報110”の例を示す。この例では、プログラムコード111”において、第9行目のコード“label_2”と、第13行目のコード“label_3”とがタスク境界であることが示され、これにより、プログラムコード111”が3つのタスクに分割されることが分かる。
図41は、解析部102がプログラムコード111”を解析して、変数毎のデータアクセス依存関係を表現した例を示す。第1依存関係情報112において、データa、データbおよびデータcそれぞれについて依存関係が解析され、依存グラフ1301a、1302bおよび1303cが得られている。間接アクセス表現*pは、if文中の、ポインタ変数pに変数aまたはbのアドレスを代入するコード“p=&a”とコード“p=&b”とにより、データaまたはデータbにしかアクセスしないため、データaおよびデータbの依存グラフ中にのみ、不確実アクセスノードとして存在する。
図42は、図40のタスク境界情報110”を利用して図39のプログラムコード111”をタスクに分割した場合の例を概念的に示す。この例では、タスク境界情報110”により、プログラムコード111”による処理が、タスク1400、1401および1402の3つのタスクに分割される。また、タスク1400とタスク1401との境界がタスク境界1410、タスク1401とタスク1402との境界がタスク境界1411、タスク1400とタスク1402との境界がタスク境界1412とされる。
図43は、解析部102が図40〜図42を用いて説明した情報に基づき生成した、プログラムコード111”の第1依存関係情報112の例を概念的に示す。図43において、タスクTask1がタスク1400、タスクTask2がタスク1401、タスクTask3がタスク1402をそれぞれ示し、各タスク1400〜1402の境界が横線でタスク境界1410および1411として示されている。なお、この例では、タスク境界1412は、ノードが存在しないタスクTask2を通過するエッジにより、間接的に表現される。
また、解析部102は、各タスク境界1410〜1412を跨ぐエッジから、タスク間の依存関係を特定することができる。このとき、タスク内に対象データのノードが存在しない場合は、当該タスクに関するタスク境界にエッジが存在しても、当該タスクは、当該対象データに対する依存関係は存在しない。例えば、図43の例では、データaに関しては、タスクtask1とタスクtask3との間で不確実タスク境界エッジが存在することが示される。データcに関しては、タスクTask1とタスクTask2との間に確実タスク境界エッジが存在することが示される。
並列化部106’は、タスク境界情報110”に基づきプログラムコード111”を並列プログラム116Aに変換する。例えば、並列化部106’は、プログラムコード111”をタスク毎に分割した状態の並列プログラム116Aに変換する。並列プログラム116Aには、コード“Task1”、コード“Task2”およびコード“Task3”と、中括弧{ … }によってタスクTask1、タスクTask2およびタスクTask3がそれぞれ定義される。
インターフェイス挿入部1500は、並列化部106’で作成された並列プログラム116Aに対して、コマンドまたは関数valid_node()、invalid_node()、post_sync()およびwait_sync()を挿入して、並列プログラム116”を生成する。図44は、図39に示したプログラムコード111”を元に生成した並列プログラム116”の例を示す。なお、以下では、便宜上、コマンドまたは関数valid_node()、invalid_node()、post_sync()およびwait_sync()を、それぞれコマンドとして説明する。
コマンドvalid_node()およびコマンドinvalid_node()が依存有無情報更新インターフェイスである。コマンドpost_sync()およびコマンドwait_sync()が同期インターフェイスである。並列プログラム116Aに挿入された依存有無情報更新インターフェイスが、依存有無情報更新インターフェイス部1611である。同様に、並列プログラム116Aに挿入された同期インターフェイスが、同期インターフェイス部1610である。これらのコマンドは、ランタイムライブラリ部1221と通信を行うためのインターフェイス(API)であって、インターフェイス部1210を構成する。
依存有無情報更新インターフェイス部1611は、並列プログラム116”に含まれる間接アクセス表現のアクセス先を決定する動的なデータへの書き込みアクセスを監視し、監視結果をランタイムライブラリ部1221に渡す。
依存有無情報更新インターフェイス部1611を構成するコマンドvalid_node()およびinvalid_node()は、不確実タスク境界ノードに関する依存有無関係情報を更新するためのインターフェイスである。コマンドvalid_node()およびinvalid_node()は、不確実ノードの情報を更新し、当該不確実ノードの確実ノードへの変更、または、当該不確実ノードの削除を行う。コマンドvalid_node()およびinvalid_node()は、インターフェイス挿入部1500が不確実タスク境界ノードの原因となっている変数に対するアクセス個所に挿入する。ここで、不確実タスク境界ノードの状態に影響を与える変数は、上述した間接アクセス表現のアクセス先を決定する変数であって、より具体的には、C言語などのプログラミング言語におけるポインタや配列のインデックスなどである。
関係情報生成部1603は、提示情報114に含まれる不確実タスク境界ノードと、この不確実タスク境界ノードのアクセスの有無を決定するデータアクセスとのアクセスの有無に関する関係情報1602を生成する。関係情報1602は、コマンドvalid_node()およびinvalid_node()の挿入を行うための情報である。
関係情報生成部1603に生成された関係情報1602は、コマンドvalid_node()およびinvalid_node()を並列プログラム116Aに挿入する位置を示す位置情報と、これらのコマンドに与える引数とを含む。引数は、コマンドが対象とするノードを特定するための識別子を含む。ここで、変数アクセスは、例えば、間接アクセス表現であるポインタ変数へのアドレスの代入である。
図45は、図43に示した第1依存関係情報112の各依存グラフおよびノードに対して、それぞれ識別子を対応付けた例を示す。図45において、識別子「VAR_ID_x」は、値「x」により各データを識別する。この例では、識別子「VAR_ID_1」がデータa、識別子「VAR_ID_2」がデータb、識別子「VAR_ID_3」がデータcを表している。また、識別子「NODE_ID_x」は、各データの依存グラフのルートから順番に値「x」を割り振り、ノードを識別する。各コマンドvalid_node()、invalid_node()、post_sync()およびwait_sync()の引数としてこれら識別子「VAR_ID_x」および識別子「NODE_ID_x」を組み合わせて用いて、依存グラフのノードを特定する。これらの識別子は、コード変換部1220の解析部102でプログラムコード111”から解析されたノード毎に割り振られ、第1依存関係情報112に付加されると共に、並列プログラム116”へのコマンド挿入時に使用される。以下、適宜、ノードを識別子「VAR_ID_x」および識別子「NODE_ID_x」を用いて、ノード(VAR_ID_x,NODE_ID_x)のように記述する。
図46は、図45における関係情報1602の例を示す。関係情報1602は、コマンドvalid_node()およびinvalid_node()を並列プログラム116Aに挿入する位置を示す監視位置情報と、これらのコマンドに与える引数とを含む。図46に示されるように、関係情報1602は、識別子「VAR_ID_1, NODE_ID_2」などのコマンドvalid_node()およびinvalid_node()に与える引数と、監視位置情報とを関連付ける。コマンドvalid_node()およびinvalid_node()に与える引数は、これらのコマンドにより情報を更新する対象である不確実アクセスノードを識別可能な情報となっている。
依存有無情報更新インターフェイス挿入部1601は、プログラムコード中の変数に対するアクセスを解析し、当該変数に対するデータアクセスの有無や、不確実アクセスノードのアクセス確実性フラグの不確実から確実への変更に影響を与えるデータアクセスを抽出する。このとき、依存有無情報更新インターフェイス挿入部1601は、直接アクセス表現および間接アクセス表現など、ある変数に関わるアクセス全般について、この解析を行う。
逐次プログラムである図39に示したプログラムコード111”を例に挙げて説明する。インターフェイス挿入部1500は、プログラムコード111”における第3行目のように、間接アクセス表現“*p”にデータaをセットするコードがあった場合、図46に例示される関係情報1602を参照する。より具体的には、依存有無情報更新インターフェイス挿入部1601は、依存有無情報更新インターフェイスとして挿入すべきコマンドvalid_node()およびinvalid_node()の情報を、図46に例示した関係情報1602から得ることができる。依存有無情報更新インターフェイス挿入部1601は、関係情報1602を利用して、例えばコード“p=&a”の監視位置情報に対応付けられた、これらの依存有無情報更新インターフェイスを挿入する。
図45に示されるように、データaに関しては、識別子「VAR_ID_1」および識別子「NODE_ID_2」で識別されるノードと、識別子「VAR_ID_1」および識別子「NODE_ID_3」で識別されるノードの、2つの不確実タスク境界ノードが存在する。そのため、図44の並列プログラム116”における第4行目および第5行目に示されるように、これらのノードを確実アクセスノードへと変更するコマンドvalid_node(VAR_ID_1,NODE_ID_2)およびコマンドvalid_node(VAR_ID_1,NODE_ID_3)を挿入する。また、データbに関する不確実タスク境界ノードには、識別子「VAR_ID_2」および識別子「NODE_ID_1」で識別されるノードと、識別子「VAR_ID_2」および識別子「NODE_ID_3」で識別されるノードとが存在する。これらのノードについては、図44の第6行目に示されるように、これらのノードを削除するコマンドinvalid_node(VAR_ID_2,NODE_ID_1)およびinvalid_node(VAR_ID_2,NODE_ID_3)を挿入する。
なお、本第3の実施形態では、依存有無情報更新インターフェイス部1611の挿入により、間接アクセス表現*pに対する代入を監視する例を示したが、これはこの例に限定されず、間接アクセス表現*pに対する参照を監視してもよいし、代入および参照の両方を共に監視してもよい。
同期インターフェイス部1610を構成するコマンドpost_sync()およびコマンドwait_sync()は、タスク間の同期を制御する同期インターフェイスである。コマンドpost_sync()は、あるアクセスノードからのエッジが存在する場合に、そのアクセスを含む文の直後に挿入する。一方、コマンドwait_sync()は、あるアクセスノードへのエッジが存在する場合に、そのアクセスを含む文の直前に挿入する。
図44の並列プログラム116”の例では、図43または図45に示した第1依存関係情報112と比較し、第15行目の直接アクセス表現によるデータaに対するアクセスの直後に、コマンドpost_sync(VAR_ID_1,NODE_ID_1)が挿入される。また、第17行目のデータcに対する間接アクセス表現“*p”によるアクセスの直後に、コマンドpost_sync(VAR_ID_3,NODE_ID_1)、post_sync(VAR_ID_1,NODE_ID_2)およびpost_sync(VAR_ID_2,NODE_ID_1)が挿入される。
コマンドwait_sync()については、第24行目の直接アクセス表現によるデータcに対するアクセスの直前に、コマンドwait_sync(VAR_ID_3,NODE_ID_2)が挿入される。第26行目の直接アクセス表現によるデータbに対するアクセスの直前に、コマンドwait_sync(VAR_ID_2,NODE_ID_2)が挿入される。また、第33行目の間接アクセス表現“*p”に対するデータtによるアクセスの直前に、コマンドwait_sync(VAR_ID_1,NODE_ID_3)と、コマンドwait_sync(VAR_ID_2,NODE_ID_3)とが挿入される。
次に、インターフェイス部1210を構成する各コマンドの機能について概略的に説明する。
(a)コマンドvalid_node():
引数で指定したノードを確実アクセスノードに変更する変換情報107を、ランタイムライブラリ部1221の情報生成部1501および指示部1204を介して変換部1203に送る。
より具体的には、インターフェイス部1210において当該コマンドvalid_node()が実行されると、データおよびを識別する識別子と、ノードを識別する識別子とを含む引数と、引数で指定したノードを確実アクセスノードに変更する指示とが情報生成部1501に渡される。情報生成部1501は、当該コマンドvalid_node()から渡された情報を用いて依存有無情報115を生成する。指示部1204は、この依存有無情報115から、引数で指定したノードを確実アクセスノードに変更するための変換情報107を作成して変換部1203に渡す。なお、後述するコマンドinvalid_node()、コマンドpost_sync()およびコマンドwait_sync()についても、同様に実行結果の変換部1203に対する伝達がなされる。
変換部1203は、送られた変換情報107を用いて第2依存関係情報113の更新を行う。並列プログラム116”の最初の実行時など、第2依存関係情報113が存在しないような場合には、第1依存関係情報ファイル1202から読み込んだ第1依存関係情報112に基づき第2依存関係情報113を作成することもできる。コマンドvalid_node()は、ある間接アクセス表現に対するアクセスがある場合に、その間接アクセス表現にセットされるデータに対応する不確実タスク境界ノードの数だけ挿入される。コマンドvalid_node()は、間接アクセス表現にセットされたデータの不確実タスク境界ノードが引数に指定される。
(b)コマンドinvalid_node():
引数で指定したノードを消去する変換情報107を、ランタイムライブラリ部1221の情報生成部1501および指示部1204を介して変換部1203に送る。変換部1203は、送られた変換情報107を用いて第2依存関係情報113の不確実アクセスノードを消去する。並列プログラム116”の最初の実行時など、第2依存関係情報113が存在しないような場合には、第1依存関係情報ファイル1202から読み込んだ第1依存関係情報112に基づき第2依存関係情報113を作成することもできる。コマンドinvalid_node()は、ある間接アクセス表現に対するアクセスがある場合に、その間接アクセス表現にセットされないデータの不確実タスク境界ノードの数だけ挿入される。コマンドinvalid_node()は、間接アクセス表現にセットされなかったデータの不確実タスク境界ノードが引数に指定される。
(c)コマンドpost_sync():
第2依存関係情報113をチェックし、引数で指定したノードが存在している場合に、そのノードからのエッジを削除するような変換情報107を、ランタイムライブラリ部1221の情報生成部1501および指示部1204を介して変換部1203に送る。なお、第2依存関係情報113は、並列プログラム116”の最初の実行時など、第2依存関係情報113が存在しないような場合、第1依存関係情報ファイル1202から読み込んだ第1依存関係情報112に基づき作成することができる。コマンドpost_sync()は、対象ノードからのエッジが確実タスク境界エッジまたは不確実タスク境界エッジの場合に挿入される。
(d)コマンドwait_sync():
ランタイムライブラリ部1221の情報生成部1501および指示部1204を介して変換部1203に対して、第2依存関係情報113を参照し、引数で指定したノードが存在している場合にそのノードへのエッジが存在するかをチェックして、実行開始および同期待ちの何れの状態であるか否かを判断するよう、リクエストを送る。変換部1203は、このリクエストに応じて、変換情報107に基づき第2依存関係情報113を参照する。このとき、変換部1203は、変換情報107を第2依存関係情報113を参照するためだけに用い、依存関係情報の変更は行わない。なお、第2依存関係情報113は、並列プログラム116”の最初の実行時など、第2依存関係情報113が存在しないような場合、第1依存関係情報ファイル1202から読み込んだ第1依存関係情報112に基づき作成することができる。コマンドwait_sync()は、対象ノードへのエッジが確実タスク境界エッジまたは不確実タスク境界エッジの場合に挿入される。
依存有無情報更新インターフェイス挿入部1601が並列プログラム116”に挿入した各コマンドにより、依存有無情報更新インターフェイス部1611の実行結果が情報生成部1501に渡される。情報生成部1501は、この実行結果に基づき依存有無情報115を作成する。この依存有無情報115により、実行中の並列プログラム116”におけるデータアクセスが監視される。換言すれば、依存有無情報更新インターフェイス挿入部1601と依存情報有無更新インターフェイス部1611と情報生成部1501とにより、並列プログラム116”におけるデータアクセスを監視する監視部が構成されるといえる。なお、上述のように、OSがデータアクセスを監視する場合、監視部を構成する機能部品は、本第3の実施形態とは異なるものとなる。
図47および図51は、図44に示した並列プログラム116”の実行イメージを示す。図47は、図44に示した並列プログラム116”における第2行目のif文の判定結果が真になった場合の実行例を示す。また、図51は、当該if文の判定結果が偽になった場合の実行例を示す。図47および図51において、縦軸は時間を示し、図の上から下に向けて時間が進行する。また、実線の矢印がプログラムの実行を表し、点線が同期待ちを表している。また、矢印の左横に記述されるプログラムコードがそれぞれのタスクの処理のイメージを表している。
先ず、図47に示される、if文の判定結果が真の場合の実行イメージを時系列順に追って説明する。
(1)タスクTask1、タスクTask2およびタスクTask3がそれぞれ実行を開始する。タスクTask1は、同期待ちは必要なく、処理を開始する。タスクTask2は、コマンドwait_sync(VAR_ID_3,NODE_ID_2)を実行する。ここでは、図45に示したように、引数で指定されたノードが存在しているため、先ず、この引数で指定されたノードへのエッジをチェックする。引数で指定されたノードへのエッジが存在するため、タスクTask2は、同期待ち状態に入る。タスクTask3は、コマンドwait_sync(VAR_ID_1,NODE_ID_3)を実行する。この場合は、引数で指定されたノードが存在しているため、このノードへのエッジをチェックする。エッジが存在するため、タスクTask3は、同期待ち状態に入る。なお、同期待ちとなり処理が開始されないタスクTask2およびTask3は、ポーリングを行い、同様の判定を繰り返しているものとする。
(2)タスクTask1は、プログラムの処理を進めていき、if文の処理を終えたものとする。この例では、if文による条件判定の結果が真となったものとしている。ここで、第4行目、第5行目のコマンドvalid_node(VAR_ID_1,NODE_ID_2)とコマンドvalid_node(VAR_ID_1,NODE_ID_3)とを実行し、第2依存関係情報113の対象ノードを確実アクセスへと更新する。また、第6行目、第7行目のコマンドinvalid_node(VAR_ID_2,NODE_ID_1)とコマンドinvalid_node(VAR_ID_2,NODE_ID_3)とを実行し、対象ノードを削除すると共に接続されているエッジも削除する。
すなわち、例えばコマンドvalid_node(VAR_ID_1,NODE_ID_2)とコマンドvalid_node(VAR_ID_1,NODE_ID_3)とが実行されると、引数に従い情報生成部1501が依存有無情報115を生成する。引数で指定されたノードを確実アクセスノードに変更する変更情報107がランタイムライブラリ部1221の指示部1204を介して変換部1203に送られる。
コマンドinvalid_node(VAR_ID_2,NODE_ID_1)とコマンドinvalid_node(VAR_ID_2,NODE_ID_3)に関しても同様である。変換部1203は、送られた変換情報107を用いて第2依存関係情報113を更新する。インターフェイス部1210は、更新された第2依存関係情報113を並列プログラム116”の実行に反映させる。
図48は、コマンドvalid_node(VAR_ID_1,NODE_ID_2)、valid_node(VAR_ID_1,NODE_ID_3)、invalid_node(VAR_ID_2,NODE_ID_1)およびinvalid_node(VAR_ID_2,NODE_ID_3)の実行により変更が加えられた第2依存関係情報113の例を示す。図45に示した元の依存関係情報、すなわち第1依存関係情報112に対して、識別子(VAR_ID_1,NODE_ID_2)および(VAR_ID_1,NODE_ID_3)で特定されるノードが確実アクセスノードに変更されている(依存グラフ1301a−1)。また、識別子(VAR_ID_2,NODE_ID_1)および(VAR_ID_2,NODE_ID_3)で特定されるノードが削除され、識別子(VAR_ID_2,NODE_ID_2)に接続されるエッジが削除されているのが分かる(依存グラフ1302b−1)。
(3)タスクTask1は、さらに実行を継続し、第15行目で直接アクセス表現“a”に値「2」をセットした後、第16行目のコマンドpost_sync(VAR_ID_1, NODE_ID_1)を実行する。対象のノード(VAR_ID_1, NODE_ID_1)は存在するため、そのノード(VAR_ID_1, NODE_ID_1)からのエッジを削除する。図49は、この変更を加えた第2依存関係情報113の例を示す。上述の図48に対し、ノード(VAR_ID_1, NODE_ID_1)からノード(VAR_ID_1, NODE_ID_2)へのエッジが削除されているのが分かる(依存グラフ1301a−2)。
(4)タスクTask1は、さらに実行を継続し、第17行目で、データcに対して間接アクセス表現“*p”の値すなわちデータaの値「2」をセットする。その後、間接アクセス表現“*p”に係るノードに対して、第18行目のコマンドpost_sync(VAR_ID_3,NODE_ID_1)と第19行目のコマンドpost_sync(VAR_ID_1,NODE_ID_2)を実行する。対象ノード(VAR_ID_3,NODE_ID_1)および(VAR_ID_1,NODE_ID_2)は存在するため、これらのノードからのエッジを削除する。図50は、この変更を加えた第2依存関係情報113の例を示す。上述の図49に対し、ノード(VAR_ID_3,NODE_ID_1)からノード(VAR_ID_3,NODE_ID_2)へのエッジと、ノード(VAR_ID_1,NODE_ID_2)からノード(VAR_ID_1,NODE_ID_3)へのエッジとが削除されているのが分かる(依存グラフ1303c−1、依存グラフ1301a−3)。
(5)タスクTask1は、さらに実行を継続し、第20行目のコマンドpost_sync(VAR_ID_2,NODE_ID_1)を実行する。この場合、対象ノード(VAR_ID_2,NODE_ID_1)は既に削除されて存在しないため、実際には何も行われない。
(6)上述したコマンドwait_sync(VAR_ID_3,NODE_ID_2)に応じてポーリングしているタスクTask2は、図50に示した第2依存関係情報113を参照し、対象ノード(VAR_ID_3,NODE_ID_2)へのエッジが削除されたことを検知し、実行を開始する。
(7)同様に、上述したコマンドwait_sync(VAR_ID_1,NODE_ID_3)に応じてポーリングしているタスクTask3は、図50に示した第2依存関係情報113を参照し、対象ノード(VAR_ID_1,NODE_ID_3)へのエッジが削除されたことを検知し、実行を開始する。
(8)タスクTask3は、第32行目のコマンドwait_sync(VAR_ID_2,NODE_ID_3)を実行するが、対象ノード(VAR_ID_2,NODE_ID_3)へのエッジが既に削除されているため、何も行わない。その後、第33行目〜第35行目のコードに従い、間接アクセス表現“*p”がアクセスするデータに対してデータtの値をセットし、直接アクセス表現“u”に対して、直接アクセス表現“v”の値と、値「3」とを加算した値をセットする。さらに、直接アクセス表現“v”の値に直接アクセス表現“s”の値と、値「5」とを加算した値をセットする。
(9)タスクTask2は、第24行目で直接アクセス表現“c”に対して値「3」をセットした後、第25行目のコマンドwait_sync(VAR_ID_2, NODE_ID_2)を実行するが、図50に示されるように、既に対象ノード(VAR_ID_2, NODE_ID_2)へのエッジが存在しないため、実行を継続する。
(10)次に、タスクTask2は、第26行目で直接アクセス表現“b”に対して値「4」をセットした後、第27行目のコマンドpost_sync(VAR_ID_2,NODE_ID_2)を実行するが、図50に示されるように、既に対象ノード(VAR_ID_2,NODE_ID_2)へのエッジが存在しないため、実際には何も行わない。そして、第28行目で、直接アクセス表現“c”に対して値「5」をセットする。
次に、図51に示される、if文の判定結果が偽の場合の実行イメージを時系列順に追って説明する。
(1)タスクTask1、タスクTask2およびタスクTask3がそれぞれ実行を開始する。タスクTask1は、処理を開始することができる。タスクTask2は、コマンドwait_sync(VAR_ID_3,NODE_ID_2)を実行する。ここでは、図45に示したように、引数で指定されたノードへのエッジが存在するため、タスクTask2は、同期待ち状態に入る。タスクTask3は、コマンドwait_sync(VAR_ID_1,NODE_ID_3)を実行する。この場合も、引数で指定されたノードが存在しているため、このノードへのエッジをチェックする。エッジが存在するため、タスクTask3は、同期待ち状態に入る。なお、同期待ちとなり処理が開始されないタスクTask2およびTask3は、ポーリングを行い、同様の判定を繰り返しているものとする。
(2)タスクTask1は、プログラムの処理を進めていき、if文の処理を終えたものとする。この例では、if文による条件判定の結果が偽となったものとしている。ここで、第10行目、第11行目のコマンドvalid_node(VAR_ID_2, NODE_ID_1)とコマンドvalid_node(VAR_ID_2,NODE_ID_3)とを実行し、第2依存関係情報113の対象ノードを確実アクセスへと更新する。また、第12行目、第13行目のコマンドinvalid_node(VAR_ID_1,NODE_ID_2)とコマンドinvalid_node(VAR_ID_1,NODE_ID_3)とを実行し、対象ノードを削除すると共に接続されているエッジも削除する。タスクtask1は、その後も実行を継続する。
図52は、コマンドvalid_node(VAR_ID_2,NODE_ID_1)、valid_node(VAR_ID_2,NODE_ID_3)、invalid_node(VAR_ID_1,NODE_ID_2)およびinvalid_node(VAR_ID_1,NODE_ID_3)の実行により変更が加えられた第2依存関係情報113の例を示す。図45に示した元の依存関係情報、すなわち第1依存関係情報112に対して、識別子(VAR_ID_2,NODE_ID_1)および(VAR_ID_2,NODE_ID_3)で特定されるノードが確実アクセスノードに変更されている(依存グラフ1302b”)。また、識別子(VAR_ID_1,NODE_ID_2)および(VAR_ID_1,NODE_ID_3)で特定されるノードが削除されているのが分かる(依存グラフ1302a”)。
(3)上述したコマンドドwait_sync(VAR_ID_1,NODE_ID_3)に応じてポーリングしているタスクTask3は、図52に示した第2依存関係情報113を参照し、データaの間接アクセス表現“*p”に関する不確実タスク境界エッジが存在していないことを確認し、ポーリングから抜け処理を開始する。
(4)タスクTask3は、第32行目のコマンドwait_sync(VAR_ID_2,NODE_ID_3)を実行し、引数で指定されたノード(VAR_ID_2,NODE_ID_3)が存在しているため、このノード(VAR_ID_2,NODE_ID_3)へのエッジをチェックする。エッジは存在するため同期待ち状態に入る。
(5)タスクTask1が、第15行目で直接アクセス表現“a”に値「2」をセットし、次に第16行目のコマンドpost_sync(VAR_ID_1,NODE_ID_1)を実行する。対象ノード(VAR_ID_1,NODE_ID_1)は既に削除されて存在しないため、何も行わない。
(6)タスクTask1が、第17行目で、データcに対して、間接アクセス表現“*p”の値すなわちデータbの値をセットする。次に、第18行目のコマンドpost_sync(VAR_ID_3, NODE_ID_1)を実行する。対象ノード(VAR_ID_3, NODE_ID_1)は存在するため、そのノード(VAR_ID_3, NODE_ID_1)からのエッジを削除する。図53は、この変更を加えた第2依存関係情報113の例を示す。上述の図52に対し、ノード(VAR_ID_3, NODE_ID_1)とノード(VAR_ID_3, NODE_ID_2)とを接続するエッジが削除されているのが分かる(依存グラフ1303c”)。
(7)上述したコマンドwait_sync(VAR_ID_3,NODE_ID_2)に応じてポーリングしているタスクTask2は、図53に示した第2依存関係情報113を参照し、対象ノード(VAR_ID_3,NODE_ID_2)へのエッジが削除されたことを検知し、実行を開始する。
(8)タスクTask1が、第19行目のコマンドpost_sync(VAR_ID_1,NODE_ID_2)を実行する。対象ノード(VAR_ID_1,NODE_ID_2)は既に削除されて存在しないため、何も行わない。
(9)タスクTask1が、第20行目のコマンドpost_sync(VAR_ID_2,NODE_ID_1)を実行する。対象ノード(VAR_ID_2,NODE_ID_1)は存在するため、そのノード(VAR_ID_2,NODE_ID_1)からのエッジを削除する。図54は、この変更を加えた第2依存関係情報113の例を示す。上述の図53に対し、ノード(VAR_ID_2, NODE_ID_1)とノード(VAR_ID_2, NODE_ID_2)とを接続するエッジが削除されているのが分かる(依存グラフ1302b”−1)。タスクTask1は、実行を終了する。
(10)タスクTask2は、第24行目で直接アクセス表現“c”に対して値「3」をセットし、次に第25行目のコマンドwait_sync(VAR_ID_2,NODE_ID_2)を実行する。対象ノード(VAR_ID_2,NODE_ID_2)へのエッジは存在しないため、実行を継続する。
(11)タスクTask2は、第26行目で直接アクセス表現“b”に対して値「4」をセットし、次に第27行目のコマンドpost_sync(VAR_ID_2,NODE_ID_2)を実行する。対象ノード(VAR_ID_2,NODE_ID_2)は存在するため、そのノード(VAR_ID_2,NODE_ID_2)からのエッジを削除する。図55は、この変更を加えた第2依存関係情報113の例を示す。上述の図54に対し、ノード(VAR_ID_2, NODE_ID_2)とノード(VAR_ID_2, NODE_ID_3)とを接続するエッジが削除されているのが分かる(依存グラフ1302b”−2)。第28行目で直接アクセス表現“c”に対して値「5」をセットして、タスクTask2は、実行を終了する。
(12)上述したコマンドwait_sync(VAR_ID_2,NODE_ID_3)に応じてポーリングしているタスクTask3は、図55に示した第2依存関係情報113を参照し、対象ノード(VAR_ID_2,NODE_ID_3)へのエッジが削除されたことを検知し、実行を開始する。その後、タスクTask3は、第33行目〜第35行目のコードに従い、間接アクセス表現“*p”がアクセスするデータに対してデータtの値をセットし、直接アクセス表現“u”に対して、直接アクセス表現“v”の値と、値「3」とを加算した値をセットする。さらに、直接アクセス表現“v”の値に直接アクセス表現“s”の値と、値「5」とを加算した値をセットする。
このように、本第3の実施形態によれば、ランタイムライブラリ部1230は、並列プログラム116”の実行結果によってタスクの並列実行状況を変化させる。実行時に不確実アクセスノードの更新を行うことによって、図47の実行イメージでは、図51の実行イメージに比較してより多くの並列実行を行うことが可能となっている。なお、この例では示されていないが、並列プログラムによっては、間接アクセス表現のアクセス先を決定する動的なデータのタスク間の依存に対しても、同期を挿入する必要がある。
第3の実施形態の方法によれば、ランタイムライブラリ部1221が並列プログラム116”の依存関係情報を参照し、参照結果に応じて並列実行状況を操作することが可能となる。また、データのアクセス単位で依存関係の更新を行うことで、細かい粒度での並列実行管理が可能となる。
第3の実施形態による並列化システム1230の構成は、図37に示す構成に限定されず、他の様々な形態が考えられる。例えば、コード変換部1220の一部または全部がランタイムライブラリ部1221に含まれていてもよい。
また、プログラムコード111”、タスク境界情報110”、入力部101、解析部102および第1依存関係情報112、ならびに、これら各情報および各部で作成または使用される情報については、第1の実施形態で既に説明したのと同様の、様々なバリエーションが考えられる。
コード変換部1220とランタイムライブラリ部1221との間での第1依存関係情報112の受け渡し方法も、上述の第1依存関係情報ファイル1202を介して当該情報を受け渡す方法に限らず、様々な方法が考えられる。例えば、コード変換部1220に並列プログラム116”をバイナリコードに変換するバイナリ変換部を付加し、第1依存関係情報112を並列プログラム116”のバイナリコードに埋め込む方法が考えられる。また、第1依存関係情報112をファイルで受け渡す場合にも、通常のテキストファイルを用いたり、バイナリで表現するなど様々な方法が考えられる。
並列プログラム116”に対するインターフェイス部1210の挿入方法についても様々に考えられる。また、ランタイムライブラリ部1221で用意する機能やインターフェイス(API)も、様々に考えられる。例えば、本第3の実施形態では、第2依存関係情報113の更新や、同期の解消を行う処理は、並列プログラム116”にAPIを挿入することで実現したが、同様の処理を実現するプログラムコードを、並列プログラム116”に対して直接的に挿入してもよい。また、同期を取るためのAPIの挿入を変数毎に行わず、スレッド間の依存関係を満たせるように最低限挿入するなど、APIの挿入方法も様々に考えられる。コマンドvalid_node()およびコマンドinvalid_node()の2つのAPIを1つのAPIで実現してもよいし、例えば図44の第4行目、第5行目のように連続して挿入される同じAPIを、1つのAPIで実現することもできる。
これらのシステム全体もしくはシステムを構成している個々の機能ブロックをハードウェア実装してもよいし、ソフトウェア実装してもよいし、それらのハイブリッドでもよい。
上述したように、本第3の実施形態によれば、タスク境界情報を用いずにタスク境界に影響しない不確実アクセスノードも含めた全ての不確実アクセスノードの依存有無情報115を更新する場合と比較し、タスク境界エッジに接続される不確実アクセスノードに限定した依存有無情報の更新を行うことによって、ランタイムによる更新オーバヘッドを抑えることが可能となる。これにより、ランタイムオーバヘッドの削減が実現できる。また、実行時の最新情報を用いた依存関係情報の更新を行い、その情報を使用した解析を行うことによって、ある実行時点で最も適切であると判断される並列化を行うことが可能となる。
(第4の実施形態)
本第4の実施形態では、データアクセスの依存関係を示す依存関係情報を、逐次プログラムの動作中にランタイムライブラリが変更できるようにした。これにより、確実な依存関係を詳細に解析することができる。
図56は、本第4の実施形態による情報処理装置としての解析システム1240の一例の構成を示す。なお、図56において、上述した図37と共通する部分には同一の符号を付し、詳細な説明を省略する。
本第4の実施形態による解析システム1240の、上述した第3の実施形態による並列化システム1230に対する差異について、概略的に説明する。上述した第3の実施形態による並列化システム1230では、コード変換部1220が並列プログラム116”を出力するのに対して、本第4の実施形態によるコード変換部1220’は、プロファイルプログラム1700と呼ばれるプログラムコードを出力する。また、上述した第3の実施形態による並列化システム1230では、ランタイムライブラリ部1221が出力した第2依存関係情報113を、並列プログラム116”内のインターフェイス部1210に入力するのに対して、本第4の実施形態では、ランタイムライブラリ部1221’は、第2依存関係情報113を外部に出力し、プロファイルプログラム1700に戻さない。
より詳細には、本第4の実施形態による解析システム1240では、コード変換部1220’において、インターフェイス挿入部1500’は、入力部101からプログラムコード111Aを入力する。インターフェイス挿入部1500’は、このプログラムコード111Aを利用してインターフェイス部1210’を生成してプログラムコード111Aに挿入し、プロファイルプログラム1700を生成する。また、プロファイルプログラム1700内のインターフェイス部1210’は、第2依存関係情報113を入力しない。
ランタイムライブラリ部1221’は、第2依存関係情報113を外部に出力するための出力部1701を有する。出力部1701は、変換部1203から入力された第2依存関係情報113をランタイムライブラリ部1221’の外部(解析システム1240の外部)に出力する。なお、出力する第2依存関係情報113のデータ形式は特に限定されず、テキストデータ形式、バイナリデータ形式、画像データ形式、XML形式など、様々な形態であってよい。
インターフェイス挿入部1500’は、上述した第3の実施形態によるインターフェイス挿入部1500と同様に、提示情報114とプログラムコード111Aとを解析し、依存有無情報更新インターフェイスと、当該依存有無情報更新インターフェイスを挿入する位置を示す監視位置情報とを対応付ける関係情報を生成する。
図57は、本第4の実施形態によりインターフェイス挿入部1500で生成される関係情報1602’の一例を示す。関係情報1602’は、コマンドvalid_node()をプログラムコード111Aに挿入する位置を示す監視位置情報と、このコマンドに与える引数とを含む。引数は、コマンドが対象とするノードを特定するための識別子を含む。コマンドvalid_node()は、上述の第3の実施形態と同様に、実行時に引数で指定された不確実アクセスノードを確実アクセスノードに変更する変換情報を生成する。一方、本第4の実施形態では、上述の第3の実施形態と異なり、関係情報1602’に、引数で指定したノードを消去する変換情報を生成するコマンドinvalid_node()が含まれない。すなわち、第4の実施形態では、コマンドinvalid_node()を実行しない。これは、本第4の実施形態では、確実に発生した依存関係情報を収集することを目的としているためである。
インターフェイス挿入部1500’は、関係情報1602’を利用して作成したインターフェイス部1210’を、逐次プログラムであるプログラムコード111Aに挿入して、プロファイルプログラム1700を生成する。図58は、こうして生成されたプロファイルプログラム1700のプログラムコードの一例を示す。
なお、図58に例示するプロファイルプログラム1700は、上述した図39に示したプログラムコード111”に対して、インターフェイス部1210’を挿入した例である。図58のプロファイルプログラム1700において、第11行目および第12行目の間、ならびに、第14行目および第15行目の間にそれぞれタスク境界1800および1801が定義され、第1行目〜第11行目がタスクTask1、第12行目〜第14行目がタスクTask2、第15行目〜第17行目がタスクTask3とされている。
図58に例示されるように、図57の関係情報1602’に従い、コード“p=&a”の位置に、インターフェイス部1210’としてコマンドvalid_node(VAR_ID_1,NODE_ID_2)およびvalid_node(VAR_ID_1,NODE_ID_3)が挿入され、コード“p=&b”の位置に、インターフェイス部1210’としてコマンドvalid_node(VAR_ID_2,NODE_ID_1)およびvalid_node(VAR_ID_2,NODE_ID_3)が挿入されて、プロファイルプログラム1700が生成される。
なお、本第4の実施形態では、ポインタ変数pへの代入のみを監視するインターフェイス挿入例について説明したが、これはこの例に限定されず、その他のポインタ変数pへのアクセスを監視してもよい。例えば、図58の第11行目にコード“c=*p”として記述される、ポインタ変数pへのアクセスを監視してもよい。
プロファイルプログラム1700が図58に示すプログラムコードを持つ場合、当該プロファイルプログラム1700の実行によって変更される前の第1依存関係情報112は、図41を用いて説明したものとなる。図59は、プロファイルプログラム1700が実行されて出力される第2依存関係情報113の例を示す。第1依存関係情報112において、データa、データbおよびデータcそれぞれについて依存関係が解析され、依存グラフ1901a、1902bおよび1903cが得られている。なお、図59は、図58で示したプロファイルプログラム1700におけるif文の判定結果が真になった場合の例を示す。
図58に示すプロファイルプログラム1700において、インターフェイス部1210’を構成するコマンドvalid_node(VAR_ID_1,NODE_ID_2)とvalid_node(VAR_ID_1,NODE_ID_3)とが実行され、識別子(VAR_ID_1,NODE_ID_2)で識別される不確実アクセスノードと、識別子(VAR_ID_1,NODE_ID_3)で識別される不確実アクセスノードとが確実アクセスノードに変更される。なお、コマンドvalid_node()は、引数で指定されているノードが既に確実アクセスノードに変更されている場合は、何も処理を行わない。
上述した第3の実施形態では、インターフェイス挿入部1500が並列プログラム116Aを解析して関係情報を生成し挿入するように説明したが、本第4の実施形態のように、逐次プログラムによるプログラムコードに対して解析および関係情報の生成、挿入を行ってもよい。
上述したように、本第4の実施形態によれば、タスク境界情報を用いずにタスク境界に影響しない不確実アクセスノードも含めた全ての不確実アクセスノードの依存有無情報を更新する場合と比較し、タスク境界エッジに接続される不確実アクセスノードに限定した依存有無情報の更新を行うことによって、ランタイムによる更新オーバヘッドを抑えることが可能となる。これにより、ランタイムオーバヘッドの削減が実現できる。
また、プログラムの最適化を、実行時の情報を反映させた依存関係情報を用いて行うことによって、より高い性能のプログラムを作成することが可能となる。例えば、第1の実施形態の並列化装置10の第1依存関係情報112として、本第4の実施形態による解析システム1240の出力部1701が出力する第2依存関係情報113を利用することが可能である。これにより、実行時の情報を反映させ不確実アクセスノードを確実アクセスノードにし、提示情報114を削減することができ、それに伴い依存有無情報の削減も期待できる。その結果、少ない作業で第1依存関係情報を第2依存関係情報に変換できるようになる。
次に、上述した第1、第2、第3および第4の実施形態に共通して適用可能な構成について、図60を用いて説明する。図60に例示されるように、第1、第2および第3の実施形態による情報処理装置は、例えば一般的なコンピュータにより実現可能である。
図60において、バス30に対してCPU18、RAM(Random Access Memory)11、ROM(Read Only Memory)12、表示制御部13および通信I/F(インターフェイス)14が接続される。また、バス30に対して、ハードディスクドライブ(HDD)15、ドライブ装置16および入力I/F17が接続される。
CPU18は、ROM12やHDD15に記憶されるプログラムに従い、RAM11をワークメモリとして用いて、このコンピュータの全体を制御する。表示制御部13は、CPU18により生成された表示制御信号を、表示装置24が表示可能な信号に変換して出力する。
HDD15は、上述のCPU18が実行するためのプログラムや、プログラムによって用いられるデータなどが格納される。ドライブ装置16は、脱着可能な記録媒体21が装填可能とされ、当該記録媒体21に対するデータの読み書きを行うことができる。ドライブ装置16が対応可能な記録媒体21としては、CD(Compact Disk)、DVD(Digital Versatile Disk)、フレキシブルディスクといったディスク記録媒体や、読み書き可能で不揮発性の半導体メモリが考えられる。
入力I/F17は、外部からのデータの入力を行う。例えば、入力I/F17は、USB(Universal Serial Bus)やIEEE1394(Institute of Electrical and Electronics Engineers 1394)といった所定のインターフェイスを有し、このインターフェイスにより外部の機器からのデータ入力を行う。また、入力I/F17に対して、キーボード22やマウス23といった入力デバイスが接続される。ユーザは、例えば表示装置24に対する表示に応じてこれら入力デバイスを操作することで、このコンピュータに対して指示を出すことができる。
通信I/F14は、所定のプロトコルを用いて外部の通信ネットワークと通信を行う。
第1の実施形態による並列化装置10を構成する各機能ブロック、第2の実施形態による同期最適化装置20を構成する各機能ブロック、第3の実施形態における並列化システム1230を構成する各機能ブロック、ならびに、第4の実施形態における解析システム1240を構成する各機能ブロックは、CPU18上で動作するプログラムによって実現される。これら各実施形態を実行するためのプログラムは、インストール可能な形式又は実行可能な形式のファイルでCD−ROM、フレキシブルディスク、DVDなどのコンピュータで読み取り可能な記録媒体に記録して提供される。これに限らず、プログラム並列化システムを実行するためのプログラムを、ROM12に予め記憶させて提供してもよい。
さらに、各実施形態を実行するためのプログラムを、インターネットなどのネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、本実施形態に係るプログラム並列化システムを実行するためのプログラムを、インターネットなどのネットワーク経由で提供または配布するように構成してもよい。
各実施形態を実行するためのプログラムは、上述した各部(第1の実施形態の例では、入力部101、解析部102、生成部103、指示部104、変換部105および並列化部106)を含むモジュール構成となっており、実際のハードウェアとしては、CPU18が例えばHDD15から当該プログラムを読み出して実行することにより上述の各部がRAM11上にロードされ、各部がRAM11上に生成されるようになっている。
なお、上述では、各実施形態において、実施形態による装置またはシステムを構成する各機能ブロックが1つのコンピュータ上で動作するように説明したが、これはこの例に限られない。例えば、各機能ブロックのうち1または複数がそれぞれ異なるコンピュータ上で動作するようにしてもよい。この場合、各機能ブロック間でのデータのやりとりは、記録媒体21やネットワークを介して行うことができる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
10 並列化装置
20 同期最適化装置
101,5001 入力部
102,5002 解析部
103,5003 生成部
104,1204,5004 指示部
105,1203,5005 変換部
106,106’ 並列化部
107 変換情報
110,110’,110A タスク境界情報
111,111’,111A プログラムコード
112 第1依存関係情報
113 第2依存関係情報
114 提示情報
115 依存有無情報
116,116’,116”,116A 並列プログラム
1210,1210’ インターフェイス部
1220,1220’ コード変換部
1221,1221’ ランタイムライブラリ部
1230 並列化システム
1240 解析システム
1500,1500’ インターフェイス挿入部
1501 情報生成部
1600 同期インターフェイス挿入部
1601 依存有無情報更新インターフェイス挿入部
1602,1602’ 関係情報
1603 関係情報生成部
1610 同期インターフェイス部
1611 依存有無情報更新インターフェイス部
1700 プロファイルプログラム
1701 出力部
5006 再配置部

Claims (8)

  1. 複数のタスクのタスク境界を示す情報と、1のデータに対するデータアクセスに対応するN個(Nは1以上の整数)のノードと該ノード間のデータアクセスの順序制約を表現する第1の依存関係を示すエッジとを含み、該ノードのうち少なくとも1のノードは対応するデータアクセスが確実か不確実かを示すアクセス確実性フラグを持つ第1依存関係情報とを入力する入力部と、
    前記第1依存関係情報に基づき、前記タスク境界を跨ぐエッジのうち、データアクセスが不確実なノードである不確実アクセスノードを少なくとも一方に接続しているタスク境界エッジを特定し、該タスク境界エッジに接続される少なくとも1の該不確実アクセスノードを示す提示情報を生成する生成部と、
    前記1のデータに対応するデータアクセスの依存関係の有無を示す依存有無情報を入力して、前記不確実アクセスノードに対して、該依存有無情報に従い、該不確実アクセスノードへのデータアクセスが無いことを示す情報を含む変換情報を出力する指示部と、
    前記変換情報に従い、前記第1依存関係情報を、前記1のデータに対するデータアクセスに対応するM(0≦M≦N)個のノードと、該ノード間の第2の依存関係を示すエッジとを含む第2依存関係情報に変換する変換部と
    を備える
    ことを特徴とする情報処理装置。
  2. 前記生成部は、
    少なくとも1のノードをさらに特定し、特定した該ノードが、前記第1依存関係情報に含まれる各ノードから前記タスク境界エッジへの少なくとも1の経路上に存在するか否かに応じて、該各ノードの前記提示情報を生成する
    ことを特徴とする請求項1に記載の情報処理装置。
  3. 前記生成部は、
    前記タスク境界エッジに隣接するタスクの方向に対して、タスク境界までの距離が最小となり、且つ、確実を示すアクセス確実性フラグを持つ書き込みノードを特定する
    ことを特徴とする請求項2に記載の情報処理装置。
  4. 前記生成部は、さらに、前記変換情報を前記提示情報に反映させ、
    前記指示部は、入力された前記依存有無情報に応じて前記変換情報を更新する
    ことを特徴とする請求項1に記載の情報処理装置。
  5. プログラムコードと前記タスク境界情報とを入力する入力部と、
    前記プログラムコードを解析して前記第1依存関係情報を出力する解析部と、
    前記プログラムコードから並列プログラムを生成する並列化部と
    をさらに備え、
    前記解析部は、
    前記プログラムコードに記述される、前記1のデータにアクセスする可能性があると判定された前記データアクセスに対応するノードが入力され得る少なくとも1の外部入力値が該1のデータにアクセスすると見做せる場合に、前記アクセス確実性フラグを前記確実に設定し、該外部入力値が該1のデータにアクセスすると見做せない場合に、前記アクセス確実性フラグを前記不確実に設定して前記第1依存関係情報を出力し、
    前記並列化部は、
    前記タスク境界に従い前記プログラムコードの処理を並列実行単位に分割し、前記第2依存関係情報に含まれるエッジのうち前記タスク境界エッジを用いて該並列実行単位に対して同期を挿入して前記並列プログラムを生成する
    ことを特徴とする請求項1に記載の情報処理装置。
  6. プログラムコードと前記タスク境界情報とを入力する入力部と、
    前記プログラムコードを解析して前記第1依存関係情報を出力する解析部と、
    前記提示情報と、前記プログラムコードと等価なデータアクセスを行う等価アクセスプログラムコードとを解析して関係情報を生成する関係情報生成部と、
    前記関係情報を入力し、前記依存有無情報を出力する監視部と
    をさらに備え、
    前記解析部は、
    前記プログラムコードに記述される、前記1のデータにアクセスする可能性があると判定された前記データアクセスに対応するノードが入力され得る少なくとも1の外部入力値が該1のデータにアクセスすると見做せる場合に、前記アクセス確実性フラグを前記確実に設定し、該外部入力値が該1のデータにアクセスすると見做せない場合に、前記アクセス確実性フラグを前記不確実に設定して前記第1依存関係情報を出力し、
    前記関係情報生成部は、
    前記提示情報に含まれる不確実アクセスノードと、該不確実アクセスノードのアクセスの有無を決定する前記等価アクセスプログラムコード中のデータアクセスとの、アクセスの有無に関する対応関係を示す前記関係情報を生成し、
    前記監視部は、
    前記等価アクセスプログラムコード実行中に、前記関係情報に基づいて、不確実アクセスノードのアクセスの有無を決定するデータアクセスを監視し、該データアクセスの監視結果に基づき前記依存有無情報を生成する
    ことを特徴とする請求項1に記載の情報処理装置。
  7. 前記タスク境界情報は、
    前記第1依存関係情報が示す前記第1の依存関係をタスクに分割したときに、接続しているノードが異なるタスクに属するエッジであるタスク境界エッジを特定するタスク境界を示す情報を含む
    ことを特徴とする請求項1に記載の情報処理装置。
  8. 複数のタスクのタスク境界を示す情報と、1のデータに対するデータアクセスに対応するN個(Nは1以上の整数)のノードと該ノード間のデータアクセスの順序制約を表現する第1の依存関係を示すエッジとを含み、該ノードのうち少なくとも1のノードは対応するデータアクセスが確実か不確実かを示すアクセス確実性フラグを持つ第1依存関係情報とを入力する入力ステップと、
    前記第1依存関係情報に基づき、前記タスク境界を跨ぐエッジのうち、データアクセスが不確実なノードである不確実アクセスノードを少なくとも一方に接続しているタスク境界エッジを特定し、該タスク境界エッジに接続される少なくとも1の該不確実アクセスノードを示す提示情報を生成する生成ステップと、
    前記1のデータに対応するデータアクセスの依存関係の有無を示す依存有無情報を入力して、前記不確実アクセスノードに対して、該依存有無情報に従い、該不確実アクセスノードへのデータアクセスが無いことを示す情報を含む変換情報を出力する指示ステップと、
    前記変換情報に従い、前記第1依存関係情報を、前記1のデータに対するデータアクセスに対応するM(0≦M≦N)個のノードと、該ノード間の第2の依存関係を示すエッジとを含む第2依存関係情報に変換する変換ステップと
    をコンピュータに実行させるためのプログラム。
JP2011004159A 2011-01-12 2011-01-12 情報処理装置およびプログラム Expired - Fee Related JP5178852B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2011004159A JP5178852B2 (ja) 2011-01-12 2011-01-12 情報処理装置およびプログラム
US13/347,416 US9043803B2 (en) 2011-01-12 2012-01-10 Converting dependency relationship information representing task border edges to generate a parallel program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2011004159A JP5178852B2 (ja) 2011-01-12 2011-01-12 情報処理装置およびプログラム

Publications (2)

Publication Number Publication Date
JP2012146137A JP2012146137A (ja) 2012-08-02
JP5178852B2 true JP5178852B2 (ja) 2013-04-10

Family

ID=46456237

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2011004159A Expired - Fee Related JP5178852B2 (ja) 2011-01-12 2011-01-12 情報処理装置およびプログラム

Country Status (2)

Country Link
US (1) US9043803B2 (ja)
JP (1) JP5178852B2 (ja)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012037735A1 (en) * 2010-09-26 2012-03-29 Mediatek Singapore Pte. Ltd. Method for performing video processing based upon a plurality of commands, and associated video processing circuit
JP2013171459A (ja) * 2012-02-21 2013-09-02 Toshiba Corp プログラム解析装置、プログラム解析方法および記録媒体
US9037705B2 (en) * 2012-11-28 2015-05-19 Ca, Inc. Routing of performance data to dependent calculators
EP3343351B1 (en) * 2016-12-28 2023-04-26 Waseda University Parallel program generating method and parallelization compiling apparatus
US10656964B2 (en) * 2017-05-16 2020-05-19 Oracle International Corporation Dynamic parallelization of a calculation process
CN111581207B (zh) * 2020-04-13 2023-12-29 深圳市云智融科技有限公司 Azkaban项目的文件生成方法、装置及终端设备
JP2023084609A (ja) * 2021-12-07 2023-06-19 富士通株式会社 変換プログラムおよび変換方法

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3938387B2 (ja) * 2005-08-10 2007-06-27 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイラ、制御方法、およびコンパイラ・プログラム
US7970872B2 (en) * 2007-10-01 2011-06-28 Accenture Global Services Limited Infrastructure for parallel programming of clusters of machines
JP2009129179A (ja) * 2007-11-22 2009-06-11 Toshiba Corp プログラム並列化支援装置およびプログラム並列化支援方法
JP5036523B2 (ja) * 2007-12-21 2012-09-26 三菱電機株式会社 プログラム並列化装置

Also Published As

Publication number Publication date
US20120180067A1 (en) 2012-07-12
JP2012146137A (ja) 2012-08-02
US9043803B2 (en) 2015-05-26

Similar Documents

Publication Publication Date Title
JP5178852B2 (ja) 情報処理装置およびプログラム
US8464214B2 (en) Apparatus, method and system for building software by composition
JP5989097B2 (ja) 高度並行処理タスクの登録及び実行
US9152389B2 (en) Trace generating unit, system, and program of the same
US11675575B2 (en) Checking source code validity at time of code update
US9740505B2 (en) Accurate static dependency analysis via execution-context type prediction
US20130283250A1 (en) Thread Specific Compiler Generated Customization of Runtime Support for Application Programming Interfaces
CN105849698B (zh) 动态编程中的执行防护
WO2013105158A1 (ja) データ依存解析支援装置、データ依存解析支援プログラム、及びデータ依存解析支援方法
US20200310766A1 (en) Generating vectorized control flow using reconverging control flow graphs
Hobor et al. Barriers in concurrent separation logic: now with tool support!
Thoman et al. Sylkan: towards a Vulkan compute target platform for SYCL
US20210182041A1 (en) Method and apparatus for enabling autonomous acceleration of dataflow ai applications
US10776255B1 (en) Automatic verification of optimization of high level constructs using test vectors
US20160371066A1 (en) Computer that performs compiling, compiling method and storage medium that stores compiler program
US9720660B2 (en) Binary interface instrumentation
Anand et al. Synthesizing and verifying multicore parallelism in categories of nested code graphs
US20230176851A1 (en) Computer-readable recording medium storing conversion program and conversion method
WO2011090032A1 (ja) 並列処理プログラム生成方法、並列処理プログラム生成プログラム、及び並列処理プログラム生成装置
JP5033745B2 (ja) ジョブ管理システム及びジョブ管理方法
Diaz et al. Reachability analysis of dynamic pushdown networks with priorities
Desaulniers Emscripten and webgl
Almghawish et al. An automatic parallelizing model for sequential code using Python
Dan Program Analysis for Weak Memory Models
Moreews et al. Seamless coarse grained parallelism integration in intensive bioinformatics workflows

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20121211

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20121218

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130108

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20160118

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees