JP2013171459A - プログラム解析装置、プログラム解析方法および記録媒体 - Google Patents
プログラム解析装置、プログラム解析方法および記録媒体 Download PDFInfo
- Publication number
- JP2013171459A JP2013171459A JP2012035368A JP2012035368A JP2013171459A JP 2013171459 A JP2013171459 A JP 2013171459A JP 2012035368 A JP2012035368 A JP 2012035368A JP 2012035368 A JP2012035368 A JP 2012035368A JP 2013171459 A JP2013171459 A JP 2013171459A
- Authority
- JP
- Japan
- Prior art keywords
- information
- relationship
- data
- reference relationship
- program
- 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.)
- Abandoned
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/456—Parallelism detection
Abstract
【課題】ユーザによる少ない解析と指示で高性能なプログラムを生成することができるプログラム解析装置を得ること。
【解決手段】参照データと被参照データで構成される参照関係対ごとに参照データが被参照データを参照することが「確実」か「不確実」かを示す第一の参照関係情報に基づいて、参照することが「不確実」である1つ以上の参照関係対を提示情報として生成する生成部と、提示情報に対する参照関係の入力と参照関係対間の依存関係の情報である参照依存関係情報とを用いて第一の参照関係情報を第二の参照関係情報に変換する変換部と、を備える。
【選択図】図1
【解決手段】参照データと被参照データで構成される参照関係対ごとに参照データが被参照データを参照することが「確実」か「不確実」かを示す第一の参照関係情報に基づいて、参照することが「不確実」である1つ以上の参照関係対を提示情報として生成する生成部と、提示情報に対する参照関係の入力と参照関係対間の依存関係の情報である参照依存関係情報とを用いて第一の参照関係情報を第二の参照関係情報に変換する変換部と、を備える。
【選択図】図1
Description
本発明の実施形態は、プログラム解析装置、プログラム解析方法および記録媒体に関する。
従来、ループiteration間に依存があるか不明な場合、利用者がループiteration間に依存がないと指示すると、ループを並列化することによりプログラムを高性能化する技術が存在する。この技術では、ループiteration間に依存があるか不明な場合、正しい動作を保証するために自動では並列化できないが、依存がないとユーザが指示すれば並列化できる。
しかしながら、上述の技術をポインタ解析に応用すると、指示を与えるべき対象が潜在的にはポインタと実データの組み合わせやポインタとポインタの組み合わせの数だけ存在してしまい、ユーザが指示するための労力、時間等が大きくなるという問題があった。
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つ以上を選択し、選択した参照関係対を提示情報として生成する生成部、を備える。また、このプログラム解析装置は、提示情報に基づいて入力された提示情報に対する参照関係対ごとの参照関係の入力を受け付け、入力に基づいて提示情報に含まれる参照関係対の参照関係を参照指示情報として生成する指示部と、を備える。さらに、このプログラム解析装置は、参照指示情報と参照関係対間の依存関係の情報である参照依存関係情報とを用いて第一の参照関係情報を第二の参照関係情報に変換する変換部、を備える。参照依存関係情報は、第一の参照関係対の参照関係に基づいて第二の参照関係対の参照関係が推定可能である場合に第一の参照関係対の参照関係の仮定と当該仮定を行ったときに推定される第二の参照関係対の参照関係との対応を示す情報とする。
以下に図面を参照して、実施形態にかかるプログラム解析装置、プログラム解析方法および記録媒体を詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
(第1の実施の形態)
図1は、第1の実施の形態にかかるプログラム最適化装置10の構成例を示すブロック図である。プログラム最適化装置10は、第一のプログラム(解析対象プログラム)21を最適化し、最適化した結果である第二のプログラム22を出力する。プログラム最適化装置10は、解析部11と反映部12と生成部13と指示部14と変換部15と最適化部16と記憶部17とを備える。なお、本実施の形態では、プログラムの最適化を行う最適化部16を備えるプログラム最適化装置10を例に説明するが、図1の構成から最適化部16を削除し、第一のプログラム内のデータの参照関係を解析するプログラム解析装置を構成してもよい。
図1は、第1の実施の形態にかかるプログラム最適化装置10の構成例を示すブロック図である。プログラム最適化装置10は、第一のプログラム(解析対象プログラム)21を最適化し、最適化した結果である第二のプログラム22を出力する。プログラム最適化装置10は、解析部11と反映部12と生成部13と指示部14と変換部15と最適化部16と記憶部17とを備える。なお、本実施の形態では、プログラムの最適化を行う最適化部16を備えるプログラム最適化装置10を例に説明するが、図1の構成から最適化部16を削除し、第一のプログラム内のデータの参照関係を解析するプログラム解析装置を構成してもよい。
プログラム最適化装置10は、例えばパーソナルコンピュータやサーバ等のコンピュータ上に実装される。図2は、プログラム最適化装置10が実装されるコンピュータシステムの構成例を示す図である。図2に示したコンピュータシステムは、制御部1、入力部2、記憶部3、表示部4を備え、これらはバス5を介して接続されている。
制御部1は、CPU(Central Processing Unit)、MPU(Micro Processing Unit )等で構成され、各種プログラム等を実行する。入力部2は、キーボードやマウス等を備え、ユーザからの入力を受け付ける。記憶部3は、RAM(Random Access Memory)やROM(Read Only Memory)などの各種メモリおよびハードディスクなどのストレージデバイスを含み、制御部1が実行すべきプログラム,処理の過程で得られた必要なデータ,などを記憶する。表示部4は、液晶やプラズマ等のディスプレイ等で構成され、コンピュータシステムのユーザに対して各種画面を表示する。なお、図2の構成は一例であり、プログラム最適化装置10が実装されるコンピュータはどのような構成でもよい。
本実施の形態のプログラム最適化装置10の動作例について説明する。図2のコンピュータシステムには、たとえば、CD−ROM等の記録媒体から、プログラム最適化装置10の動作(プログラム解析処理を含む動作)を実行するための解析プログラムが記憶部3にインストールされる。制御部1は、記憶部3に格納された解析プログラムに従って、プログラム解析処理を実行する。
なお、上述の例では、CD−ROMを記録媒体として、最適化プログラムを提供しているが、これに限らず、コンピュータシステムの構成、提供するプログラムの容量などに応じて、たとえば、磁気ディスクなどの記録媒体やインターネットなどの伝送媒体により提供されたプログラムを用いることとしてもよい。
なお、図1の記憶部17は、記憶部3に含まれる。また、解析部11、反映部12、生成部13、指示部14、変換部15および最適化部16は、制御部1に含まれる。
次に、プログラム最適化装置10の動作を説明する。図3は、プログラム最適化装置10の全体動作の一例を示すフローチャートである。解析部11は、入力された第一のプログラム21を解析する(ステップS1)具体的には、第一の参照関係情報と参照依存関係情報とトレース情報とアクセス回数情報とグループアクセス情報とプログラム情報を生成して記憶部17へ格納し、格納を行ったことを反映部12へ通知する。次に、反映部12は、記憶部17から第一の参照関係情報、トレース情報および参照依存関係情報を読み出し、トレース情報および参照依存関係情報の情報を用いて第一の参照関係情報を中間参照関係情報に変換する(ステップS2)。また、反映部12は、中間参照関係情報を記憶部17へ格納し、変換を行ったことを生成部13へ通知する。
次に、生成部13は、記憶部17から中間参照関係情報、アクセス回数情報およびグループアクセス情報を読み出し、アクセス回数情報およびグループアクセス情報に基づいて中間参照関係情報から提示情報を生成する(ステップ3)。提示情報は、表示部4に表示される。
指示部14は、入力部2経由でユーザからの参照指示情報の入力を受け付け、入力された参照指示情報を記憶部17へ格納する(ステップS4)。指示部14は、参照指示情報を格納したことを変換部15へ通知する。
次に、変換部15は、記憶部17から中間参照関係情報、参照指示情報および参照依存関係情報を読み出し、参照指示情報および参照依存関係情報を利用して中間参照関係情報を第二の参照関係情報に変換する(ステップS5)。また、変換部15は、第二の参照関係情報を記憶部17へ格納し、変換を行ったことを最適化部16へ通知する。
次に、最適化部16は、記憶部17から第二の参照関係情報およびプログラム情報を読み出し、第二の参照関係情報およびプログラム情報を利用して最適化された第二のプログラム22を構築する(ステップS6)。
なお、上述の例では、各機能部が各々の処理を実行したことを次の処理を行う機能部へ通知するようにしたが、この代わりに、制御部1内に全体を制御する手段を設け、その手段が各機能部の処理の実行タイミングを制御するようにしてもよい。
以下の説明では、プログラム最適化装置10の各機能部が図3で説明した順番で直列に最も基本的な形態で動作した場合の例について説明する。しかしながら、実施の形態はこれに限られない。例えば、複数の機能部が協調しながら動作を行う構成、一部の機能部の順番を入れ替える構成、ある機能部を複数の機能ブロックに分割する構成、これら3つの形態を組み合わせる構成等で実施することもできる。また、例えば、参照指示情報のみを変更したい場合に図3のステップS4以降から実行できるようにしておく等、図1の機能部のうちの一部の機能部による動作が可能なようにしてもよい。また、機能部を複数のモジュールに分割して実施することもできる。
次に、各機能部の処理、処理で用いる用語や情報について説明する。
(解析部11)
解析部11は、入力される第一のプログラム21を解析して、第一の参照関係情報と参照依存関係情報とトレース情報とアクセス回数情報とグループアクセス情報とプログラム情報とを抽出する。
(解析部11)
解析部11は、入力される第一のプログラム21を解析して、第一の参照関係情報と参照依存関係情報とトレース情報とアクセス回数情報とグループアクセス情報とプログラム情報とを抽出する。
(第一のプログラム)
図4は、第一のプログラム21の一例を示す図である。図4に示した第一のプログラム21は、C言語に似た疑似プログラム言語で記述されている。第一のプログラム21は、図4の例に限定されず、どのような言語で記述されていてもよい。
図4は、第一のプログラム21の一例を示す図である。図4に示した第一のプログラム21は、C言語に似た疑似プログラム言語で記述されている。第一のプログラム21は、図4の例に限定されず、どのような言語で記述されていてもよい。
(参照データと被参照データ)
第一のプログラム21に含まれている各データは、参照データと被参照データに大別される。参照データは、他のデータにアクセスするための特殊なデータであり、アクセス対象となるデータにリンクされており、かつ、リンク先を変更可能である。例えばC言語のポインタ変数などである。図4では、参照データはrefキーワードを利用して定義されている。図4では、参照データは、images_1とimages_2とstreamとstreamsとsである。
第一のプログラム21に含まれている各データは、参照データと被参照データに大別される。参照データは、他のデータにアクセスするための特殊なデータであり、アクセス対象となるデータにリンクされており、かつ、リンク先を変更可能である。例えばC言語のポインタ変数などである。図4では、参照データはrefキーワードを利用して定義されている。図4では、参照データは、images_1とimages_2とstreamとstreamsとsである。
被参照データは、参照データを介してアクセスされるデータである。図4では、被参照データはdataキーワードを利用して定義されている。図4では、被参照データは、input_imagesとwaitingとflagとid_1とid_2である。
(直接データアクセスと間接データアクセス)
データへのアクセス方法は、直接データアクセスと間接データアクセスに大別される。直接データアクセスとは、参照データを介さず被参照データに直接アクセスする方法である。図4では、被参照データの名前を利用した直接データアクセスが示されている。例えばwaiting += 1である。直接データアクセスは、アクセス先のデータが名前で記されているため、実際にアクセスするデータを解析可能である。
データへのアクセス方法は、直接データアクセスと間接データアクセスに大別される。直接データアクセスとは、参照データを介さず被参照データに直接アクセスする方法である。図4では、被参照データの名前を利用した直接データアクセスが示されている。例えばwaiting += 1である。直接データアクセスは、アクセス先のデータが名前で記されているため、実際にアクセスするデータを解析可能である。
間接データアクセスとは、参照データを介して被参照データにアクセスする方法である。図4では、参照データを介して被参照データにアクセスするために*演算子を利用している。例えば*images_1である。間接データアクセスは、参照データの内容によって実行時にアクセスする被参照データを決定するため、実際にアクセスする被参照データを解析できない場合がある。
(関数)
図4では、transfer_imageとtransfer_image_allとの、2つの関数がfunctionキーワードにより定義されている。関数名の後のカッコ内には関数の引数が記述されている。図4の関数transfer_imageの引数は、参照データimages_1と参照データstreamである。引数に指定されたデータは、関数コールで指定されたデータを引き継ぐ。例えばtransfer_image(images_2,s)の関数コールがされた場合、データimages_2の値をデータimages_1が、データsの値をデータstreamが引き継ぐ。
図4では、transfer_imageとtransfer_image_allとの、2つの関数がfunctionキーワードにより定義されている。関数名の後のカッコ内には関数の引数が記述されている。図4の関数transfer_imageの引数は、参照データimages_1と参照データstreamである。引数に指定されたデータは、関数コールで指定されたデータを引き継ぐ。例えばtransfer_image(images_2,s)の関数コールがされた場合、データimages_2の値をデータimages_1が、データsの値をデータstreamが引き継ぐ。
(関数のアクセス属性)
関数にはinternalもしくはexternalのアクセス属性を設定可能である。図4では、internalは、プログラムの外部から呼び出し不可能であり、externalは、プログラムの外部から呼び出し可能である。図4の関数transfer_image_allは、externalとして設定されているので、第一のプログラム21の外部から呼び出し可能である。
関数にはinternalもしくはexternalのアクセス属性を設定可能である。図4では、internalは、プログラムの外部から呼び出し不可能であり、externalは、プログラムの外部から呼び出し可能である。図4の関数transfer_image_allは、externalとして設定されているので、第一のプログラム21の外部から呼び出し可能である。
(タスク)
図4では、prepareとgetとの、2つのタスクがtaskキーワードにより定義されている。例えばtask prepareである。タスクは、startキーワードにより実行される。
図4では、prepareとgetとの、2つのタスクがtaskキーワードにより定義されている。例えばtask prepareである。タスクは、startキーワードにより実行される。
(関数とタスクの相違点)
関数は現在実行中の処理を一時中断して関数の処理を実行するのに対して、タスクは現在実行中の処理と並行してタスクの処理を実行する。図5は、図4の第一のプログラム21内の関数transfer_image_allと関数transfer_imageとタスクprepareとタスクgetの実行例を示す図である。関数transfer_image_allの実行中に関数transfer_imageが呼び出されると、関数transfer_image_allは一時中断され、関数transfer_imageが実行される。その後、関数transfer_imageの処理を終えると、関数transfer_image_allの処理を再開する。一方、関数transfer_imageの実行中にタスクprepareが呼び出されても、関数transfer_imageは処理を中断せず、タスクの処理が並行して実行される。ここに記した関数とタスクの相違点は、記述が表現する潜在的な処理の相違点を示しており、実際にどのような処理が行われるかは、コンパイラやOS(Operating System)などの、プログラム実行環境によって決定される。
関数は現在実行中の処理を一時中断して関数の処理を実行するのに対して、タスクは現在実行中の処理と並行してタスクの処理を実行する。図5は、図4の第一のプログラム21内の関数transfer_image_allと関数transfer_imageとタスクprepareとタスクgetの実行例を示す図である。関数transfer_image_allの実行中に関数transfer_imageが呼び出されると、関数transfer_image_allは一時中断され、関数transfer_imageが実行される。その後、関数transfer_imageの処理を終えると、関数transfer_image_allの処理を再開する。一方、関数transfer_imageの実行中にタスクprepareが呼び出されても、関数transfer_imageは処理を中断せず、タスクの処理が並行して実行される。ここに記した関数とタスクの相違点は、記述が表現する潜在的な処理の相違点を示しており、実際にどのような処理が行われるかは、コンパイラやOS(Operating System)などの、プログラム実行環境によって決定される。
(ループ)
図4では、関数transfer_image_all内にforeachによって表現されるループ処理が記述されている。このループ処理では、参照データstreamsが参照する配列データに*streamsでアクセスして、該配列データの個々の要素を参照データsで参照しながら、ループ処理の内部で関数transfer_imageを実行するという処理である。
図4では、関数transfer_image_all内にforeachによって表現されるループ処理が記述されている。このループ処理では、参照データstreamsが参照する配列データに*streamsでアクセスして、該配列データの個々の要素を参照データsで参照しながら、ループ処理の内部で関数transfer_imageを実行するという処理である。
(参照関係情報と参照関係対)
解析部11は、第一のプログラム21を解析して第一の参照関係情報を生成する。この解析は、第一のプログラム21の定義文や実行文に記載されている内容に基づく静的な解析である。図6は、図4に示した第一のプログラム21を解析して得られた参照関係情報の一例を示す図である。第一の参照関係情報は、ある被参照データがある参照データから参照されているかどうかの情報を示している。図6は、参照データと被参照データの参照関係を示す表である。
解析部11は、第一のプログラム21を解析して第一の参照関係情報を生成する。この解析は、第一のプログラム21の定義文や実行文に記載されている内容に基づく静的な解析である。図6は、図4に示した第一のプログラム21を解析して得られた参照関係情報の一例を示す図である。第一の参照関係情報は、ある被参照データがある参照データから参照されているかどうかの情報を示している。図6は、参照データと被参照データの参照関係を示す表である。
(確実な参照関係と不確実な参照関係と非参照関係)
参照関係情報には、「確実」な参照関係と、「不確実」な参照関係と、参照関係がない「非参照関係」の3種類がある。各参照関係が確実または不確実を示す情報を参照確実性情報と呼ぶ。図6では、例えば参照データimages_1と被参照データinput_imagesの参照確実性情報は不確実であることを示している。なお、非参照関係については、本実施の形態のプログラム最適化の処理で用いないため、図6に示す第一の参照関係情報に含めていない。
参照関係情報には、「確実」な参照関係と、「不確実」な参照関係と、参照関係がない「非参照関係」の3種類がある。各参照関係が確実または不確実を示す情報を参照確実性情報と呼ぶ。図6では、例えば参照データimages_1と被参照データinput_imagesの参照確実性情報は不確実であることを示している。なお、非参照関係については、本実施の形態のプログラム最適化の処理で用いないため、図6に示す第一の参照関係情報に含めていない。
参照関係が確実であるとは、参照データが被参照データを常に参照することや、参照データが被参照データを参照する場合があるということも含む。そのため、参照確実性情報が確実であることを示していても、参照データが被参照データを参照しないことがあっても良い。参照関係が不確実であるとは、参照データが被参照データを参照することがあるかないか判断できないことを意味する。参照関係がないとは、参照データが被参照データを参照することはないとみなす。
図4の第一のプログラム21では、被参照データであるinput_imagesとwaitingとflagが、externalな関数transfer_image_allの引数として指定される可能性がある。しかし、これらの被参照データが実際に引数として指定されるかは関数transfer_image_allを呼び出す処理も全て特定した上で、全て解析可能でなければ判断できない。このため、図6の第一の参照関係情報の時点では、参照確実性情報は不確実を示している。
図4のタスクprepareとタスクgetのローカルデータであるid_1とid_2は、C言語の場合と同様に関数の外部で利用することができない。このため、被参照データid_1とid_2は、図4の第一のプログラム21が含む参照データから参照されない非参照関係と解析可能である。なお、前提として、関数put_tokenの第二引数は値渡しということを知っている、言いかえると、被参照データid_1を参照する参照データが関数get_tokenなどで利用されないということを知っている。以上のことから、被参照データid_1とid_2は参照データから参照されないため、図6の第一の参照関係情報には含めていない。
(参照依存関係情報)
解析部11は、第一のプログラムを解析して参照依存関係情報を抽出する。図7は、図4に示した第一のプログラム21を解析して得られた参照依存関係情報の一例を示す図である。参照依存関係とは、ある参照関係を仮定すると他の参照関係も仮定できる関係を示す。例えば、参照関係Aが確実であるとみなすと参照関係Bがあるとみなしてよいという関係や、参照関係Cが非参照関係であるとみなすと参照関係Dが非参照関係であるとみなしてよいという関係や、参照関係Eが確実であるとみなすと参照関係Fが非参照関係であるとみなしてよいという関係等である。
解析部11は、第一のプログラムを解析して参照依存関係情報を抽出する。図7は、図4に示した第一のプログラム21を解析して得られた参照依存関係情報の一例を示す図である。参照依存関係とは、ある参照関係を仮定すると他の参照関係も仮定できる関係を示す。例えば、参照関係Aが確実であるとみなすと参照関係Bがあるとみなしてよいという関係や、参照関係Cが非参照関係であるとみなすと参照関係Dが非参照関係であるとみなしてよいという関係や、参照関係Eが確実であるとみなすと参照関係Fが非参照関係であるとみなしてよいという関係等である。
図7(a)は、ある参照関係対が非参照関係であると仮定した場合に、当該仮定の結果として非参照関係であると仮定できる参照関係対を示している。図7(a)の、左側は非参照関係を仮定する参照関係対を示し、右側は同一段の左側の参照関係対の仮定に対し非参照関係とみなすことができる参照関係対を示している。
図7(b)は、ある参照関係対が参照関係であると仮定した場合に、当該仮定の結果として参照関係であると仮定できる参照関係対を示している。図7(b)の、左側は参照関係を仮定する参照関係対を示し、右側は同一段の左側の参照関係対が参照関係の仮定に対し参照関係とみなすことができる参照関係対を示している。
例えば、図7(a)の一段目は、参照関係対images_2とinput_imagesが非参照関係とみなせるのであれば、参照関係対images_1とinput_imagesも非参照関係とみなせることを示す。これは、関数transfer_imageがinternalと指定されているため、関数transfer_image_allからの関数コールが唯一の関数コールであり、かつ参照データimages_1とimages_2が実質的に等価であることによる。したがって、参照データimages_2が被参照データinput_imagesを参照しないのであれば、参照データimages_1も被参照データinput_imagesを参照しないという情報が得られる。
また、参照データのデータフローを解析することにより、参照依存関係を解析することが可能である。例えば、図4の参照データstreamsが参照する被参照データである配列の要素は、参照データsから参照される。したがって、参照データsは参照データstreamと等価である。このため、参照データstreamsから参照データsを経由して参照データstreamへのデータフローを考慮すると、参照データstreamsが被参照データinput_imagesを参照しないのであれば、参照データsも被参照データinput_imagesを参照しないと解析できる。同様にして、その他の参照依存関係も解析可能である。
なお、参照依存関係情報は図7の形式に限定されず、第一の参照関係対の参照関係とその場合に推定される第二の参照関係対の参照関係との対応を示す情報であればよい。また、参照依存関係情報は全ての参照依存関係を含んでいなくてもよい。
(トレース情報)
解析部11は、第一のプログラム21を実行し、実行中のデータアクセスを記録したトレース情報を生成する。図8は、図4の第一のプログラム21を実行して得たトレース情報の一例を示す図である。トレース情報とは、参照データを利用して間接アクセスした被参照データを特定可能な情報を含む。図8では、データを間接アクセスするデータアクセス命令と当該データアクセス命令によりアクセスされたデータとを示している。なお、トレース情報には全てのデータアクセスが記録されている必要はない。
解析部11は、第一のプログラム21を実行し、実行中のデータアクセスを記録したトレース情報を生成する。図8は、図4の第一のプログラム21を実行して得たトレース情報の一例を示す図である。トレース情報とは、参照データを利用して間接アクセスした被参照データを特定可能な情報を含む。図8では、データを間接アクセスするデータアクセス命令と当該データアクセス命令によりアクセスされたデータとを示している。なお、トレース情報には全てのデータアクセスが記録されている必要はない。
図8で、アクセスされたデータunknown_0x50000000は、アドレス0x500000000にあるが特定できない被参照データにアクセスしたことを示す。すなわち、第一のプログラム21外の被参照データにアクセスしたことが考えられる。図8のデータアクセス命令*images_1は、被参照データinput_imagesと特定できない被参照データunknown_0x50100000とにアクセスしたことを示す。
トレース情報は、プログラムを実行して得るため、図4の第一のプログラム21を静的に解析しただけでは得られない情報が得られる可能性がある。
(データアクセス回数情報)
解析部11は、第一のプログラム21を実行し、実行中のデータアクセス回数を記録したアクセス回数情報を生成する。なお、この実行は、トレース情報と同時に行ってもよいし、トレース情報とは別に行ってもよい。
解析部11は、第一のプログラム21を実行し、実行中のデータアクセス回数を記録したアクセス回数情報を生成する。なお、この実行は、トレース情報と同時に行ってもよいし、トレース情報とは別に行ってもよい。
図9は、図4の第一のプログラム21を実行して得た被参照データごとのアクセス回数情報の一例を示す図である。データアクセス回数は、各データへの直接データアクセスの回数や間接データアクセスの回数、または両者の和であり、これらのうちどれを用いてもよい。図9では直接データアクセスと間接データアクセスの和を示している。図9では、例えば、input_imagesには10000回のデータアクセスがあったことを示す。なお、アクセス回数情報には全てのデータアクセスが記録されている必要はない。
(タスクグループとグループアクセス情報)
解析部11は、第一のプログラム21を解析して、タスクグループにおける直接データアクセスと間接データアクセスの所属関係を示すグループアクセス情報を生成する。図10は、図4の第一のプログラム21から得たグループアクセス情報の一例を示す図である。
解析部11は、第一のプログラム21を解析して、タスクグループにおける直接データアクセスと間接データアクセスの所属関係を示すグループアクセス情報を生成する。図10は、図4の第一のプログラム21から得たグループアクセス情報の一例を示す図である。
タスクグループは1以上のタスクを含む。ここでは、タスクprepareからなるタスクグループと、タスクgetからなるタスクグループと、の2つを定義している。図10では、各被参照データへの直接データアクセスを黒丸で、間接データアクセスを白丸で、アクセスがない部分を空欄で表現している。例えば、input_imagesへのデータアクセスは、タスクprepareにおけるstream101と、タスクgetにおけるimages_1102と、の間接データアクセスである。
グループアクセス情報により、各データに対する直接データアクセスと間接データアクセスが、どのタスクグループに所属しているかを特定することができる。図10は、各タスクグループとして第一のプログラムにあるタスクのコードを併記しているが、実際のグループアクセス情報の形式はこれに限定されない。グループアクセス情報は、被参照データごとに、各タスクグループにおけるアクセス(直接データアクセス、間接データアクセス、アクセスがない)を示す情報であればよい。
(プログラム情報)
図11は、図4の第一のプログラム21のプログラム情報の一例を示す図である。プログラム情報は、最適化部16が第一のプログラムを最適化して第二のプログラムを構築するために用いられる。プログラム情報は、第一のプログラムの実質的な内容を示す情報である。なお、本実施の形態では、図4の第一のプログラム21そのものをプログラム情報としているが、機械語等に変換した結果をプログラム情報としてもよい。また、プログラム情報としては、例えば、第一のプログラム21の構造を示す情報や、第一のプログラムの構造を異なる構造に変換した内部データ構造を示す情報や、関数に関する情報や、データに関する情報などがある。プログラム情報としてどのような情報を保持すべきかは、どのような第一のプログラムを入力して、どのような第二のプログラムを出力するかに依存するため、様々な情報がプログラム情報になる。
図11は、図4の第一のプログラム21のプログラム情報の一例を示す図である。プログラム情報は、最適化部16が第一のプログラムを最適化して第二のプログラムを構築するために用いられる。プログラム情報は、第一のプログラムの実質的な内容を示す情報である。なお、本実施の形態では、図4の第一のプログラム21そのものをプログラム情報としているが、機械語等に変換した結果をプログラム情報としてもよい。また、プログラム情報としては、例えば、第一のプログラム21の構造を示す情報や、第一のプログラムの構造を異なる構造に変換した内部データ構造を示す情報や、関数に関する情報や、データに関する情報などがある。プログラム情報としてどのような情報を保持すべきかは、どのような第一のプログラムを入力して、どのような第二のプログラムを出力するかに依存するため、様々な情報がプログラム情報になる。
(反映部12)
反映部12は、トレース情報と参照依存関係情報を利用して、第一の参照関係情報を中間参照関係情報に変換する。図12は、図7の参照依存関係情報と図8のトレース情報を用いて図6の第一の参照関係情報を変換した中間参照関係情報の一例を示す図である。
反映部12は、トレース情報と参照依存関係情報を利用して、第一の参照関係情報を中間参照関係情報に変換する。図12は、図7の参照依存関係情報と図8のトレース情報を用いて図6の第一の参照関係情報を変換した中間参照関係情報の一例を示す図である。
図8のトレース情報は、参照データimages_1を利用して被参照データinput_imagesにアクセスしたことを示している。このため、反映部12は、参照データimages_1と被参照データinput_imagesの参照確実性情報を不確実から確実に変更している。さらに、反映部12は、図7の参照依存関係情報を利用して、参照データimages_2と被参照データinput_imagesの参照確実性情報を不確実から確実に変更している。
このように、反映部12は、第一の参照関係情報にトレース情報および参照依存関係情報を反映させることにより、第一の参照関係情報を中間参照関係情報に変換する。したがって、中間参照関係情報では、第一の参照関係情報に比べ、プログラム最適化装置10のユーザが、参照関係の有無を判断しなければならない不確実な参照関係対が減っている。すなわち、ユーザが負担しなければならない指示コストが減っている。なお、反映部12は、参照依存関係情報を利用せずに、トレース情報のみを利用して、第一の参照関係情報を中間参照関係情報に変換しても良い。
(生成部13)
生成部13は、アクセス回数情報、グループアクセス情報などを用いて順位情報を生成し、順位情報に基づいて中間参照関係情報から提示情報を生成する。生成部13は、表示部4へ生成した提示情報を表示するよう指示し、表示部4に提示情報が表示される。
生成部13は、アクセス回数情報、グループアクセス情報などを用いて順位情報を生成し、順位情報に基づいて中間参照関係情報から提示情報を生成する。生成部13は、表示部4へ生成した提示情報を表示するよう指示し、表示部4に提示情報が表示される。
(順位情報)
順位情報とは、参照関係対に優先順位を与えるために利用する情報である。なお、参照関係がないと仮定した場合に性能が高くなる参照関係対に高い順位を与えることが望ましい。したがって、順位情報は、少なくとも参照確実性情報が「不確実」である参照関係対に対して与える。以下では、参照関係がないと仮定した場合に性能が高くなる参照関係対を判定する指標として、参照関係対が属する関数のアクセス属性、グループアクセス情報、被参照データのアクセス回数等を用いる例について説明する。本実施の形態では、複数の条件による順位付けを段階的に行うことにより、最も順位の高い参照関係対に関する提示情報を生成する。
順位情報とは、参照関係対に優先順位を与えるために利用する情報である。なお、参照関係がないと仮定した場合に性能が高くなる参照関係対に高い順位を与えることが望ましい。したがって、順位情報は、少なくとも参照確実性情報が「不確実」である参照関係対に対して与える。以下では、参照関係がないと仮定した場合に性能が高くなる参照関係対を判定する指標として、参照関係対が属する関数のアクセス属性、グループアクセス情報、被参照データのアクセス回数等を用いる例について説明する。本実施の形態では、複数の条件による順位付けを段階的に行うことにより、最も順位の高い参照関係対に関する提示情報を生成する。
例えば、各参照関係対の被参照データへのアクセス回数に基づいて多段階の順位付けをすることができる。なお、複数の参照関係対に同じ順位が与えられても良い。これにより、ユーザに参照関係の入力を促すための提示情報を効率的に示すことができる。
(関数のアクセス属性による順位付け)
生成部13は、最適化部16がタスクのデータ配置に関する最適化を行うことができるように、関数の属性による順位付けを行う。具体的には、参照確実性情報が「不確実」である参照関係対に対して、externalの関数で利用されている参照データを含む参照関係対に高い順位を与える。
生成部13は、最適化部16がタスクのデータ配置に関する最適化を行うことができるように、関数の属性による順位付けを行う。具体的には、参照確実性情報が「不確実」である参照関係対に対して、externalの関数で利用されている参照データを含む参照関係対に高い順位を与える。
図13は、関数の属性による順位付けの一例を示す図である。生成部13は、中間参照関係情報の各参照関係対が属する関数ごとに分類する。図13の上図は、external関数に属する参照関係情報を示している。図13の下図は、internal関数に属する参照関係情報を示している。図13に示すように、external関数の優先順位をinternal関数より高く設定している。なお、参照関係が確実な参照関係対については黒塗りで表現している。生成部13は、この順位付けした情報を、第一の順位情報として記憶部17に格納する。
これは、外部から呼び出される可能性があるexternalの関数から参照データのフローを追うことで、ユーザによる解析時間を短縮することを期待していることによる。internalの関数から追うと、externalの関数を経由して参照データのフローを追っていく必要がある。
(グループアクセス情報による順位付け)
生成部13は、中間参照関係情報を用いてグループアクセス情報を更新する。そして、生成部13は、更新後のグループアクセス情報に基づいて、直接データアクセスと間接データアクセスに応じて参照関係対に優先順位を与える。
生成部13は、中間参照関係情報を用いてグループアクセス情報を更新する。そして、生成部13は、更新後のグループアクセス情報に基づいて、直接データアクセスと間接データアクセスに応じて参照関係対に優先順位を与える。
図14は、図12の中間参照関係情報を用いて、図10のグループアクセス情報を更新した一例を示す図である。図14では、間接データアクセスを、確実な参照関係と不確実な参照関係とに分類している。図12の中間参照関係情報では、参照データimages_1と被参照データinput_imagesの参照確実性情報が「確実」である。このため、この参照関係対に対応する欄を確実な参照関係の間接データアクセス104としている。一方、参照データstreamと被参照データinput_imagesは、参照確実性フラグが不確実な参照関係対に対応するため、不確実な参照関係の間接データアクセス103としている。
生成部13は、グループアクセス情報を利用して、各被参照データ毎に、確実タスクグループと不確実タスクグループと無アクセスタスクグループとの3つに分類したタスクグループの属性情報を生成する。確実タスクグループとは、該被参照データへの直接データアクセスもしくは参照確実性情報が「確実」である参照関係対の参照データによる間接データアクセスを含むタスクグループである。不確実タスクグループとは、確実グループではなく、該被参照データへの参照確実性情報が「不確実」である参照関係対の参照データによる間接データアクセスを含むタスクグループである。無アクセスタスクグループとは、該被参照データにアクセスしない、もしくは、アクセスしないとみなされるタスクグループである。
図15は、図14のグループアクセス情報から得られた、各被参照データに関するタスクグループの属性情報の一例を示す図である。例えば、被参照データinput_imagesについてのタスクprepareを含むタスクグループの属性は、参照確実性フラグが不確実な参照関係対を利用した間接データアクセスのみを含むため、不確実タスクグループである。被参照データinput_imagesについてのタスクgetを含むタスクグループの属性は、参照確実性フラグが確実な参照関係対を利用した間接データアクセスを含むため、確実タスクグループである。被参照データwaitingについてのタスクprepareを含むタスクグループの属性は、直接データアクセスを含むため、確実タスクグループである。他の部分についても同様にタスクグループ属性が決定される。なお、図15の空欄は、無アクセスタスクグループを示す。
図16は、図15のタスクグループ属性情報を利用して、図13で高い順位が与えられたexternal関数に属する参照関係対に対してさらに優先順位を与えた結果を示す図である。具体的には、生成部13は、確実タスクグループの数と不確実タスクグループの数の和が2以上、かつ、確実タスクグループの数が1以下となる被参照データを有する参照関係対に高い順位を与え、順位情報を更新し記憶部17に格納する。例えば、図15に示す被参照データinput_imagesは、確実タスクグループの数と不確実タスクグループの数の和が2であり、かつ、確実タスクグループの数が1である。したがって、input_imagesを被参照データとする参照関係対には高い順位を与える。また、例えば、図15に示す被参照データwaitingは、確実タスクグループの数が2であるため、低い順位を与える。
(アクセス回数による順位付け)
図17は、図16に示した提示条件が成立した参照関係対に対して、さらにアクセス回数による順位付けを行った結果を示す図である。
図17は、図16に示した提示条件が成立した参照関係対に対して、さらにアクセス回数による順位付けを行った結果を示す図である。
具体的には、生成部13は、被参照データのアクセス回数が多い参照関係対に高い順位を与える。図9のアクセス回数情報によると、input_imagesへのアクセスは10000回なのに対して、flagへのアクセスは120回である。したがって、被参照データinput_imagesの参照関係対に高い順位を与え、順位情報を更新し記憶部17に格納する。
(提示情報)
図18は、最終的に最も高い順位を与えられた参照関係対を示す提示情報の一例を示す図である。図18の例では、表示部4に画面表示される提示情報として、図17で最も高い順位を与えられた参照データstreamsと被参照データinput_imagesの参照関係を示している。上段は提示情報そのものを示し、下段はユーザからの入力を受け付けるためのボタンが表示されている。ユーザが、下段の「確実な参照関係」のボタン、または「非参照関係」のボタンを例えばマウス等により選択すると、入力部2が選択されたボタンに応じた入力情報を指示部14へ通知する。なお、画面の表示は、同等の情報を表示してユーザからの入力を受け付けることができればよい。提示情報の形式は、例えば、テキストファイルやバイナリファイルのような記憶部3上のデータとして提示情報を生成し、表示部4や印刷等によりユーザが認識できるようにしてもよい。
図18は、最終的に最も高い順位を与えられた参照関係対を示す提示情報の一例を示す図である。図18の例では、表示部4に画面表示される提示情報として、図17で最も高い順位を与えられた参照データstreamsと被参照データinput_imagesの参照関係を示している。上段は提示情報そのものを示し、下段はユーザからの入力を受け付けるためのボタンが表示されている。ユーザが、下段の「確実な参照関係」のボタン、または「非参照関係」のボタンを例えばマウス等により選択すると、入力部2が選択されたボタンに応じた入力情報を指示部14へ通知する。なお、画面の表示は、同等の情報を表示してユーザからの入力を受け付けることができればよい。提示情報の形式は、例えば、テキストファイルやバイナリファイルのような記憶部3上のデータとして提示情報を生成し、表示部4や印刷等によりユーザが認識できるようにしてもよい。
図18では、提示情報として1つの参照関係対を表示・選択しているが、複数の参照関係対を表示し、それぞれ選択させるようにしてもよい。図19は、タスクグループ属性およびアクセス回数による順序付けで順位の高い順に提示情報として表示した例を示している。
なお、生成部13は、順位付けを行う順序を変更可能である。本実施の形態では、関数の属性、タスクグループ属性、データアクセス回数の順序で順位付けの説明を行った。順位付けは、例えば、先にタスクグループ属性、次に関数の属性等、どのような順序で行ってもよい。また、生成部13は、順位付けを少なくとも1つ以上行って提示情報を生成してもよい。
また、提示情報の選択方法は、例えば、各段階で全ての参照関係対に点数を与え、最後に合計の点数が高い順位を示す参照関係対を提示情報としてもよい。
さらに、上述した3つの順位付け以外、例えば、特定の被参照データに関する参照関係対か否か等により順位付けを行ってもよい。あるいは、生成部13は、順位付けを行わなくてもよい。例えば、生成部13は、中間参照関係情報全体を提示情報に含めたり、参照確実性情報が「不確実」な1つ以上の参照関係対をランダムに選んで提示情報としてもよい。
(指示部14)
指示部14は、入力部2からの入力情報に基づいて参照指示情報を生成する。例えば、ある参照関係対に対して「非参照関係」が選択された場合、指示部14は、その参照関係対が「非参照関係」であることを示す参照指示情報を生成して記憶部17へ格納する。図20は、図18において非参照関係が選択された入力情報に基づいて生成された参照指示情報を示す図である。
指示部14は、入力部2からの入力情報に基づいて参照指示情報を生成する。例えば、ある参照関係対に対して「非参照関係」が選択された場合、指示部14は、その参照関係対が「非参照関係」であることを示す参照指示情報を生成して記憶部17へ格納する。図20は、図18において非参照関係が選択された入力情報に基づいて生成された参照指示情報を示す図である。
(変換部15)
変換部15は、参照指示情報および参照依存関係情報を用いて、中間参照関係情報を第二の参照関係情報に変換し、記憶部17に格納する。
変換部15は、参照指示情報および参照依存関係情報を用いて、中間参照関係情報を第二の参照関係情報に変換し、記憶部17に格納する。
図21は、図20の参照指示情報と図7の参照依存関係情報を用いて、図12の中間参照関係情報を変換した第二の参照関係情報の一例を示す図である。なお、図12の中間参照関係情報では、参照データstreamsと被参照データinput_imagesの参照確実性フラグが不確実であったが、参照指示情報により該参照関係対は非参照関係とみなすと指示されたため、図21の第二の参照関係情報では、該参照関係対が削除されている(図中では、黒塗りで示す)。該参照関係対が非参照関係とみなされたことにより、図7の参照依存関係情報により、参照データsとstreamも被参照データinput_imagesと非参照関係にあるとみなせる。したがって、図21の第二の参照関係情報では、これらの参照関係対も該参照関係対が削除されている。
参照依存関係情報を用いる利点は、(A)1つの参照関係対への指示で複数の参照関係対に指示を与えられることと、(B)指示を与える参照関係対と指示の効果を得たい参照関係対を切り離せることである。
上記(A)は、少ない指示で多くの参照関係に指示を与えられるということを意味しており、ユーザの与えた少ない指示により第一のプログラム21を解析するコストや、ユーザが参照指示情報を作るコストを削減することができる。
上記(B)は、ユーザが直感的に指示を与えられるということを意味している。例えば、図12の中間参照関係情報の中で参照関係を明確にしたい参照関係対は、図14のグループアクセス情報で不確実な参照関係の間接データアクセスである参照データstreamまたはimages_1と各被参照データである。参照データstreamと被参照データinput_imagesの参照関係対に指示を与えるとき、参照依存関係情報を利用しない場合、以下の(1)から(5)の作業を実施することになる。
(1)参照データstreamは関数transfer_imageの引数であることを見つける。
(2)関数transfer_imageはinternal属性であるから、関数transfer_image_allの中に唯一の関数コールがあることを突き止める。
(3)関数transfer_imageの引数sはforeach文によりstreamsから得られることを突き止める。
(4)参照データstreamsは関数transfer_image_allの引数であることを見つける。
(5)関数transfer_image_allの全関数コールの引数を解析し、参照データstreamがアクセスするデータを突き止めて参照指示情報を与える。
(1)参照データstreamは関数transfer_imageの引数であることを見つける。
(2)関数transfer_imageはinternal属性であるから、関数transfer_image_allの中に唯一の関数コールがあることを突き止める。
(3)関数transfer_imageの引数sはforeach文によりstreamsから得られることを突き止める。
(4)参照データstreamsは関数transfer_image_allの引数であることを見つける。
(5)関数transfer_image_allの全関数コールの引数を解析し、参照データstreamがアクセスするデータを突き止めて参照指示情報を与える。
これに対し、本実施の形態では、参照依存関係情報を利用することにより、上記(1)から(4)を生成部13が行う。このため、ユーザは(1)から(4)を行う必要はない。また、参照依存関係情報を利用しないと、非直感的な指示を参照データstreamに対して行う必要がある。本実施の形態によれば、ユーザは参照データstreamsに対してボタンによる直観的な指示を行うことができる。
また、上記説明では、2つの簡単な関数しか存在しないが、さらに多くの関数が存在する、もしくは、より複雑なコードになっている場合においても、本実施の形態の参照依存関係情報を利用することにより、さらにユーザの作業量を削減できる。
(最適化部16)
最適化部16は、第二の参照関係情報を用いて、プログラム情報から最適化された第二のプログラム22を構築して出力する。具体的には、最適化部16は、第二の参照関係情報を用いてグループアクセス情報を更新し、この更新後のグループアクセス情報に基づいてタスクグループの属性情報を求める。そして、最適化部16は、タスクグループの属性情報に基づいて、1つのタスクグループでのみ利用されている被参照データに対して、プログラム情報内の該被参照データの定義位置を特定し、プログラム情報の当該定義位置に最適化キーワードoptimized taskを挿入した第二のプログラム22を構築する。
最適化部16は、第二の参照関係情報を用いて、プログラム情報から最適化された第二のプログラム22を構築して出力する。具体的には、最適化部16は、第二の参照関係情報を用いてグループアクセス情報を更新し、この更新後のグループアクセス情報に基づいてタスクグループの属性情報を求める。そして、最適化部16は、タスクグループの属性情報に基づいて、1つのタスクグループでのみ利用されている被参照データに対して、プログラム情報内の該被参照データの定義位置を特定し、プログラム情報の当該定義位置に最適化キーワードoptimized taskを挿入した第二のプログラム22を構築する。
図22は、図10のグループアクセス情報を、図21の第二の参照関係情報を用いて更新した例を示す図である。図14との相違点は、図14の不確実な参照関係のデータアクセス103を削除したことである。これは、図21の第二の参照関係情報で参照データstreamと被参照データinput_imagesが非参照関係であり、間接アクセス*streamが被参照データinput_imagesをアクセスしないとみなしたためである。
図23は、図22のグループアクセス情報から得られた、各被参照データのタスクグループの属性を示す図である。図15との相違点は、図14の不確実な参照関係のデータアクセス103を削除したことにより、被参照データinput_imagesがタスクprepareを含むタスクグループではアクセスされないとみなされることである(図22では空欄となる)。
図24は、図22のタスクグループの属性情報を利用して、図11のプログラム情報に基づいて、被参照データに最適化指示optimized taskキーワードを与えた第二のプログラム22の一例を示す図である。
optimized taskキーワードは、指定された被参照データがその後に続くタスクを含むタスクグループのみで利用されることを示している。コンパイラは、optimized taskキーワードに基づいて最適化を行うことができる。例えば、図24では、id_1の定義文にoptimized task prepareキーワードが付与されている。このため、コンパイラは、被参照データid_1に対して、タスクprepareのための最適化を行うことができる。同様に、被参照データinput_imagesとid_2に対してタスクgetのための最適化を行うことができる。
参照確実性情報が「不確実」な全ての参照関係対に対して参照指示情報を与える必要はなく、図21に示すように、第二の参照関係情報に参照確実性情報が「不確実」な参照関係対が残っていても良い。最適化部16は、参照確実性情報が「不確実」のままの参照関係対を、本実施例のように参照確実性情報が「確実」な参照関係対として扱っても良いし、該参照関係対を無視して非参照関係として扱っても良い。しかしながら、正しい参照関係を表現する参照関係対を無視した場合、正しく動作する第二のプログラム22を生成できない場合がある。このため、参照確実性情報が「不確実」のままの参照関係対を無視して非参照関係対として扱う場合には、(1)そのような参照関係対を無視せずに参照確実性情報を「確実」として扱うこともできるようにする方法と、(2)無視した場合は第二のプログラム22が正しく動作しない可能性があることを伝える方法を提供することが望ましい。
(プログラムのバリエーション)
第一のプログラム21と第二のプログラム22は、図4で例示した言語に限らず、例えば、C言語やJava(登録商標)のようなプログラミング言語で書かれたテキストファイル、もしくは独自のプログラミング言語で書かれたテキストファイルであってもよい。また、第一のプログラム21と第二のプログラム22は、実行バイナリなどのバイナリファイルであってもよい。また、第一のプログラム21と第二のプログラム22は、1つのファイルに全ての情報が入っている必要はなく、複数に分割されていてもよい。また、第一のプログラム21と第二のプログラム22は、ファイルという形式でなく、記憶部3上のデータであってもよい。例えば、C言語の構文解析装置が生成したメモリ上のデータである構文木を第一のプログラム21と第二のプログラム22として入出力してもよい。
第一のプログラム21と第二のプログラム22は、図4で例示した言語に限らず、例えば、C言語やJava(登録商標)のようなプログラミング言語で書かれたテキストファイル、もしくは独自のプログラミング言語で書かれたテキストファイルであってもよい。また、第一のプログラム21と第二のプログラム22は、実行バイナリなどのバイナリファイルであってもよい。また、第一のプログラム21と第二のプログラム22は、1つのファイルに全ての情報が入っている必要はなく、複数に分割されていてもよい。また、第一のプログラム21と第二のプログラム22は、ファイルという形式でなく、記憶部3上のデータであってもよい。例えば、C言語の構文解析装置が生成したメモリ上のデータである構文木を第一のプログラム21と第二のプログラム22として入出力してもよい。
また、第一のプログラム21と第二のプログラム22は、必要な処理を全て内包してある必要はなく、大きなプログラムの一部分でもよい。また、第一のプログラム21と第二のプログラム22は、異なる形式で表現されていても良い。例えば、第一のプログラム21はC言語で記述されたテキストファイルであり、第二のプログラム22は記憶部3上に記録された実行バイナリであっても良い。
(参照データと被参照データのバリエーション)
参照データと被参照データの関係は相対的なものであり、参照データかつ被参照データとなるデータがあっても良い。例えば、C言語では、通常のデータとポインタのデータは被参照データと参照データの関係であり、同時に、ポインタのデータと当該ポインタのアドレスを示すポインタのデータとは被参照データと参照データの関係である。この場合、ポインタのデータは参照データでもあり被参照データでもある。
参照データと被参照データの関係は相対的なものであり、参照データかつ被参照データとなるデータがあっても良い。例えば、C言語では、通常のデータとポインタのデータは被参照データと参照データの関係であり、同時に、ポインタのデータと当該ポインタのアドレスを示すポインタのデータとは被参照データと参照データの関係である。この場合、ポインタのデータは参照データでもあり被参照データでもある。
(直接データアクセスと間接データアクセスのバリエーション)
直接データアクセスと間接データアクセスの表現方法は、プログラムの記述や記述方式や実行環境などによって様々存在する。例えば、C++言語では、図4の第一のプログラム21のwaitingがユーザ定義型で被参照データAと参照データBを含み、オーバーロードした演算子+=で被参照データAと参照データBが参照する被参照データCにアクセスしているなら、waiting+=1は被参照データAへの直接データアクセスと被参照データCへの間接データアクセスを含む。
直接データアクセスと間接データアクセスの表現方法は、プログラムの記述や記述方式や実行環境などによって様々存在する。例えば、C++言語では、図4の第一のプログラム21のwaitingがユーザ定義型で被参照データAと参照データBを含み、オーバーロードした演算子+=で被参照データAと参照データBが参照する被参照データCにアクセスしているなら、waiting+=1は被参照データAへの直接データアクセスと被参照データCへの間接データアクセスを含む。
間接データアクセスでは、参照データを利用して被参照データにアクセスする際に、被参照データへの間接データアクセスだけではなく、参照データへの直接データアクセスも発生してもよい。例えば、図4の例では、*streamによって、参照データstreamへの直接アクセスと参照データstreamが指し示す被参照データへの間接アクセスが行われる。
(参照関係情報のバリエーション)
参照関係対の構造は、参照データと被参照データが直接結びついた構造である必要はなく、参照データと被参照データの間接的な参照関係を表現していても良い。図25は、参照データと被参照データの間接的な参照関係を表現する一例を示す図である。図25の左側に示したプログラムでは、被参照データaは、参照データpから参照された後、参照データpを参照データqに代入している。このプログラムから得られる参照データqと被参照データaの参照関係の表現方法は、図25の右上の構造が示すように直接的に参照関係を表現する方法と、右下の構造が示すように間接的に参照関係を表現する方法がある。
参照関係対の構造は、参照データと被参照データが直接結びついた構造である必要はなく、参照データと被参照データの間接的な参照関係を表現していても良い。図25は、参照データと被参照データの間接的な参照関係を表現する一例を示す図である。図25の左側に示したプログラムでは、被参照データaは、参照データpから参照された後、参照データpを参照データqに代入している。このプログラムから得られる参照データqと被参照データaの参照関係の表現方法は、図25の右上の構造が示すように直接的に参照関係を表現する方法と、右下の構造が示すように間接的に参照関係を表現する方法がある。
図25の右下では、参照データpとqが等価であることを示す参照等価関係対105と、参照データpと被参照データaの参照関係を示す参照関係対106と、によって、参照データqと被参照データaの参照関係を間接的に表現している。参照等価関係対を用いる場合、解析部11は、第一のプログラム21に基づいて参照等価関係対を抽出して記憶部17に格納しておき、生成部13による順位付けや最適化部16による第二のプログラム22の生成時等に参照して用いることができる。
参照関係情報の構造は、参照関係対の組み合わせを示す情報があれば良い。例えば、図6のように参照データと被参照データの関係をテーブルの構造で表現しても良いし、例えば、参照データと被参照データの組み合わせによる構造体のデータを要素とする配列で表現しても良い。また、例えば、参照データと被参照データをノードとして、ノード間のエッジが参照関係対を示すようなグラフの構造でも良い。
第一の参照関係情報を生成した段階で、参照確実性情報が確実な参照関係対が存在しても良い。図26は、第一のプログラム21の別の一例を示す図である。例えば、図26のプログラムでは、refキーワードを利用して、行201で「p = ref a」として被参照データaの参照データを参照データpに代入している。このような場合、解析部11は、第一の参照関係情報を生成する際に、参照データpと被参照データaの参照確実性情報を確実と設定しても良い。
(参照依存関係情報のバリエーション)
参照依存関係情報は、参照関係対の間の依存を推定できる情報であれば良い。図7は参照関係の依存を直接表現しているが、このような形式に限定されない。例えば、参照データimages_1とimages_2が等価であるという情報や参照データのデータフロー等を参照依存関係情報として保持しておけば、間接的にimages_1とimages_2を参照データとする参照関係対に関する参照依存関係を推定できる。
参照依存関係情報は、参照関係対の間の依存を推定できる情報であれば良い。図7は参照関係の依存を直接表現しているが、このような形式に限定されない。例えば、参照データimages_1とimages_2が等価であるという情報や参照データのデータフロー等を参照依存関係情報として保持しておけば、間接的にimages_1とimages_2を参照データとする参照関係対に関する参照依存関係を推定できる。
(トレース情報のバリエーション)
トレース情報は、図8に示した形式に限定されず、例えば、参照データの値を記録した情報でも良い。参照データの値とは、例えばメモリアドレスであり、被参照データの場所を特定可能な情報である。参照データの値を記録することにより、実際には間接データアクセスに利用されない参照データの値も含めて、参照データの値から間接データアクセスされる可能性がある被参照データを特定可能である。反映部12が性質の異なるトレース情報も入力できるようにすることにより、様々なトレース情報を利用することが可能となる。
トレース情報は、図8に示した形式に限定されず、例えば、参照データの値を記録した情報でも良い。参照データの値とは、例えばメモリアドレスであり、被参照データの場所を特定可能な情報である。参照データの値を記録することにより、実際には間接データアクセスに利用されない参照データの値も含めて、参照データの値から間接データアクセスされる可能性がある被参照データを特定可能である。反映部12が性質の異なるトレース情報も入力できるようにすることにより、様々なトレース情報を利用することが可能となる。
(アクセス回数情報のバリエーション)
アクセス回数情報は、第一のプログラム21を実行して得られたデータアクセス回数ではなく、第一のプログラム21を解析して得られたデータアクセスの推定回数でも良い。例えば、図26のプログラムでは、(1)参照データpが被参照データである配列aを参照していることを解析可能であり、(2)forループが5回転であることを解析可能であり、(3)ループ内部で参照データpが参照する被参照データである配列aの要素に1を加えるために読み込みと書き込みの計2回のアクセスを行うことを解析可能である。このため、図25のプログラムを実行すると被参照データaに10回アクセスすることを推定可能である。
アクセス回数情報は、第一のプログラム21を実行して得られたデータアクセス回数ではなく、第一のプログラム21を解析して得られたデータアクセスの推定回数でも良い。例えば、図26のプログラムでは、(1)参照データpが被参照データである配列aを参照していることを解析可能であり、(2)forループが5回転であることを解析可能であり、(3)ループ内部で参照データpが参照する被参照データである配列aの要素に1を加えるために読み込みと書き込みの計2回のアクセスを行うことを解析可能である。このため、図25のプログラムを実行すると被参照データaに10回アクセスすることを推定可能である。
アクセス回数情報は、被参照データが複数の被参照データを内包する場合、内包される各被参照データのアクセス回数情報を保持しても良い。第一のデータが第二のデータを内包するとは、第一のデータが第二のデータを含むデータの集合であることを示す。例えば、C言語の配列は、配列の要素の集合データであり、配列は配列の要素を内包する。また、例えば、C言語の構造体は、構造体のメンバの集合データであり、構造体は構造体のメンバを内包する。
また、例えば、図26のプログラムでは、forループ1回転毎に被参照データaの各要素に読み込みと書き込みの計2回のアクセスを行うという情報を保持しても良い。アクセス回数情報における回数は、様々な単位が存在する。例えば、CPUが発行したload命令とstore命令の個数をアクセス回数としたり、load命令とstore命令によってアクセスされたデータのサイズをアクセス回数としたり、プログラム上に現われる回数をアクセス回数とするなどの単位がある。
(解析部のバリエーション)
本実施の形態では、解析部11が第一の参照関係情報と参照依存関係情報とグループアクセス情報とアクセス回数情報とトレース情報とを求めるようにしたが、1つ以上の情報を外部から解析部11へ入力するようにしても良い。例えば、専用の装置を利用して、グループアクセス情報とアクセス回数情報とトレース情報を生成し、解析部11に入力してもよい。
本実施の形態では、解析部11が第一の参照関係情報と参照依存関係情報とグループアクセス情報とアクセス回数情報とトレース情報とを求めるようにしたが、1つ以上の情報を外部から解析部11へ入力するようにしても良い。例えば、専用の装置を利用して、グループアクセス情報とアクセス回数情報とトレース情報を生成し、解析部11に入力してもよい。
また、プログラム最適化装置10は、解析部11と反映部12と最適化部16のうち、一部もしくは全部を取り除いた装置でも良い。例えば、最適化部16を取り除いたプログラム解析装置を構成することができる。この場合は、変換部15から出力される第二の参照関係情報がプログラム解析装置の出力(参照データと被参照データの参照関係の解析結果)となる。
以上のように、本実施の形態では、解析部11が、第一のプログラム21を解析して参照データと被参照データごとの第一の参照関係情報と参照関係対間の依存性を示す参照依存関係情報と第一のプログラム21の実アクセスに関する情報(トレース情報とアクセス回数情報)とタスクグループごとのグループアクセス情報とプログラム情報とを生成する。これらに基づき最適化効果の高いデータの提示情報を生成することにより、ユーザによる目視解析時間の短縮を実現できる。また、ユーザによる参照指示情報を複数のデータに反映させることにより、ユーザによる目視解析時間の短縮と参照指示情報の入力時間とを短縮できる。
(第2の実施の形態)
次に、第2の実施の形態における解析部11の処理について説明する。本実施の形態のプログラム最適化装置10の構成は第1の実施の形態と同様である。以下、第1の実施の形態と異なる部分を説明する。
次に、第2の実施の形態における解析部11の処理について説明する。本実施の形態のプログラム最適化装置10の構成は第1の実施の形態と同様である。以下、第1の実施の形態と異なる部分を説明する。
本実施の形態では、解析部11は、第一のプログラム21から参照データの等価関係を示す参照等価関係を抽出して、各参照等価関係を表す参照等価関係対を第一の参照関係情報に加える。参照等価関係とは、同じ被参照データを参照する可能性がある第一の参照データと第二の参照データの関係である。参照関係の参照確実性情報と同様に、参照等価関係の状態を示すために、参照等価確実性情報を用いてもよい。
図27は、本実施の形態の第一の参照関係情報の一例を示す図である。図27の上に第一のプログラム21の例を、図27の下に第一の参照関係情報の例を示している。図27の下の第一の参照関係情報では、丸で記載したノードが参照データもしくは被参照データを示し、矢印付きのエッジが参照関係対を示し、矢印無しのエッジが参照等価関係対を示している。参照関係対を示す矢印は、始点が参照データ、終点が被参照データである。実線のエッジは参照確実性情報もしくは参照等価確実性情報が「確実」であることを示し、破線のエッジは参照確実性情報もしくは参照等価確実性情報が「不確実」であることを示す。なお、第一の参照関係情報は、図27の下図のように、各データをノードとし、ノード間を接続するエッジの種別を定義した情報として保持してもよいし、第1の実施の形態と同様に表形式で管理してもよい。
被参照データimageに指定されているinternalキーワードは、図27のプログラムの内部からのみ、被参照データimageへの直接アクセスもしくは被参照データimageが参照されているか否かの情報を取得できることを意味する。解析部11は、第一のプログラム21を解析し、参照データpには、refキーワードによって被参照データimageの参照が代入されていることから、参照データpと被参照データimageの参照確実性情報を「確実」に設定する。参照データarrayは、参照データを要素として格納する配列への参照である。参照データarrayに関しては、参照データarrayが参照する配列の要素index_1と参照データpに対する参照等価関係と、参照データarrayが参照する配列の要素index_2と参照データqに対する参照等価関係と、がある。また、配列の要素index_1とindex_2の関係によっては、参照データpとqも参照等価関係である可能性がある。図27では、参照データarray[index_1]とarray[index_2]に関する参照等価関係を1つのノードarrayにまとめて、エッジとして要素index_1とindex_2を示しているが、参照データarray[index_1]とarray[index_2]を異なるノードとする参照関係情報を出力しても良い。
参照等価関係が確実であるとは、第一の参照データと第二の参照データで構成される参照等価関係対において、第一の参照データと第二の参照データが同じ被参照データを、常に参照するとみなすことや、参照することがあるとみなすことも含む。そのため、参照等価確実性フラグが確実な参照等価関係対であっても、第一の参照データが第二の参照データと同じ被参照データを参照しないことがあっても良い。参照等価関係が不確実であるとは、第一の参照データが第二の参照データと同じ被参照データを参照することがあるかないか判断できないことを意味する。参照等価関係がないとは、第一の参照データが第二の参照データと同じ被参照データを参照することはないとみなすことである。
参照等価関係対の参照確実性情報が「確実」であることは、参照等価関係が確実であることを示す。参照確実性情報が「不確実」であることは、参照等価関係が不確実であることを示す。図27では、解析部11は、参照データarrayが参照する配列の一部index_1と参照データpの参照等価関係が確実であると判断できるため、該参照確実性情報を「確実」に設定する。また、解析部11は、図27の第一のプログラム21だけでは、配列の要素index_1とindex_2の関係を解析できないため、参照データpとqの参照等価確実性情報を「不確実」に設定する。
解析部11は、参照関係対と参照等価関係対の依存関係を解析して参照依存関係情報に追加しても良い。例えば、図27の参照データpと参照データqの参照等価関係がないと仮定すると、被参照データimageにinternalキーワードが指定されているため、参照データqと被参照データimageの参照関係もないとみなせる。例えば、図27の参照データarray[index_1]と参照データarray[index_2]の参照等価確実性情報が「確実」であると仮定すると、参照データqと被参照データimageの参照確実性情報も「確実」であるとみなせる。
同様に、解析部11は、第一の参照等価関係対と第二の参照等価関係対の依存関係を抽出して参照依存関係情報に含めても良い。例えば、図27の参照データarray[index_1]と参照データarray[index_2]の参照等価確実性情報が「確実」であると仮定すると、参照データpと参照データqの参照等価確実性情報も「確実」であるとみなせる。参照依存関係情報は、参照関係対や参照等価関係対の間の依存を推定できる情報であれば良いため、参照等価関係対を図7と同様の形式で参照依存関係情報として利用可能である。
反映部12は、トレース情報を利用して第一の参照関係情報が含む参照等価確実性情報を不確実から確実に変更した中間参照関係情報を生成しても良い。例えば、反映部12は、図27の参照データpとqのトレース情報が入力され、参照データpとqが同じ被参照データを示した記録がトレース情報に含まれているのであれば、第一の参照関係情報の参照データpとqの参照等価確実性情報を、「不確実」から「確実」に変更した中間参照関係情報を生成する。
また、生成部13は、参照等価関係対に関する提示情報を生成しても良い。例えば、生成部13は、参照等価確実性情報が「不確実」な参照等価関係対に関する情報を提示情報に含めても良い。図27の例では、参照データpとqの参照確実性フラグが「不確実」であるため、該参照等価関係対に関する情報を提示情報として出力する。図28は、参照等価関係対に関する提示情報の一例を示す図であり、ユーザに参照等価関係の入力を促している画面表示の一例である。なお、「不確実」な参照等価関係対が複数ある場合、提示情報として1つ以上を選択して表示してもよい。表示する参照等価関係対の選択方法は、例えば、第1の実施の形態で述べた参照関係対の提示情報の選択方法と同様の方法を用いることができる。
指示部14は、入力部2経由で参照等価関係対に関する指示の入力を受け付けて参照指示情報を生成しても良い。例えば、(1)被参照データimageの参照は関数assign5の内部でしか取得されておらず、かつ(2)index_1とindex_2が同じ値にならない場合、参照データpとqは同じ被参照データを参照しないとユーザは判断可能である。そのため、参照指示情報として、参照データpとqは非参照等価関係であるという情報を入力することができる。すると、参照データqは被参照データimageを参照しないため、関数assign5により被参照データimageに値5が代入されることはないと判断できる。
参照等価関係対に関する指示の入力を受け付ける場合は、例えば、ボタンを表示し、参照関係に関する入力と同様にユーザを受け付けるようにすればよい。
変換部15は、参照指示情報と参照依存関係情報を利用して、第一の参照関係情報に含まれる中間参照関係情報を生成して良い。例えば、参照データpとqは参照等価関係にないという参照指示情報が与えられたとすると、図27の第一の参照関係情報に対して、参照データarray[index_1]と参照データarray[index_2]の参照等価関係対を削除することができる。さらに、変換部15は、参照依存関係情報を利用することにより、参照データqと被参照データimageの参照等価関係対も削除することが可能となる。以上述べた以外の本実施の形態の動作は、第1の実施の形態と同様である。
以上のように、本実施の形態では、参照等価関係についても、参照関係と同様に提示情報に含めるようにした。このため、参照等価関係についても参照関係と同様にユーザによる参照指示情報を複数のデータに反映させることにより、ユーザによる目視解析時間の短縮と参照指示情報の入力時間とを短縮できる。
(第3の実施の形態)
次に、第3の実施の形態の最適化部16の処理について説明する。本実施の形態のプログラム最適化装置10の構成は第1の実施の形態と同様である。以下、第1の実施の形態と異なる部分を説明する。
次に、第3の実施の形態の最適化部16の処理について説明する。本実施の形態のプログラム最適化装置10の構成は第1の実施の形態と同様である。以下、第1の実施の形態と異なる部分を説明する。
第1の実施の形態では、コンパイラはプログラム最適化装置10の外部にあるとして、最適化部16は第二のプログラム22にコンパイラへの指示を示すキーワードを付与するようにしたが、本実施の形態では、最適化部16がコンパイラとしての機能を有し、コンパイル後のデータを第二のプログラム22として出力する。本実施の形態では、最適化部16はキーワードを付与せずに、図23に示したタスクグループの属性情報に基づいて最適化されたコンパイルを実施してもよい。
図29は、図23の第二のプログラム22をコンパイルして最適化した実行ファイルをプログラミング言語形式で表現した例を示す図である。
被参照データの定義の後ろには、該被参照データを配置するデータスペースを示している。データスペースとは、データを格納する領域であり、記憶部3のメモリやハードディスクなどのデータ領域もしくはその一部である。同じコンピュータシステム内では、記憶部3にOSが各タスクに与えるメモリ領域や、異なるコンピュータの各メモリ領域など、論理的に区切られた領域や物理的に区切られた領域がある。図29では、被参照データinput_imagesは共通データスペース、被参照データid_1はタスクprepareのデータスペース、被参照データid_2はタスクgetのデータスペースに配置されている。共通データスペースに配置されたデータは、全ての処理からアクセス可能である。特定のタスクのデータスペースに配置されたデータは、該当するタスクの処理からのみアクセス可能である。
ここで、タスクのデータスペースへのアクセス速度の方が共通データスペースへのアクセス速度より速い場合を考える。このとき、タスクgetで被参照データinput_imagesへアクセスする場合、被参照データinput_imagesを一時的にタスクgetのデータスペースに移動した方が高速に処理できる可能性がある。したがって、最適化部16は、次のような最適化処理を行う。関数transfer_1が被参照データinput_imagesを一時的にタスクgetのデータスペースに移動して新しい参照を参照データimages_2に代入する。そして、関数transfer_imageの中のタスクgetで移動された被参照データinput_imagesへアクセスし、関数transfer_2が被参照データinput_imagesを共通データスペースへ戻す。このような最適化処理は、if文によって参照データimages_2が被参照データinput_imagesを参照する場合のみ実行される。参照データimages_2がinput_images以外の被参照データを参照している場合、該被参照データは参照データstreamによりタスクprepareでもアクセスされる可能性があり、最適化を行うとデータの不整合が発生する可能性があるため、最適化のためのデータの移動は行わない。
図30は、本実施の形態の最適化(実行ファイルへの最適化)の効果が高いコンピュータシステムの一例を示す図である。図30のコンピュータシステムは、master301、prepare302およびget303の3つのコンピュータがネットワークで接続されている。master301がメインの処理を実行し、prepare302がタスクprepareの処理を実行し、get303がタスクgetの処理を実行する。各コンピュータはデータスペースを保持しており、master301は共通データスペース304を備え、prepare302はデータスペース305を備え、get303はデータスペース306を備える。
タスクprepareやタスクgetの実行により共通データスペース304のデータにアクセスする場合は、その都度、master301との間でデータが転送される。したがって、タスクprepareやタスクgetによる共通データスペースへの大量のアクセスは、膨大なデータ転送時間が必要になる可能性がある。そのため、例えば、共通データスペース304の被参照データをタスクgetから高速にアクセスできるデータスペース306に移動することにより、処理を高速化できる可能性がある。
また、プログラム最適化装置10が複数のプロセッサコアおよびキャッシュを備えるコンピュータシステムに実装される場合、プロセッサコアへのタスクの配置を最適化しても良い。図31は、複数のプロセッサコアを備えるコンピュータシステムの構成例を示す図である。図31のコンピュータシステムは、core(プロセッサコア)31−1〜31−4と、L1 cache32−1〜32−4と、L2 cache33−1,33−2と、L3 cache34と、を備える。
図32は、解析部11が第一のプログラム21から抽出したグループアクセス情報の一部の一例を示している。図32では、タスク41−1〜41−4がアクセスする可能性がある被参照データ42−1〜42−3に対し、タスク41−1〜41−4からのアクセスをデータ42−1〜42−3への矢印で表現している。実線の矢印は直接データアクセスもしくは参照確実性情報が「確実」である間接データアクセスを示しており、破線の矢印は参照確実性情報が「不確実」である間接データアクセスを示す。
最適化部16が図32に示した各タスクを実行するプロセッサコアを決定する最適化処理の方法について説明する。最初に、解析部11は、タスク41−1〜41−4を、アクセスする可能性のある被参照データごとにタスクグループに分類する。なお、複数の被参照データにアクセスするタスクは、複数のタスクグループに所属して良い。データ42−1にアクセスする可能性のあるタスクグループ43−1にはタスク41−1、41−2が属する。データ42−2にアクセスする可能性のあるタスクグループ43−2にはタスク41−2〜41−4が属する。データ42−3にアクセスする可能性のあるタスクグループ43−3にはタスク41−2〜41−4が属する。
その後、第1の実施の形態と同様に、指示部14が入力情報に基づいて参照指示情報を生成して、変換部15が中間参照関係情報を第二の参照関係情報に変換する。これにより、あるタスクからアクセスしないとみなされた被参照データが発生したら、最適化部16はタスクグループの再編成を行う。
図33は、再編成後のタスクグループの一例を示す図である。図33では、タスクグループの分類の後、第二の参照関係情報に変換した結果、タスク41−2がデータ42−2、42−3にアクセスしないとみなされた例を示している。この場合、最適化部16は、再編成により、タスク41−2をタスクグループ43−2、43−3から外している。タスクグループの再編成をしないと、タスク41−2を(A)データ42−1に効率的にアクセスできるようにタスクグループ43−1に含まれるタスク41−1を実行するプロセッサコアと同じL2 cacheを持つプロセッサコアで実行するのか、(B)データ42−2と42−3に効率的にアクセスできるようにタスクグループ43−2や43−3に含まれるタスク41−3とタスク41−4を実行するプロセッサコアと同じL2 cacheを持つプロセッサコアで実行するのか、という最適化問題がある。しかし、タスクグループの再編成により、最適化部16は(A)を選択して効率的なタスクの実行を実現することが可能となる。例えばL2 cache33−1を共有するcore31−1とcore31−2でタスク41−1とタスク41−2を実行する最適化を行うことにより、できるだけL3 cache34を通さずにデータ42−1にアクセスすることができる。
さらに、最適化部16は、タスク間への同期コードの自動挿入に関する最適化を行っても良い。例えば、図32のタスク41−2とタスク41−3はデータ42−2やデータ42−3を共有する可能性がある。このため、正しい計算結果を得ることを保証するためにはタスク41−2とタスク41−3に同期コードを挿入することが望ましいが、図33のようにタスク41−2とタスク41−3が同じデータを共有しないことが判明すれば同期コードを挿入しないという最適化が可能である。
以上述べた以外の本実施の形態の動作は、第1の実施の形態と同様である。また、第2の実施の形態で述べたように参照等価関係について考慮する場合に、第3の実施の形態の最適化を行ってもよい。
なお、本実施の形態のプログラム最適化装置10を実装するコンピュータシステムは、図30、図31の構成に限定されない。効率的な最適化方法は、実際のコンピュータシステムの構成に依存する。最適化部16は、そのコンピュータシステムに適した最適化を行った実行ファイルを生成すると、より処理を高速化できる可能性がある。
以上のように、本実施の形態では、第二のプログラム22を実行ファイルとして生成し、コンピュータシステムの構成を考慮して最適化を行うようにした。このため、第1の実施の形態と同様の効果が得られるとともに、コンピュータシステムに応じた最適化を実施することができ、処理を高速化できる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
10 プログラム最適化装置、11 解析部、12 反映部、13 生成部、14 指示部、15 変換部、16 最適化部
Claims (6)
- 解析対象プログラムにおいて、参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置であって、
前記参照データと前記被参照データとで構成される参照関係対について、前記参照データが前記被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を含む第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対を提示情報として生成する生成部と、
前記提示情報に基づいて入力された前記参照関係対の参照関係を参照指示情報として生成する指示部と、
前記参照指示情報と第一及び第二の参照関係対の依存関係を示す参照依存関係情報とを用いて前記第一の参照関係情報を第二の参照関係情報に変換する変換部と、
を備え、
前記変換部は、前記第二の参照関係対の参照関係を前記参照依存関係情報の前記第一の参照関係対の参照関係に基づいて推定し、前記第二の参照関係情報に変換し、
前記第一の参照関係情報は、同じ被参照データを参照する第一の参照データと第二の参照データとからなる参照等価関係対について、第一及び第二の参照データが同じ被参照データを参照することが「確実」であるか「不確実」であるかを示す参照等価確実性情報を、さら含み、
前記変換部は、前記参照依存関係情報に基づいて第三の参照関係対の参照関係を推定し、前記第二の参照関係情報に変換する、ことを特徴とするプログラム解析装置。 - 解析対象プログラムにおいて、参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置であって、
前記参照データと前記被参照データとで構成される参照関係対について、前記参照データが前記被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を含む第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対を提示情報として生成する生成部と、
前記提示情報に基づいて入力された前記参照関係対の参照関係を参照指示情報として生成する指示部と、
前記参照指示情報と第一及び第二の参照関係対の依存関係を示す参照依存関係情報とを用いて前記第一の参照関係情報を第二の参照関係情報に変換する変換部と、
を備え、
前記変換部は、前記第二の参照関係対の参照関係を前記参照依存関係情報の前記第一の参照関係対の参照関係に基づいて推定し、前記第二の参照関係情報に変換し、
前記生成部は、参照確実性情報が「不確実」である参照関係対に対し順位付けを行い、前記順位に基づいて前記提示情報を生成する、ことを特徴とするプログラム解析装置。 - 解析対象プログラムにおいて、参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置であって、
前記参照データと前記被参照データとで構成される参照関係対について、前記参照データが前記被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を含む第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対を提示情報として生成する生成部と、
前記提示情報に基づいて入力された前記参照関係対の参照関係を参照指示情報として生成する指示部と、
前記参照指示情報と第一及び第二の参照関係対の依存関係を示す参照依存関係情報とを用いて前記第一の参照関係情報を第二の参照関係情報に変換する変換部と、
を備え、
前記変換部は、前記第二の参照関係対の参照関係を前記参照依存関係情報の前記第一の参照関係対の参照関係に基づいて推定し、前記第二の参照関係情報に変換し、
前記生成部は、前記参照関係対が属する関数のアクセス属性に基づいて前記順位付けを行う、ことを特徴とするプログラム解析装置。 - 前記解析部は、前記解析対象プログラム内の参照データまたは/および被参照データごとにアクセス回数を解析し、
前記生成部は、前記アクセス回数に基づいて前記順位付けを行う、ことを特徴とする請求項2に記載のプログラム解析装置。 - 解析対象プログラムにおいて、参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置であって、
前記参照データと前記被参照データとで構成される参照関係対について、前記参照データが前記被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を含む第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対を提示情報として生成する生成部と、
前記提示情報に基づいて入力された前記参照関係対の参照関係を参照指示情報として生成する指示部と、
前記参照指示情報と第一及び第二の参照関係対の依存関係を示す参照依存関係情報とを用いて前記第一の参照関係情報を第二の参照関係情報に変換する変換部と、
前記解析対象プログラム内の1つ以上のタスクでタスクグループを構成し、前記タスクグループに属する参照関係対に対応するアクセスが直接データアクセスであるか間接データアクセスであるかを示すグループアクセス情報を生成する解析部と、
を備え、
前記変換部は、前記第二の参照関係対の参照関係を前記参照依存関係情報の前記第一の参照関係対の参照関係に基づいて推定し、前記第二の参照関係情報に変換する、ことを特徴とするプログラム解析装置。 - 解析対象プログラムにおいて、参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置であって、
前記参照データと前記被参照データとで構成される参照関係対について、前記参照データが前記被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を含む第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対を提示情報として生成する生成部と、
前記提示情報に基づいて入力された前記参照関係対の参照関係を参照指示情報として生成する指示部と、
前記参照指示情報と第一及び第二の参照関係対の依存関係を示す参照依存関係情報とを用いて前記第一の参照関係情報を第二の参照関係情報に変換する変換部と、
参照データを利用して間接アクセスした被参照データを特定可能な情報であるトレース情報と前記参照依存関係情報を前記第一の参照関係情報に反映した中間参照関係情報を生成する反映部と、
を備え、
前記変換部は、前記第二の参照関係対の参照関係を前記参照依存関係情報の前記第一の参照関係対の参照関係に基づいて推定し、前記第二の参照関係情報に変換し、前記中間参照関係情報を第二の参照関係情報に変換する、ことを特徴とするプログラム解析装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012035368A JP2013171459A (ja) | 2012-02-21 | 2012-02-21 | プログラム解析装置、プログラム解析方法および記録媒体 |
US13/423,576 US20130218903A1 (en) | 2012-02-21 | 2012-03-19 | Program analysis apparatus, program analysis method and storage medium |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012035368A JP2013171459A (ja) | 2012-02-21 | 2012-02-21 | プログラム解析装置、プログラム解析方法および記録媒体 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2013171459A true JP2013171459A (ja) | 2013-09-02 |
Family
ID=48983133
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012035368A Abandoned JP2013171459A (ja) | 2012-02-21 | 2012-02-21 | プログラム解析装置、プログラム解析方法および記録媒体 |
Country Status (2)
Country | Link |
---|---|
US (1) | US20130218903A1 (ja) |
JP (1) | JP2013171459A (ja) |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3032031B2 (ja) * | 1991-04-05 | 2000-04-10 | 株式会社東芝 | ループ最適化方法及び装置 |
JP2009237762A (ja) * | 2008-03-26 | 2009-10-15 | Toshiba Corp | プログラム解析装置、プログラム解析方法および解析プログラム |
JP5059174B2 (ja) * | 2010-08-10 | 2012-10-24 | 株式会社東芝 | プログラム変換装置、およびそのプログラム |
JP5139486B2 (ja) * | 2010-08-30 | 2013-02-06 | 株式会社東芝 | トレース生成装置、システム、およびそのプログラム |
US8793675B2 (en) * | 2010-12-24 | 2014-07-29 | Intel Corporation | Loop parallelization based on loop splitting or index array |
JP5178852B2 (ja) * | 2011-01-12 | 2013-04-10 | 株式会社東芝 | 情報処理装置およびプログラム |
-
2012
- 2012-02-21 JP JP2012035368A patent/JP2013171459A/ja not_active Abandoned
- 2012-03-19 US US13/423,576 patent/US20130218903A1/en not_active Abandoned
Also Published As
Publication number | Publication date |
---|---|
US20130218903A1 (en) | 2013-08-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10437573B2 (en) | General purpose distributed data parallel computing using a high level language | |
Fan et al. | The Case Against Specialized Graph Analytics Engines. | |
US10346292B2 (en) | Software component recommendation based on multiple trace runs | |
US9772890B2 (en) | Sophisticated run-time system for graph processing | |
US9400700B2 (en) | Optimized system for analytics (graphs and sparse matrices) operations | |
US20230091261A1 (en) | Orchestration and scheduling of services | |
CN109313547B (zh) | 用于cpu利用率和代码重构的查询优化器 | |
CN110741354B (zh) | 呈现代码实体调用之间的差异 | |
US11093241B2 (en) | Outlier software component remediation | |
JP2015069646A (ja) | 高性能のグラフ分析エンジンに関するシステムおよび方法 | |
CN109791492B (zh) | 流水线相关树查询优化器和调度器 | |
US11068247B2 (en) | Vectorizing conditional min-max sequence reduction loops | |
JP2017004281A (ja) | コンパイルプログラム、およびコンパイル方法 | |
US10216501B2 (en) | Generating code in statically typed programming languages for dynamically typed array-based language | |
US10078562B2 (en) | Transactional distributed lifecycle management of diverse application data structures | |
US20160253157A1 (en) | Software refactoring | |
JP2012146137A (ja) | 情報処理装置およびプログラム | |
US8433697B2 (en) | Flexible metadata composition | |
US20210326179A1 (en) | Progress visualization of computational job | |
US11226798B2 (en) | Information processing device and information processing method | |
Tukaram | Design and development of software tool for code clone search, detection, and analysis | |
JP2013171459A (ja) | プログラム解析装置、プログラム解析方法および記録媒体 | |
US20230176851A1 (en) | Computer-readable recording medium storing conversion program and conversion method | |
US20220414101A1 (en) | Shifting left database degradation detection | |
WO2024031983A1 (zh) | 一种代码管理方法及相关设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20140205 |
|
A762 | Written abandonment of application |
Free format text: JAPANESE INTERMEDIATE CODE: A762 Effective date: 20140417 |