JP2006107339A - プログラム処理装置 - Google Patents

プログラム処理装置 Download PDF

Info

Publication number
JP2006107339A
JP2006107339A JP2004296288A JP2004296288A JP2006107339A JP 2006107339 A JP2006107339 A JP 2006107339A JP 2004296288 A JP2004296288 A JP 2004296288A JP 2004296288 A JP2004296288 A JP 2004296288A JP 2006107339 A JP2006107339 A JP 2006107339A
Authority
JP
Japan
Prior art keywords
information
program
hint information
analysis
hint
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.)
Withdrawn
Application number
JP2004296288A
Other languages
English (en)
Inventor
Hajime Ogawa
一 小川
Toshiyuki Sakata
俊幸 坂田
Takehito Heiji
岳人 瓶子
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.)
Panasonic Holdings Corp
Original Assignee
Matsushita Electric Industrial Co Ltd
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 Matsushita Electric Industrial Co Ltd filed Critical Matsushita Electric Industrial Co Ltd
Priority to JP2004296288A priority Critical patent/JP2006107339A/ja
Priority to US11/232,975 priority patent/US20060080642A1/en
Priority to CNB2005101086087A priority patent/CN100468337C/zh
Publication of JP2006107339A publication Critical patent/JP2006107339A/ja
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/423Preprocessors

Landscapes

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

Abstract

【課題】 コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができるプログラム処理装置を提供する。
【解決手段】 ユーザがコンパイラに対して与えるヒント情報を含むプログラム101の構文を解析して、解析情報106を生成する構文解析部104と、前記解析情報106に基づいて、前記ヒント情報を含むプログラム101中での前記ヒント情報の論理的な整合性をチェックするエラーチェック部105とを備える。
【選択図】 図1

Description

本発明は、C言語等の高級言語で記述されたソースプログラムの論理矛盾をチェックするプログラム処理装置に関し、特に、ソースプログラムを機械語プログラムに変換するコンパイラに対して与えられるヒント情報の論理矛盾をチェックするプログラム処理装置に関する。
近年、メディア処理アプリケーションの増大化、多様化により、開発工数が増大し、メディア処理分野においても高級言語によるアプリケーション開発が必要とされるようになってきている。そのために、高級言語によるメディア処理アプリケーション開発を実現する試みが行われている。その際、ユーザは、高級言語による開発であっても、より精密なチューニングができることを期待している。このため、コンパイラが行う最適化戦略を詳細に制御することが必要となる。
その最適化戦略の制御方法は、大きく2つに分けられる。
一方の制御方法としては、コンパイラに対して、ある最適化に関する指示を直接行う制御方法が挙げられる。他方の制御方法としては、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行う制御方法が挙げられる。
そして、これらの2通りの制御方法を具体的に実現するための方法の1つとして、プラグマによるコンパイラに対する指示が挙げられる。「プラグマ」とは、言語処理系に依存した記述であり、コンパイラに対して何らかの情報を与えるものである。
以下に、プラグマの例を示す。図52は、最適化に関する指示を直接行うプラグマを含むソースプログラムの一例を示す図である。「#pragma _software_pipelining」は、その直後に記述されたループ処理に対してソフトウェアパイプライニングによる最適化を施すように指示を行なうためのプラグマであり、ユーザによって記述されたものである。コンパイラは、このプラグマによる指示に基づいて、当該ループ処理に対してソフトウェアパイプライニングによる最適化を施す。ソフトウェアパイプライニングとは、異なるイタレーション(繰り返し処理)を同時にいくつか実行する技術である。
図53は、プログラム全体の静的情報をコンパイラに対して示すプラグマを含むソースプログラムの一例を示す図である。「#pragma _min_iteration=5」は、その直後に記述されたループ処理に対して、ループ処理の繰り返しが少なくとも5回は実行されることをユーザが保証するプラグマである。コンパイラは、このプラグマに基づいて、例えば、ソフトウェアパイプライニングによる最適化が可能か否かを判断し、可能であればそのような最適化を行う。
このようなプラグマについては、特許文献1においても詳細に説明されている。
特開2004−38597号公報
しかし、上述の2通りの制御方法においては、ユーザは、実際のプログラムと論理的に矛盾が生じないようにプラグマを記述しなければならない。このため、プログラム中の複数のモジュールを自ら分析して、プラグマをプログラム中に記述しなければならないが、モジュールの呼出し関係の煩雑さにより、ユーザは矛盾したプラグマをプログラム中に付加してしまう可能性がある。そのような場合には、コンパイラは、誤ったプラグマの指示に基づいて、中間コードの最適化等を行なう。このため、コンパイラが誤った機械語プログラムを生成してしまうという問題がある。
また、誤った機械語プログラムの生成を避けるために、ユーザは、自身が解析可能な範囲内での消極的なプラグマしか付加することができず、良好な最適化が行われないという問題がある。
本発明は、上述の課題を解決するためになされたもので、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができるプログラム処理装置を提供することを第1の目的とする。
また、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックを行なうことができるプログラム処理装置を提供することを第2の目的とする。
上記目的を達成するために、本発明に係るプログラム処理装置は、ユーザがコンパイラに対して与えるヒント情報を含むプログラムを入力として受け、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックする。好ましくは、上述のプログラム処理装置は、ユーザがコンパイラに対して与えるヒント情報を含むプログラムの構文を解析して、解析情報を生成する構文解析手段と、前記解析情報に基づいて、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックするチェック手段とを備える。
解析情報に基づいて、ヒント情報の論理的な整合性をチェックすることにより、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができる。また、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックを行なうことができる。なお、このようなヒント情報には、コンパイラに対して、ある最適化に関する指示を直接行うヒント情報と、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行うヒント情報の両者が含まれる。
好ましくは、前記ヒント情報は、プログラムの静的な解析により得ることが可能な静的情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムの構文を静的に解析し、前記解析情報を生成する。前記ヒント情報は、ループ処理の繰り返し回数に関する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む前記解析情報を生成してもよい。例えば、前記ヒント情報は、ループ処理の繰り返しが所定回数以上行われることを指定する情報であり、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返しが、前記所定回数以上行われるか否かをチェックする。
ループ処理の繰り返し回数に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
さらに好ましくは、前記ヒント情報は、データの配置位置に関する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータの配置位置を解析して、当該データの配置位置を含む前記解析情報を生成する。例えば、前記ヒント情報は、データと、当該データが所定値でアラインメントされていることとを指定する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータのアラインメント値を解析して、解析結果を含む前記解析情報を生成し、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定されたデータのアラインメント値が、前記ヒント情報で指定された前記所定値と一致するか否かをチェックする。
データの配置に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
さらに好ましくは、前記ヒント情報は、ポインタ変数のアクセスする領域に関する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるポインタ変数のアクセスする領域を解析して、解析結果を含む前記解析情報を生成する。前記ヒント情報は、ポインタ変数と、当該ポインタ変数がアクセスする領域が、他のポインタ変数がアクセスする領域との間で重複する領域を有しないこととを指定する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるポインタ変数がアクセスする領域が、他のポインタ変数がアクセスする領域との間で重複する領域を有するか否かを解析して、解析結果を含む前記解析情報を生成し、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定されたポインタ変数が、他のポインタ変数がアクセスする領域との間で重複する領域を有するか否かをチェックしてもよい。例えば、前記プログラムはISO/IEC 9899:1999 - Programming Language Cに準拠した言語で記述されており、前記ヒント情報は、前記ポインタ変数と、restrict記述との組み合わせである。
ポインタ変数に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
さらに好ましくは、前記ヒント情報は、変数からのデータの読み出しまたは変数へのデータの書き込みに関する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれる変数からのデータの読み出しまたは当該変数へのデータの書き込みを解析して、解析結果を含む前記解析情報を生成する。例えば、前記ヒント情報は、変数と、当該ヒント情報が記述された位置以降においては、当該変数へのアクセスがデータの書き込みから始まることとを指定する情報であり、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定された変数が、当該ヒント情報が記述された位置以降においては、当該変数へのアクセスがデータの書き込みから始まっているか否かをチェックする。
変数からのデータの読み出しまたは変数へのデータの書き込みに関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
さらに好ましくは、前記ヒント情報は、分岐条件の成立頻度に関する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれる分岐条件の静的な成立頻度を解析して、解析結果を含む前記解析情報を生成する。例えば、前記ヒント情報は、分岐条件が成立する可能性が高いことを示す情報であり、前記チェック手段は、前記構文解析手段に基づいて、前記ヒント情報に対応する分岐条件が成立する可能性が高いか否かをチェックする。
分岐条件の成立頻度に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
さらに好ましくは、前記ヒント情報は、コンパイラによるプログラムの最適化処理方法を指示する情報であり、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指示された前記最適化処理方法が実現可能か否かをチェックする。また、前記ヒント情報は、ループアンローリングによるループ処理の最適化を指示する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理に対して、ループアンローリングによる最適化が可能か否かをチェックするようにしてもよい。
ループアンローリングによる最適化を直接コンパイラへ指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
さらに好ましくは、前記ヒント情報は、ソフトウェアパイプライニングによるループ処理の最適化を指示する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理に対して、ソフトウェアパイプライニングによる最適化が可能か否かを判断する。
ソフトウェアパイプライニングによる最適化を直接コンパイラに指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
さらに好ましくは、前記ヒント情報は、複数のデータと、当該複数のデータに対するペア命令の生成によるデータアクセスの最適化とを指示する情報であり、前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータのアラインメント値を解析して、解析結果を含む前記解析情報を生成し、前記チェック手段は、前記解析手段に基づいて、前記ヒント情報で指定された前記複数のデータのアラインメント値が、前記複数のデータの型のサイズの2倍以上であるという条件を満たすか否かを判断する条件判断部と、前記条件を満たす場合に、前記ヒント情報で指定された前記複数のデータに対して、ペア命令の生成によるデータアクセスの最適化が可能であると判断するペア命令生成可否判断部とを有する。
ペア命令の出力をコンパイラに直接指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
さらに好ましくは、前記ヒント情報は、変数と、キャッシュメモリの制御処理の最適化とを指示する情報である。
キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報が論理的に矛盾しているか否かをチェックすることができる。
本発明の他の局面に係るプログラム処理装置は、プログラム中の、コンパイラに対して与えられるヒント情報の論理的な整合性をチェックするプログラム処理装置であって、ユーザがコンパイラに対して与えるヒント情報を含むプログラムと、前記ヒント情報を含むプログラムの構文解析結果である解析情報とを入力とし、前記解析情報に基づいて、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックするチェック手段を備える。
外部より入力された解析情報に基づいて、ヒント情報の論理的な整合性をチェックすることにより、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができる。また、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックを行なうことができる。なお、このようなヒント情報には、コンパイラに対して、ある最適化に関する指示を直接行うヒント情報と、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行うヒント情報の両者が含まれる。
なお、本発明は、このような特徴的な手段を備えるプログラム処理装置として実現することができるだけでなく、プログラム処理装置が備える特徴的な手段をステップとするプログラム処理方法としても実現することができる。また、プログラム処理装置が備える特徴的な手段としてコンピュータを機能させるプログラムとして実現したりすることもできる。そして、そのようなプログラムは、CD−ROM等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
本発明によると、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができるプログラム処理装置を提供することができる。
また、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックを行なうことができるプログラム処理装置を提供することができる。
以下、本発明の実施の形態に係るプログラム処理装置について、図面を参照しながら説明する。
図1は、プログラム処理装置の構成を示す機能ブロック図である。プログラム処理装置102は、高級言語で記述され、かつプラグマに代表されるヒント情報を含むプログラム101を受け、プログラム101中でのヒント情報の論理的な整合性を判断する装置であり、構文解析部104と、エラーチェック部105とを備える。
構文解析部104は、プログラム101(プログラム101が複数のファイルからなる場合には、適宜、プログラム101aおよびプログラム101bと称する)を受け、プログラム101に対して、コンパイラ等で用いられる通常の構文解析処理を行ない、解析結果を解析情報106として出力する処理部である。
エラーチェック部105は、プログラム101および解析情報106に基づいて、ヒント情報の論理的な整合性をチェックし、チェック結果103を出力する処理部である。
なお、構文解析部104およびエラーチェック部105の実行する処理は、後述する実施の形態毎に異なる。このため、それぞれの実施の形態を説明する際に、その詳細について説明する。
[実施の形態1、繰り返し回数に関するヒント情報]
本実施の形態では、ループ処理の繰り返し回数に関するヒント情報の論理的な矛盾をチェックするプログラム処理装置について説明する。ループ処理の繰り返し回数に関するヒント情報には、例えば次のようなものがある。
(1) ループ処理の繰り返しの最大回数を指定するヒント情報
(2) ループ処理の繰り返しの最低回数を指定するヒント情報
(3) ループ処理の繰り返し回数が必ず偶数回であることを指定するヒント情報
(4) ループ処理の繰り返し回数が必ず奇数回であることを指定するヒント情報
これらのヒント情報を含むプログラム101に対して、プログラム処理装置102が実行する処理について説明する。
図2は、繰り返し回数に関するヒント情報を含むプログラムの一例を示す図である。図2(a)は、関数func1を含むプログラムの一例を示す図であり、図2(b)は、main関数、関数func2および関数func3を含むプログラムの一例を示す図である。
図2(a)に示されるプログラム101aおよび図2(b)に示されるプログラム101bは、それぞれコンパイルされた後、リンクされる関係にある。
上述の(2)番目のヒント情報の一種であるプラグマ「#pragma _min_iteration」は、ヒント情報の直後に来るループ処理(for, while, do)の繰り返し回数が少なくとも何回であるかを示している。図2(a)に示されるプログラム101aには、3行目にプラグマ「#pragma _min_iteration=5」が記述されている。したがって、ループ処理A(5行目から12行目まで)の繰り返し回数は最低5回であることがユーザによって示されている。
上述の(3)番目のヒント情報の一種であるプラグマ「#pragma _iteration_even」は、ヒント情報の直後に来るループ処理(for,while,do)の繰り返し回数が必ず偶数回であることを示している。プログラム101aには4行目にこのプラグマが記述されている。このため、ループ処理Aの繰り返し回数は必ず偶数回であることがユーザによって示されている。
上述の(4)番目のヒント情報の一種であるプラグマ「#pragma _iteration_odd」は、ヒント情報の直後に来るループ処理(for,while,do)の繰り返し回数が必ず奇数回であることを示している。プログラム101aには14行目にこのプラグマが記述されている。このため、ループ処理B(15行目から21行目まで)の繰り返し回数は必ず奇数回であることがユーザによって示されている。
なお、プログラム101aの13行目には、プラグマ「#pragma _min_iteration=3」が記述されている。したがって、ループ処理Bの繰り返し回数は最低3回であることがユーザによって示されている。
コンパイラによるコンパイル時には、プラグマ「#pragma _min_iteration」で指定されるループ処理の最低繰り返し回数により、当該ループ処理に対して、ソフトウェアパイプライニングを適用可能か否かの判定が行われ、可能な場合には、当該ループ処理にソフトウェアパイプライニングを行うような最適化が行なわれる。
また、プラグマ「#pragma _min_iteration」で指定されるループ処理の最低繰り返し回数が2回以上であり、かつ、プラグマ「#pragma _iteration_even」またはプラグマ「#pragma _iteration_odd」のみが当該ループ処理に対して指定されている場合には、コンパイラは、当該ループ処理に対してループアンローリングを行うような最適化を行う。ループアンローリングとは、ループ処理高速化手法の一つであり、複数のイタレーション(繰り返し処理)を同時に実行することにより、ループ処理内の実行速度を高速化する手法である。ループアンローリングは、展開する繰り返しの数が2回であれば、ループ処理の繰り返し回数が偶数の場合と、奇数の場合とでは、最適化の処理の仕方が異なってくる。偶数の場合は、そのままアンローリングすればよいが、奇数の場合、半端な1回分をループ処理の外側で実行させてやる必要がある。
これらのヒント情報を含むプログラム101aおよび101bを入力とした場合の構文解析部104およびエラーチェック部105の実行する処理について説明する。
図3は、構文解析部104の実行する処理のフローチャートである。構文解析部104は、プログラム101(プログラム101aおよびプログラム101b)全体を解析して、各関数のコールフローグラフを作成する(S202)。これは、通常コンパイラ等で作成されるコールフローグラフと同様のものである。
図4は、コールフローグラフの一例を示す図である。図4に示されるコールフローグラフ107は、図2(a)および図2(b)にそれぞれ示したプログラム101aおよびプログラム101bより作成されたコールフローグラフ107である。このコールフローグラフ107より、main関数が関数func2および関数func3を呼び出していることがわかる。また、関数func2が関数func1を呼び出し、関数func3も関数func1を呼び出していることもわかる。このように、コールフローグラフ107は、矢印の向きにより関数間の呼び出し関係を示している。
次に、図3に示されるように、構文解析部104は、作成したコールフローグラフ107に基づいて、大域変数または各関数が呼ばれる際に仮引数がどのような値を取るかを解析する(S203)。本実施の形態では、構文解析部104は、大域変数または仮引数が取り得る値の最大値および最小値を解析するとともに、偶数の値を取り得るか否かおよび奇数の値を取り得るか否かを解析する。なお、関数内の局所変数を解析するようにしてもよい。
構文解析部104は、解析した結果を解析情報106として出力する(S204)。図5は、解析情報の一例を示す図である。図5に示した解析情報106は、解析結果の一部を示している。例えば、関数func3の仮引数sについては、最大値および最小値がともに「5」であり、偶数の値は取り得ず、奇数の値を取り得ることが示されている。これは、以下のような解析を行うことにより求められる。すなわち、図4に示したコールフローフラグ107より、関数func3はmain関数より呼び出されることがわかる。プログラム101bより、main関数中での関数func3の実引数は「5」であり、関数func3は1回のみ呼ばれていることがわかる。このため、上述のような解析結果が得られる。
また、関数func1内での大域変数yについては、最大値が「6」で、最小値が「5」で、偶数の値および奇数の値のいずれをも取り得ることが解析情報106に示されている。これは、以下のような解析を行うことにより求められる。すなわち、コールフローグラフ107より、関数func1は関数func2および関数func3から呼び出されることがわかる。関数func2内では、大域変数yに「6」が代入されている。また、関数func3内では大域変数yに仮引数sの値が代入されている。ここで、コールフローグラフ107より関数func1はmain関数より呼び出されていることがわかる。そこでmain関数内の関数func3の実引数を調べると、「5」であることがわかる。このため、関数func3の仮引数sの値は「5」となる。すなわち、関数func3内の大域変数yの値も「5」となる。以上のことより、関数func3内の大域変数の取り得る値は「5」または「6」である。このため、上述のような解析結果が得られる。同様にして、図5に示すような解析情報106が得られる。
次にエラーチェック部105の実行する処理について説明する。
図6は、エラーチェック部105の実行する処理のフローチャートである。エラーチェック部105は、プログラム101aおよびプログラム101b中に含まれる各ループ処理について以下の処理を繰り返す。図2(a)に示すように、プログラム101aにはループ処理Aおよびループ処理Bの2つのループ処理が含まれている。したがって、これら2つのループ処理の各々について以下の処理が実行されることとなる。
エラーチェック部105は、着目しているループ処理に対して付加されたヒント情報が何であるかを判断する(S302)。例えば、プログラム101aに含まれるループ処理Aには、プラグマ「#pragma _min_iteration=5」およびプラグマ「#pragma _iteration_even」が付加されている。
当該ヒント情報がプラグマ「#pragma _min_iteration」の場合には(S302で# pragma _min_iteration)、解析情報106も利用して、当該ループ処理の最低繰り返し回数を求める(S303)。例えば、ループ処理Aの場合には、ループ処理の繰り返し回数を規定する仮引数xの値の最小値が「2」であることが、解析情報106よりわかる。このため、ループ処理Aの最低繰り返し回数は「2」であることが求められる。
ループ処理に対して付加されたヒント情報がプラグマ「#pragma _iteration_even」である場合には(S302で#pragma _iteration_odd/even)、エラーチェック部105は、解析情報106を利用しながら、当該ループ処理の繰り返し回数が偶数のみであるかを調べる(S305)。例えば、ループ処理Aの場合には、ループ処理の繰り返し回数を規定する仮引数xの値は、偶数のみを取り、奇数はとならないことが示されている。同様に、ループ処理に対して付加されたヒント情報がプラグマ「#pragma _iteration_odd」である場合には(S302で#pragma _iteration_odd/even)、エラーチェック部105は、解析情報106を利用しながら、当該ループ処理の繰り返し回数が奇数のみであるかを調べる(S305)。
なお、S303およびS305の処理は、いずれか一方が実行されるというわけではなく、同一のループ処理に対して付加されたヒント情報が複数ある場合には、S303およびS305の両方の処理が実行される場合もあり得る。
S303およびS305の処理の後、ループ処理に対して与えられたヒント情報と実際のループ処理の繰り返し回数とが矛盾していないか否かが調べられる(S304)。矛盾がある場合には(S304でNO)、チェック結果103がエラー情報として図示しない表示部に表示される(S306)。
例えば、プログラム101aの3行目で指定されているプラグマ「#pragma _min_iteration=5」は、ループ処理Aの最低繰り返し回数が最低5回であることを指示しているが、上述のように、ループ処理Aの最低繰り返し回数は2回であることがS303の処理で求められている。このため、エラーチェック部105は、チェック結果103をエラー情報として表示する。同様に、プログラム101aの14行目で指定されているプラグマ「#pragma _iteration_odd」は、ループ処理Bの繰り返し回数が奇数のみであることを指示しているが、ループ処理Bの繰り返し回数を規定する大域変数yの値は、偶数および奇数の双方を取り得ることが、S305の処理で調べられている。このため、エラーチェック部105は、チェック結果103をエラー情報として表示する。
図7は、チェック結果の一例を示す図である。上述したように、プログラム101aの3行目の「#pragma _min_iteration=5」と、14行目のプラグマ「#pragma _iteration_odd」とが論理的に矛盾していることが示されている。
チェック結果103のエラー表示(S306)が行われた後、またはループ処理に対して与えられたヒント情報と実際のループ処理の繰り返し回数とが矛盾していない場合(S304でYES)には、次のループ処理に対して、上述と同様の処理が行われる(S302〜S306)。また、着目しているループ処理に対して付加されたヒント情報がない場合には(S302でなし)、当該ループ処理に対しては、エラーチェック部105は何も処理を行わず、次のループ処理に対して、上述と同様の処理を行う(S302〜S306)。
プログラム101中に含まれるすべてのループ処理に対して、上述の処理(S302〜S306)が実行された時点で、エラーチェック部105の実行すべき処理が終了する。
以上説明したように、本実施の形態によると、ループ処理の繰り返し回数に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
なお、上述の実施の形態では、(2)番目から(4)番目までのヒント情報の一種であるプラグマを用いて説明を行ったが、(1)番目のヒント情報の一種として、プラグマ「#pragma _max_iteration」を用いてもよい。このプラグマは、ヒント情報の直後に来るループ処理(for, while, do)の繰り返し回数が最大何回であるかを示している。例えば、プラグマ「#pragma _max_iteration=10」との記述が、プログラム中にあった場合には、当該プラグマの直後に来るループ処理の繰り返し回数が最高10回であることがユーザによって示されている。このプラグマについても、エラーチェック部105がチェックを行うようにしてもよい。
また、エラーチェック部105は、解析情報106を利用することなく、ヒント情報の論理的な矛盾性を判断可能な場合には、そのような処理を行ってもよい。例えば、ループ処理の繰り返し回数が変数ではなく、定数で定義されているような場合には、解析情報106を参照することなく、エラーチェック部105がループ処理の最低繰り返し回数等を求めることが可能だからである。
[実施の形態2、ポインタ変数に関するヒント情報]
本実施の形態では、ポインタ変数に関するヒント情報の論理的な矛盾をチェックするプログラム処理装置について説明する。ポインタ変数に関するヒント情報には、例えば次のようなものがある。
(1) ポインタ変数が示すデータのアラインメント値を指定するヒント情報
(2) ポインタ変数が示す領域がオーバーラップしないことを示すヒント情報
これらのヒント情報を含むプログラム101に対して、プログラム処理装置102が実行する処理について説明する。
図8は、ポインタ変数に関するヒント情報を含むプログラムの一例を示す図である。図8(a)は、関数func1、関数func2および関数func3を含むプログラムの一例を示す図であり、図8(b)は、main関数を含むプログラムの一例を示す図である。
図8(a)に示されるプログラム101aおよび図8(b)に示されるプログラム101bは、それぞれコンパイルされた後、リンクされる関係にある。
上述の(1)番目のヒント情報の一種であるプラグマ「#pragma _align_pointer」は、プラグマで指定されたポインタ変数の指すデータのアラインメント値がメインメモリ上でいくつであるかを示している。例えば、図8(a)に示されるプログラム101a中の関数func3の直前には、プラグマ「#pragma _align_pointer=8 q1」との記述がある。これは、関数func3のポインタ変数q1で指示されるデータが8バイト単位でアラインメントされていることをユーザが示している記述である。同様に、プラグマ「#pragma _align_pointer=4 q2,q3」との記述は、ポインタ変数q2またはq3で指示されるデータが4バイト単位でアラインメントされていることをユーザが示している記述である。
なお、プログラム101aに含まれるプラグマ「#pragma _align_object」は、その後に示されるデータを指定されたバイト数でアラインメントせよというユーザの指示である。例えば、関数func1内のプラグマ「#pragma _align_object=4 a,b」という記述は、変数aおよびbを4バイト単位でメインメモリ上にアラインメントせよという指示である。変数aおよびbはshort型の変数であり、通常short型の変数は2バイトの変数である。したがって、本実施の形態では、プラグマ「#pragma _align_object」による指定がない場合には、short型の変数は2バイト単位でアラインメントされるものとする。
このように、データをアラインメントし、ペア命令を利用することにより複数のデータをメモリから一度にロードしたり、ライトしたりすることができ、コンパイラはそのような最適化を行うことができる。これにより、メモリアクセスの回数を減少させることができ、処理を高速化させることができる。
上述の(2)番目のヒント情報の一種であるrestrict記述は、C99言語(ISO/IEC 9899:1999 - Programming Language C)で導入されたものであり、そのスコープにおいて指定された全てのポインタ変数の指すメインメモリ上の領域が互いにオーバーラップしていないことを示している。すなわち、関数func3のポインタ変数q1,q2およびq3が指す領域は、互いにオーバーラップしないことがユーザによって示されている。例えば、ポインタq1が指す領域とポインタq2が指す領域とが互いにオーバーラップしていなければ、コンパイラは、前者の領域にデータを書き込む命令と、後者の領域にデータを書き込む命令との実行順序を入れ替えるような最適化を行うこともできる。
これらのヒント情報を含むプログラム101aおよび101bを入力とした場合の構文解析部104およびエラーチェック部105の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203で解析する対象が異なる。すなわち、構文解析部104は、関数のポインタ引数が指すデータのアラインメント値を解析するとともに、ポインタ引数が指す領域について解析を行って、他のポインタと同一領域を指す可能性があるか否かを解析する。
図9は、図8(a)および図8(b)に示されたプログラム101aおよび101bに基づいて、構文解析部104により作成されたコールフローグラフの一例を示す図である。このコールフローグラフ107によると、main関数は、関数func1および関数func2を呼び出している。また、関数func1および関数func2の各々は、関数func3を呼び出している。
図10は、構文解析部104により作成された解析情報106の一例を示す図である。図3のS203の処理において、構文解析部104は、プログラム101aおよび101bに基づいて、各関数呼出し時のポインタ引数および大域ポインタ変数のアラインメントおよび同一領域を指示する可能性について解析する。
例えば、関数func3の仮引数q1について考える。コールフローグラフ107に基づいて、関数func3は、関数func1および関数func2から呼び出されていることがわかる。関数func3の仮引数q1に対応する関数func1内での関数func3の実引数「&a」の指すデータは、プラグマ「#pragma _align_object=4 a,b」により4バイト単位でアラインメントされている。また、関数func3の仮引数q1に対応する関数func2内での関数func3の実引数「&x」の指すデータは、プラグマ「#pragma _align_object=8 x」により8バイト単位でアラインメントされている。このため、関数func3の仮引数q1が指すデータのアラインメント値は、4および8である。
また、関数func3の仮引数q1とq2とは、関数func1内での関数func3の実引数「&a」およびp1にそれぞれ対応する。関数func1内で関数func3を呼び出す直前に、p1に「&a」の値が代入されている。このため、p1と「&a」とは同じ値を示す。したがって、仮引数q1の指す領域と同一領域を指定する可能性のあるポインタとして、仮引数q2が求められる。
以下、同様に、仮引数q2およびq3についても、解析を行うと、図10に示すような解析情報106が得られる。
次に、エラーチェック部105の実行する処理について説明する。
図11は、エラーチェック部105の実行する処理のフローチャートである。エラーチェック部105は、プログラム101aおよびプログラム101b中に含まれる各ポインタ変数について以下の処理を繰り返す。図8(a)に示すように、プログラム101aには、ポインタ変数q1、q2およびq3等が含まれる。
エラーチェック部105は、ポインタ変数に付加されたヒント情報が何であるかを判断する(S402)。ポインタ変数に対して付加されたヒント情報がプラグマ「#pragma _align_pointer」である場合には(S402で#pragma _align_pointer)、解析情報106を利用して、当該ポインタ変数のアラインメント値を求める(S403)。例えば、関数func3の仮引数q1の場合には、アラインメント値として、4および8が求められる。
ポインタ変数に対して付加された情報がrestrict記述である場合には(S402でrestrict)、解析情報106を利用して、当該ポインタ変数が指し示す領域が他のポインタ変数が指し示す領域と互いにオーバーラップしないかどうかをチェックする(S405)。例えば、関数func3の仮引数q1が指し示す領域は、関数func3の仮引数q2が指し示す領域と互いにオーバーラップすることを示している。
なお、S403およびS405の処理は、いずれか一方が実行されるというわけではなく、同一のポインタ変数に対して付加されたヒント情報が複数ある場合には、S403およびS405の両方の処理が実行される場合もあり得る。
S403およびS405の処理の後、ポインタ変数に対して与えられたヒント情報と実際のポインタ変数の情報とが矛盾していないか否かが調べられる(S404)。矛盾がある場合には(S404でNO)、チェック結果103がエラー情報として図示しない表示部に表示される(S406)。
例えば、関数func3の仮引数q1については、プラグマ「#pragma _align_pointer=8 q1」およびrestrict記述の2つのヒント情報が付加されている。エラーチェック部105は、プラグマ「#pragma _align_pointer=8 q1」について、矛盾がないかのチェックをまず行う。解析情報106より、仮引数q1のアラインメント値は、4または8になり得ることがわかる。これは、ヒント情報であるプラグマ「#pragma _align_pointer=8 q1」と一致しない。このため、エラーチェック部105は、チェック結果103をエラー情報として表示する。次に、エラーチェック部105は、restrict記述について矛盾がないかのチェックを行う。解析情報106より、仮引数q1およびq2は同一の領域を指す場合が存在し、restrict記述と矛盾する。このため、エラーチェック部105は、チェック結果103をエラー情報として表示する。
チェック結果103のエラー表示(S406)が行われた後、またはポインタ変数に対して与えられたヒント情報と実際のポインタ変数の情報とが矛盾していない場合(S404でYES)には、次のポインタ変数(例えば、仮引数q2またはq3)に対して、上述と同様の処理が行われる(S402〜S406)。また、ポインタ変数に対して付加されたヒント情報がない場合には(S402でなし)、当該ポインタ変数に対しては、エラーチェック部105は何も処理を行わず、次のポインタ変数に対して、上述と同様の処理を行う(S402〜S406)。
図12は、チェック結果103の一例を示す図である。上述したように、プラグマ「#pragma _align_pointer=8 q1」と、restrict記述「short *restrict q1」とが実際のポインタ変数の情報と矛盾していることが示されている。その他にも、仮引数q2に対するrestrict記述が矛盾していることと、仮引数q3に対するプラグマが矛盾していることとが示されている。
プログラム101中に含まれるすべてのポインタ変数に対して、上述の処理(S402〜S406)が実行された時点で、エラーチェック部105が実行すべき処理が終了する。
以上説明したように、本実施の形態によると、データの配置に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
また、ポインタ変数に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
[実施の形態3、変数の読み書きに関するヒント情報]
本実施の形態では、変数の読み書きに関するヒント情報の論理的な矛盾をチェックするプログラム処理装置について説明する。変数の読み書きに関するヒント情報には、例えば次のようなものがある。
(1)ヒント情報の配置位置以降では、指定された変数へのアクセスはデータの書き込みから始まることを示すヒント情報
このヒント情報を含むプログラム101に対して、プログラム処理装置102が実行する処理について説明する。
図13は、変数の読み書きに関するヒント情報を含むプログラムの一例を示す図である。プログラム101には、関数func1、関数func2および関数func3が含まれている。
上述のヒント情報の一種であるプラグマ「#pragma _start_from_write」は、当該プラグマで指定された変数については、このプラグマの配置位置以降では、当該変数へのアクセスはデータの書込処理から始まることを示している。例えば、プログラム101の関数func1()中には、プラグマ「#pragma _start_from_write x」との記述がある。これは、このプラグマの配置位置以降では、変数xに対するアクセスはデータの書込処理から始まることをユーザが示したものである。
コンパイラは、このプラグマを手がかりとして、キャッシュメモリを備えるコンピュータにおいて、メモリアクセスが生じた場合には、その領域を確保するのみとし、メインメモリからキャッシュメモリへのデータの転送(プリフェッチ処理)を行わないような最適化を行うことができる。これにより、メモリアクセス時間を減少させることができる。
このヒント情報を含むプログラム101を入力とした場合の構文解析部104およびエラーチェック部105の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203で解析する対象が異なる。すなわち、構文解析部104は、各関数について、大域変数への読み出し、書き込みが存在するか否かの解析を行う。
図14は、図13に示したプログラム101に基づいて、構文解析部104により作成されたコールフローグラフの一例を示す図である。このコールフローグラフ107によると、関数func1が関数func2および関数func3を呼び出している。
図15は、構文解析部104により作成された解析情報106の一例を示す図である。図3のS203の処理において、構文解析部104は、各関数の大域変数ごとに読み書きの有無をチェックする。
例えば、関数func2では、大域変数yへのデータの書き込みと、大域変数xからのデータの読み出しとがあり、関数func3では、大域変数zへのデータの書き込みと、大域変数yからのデータの読み出しとがあるため、解析情報106は、図15のようになる。なお、関数func1についても同様の処理が行われ、解析情報106が作成される。
次に、エラーチェック部105の実行する処理について説明する。
図16は、エラーチェック部105の実行する処理のフローチャートである。エラーチェック部105は、プログラム101中に含まれる各大域変数について以下の処理を繰り返す。図13に示すようにプログラム101には、3つの大域変数x、yおよびzが含まれる。
エラーチェック部105は、着目している大域変数に対して付加されたヒント情報が何であるかを判断する(S501)。当該大域変数に対して付加されたヒント情報がプラグマ「#pragma _start_from_write」である場合には(S501で#pragma _start_from_write)、解析情報106を利用して、当該プラグマの配置位置以降に当該大域変数へのデータの書き込みがあるか否かを調べる(S502)。調べた結果、当該大域変数に与えられたプラグマ「#pragma _start_from_write」と、実際の当該大域変数へのデータの書き込みの情報とが矛盾していれば(S503でNO)、チェック結果103がエラー情報として図示しない表示部に表示される(S504)。
例えば、大域変数xについては、関数func1内にプラグマ「#pragma _start_from_write」によるヒント情報が付加されている。このため、S502の処理では、当該プラグマ位置以降の大域変数xへのデータの書き込みについてチェックする。プログラム101では、当該プラグマの直後に関数func2の呼び出しが存在するが、解析情報106によれば、関数func2内部で大域変数xからのデータの読み出しが存在する。よって、当該プラグマと実際の大域変数xへの書き込みの情報との間に矛盾がある(S503でNO)。このため、図17に示すようなチェック結果103がエラー情報として表示される(S504)。すなわちプラグマ「#pragma _start_from_write x」との記述が誤りであることが表示される。
同様に、大域変数zについて、関数func1内で付加されているプラグマ「#pragma _start_from_write」についてのチェックを行うと、当該プラグマの直後で呼び出されている関数func3では、大域変数zからのデータの読み出しのみが行われていることが、解析情報106よりわかる。このため、プラグマと実際の大域変数zへの書き込みの情報との間に矛盾がない。このため、エラー出力等は行われない。
以上説明したように、本実施の形態によると、変数からのデータの読み出しまたは変数へのデータの書き込みに関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
[実施の形態4、静的頻度に関するヒント情報]
本実施の形態では、静的頻度に関するヒント情報の論理的な矛盾をチェックするプログラム処理装置について説明する。静的頻度に関するヒント情報には、例えば次のようなものがある。
(1) 分岐条件の成立頻度が高いことを示すヒント情報
(2) 分岐条件の不成立頻度が高いことを示すヒント情報
これらのヒント情報を含むプログラム101に対して、プログラム処理装置102が実行する処理について説明する。
図18は、静的頻度に関するヒント情報を含むプログラムの一例を示す図である。プログラム101には、関数func1および関数func2が含まれている。
上述の(1)番目のヒント情報の一種であるプラグマ「#pragma _likely_true」は、直後のif文における条件式が成立する(条件式がtrueとなる)頻度が高いことを示している。プログラム101においては、if文の条件式である「i%5==0」が成立する頻度が高いことがユーザによって示されている。
コンパイラは、このプラグマに従い、if文の条件式が成立時に実行される命令列を、if文の不成立時に実行される命令列すなわちelse文で指定される命令列よりも優先的に実行されるような機械語命令配置の最適化を行う。これにより、機械語プログラム実行時の処理時間を向上させることができる。
上述の(2)番目のヒント情報の一種であるプラグマ「#pragma _likely_false」は、直後のif文における条件式が不成立となる(条件式がfalseとなる)頻度が高いことを示している。
コンパイラは、このプラグマに従い、if文の条件式が不成立時に実行される命令列すなわちelse文で指定される命令列を、if文の成立時に実行される命令列よりも優先的に実行されるような機械語命令配置の最適化を行う。これにより、機械語プログラム実行時の処理時間を向上させることができる。
これらのヒント情報を含むプログラム101を入力とした場合の構文解析部104およびエラーチェック部105の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203で解析する対象が異なる。すなわち、構文解析部104は、各関数の仮引数および大域変数について、値の頻度解析を行う。
図19は、図18に示したプログラム101に基づいて、構文解析部104により作成されたコールフローグラフの一例を示す図である。このコールフローグラフ107によると、関数func1が関数func2を呼び出している。
図20は、構文解析部104により作成された解析情報106の一例を示す図である。上述したように、図3のS203の処理において、構文解析部104は、各関数の仮引数および大域変数ごとに、値の頻度解析を行う。
例えば、関数func2の仮引数iの頻度を解析すると、関数func2は関数func1から合計17回呼び出される可能性があり、そのときの仮引数iの値の頻度が解析情報106として示されている。例えば、仮引数iが0となる回数は2回である。このため、2/17の確率で仮引数iが0となることが示されている。
次に、エラーチェック部105の実行する処理について説明する。
図21は、エラーチェック部105の実行する処理のフローチャートである。エラーチェック部105は、各if文について以下の処理を繰り返す。図18に示すようにプログラム101中には、「if(i%5==0)」というif文が含まれる。
エラーチェック部105は、着目しているif文に付加されたヒント情報が何であるかを判断する(S601)。付加されたヒント情報がプラグマ「#pragma _likely_true」またはプラグマ「#pragma _likely_false」である場合には(S601で#pragma _likely_true/false)、解析情報106を利用して、当該if文の条件式の成立または不成立の頻度をそれぞれ調べる(S602)。その結果、ヒント情報と実際の頻度とが矛盾していれば(S603でNO)、チェック結果103がエラー情報として図示しない表示部に表示される(S604)。
例えば、if文「if(i%5==0)」には、プラグマ「#pragma _likely_true」が付加されている。このため、エラーチェック部105は、当該if文の条件式「i%5==0」の成立頻度を、解析情報106に基づいて調べる(S602)。すなわち、条件式「i%5==0」が成立するのは、仮引数iが5の倍数のときであるが、仮引数iが5の倍数になるのは、4/17の確率である(仮引数iが0となる確率2/17と仮引数iが5となる確率2/17との和)。よって、この条件式が成立する頻度は過半数を下回り、当該条件式が不成立となる頻度の方が高いという判断がされる。よって、エラーチェック部105は、プラグマ「#pragma _likely_true」とif文の条件式「i%5==0」が成立する頻度との間に矛盾が生じるとの判断を行い(S603でNO)、図22に示すようなチェック結果103を表示する。
以上説明したように本実施の形態によると、静的頻度(分岐条件の成立頻度)に関するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
[実施の形態5、最適化手法を指定するヒント情報1]
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報の論理的な矛盾をチェックするプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、ループアンローリングを指定するヒント情報がある。
このヒント情報を含むプログラム101に対して、プログラム処理装置102が実行する処理について説明する。
図23は、ループアンローリングに関するヒント情報を含むプログラムの一例を示す図である。プログラム101には、関数func1および関数func2が含まれている。
ループアンローリングを指定するヒント情報の一種であるプラグマ「#pragma _loop_unrolling」は、直後に来るループ処理(for,while,do)に対して、ループアンローリングによる最適化をせよとのユーザによるコンパイラに対する指示である。例えば、プログラム101の関数func1内には、プラグマ「#pragma _loop_unrolling」が記述されており、直後のforループ処理をループアンローリングせよとの指示がユーザによりされている。ここでは、展開する繰り返しの数は2回であるものとする。
コンパイラは、このプラグマを手がかりとして、当該forループ処理に対してループアンローリングによる最適化を施す。これにより、forループ処理の実行速度を高速化することができる。
このヒント情報を含むプログラム101を入力とした場合の構文解析部104およびエラーチェック部105の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。図24は、図3のS202の処理の結果作成されるコールフローグラフを示す図である。コールフローグラフ107より、関数func2が関数func1を呼び出していることがわかる。
図25は、図3のS203およびS204の処理の結果作成される解析情報を示す図である。解析情報106によると、関数func1の仮引数xの最大値および最小値はともに「3」であり、偶数の値は取り得ず、奇数の値を取ることが示されている。解析情報106の作成処理は、実施の形態1と同様であるため、その詳細な説明はここでは繰り返さない。
図26は、エラーチェック部105の実行する処理のフローチャートである。エラーチェック部105は、プログラム101中に含まれる各ループ処理について、以下の処理を繰り返す。
エラーチェック部105は、ループ処理に対して付加されたヒント情報が何であるかを判断する(S701)。例えば、図23のプログラム101に含まれるforループ処理には、プラグマ「#pragma _loop_unrolling」が付加されている。
当該ヒント情報が、プラグマ「#pragma _loop_unrolling」の場合には(S701で#pragma _loop_unrolling)、解析情報106も利用して、当該ループ処理の繰り返し回数の可能性をチェックする(S702)。例えば、プログラム101のforループ処理の繰り返し回数は、仮引数xの値により規定されている。したがって、解析情報106より、forループ処理の繰り返し回数は3回のみであり、奇数回数のみしか取り得ないことがわかる。
エラーチェック部105は、着目しているループ処理の繰り返し回数が2回以上で、かつ当該繰り返し回数が奇数または偶数のみしか取らないかを判断する(S703)。この条件に合致しない場合には(S703でNO)、展開する繰り返しの数を2回とするループアンローリングによるループ処理の最適化を行うことができない。このため、そのような場合には、エラーチェック部105は、チェック結果103をエラー情報として図示しない表示部に表示する(S704)。
当該条件に合致する場合(S703でYES)、またはエラー表示を行った後は、次のループ処理に対して、上述の処理と同様の処理を行う(S701〜S704)。なお、上述のforループ処理の場合には、当該条件に合致する。
以上説明したように、本実施の形態によると、ループアンローリングによる最適化を直接コンパイラへ指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
[実施の形態6、最適化手法を指定するヒント情報2]
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報の論理的な矛盾をチェックする他のプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、ソフトウェアパイプライニングを指定するヒント情報がある。
図27は、ソフトウェアパイプライニングに関するヒント情報を含むプログラムの一例を示す図である。プログラム101には、関数func1および関数func2が含まれている。
ソフトウェアパイプライニングを指定するヒント情報の一種であるプラグマ「#pragma _software_pipelining」は、直後に位置するループ処理(for,while,do)に対して、ソフトウェアパイプライニングによる最適化をせよとのユーザによるコンパイラに対する指示である。例えば、プログラム101の関数func1内には、プラグマ「#pragma _software_pipelining」が記述されており、直後のforループ処理に対してソフトウェアパイプライニングによる最適化を施せとの指示がユーザによりされている。なお、ソフトウェアパイプライニングは、異なる繰り返し処理を同時にいくつか実行する技術であるため、ループ処理の繰り返し回数は、最低同時に実行される繰り返し処理の数以上必要となるが、ここでは、2回であるものとする。
コンパイラは、このプラグマを手がかりとして、当該forループ処理に対してソフトウェアパイプライニングによる最適化を施す。これにより、forループ処理の実行速度を高速化することができる。
このヒント情報を含むプログラム101を入力とした場合の構文解析部104およびエラーチェック部105の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203の処理においては、大域変数または各関数が呼ばれる際に仮引数の最小値のみを解析する点が異なる。
図28は、図3のS202の処理の結果作成されるコールフローグラフを示す図である。コールフローグラフ107より、関数func1が関数func2を呼び出していることがわかる。
図29は、図3のS203およびS204の処理の結果作成される解析情報を示す図である。解析情報106によると、関数func1の仮引数xの最小値は「2」であることが示されている。解析情報106の作成処理は、実施の形態1と同様であるため、その詳細な説明はここでは繰り返さない。
図30は、エラーチェック部105の実行する処理のフローチャートである。エラーチェック部105は、プログラム101中に含まれる各ループ処理について、以下の処理を繰り返す。
エラーチェック部105は、ループ処理に対して付加されたヒント情報が何であるかを判断する(S801)。例えば、図27のプログラム101に含まれるforループ処理には、プラグマ「#pragma _software_pipelining」が付加されている。
当該ヒント情報が、プラグマ「#pragma _software_pipelining」の場合には(S801で#pragma _software_pipelining)、解析情報106も利用して、当該ループ処理の繰り返し回数の可能性をチェックする(S802)。例えば、プログラム101のforループ処理の繰り返し回数は、仮引数xにより規定されている。したがって、解析情報106より、forループ処理の繰り返し回数は最低2回であることがわかる。
エラーチェック部105は、着目しているループ処理の繰り返し回数が2回以上であるか否かを判断する(S803)。この条件に合致しない場合には(S803でNO)、ソフトウェアパイプライニングによるループ処理の最適化を行うことができない。そのため、そのような場合には、エラーチェック部105は、チェック結果103をエラー情報として図示しない表示部に表示する(S804)。
当該条件に合致する場合(S803でYES)、またはエラー表示を行った後は、次のループ処理に対して、上述の処理と同様の処理を行う(S801〜S804)。なお、上述のforループ処理の場合には、当該条件に合致する。
以上説明したように、本実施の形態によるとソフトウェアパイプライニングによる最適化を直接コンパイラに指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
[実施の形態7、最適化手法を指定するヒント情報3]
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報の論理的な矛盾をチェックするさらに他のプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、ペア命令の出力を指定するヒント情報がある。
図31は、ペア命令に関するヒント情報を含むプログラムの一例を示す図である。プログラム101には、関数func1および関数func2が含まれている。
ペア命令に関するヒント情報の一種であるプラグマ「#pragma _pair_inst p」は、指定された配列pの要素をメモリから一度にロードしたり、メモリへライトしたりするペア命令を発行し、最適化せよとのユーザによるコンパイラに対する指示である。例えば、プログラム101の関数func2内には、プラグマ「#pragma _pair_inst a」が記述されており、配列aに対してペア命令を発行せよとの指示がユーザによりされている。なお、ペア命令を発行させるためには、配列pの要素のアラインメント値が、配列pの要素の通常の型の2倍以上なければならない。
コンパイラは、このプラグマを手がかりとして、配列pに対してペア命令を発行する最適化を施す。これにより、メモリアクセスの回数を減少させることができ、処理を高速化させることができる。
このヒント情報を含むプログラム101を入力とした場合の構文解析部104およびエラーチェック部105の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203の処理においては、関数の仮引数が指す配列の要素のアラインメント値を解析する点が異なる。なお、アラインメント値の解析方法は、実施の形態2に示したものと同様である。このため、その詳細な説明はここでは繰り返さない。
図32は、図3のS202の処理の結果作成されるコールフローフラグを示す図である。コールフローグラフ107より、関数func1が関数func2を呼び出していることがわかる。
図33は、図3のS203およびS204の処理の結果作成される解析情報を示す図である。解析情報106によると、関数func2の仮引数aで指し示される領域のデータ、すなわち配列aの各要素は4バイト単位でアラインメントされていることがわかる。
図34は、エラーチェック部105の実行する処理のフローチャートである。エラーチェック部105は、プログラム101中に含まれる各配列について、以下の処理を繰り返す。
エラーチェック部105は、着目している配列に対して付加されたヒント情報が何であるかを判断する(S901)。例えば、図31のプログラム101に含まれる配列aの先頭要素へのポインタには、プラグマ「#pragma _pair_inst」が付加されている(プログラム中では「#pragma _pair_inst a」と記述)。
当該ヒント情報が、プラグマ「#pragma _pair_inst」の場合には(S901で#pragma _pair_inst)、エラーチェック部105は、解析情報106も利用して、当該配列要素のアラインメント値をチェックする(S902)。ここでは、配列aの要素のアラインメント値が4であることが解析情報106よりわかる。
エラーチェック部105は、チェックした配列要素のアラインメント値が当該配列要素の通常の型の2倍以上あるか否かを判断する(S903)。この条件に合致しない場合には(S903でNO)、コンパイラは、配列に対してペア命令を発行する最適化を施すことができない。このため、そのような場合には、エラーチェック部105は、チェック結果103をエラー情報として図示しない表示部に表示する(S904)。
当該条件に合致する場合(S903でYES)、またはエラー表示を行った後は、次の配列に対して、上述の処理と同様の処理を行う(S901〜S904)。なお、プログラム101に含まれる配列aの要素は4バイトごとにアラインメントされており、かつ配列aの要素はshort型である。short型のデータは2バイトであることより、この配列aは上述の条件を満たすことになる。
以上説明したように、本実施の形態によると、ペア命令の出力をコンパイラに直接指示するヒント情報が論理的に矛盾しているか否かをチェックすることができる。
[実施の形態8、最適化手法を指定するヒント情報4]
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報の論理的な矛盾をチェックするさらに他のプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報がある。
図35は、キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報を含むプログラムの一例を示す図である。プログラム101には、関数func1および関数func2が含まれている。
キャッシュメモリ等の制御処理を指示するヒント情報の一種である組み込み関数reserve_regionは、その組み込み関数の実引数で指定された変数の値を記憶するための領域をキャッシュメモリ上に確保するのみであり、かつメインメモリからキャッシュメモリへはその変数の値を転送(プリフェッチ)しないという処理を実行する組み込み関数である。これにより、メモリアクセス時間を減少させることができる。このような処理ができるのは、組み込み関数reserve_region記述された位置以降では、当該組み込み関数reserve_regionの実引数で指定された変数に対するアクセスが、データの書き込みから開始されていることをユーザが保証しているからである。
このヒント情報を含むプログラム101を入力とした場合の構文解析部104およびエラーチェック部105の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203の処理においては、実施の形態3と同様に、各関数について、大域変数からのデータの読み出しおよび大域変数へのデータの書き込みが存在するか否かの解析を行う。
図36は、図3のS202の処理の結果作成されるコールフローグラフを示す図である。コールフローグラフ107より、関数func1が関数func2を呼び出していることがわかる。
図37は、図3のS203およびS204の結果作成される解析情報を示す図である。解析情報106によると、例えば、関数func2内では、大域変数xからの読み出しと、大域変数yへの書き込みとが行われていることがわかる。
図38は、エラーチェック部105の実行する処理のフローチャートである。エラーチェック部105は、プログラム101中に含まれる各大域変数について、以下の処理を繰り返す。
エラーチェック部105は、着目している大域変数に対して付加されたヒント情報が何であるかを判断する(S1001)。当該大域変数に対して付加されたヒント情報が組み込み関数reserve_regionである場合には(S1001でreserve_region())、エラーチェック部105は、解析情報106も利用して、当該組み込み関数の配置位置以降に当該大域変数へのデータの書き込みがあるか否かを調べる(S1002)。
エラーチェック部105は、着目している大域変数に関して、当該組み込み関数の配置位置以降では、当該大域変数へのアクセスは、データの書き込みから始まっているか否かを調べる(S1003)。当該条件に合致しない場合には(S1003でNO)、エラーチェック部105は、チェック結果103をエラー情報として図示しない表示部に表示する(S1004)。
例えば、大域変数xについては、プログラム101の関数func1内に組み込み関数reserve_region(x)によるヒント情報が付加されてる。このため、S1002の処理では、当該組み込み関数の配置位置以降の大域変数xへのデータの書き込みについてチェックする。プログラム101では、当該組み込み関数の直後に関数func2の呼び出しが存在するが、解析情報106によれば、関数func2内部で大域変数xからのデータの読み出しが存在し、大域変数xへのデータの書き込みが存在しない。よって、大域変数xへのアクセスについては、組み込み関数reserve_region(x)の配置位置以降では、当該大域変数xからのデータの読み出しより始まっており、上述の条件に合致しない(S1003でNO)。したがって、エラーチェック部105は、図39に示すようなチェック結果103をエラー情報として表示する。
上述の条件に合致する場合(S1003でYES)、またはエラー表示を行った後は、次の大域変数に対して、上述の処理と同様の処理を行う(S1001〜S1004)。
以上説明したように、本実施の形態によると、キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報が論理的に矛盾しているか否かをチェックすることができる。
上述の実施の形態1〜8によると、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報のチェックを行なうことができる。このため、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックを行なうことができる。なお、このようなヒント情報には、コンパイラに対して、ある最適化に関する指示を直接行うヒント情報と、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行うヒント情報の両者が含まれる。
以上、本発明に係るプログラム処理装置について、実施の形態に基づいて説明したが、本発明は、この実施の形態に限定されるものではない。
例えば、図40に示すようなプログラム101が与えられた場合に、エラーチェック部105は、上述の実施の形態と同様に図41に示すようなヒント情報のエラー情報を示すチェック結果103を表示させる代わりに、ヒント情報をどのように修正すればよいかがわかる場合には、図42に示すような修正情報を含むチェック結果103を表示させるようにしてもよい。図42のチェック結果103では、修正情報を示すチェック結果103の一例を示す図であり、プログラム101の2行目のプラグマ「#pragma _min_iteration=5を#pragma _min_iteration=2」に修正すべきであるとの修正情報を示している。
また、図43に示すようなプログラム101が与えられた場合には、プラグマ「#pragma _align_pointer=8 a」が論理的に矛盾しないためには、配列aの要素が8バイト単位でアラインメントされていればよい。このため、例えば、プログラム101の2行目にプラグマ「#pragma _align_object=8 a」を挿入すれば、プラグマ「#pragma _align_pointer=8 a」は論理的に矛盾しなくなる。図44は、このような修正情報を含むチェック結果103の一例を示す図である。なお、このような修正情報は、プラグマの形で与えられる必要はなく、コンパイルオプションの形で与えられるようにしてもよい。例えば、図45は、コンパイルオプションによる修正情報を含むチェック結果103の一例を示す図である。なお、「コンパイルオプション」とは、コンパイラを起動する際に、コンパイルの対象となるプログラム101の指定とともに、ユーザが任意に指定することができるコンパイラへの指示である。例えば、ユーザは、プログラム101「foo.c」をコンパイルするときに、コマンド「cc」を用いて、コンピュータのコマンドライン上で、
cc -falign-all-array=8 foo.c
と入力することができる。
さらに、図46に示すようなプログラム101が与えられた場合には、forループ処理の繰り返し回数を規定するmain関数の仮引数xは、機械語プログラム実行時に決まる。このため、forループ処理の繰り返し回数はコンパイル時には決定されない。したがって、プログラム101に含まれるプラグマ「#pragma _min_iteration=5」が論理的に矛盾しているか否か判断できない。よって、図47に示すような、当該プラグマが誤りかどうか判定不能であることを示す不確定情報を含むチェック結果103を表示するようにしてもよい。また、図48に示すような、当該プラグマが誤りになる可能性があることを示すワーニング情報を含むチェック結果103を表示するようにしてもよい。
さらにまた、図1に示したプログラム処理装置102の代わりに、図49に示すようなプログラム処理装置202を用いるようにしてもよい。プログラム処理装置202は、ヒント情報を含むプログラム101とそのプログラム101に対する解析情報106とを受け、プログラム101中でのヒント情報の論理的な整合性を判断する装置であり、構文解析部104と、エラーチェック部105とを備える。構文解析部204は、プログラム101(101a,101b)を受け、プログラム101(101a,101b)に対して、コンパイラ等で用いられる通常の構文解析処理を行なう処理部である。なお、解析情報106は、構文解析部204で構文解析されるプログラム100(100a,100b)とは異なるプログラム100(100a,100b)に対する解析結果である。例えば、プログラム100がプログラム100aとプログラム100bとからなるような場合にあっては、解析情報106はプログラム100aに対する解析情報106であり、構文解析部204に入力されるプログラムは、プログラム100bのような場合である。
エラーチェック部105の構成は、上述した実施の形態と同様であるため、その詳細な説明はここでは繰り返さない。図50は、プログラム処理装置202に入力されるプログラム101の一例を示しており、図51は、プログラム処理装置202に入力される解析情報106の一例を示している。その結果、プログラム処理装置202からは、図7に示したのと同様のチェック結果103が得られる。
また、プログラム101は、C言語で記述されたソースプログラムとして説明を行ったが、それ以外のC++言語等の高級言語で記述されたソースプログラムであってもよいし、オブジェクトプログラム、中間言語で記述されたプログラム、アセンブリ言語で記述されたプログラムであってもよい。
さらにまた、上述の実施の形態では、ヒント情報として主にプラグマを例に説明を行ったが、ヒント情報は、プラグマに限られるものではなく、組み込み関数や、コンパイルオプションや、プログラミング言語の予約語等であってもよい。
また、ループアンローリングにおいて展開する繰り返しの回数は2回に限定されるものではなく、それよりも多い回数であっても、同様の趣旨に基づく処理を行うことにより、ヒント情報のチェックを行うことができる。
さらに、ソフトウェアパイプライニングにおいて同時に実行される繰り返し処理の回数は2回に限定されるものではなく、それよりも多い回数であっても、同様の趣旨に基づく処理を行うことにより、ヒント情報のチェックを行うことができる。
本発明は、ユーザがコンパイラに対して与えるヒント情報の論理矛盾をチェックするプログラム処理装置等に利用可能であり、特に、プログラム中から、ヒント情報の論理矛盾をあらかじめ排除するプリプロセッサ等として利用可能である。
プログラム処理装置の構成を示す機能ブロック図である。 繰り返し回数に関するヒント情報を含むプログラムの一例を示す図である。(a)は、関数func1を含むプログラムの一例を示す図であり、(b)は、main関数、関数func2および関数func3を含むプログラムの一例を示す図である。 構文解析部の実行する処理のフローチャートである。 コールフローグラフの一例を示す図である。 解析情報の一例を示す図である。 エラーチェック部の実行する処理のフローチャートである。 チェック結果の一例を示す図である。 ポインタ変数に関するヒント情報を含むプログラムの一例を示す図である。(a)は、関数func1、関数func2および関数func3を含むプログラムの一例を示す図であり、(b)は、main関数を含むプログラムの一例を示す図である。 図8(a)および図8(b)に示されたプログラムに基づいて、構文解析部により作成されたコールフローグラフの一例を示す図である。 構文解析部により作成された解析情報の一例を示す図である。 エラーチェック部の実行する処理のフローチャートである。 チェック結果の一例を示す図である。 変数の読み書きに関するヒント情報を含むプログラムの一例を示す図である。 図13に示したプログラムに基づいて、構文解析部により作成されたコールフローグラフの一例を示す図である。 構文解析部により作成された解析情報の一例を示す図である。 エラーチェック部の実行する処理のフローチャートである。 チェック結果の一例を示す図である。 静的頻度に関するヒント情報を含むプログラムの一例を示す図である。 図18に示したプログラムに基づいて、構文解析部により作成されたコールフローグラフの一例を示す図である。 構文解析部により作成された解析情報の一例を示す図である。 エラーチェック部の実行する処理のフローチャートである。 チェック結果の一例を示す図である。 ループアンローリングに関するヒント情報を含むプログラムの一例を示す図である。 図3のS202の処理の結果作成されるコールフローグラフを示す図である。 図3のS203およびS204の処理の結果作成される解析情報を示す図である。 エラーチェック部の実行する処理のフローチャートである。 ソフトウェアパイプライニングに関するヒント情報を含むプログラムの一例を示す図である。 図3のS202の処理の結果作成されるコールフローグラフを示す図である。 図3のS203およびS204の処理の結果作成される解析情報を示す図である。 エラーチェック部の実行する処理のフローチャートである。 ペア命令に関するヒント情報を含むプログラムの一例を示す図である。 図3のS202の処理の結果作成されるコールフローフラグを示す図である。 図3のS203およびS204の処理の結果作成される解析情報を示す図である。 エラーチェック部の実行する処理のフローチャートである。 キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報を含むプログラムの一例を示す図である。 図3のS202の処理の結果作成されるコールフローグラフを示す図である。 図3のS203およびS204の結果作成される解析情報を示す図である。 エラーチェック部の実行する処理のフローチャートである。 チェック結果の一例を示す図である。 プログラムの一例を示す図である。 ヒント情報のエラー情報を示すチェック結果の一例を示す図である。 修正情報を含むチェック結果の一例を示す図である。 プログラムの一例を示す図である。 修正情報を含むチェック結果の一例を示す図である。 コンパイルオプションによる修正情報を含むチェック結果の一例を示す図である。 プログラムの一例を示す図である。 プラグマが誤りかどうか判定不能であることを示す不確定情報を含むチェック結果の一例を示す図である。 プラグマが誤りになる可能性があることを示すワーニング情報を含むチェック結果の一例を示す図である。 プログラム処理装置の他の構成を示す機能ブロック図である。 プログラムの一例を示す図である。 解析情報の一例を示す図である。 最適化に関する指示を直接行うプラグマを含むソースプログラムの一例を示す図である。 プログラム全体の静的情報をコンパイラに対して示すプラグマを含むソースプログラムの一例を示す図である。
符号の説明
101,101a,101b プログラム
102,202 プログラム処理装置
103 チェック結果
104,204 構文解析部
105 エラーチェック部
106 解析情報
107 コールフローグラフ

Claims (43)

  1. ユーザがコンパイラに対して与えるヒント情報を含むプログラムを受け、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックする
    ことを特徴とするプログラム処理装置。
  2. 前記ヒント情報を含むプログラムの構文を解析して、解析情報を生成する構文解析手段と、
    前記解析情報に基づいて、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックするチェック手段とを備える
    ことを特徴とする請求項1に記載のプログラム処理装置。
  3. 前記ヒント情報は、プログラムの静的な解析により得ることが可能な静的情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムの構文を静的に解析し、前記解析情報を生成する
    ことを特徴とする請求項2に記載のプログラム処理装置。
  4. 前記構文解析手段は、前記ヒント情報を含むプログラム中の関数間の情報を静的に解析して前記解析情報を生成する
    ことを特徴とする請求項3に記載のプログラム処理装置。
  5. 前記ヒント情報は、ループ処理の繰り返し回数に関する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む前記解析情報を生成する
    ことを特徴とする請求項3または4に記載のプログラム処理装置。
  6. 前記ヒント情報は、ループ処理の繰り返しが所定回数以上行われることを指定する情報であり、
    前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返しが、前記所定回数以上行われるか否かをチェックする
    ことを特徴とする請求項5に記載のプログラム処理装置。
  7. 前記ヒント情報は、ループ処理の繰り返しが所定回数以下しか行われないことを指定する情報であり、
    前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返しが、前記所定回数以下しか行われないか否かをチェックする
    ことを特徴とする請求項5に記載のプログラム処理装置。
  8. 前記ヒント情報は、ループ処理の繰り返し回数が必ず偶数であることを指定する情報であり、
    前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返し回数が必ず偶数であるか否かをチェックする
    ことを特徴とする請求項5に記載のプログラム処理装置。
  9. 前記ヒント情報は、ループ処理の繰り返し回数が必ず奇数であることを指定する情報であり、
    前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返し回数が必ず奇数であるか否かをチェックする
    ことを特徴とする請求項5に記載のプログラム処理装置。
  10. 前記ヒント情報は、データの配置位置に関する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータの配置位置を解析して、当該データの配置位置を含む前記解析情報を生成する
    ことを特徴とする請求項3または4に記載のプログラム処理装置。
  11. 前記ヒント情報は、データと、当該データが所定値でアラインメントされていることとを指定する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータのアラインメント値を解析して、解析結果を含む前記解析情報を生成し、
    前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定されたデータのアラインメント値が、前記ヒント情報で指定された前記所定値と一致するか否かをチェックする
    ことを特徴とする請求項10に記載のプログラム処理装置。
  12. 前記ヒント情報は、ポインタ変数のアクセスする領域に関する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるポインタ変数のアクセスする領域を解析して、解析結果を含む前記解析情報を生成する
    ことを特徴とする請求項3または4に記載のプログラム処理装置。
  13. 前記ヒント情報は、ポインタ変数と、当該ポインタ変数がアクセスする領域が、他のポインタ変数がアクセスする領域との間で重複する領域を有しないこととを指定する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるポインタ変数がアクセスする領域が、他のポインタ変数がアクセスする領域との間で重複する領域を有するか否かを解析して、解析結果を含む前記解析情報を生成し、
    前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定されたポインタ変数が、他のポインタ変数がアクセスする領域との間で重複する領域を有するか否かをチェックする
    ことを特徴とする請求項12に記載のプログラム処理装置。
  14. 前記プログラムはISO/IEC 9899:1999 - Programming Language Cに準拠した言語で記述されており、
    前記ヒント情報は、前記ポインタ変数と、restrict記述との組み合わせである
    ことを特徴とする請求項13に記載のプログラム処理装置。
  15. 前記ヒント情報は、変数からのデータの読み出しまたは変数へのデータの書き込みに関する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれる変数からのデータの読み出しまたは当該変数へのデータの書き込みを解析して、解析結果を含む前記解析情報を生成する
    ことを特徴とする請求項3または4に記載のプログラム処理装置。
  16. 前記ヒント情報は、変数と、当該ヒント情報が記述された位置以降においては、当該変数へのアクセスがデータの書き込みから始まることとを指定する情報であり、
    前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指定された変数が、当該ヒント情報が記述された位置以降においては、当該変数へのアクセスがデータの書き込みから始まっているか否かをチェックする
    ことを特徴とする請求項15に記載のプログラム処理装置。
  17. 前記ヒント情報は、分岐条件の成立頻度に関する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれる分岐条件の静的な成立頻度を解析して、解析結果を含む前記解析情報を生成する
    ことを特徴とする請求項3または4に記載のプログラム処理装置。
  18. 前記ヒント情報は、分岐条件が成立する可能性が高いことを示す情報であり、
    前記チェック手段は、前記構文解析手段に基づいて、前記ヒント情報に対応する分岐条件が成立する可能性が高いか否かをチェックする
    ことを特徴とする請求項17に記載のプログラム処理装置。
  19. 前記ヒント情報は、コンパイラによるプログラムの最適化処理方法を指示する情報であり、
    前記チェック手段は、前記解析情報に基づいて、前記ヒント情報で指示された前記最適化処理方法が実現可能か否かをチェックする
    ことを特徴とする請求項2〜4のいずれか1項に記載のプログラム処理装置。
  20. 前記ヒント情報は、ループアンローリングによるループ処理の最適化を指示する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、
    前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理に対して、ループアンローリングによる最適化が可能か否かをチェックする
    ことを特徴とする請求項19に記載のプログラム処理装置。
  21. 前記チェック手段は、
    ループアンローリング時に展開する繰り返しの数が2の場合には、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返し回数が2回以上で、かつ奇数回または偶数回のいずれかのみであるという条件を満たすか否かを判断する条件判断部と、
    前記条件を満たす場合に、前記ヒント情報に対応するループ処理に対して、ループアンローリングによる最適化が可能であると判断するループアンローリング可否判断部とを有する
    ことを特徴とする請求項20に記載のプログラム処理装置。
  22. 前記ヒント情報は、ソフトウェアパイプライニングによるループ処理の最適化を指示する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、
    前記チェック手段は、前記解析情報に基づいて、前記ヒント情報に対応するループ処理に対して、ソフトウェアパイプライニングによる最適化が可能か否かを判断する
    ことを特徴とする請求項19に記載のプログラム処理装置。
  23. 前記チェック手段は、
    同時に実行される繰り返しの数がn(nは2以上の整数)の場合には、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返し回数がn回以上であるか否かを判断する繰り返し回数判断部と、
    前記ヒント情報に対応する前記ループ処理の前記繰り返し回数がn回以上であれば、当該ループ処理に対して、ソフトウェアパイプライニングによる最適化が可能であると判断するソフトウェアパイプライニング可否判断部とを有する
    ことを特徴とする請求項22に記載のプログラム処理装置。
  24. 前記ヒント情報は、複数のデータと、当該複数のデータに対するペア命令の生成によるデータアクセスの最適化とを指示する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれるデータのアラインメント値を解析して、解析結果を含む前記解析情報を生成し、
    前記チェック手段は、
    前記解析手段に基づいて、前記ヒント情報で指定された前記複数のデータのアラインメント値が、前記複数のデータの型のサイズの2倍以上であるという条件を満たすか否かを判断する条件判断部と、
    前記条件を満たす場合に、前記ヒント情報で指定された前記複数のデータに対して、ペア命令の生成によるデータアクセスの最適化が可能であると判断するペア命令生成可否判断部とを有する
    ことを特徴とする請求項19に記載のプログラム処理装置。
  25. 前記ヒント情報は、変数と、キャッシュメモリの制御処理の最適化とを指示する情報である
    ことを特徴とする請求項19に記載のプログラム処理装置。
  26. 前記ヒント情報は、変数と、当該変数の値を記憶するための領域を前記キャッシュメモリ上に確保することを指示する情報であり、
    前記構文解析手段は、前記ヒント情報を含むプログラムに含まれる変数からのデータの読み出しまたは当該変数へのデータの書き込みを解析して、解析結果を含む前記解析情報を生成し、
    前記チェック手段は、
    前記解析手段に基づいて、前記ヒント情報で指定された前記変数が、当該ヒント情報が記述された位置以降においては、当該変数へのアクセスがデータの書き込みから始まっているという条件を満たすか否かを判断する条件判断部と、
    前記条件を満たす場合に、前記ヒント情報で指定された前記変数の値を記憶するための領域を前記キャッシュメモリ上に確保することによる前記キャッシュメモリの最適化が可能であると判断するキャッシュメモリ最適化可否判断部とを有する
    ことを特徴とする請求項25に記載のプログラム処理装置。
  27. 前記プログラムはC言語またはC++言語で記述されており、
    前記ヒント情報は、前記プログラム中にユーザが記述することができるコンパイラへの指示であるプラグマ記述である
    ことを特徴とする請求項1〜26のいずれか1項に記載のプログラム処理装置。
  28. 前記ヒント情報は、組込み関数である
    ことを特徴とする請求項1〜26のいずれか1項に記載のプログラム処理装置。
  29. さらに、前記チェック手段において前記ヒント情報の論理的な整合性がないと判断された場合には、エラー情報を出力するエラー情報出力手段を備える
    ことを特徴とする請求項2〜28のいずれか1項に記載のプログラム処理装置。
  30. 前記エラー情報出力手段は、前記チェック手段において前記ヒント情報の論理的な整合性がないと判断された場合には、当該ヒント情報の修正方法を出力する
    ことを特徴とする請求項29に記載のプログラム処理装置。
  31. 前記エラー情報出力手段は、前記チェック手段において前記ヒント情報の論理的な整合性がないと判断された場合には、不足するヒント情報を出力する
    ことを特徴とする請求項29記載のプログラム処理装置。
  32. 前記エラー情報出力手段は、前記チェック手段において前記ヒント情報の論理的な整合性がないと判断された場合には、コンパイラを起動する際に、コンパイルの対象となる前記ヒント情報を含むプログラムに対してユーザが指定するコンパイルオプションを出力する
    ことを特徴とする請求項29に記載のプログラム処理装置。
  33. 前記コンパイルオプションは、前記コンパイルの対象となる前記ヒント情報を含むプログラムに含まれるデータの配置方法を指示するコンパイルオプションである
    ことを特徴とする請求項32に記載のプログラム処理装置。
  34. さらに、前記チェック手段において前記ヒント情報の論理的な整合性があるか否かを判断できない場合には、当該ヒント情報の論理的な整合性があるか否かが判断できないことを示すエラー情報を出力するエラー情報出力手段を備える
    ことを特徴とする請求項2〜28のいずれか1項に記載のプログラム処理装置。
  35. プログラム中の、コンパイラに対して与えられるヒント情報の論理的な整合性をチェックするプログラム処理装置であって、
    ユーザがコンパイラに対して与えるヒント情報を含むプログラムと、前記ヒント情報を含むプログラムの構文解析結果である解析情報とを入力とし、前記解析情報に基づいて、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックするチェック手段を備える
    ことを特徴とするプログラム処理装置。
  36. 前記解析情報には、関数の引数に関する情報が含まれる
    ことを特徴とする請求項35に記載のプログラム処理装置。
  37. 前記解析情報には、大域変数に関する情報が含まれる
    ことを特徴とする請求項35に記載のプログラム処理装置。
  38. 前記解析情報には、データの配置位置に関する情報が含まれる
    ことを特徴とする請求項35に記載のプログラム処理装置。
  39. 前記解析情報には、ポインタ変数のアクセスする領域に関する情報が含まれる
    ことを特徴とする請求項35に記載のプログラム処理装置。
  40. 請求項2〜39のいずれか1項に記載のプログラム処理装置に含まれる手段としてコンピュータを機能させる
    ことを特徴とするプログラム。
  41. 請求項40に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
  42. ユーザがコンパイラに対して与えるヒント情報を含むプログラムを入力として受け、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックする
    ことを特徴とするプログラム処理方法。
  43. 前記ヒント情報を含むプログラムの構文を解析して、解析情報を生成する構文解析ステップと、
    前記解析情報に基づいて、前記ヒント情報を含むプログラム中での前記ヒント情報の論理的な整合性をチェックするチェックステップとを含む
    ことを特徴とする請求項42に記載のプログラム処理方法。
JP2004296288A 2004-10-08 2004-10-08 プログラム処理装置 Withdrawn JP2006107339A (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2004296288A JP2006107339A (ja) 2004-10-08 2004-10-08 プログラム処理装置
US11/232,975 US20060080642A1 (en) 2004-10-08 2005-09-23 Program processing apparatus
CNB2005101086087A CN100468337C (zh) 2004-10-08 2005-10-08 程序处理装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2004296288A JP2006107339A (ja) 2004-10-08 2004-10-08 プログラム処理装置

Publications (1)

Publication Number Publication Date
JP2006107339A true JP2006107339A (ja) 2006-04-20

Family

ID=36146829

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004296288A Withdrawn JP2006107339A (ja) 2004-10-08 2004-10-08 プログラム処理装置

Country Status (3)

Country Link
US (1) US20060080642A1 (ja)
JP (1) JP2006107339A (ja)
CN (1) CN100468337C (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2009098739A1 (ja) * 2008-02-05 2009-08-13 Panasonic Corporation プログラム最適化装置およびプログラム最適化方法
WO2010050128A1 (ja) * 2008-10-30 2010-05-06 パナソニック株式会社 コンパイル方法及びコンパイルプログラム
JP2019028540A (ja) * 2017-07-26 2019-02-21 富士通株式会社 情報処理装置、コンパイル方法及びコンパイルプログラム
JP2020526811A (ja) * 2017-07-07 2020-08-31 エヌチェーン ホールディングス リミテッドNchain Holdings Limited ブロックチェーンスクリプトにおける制御フロー

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7904887B2 (en) * 2006-02-16 2011-03-08 International Business Machines Corporation Learning and cache management in software defined contexts
US8799871B2 (en) * 2007-01-08 2014-08-05 The Mathworks, Inc. Computation of elementwise expression in parallel
CN101369233A (zh) 2007-08-14 2009-02-18 国际商业机器公司 程序编译方法和编译器
US8191057B2 (en) * 2007-08-27 2012-05-29 International Business Machines Corporation Systems, methods, and computer products for compiler support for aggressive safe load speculation
JP5072889B2 (ja) * 2009-03-16 2012-11-14 株式会社東芝 事前条件生成装置および事後条件生成装置、ならびにこれらの方法
JP5846581B2 (ja) * 2012-04-25 2016-01-20 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム
US10990404B2 (en) * 2018-08-10 2021-04-27 Arm Limited Apparatus and method for performing branch prediction using loop minimum iteration prediction

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5630157A (en) * 1991-06-13 1997-05-13 International Business Machines Corporation Computer organization for multiple and out-of-order execution of condition code testing and setting instructions
US6077315A (en) * 1995-04-17 2000-06-20 Ricoh Company Ltd. Compiling system and method for partially reconfigurable computing
CA2194020C (en) * 1996-12-24 2002-02-05 Kevin Paul Hickman Minimizing debug information for global types in compiled languages
US6820251B1 (en) * 2000-11-06 2004-11-16 Hewlett-Packard Development Company, L.P. System and method for a software recovery mechanism
US7225430B2 (en) * 2001-07-26 2007-05-29 Landesk Software Limited Software code management method and apparatus
JP3847672B2 (ja) * 2002-07-03 2006-11-22 松下電器産業株式会社 コンパイラ装置及びコンパイル方法
JP4778286B2 (ja) * 2005-09-28 2011-09-21 パナソニック株式会社 コンパイラ装置

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2009098739A1 (ja) * 2008-02-05 2009-08-13 Panasonic Corporation プログラム最適化装置およびプログラム最適化方法
JPWO2009098739A1 (ja) * 2008-02-05 2011-05-26 パナソニック株式会社 プログラム最適化装置およびプログラム最適化方法
WO2010050128A1 (ja) * 2008-10-30 2010-05-06 パナソニック株式会社 コンパイル方法及びコンパイルプログラム
JP2010108258A (ja) * 2008-10-30 2010-05-13 Panasonic Corp コンパイル方法及びコンパイルプログラム
JP2020526811A (ja) * 2017-07-07 2020-08-31 エヌチェーン ホールディングス リミテッドNchain Holdings Limited ブロックチェーンスクリプトにおける制御フロー
US11797278B2 (en) 2017-07-07 2023-10-24 Nchain Licensing Ag Method for compiling from a high-level scripting language to a blockchain native scripting language
US11868745B2 (en) 2017-07-07 2024-01-09 Nchain Licensing Ag System and method for compiling high-level language code into a script executable on a blockchain platform
US11922149B2 (en) 2017-07-07 2024-03-05 Nchain Licensing Ag Method for controlling the flow execution of a generated script of a blockchain transaction
JP2019028540A (ja) * 2017-07-26 2019-02-21 富士通株式会社 情報処理装置、コンパイル方法及びコンパイルプログラム

Also Published As

Publication number Publication date
US20060080642A1 (en) 2006-04-13
CN100468337C (zh) 2009-03-11
CN1758222A (zh) 2006-04-12

Similar Documents

Publication Publication Date Title
US20060080643A1 (en) Program processing apparatus
US9411559B2 (en) Resolution of textual code in a graphical hierarchical model of a technical computing environment
US20060080642A1 (en) Program processing apparatus
US6003095A (en) Apparatus and method for demand loading a dynamic link library
US7610545B2 (en) Annotations for tracking provenance
ES2733516T3 (es) Verificación de límites en tiempo de compilación para tipos definidos por el usuario
US8201143B2 (en) Dynamic mating of a modified user interface with pre-modified user interface code library
US7299462B2 (en) Relocation format for linking
US7917899B2 (en) Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus
US8843920B2 (en) Systems and methods for deferring software implementation decisions until load time
US20020019973A1 (en) Compiler and method for compiling easily adaptable to processor specifications
Amme et al. Data dependence analysis of assembly code
US6684394B1 (en) Relocation format for linking with relocation instructions containing operations for combining section data
Bour et al. Merlin: a language server for OCaml (experience report)
KR20170014613A (ko) 전자 장치, 컴파일링 방법 및 컴퓨터 판독가능 기록매체
US6687899B1 (en) Relocation format for linking
US6704928B1 (en) Relocation format for linking
US20170075668A1 (en) Methods and Systems for Generating Client-Server Applications for Target Devices
JP2005182562A (ja) コンパイル方法および装置、ならびにコンパイラ
US6802060B1 (en) Linker using relocation sequences
US20110202906A1 (en) Compiling method and compiling program
JP4719415B2 (ja) 情報処理システム及びコード生成方法
JPH10320212A (ja) キャッシュ向け最適化方法
US8527962B2 (en) Promotion of a child procedure in heterogeneous architecture software
Steyer Building web applications with Vue. js: MVVM patterns for conventional and single-page websites

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20071004

A761 Written withdrawal of application

Free format text: JAPANESE INTERMEDIATE CODE: A761

Effective date: 20091008