JP2009163662A - 情報処理装置、情報処理装置の制御方法、および情報処理装置の制御プログラム - Google Patents

情報処理装置、情報処理装置の制御方法、および情報処理装置の制御プログラム Download PDF

Info

Publication number
JP2009163662A
JP2009163662A JP2008002951A JP2008002951A JP2009163662A JP 2009163662 A JP2009163662 A JP 2009163662A JP 2008002951 A JP2008002951 A JP 2008002951A JP 2008002951 A JP2008002951 A JP 2008002951A JP 2009163662 A JP2009163662 A JP 2009163662A
Authority
JP
Japan
Prior art keywords
dependency graph
node
data node
dependency
graph
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.)
Pending
Application number
JP2008002951A
Other languages
English (en)
Inventor
Satoshi Shirai
智 白井
Osamu Torii
修 鳥井
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 JP2008002951A priority Critical patent/JP2009163662A/ja
Publication of JP2009163662A publication Critical patent/JP2009163662A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】プログラムの実行時における動的な指標を使用することなく、並列計算機によって効率的に並列処理可能なプログラムへ修正するための、修正箇所をプログラマへ提示することができる。
【解決手段】本発明の情報処理装置10は、プログラムのソースコード100から、1つ以上の入力データノードと1つの出力データノードとを有する依存グラフを作成する手段2と、依存グラフの1つ以上の入力データノードから、1つの出力データノードまでのパスごとにパス長を算出する手段4と、算出手段によって算出されたパス長の分散を算出する手段4とを備えることを特徴とする。
【選択図】 図1

Description

本発明は、情報処理装置、情報処理装置の制御方法、および情報処理装置の制御プログラムに関するものである。
近年、複数のプロセッサが並列に演算処理を行う並列計算機は、演算処理能力の高さから、良く用いられている。しかし、この並列計算機によって効率的に並列処理可能なプログラムを、プログラマが記述するのは一般的に困難である。そこで、並列計算機による並列処理を考慮することなく記述されたプログラムを、並列計算機によって効率的に並列処理可能なプログラム(以下、並列度の高いプログラムと呼ぶ。)へ修正することが行われている(例えば、特許文献1。)。
上記特許文献1に開示されている技術では、プログラムを実際の動作環境で実行させて、実行時における動的な指標(トレース結果)に従い、プログラムのボトルネック部分を提示する。プログラマは、提示されたボトルネック部分のプログラムのソースコードを修正することによって、効率的に、並列度の高いプログラムへ改良することができる。
特開平6−83608号公報
上記特許文献1に開示されている技術では、プログラムを実際の動作環境で実行させて、実行時における動的な指標(トレース結果)に従い、プログラムのボトルネック部分を提示する。
しかし、プログラムを実際の動作環境で実行させた際の動的な指標に従ってプログラムのボトルネック部分を提示するため、プログラムを実行可能な状態とする必要があり、プログラマの負担が大きいという問題がある。さらに、実際の利用を反映した入力データセットを用意する必要があり、コストが増大するという問題がある。
本発明は、上記問題点を解決するためになされたものであって、プログラムの実行時における動的な指標を使用することなく、並列度の高いプログラムへ修正するための、修正箇所を提示することができる情報処理装置、情報処理装置の制御方法、および情報処理装置の制御プログラムを提供することを目的とする。
上記目的を達成するために、本発明の実施形態に係る情報処理装置は、プログラムのソースコードを記憶する記憶手段と、前記記憶手段から前記ソースコードを読み出す読出手段と、前記ソースコードから、前記ソースコードに含まれる複数の要素のそれぞれをノードとし、ノード間を枝で接続することによって依存関係を示す依存グラフを作成する作成手段と、前記依存グラフの一部であって、データ入力を意味する要素のノードである入力データノードと、データ出力を意味する要素のノードである出力データノードとを含む部分依存グラフを、前記依存グラフから抽出する抽出手段と、前記部分依存グラフについて、前記入力データノードから前記出力データノードまでのパスごとにパス長を算出する第1の算出手段と、前記部分依存グラフに含まれるパスのパス長のちらばり度を算出する第2の算出手段とを備えることを特徴とする。
本発明によれば、プログラムの実行時における動的な指標を使用することなく、並列計算機によって効率的に並列処理可能なプログラムへ修正するための、修正箇所をプログラマへ提示することができる。
以下、本発明の実施形態について説明する。
(実施形態)
図1は、本発明の実施形態に係る情報処理装置10を示すブロック図である。
本実施形態に係る情報処理装置10は、依存グラフ作成部2と、抽出部3と、分散算出部4と、順序付部5と、出力部6とを備える。情報処理装置10の入力は、プログラムのソースコードである。情報処理装置10の出力は、入力されたプログラムのソースコード100を並列度の高いプログラムのソースコードへ修正する際に、プログラマが修正することによって潜在的に性能(並列度)向上の余地が大きい領域を示す情報である。
依存グラフ作成部2は、入力されたプログラムのソースコードから、依存グラフを作成する。依存グラフ作成部2は、作成した依存グラフを抽出部3へ出力する。なお、依存グラフとは、プログラムのソースコードに含まれる各要素が、データノードあるいはプロセスノードとされ、データノードとプロセスノードとを交互に接続して作成される有向非循環グラフである。
抽出部3は、入力された依存グラフを、潜在的な性能向上の余地を算出する際の処理単位である部分依存グラフへ抽出する。抽出部3は、部分依存グラフを、分散算出部4へ出力する。
分散算出部4は、入力された部分依存グラフについて、潜在的な性能向上の余地を算出する。分散算出部4は、潜在的な性能向上の余地の算出が終了した後、抽出部3へ新たな部分依存グラフを出力させるための信号を送信する。分散算出部4は、部分依存グラフごとの潜在的な性能向上の余地の算出結果を、順序付部5へ出力する。
順序付部5は、部分依存グラフごとの潜在的な性能向上の余地の算出結果の中で、潜在的な性能向上の余地が大きい順に、部分依存グラフの順序付けを行う。順序付部5は、潜在的な性能向上の余地が大きい順に、各部分依存グラフに対応する領域のプログラムのソースコードを示す情報を、出力部6へ出力する。
出力部6は、ディスプレイ、プリンタなどであり、潜在的な性能向上の余地が大きい順に、各部分依存グラフと対応する領域のプログラムのソースコードを示す情報を表示する。
図2は、情報処理装置10に入力されるプログラムのソースコード100の一例を示す図である。
このプログラムのトップレベルは、“output=abs(input)”(図2に示すソースコードの4行目)である。このプログラムトップレベルは、入力値が“input”であり、出力値が“output”であり、関数が“abs”である。
関数“abs”の本体は、図2に示すソースコードの1〜3行目である。“|a|−>|b|”は、関数“abs”の入力が“a”であり、関数“abs”の出力が“b”であることを示す。
“if(a>0)then{b=a}else{b=−a}”は、“a”が0より大きければ“a”を“b”へ代入し、それ以外では“−a”を“b”へ代入することを示す。
情報処理装置10に入力されるプログラムは、以下の4つの要件、すなわちプログラムのソースコードから依存グラフを作成可能であるための要件(依存性抽出可能要件)を満足するものである。1つ目の要件は、一度変数に代入された値はその後変わることがない性質(静的単一代入の性質)を持つことである。2つ目の要件は、関数を呼び出す際に同一の値が引数として入力されたときには、同一の値を出力すること(関数の呼び出しに副作用がないこと)である。3つ目の要件は、ある変数の値が自分自身の変数の値に依存しないこと(値の依存関係に循環が無いこと)である。4つ目の要件は、関数の再帰呼び出しがないことである。なお、上記4つの要件を満足するプログラムは、有限な有向非巡回グラフとなる依存グラフで記述することができる。
上記4つの要件を満足するプログラム言語の構文の一例を擬似BNF機能で示す。
・プログラムトップレベル:=(代入式|関数定義)の列
・関数定義:=関数名=本体
・本体:=“{“入出力リスト 文の列”}”
・入出力リスト:=“|“コンマ区切りの変数名列”|−>|“コンマ区切の変数名列”|”
・文:=代入式|IF文|関数定義
・IF文:=“IF(“式”)then{“文の列”}else{“文の列”}”
・代入式:=コンマ区切りの変数名列=式
・式:=値|関数呼びだし|変数名
・関数呼び出し:=関数名“(“コンマ区切りの変数名”)”
値は、数値リテラルあるいは真偽値リテラルである。変数名および関数名は、任意の識別子とする。例えば、加算“+”や減算“―”、比較“>”などの二項演算子は、2つの入力を持つ関数呼び出しである。
ここでは、プログラムに含まれる要素は、式とIF文である。
情報装置に入力されるプログラムのソースコード100が、上記4つの要件を満足する言語モデルで記述されていない場合であっても、プログラムの特定の領域が局所的に上記4つの要件を満足していれば、当該プログラムの特定の領域のみを、情報処理装置10に入力することによって、潜在的な並列度が算出できる。例えば、プログラミング言語Cで作成されたプログラムは、一般に、静的単一代入の性質を持たないが、静的単一代入の最適化(SSA(static single assignment)最適化)手法によって、静的単一代入の性質を満足するプログラムのソースコード100を作成することができる。
図3は、依存グラフ作成部2が、図2に示されるプログラムのソースコード100をから、作成した依存グラフ200、210の一例を示す図である。
依存グラフとは、データとプロセスとをノードとして、データノードとプロセスノードとを交互に接続して作成される有向非循環グラフである。依存グラフは、プログラムのソースコード100に指定される処理が、どのようなデータおよびプロセスから構成されているかを示すものである。プログラムソースコードに含まれる要素のそれぞれが、データノード、あるいはプロセスノードとされる。なお、プログラム全体を表現する依存グラフは、1つのプログラムトップレベルを表現した依存グラフと、1つ以上の関数などの依存グラフとの集合から構成される。
まず、依存グラフを構成するデータノード、プロセスノード、およびエッジ(枝)について説明する。
図3では、データノードおよびプロセスノードはエッジ(図中では矢印で示される)により接続される。エッジによって接続されるノードであって、エッジの根元側のノードを親ノードと呼び、エッジの先端側のノードを子ノードと呼ぶ。
プロセスノードは、ある処理を持つ。プロセスノードは、1つ以上の親プロセスノードと、1つ以上の子プロセスノードとを持つ。プロセスノードの親データノードは、プロセスを実行するのに必要なデータを示す。プロセスノードの子データノードは、プロセスの実行結果を示す。
例えば、プロセスノードは、加算プロセスノードや、減算プロセスノード、代入プロセスノード、IFプロセスノードであっても良く、再帰的に依存グラフで定義されていても良い。
例えば、加算プロセスノードは、2つの親データノードをもち、1つの子データノードを持つ。加算プロセスノードは、2つの親データノードが持つ値を加算し、その加算結果を子データノードへ与える。
代入プロセスノードは、1つの親データノードを持ち、1つの子データノードを持つ。代入プロセスノードは、親データノードが持つ値を、子データノードへ与える。
IFプロセスノードは、条件分岐を示し、3つの親データノードを持ち、1つの子データノードを持つ。IFプロセスノードの3つの親データノードは、それぞれ、条件を示す条件データノード、条件が真のときの値を示す真データノード、条件が偽のときの値を示す偽データノードである。IFプロセスノードは、条件が真のときに真データノードの値を子データノードへ与え、条件が偽のときに偽データノードの値を子データノードへ与える。
再帰的に依存グラフで定義された再帰的プロセスノードは、親データノードの値を、再帰的に定義された依存グラフの入力データノードとする。再帰的に依存グラフで定義された再帰的プロセスノードは、再帰的に定義された依存グラフの出力データノードの値を、子データノードへ与える。
データノードは、ある値を持つ。データノードは、親プロセスノードを持たないか、1つの親プロセスノードを持つ。データノードは、子プロセスノードを持たないか、1つ以上の子プロセスノードを持つ。親プロセスノードを持たないデータノードを入力データノードと呼び、子プロセスノードを持たないデータノードを出力データノードと呼ぶ。
データノードの親プロセスノードは、データノードが持つ値が決定されるために必要なプロセスを示す。データノードの子プロセスノードは、データノードが持つ値を使用して行われるプロセスを示す。
依存グラフに含まれる入力データノードのすべてに値が与えられれば、依存グラフによって示される処理はすべて実行可能となる。なお、依存グラフが有向非巡回グラフであるため、一度データノードに与えられた値は変化しない。
次に、図3に示す依存グラフ200、210について説明する。図3は、図2に示すプログラムのソースコード100のプログラムトップレベルの依存グラフ200と、トップレベルに含まれる関数“abs”の依存グラフ210を示す。
プログラムトップレベルの依存グラフ210は、入力データノード“input”211と、プロセスノード“abs”212と、出力データノード“output”213からなる。プロセスノード“abs”212は、同じく図3に示される関数“abs”の依存グラフ210によって定義される。
関数“abs”の依存グラフ210は、入力データノード“0”211、213と、入力データノード“a”212と、減算プロセスノード214と、代入プロセスノード215と、比較プロセスノード216と、条件データノード219と、真データノード218と、偽データノード217と、IFプロセスノード220からなる。
減算プロセスノード214は、入力データノード“0”211の値“0”から、入力データノード“a”212の値“a”を減算し、減算結果“−a”を偽データノード217へ与える。
代入プロセスノード215は、入力データノード“a”212の値“a”を真データノード218へ与える。
比較プロセスノード216は、入力データノード“a”212の値“a”と、入力データノード“0”213の値“0”を比較し、“a>0”であれば“真”を、“a≦0”であれば“偽”を、条件データノード219へ与える。
IFプロセスノード220は、比較プロセスノード216から“真”が与えられれば、真データノード218の持つ値“a”を、出力データノード“b”221へ与える。一方、IFプロセスノード220は、比較プロセスノード216から“偽”が与えられれば、偽データノード217の持つ値“−a”を、出力データノード“b”221へ与える。
図4は、依存グラフ作成部2がプログラムのソースコード100から依存グラフ200、210を作成する際の動作を示すフローチャートである。
まず、依存グラフ作成部2は、図2に示すプログラムのソースコード100の構文解析を行い、構文木300を作成する(ステップS101)。
次に、依存グラフ作成部2は、作成した構文木300をもとに、関数表400を作成する(ステップS102)。
次に、依存グラフ作成部2は、作成した関数表400をもとに、依存グラフ200、210を作成する(ステップS103)。
図5は、依存グラフ作成部2が、図2に示すプログラムのソースコード100をもとに作成する構文木300の一例である。なお、本実施形態では、プログラムのソースコードをもとに構文木を作成する方法については、特に限定するものではない。
プログラムトップレベル301は、代入式302と関数定義303から構成される。プログラムトップレベル301を構成する代入式302は、右辺の関数呼び出し304の戻り値を、左辺“output”へ代入する。プログラムトップレベル301を構成する代入式302の右辺である関数呼び出し304は、“input”を引数として、関数“abs”を呼び出す。
プログラムトップレベル301を構成する関数定義303は、関数名“abs”の関数を、関数本体305によって定義される。関数本体305は、入力“a”と、出力“b”と、IF文306とから構成される。
関数本体305を構成するIF文306は、条件式である関数呼び出し307と、真(then節)の文である代入式308と、偽(else節)の文である代入式309とから構成される。
IF文306の条件式である関数呼び出し307は、“a”を引数1とし、“0”を引数2とする関数“>”である。なお、関数“>”は、引数1“a”よりも引数2“0”が大きい場合に“真”を出力し、引数1“a”が引数2“0”以下である場合に“偽”を出力する。
真(then節)の文である代入式308は、右辺“a”を左辺“b”へ代入する。
偽(else節)の文である代入式309は、右辺の関数呼び出し310の戻り値を、左辺“b”へ代入する。偽(else節)の文である代入式308の右辺である関数呼び出し310は、“0”を引数1とし、“a”を引数2とする関数“−”である。なお、関数“−”は、引数1“0”から引数2“a”を減算して、その減算結果を出力する関数である。
図6は、依存グラフ作成部2が、図5に示す構文木をもとに作成する関数表の一例である。なお、本実施形態では、構文木をもとに関数表を作成する方法については、特に限定するものではない。
図7は、依存グラフ作成部2が、構文木をもとに関数表を作成する際の動作を示すフローチャートである。図7(a)は、構文木300をもとに関数表400を作成する際の、依存グラフ作成部2の初期動作を示すフローチャートである。
まず、依存グラフ作成部2は、関数名と関数の内容とを対応させて記憶するための領域、即ち空の関数表を作成する(ステップS201)。
次に、依存グラフ作成部2は、プログラムトップレベル301を、関数表へ登録処理中の関数(以下、カレント関数と呼ぶ)とする(ステップS202)。
次に、依存グラフ作成部2は、カレント関数を関数表へ登録するためのルーチン(以下、登録ルーチン)を呼び出す(ステップS203)。なお、登録ルーチンの処理が終了すると、依存グラフ作成部2による関数表作成処理は終了する。
図7(b)は、依存グラフ作成部2が登録ルーチンを呼び出し実行する際の動作を示すフローチャートである。
ここで、ステップS203において、プログラムトップレベル301をカレント関数として登録ルーチンを呼び出した際の依存グラフ作成部2の動作を説明する。
まず、依存グラフ作成部2は、カレント関数の関数名と関数の中身とを、関数表に登録する(第1登録ルーチンのステップS301)。カレント関数の関数名はプログラムトップレベル301であり、カレント関数の中身はプログラムトップレベル301を構成する代入式308、およびその代入式308より下の階層にある変数“output”、関数呼び出し310、関数名“abs”、引数1“input”である。依存グラフ作成部2は、空の関数表に、関数名“プログラムトップレベル301”および関数の中身“output=abs(input)”を登録する(図6に示す関数表の1行目)。
次に、依存グラフ作成部2は、カレント関数に関数定義303が含まれるか否かを判定する(第1登録ルーチンのステップS302)。
カレント関数に関数定義303が含まれない場合は、依存グラフ作成部2は、呼び出し元へ戻る(第1登録ルーチンのステップS307)。
一方、カレント関数に関数定義303が含まれる場合は、依存グラフ作成部2は、カレント関数に含まれる関数定義303を取得する(第1登録ルーチンのステップS303)。即ち、依存グラフ作成部2は、プログラムトップレベル301に含まれる関数定義303(関数名“abs”)を取得する。なお、カレント関数に複数の関数定義303が含まれる場合は、すべての関数定義303を取得する。
次に、依存グラフ作成部2は、取得した関数定義303のうちの1つをカレント関数とする(第1登録ルーチンのステップS304)。即ち、依存グラフ作成部2は、関数定義303(関数名“abs”)をカレント関数とする。
次に、依存グラフ作成部2は、第2登録ルーチンを呼び出す(第1登録ルーチンのステップS305)。即ち、依存グラフ作成部2は、関数定義303(関数名“abs”)をカレント関数として、登録ルーチンを呼び出す。
次に、依存グラフ作成部2は、カレント関数を関数表に登録する(第2登録ルーチンのステップS301)。カレント関数の関数名は“abs”であり、カレント関数の中身は関数名“abs”の関数本体305、およびその関数本体305より下の階層にある入力“a”、出力“b”、IF文306などである。依存グラフ作成部2は、関数表に、関数名“abs”および関数の中身“{|a|→|b|if(a>0)then{b=a}else{b=−a}}”を追加登録する(図6に示す関数表の2行目)。
次に、依存グラフ作成部2は、カレント関数“abs”に関数定義303が含まれるか判定する(第2登録ルーチンのステップS302)。カレント関数“abs”には関数定義303は含まれないため、依存グラフ作成部2は、呼び出し元(第1登録ルーチンのステップS305)へ戻る(第2登録ルーチンのステップ307)。
次に、依存グラフ作成部2は、第1登録ルーチンのステップS303で取得した関数定義303をすべて関数表へ登録したかを判定する(第1登録ルーチンのステップ306)。
取得した関数定義303をすべて関数表へ登録したと判定された場合は、依存グラフ作成部2は、呼び出し元へ戻る。依存グラフ作成部2は、プログラムトップレベル301に含まれる関数定義303(関数名“abs”のみ)を関数表へ登録したので、呼び出し元(ステップS203)へ戻る(第1登録ルーチンのステップS307)。
一方、取得した関数定義303をすべて関数表へ登録していないと判定された場合は、依存グラフ作成部2は、ステップS303〜S305の処理を繰り返し行う。
以上のように処理行い、第1登録ルーチンの呼び出し元(ステップ203)へ戻れば、依存グラフ作成部2は、動作を終了する。
図8、9、10は、依存グラフ作成部2が、関数表をもとに依存グラフを作成する際の動作を示すフローチャートである。なお、図3は、図6に示す関数表400をもとに作成された依存グラフ200、210の一例である。なお、本実施形態では、関数表をもとに依存グラフを作成する方法については、特に限定するものではない。
図8(a)は、関数表をもとに依存グラフを作成する際の、依存グラフ作成部2の初期動作を示すフローチャートである。
まず、依存グラフ作成部2は、関数表400から関数を1つ取得する(ステップS401)。即ち、依存グラフ作成部2は、図6の関数名“トップレベル”と関数の内容“output=abs(input)”とを取得する。
次に、依存グラフ作成部2は、取得した関数についての依存グラフを作成するための領域(以下では、グラフ領域と呼ぶ)を作成する(ステップS402)。
次に、依存グラフ作成部2は、関数の入出力リストに対応する入力データノードおよび出力データノードを作成する(ステップS403)。プログラムトップレベルの入力は“input”、出力は“output”である。依存グラフ作成部2は、グラフ領域に、入力データノード“input”および出力データノード“output”を作成する。
次に、依存グラフ作成部2は、関数に含まれる代入式およびIF文の集合を取得する(ステップS404)。即ち、依存グラフ作成部2は、プログラムトップレベルに含まれる代入式 “output=abs(input)”を取得する。
次に、依存グラフ作成部2は、取得した文集合からの依存グラフを作成するためのルーチン(以下、第1作成ルーチンと呼ぶ)を呼び出す(ステップS405)。即ち、依存グラフ作成部2は、代入式 “output=abs(input)”からなる文集合に関しての依存グラフ200を作成する。
図8(b)は、依存グラフ作成部2が生成ルーチンを呼び出し実行する際の動作を示すフローチャートである。
まず、依存グラフ作成部2は、文集合から文を1つ取り出す(第1作成ルーチンのステップS501)。即ち、依存グラフ作成部2は、代入式 “output=abs(input)”からなる文集合から、代入式“output=abs(input)”を取り出す。
次に、依存グラフ作成部2は、取り出した文が代入式かIF文かを判定する(第1作成ルーチンのステップS502)。
取り出した文が代入式の場合(第1作成ルーチンのステップS502の“代入式)、依存グラフ作成部2は、代入式の依存グラフを作成するためのルーチン(代入式ルーチン)を呼び出し、依存グラフを作成する(第1作成ルーチンのステップS503)。なお、代入式ルーチンを呼び出し実行する際の、依存グラフ作成部2の動作については後述する。
取り出した文がIF文の場合(第1作成ルーチンのステップS502の“IF文”)、依存グラフ作成部2は、IF文の依存グラフを作成するためのルーチン(IF文ルーチン)を呼び出し、依存グラフを作成する(第1作成ルーチンのステップS504)。なお、IF文ルーチンを呼び出し実行する際の、依存グラフ作成部2の動作については後述する。
代入式ルーチンを呼び出し実行することによって、代入式 “output=abs(input)”の依存グラフ200を作成したあと、依存グラフ作成部2は、文集合に含まれるすべての文の依存グラフを作成したか否かを判定する(第1作成ルーチンのステップS505)。
文集合に含まれるすべての文の依存グラフを作成していないと判定された場合(第1作成ルーチンのステップS505の“いいえ”)、依存グラフ作成部2は、文集合に含まれる文であって、まだ依存グラフを作成していない文に対して、ステップS501〜S504の処理を行い、依存グラフを作成する。
一方、文集合に含まれるすべての文の依存グラフを作成したと判定された場合(第1作成ルーチンのステップS505の“はい”)、依存グラフ作成部2は、呼び出し元(ステップS405)に戻る。
次に、依存グラフ作成部2は、関数表400に登録されたすべての関数を処理したか否かを判定する(ステップS406)。
関数表400に登録されたすべての関数を処理したと判定された場合(ステップS406の“はい”)、依存グラフ作成部2は、依存グラフ作成の処理に関する動作を終了する。
一方、関数表400に登録されたすべての関数を処理していないと判定された場合(ステップS406の“いいえ”)、依存グラフ作成部2は、関数表400に登録された残りの関数についても、ステップS401〜S405の処理を行い、依存グラフを作成する。
ここで、依存グラフ作成部2は、関数表400に登録された関数“プログラムトップレベル”と“abs”のうち、関数“プログラムトップレベル”についてしか処理を行っていないので、すべての関数を処理していないと判定する。
次に、依存グラフ作成部2は、関数“abs”に関して、ステップS401〜S403の処理を行う。
次に、依存グラフ作成部2は、ステップS404において、関数“abs”に含まれる文の集合、即ち、IF文“if(a>0)then{b=a}else{b=−a}”を取得する。
次に、依存グラフ作成部2は、IF文“if(a>0)then{b=a}else{b=−a}”からなる文集合の依存グラフを作成するためのルーチン(以下、第2作成ルーチンと呼ぶ)を呼び出し、実行する。
依存グラフ作成部2は、第2作成ルーチンのステップS501〜S505において、IF文“if(a>0)then{b=a}else{b=−a}”の依存グラフを作成するためのルーチン(IF文ルーチン)を呼び出し、依存グラフを作成する。
このようにして、依存グラフ作成部2は、関数“プログラムトップレベル301”と“abs”の依存グラフ210を作成し、動作を終了する。
図9は、依存グラフ作成部2が代入文ルーチンを呼び出し実行する際の動作を示すフローチャートである。なお、以下では、関数“プログラムトップレベル301”に含まれる代入式“output=abs(input)”の依存グラフを作成する例を用いて、依存グラフ作成部2の動作を説明する。なお、この代入式では、右辺が代入元であり、左辺が代入先であるものとする。
まず、依存グラフ作成部2は、代入式の左辺に対応するデータノードが作成済みか否かを判定する(ステップS601)。即ち、依存グラフ作成部2は、代入式の左辺“output”に対応するデータノードを既に図8のステップS403で作成しているため、代入式の左辺に対応するデータノードが作成済みと判定する(ステップS601の“はい”)。
一方、代入式の左辺に対応するデータノードがまだ作成されていないと判定された場合(ステップS601の“いいえ”)、依存グラフ作成部2は、代入式の左辺に含まれる変数に対応するデータノードを作成する(ステップS602)。なお、代入式の左辺に含まれる変数が複数あった場合には、依存グラフ作成部2は、それぞれの変数に対してデータノードを作成する。
次に、依存グラフ作成部2は、代入式の右辺が、値、変数名、あるいは、関数呼び出しのいずれであるかを判定する(ステップS603)。即ち、依存グラフは、代入式の右辺“abs(input)”が関数呼び出しであると判定する。
代入式の右辺“abs(input)”が関数呼び出しである場合(ステップS603の“関数呼び出し”)、依存グラフ作成部2は、関数の引数に対応するデータノードを作成済みか否かを判定する(ステップS609)。即ち、依存グラフ作成部2は、関数の引数“input”に対応するデータノードを既に図8のステップS403で作成しているため、関数の引数に対応するデータノードが作成済みと判定する(ステップS609の“はい”)。
一方、関数の引数に対応するデータノードがまだ作成されていないと判定された場合(ステップS609の“いいえ”)、依存グラフ作成部2は、関数の引数に含まれる変数に対応するデータノードを作成する(ステップS610)。なお、関数の引数に含まれる変数が複数あった場合には、依存グラフ作成部2は、それぞれの変数に対してデータノードを作成する。
次に、依存グラフ作成部2は、関数プロセスノードを作成する(ステップS611)。即ち、依存グラフ作成部2は、関数“abs”に対応するプロセスノードを作成する。
次に、依存グラフ作成部2は、関数の引数に対応するデータノードと、関数に対応するプロセスノードと、代入式の左辺に対応するデータノードとを接続する(ステップS612)。即ち、依存グラフ作成部2は、関数の引数に対応するデータノード“input”を根元側とし、関数“abs”に対応するプロセスノードを先端側とするエッジにより、データノード“input”と関数プロセスノード“abs”を接続する。さらに、依存グラフ作成部2は、関数プロセスノード“abs”を根元側とし、代入式の右辺に対応するデータノード“output”を先端側とするエッジにより、関数プロセスノード“abs”とデータノード“output”とを接続する。
このように、依存グラフ作成部2は、代入式“output=abs(input)”の依存グラフを作成し、代入式ルーチンの呼び出し元(第1作成ルーチンのS504)へ戻る。
以下では、図9のステップS603で、代入式の右辺が値あるいは変数名と判定された場合の依存グラフ作成部2の動作について説明する。
代入式の右辺が値である場合(ステップS603の“値”)、依存グラフ作成部2は、代入式の左辺に対応するデータノードへ、代入式の右辺の値を代入する(ステップS601)。そして、依存グラフ作成部2は、代入式ルーチンの呼び出し元へ戻る。
代入式の右辺が変数名である場合(ステップS603の“変数名”)、依存グラフ作成部2は、代入式の右辺に含まれる変数名に対応するデータノードが作成済みかを判定する(ステップS605)。
代入式の右辺に含まれる変数名に対応するデータノードがまだ作成されていないと判定された場合のみ(ステップS605の“いいえ”)、依存グラフ作成部2は、代入式の右辺に含まれる変数名に対応するデータノードを作成する(ステップS606)。
次に、依存グラフ作成部2は、代入プロセスノード215を作成する(ステップS607)。
次に、依存グラフ作成部2は、代入式の右辺に対応するデータノードと、代入プロセスノード215と、代入式の左辺に対応するデータノードとを接続する(ステップS608)。即ち、依存グラフ作成部2は、代入式の右辺に対応するデータノードを根元側とし、代入プロセスノード215を先端側とするエッジにより、代入式の右辺に対応するデータノードと代入プロセスノード215とを接続する。さらに、依存グラフ作成部2は、代入プロセスノード215を根元側とし、代入式の右辺に対応するデータノードを先端側とするエッジにより、代入プロセスノード215と代入式の右辺に対応するデータノードとを接続する。
このように、依存グラフ作成部2は、代入式の依存グラフを作成し、代入式ルーチンの呼び出し元へ戻る。
図10は、依存グラフ作成部2がIF文ルーチンを呼び出し実行する際の動作を示すフローチャートである。なお、以下では、関数“abs”に含まれるIF文“if(a>0)then{b=a}else{b=−a}”の依存グラフ210を作成する例を用いて、依存グラフ作成部2の動作を説明する。
まず、依存グラフ作成部2は、IFプロセスノード220を作成する(ステップS701)。
次に、依存グラフ作成部2は、IF文の条件に含まれる文集合を取得する(ステップS702)。即ち、依存グラフ作成部2は、IF文の条件“a>0”から構成される文集合を取得する。
次に、依存グラフ作成部2は、取得した文集合(IF文の条件“a>0”)の依存グラフを作成するための作成ルーチンを呼び出し実行する(ステップS703)。なお、IF文の条件“a>0”は、“a”が0より大きいときに真を、“a”が0未満のときに偽を、条件データノード219へ代入する代入式とみなされる。
次に、依存グラフ作成部2は、IF文のthen側、即ち、条件が真であったときに実行される処理を記述する文集合を取得する(ステップS704)。即ち、依存グラフ作成部2は、代入式“b=a”から構成される文集合を取得する。
次に、依存グラフ作成部2は、取得した文集合(代入式“b=a”)の依存グラフを作成するための作成ルーチンを呼び出し実行する(ステップS705)。なお、IF文のthen側の処理“b=a”は、入力データノード“a”を、真データノード218へ入力する代入文と見なされる。
次に、依存グラフ作成部2は、IF文のelse側、即ち、条件が偽であったときに実行される処理を記述する文集合を取得する(ステップS706)。即ち、依存グラフ作成部2は、代入式“b=−a”から構成される文集合を取得する。
次に、依存グラフ作成部2は、取得した文集合(代入式“b=−a”)の依存グラフを作成するための作成ルーチンを呼び出し実行する(ステップS707)。なお、IF文のelse側の処理“b=−a”は、入力データノード“0”の値“0”から入力データノード“a”の値“a”を減算した結果を、偽データノード217へ入力する代入文と見なされる。
次に、依存グラフ作成部2は、条件データノート、真データノード218、および偽データノード217と、IFプロセスノード220とを接続する(ステップS708)。即ち、依存グラフ作成部2は、条件データノート219を根元側としIFプロセスノード220を先端側とするエッジによって、条件データノード219とIFプロセスノード220とを接続する。依存グラフ作成部2は、真データノード218 を根元側としIFプロセスノード220を先端側とするエッジによって、真データノード218とIFプロセスノード220とを接続する。依存グラフ作成部2は、偽データノード217を根元側としIFプロセスノード220を先端側とするエッジによって、偽データノード217とIFプロセスノード220とを接続する。
次に、依存グラフ作成部2は、IFプロセスノード220と出力データノードとを接続する(ステップS709)。IFプロセスノード220を根元側とし、出力データノード“b”221を先端側とするエッジによって、IFプロセスノード220と出力データノード“b”221とを接続する。
このように、依存グラフ作成部2は、IF文の依存グラフを作成し、IF文ルーチンの呼び出し元(第2作成ルーチンのステップS503)へ戻る。
以上、図8、9、10を用いて説明したように、依存グラフ作成部2は、図6に示す関数表をもとに、図3に示す依存グラフを作成する。
抽出部3は、依存グラフ作成部2が作成した依存グラフ(図3)から、潜在的な性能向上の余地を算出する際の処理単位である部分依存グラフを抽出する。即ち、抽出部3は、依存グラフに含まれる出力データノードごとに、出力データノードと依存関係を持つノードを抽出して、1つ以上の入力データノードと1つの出力データノードとを有する依存グラフへ抽出する。なお、抽出部3は、出力データノードごとに、出力データノードからエッジを逆向きにたどって到達可能なノードのみを抽出することによって、出力データノードと依存関係を持つノードを抽出する。
抽出部3は、プログラムトップレベルの依存グラフ200、および関数“abs”の依存グラフ210を抽出算出部へ出力する。
図11は、分散算出部4が、入力された依存グラフに含まれる複数のパスごとにパス長を算出し、そのパス長の分散を算出する際の動作を示すフローチャートである。以下では、一例として、図3に示す関数“abs”の依存グラフ210が分散算出部4に入力されたものとして説明する。なお、本実施形態では、依存グラフから、依存グラフに含まれるパスのパス長の分散を算出する方法については、特に限定するものではない。
まず、分散算出部4は、入力された依存グラフの各パスのパス長を記憶する記憶領域である集合Sを“空”に初期化する(ステップS801)。
次に、分散算出部4は、依存グラフの入力データノードの集合と、出力データノードとを取得する(ステップS802)。即ち、分散算出部4は、図3に示す関数“abs”の依存グラフの入力データノード“0”211、入力データノード“a”212、および入力データノード“0”213と、出力データノード“b”221とを取得する。
次に、分散算出部4は、入力データノードを1つ選択する(ステップS803)。例えば、分散算出部4は、入力データノード“a”212を選択する。
次に、分散算出部4は、選択した入力データノードを始点、出力データノードを終点とするパスのパス長の集合Pを求める(ステップS804)。即ち、分散算出部4は、入力データノード“a”212を始点、出力データノード“b”221を終点とするパスのパス長の集合を求める。
入力データノード“a”212を始点、出力データノード“b”221を終点とするパスは3つあって、1番目のパスは「入力データノード“a”212→減算プロセスノード214→偽プロセスノード217→IFプロセスノード220→出力データノード“b”221」であり、2番目のパスは「入力データノード“a”212→代入プロセスノード215→真プロセスノード218→IFプロセスノード220→出力データノード“b”221」であり、3番目のパスは「入力データノード“a”212→比較プロセスノード216→条件プロセスノード219→IFプロセスノード220→出力データノード“b”221」である。
各パスのパス長をパスが経由するエッジの数とすれば、1番目のパスのパス長は“4”であり、2番目のパスのパス長は“4”であり、3番目のパスのパス長は“4”である。ここで、パス長の集合Pは、{“4”、“4”、“4”}となる。
次に、分散算出部4は、求めたパス長の集合Pを、“空”に初期化したパス長の集合Sへ追加する(ステップS805)。ここで、パス長の集合Sは、{“4”、“4”、“4”}となる。
次に、分散算出部4は、ステップS803で取得した入力データノードのうち、ステップS804〜S805からなる処理を行っていない入力データノードが存在するか否かを判定する(ステップS806)。即ち、分散算出部4は、ステップS803で取得した入力データノード“a”212、入力データノード“0”211、および入力データノード“0”213のうち、入力データノード“0”211、213については、まだステップS804〜S805からなる処理を行っていないと判定する。
未処理の入力データノードが存在すると判定された場合(ステップS806の“はい”)、分散算出部4は、未処理の入力データノードを選択して、ステップS804〜S805からなる処理を行う。即ち、分散算出部4は、入力データノード“0”211を選択し(ステップS803)、入力データノード“0”211を始点、出力データノード“b”221を終点とするパスのパス長の集合Pをもとめ(ステップS804)、集合Sに追加する(ステップS805)。なお、分散算出部4がいずれの入力データノード“0”を選択したとしても、パス長の集合Pは{“4”}となる。そのため、分散算出部4がステップS803で取得した入力データノードのすべてに対して、ステップS804〜S805からなる処理を行った場合は、集合Sは{“4”、“4”、“4”、“4”、“4”}となる。
一方、未処理の入力データノードが存在しないと判定された場合(ステップS806の“いいえ”)、分散算出部4は、パス長の集合Sの分散を算出する(ステップS807)。即ち、分散算出部4は、パス長の集合S{“4”、“4”、“4”、“4”、“4”}の分散“0”を求める。なお、パス長の集合Sの分散は、各パス長から集合Sに含まれるパス長の平均値を減算したものを二乗した結果の平均値である。
図12は、入力データノードを始点とし、出力データノードを終点とするパスのパス長の集合Pを求める際(図11のステップS804)の分散算出部4の動作を示すフローチャートである。なお、本実施形態では、パスのパス長の集合Pをもとめる方法については、特に限定するものではない。
まず、分散算出部4は、始点データノードと終点データノードとが同一か否かを判定する(ステップS901)。
始点データノードと終点データノードとが同一と判定された場合(ステップS901の“はい”)、分散算出部4は、パス長の集合として“0”を1つ含む集合{“0”}を返す(ステップS902)。
一方、始点データノードと終点データノードとが同一でないと判定された場合(ステップS901の“いいえ”)、分散算出部4は、始点データノードの子プロセスノードを取得する(ステップS903)。
次に、分散算出部4は、子プロセスノードの子データノード(以下では、孫ノードと呼ぶ)を取得する(ステップS904)。
次に、分散算出部4は、孫ノードのうちの1つを始点とし、終点データノードを終点とする依存グラフに含まれるパスのパス長の集合を求める(ステップS905)。即ち、分散算出部4は、孫ノードのうちの1つを始点とし、終点データノードを終点として、ステップS901〜S906の処理(パス長算出ルーチン)の再帰呼び出しを行う。
次に、分散算出部4は、パス長の集合に含まれるすべてのパス長に“2”を加え、その集合を返す(ステップS906)。
このようにして、分散算出部4は、入力データノードを始点とし、出力データノードを終点とするパスのパス長の集合Pを求める。
以上、図11、12を用いて説明したように、分散算出部4は、依存グラフごとに、依存グラフに含まれる複数のパスのパス長の分散を算出する。依存グラフごとに求められたパス長の分散は、依存グラフごとの、プログラマが修正することによって潜在的に性能(並列度)向上の余地の大きさを示す。パス長の分散が大きい依存グラフは、並列度を高くすることによって性能を向上させるためにプログラムの修正が推奨される箇所としてプログラマへ提示される。分散算出部4は、抽出部3から入力された依存グラフごとに、そのパス長の分散を算出し、その結果を順序付部5へ出力する。
順序付部5は、依存グラフごとのパス長の分散が入力されると、パス長の分散が大きい順に依存グラフの順序付けを行い、潜在的な性能向上の余地が大きい順序として、出力部6へ出力する。出力部6は、順序付部5から入力された依存グラフに対応する領域ごとに、潜在的な性能向上の余地が大きさを、ユーザに見える形で表示する。
出力部6には、パス長の分散が最大である依存グラフに対応する領域のみが提示されてもよく、依存グラフに対応する領域と潜在的な性能向上の余地の大きさを示す指標(その依存グラフのパス長の分散)とをあわせて提示してもよく、潜在的な性能向上の余地が大きい(パス長の分散の大きい)依存グラフそのものをグラフ形式で提示しても良い。このとき出力部6は、潜在的な性能向上の余地が大きい依存グラフに対応する領域のプログラムのソースコードを合わせて提示しても良い。
このように、本実施形態に係る情報処理装置10によれば、プログラムのソースコードから依存グラフを作成し、作成した依存グラフに含まれるパスのパス長の分散を潜在的に性能(並列度)向上の余地の大きさを示す指標とし、パス長の分散が大きい依存グラフに対応する領域を表示することで、プログラムの実行時における動的な指標を使用することなく、並列計算機によって効率的に並列処理可能なプログラムへ修正するための、修正箇所をプログラマへ提示することができる。
なお、上記のように、本実施形態では、プログラマが修正することによって潜在的に性能(並列度)向上の余地の大きさを示す指標として、依存グラフごとのパス長の分散を用いたが、依存グラフに含まれるパスごとにパス長がどれほど異なっているか(ちらばり度)を示す指標であればよく、例えば、パス長の分散のほか、パス長の標準偏差などで有っても良い。
また、上記実施形態では、抽出部3は、依存グラフに含まれる各出力データノードと依存関係を持つノードを抽出することによって、複数の部分依存グラフを抽出するものとした。
しかし、抽出部3は、ユーザが指定する潜在的な性能向上の余地を算出する際の処理単位に応じて、依存グラフから部分依存グラフを抽出することができる。
即ち、ユーザによって依存グラフに含まれる1つの入力データノードおよび1つの出力データノードが指定された場合に、抽出部3は、その1つの入力データノードと起点とし、その1つの出力データノードを終点とするパスが経由するノードを抽出する。このようにして、抽出部3は、1つの部分依存グラフを抽出する。
ユーザによって、依存グラフに含まれる複数の入力データノードおよび1つの出力データノードが指定された場合に、抽出部3は、それら複数の入力データノードを起点とし、その1つの出力データノードを終点とするパスが経由するノードを抽出する。このようにして、抽出部3は、1つの部分依存グラフを抽出する。
ユーザによって、依存グラフに含まれる複数の入力データノードおよび複数の出力データノードが指定された場合に、抽出部3は、出力データノードごとに、複数の入力データノードを起点とし、各出力データノードを終点とするパスが経由するノードを抽出する。このようにして、抽出部3は、ユーザによって指定された出力データノードの数の部分依存グラフを抽出する。
このようにすることで、ユーザによって直接指定された領域を、潜在的な性能向上の余地を算出する際の処理単位とすることができ、ユーザの望む処理単位ごとに潜在的な性能向上の余地をユーザへ提示することができる。
また、この情報処理装置10は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用いることでも実現することが可能である。すなわち、依存グラフ作成部2、抽出部3、分散算出部4、および順序付部5は、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。このとき、情報処理装置10は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、CD−ROMなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。
本発明の実施形態に係る情報処理装置10の構成を示すブロック図。 プログラムのソースコード100の一例を示す図。 依存グラフの一例を示す図。 本発明の実施形態に係る依存グラフ作成部2の動作を示すフローチャート。 構文木の一例を示す図。 関数表の一例を示す図。 本発明の実施形態に係る依存グラフ作成部2の動作を示すフローチャート。 本発明の実施形態に係る依存グラフ作成部2の動作を示すフローチャート。 本発明の実施形態に係る依存グラフ作成部2の動作を示すフローチャート。 本発明の実施形態に係る依存グラフ作成部2の動作を示すフローチャート。 本発明の実施形態に係る分散算出部4の動作を示すフローチャート。 本発明の実施形態に係る分散算出部4の動作を示すフローチャート。
符号の説明
1・・・記憶部
2・・・依存グラフ作成部
3・・・抽出部
4・・・分散算出部
5・・・順序付部
6・・・出力部
10・・・情報処理装置
100・・・プログラムのソースコード
200・・・プログラムトップレベルの依存グラフ
201・・・入力データノード“input”
202・・・プロセスノード
203・・・出力データノード“output”
210・・・関数“abs”の依存グラフ
211・・・入力データノード“0”
212・・・入力データノード“a”
213・・・入力データノード“0”
214・・・減算プロセスノード
215・・・代入プロセスノード
216・・・比較プロセスノード
217・・・偽プロセスノード
218・・・真プロセスノード
219・・・条件プロセスノード
220・・・IFプロセスノード
221・・・出力データノード“b”
300・・・構文木
301・・・プログラムトップレベル
302、308、309・・・代入式
303・・・関数定義
304、307、310・・・関数呼び出し
305・・・関数本体
306・・・IF文
400・・・関数表

Claims (12)

  1. プログラムのソースコードを記憶する記憶手段と、
    前記記憶手段から前記ソースコードを読み出す読出手段と、
    前記ソースコードから、前記ソースコードに含まれる複数の要素のそれぞれをノードとし、ノード間を枝で接続することによって依存関係を示す依存グラフを作成する作成手段と、
    前記依存グラフの一部であって、データ入力を意味する要素のノードである入力データノードと、データ出力を意味する要素のノードである出力データノードとを含む部分依存グラフを、前記依存グラフから抽出する抽出手段と、
    前記部分依存グラフについて、前記入力データノードから前記出力データノードまでのパスごとにパス長を算出する第1の算出手段と、
    前記部分依存グラフに含まれるパスのパス長のちらばり度を算出する第2の算出手段とを備えることを特徴とする情報処理装置。
  2. 前記部分依存グラフは、前記依存グラフに含まれる出力データノードと、その出力データノードとの依存関係を有するノードとを含むことを特徴とする請求項1に記載の情報処理装置。
  3. 前記依存グラフに複数の出力データノードが含まれる場合、前記抽出手段は、前記依存グラフに含まれる出力データノードの数だけ前記部分依存グラフを抽出し、
    前記複数の部分依存グラフのそれぞれは、前記依存グラフに含まれる出力データノードのそれぞれと、その出力データノードとの依存関係を持つノードとを含むことを特徴とする請求項2に記載の情報処理装置。
  4. 前記作成した依存グラフに含まれる入力データノードと出力データノードとを指定する指定手段をさらに備え、
    前記部分依存グラフは、前記指定手段によって指定された入力データノードを起点とし、前記指定手段によって指定された前記出力データノードを終点とするパスが経由するノードを含むことを特徴とする請求項1に記載の情報処理装置。
  5. 前記指定手段によって複数の出力データノードが指定された場合、前記抽出手段は、前記指定手段によって指定された出力データノードの数だけ前記部分依存グラフを抽出し、
    前記複数の部分依存グラフのそれぞれは、当該指定された出力データノードのそれぞれを終点とし、前記指定手段によって指定された入力データノードを起点とするパスが経由するノードを含むことを特徴とする請求項4に記載の情報処理装置。
  6. 前記ちらばり度が大きい順に、前記抽出された部分依存グラフの順序付けする順序付手段と、
    前記抽出された依存グラフの順序付け結果に応じて、部分依存グラフと、その部分依存グラフのちらばり度とを関連付けて出力する出力手段をさらに備えることを特徴とする請求項1乃至請求項5のいずれか1項に記載の情報処理装置。
  7. 前記ちらばり度が大きい順に、前記抽出された部分依存グラフの順序付けする順序付手段と、
    前記抽出された依存グラフの順序付け結果に応じて、部分依存グラフを識別する情報と、その部分依存グラフのちらばり度とを関連付けて出力する出力手段をさらに備えることを特徴とする請求項1乃至請求項5のいずれか1項に記載の情報処理装置。
  8. 前記出力手段が、前記ちらばり度が最大である部分依存グラフについての情報を出力することを特徴とする請求項6または請求項7に記載の情報処理装置。
  9. 前記プログラムのソースコードを、依存性抽出可能となるように変換する変換手段をさらに有することを特徴とする請求項1乃至請求項8のいずれか1項に記載の情報処理装置。
  10. プログラムのソースコードを記憶する記憶手段と、
    前記記憶手段から前記ソースコードを読み出す読出手段と、
    前記読み出したソースコードから、前記ソースコードに含まれる複数の要素のそれぞれをノードとし、ノード間を枝で接続することによって依存関係を示す依存グラフを作成する作成手段と、
    前記作成した依存グラフについて、データ入力を意味する要素のノードである入力データノードからデータ出力を意味する要素のノードである出力データノードまでのパスごとにパス長を算出する第1の算出手段と、
    前記作成した依存グラフについて、前記依存グラフに含まれるパスのパス長の分散を算出する第2の算出手段とを備えることを特徴とする情報処理装置。
  11. プログラムのソースコードを記憶手段へ記憶し、
    前記記憶手段から前記ソースコードを読み出し、
    前記ソースコードから、前記ソースコードに含まれる複数の要素のそれぞれをノードとし、ノード間を枝で接続することによって依存関係を示す依存グラフを作成し、
    前記依存グラフの一部であって、データ入力を意味する要素のノードである入力データノードと、データ出力を意味する要素のノードである出力データノードとを含む部分依存グラフを、前記依存グラフから抽出し、
    前記部分依存グラフについて、前記入力データノードから前記出力データノードまでのパスごとにパス長を算出し、
    前記部分依存グラフに含まれるパスのパス長のちらばり度を算出することを特徴とする情報処理装置の制御方法。
  12. コンピュータに、
    プログラムのソースコードを記憶手段へ記憶する機能と、
    前記記憶手段から前記ソースコードを読み出す機能と、
    前記ソースコードから、前記ソースコードに含まれる複数の要素のそれぞれをノードとし、ノード間を枝で接続することによって依存関係を示す依存グラフを作成する機能と、
    前記依存グラフの一部であって、データ入力を意味する要素のノードである入力データノードと、データ出力を意味する要素のノードである出力データノードとを含む部分依存グラフを、前記依存グラフから抽出する機能と、
    前記部分依存グラフについて、前記入力データノードから前記出力データノードまでのパスごとにパス長を算出する機能と、
    前記部分依存グラフに含まれるパスのパス長のちらばり度を算出する機能ととを実現させることを特徴とする情報処理装置の制御プログラム。
JP2008002951A 2008-01-10 2008-01-10 情報処理装置、情報処理装置の制御方法、および情報処理装置の制御プログラム Pending JP2009163662A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2008002951A JP2009163662A (ja) 2008-01-10 2008-01-10 情報処理装置、情報処理装置の制御方法、および情報処理装置の制御プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008002951A JP2009163662A (ja) 2008-01-10 2008-01-10 情報処理装置、情報処理装置の制御方法、および情報処理装置の制御プログラム

Publications (1)

Publication Number Publication Date
JP2009163662A true JP2009163662A (ja) 2009-07-23

Family

ID=40966176

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008002951A Pending JP2009163662A (ja) 2008-01-10 2008-01-10 情報処理装置、情報処理装置の制御方法、および情報処理装置の制御プログラム

Country Status (1)

Country Link
JP (1) JP2009163662A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2020184130A1 (ja) * 2019-03-13 2020-09-17 オムロン株式会社 グラフ表示装置、グラフ表示方法、及びグラフ表示プログラム
WO2020184121A1 (ja) * 2019-03-13 2020-09-17 オムロン株式会社 グラフ表示装置、グラフ表示方法、及びグラフ表示プログラム
WO2020184085A1 (ja) * 2019-03-13 2020-09-17 オムロン株式会社 グラフ表示装置、グラフ表示方法、及びグラフ表示プログラム
KR20210009143A (ko) * 2019-07-16 2021-01-26 서울과학기술대학교 산학협력단 사회연결망과 자료포락을 이용한 소프트웨어 함수 분석 시스템 및 그 방법

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2020184130A1 (ja) * 2019-03-13 2020-09-17 オムロン株式会社 グラフ表示装置、グラフ表示方法、及びグラフ表示プログラム
WO2020184121A1 (ja) * 2019-03-13 2020-09-17 オムロン株式会社 グラフ表示装置、グラフ表示方法、及びグラフ表示プログラム
WO2020184085A1 (ja) * 2019-03-13 2020-09-17 オムロン株式会社 グラフ表示装置、グラフ表示方法、及びグラフ表示プログラム
JP2020149299A (ja) * 2019-03-13 2020-09-17 オムロン株式会社 グラフ表示装置、グラフ表示方法、及びグラフ表示プログラム
CN112543898A (zh) * 2019-03-13 2021-03-23 欧姆龙株式会社 图表显示装置、图表显示方法以及图表显示程序
JP7183877B2 (ja) 2019-03-13 2022-12-06 オムロン株式会社 グラフ表示装置、グラフ表示方法、及びグラフ表示プログラム
US11640154B2 (en) 2019-03-13 2023-05-02 Omron Corporation Graph display device, graph display method, and recording medium for associating and ascertaining dependency relations among device variables
US11762363B2 (en) 2019-03-13 2023-09-19 Omron Corporation Graph display device, graph display method, and recording medium
US11803170B2 (en) 2019-03-13 2023-10-31 Omron Corporation Graph display device, graph display method, and recording medium
CN112543898B (zh) * 2019-03-13 2024-04-12 欧姆龙株式会社 图表显示装置、图表显示方法以及记录介质
KR20210009143A (ko) * 2019-07-16 2021-01-26 서울과학기술대학교 산학협력단 사회연결망과 자료포락을 이용한 소프트웨어 함수 분석 시스템 및 그 방법
KR102245386B1 (ko) 2019-07-16 2021-04-27 서울과학기술대학교 산학협력단 사회연결망과 자료포락을 이용한 소프트웨어 함수 분석 시스템 및 그 방법

Similar Documents

Publication Publication Date Title
CN106919434B (zh) 一种代码生成方法及装置
Cánovas Izquierdo et al. Extracting models from source code in software modernization
CN107704382B (zh) 面向Python的函数调用路径生成方法和系统
CN106648662B (zh) 基于工程造价计算描述语言bcl的报表生成装置及生成方法
CN105593815B (zh) 在编译器中构建基于图的中间表示的方法
CN109739494B (zh) 一种基于Tree-LSTM的API使用代码生成式推荐方法
US9552348B2 (en) System and method for operating a computer application with spreadsheet functionality
WO2009098739A1 (ja) プログラム最適化装置およびプログラム最適化方法
CN111124379B (zh) 页面生成方法、装置、电子设备及存储介质
JPH0769834B2 (ja) ソース・プログラムをコンパイルする方法及び装置
Grønmo et al. Comparison of three model transformation languages
JP2009187285A (ja) プログラム変換方法、プログラム変換装置およびプログラム
JP2009163662A (ja) 情報処理装置、情報処理装置の制御方法、および情報処理装置の制御プログラム
JP2009181446A (ja) プログラム生成装置およびブロック線図生成装置
JP2012203826A (ja) デコーダコンパイラ、プログラムおよび通信機器
US10545741B2 (en) Information processing apparatus, method of compiling, and storage medium
KR102614967B1 (ko) 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
US8972927B2 (en) Method and system for providing modeled components
CN108369499B (zh) 一种代码虚拟化系统和方法
JP5600301B2 (ja) システム表現およびハンドリング技術
JP6239438B2 (ja) 仕様抽出装置、仕様抽出方法およびプログラム
CN113779311A (zh) 一种数据处理的方法、装置和存储介质
JPH0756745A (ja) 言語処理プログラムのコンパイラ処理方式
JP2016051367A (ja) データ解析装置、データ解析方法、および、プログラム。
CN114579137B (zh) 一种页面渲染方法、装置、计算机设备和存储介质