(57)【要約】【課題】ユーザによる少ない解析と指示で高性能なプログラムを生成することができるプログラム解析装置を得ること。【解決手段】参照データと被参照データで構成される参照関係対ごとに参照データが被参照データを参照することが「確実」か「不確実」かを示す第一の参照関係情報に基づいて、参照することが「不確実」である１つ以上の参照関係対を提示情報として生成する生成部と、提示情報に対する参照関係の入力と参照関係対間の依存関係の情報である参照依存関係情報とを用いて第一の参照関係情報を第二の参照関係情報に変換する変換部と、を備える。【選択図】図１
2013171459.tif 000002
【特許請求の範囲】
【請求項１】
解析対象プログラムにおいて、参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置であって、
前記参照データと前記被参照データとで構成される参照関係対について、前記参照データが前記被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を含む第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対を提示情報として生成する生成部と、
前記提示情報に基づいて入力された前記参照関係対の参照関係を参照指示情報として生成する指示部と、
前記参照指示情報と第一及び第二の参照関係対の依存関係を示す参照依存関係情報とを用いて前記第一の参照関係情報を第二の参照関係情報に変換する変換部と、
を備え、
前記変換部は、前記第二の参照関係対の参照関係を前記参照依存関係情報の前記第一の参照関係対の参照関係に基づいて推定し、前記第二の参照関係情報に変換し、
前記第一の参照関係情報は、同じ被参照データを参照する第一の参照データと第二の参照データとからなる参照等価関係対について、第一及び第二の参照データが同じ被参照データを参照することが「確実」であるか「不確実」であるかを示す参照等価確実性情報を、さら含み、
前記変換部は、前記参照依存関係情報に基づいて第三の参照関係対の参照関係を推定し、前記第二の参照関係情報に変換する、ことを特徴とするプログラム解析装置。
【請求項２】
解析対象プログラムにおいて、参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置であって、
前記参照データと前記被参照データとで構成される参照関係対について、前記参照データが前記被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を含む第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対を提示情報として生成する生成部と、
前記提示情報に基づいて入力された前記参照関係対の参照関係を参照指示情報として生成する指示部と、
前記参照指示情報と第一及び第二の参照関係対の依存関係を示す参照依存関係情報とを用いて前記第一の参照関係情報を第二の参照関係情報に変換する変換部と、
を備え、
前記変換部は、前記第二の参照関係対の参照関係を前記参照依存関係情報の前記第一の参照関係対の参照関係に基づいて推定し、前記第二の参照関係情報に変換し、
前記生成部は、参照確実性情報が「不確実」である参照関係対に対し順位付けを行い、前記順位に基づいて前記提示情報を生成する、ことを特徴とするプログラム解析装置。
【請求項３】
解析対象プログラムにおいて、参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置であって、
前記参照データと前記被参照データとで構成される参照関係対について、前記参照データが前記被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を含む第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対を提示情報として生成する生成部と、
前記提示情報に基づいて入力された前記参照関係対の参照関係を参照指示情報として生成する指示部と、
前記参照指示情報と第一及び第二の参照関係対の依存関係を示す参照依存関係情報とを用いて前記第一の参照関係情報を第二の参照関係情報に変換する変換部と、
を備え、
前記変換部は、前記第二の参照関係対の参照関係を前記参照依存関係情報の前記第一の参照関係対の参照関係に基づいて推定し、前記第二の参照関係情報に変換し、
前記生成部は、前記参照関係対が属する関数のアクセス属性に基づいて前記順位付けを行う、ことを特徴とするプログラム解析装置。
【請求項４】
前記解析部は、前記解析対象プログラム内の参照データまたは／および被参照データごとにアクセス回数を解析し、
前記生成部は、前記アクセス回数に基づいて前記順位付けを行う、ことを特徴とする請求項２に記載のプログラム解析装置。
【請求項５】
解析対象プログラムにおいて、参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置であって、
前記参照データと前記被参照データとで構成される参照関係対について、前記参照データが前記被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を含む第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対を提示情報として生成する生成部と、
前記提示情報に基づいて入力された前記参照関係対の参照関係を参照指示情報として生成する指示部と、
前記参照指示情報と第一及び第二の参照関係対の依存関係を示す参照依存関係情報とを用いて前記第一の参照関係情報を第二の参照関係情報に変換する変換部と、
前記解析対象プログラム内の１つ以上のタスクでタスクグループを構成し、前記タスクグループに属する参照関係対に対応するアクセスが直接データアクセスであるか間接データアクセスであるかを示すグループアクセス情報を生成する解析部と、
を備え、
前記変換部は、前記第二の参照関係対の参照関係を前記参照依存関係情報の前記第一の参照関係対の参照関係に基づいて推定し、前記第二の参照関係情報に変換する、ことを特徴とするプログラム解析装置。
【請求項６】
解析対象プログラムにおいて、参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置であって、
前記参照データと前記被参照データとで構成される参照関係対について、前記参照データが前記被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を含む第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対を提示情報として生成する生成部と、
前記提示情報に基づいて入力された前記参照関係対の参照関係を参照指示情報として生成する指示部と、
前記参照指示情報と第一及び第二の参照関係対の依存関係を示す参照依存関係情報とを用いて前記第一の参照関係情報を第二の参照関係情報に変換する変換部と、
参照データを利用して間接アクセスした被参照データを特定可能な情報であるトレース情報と前記参照依存関係情報を前記第一の参照関係情報に反映した中間参照関係情報を生成する反映部と、
を備え、
前記変換部は、前記第二の参照関係対の参照関係を前記参照依存関係情報の前記第一の参照関係対の参照関係に基づいて推定し、前記第二の参照関係情報に変換し、前記中間参照関係情報を第二の参照関係情報に変換する、ことを特徴とするプログラム解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、プログラム解析装置、プログラム解析方法および記録媒体に関する。
【背景技術】
【０００２】
従来、ループ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.
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本実施形態は、ユーザによる少ない解析と指示で高性能なプログラムを生成することができるプログラム解析装置、プログラム解析方法および記録媒体を提供することを目的とする。
【課題を解決するための手段】
【０００６】
本願発明の一態様によれば、解析対象プログラムにおける参照データと該参照データが参照する可能性のある被参照データとの参照関係を解析するプログラム解析装置を提供する。このプログラム解析装置は、参照データと参照データが参照する可能性のある被参照データとで構成される参照関係対ごとに参照データが参照関係対をなす被参照データを参照することが「確実」であるか「不確実」であるかを示す参照確実性情報を格納した第一の参照関係情報に基づいて、参照確実性情報が「不確実」である参照関係対のうち１つ以上を選択し、選択した参照関係対を提示情報として生成する生成部、を備える。また、このプログラム解析装置は、提示情報に基づいて入力された提示情報に対する参照関係対ごとの参照関係の入力を受け付け、入力に基づいて提示情報に含まれる参照関係対の参照関係を参照指示情報として生成する指示部と、を備える。さらに、このプログラム解析装置は、参照指示情報と参照関係対間の依存関係の情報である参照依存関係情報とを用いて第一の参照関係情報を第二の参照関係情報に変換する変換部、を備える。参照依存関係情報は、第一の参照関係対の参照関係に基づいて第二の参照関係対の参照関係が推定可能である場合に第一の参照関係対の参照関係の仮定と当該仮定を行ったときに推定される第二の参照関係対の参照関係との対応を示す情報とする。
【図面の簡単な説明】
【０００７】
【図１】第１の実施の形態にかかるプログラム最適化装置の構成例を示すブロック図
【図２】プログラム最適化装置が実装されるコンピュータシステムの構成例を示す図
【図３】プログラム最適化装置の全体動作の一例を示すフローチャート
【図４】第一のプログラムの一例を示す図
【図５】関数transfer＿image＿allと関数transfer＿imageとタスクprepareとタスクgetの実行例を示す図
【図６】第一の参照関係情報の一例を示す図
【図７】参照関係対の参照依存関係を示す参照依存関係情報の一例を示す図
【図８】トレース情報の一例を示す図
【図９】アクセス回数情報の一例を示す図
【図１０】グループアクセス情報の一例を示す図
【図１１】プログラム情報の一例を示す図
【図１２】中間参照関係情報の一例を示す図
【図１３】関数の属性による順位付けの一例を示す図
【図１４】中間参照関係情報を用いて更新したグループアクセス情報の一例を示す図
【図１５】タスクグループの属性情報の一例を示す図
【図１６】タスクグループの属性情報による順位付けの一例を示す図
【図１７】アクセス回数による順位付けを行った結果の一例を示す図
【図１８】最終的に最も高い順位を与えられた参照関係対を示す提示情報の一例を示す図
【図１９】提示情報として複数の参照関係対を表示した一例を示す図
【図２０】参照指示情報の一例を示す図
【図２１】第二の参照関係情報の一例を示す図
【図２２】第二の参照関係情報を用いて更新したグループアクセス情報の一例を示す図
【図２３】第二の参照関係情報を用いて更新したグループアクセス情報に基づくタスクグループの属性情報の一例を示す図
【図２４】第二のプログラムの一例を示す図
【図２５】参照データと被参照データの間接的な関係を参照関係対で表現する一例を示す図
【図２６】第一のプログラムの別の一例を示す図
【図２７】実施の形態２の第一の参照関係情報の一例を示す図
【図２８】参照等価関係対に関する提示情報の一例を示す図
【図２９】実行ファイルとして出力される第二のプログラムの一例を示す図
【図３０】実施の形態３の最適化の効果が高いコンピュータシステムの一例を示す図
【図３１】複数のプロセッサコアを備えるコンピュータシステムの構成例を示す図
【図３２】アクセスする被参照データごとにタスクをタスクグループに分類した一例を示す図
【図３３】再編成後のタスクグループの一例を示す図
【発明を実施するための形態】
【０００８】
以下に図面を参照して、実施形態にかかるプログラム解析装置、プログラム解析方法および記録媒体を詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【０００９】
（第１の実施の形態）
図１は、第１の実施の形態にかかるプログラム最適化装置１０の構成例を示すブロック図である。プログラム最適化装置１０は、第一のプログラム（解析対象プログラム）２１を最適化し、最適化した結果である第二のプログラム２２を出力する。プログラム最適化装置１０は、解析部１１と反映部１２と生成部１３と指示部１４と変換部１５と最適化部１６と記憶部１７とを備える。なお、本実施の形態では、プログラムの最適化を行う最適化部１６を備えるプログラム最適化装置１０を例に説明するが、図１の構成から最適化部１６を削除し、第一のプログラム内のデータの参照関係を解析するプログラム解析装置を構成してもよい。
【００１０】
プログラム最適化装置１０は、例えばパーソナルコンピュータやサーバ等のコンピュータ上に実装される。図２は、プログラム最適化装置１０が実装されるコンピュータシステムの構成例を示す図である。図２に示したコンピュータシステムは、制御部１、入力部２、記憶部３、表示部４を備え、これらはバス５を介して接続されている。
【００１１】
制御部１は、ＣＰＵ（Central  Processing  Unit）、ＭＰＵ（Micro  Processing  Unit  ）等で構成され、各種プログラム等を実行する。入力部２は、キーボードやマウス等を備え、ユーザからの入力を受け付ける。記憶部３は、ＲＡＭ（Random  Access  Memory）やＲＯＭ（Read  Only  Memory）などの各種メモリおよびハードディスクなどのストレージデバイスを含み、制御部１が実行すべきプログラム，処理の過程で得られた必要なデータ，などを記憶する。表示部４は、液晶やプラズマ等のディスプレイ等で構成され、コンピュータシステムのユーザに対して各種画面を表示する。なお、図２の構成は一例であり、プログラム最適化装置１０が実装されるコンピュータはどのような構成でもよい。
【００１２】
本実施の形態のプログラム最適化装置１０の動作例について説明する。図２のコンピュータシステムには、たとえば、ＣＤ−ＲＯＭ等の記録媒体から、プログラム最適化装置１０の動作（プログラム解析処理を含む動作）を実行するための解析プログラムが記憶部３にインストールされる。制御部１は、記憶部３に格納された解析プログラムに従って、プログラム解析処理を実行する。
【００１３】
なお、上述の例では、ＣＤ−ＲＯＭを記録媒体として、最適化プログラムを提供しているが、これに限らず、コンピュータシステムの構成、提供するプログラムの容量などに応じて、たとえば、磁気ディスクなどの記録媒体やインターネットなどの伝送媒体により提供されたプログラムを用いることとしてもよい。
【００１４】
なお、図１の記憶部１７は、記憶部３に含まれる。また、解析部１１、反映部１２、生成部１３、指示部１４、変換部１５および最適化部１６は、制御部１に含まれる。
【００１５】
次に、プログラム最適化装置１０の動作を説明する。図３は、プログラム最適化装置１０の全体動作の一例を示すフローチャートである。解析部１１は、入力された第一のプログラム２１を解析する（ステップＳ１）具体的には、第一の参照関係情報と参照依存関係情報とトレース情報とアクセス回数情報とグループアクセス情報とプログラム情報を生成して記憶部１７へ格納し、格納を行ったことを反映部１２へ通知する。次に、反映部１２は、記憶部１７から第一の参照関係情報、トレース情報および参照依存関係情報を読み出し、トレース情報および参照依存関係情報の情報を用いて第一の参照関係情報を中間参照関係情報に変換する（ステップＳ２）。また、反映部１２は、中間参照関係情報を記憶部１７へ格納し、変換を行ったことを生成部１３へ通知する。
【００１６】
次に、生成部１３は、記憶部１７から中間参照関係情報、アクセス回数情報およびグループアクセス情報を読み出し、アクセス回数情報およびグループアクセス情報に基づいて中間参照関係情報から提示情報を生成する（ステップ３）。提示情報は、表示部４に表示される。
【００１７】
指示部１４は、入力部２経由でユーザからの参照指示情報の入力を受け付け、入力された参照指示情報を記憶部１７へ格納する（ステップＳ４）。指示部１４は、参照指示情報を格納したことを変換部１５へ通知する。
【００１８】
次に、変換部１５は、記憶部１７から中間参照関係情報、参照指示情報および参照依存関係情報を読み出し、参照指示情報および参照依存関係情報を利用して中間参照関係情報を第二の参照関係情報に変換する（ステップＳ５）。また、変換部１５は、第二の参照関係情報を記憶部１７へ格納し、変換を行ったことを最適化部１６へ通知する。
【００１９】
次に、最適化部１６は、記憶部１７から第二の参照関係情報およびプログラム情報を読み出し、第二の参照関係情報およびプログラム情報を利用して最適化された第二のプログラム２２を構築する（ステップＳ６）。
【００２０】
なお、上述の例では、各機能部が各々の処理を実行したことを次の処理を行う機能部へ通知するようにしたが、この代わりに、制御部１内に全体を制御する手段を設け、その手段が各機能部の処理の実行タイミングを制御するようにしてもよい。
【００２１】
以下の説明では、プログラム最適化装置１０の各機能部が図３で説明した順番で直列に最も基本的な形態で動作した場合の例について説明する。しかしながら、実施の形態はこれに限られない。例えば、複数の機能部が協調しながら動作を行う構成、一部の機能部の順番を入れ替える構成、ある機能部を複数の機能ブロックに分割する構成、これら３つの形態を組み合わせる構成等で実施することもできる。また、例えば、参照指示情報のみを変更したい場合に図３のステップＳ４以降から実行できるようにしておく等、図１の機能部のうちの一部の機能部による動作が可能なようにしてもよい。また、機能部を複数のモジュールに分割して実施することもできる。
【００２２】
次に、各機能部の処理、処理で用いる用語や情報について説明する。
（解析部１１）
解析部１１は、入力される第一のプログラム２１を解析して、第一の参照関係情報と参照依存関係情報とトレース情報とアクセス回数情報とグループアクセス情報とプログラム情報とを抽出する。
【００２３】
（第一のプログラム）
図４は、第一のプログラム２１の一例を示す図である。図４に示した第一のプログラム２１は、Ｃ言語に似た疑似プログラム言語で記述されている。第一のプログラム２１は、図４の例に限定されず、どのような言語で記述されていてもよい。
【００２４】
（参照データと被参照データ）
第一のプログラム２１に含まれている各データは、参照データと被参照データに大別される。参照データは、他のデータにアクセスするための特殊なデータであり、アクセス対象となるデータにリンクされており、かつ、リンク先を変更可能である。例えばＣ言語のポインタ変数などである。図４では、参照データはrefキーワードを利用して定義されている。図４では、参照データは、images＿1とimages＿2とstreamとstreamsとsである。
【００２５】
被参照データは、参照データを介してアクセスされるデータである。図４では、被参照データはdataキーワードを利用して定義されている。図４では、被参照データは、input＿imagesとwaitingとflagとid＿1とid＿2である。
【００２６】
（直接データアクセスと間接データアクセス）
データへのアクセス方法は、直接データアクセスと間接データアクセスに大別される。直接データアクセスとは、参照データを介さず被参照データに直接アクセスする方法である。図４では、被参照データの名前を利用した直接データアクセスが示されている。例えばwaiting  +=  1である。直接データアクセスは、アクセス先のデータが名前で記されているため、実際にアクセスするデータを解析可能である。
【００２７】
間接データアクセスとは、参照データを介して被参照データにアクセスする方法である。図４では、参照データを介して被参照データにアクセスするために*演算子を利用している。例えば*images＿1である。間接データアクセスは、参照データの内容によって実行時にアクセスする被参照データを決定するため、実際にアクセスする被参照データを解析できない場合がある。
【００２８】
（関数）
図４では、transfer＿imageとtransfer＿image＿allとの、２つの関数がfunctionキーワードにより定義されている。関数名の後のカッコ内には関数の引数が記述されている。図４の関数transfer＿imageの引数は、参照データimages＿1と参照データstreamである。引数に指定されたデータは、関数コールで指定されたデータを引き継ぐ。例えばtransfer＿image（images＿2，s）の関数コールがされた場合、データimages＿2の値をデータimages＿1が、データsの値をデータstreamが引き継ぐ。
【００２９】
（関数のアクセス属性）
関数にはinternalもしくはexternalのアクセス属性を設定可能である。図４では、internalは、プログラムの外部から呼び出し不可能であり、externalは、プログラムの外部から呼び出し可能である。図４の関数transfer＿image＿allは、externalとして設定されているので、第一のプログラム２１の外部から呼び出し可能である。
【００３０】
（タスク）
図４では、prepareとgetとの、２つのタスクがtaskキーワードにより定義されている。例えばtask  prepareである。タスクは、startキーワードにより実行される。
【００３１】
（関数とタスクの相違点）
関数は現在実行中の処理を一時中断して関数の処理を実行するのに対して、タスクは現在実行中の処理と並行してタスクの処理を実行する。図５は、図４の第一のプログラム２１内の関数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は処理を中断せず、タスクの処理が並行して実行される。ここに記した関数とタスクの相違点は、記述が表現する潜在的な処理の相違点を示しており、実際にどのような処理が行われるかは、コンパイラやＯＳ（Operating  System）などの、プログラム実行環境によって決定される。
【００３２】
（ループ）
図４では、関数transfer＿image＿all内にforeachによって表現されるループ処理が記述されている。このループ処理では、参照データstreamsが参照する配列データに*streamsでアクセスして、該配列データの個々の要素を参照データsで参照しながら、ループ処理の内部で関数transfer＿imageを実行するという処理である。
【００３３】
（参照関係情報と参照関係対）
解析部１１は、第一のプログラム２１を解析して第一の参照関係情報を生成する。この解析は、第一のプログラム２１の定義文や実行文に記載されている内容に基づく静的な解析である。図６は、図４に示した第一のプログラム２１を解析して得られた参照関係情報の一例を示す図である。第一の参照関係情報は、ある被参照データがある参照データから参照されているかどうかの情報を示している。図６は、参照データと被参照データの参照関係を示す表である。
【００３４】
（確実な参照関係と不確実な参照関係と非参照関係）
参照関係情報には、「確実」な参照関係と、「不確実」な参照関係と、参照関係がない「非参照関係」の３種類がある。各参照関係が確実または不確実を示す情報を参照確実性情報と呼ぶ。図６では、例えば参照データimages＿1と被参照データinput＿imagesの参照確実性情報は不確実であることを示している。なお、非参照関係については、本実施の形態のプログラム最適化の処理で用いないため、図６に示す第一の参照関係情報に含めていない。
【００３５】
参照関係が確実であるとは、参照データが被参照データを常に参照することや、参照データが被参照データを参照する場合があるということも含む。そのため、参照確実性情報が確実であることを示していても、参照データが被参照データを参照しないことがあっても良い。参照関係が不確実であるとは、参照データが被参照データを参照することがあるかないか判断できないことを意味する。参照関係がないとは、参照データが被参照データを参照することはないとみなす。
【００３６】
図４の第一のプログラム２１では、被参照データであるinput＿imagesとwaitingとflagが、externalな関数transfer＿image＿allの引数として指定される可能性がある。しかし、これらの被参照データが実際に引数として指定されるかは関数transfer＿image＿allを呼び出す処理も全て特定した上で、全て解析可能でなければ判断できない。このため、図６の第一の参照関係情報の時点では、参照確実性情報は不確実を示している。
【００３７】
図４のタスクprepareとタスクgetのローカルデータであるid＿1とid＿2は、Ｃ言語の場合と同様に関数の外部で利用することができない。このため、被参照データid＿1とid＿2は、図４の第一のプログラム２１が含む参照データから参照されない非参照関係と解析可能である。なお、前提として、関数put＿tokenの第二引数は値渡しということを知っている、言いかえると、被参照データid＿1を参照する参照データが関数get＿tokenなどで利用されないということを知っている。以上のことから、被参照データid＿1とid＿2は参照データから参照されないため、図６の第一の参照関係情報には含めていない。
【００３８】
（参照依存関係情報）
解析部１１は、第一のプログラムを解析して参照依存関係情報を抽出する。図７は、図４に示した第一のプログラム２１を解析して得られた参照依存関係情報の一例を示す図である。参照依存関係とは、ある参照関係を仮定すると他の参照関係も仮定できる関係を示す。例えば、参照関係Ａが確実であるとみなすと参照関係Ｂがあるとみなしてよいという関係や、参照関係Ｃが非参照関係であるとみなすと参照関係Ｄが非参照関係であるとみなしてよいという関係や、参照関係Ｅが確実であるとみなすと参照関係Ｆが非参照関係であるとみなしてよいという関係等である。
【００３９】
図７（ａ）は、ある参照関係対が非参照関係であると仮定した場合に、当該仮定の結果として非参照関係であると仮定できる参照関係対を示している。図７（ａ）の、左側は非参照関係を仮定する参照関係対を示し、右側は同一段の左側の参照関係対の仮定に対し非参照関係とみなすことができる参照関係対を示している。
【００４０】
図７（ｂ）は、ある参照関係対が参照関係であると仮定した場合に、当該仮定の結果として参照関係であると仮定できる参照関係対を示している。図７（ｂ）の、左側は参照関係を仮定する参照関係対を示し、右側は同一段の左側の参照関係対が参照関係の仮定に対し参照関係とみなすことができる参照関係対を示している。
【００４１】
例えば、図７（ａ）の一段目は、参照関係対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を参照しないという情報が得られる。
【００４２】
また、参照データのデータフローを解析することにより、参照依存関係を解析することが可能である。例えば、図４の参照データstreamsが参照する被参照データである配列の要素は、参照データsから参照される。したがって、参照データsは参照データstreamと等価である。このため、参照データstreamsから参照データsを経由して参照データstreamへのデータフローを考慮すると、参照データstreamsが被参照データinput＿imagesを参照しないのであれば、参照データsも被参照データinput＿imagesを参照しないと解析できる。同様にして、その他の参照依存関係も解析可能である。
【００４３】
なお、参照依存関係情報は図７の形式に限定されず、第一の参照関係対の参照関係とその場合に推定される第二の参照関係対の参照関係との対応を示す情報であればよい。また、参照依存関係情報は全ての参照依存関係を含んでいなくてもよい。
【００４４】
（トレース情報）
解析部１１は、第一のプログラム２１を実行し、実行中のデータアクセスを記録したトレース情報を生成する。図８は、図４の第一のプログラム２１を実行して得たトレース情報の一例を示す図である。トレース情報とは、参照データを利用して間接アクセスした被参照データを特定可能な情報を含む。図８では、データを間接アクセスするデータアクセス命令と当該データアクセス命令によりアクセスされたデータとを示している。なお、トレース情報には全てのデータアクセスが記録されている必要はない。
【００４５】
図８で、アクセスされたデータunknown＿0x50000000は、アドレス0x500000000にあるが特定できない被参照データにアクセスしたことを示す。すなわち、第一のプログラム２１外の被参照データにアクセスしたことが考えられる。図８のデータアクセス命令*images＿1は、被参照データinput＿imagesと特定できない被参照データunknown＿0x50100000とにアクセスしたことを示す。
【００４６】
トレース情報は、プログラムを実行して得るため、図４の第一のプログラム２１を静的に解析しただけでは得られない情報が得られる可能性がある。
【００４７】
（データアクセス回数情報）
解析部１１は、第一のプログラム２１を実行し、実行中のデータアクセス回数を記録したアクセス回数情報を生成する。なお、この実行は、トレース情報と同時に行ってもよいし、トレース情報とは別に行ってもよい。
【００４８】
図９は、図４の第一のプログラム２１を実行して得た被参照データごとのアクセス回数情報の一例を示す図である。データアクセス回数は、各データへの直接データアクセスの回数や間接データアクセスの回数、または両者の和であり、これらのうちどれを用いてもよい。図９では直接データアクセスと間接データアクセスの和を示している。図９では、例えば、input＿imagesには１００００回のデータアクセスがあったことを示す。なお、アクセス回数情報には全てのデータアクセスが記録されている必要はない。
【００４９】
（タスクグループとグループアクセス情報）
解析部１１は、第一のプログラム２１を解析して、タスクグループにおける直接データアクセスと間接データアクセスの所属関係を示すグループアクセス情報を生成する。図１０は、図４の第一のプログラム２１から得たグループアクセス情報の一例を示す図である。
【００５０】
タスクグループは１以上のタスクを含む。ここでは、タスクprepareからなるタスクグループと、タスクgetからなるタスクグループと、の２つを定義している。図１０では、各被参照データへの直接データアクセスを黒丸で、間接データアクセスを白丸で、アクセスがない部分を空欄で表現している。例えば、input＿imagesへのデータアクセスは、タスクprepareにおけるstream１０１と、タスクgetにおけるimages＿1１０２と、の間接データアクセスである。
【００５１】
グループアクセス情報により、各データに対する直接データアクセスと間接データアクセスが、どのタスクグループに所属しているかを特定することができる。図１０は、各タスクグループとして第一のプログラムにあるタスクのコードを併記しているが、実際のグループアクセス情報の形式はこれに限定されない。グループアクセス情報は、被参照データごとに、各タスクグループにおけるアクセス（直接データアクセス、間接データアクセス、アクセスがない）を示す情報であればよい。
【００５２】
（プログラム情報）
図１１は、図４の第一のプログラム２１のプログラム情報の一例を示す図である。プログラム情報は、最適化部１６が第一のプログラムを最適化して第二のプログラムを構築するために用いられる。プログラム情報は、第一のプログラムの実質的な内容を示す情報である。なお、本実施の形態では、図４の第一のプログラム２１そのものをプログラム情報としているが、機械語等に変換した結果をプログラム情報としてもよい。また、プログラム情報としては、例えば、第一のプログラム２１の構造を示す情報や、第一のプログラムの構造を異なる構造に変換した内部データ構造を示す情報や、関数に関する情報や、データに関する情報などがある。プログラム情報としてどのような情報を保持すべきかは、どのような第一のプログラムを入力して、どのような第二のプログラムを出力するかに依存するため、様々な情報がプログラム情報になる。
【００５３】
（反映部１２）
反映部１２は、トレース情報と参照依存関係情報を利用して、第一の参照関係情報を中間参照関係情報に変換する。図１２は、図７の参照依存関係情報と図８のトレース情報を用いて図６の第一の参照関係情報を変換した中間参照関係情報の一例を示す図である。
【００５４】
図８のトレース情報は、参照データimages＿1を利用して被参照データinput＿imagesにアクセスしたことを示している。このため、反映部１２は、参照データimages＿1と被参照データinput＿imagesの参照確実性情報を不確実から確実に変更している。さらに、反映部１２は、図７の参照依存関係情報を利用して、参照データimages＿2と被参照データinput＿imagesの参照確実性情報を不確実から確実に変更している。
【００５５】
このように、反映部１２は、第一の参照関係情報にトレース情報および参照依存関係情報を反映させることにより、第一の参照関係情報を中間参照関係情報に変換する。したがって、中間参照関係情報では、第一の参照関係情報に比べ、プログラム最適化装置１０のユーザが、参照関係の有無を判断しなければならない不確実な参照関係対が減っている。すなわち、ユーザが負担しなければならない指示コストが減っている。なお、反映部１２は、参照依存関係情報を利用せずに、トレース情報のみを利用して、第一の参照関係情報を中間参照関係情報に変換しても良い。
【００５６】
（生成部１３）
生成部１３は、アクセス回数情報、グループアクセス情報などを用いて順位情報を生成し、順位情報に基づいて中間参照関係情報から提示情報を生成する。生成部１３は、表示部４へ生成した提示情報を表示するよう指示し、表示部４に提示情報が表示される。
【００５７】
（順位情報）
順位情報とは、参照関係対に優先順位を与えるために利用する情報である。なお、参照関係がないと仮定した場合に性能が高くなる参照関係対に高い順位を与えることが望ましい。したがって、順位情報は、少なくとも参照確実性情報が「不確実」である参照関係対に対して与える。以下では、参照関係がないと仮定した場合に性能が高くなる参照関係対を判定する指標として、参照関係対が属する関数のアクセス属性、グループアクセス情報、被参照データのアクセス回数等を用いる例について説明する。本実施の形態では、複数の条件による順位付けを段階的に行うことにより、最も順位の高い参照関係対に関する提示情報を生成する。
【００５８】
例えば、各参照関係対の被参照データへのアクセス回数に基づいて多段階の順位付けをすることができる。なお、複数の参照関係対に同じ順位が与えられても良い。これにより、ユーザに参照関係の入力を促すための提示情報を効率的に示すことができる。
【００５９】
（関数のアクセス属性による順位付け）
生成部１３は、最適化部１６がタスクのデータ配置に関する最適化を行うことができるように、関数の属性による順位付けを行う。具体的には、参照確実性情報が「不確実」である参照関係対に対して、externalの関数で利用されている参照データを含む参照関係対に高い順位を与える。
【００６０】
図１３は、関数の属性による順位付けの一例を示す図である。生成部１３は、中間参照関係情報の各参照関係対が属する関数ごとに分類する。図１３の上図は、external関数に属する参照関係情報を示している。図１３の下図は、internal関数に属する参照関係情報を示している。図１３に示すように、external関数の優先順位をinternal関数より高く設定している。なお、参照関係が確実な参照関係対については黒塗りで表現している。生成部１３は、この順位付けした情報を、第一の順位情報として記憶部１７に格納する。
【００６１】
これは、外部から呼び出される可能性があるexternalの関数から参照データのフローを追うことで、ユーザによる解析時間を短縮することを期待していることによる。internalの関数から追うと、externalの関数を経由して参照データのフローを追っていく必要がある。
【００６２】
（グループアクセス情報による順位付け）
生成部１３は、中間参照関係情報を用いてグループアクセス情報を更新する。そして、生成部１３は、更新後のグループアクセス情報に基づいて、直接データアクセスと間接データアクセスに応じて参照関係対に優先順位を与える。
【００６３】
図１４は、図１２の中間参照関係情報を用いて、図１０のグループアクセス情報を更新した一例を示す図である。図１４では、間接データアクセスを、確実な参照関係と不確実な参照関係とに分類している。図１２の中間参照関係情報では、参照データimages＿1と被参照データinput＿imagesの参照確実性情報が「確実」である。このため、この参照関係対に対応する欄を確実な参照関係の間接データアクセス１０４としている。一方、参照データstreamと被参照データinput＿imagesは、参照確実性フラグが不確実な参照関係対に対応するため、不確実な参照関係の間接データアクセス１０３としている。
【００６４】
生成部１３は、グループアクセス情報を利用して、各被参照データ毎に、確実タスクグループと不確実タスクグループと無アクセスタスクグループとの３つに分類したタスクグループの属性情報を生成する。確実タスクグループとは、該被参照データへの直接データアクセスもしくは参照確実性情報が「確実」である参照関係対の参照データによる間接データアクセスを含むタスクグループである。不確実タスクグループとは、確実グループではなく、該被参照データへの参照確実性情報が「不確実」である参照関係対の参照データによる間接データアクセスを含むタスクグループである。無アクセスタスクグループとは、該被参照データにアクセスしない、もしくは、アクセスしないとみなされるタスクグループである。
【００６５】
図１５は、図１４のグループアクセス情報から得られた、各被参照データに関するタスクグループの属性情報の一例を示す図である。例えば、被参照データinput＿imagesについてのタスクprepareを含むタスクグループの属性は、参照確実性フラグが不確実な参照関係対を利用した間接データアクセスのみを含むため、不確実タスクグループである。被参照データinput＿imagesについてのタスクgetを含むタスクグループの属性は、参照確実性フラグが確実な参照関係対を利用した間接データアクセスを含むため、確実タスクグループである。被参照データwaitingについてのタスクprepareを含むタスクグループの属性は、直接データアクセスを含むため、確実タスクグループである。他の部分についても同様にタスクグループ属性が決定される。なお、図１５の空欄は、無アクセスタスクグループを示す。
【００６６】
図１６は、図１５のタスクグループ属性情報を利用して、図１３で高い順位が与えられたexternal関数に属する参照関係対に対してさらに優先順位を与えた結果を示す図である。具体的には、生成部１３は、確実タスクグループの数と不確実タスクグループの数の和が２以上、かつ、確実タスクグループの数が１以下となる被参照データを有する参照関係対に高い順位を与え、順位情報を更新し記憶部１７に格納する。例えば、図１５に示す被参照データinput＿imagesは、確実タスクグループの数と不確実タスクグループの数の和が２であり、かつ、確実タスクグループの数が１である。したがって、input＿imagesを被参照データとする参照関係対には高い順位を与える。また、例えば、図１５に示す被参照データwaitingは、確実タスクグループの数が２であるため、低い順位を与える。
【００６７】
（アクセス回数による順位付け）
図１７は、図１６に示した提示条件が成立した参照関係対に対して、さらにアクセス回数による順位付けを行った結果を示す図である。
【００６８】
具体的には、生成部１３は、被参照データのアクセス回数が多い参照関係対に高い順位を与える。図９のアクセス回数情報によると、input＿imagesへのアクセスは１００００回なのに対して、flagへのアクセスは１２０回である。したがって、被参照データinput＿imagesの参照関係対に高い順位を与え、順位情報を更新し記憶部１７に格納する。
【００６９】
（提示情報）
図１８は、最終的に最も高い順位を与えられた参照関係対を示す提示情報の一例を示す図である。図１８の例では、表示部４に画面表示される提示情報として、図１７で最も高い順位を与えられた参照データstreamsと被参照データinput＿imagesの参照関係を示している。上段は提示情報そのものを示し、下段はユーザからの入力を受け付けるためのボタンが表示されている。ユーザが、下段の「確実な参照関係」のボタン、または「非参照関係」のボタンを例えばマウス等により選択すると、入力部２が選択されたボタンに応じた入力情報を指示部１４へ通知する。なお、画面の表示は、同等の情報を表示してユーザからの入力を受け付けることができればよい。提示情報の形式は、例えば、テキストファイルやバイナリファイルのような記憶部３上のデータとして提示情報を生成し、表示部４や印刷等によりユーザが認識できるようにしてもよい。
【００７０】
図１８では、提示情報として１つの参照関係対を表示・選択しているが、複数の参照関係対を表示し、それぞれ選択させるようにしてもよい。図１９は、タスクグループ属性およびアクセス回数による順序付けで順位の高い順に提示情報として表示した例を示している。
【００７１】
なお、生成部１３は、順位付けを行う順序を変更可能である。本実施の形態では、関数の属性、タスクグループ属性、データアクセス回数の順序で順位付けの説明を行った。順位付けは、例えば、先にタスクグループ属性、次に関数の属性等、どのような順序で行ってもよい。また、生成部１３は、順位付けを少なくとも１つ以上行って提示情報を生成してもよい。
【００７２】
また、提示情報の選択方法は、例えば、各段階で全ての参照関係対に点数を与え、最後に合計の点数が高い順位を示す参照関係対を提示情報としてもよい。
【００７３】
さらに、上述した３つの順位付け以外、例えば、特定の被参照データに関する参照関係対か否か等により順位付けを行ってもよい。あるいは、生成部１３は、順位付けを行わなくてもよい。例えば、生成部１３は、中間参照関係情報全体を提示情報に含めたり、参照確実性情報が「不確実」な１つ以上の参照関係対をランダムに選んで提示情報としてもよい。
【００７４】
（指示部１４）
指示部１４は、入力部２からの入力情報に基づいて参照指示情報を生成する。例えば、ある参照関係対に対して「非参照関係」が選択された場合、指示部１４は、その参照関係対が「非参照関係」であることを示す参照指示情報を生成して記憶部１７へ格納する。図２０は、図１８において非参照関係が選択された入力情報に基づいて生成された参照指示情報を示す図である。
【００７５】
（変換部１５）
変換部１５は、参照指示情報および参照依存関係情報を用いて、中間参照関係情報を第二の参照関係情報に変換し、記憶部１７に格納する。
【００７６】
図２１は、図２０の参照指示情報と図７の参照依存関係情報を用いて、図１２の中間参照関係情報を変換した第二の参照関係情報の一例を示す図である。なお、図１２の中間参照関係情報では、参照データstreamsと被参照データinput＿imagesの参照確実性フラグが不確実であったが、参照指示情報により該参照関係対は非参照関係とみなすと指示されたため、図２１の第二の参照関係情報では、該参照関係対が削除されている（図中では、黒塗りで示す）。該参照関係対が非参照関係とみなされたことにより、図７の参照依存関係情報により、参照データsとstreamも被参照データinput＿imagesと非参照関係にあるとみなせる。したがって、図２１の第二の参照関係情報では、これらの参照関係対も該参照関係対が削除されている。
【００７７】
参照依存関係情報を用いる利点は、（Ａ）１つの参照関係対への指示で複数の参照関係対に指示を与えられることと、（Ｂ）指示を与える参照関係対と指示の効果を得たい参照関係対を切り離せることである。
【００７８】
上記（Ａ）は、少ない指示で多くの参照関係に指示を与えられるということを意味しており、ユーザの与えた少ない指示により第一のプログラム２１を解析するコストや、ユーザが参照指示情報を作るコストを削減することができる。
【００７９】
上記（Ｂ）は、ユーザが直感的に指示を与えられるということを意味している。例えば、図１２の中間参照関係情報の中で参照関係を明確にしたい参照関係対は、図１４のグループアクセス情報で不確実な参照関係の間接データアクセスである参照データstreamまたはimages＿1と各被参照データである。参照データstreamと被参照データinput＿imagesの参照関係対に指示を与えるとき、参照依存関係情報を利用しない場合、以下の（１）から（５）の作業を実施することになる。
（１）参照データstreamは関数transfer＿imageの引数であることを見つける。
（２）関数transfer＿imageはinternal属性であるから、関数transfer＿image＿allの中に唯一の関数コールがあることを突き止める。
（３）関数transfer＿imageの引数sはforeach文によりstreamsから得られることを突き止める。
（４）参照データstreamsは関数transfer＿image＿allの引数であることを見つける。
（５）関数transfer＿image＿allの全関数コールの引数を解析し、参照データstreamがアクセスするデータを突き止めて参照指示情報を与える。
【００８０】
これに対し、本実施の形態では、参照依存関係情報を利用することにより、上記（１）から（４）を生成部１３が行う。このため、ユーザは（１）から（４）を行う必要はない。また、参照依存関係情報を利用しないと、非直感的な指示を参照データstreamに対して行う必要がある。本実施の形態によれば、ユーザは参照データstreamsに対してボタンによる直観的な指示を行うことができる。
【００８１】
また、上記説明では、２つの簡単な関数しか存在しないが、さらに多くの関数が存在する、もしくは、より複雑なコードになっている場合においても、本実施の形態の参照依存関係情報を利用することにより、さらにユーザの作業量を削減できる。
【００８２】
（最適化部１６）
最適化部１６は、第二の参照関係情報を用いて、プログラム情報から最適化された第二のプログラム２２を構築して出力する。具体的には、最適化部１６は、第二の参照関係情報を用いてグループアクセス情報を更新し、この更新後のグループアクセス情報に基づいてタスクグループの属性情報を求める。そして、最適化部１６は、タスクグループの属性情報に基づいて、１つのタスクグループでのみ利用されている被参照データに対して、プログラム情報内の該被参照データの定義位置を特定し、プログラム情報の当該定義位置に最適化キーワードoptimized  taskを挿入した第二のプログラム２２を構築する。
【００８３】
図２２は、図１０のグループアクセス情報を、図２１の第二の参照関係情報を用いて更新した例を示す図である。図１４との相違点は、図１４の不確実な参照関係のデータアクセス１０３を削除したことである。これは、図２１の第二の参照関係情報で参照データstreamと被参照データinput＿imagesが非参照関係であり、間接アクセス*streamが被参照データinput＿imagesをアクセスしないとみなしたためである。
【００８４】
図２３は、図２２のグループアクセス情報から得られた、各被参照データのタスクグループの属性を示す図である。図１５との相違点は、図１４の不確実な参照関係のデータアクセス１０３を削除したことにより、被参照データinput＿imagesがタスクprepareを含むタスクグループではアクセスされないとみなされることである（図２２では空欄となる）。
【００８５】
図２４は、図２２のタスクグループの属性情報を利用して、図１１のプログラム情報に基づいて、被参照データに最適化指示optimized  taskキーワードを与えた第二のプログラム２２の一例を示す図である。
【００８６】
optimized  taskキーワードは、指定された被参照データがその後に続くタスクを含むタスクグループのみで利用されることを示している。コンパイラは、optimized  taskキーワードに基づいて最適化を行うことができる。例えば、図２４では、id＿1の定義文にoptimized  task  prepareキーワードが付与されている。このため、コンパイラは、被参照データid＿1に対して、タスクprepareのための最適化を行うことができる。同様に、被参照データinput＿imagesとid＿2に対してタスクgetのための最適化を行うことができる。
【００８７】
参照確実性情報が「不確実」な全ての参照関係対に対して参照指示情報を与える必要はなく、図２１に示すように、第二の参照関係情報に参照確実性情報が「不確実」な参照関係対が残っていても良い。最適化部１６は、参照確実性情報が「不確実」のままの参照関係対を、本実施例のように参照確実性情報が「確実」な参照関係対として扱っても良いし、該参照関係対を無視して非参照関係として扱っても良い。しかしながら、正しい参照関係を表現する参照関係対を無視した場合、正しく動作する第二のプログラム２２を生成できない場合がある。このため、参照確実性情報が「不確実」のままの参照関係対を無視して非参照関係対として扱う場合には、（１）そのような参照関係対を無視せずに参照確実性情報を「確実」として扱うこともできるようにする方法と、（２）無視した場合は第二のプログラム２２が正しく動作しない可能性があることを伝える方法を提供することが望ましい。
【００８８】
（プログラムのバリエーション）
第一のプログラム２１と第二のプログラム２２は、図４で例示した言語に限らず、例えば、Ｃ言語やJava（登録商標）のようなプログラミング言語で書かれたテキストファイル、もしくは独自のプログラミング言語で書かれたテキストファイルであってもよい。また、第一のプログラム２１と第二のプログラム２２は、実行バイナリなどのバイナリファイルであってもよい。また、第一のプログラム２１と第二のプログラム２２は、１つのファイルに全ての情報が入っている必要はなく、複数に分割されていてもよい。また、第一のプログラム２１と第二のプログラム２２は、ファイルという形式でなく、記憶部３上のデータであってもよい。例えば、Ｃ言語の構文解析装置が生成したメモリ上のデータである構文木を第一のプログラム２１と第二のプログラム２２として入出力してもよい。
【００８９】
また、第一のプログラム２１と第二のプログラム２２は、必要な処理を全て内包してある必要はなく、大きなプログラムの一部分でもよい。また、第一のプログラム２１と第二のプログラム２２は、異なる形式で表現されていても良い。例えば、第一のプログラム２１はＣ言語で記述されたテキストファイルであり、第二のプログラム２２は記憶部３上に記録された実行バイナリであっても良い。
【００９０】
（参照データと被参照データのバリエーション）
参照データと被参照データの関係は相対的なものであり、参照データかつ被参照データとなるデータがあっても良い。例えば、Ｃ言語では、通常のデータとポインタのデータは被参照データと参照データの関係であり、同時に、ポインタのデータと当該ポインタのアドレスを示すポインタのデータとは被参照データと参照データの関係である。この場合、ポインタのデータは参照データでもあり被参照データでもある。
【００９１】
（直接データアクセスと間接データアクセスのバリエーション）
直接データアクセスと間接データアクセスの表現方法は、プログラムの記述や記述方式や実行環境などによって様々存在する。例えば、Ｃ++言語では、図４の第一のプログラム２１のwaitingがユーザ定義型で被参照データＡと参照データＢを含み、オーバーロードした演算子+=で被参照データＡと参照データＢが参照する被参照データＣにアクセスしているなら、waiting+=1は被参照データＡへの直接データアクセスと被参照データＣへの間接データアクセスを含む。
【００９２】
間接データアクセスでは、参照データを利用して被参照データにアクセスする際に、被参照データへの間接データアクセスだけではなく、参照データへの直接データアクセスも発生してもよい。例えば、図４の例では、*streamによって、参照データstreamへの直接アクセスと参照データstreamが指し示す被参照データへの間接アクセスが行われる。
【００９３】
（参照関係情報のバリエーション）
参照関係対の構造は、参照データと被参照データが直接結びついた構造である必要はなく、参照データと被参照データの間接的な参照関係を表現していても良い。図２５は、参照データと被参照データの間接的な参照関係を表現する一例を示す図である。図２５の左側に示したプログラムでは、被参照データａは、参照データｐから参照された後、参照データｐを参照データｑに代入している。このプログラムから得られる参照データｑと被参照データａの参照関係の表現方法は、図２５の右上の構造が示すように直接的に参照関係を表現する方法と、右下の構造が示すように間接的に参照関係を表現する方法がある。
【００９４】
図２５の右下では、参照データｐとｑが等価であることを示す参照等価関係対１０５と、参照データｐと被参照データａの参照関係を示す参照関係対１０６と、によって、参照データｑと被参照データａの参照関係を間接的に表現している。参照等価関係対を用いる場合、解析部１１は、第一のプログラム２１に基づいて参照等価関係対を抽出して記憶部１７に格納しておき、生成部１３による順位付けや最適化部１６による第二のプログラム２２の生成時等に参照して用いることができる。
【００９５】
参照関係情報の構造は、参照関係対の組み合わせを示す情報があれば良い。例えば、図６のように参照データと被参照データの関係をテーブルの構造で表現しても良いし、例えば、参照データと被参照データの組み合わせによる構造体のデータを要素とする配列で表現しても良い。また、例えば、参照データと被参照データをノードとして、ノード間のエッジが参照関係対を示すようなグラフの構造でも良い。
【００９６】
第一の参照関係情報を生成した段階で、参照確実性情報が確実な参照関係対が存在しても良い。図２６は、第一のプログラム２１の別の一例を示す図である。例えば、図２６のプログラムでは、refキーワードを利用して、行２０１で「p  =  ref  a」として被参照データａの参照データを参照データｐに代入している。このような場合、解析部１１は、第一の参照関係情報を生成する際に、参照データｐと被参照データａの参照確実性情報を確実と設定しても良い。
【００９７】
（参照依存関係情報のバリエーション）
参照依存関係情報は、参照関係対の間の依存を推定できる情報であれば良い。図７は参照関係の依存を直接表現しているが、このような形式に限定されない。例えば、参照データimages＿1とimages＿2が等価であるという情報や参照データのデータフロー等を参照依存関係情報として保持しておけば、間接的にimages＿1とimages＿2を参照データとする参照関係対に関する参照依存関係を推定できる。
【００９８】
（トレース情報のバリエーション）
トレース情報は、図８に示した形式に限定されず、例えば、参照データの値を記録した情報でも良い。参照データの値とは、例えばメモリアドレスであり、被参照データの場所を特定可能な情報である。参照データの値を記録することにより、実際には間接データアクセスに利用されない参照データの値も含めて、参照データの値から間接データアクセスされる可能性がある被参照データを特定可能である。反映部１２が性質の異なるトレース情報も入力できるようにすることにより、様々なトレース情報を利用することが可能となる。
【００９９】
（アクセス回数情報のバリエーション）
アクセス回数情報は、第一のプログラム２１を実行して得られたデータアクセス回数ではなく、第一のプログラム２１を解析して得られたデータアクセスの推定回数でも良い。例えば、図２６のプログラムでは、（１）参照データｐが被参照データである配列ａを参照していることを解析可能であり、（２）forループが５回転であることを解析可能であり、（３）ループ内部で参照データｐが参照する被参照データである配列ａの要素に１を加えるために読み込みと書き込みの計２回のアクセスを行うことを解析可能である。このため、図２５のプログラムを実行すると被参照データａに１０回アクセスすることを推定可能である。
【０１００】
アクセス回数情報は、被参照データが複数の被参照データを内包する場合、内包される各被参照データのアクセス回数情報を保持しても良い。第一のデータが第二のデータを内包するとは、第一のデータが第二のデータを含むデータの集合であることを示す。例えば、Ｃ言語の配列は、配列の要素の集合データであり、配列は配列の要素を内包する。また、例えば、Ｃ言語の構造体は、構造体のメンバの集合データであり、構造体は構造体のメンバを内包する。
【０１０１】
また、例えば、図２６のプログラムでは、forループ１回転毎に被参照データａの各要素に読み込みと書き込みの計２回のアクセスを行うという情報を保持しても良い。アクセス回数情報における回数は、様々な単位が存在する。例えば、ＣＰＵが発行したload命令とstore命令の個数をアクセス回数としたり、load命令とstore命令によってアクセスされたデータのサイズをアクセス回数としたり、プログラム上に現われる回数をアクセス回数とするなどの単位がある。
【０１０２】
（解析部のバリエーション）
本実施の形態では、解析部１１が第一の参照関係情報と参照依存関係情報とグループアクセス情報とアクセス回数情報とトレース情報とを求めるようにしたが、１つ以上の情報を外部から解析部１１へ入力するようにしても良い。例えば、専用の装置を利用して、グループアクセス情報とアクセス回数情報とトレース情報を生成し、解析部１１に入力してもよい。
【０１０３】
また、プログラム最適化装置１０は、解析部１１と反映部１２と最適化部１６のうち、一部もしくは全部を取り除いた装置でも良い。例えば、最適化部１６を取り除いたプログラム解析装置を構成することができる。この場合は、変換部１５から出力される第二の参照関係情報がプログラム解析装置の出力（参照データと被参照データの参照関係の解析結果）となる。
【０１０４】
以上のように、本実施の形態では、解析部１１が、第一のプログラム２１を解析して参照データと被参照データごとの第一の参照関係情報と参照関係対間の依存性を示す参照依存関係情報と第一のプログラム２１の実アクセスに関する情報（トレース情報とアクセス回数情報）とタスクグループごとのグループアクセス情報とプログラム情報とを生成する。これらに基づき最適化効果の高いデータの提示情報を生成することにより、ユーザによる目視解析時間の短縮を実現できる。また、ユーザによる参照指示情報を複数のデータに反映させることにより、ユーザによる目視解析時間の短縮と参照指示情報の入力時間とを短縮できる。
【０１０５】
（第２の実施の形態）
次に、第２の実施の形態における解析部１１の処理について説明する。本実施の形態のプログラム最適化装置１０の構成は第１の実施の形態と同様である。以下、第１の実施の形態と異なる部分を説明する。
【０１０６】
本実施の形態では、解析部１１は、第一のプログラム２１から参照データの等価関係を示す参照等価関係を抽出して、各参照等価関係を表す参照等価関係対を第一の参照関係情報に加える。参照等価関係とは、同じ被参照データを参照する可能性がある第一の参照データと第二の参照データの関係である。参照関係の参照確実性情報と同様に、参照等価関係の状態を示すために、参照等価確実性情報を用いてもよい。
【０１０７】
図２７は、本実施の形態の第一の参照関係情報の一例を示す図である。図２７の上に第一のプログラム２１の例を、図２７の下に第一の参照関係情報の例を示している。図２７の下の第一の参照関係情報では、丸で記載したノードが参照データもしくは被参照データを示し、矢印付きのエッジが参照関係対を示し、矢印無しのエッジが参照等価関係対を示している。参照関係対を示す矢印は、始点が参照データ、終点が被参照データである。実線のエッジは参照確実性情報もしくは参照等価確実性情報が「確実」であることを示し、破線のエッジは参照確実性情報もしくは参照等価確実性情報が「不確実」であることを示す。なお、第一の参照関係情報は、図２７の下図のように、各データをノードとし、ノード間を接続するエッジの種別を定義した情報として保持してもよいし、第１の実施の形態と同様に表形式で管理してもよい。
【０１０８】
被参照データimageに指定されているinternalキーワードは、図２７のプログラムの内部からのみ、被参照データimageへの直接アクセスもしくは被参照データimageが参照されているか否かの情報を取得できることを意味する。解析部１１は、第一のプログラム２１を解析し、参照データｐには、refキーワードによって被参照データimageの参照が代入されていることから、参照データｐと被参照データimageの参照確実性情報を「確実」に設定する。参照データarrayは、参照データを要素として格納する配列への参照である。参照データarrayに関しては、参照データarrayが参照する配列の要素index＿1と参照データｐに対する参照等価関係と、参照データarrayが参照する配列の要素index＿2と参照データｑに対する参照等価関係と、がある。また、配列の要素index＿1とindex＿2の関係によっては、参照データｐとｑも参照等価関係である可能性がある。図２７では、参照データarray[index＿1]とarray[index＿2]に関する参照等価関係を１つのノードarrayにまとめて、エッジとして要素index＿1とindex＿2を示しているが、参照データarray[index＿1]とarray[index＿2]を異なるノードとする参照関係情報を出力しても良い。
【０１０９】
参照等価関係が確実であるとは、第一の参照データと第二の参照データで構成される参照等価関係対において、第一の参照データと第二の参照データが同じ被参照データを、常に参照するとみなすことや、参照することがあるとみなすことも含む。そのため、参照等価確実性フラグが確実な参照等価関係対であっても、第一の参照データが第二の参照データと同じ被参照データを参照しないことがあっても良い。参照等価関係が不確実であるとは、第一の参照データが第二の参照データと同じ被参照データを参照することがあるかないか判断できないことを意味する。参照等価関係がないとは、第一の参照データが第二の参照データと同じ被参照データを参照することはないとみなすことである。
【０１１０】
参照等価関係対の参照確実性情報が「確実」であることは、参照等価関係が確実であることを示す。参照確実性情報が「不確実」であることは、参照等価関係が不確実であることを示す。図２７では、解析部１１は、参照データarrayが参照する配列の一部index＿1と参照データpの参照等価関係が確実であると判断できるため、該参照確実性情報を「確実」に設定する。また、解析部１１は、図２７の第一のプログラム２１だけでは、配列の要素index＿1とindex＿2の関係を解析できないため、参照データｐとｑの参照等価確実性情報を「不確実」に設定する。
【０１１１】
解析部１１は、参照関係対と参照等価関係対の依存関係を解析して参照依存関係情報に追加しても良い。例えば、図２７の参照データｐと参照データｑの参照等価関係がないと仮定すると、被参照データimageにinternalキーワードが指定されているため、参照データｑと被参照データimageの参照関係もないとみなせる。例えば、図２７の参照データarray[index＿1]と参照データarray[index＿2]の参照等価確実性情報が「確実」であると仮定すると、参照データｑと被参照データimageの参照確実性情報も「確実」であるとみなせる。
【０１１２】
同様に、解析部１１は、第一の参照等価関係対と第二の参照等価関係対の依存関係を抽出して参照依存関係情報に含めても良い。例えば、図２７の参照データarray[index＿1]と参照データarray[index＿2]の参照等価確実性情報が「確実」であると仮定すると、参照データｐと参照データｑの参照等価確実性情報も「確実」であるとみなせる。参照依存関係情報は、参照関係対や参照等価関係対の間の依存を推定できる情報であれば良いため、参照等価関係対を図７と同様の形式で参照依存関係情報として利用可能である。
【０１１３】
反映部１２は、トレース情報を利用して第一の参照関係情報が含む参照等価確実性情報を不確実から確実に変更した中間参照関係情報を生成しても良い。例えば、反映部１２は、図２７の参照データｐとｑのトレース情報が入力され、参照データｐとｑが同じ被参照データを示した記録がトレース情報に含まれているのであれば、第一の参照関係情報の参照データｐとｑの参照等価確実性情報を、「不確実」から「確実」に変更した中間参照関係情報を生成する。
【０１１４】
また、生成部１３は、参照等価関係対に関する提示情報を生成しても良い。例えば、生成部１３は、参照等価確実性情報が「不確実」な参照等価関係対に関する情報を提示情報に含めても良い。図２７の例では、参照データｐとｑの参照確実性フラグが「不確実」であるため、該参照等価関係対に関する情報を提示情報として出力する。図２８は、参照等価関係対に関する提示情報の一例を示す図であり、ユーザに参照等価関係の入力を促している画面表示の一例である。なお、「不確実」な参照等価関係対が複数ある場合、提示情報として１つ以上を選択して表示してもよい。表示する参照等価関係対の選択方法は、例えば、第１の実施の形態で述べた参照関係対の提示情報の選択方法と同様の方法を用いることができる。
【０１１５】
指示部１４は、入力部２経由で参照等価関係対に関する指示の入力を受け付けて参照指示情報を生成しても良い。例えば、（１）被参照データimageの参照は関数assign5の内部でしか取得されておらず、かつ（２）index＿1とindex＿2が同じ値にならない場合、参照データｐとｑは同じ被参照データを参照しないとユーザは判断可能である。そのため、参照指示情報として、参照データｐとｑは非参照等価関係であるという情報を入力することができる。すると、参照データｑは被参照データimageを参照しないため、関数assign5により被参照データimageに値5が代入されることはないと判断できる。
【０１１６】
参照等価関係対に関する指示の入力を受け付ける場合は、例えば、ボタンを表示し、参照関係に関する入力と同様にユーザを受け付けるようにすればよい。
【０１１７】
変換部１５は、参照指示情報と参照依存関係情報を利用して、第一の参照関係情報に含まれる中間参照関係情報を生成して良い。例えば、参照データｐとｑは参照等価関係にないという参照指示情報が与えられたとすると、図２７の第一の参照関係情報に対して、参照データarray[index＿1]と参照データarray[index＿2]の参照等価関係対を削除することができる。さらに、変換部１５は、参照依存関係情報を利用することにより、参照データｑと被参照データimageの参照等価関係対も削除することが可能となる。以上述べた以外の本実施の形態の動作は、第１の実施の形態と同様である。
【０１１８】
以上のように、本実施の形態では、参照等価関係についても、参照関係と同様に提示情報に含めるようにした。このため、参照等価関係についても参照関係と同様にユーザによる参照指示情報を複数のデータに反映させることにより、ユーザによる目視解析時間の短縮と参照指示情報の入力時間とを短縮できる。
【０１１９】
（第３の実施の形態）
次に、第３の実施の形態の最適化部１６の処理について説明する。本実施の形態のプログラム最適化装置１０の構成は第１の実施の形態と同様である。以下、第１の実施の形態と異なる部分を説明する。
【０１２０】
第１の実施の形態では、コンパイラはプログラム最適化装置１０の外部にあるとして、最適化部１６は第二のプログラム２２にコンパイラへの指示を示すキーワードを付与するようにしたが、本実施の形態では、最適化部１６がコンパイラとしての機能を有し、コンパイル後のデータを第二のプログラム２２として出力する。本実施の形態では、最適化部１６はキーワードを付与せずに、図２３に示したタスクグループの属性情報に基づいて最適化されたコンパイルを実施してもよい。
【０１２１】
図２９は、図２３の第二のプログラム２２をコンパイルして最適化した実行ファイルをプログラミング言語形式で表現した例を示す図である。
【０１２２】
被参照データの定義の後ろには、該被参照データを配置するデータスペースを示している。データスペースとは、データを格納する領域であり、記憶部３のメモリやハードディスクなどのデータ領域もしくはその一部である。同じコンピュータシステム内では、記憶部３にＯＳが各タスクに与えるメモリ領域や、異なるコンピュータの各メモリ領域など、論理的に区切られた領域や物理的に区切られた領域がある。図２９では、被参照データinput＿imagesは共通データスペース、被参照データid＿1はタスクprepareのデータスペース、被参照データid＿2はタスクgetのデータスペースに配置されている。共通データスペースに配置されたデータは、全ての処理からアクセス可能である。特定のタスクのデータスペースに配置されたデータは、該当するタスクの処理からのみアクセス可能である。
【０１２３】
ここで、タスクのデータスペースへのアクセス速度の方が共通データスペースへのアクセス速度より速い場合を考える。このとき、タスクgetで被参照データinput＿imagesへアクセスする場合、被参照データinput＿imagesを一時的にタスクgetのデータスペースに移動した方が高速に処理できる可能性がある。したがって、最適化部１６は、次のような最適化処理を行う。関数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でもアクセスされる可能性があり、最適化を行うとデータの不整合が発生する可能性があるため、最適化のためのデータの移動は行わない。
【０１２４】
図３０は、本実施の形態の最適化（実行ファイルへの最適化）の効果が高いコンピュータシステムの一例を示す図である。図３０のコンピュータシステムは、master３０１、prepare３０２およびget３０３の３つのコンピュータがネットワークで接続されている。master３０１がメインの処理を実行し、prepare３０２がタスクprepareの処理を実行し、get３０３がタスクgetの処理を実行する。各コンピュータはデータスペースを保持しており、master３０１は共通データスペース３０４を備え、prepare３０２はデータスペース３０５を備え、get３０３はデータスペース３０６を備える。
【０１２５】
タスクprepareやタスクgetの実行により共通データスペース３０４のデータにアクセスする場合は、その都度、master３０１との間でデータが転送される。したがって、タスクprepareやタスクgetによる共通データスペースへの大量のアクセスは、膨大なデータ転送時間が必要になる可能性がある。そのため、例えば、共通データスペース３０４の被参照データをタスクgetから高速にアクセスできるデータスペース３０６に移動することにより、処理を高速化できる可能性がある。
【０１２６】
また、プログラム最適化装置１０が複数のプロセッサコアおよびキャッシュを備えるコンピュータシステムに実装される場合、プロセッサコアへのタスクの配置を最適化しても良い。図３１は、複数のプロセッサコアを備えるコンピュータシステムの構成例を示す図である。図３１のコンピュータシステムは、core（プロセッサコア）３１−１〜３１−４と、L1  cache３２−１〜３２−４と、L2  cache３３−１，３３−２と、L3  cache３４と、を備える。
【０１２７】
図３２は、解析部１１が第一のプログラム２１から抽出したグループアクセス情報の一部の一例を示している。図３２では、タスク４１−１〜４１−４がアクセスする可能性がある被参照データ４２−１〜４２−３に対し、タスク４１−１〜４１−４からのアクセスをデータ４２−１〜４２−３への矢印で表現している。実線の矢印は直接データアクセスもしくは参照確実性情報が「確実」である間接データアクセスを示しており、破線の矢印は参照確実性情報が「不確実」である間接データアクセスを示す。
【０１２８】
最適化部１６が図３２に示した各タスクを実行するプロセッサコアを決定する最適化処理の方法について説明する。最初に、解析部１１は、タスク４１−１〜４１−４を、アクセスする可能性のある被参照データごとにタスクグループに分類する。なお、複数の被参照データにアクセスするタスクは、複数のタスクグループに所属して良い。データ４２−１にアクセスする可能性のあるタスクグループ４３−１にはタスク４１−１、４１−２が属する。データ４２−２にアクセスする可能性のあるタスクグループ４３−２にはタスク４１−２〜４１−４が属する。データ４２−３にアクセスする可能性のあるタスクグループ４３−３にはタスク４１−２〜４１−４が属する。
【０１２９】
その後、第１の実施の形態と同様に、指示部１４が入力情報に基づいて参照指示情報を生成して、変換部１５が中間参照関係情報を第二の参照関係情報に変換する。これにより、あるタスクからアクセスしないとみなされた被参照データが発生したら、最適化部１６はタスクグループの再編成を行う。
【０１３０】
図３３は、再編成後のタスクグループの一例を示す図である。図３３では、タスクグループの分類の後、第二の参照関係情報に変換した結果、タスク４１−２がデータ４２−２、４２−３にアクセスしないとみなされた例を示している。この場合、最適化部１６は、再編成により、タスク４１−２をタスクグループ４３−２、４３−３から外している。タスクグループの再編成をしないと、タスク４１−２を（Ａ）データ４２−１に効率的にアクセスできるようにタスクグループ４３−１に含まれるタスク４１−１を実行するプロセッサコアと同じL2  cacheを持つプロセッサコアで実行するのか、（Ｂ）データ４２−２と４２−３に効率的にアクセスできるようにタスクグループ４３−２や４３−３に含まれるタスク４１−３とタスク４１−４を実行するプロセッサコアと同じL2  cacheを持つプロセッサコアで実行するのか、という最適化問題がある。しかし、タスクグループの再編成により、最適化部１６は（Ａ）を選択して効率的なタスクの実行を実現することが可能となる。例えばL2  cache３３−１を共有するcore３１−１とcore３１−２でタスク４１−１とタスク４１−２を実行する最適化を行うことにより、できるだけL3  cache３４を通さずにデータ４２−１にアクセスすることができる。
【０１３１】
さらに、最適化部１６は、タスク間への同期コードの自動挿入に関する最適化を行っても良い。例えば、図３２のタスク４１−２とタスク４１−３はデータ４２−２やデータ４２−３を共有する可能性がある。このため、正しい計算結果を得ることを保証するためにはタスク４１−２とタスク４１−３に同期コードを挿入することが望ましいが、図３３のようにタスク４１−２とタスク４１−３が同じデータを共有しないことが判明すれば同期コードを挿入しないという最適化が可能である。
【０１３２】
以上述べた以外の本実施の形態の動作は、第１の実施の形態と同様である。また、第２の実施の形態で述べたように参照等価関係について考慮する場合に、第３の実施の形態の最適化を行ってもよい。
【０１３３】
なお、本実施の形態のプログラム最適化装置１０を実装するコンピュータシステムは、図３０、図３１の構成に限定されない。効率的な最適化方法は、実際のコンピュータシステムの構成に依存する。最適化部１６は、そのコンピュータシステムに適した最適化を行った実行ファイルを生成すると、より処理を高速化できる可能性がある。
【０１３４】
以上のように、本実施の形態では、第二のプログラム２２を実行ファイルとして生成し、コンピュータシステムの構成を考慮して最適化を行うようにした。このため、第１の実施の形態と同様の効果が得られるとともに、コンピュータシステムに応じた最適化を実施することができ、処理を高速化できる。
【０１３５】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１３６】
１０  プログラム最適化装置、１１  解析部、１２  反映部、１３  生成部、１４  指示部、１５  変換部、１６  最適化部
【図１】
2013171459.tif 000003
【図２】
2013171459.tif 000004
【図３】
2013171459.tif 000005
【図４】
2013171459.tif 000006
【図５】
2013171459.tif 000007
【図６】
2013171459.tif 000008
【図７】
2013171459.tif 000009
【図８】
2013171459.tif 000010
【図９】
2013171459.tif 000011
【図１０】
2013171459.tif 000012
【図１１】
2013171459.tif 000013
【図１２】
2013171459.tif 000014
【図１３】
2013171459.tif 000015
【図１４】
2013171459.tif 000016
【図１５】
2013171459.tif 000017
【図１６】
2013171459.tif 000018
【図１７】
2013171459.tif 000019
【図１８】
2013171459.tif 000020
【図１９】
2013171459.tif 000021
【図２０】
2013171459.tif 000022
【図２１】
2013171459.tif 000023
【図２２】
2013171459.tif 000024
【図２３】
2013171459.tif 000025
【図２４】
2013171459.tif 000026
【図２５】
2013171459.tif 000027
【図２６】
2013171459.tif 000028
【図２７】
2013171459.tif 000029
【図２８】
2013171459.tif 000030
【図２９】
2013171459.tif 000031
【図３０】
2013171459.tif 000032
【図３１】
2013171459.tif 000033
【図３２】
2013171459.tif 000034
【図３３】
2013171459.tif 000035