(57)【特許請求の範囲】
【請求項１】
高級言語で記述された複数のソースコードからなるプログラムをＣＰＵが実行形式コードに変換する方法であって、
前記ソースコードを第１の中間コードに変換する第１の変換ステップと、
前記第１の中間コードを第２の中間コードに最適化する最適化ステップと、前記第２の中間コードを前記実行形式コードに変換する第２の変換ステップとを備え、
前記最適化ステップが、前記実行形式コードを実行する目的機械の並列アクセス可能なメモリの構成情報を抽出するハードウェア情報抽出ステップと、
前記ソースコードからプログラムで実現されるアプリケーションのメモリ使用の特性情報を抽出するアプリケーション情報抽出ステップと、
命令間の並列実行可否の判定におけるメモリ資源競合を判定するとき前記メモリの構成情報と前記アプリケーションのメモリ使用の特性情報の参照により互いに並列アクセス可能なメモリへのアクセス命令であると判明した場合はメモリ資源の競合がないと判定し、そうでない場合はメモリ資源の競合があると判定するメモリ資源競合判定ステップ
を備えたことを特徴とするプログラム処理方法。
【請求項２】
前記メモリの構成情報が、並列アクセス可能なメモリを識別するメモリ名であり、前記メモリ資源競合判定ステップが前記メモリ名の一致／不一致で判定するステップであることを特徴とする請求項１記載のプログラム処理方法。
【請求項３】
前記メモリの構成情報に目的機械の構成であるメモリの指定可能なアドレス範囲属性を含み、前記最適化ステップにメモリアクセス命令のアドレスが前記メモリアクセス命令のアクセスするメモリの前記アドレス範囲属性で示されたアドレス範囲外にあるエラーを検出するアドレス範囲エラー検出ステップと、前記アドレス範囲エラー検出ステップでメモリアクセス命令のアドレスが前記アドレス範囲外にある場合はエラー処理を行うアドレス範囲エラー処理ステップを含むことを特徴とする請求項１記載のプログラム処理方法。
【請求項４】
前記メモリの構成情報に目的機械の構成であるメモリのアクセス可能なアクセス単位属性を含み、前記最適化ステップにメモリアクセス命令のアクセス単位が前記メモリアクセス命令のアクセスするメモリの前記アクセス単位属性で示されたアクセス単位より小さいかあるいは２のベキ乗倍でないというエラーを検出するアクセス単位エラー検出ステップと、前記アクセス単位エラー検出ステップでエラー検出された場合はエラー処理を行うアクセス単位エラー処理ステップを含むことを特徴とする請求項１記載のプログラム処理方法。
【請求項５】
前記メモリの構成情報に目的機械の構成であるメモリのアクセス可能なリードライト属性を含み、前記最適化ステップに前記リードライト属性でリード不可と示されたメモリに対するメモリアクセス命令がリード命令であるか、前記リードライト属性でライト不可と示されたメモリに対するメモリアクセス命令がライト命令であるというエラーを検出するリードライト属性エラー検出ステップと、前記リードライト属性エラー検出ステップでエラーが検出された場合はエラー処理を行うリードライト属性エラー検出ステップを含むことを特徴とする請求項１記載のプログラム処理方法。
【請求項６】
前記メモリの構成情報に目的機械の構成であるメモリのアクセス方法属性を含み、前記最適化ステップに前記アクセス方法属性の示されたメモリをアクセスするメモリアクセス命令を前記アクセス方法属性で示すアクセス方法を指定したメモリアクセス命令に置き換えるアクセス方法属性命令置換ステップを含むことを特徴とする請求項１記載のプログラム処理方法。
【請求項７】
前記メモリの構成情報に前記メモリ名と前記アドレス範囲属性、前記アクセス単位属性、前記リードライト属性、アクセス方法属性のいずれかを含んだ集合情報を識別する論理メモリ名を含み、前記メモリ資源競合判定ステップに前記論理メモリ名からメモリ名を検索し一致／不一致の判定に用いるステップを含み、前記アドレス範囲エラー検出ステップ、前記アクセス単位エラー検出ステップ、前記リードライト属性エラー検出ステップ、前記アクセス方法属性命令置換ステップのいずれかのステップに前記論理メモリ名からアドレス範囲属性、アクセス単位属性、リードライト属性、アクセス方法属性のいずれかを検索し使用するステップを含むことを特徴とする請求項１〜６のいずれか１項に記載のプログラム処理方法。
【請求項８】
前記第２の変換ステップにより得られた実行形式コードが目的機械の構成である複数のメモリのうち少なくとも一つが使用されていないことを検出するメモリ未使用検出ステップと、前記実行形式コードの実行時に未使用であると検出された目的機械のメモリを低消費電力状態に設定するステップを備えることを特徴とする請求項１記載のプログラム処理方法。
【請求項９】
高級言語で記述された複数のソースコードからなるプログラムをＣＰＵが実行形式コードに変換するための各ステップをコンピュータに実行させるプログラムを記録した記録媒体であって、前記各ステップは、
前記ソースコードを第１の中間コードに変換する第１の変換ステップと、
前記第１の中間コードを第２の中間コードに最適化する最適化ステップと、
前記第２の中間コードを前記実行形式コードに変換する第２の変換ステップとを含み、更に、
前記最適化ステップが、前記実行形式コードを実行する目的機械の並列アクセス可能なメモリの構成情報を抽出するハードウェア情報抽出ステップと、
前記ソースコードからプログラムで実現されるアプリケーションのメモリ使用の特性情報を抽出するアプリケーション情報抽出ステップと、
命令間の並列実行可否の判定におけるメモリ資源競合を判定するとき前記メモリの構成情報と前記アプリケーションのメモリ使用の特性情報の参照により互いに並列アクセス可能なメモリへのアクセス命令であると判明した場合はメモリ資源の競合がないと判定し、そうでない場合はメモリ資源の競合があると判定するメモリ資源競合判定ステップを
含むことを特徴とする記録媒体。
【請求項１０】
各ステップとして更に、前記メモリの構成情報に前記メモリ名と前記アドレス範囲属性、前記アクセス単位属性、前記リードライト属性、アクセス方法属性のいずれかを含んだ集合情報を識別する論理メモリ名を含み、前記メモリ資源競合判定ステップに前記論理メモリ名からメモリ名を検索し一致／不一致の判定に用いるステップを含み、前記アドレス範囲エラー検出ステップ、前記アクセス単位エラー検出ステップ、前記リードライト属性エラー検出ステップ、前記アクセス方法属性命令置換ステップのいずれかのステップに前記論理メモリ名からアドレス範囲属性、アクセス単位属性、リードライト属性、アクセス方法属性のいずれかを検索し使用するステップを含むことを特徴とする請求項９に記載の記録媒体。
【請求項１１】
各ステップとして更に、前記第２の変換ステップにより得られた実行形式コードが目的機械の構成である複数のメモリのうち少なくとも一つが使用されていないことを検出するメモリ未使用検出ステップと前記実行形式コードの実行時に未使用であると検出された目的機械のメモリを低消費電力状態に設定するステップを含むことを特徴とする請求項９記載の記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、高級言語からオブジェクトコードを生成するコンパイラ、複数のオブジェクトコードを連結編集し、実行形式コードを生成するリンカを含むプログラム処理方法、処理装置および記録媒体に関するものであり、特に、並列プロセッサ向けの最適化技術に関する。
【０００２】
【従来の技術】
従来のプログラム処理方法では、コンパイラが高級言語で記述されたソースコードを解析し、目的機械向けに最適化を行い、オブジェクトコードとして生成し、リンカが複数のオブジェクトコードを連結編集して実行形式コードを生成していた。
【０００３】
ソースコードはユーザが記述する際、目的機械の具体的構成を想定して記述するのではなく図１２に示す計算機モデルを想定していた。このモデルはプロセッサ１つに対し、メモリバスが１つ接続され主記憶としての記憶装置が接続されている。このモデルにおける主記憶やメモリバスは概念上の構成であり、実際の構成は例えば図１３に示す構成をとることもできる。図１３では、プロセッサに３つのメモリバスが接続され、それぞれのメモリバスには記憶装置が接続されているという構成をとっている。
【０００４】
従来のプログラム処理方法の動作について、図１０に示すＣ言語で記述されたソースコードの具体例を用いて簡単に説明する。図１０のソースコードの場合、従来のプログラム処理方法では、図７に示すアセンブリコードを生成する。すなわち、目的機械が図１３のようにメモリアクセス命令（”ｌｄ”や”ｓｔ”命令）を並列実行可能な場合があっても、図１２の目的機械モデルを想定するのでメモリアクセス命令の並列実行の可否を判定できない。
【０００５】
【発明が解決しようとする課題】
上記した従来のプログラム処理方法では、具体的目的機械を想定するステップが存在しておらず、また様々な構成の目的機械の違いを目的機械モデルで吸収することにしているため、目的機械の違いを考慮した最適化を行うことができないことが課題である。
【０００６】
また、従来のプログラム処理方法では、それぞれ特性の異なるアプリケーションの特性を十分に用いた最適化ができない。すなわち、従来のプログラム処理装置では様々なアプリケーションの特性を目的機械モデルの構成の範囲内で表せる特性のみを用いて最適化しており、実際の目的機械の構成を活用するためのアプリケーション情報を用いた最適化を行うことができないことが課題である。
【０００７】
本発明はかかる問題点に鑑みてなされたものであり、ソースコードを記述するユーザがアプリケーションの特性と目的機械の構成をプログラム処理における最適化に用いるステップが備わったプログラム処理方法を提供することを目的とする。
【０００８】
【課題を解決するための手段】
この課題を解決するために請求項１記載のプログラム処理方法は、
高級言語で記述された複数のソースコードからなるプログラムをＣＰＵが実行形式コードに変換する方法であって、前記ソースコードを第１の中間コードに変換する第１の変換ステップと、前記第１の中間コードを第２の中間コードに最適化する最適化ステップと、前記第２の中間コードを前記実行形式コードに変換する第２の変換ステップとを備え、前記最適化ステップが、前記実行形式コードを実行する目的機械の並列アクセス可能なメモリの構成情報を抽出するハードウェア情報抽出ステップと、前記ソースコードからプログラムで実現されるアプリケーションのメモリ使用の特性情報を抽出するアプリケーション情報抽出ステップと、命令間の並列実行可否の判定におけるメモリ資源競合を判定するとき前記メモリの構成情報と前記アプリケーションのメモリ使用の特性情報の参照により互いに並列アクセス可能なメモリへのアクセス命令であると判明した場合はメモリ資源の競合がないと判定し、そうでない場合はメモリ資源の競合があると判定するメモリ資源競合判定ステップを備える。
【００１３】
【発明の実施の形態】
以下、本発明の実施の形態について、図１から図１３を参照しながら説明する。
【００１４】
図１は本発明の実施の形態におけるプログラム処理方法の処理の流れとファイルの入出力関係を示すフローチャートである。
【００１５】
コンパイラ上流処理１００は、ファイル形式で保存されている高級言語ソースコード２００を読み込み、構文解析および意味解析などを行って内部形式コードを生成する。さらに必要に応じて、最終的に生成される実行形式コードの実行時間やコードサイズが短くなるように内部形式コードを最適化する。なお、ソースコード２００に後述する本発明特有のアプリケーション情報が含まれる場合は読み飛ばされる。
【００１６】
アセンブラコード生成処理１０１は、コンパイラ上流処理１００で生成、最適化された内部形式コードからアセンブラコードを生成する。
【００１７】
コンパイラ上流処理１００およびアセンブラコード生成処理１０１は、本発明の主眼ではなく、また、前記したアプリケーション情報を読み飛ばすことを除いて、従来のプログラム処理方法と同一であるので、詳細は省略する。
【００１８】
命令スケジューリング処理１０２は、アセンブラコード生成処理１０１で生成されたアセンブラコードに対し命令間の依存関係の解析、資源競合の解析に基づき命令スケジューリング(命令順の並び替え)を行うことで、アセンブラコードを目的機械向けに並列化する。
【００１９】
また、命令スケジューリング処理１０２はアプリケーション情報をアプリケーション情報ファイル２０１から読み取る。アプリケーション情報ファイル２０１はソースコードあるいはソースコードとは異なるファイルのどちらの形式でも良い。本実施の形態では、ソースコードにアプリケーション情報が記述されているものとする。図４にアプリケーション情報が含まれたソースコードの例を示す。
【００２０】
図４において１〜２行目にアプリケーション情報が含まれる。１行目の”ｍ０：：ｉｎｔ Ｇ０［２］；”は２要素の整数配列Ｇ０を論理メモリｍ０に割り当てることを示している。２行目も同様に配列Ｇ１を論理メモリ間ｍ１に割り当てることを示している。論理メモリについては後述する。
【００２１】
さらに、命令スケジューリング処理１０２はハードウェア情報をハードウェア情報ファイル２０２から読み取る。ハードウェア情報ファイル２０２はソースコードあるいはソースコードとは異なるファイルのどちらの形式でもよい。本実施の形態では、ソースコードとは異なるファイルにハードウェア情報が記述されているものとする。図８にハードウェア情報ファイル２０２の内容を示す。
【００２２】
図８に示すハードウェア情報は図１１に示すフォーマットで、目的機械ごとに用意される。本実施の形態の図８のハードウェア情報は図１３に示した目的機械に対応したものである。以下、ハードウェア情報内の各要素について説明する。
【００２３】
論理メモリは”：：”以降に示された属性を示す名称であり、図４に示すように、ソースコードにおける静的変数(メモリへの割当が決まる変数)に付与される。なお、論理メモリｓｔａｃｋは、自動変数アクセスなどのスタック操作の場合に自動的に付与され、論理メモリｍａｉｎは上記以外のメモリアクセスの場合に自動的に付与される。
【００２４】
物理メモリは、目的機械がアクセス可能なメモリを示しており、異なる名称はそれぞれ互いに並列にアクセス可能であることを示している。本実施の形態では図１０に示すようにプロセッサはＸメモリ(主記憶)、Ｙメモリ、Ｚメモリの３つのメモリが接続されている。これらのメモリは並列アクセスが可能なメモリであり、アクセスするための命令はそれぞれ異なるものとする。なお、本実施の形態では命令によりどのメモリをアクセスするかを命令で選択しているが、アドレスや並列実行する際の命令位置により選択しても良い。
【００２５】
Ｘメモリは主記憶として使用されキャッシュを搭載する。周辺機器のレジスタはＸメモリにマッピングされている。ＹメモリはＲＯＭで実装されており書き込むことはできない。ＺメモリはＲＡＭで実装されているが容量が小さいものとする。それぞれのメモリは独立したアドレス空間を有するとしているが、他の方法として、一つのアドレス空間の一部をそれぞれのメモリに割り当てても良い。
【００２６】
アドレス範囲属性は、論理メモリに割り当てられた変数が利用可能なアドレスの範囲を示しており、物理メモリで利用できるアドレス範囲を越えることはない。アドレス範囲属性は、変数割り当て時のサイズチェックを行いコンパイル時にソースコードの誤りを検出するのに用いる。
【００２７】
アクセス単位属性は、論理メモリがアクセス可能な単位を示しており、物理メモリのアクセス可能なアクセス単位より小さくなることはない。一般に、ある単位のアクセスに限定したメモリは、複数のアクセス単位をサポートするメモリより高速にアクセスできるかあるいは低コストで実現できる。このようなアクセス単位の限定されたメモリをサポートする目的機械向けに最適化する場合に指定することができる。具体的には、変数割り当て時のアラインやメモリアクセス命令のサイズ指定に用いる。
【００２８】
アクセス方法属性は、論理メモリに割り当てられた変数が物理メモリをアクセスするときのアクセス方法を示しており、ｃａｃｈｅ，ｕｎｃａｃｈｅ，ｓｔｒｅａｍがある。物理メモリのサポートするアクセス方法以外を指定することはできない。ｃａｃｈｅはキャッシュが利用可能な場合はキャッシュに格納することを命令中に指定し、ｕｎｃａｃｈｅはキャッシュが利用可能であってもキャッシュに格納することはないように命令中に指定する。ｓｔｒｅａｍはシーケンシャルなアクセスを行う場合に効率が良くなるようにプリフェッチなどを行うように命令中に指定する。
【００２９】
リードライト属性は、論理メモリに割り当てられた変数がリードおよびライト可能（ｒｗ）、リードのみ可能（ｒｏ）、ライトのみ可能（ｗｏ）であるかを指定する。物理メモリがＲＯＭの場合ｒｏを指定することで、ＲＯＭ領域への書き込みをするソースコードの誤りをコンパイル時に検出するのに用いる。
【００３０】
命令スケジューリング処理１０２の詳細について図２、図３を参照しながら説明する。説明の簡単化のために命令スケジューリングは基本ブロックを処理単位とする。したがって、命令シーケンスは１パスのみ存在する。図２は命令スケジューリング処理１０２の詳細なフローチャートである。図２の各ステップについて説明する。
【００３１】
ステップ１１０は、未処理の命令のうち、その時点での先頭の命令を選択し空の状態にある命令群Ａに加えることで最初の要素とする。以降のステップで、命令群Ａに含まれる各命令と並列実行可能な命令を残りの未処理命令から検索し命令群Ａに加える処理を行う。
【００３２】
なお、本実施の形態の目的機械は最大３命令を並列実行可能なスーパスカラ構成のプロセッサシステムを想定しており、３命令のうち最大２つのメモリアクセス命令を並列に実行可能であるとする。その際メモリアクセス命令はそれぞれ異なる物理メモリでなければならないという制約がある。
【００３３】
ステップ１１１は未処理の命令の中から命令群Ａの各命令と並列実行するために、命令実行順を変更可能な命令を複数選択し、候補とする。ステップ１１２は候補の中から先頭の命令を選択し命令Ｂとする。
【００３４】
ステップ１１３は命令群Ａの各命令と命令Ｂの並列実行可否を判定する処理である。図３に並列実行可否判定処理の詳細なフローチャートを示す。以降、図３を参照しながら説明する。
【００３５】
ステップ１３０は命令群Ａの各命令と命令Ｂの間のデータ依存関係の有無を判定する。データ依存関係とはある結果を定義する命令とその結果を参照する命令間の関係であり、この関係にある命令は互いに並列実行できない。データ依存関係にあると判定された場合は、並列実行不可として並列実行可否判定処理を終了する。
【００３６】
ステップ１３１は命令群Ａの各命令と命令Ｂの間に目的機械の演算器資源に競合があるかを判定する。演算器資源に競合があると判定された場合は、並列実行不可として並列実行可否判定処理を終了する。
【００３７】
ステップ１３２は、命令群Ａの各命令と命令Ｂの間に目的機械の物理メモリに競合があるかを判定する。命令群Ａの各命令あるいは命令Ｂがメモリアクセス命令の場合、その命令が生成された要因により処理が異なる。
【００３８】
メモリアクセス命令が静的変数へのアクセスにより生成された場合は、静的変数に付与された論理メモリ（変数に付与したｍ０、ｍ１、ｉｏなど）を図４に示したソースコードに含まれるアプリケーション情報から読み取り、論理メモリに対応する物理メモリを図８に示したハードウェア情報から読み取る。
【００３９】
メモリアクセス命令が自動変数やスタック退避、復帰から生成された場合は、論理メモリをｓｔａｃｋとし、対応する物理メモリを図８に示したハードウェア情報から読み取る。上記に属さないケースにより生成された場合は、論理メモリをｍａｉｎとし、対応する物理メモリを図８に示したハードウェア情報から読み取る。
【００４０】
命令群Ａの各命令で使用している物理メモリを命令Ｂが使用する場合は、並列実行不可として並列実行可否判定処理を終了する。
【００４１】
ステップ１３０でデータ依存がなく、ステップ１３１で演算器資源競合がなく、ステップ１３２で物理メモリの競合がないと判定された場合は並列実行可として並列実行可否判定処理を終了する。
【００４２】
図２に戻って、ステップ１１３の判定が並列実行不可の場合はステップ１１４へ、並列実行可の場合はステップ１１５へそれぞれ進む。ステップ１１４は命令Ｂが命令群Ａの各命令と並列実行できないと判定されたため、命令Ｂを候補から外す。そして、ステップ１１７に進む。
【００４３】
ステップ１１５では命令群Ａの各命令と命令Ｂが並列実行可能と判定されたので命令Ｂを命令群Ａに加え、候補から外す。
【００４４】
ステップ１１６では命令群Ａに含まれる命令数が目的機械が並列実行できる最大の命令数に到達したことを判定し、到達した場合は、命令群Ａと並列実行可能な命令の検索を終了するためステップ１１８に進む。命令群Ａの命令数が最大命令数に到達していなければステップ１１７に進む。
【００４５】
ステップ１１７は候補がまだ存在するかを判定する。存在する場合はステップ１１２に戻り次の候補の並列実行可否判定を行う。候補が存在しない場合はステップ１１８に進む。
【００４６】
ステップ１１８は命令群Ａに含まれる命令を処理済とし、命令スケジューリング処理後のアセンブラコードを生成する。なお、その際メモリアクセス命令については、使用する物理メモリをアクセスする命令に置き換える。同時に前記したアクセス方法属性すなわち、ｃａｃｈｅ、ｕｎｃａｃｈｅ、ｓｔｒｅａｍを命令中に指定する。
【００４７】
また、メモリアクセス命令のアドレスを特定できる場合は前記したアドレス範囲属性を超えていないことを確認し、超えている場合はエラー処理を行う。さらに、メモリアクセス命令のアクセス単位が前記した物理メモリのアクセス単位属性より小さかったり、２のべき乗倍になっていない場合は、物理メモリのサポートしないアクセスサイズなのでエラー処理を行う。前記リードライト属性についてもメモリアクセス命令のアクセス方向についてのエラー検出を行う。すなわち、物理メモリのリードライト属性が”ｒｏ”の物理メモリを使用する命令がストア命令であったり、”ｗｏ”の物理メモリを使用する命令がロード命令である場合にエラー処理を行う。
【００４８】
ステップ１１９は、未処理命令が存在する場合、ステップ１１０に戻り新たな命令群Ａについて並列実行可能な命令の検索を行う。未処理命令が存在しない場合は命令スケジューリング処理を終了する。
【００４９】
図１に戻って、オブジェクトコード生成処理１０３は、命令スケジューリング処理１０２で生成したアセンブラコードをオブジェクトコードに変換し、オブジェクトコードファイル２０３として出力する。連結編集処理１０４は、複数のオブジェクトコードファイル２０３を読み込み編集連結を行って実行形式コードファイル２０４を生成する。オブジェクトコード生成処理１０３および連結編集処理１０４は本発明の主眼でなく、また、従来のプログラム処理方法と同一であるので詳細は省略する。
【００５０】
（具体的動作の説明）
次に、本プログラム処理方法の特徴的な構成要素の動作について具体的なプログラムを用いて説明する。図４は、本発明用に記述されたソースコードであり、従来のＣ言語の仕様にアプリケーション情報を追加した形になっている。
【００５１】
図４において、１行目、２行目の”ｍ０：：”、”ｍ１：：”がアプリケーション情報であり、整数配列Ｇ０，Ｇ１の論理メモリへの割り当てを表している。アプリケーション情報はプログラマがアプリケーションの特性を考慮して記述する。この場合、Ｇ０とＧ１は異なる論理メモリに割り当てており、プログラマはＧ０とＧ１のアクセスを並列に行うことのできるアプリケーションの特性を利用して、そのように動作することを期待している。
【００５２】
なお、図４においては整数配列が論理メモリへの割り当てされた例を示しているが、整数以外の型であっても同様であることは言うまでもない。また、配列でない通常変数やポインタであっても同様である。ただし、ポインタの場合、ある論理メモリに割り当てられたポインタに他の論理メモリに割り当てられた変数のアドレスを代入すると論理メモリの参照先を間違えるので、エラーとすべきである。
【００５３】
図４の関数ｆｕｎｃは整数引数ａ、ｂをとり、グローバル整数配列Ｇ０のインデックス０の値と引数ａの値を乗算し、グローバル整数配列Ｇ１のインデックス０に格納し、グローバル整数配列Ｇ０のインデックス１の値と引数ｂの値を乗算し、グローバル整数配列Ｇ１のインデックス１に格納するものである。図４のソースコードはソースコード２００にファイルとして格納されている。
【００５４】
図５はソースコード２００に格納された図４のソースコードをコンパイラ上流処理１００およびアセンブラコード生成処理１０１の処理を終えた後のアセンブラコードである。以下簡単に説明する。
【００５５】
１行目は、関数ｆｕｎｃの先頭を表すラベルである。
【００５６】
２行目は、配列Ｇ０のアドレスをレジスタｒ０に格納する。
【００５７】
３行目は、配列Ｇ１のアドレスをレジスタｒ１に格納する。
【００５８】
４行目は、レジスタｒ０に格納されているデータをアドレスとしてメモリに格納されているデータを読み出しレジスタｒ２に格納する（Ｇ０［０］の値）。
【００５９】
５行目は、スタックポインタｓｐにオフセット８を加えたデータをアドレスとしてメモリから読み出しレジスタｒ３に格納する。図９にスタックフレームの構成図を示す。図９において関数ｆｕｎｃの処理中はｓｐは図の位置を示しており、引数ａ，ｂはそれぞれオフセット４、８の位置に格納されている。したがって、５行目は引数ａの値をレジスタｒ３に格納していることになる。
【００６０】
６行目は、レジスタｒ２とレジスタｒ３の値を乗算しレジスタｒ４に格納する。
【００６１】
７行目は、レジスタｒ１に格納されているデータをアドレスとして、レジスタｒ４に格納されているデータをメモリに格納する（Ｇ１［０］に格納）。
【００６２】
８行目は、レジスタｒ０に格納されているデータにオフセット４を加えた値をアドレスとしてメモリに格納されているデータを読み出しレジスタｒ２に格納する（Ｇ０［１］の値）。
【００６３】
９行目は、スタックポインタｓｐにオフセット４を加えたデータをアドレスとしてメモリから読み出しレジスタｒ３に格納する（引数ｂの値）。
【００６４】
１０行目は、レジスタｒ２とレジスタｒ３の値を乗算しレジスタｒ４に格納する。
【００６５】
１１行目は、レジスタｒ１に格納されているデータにオフセット４を加えたデータをアドレスとして、レジスタｒ４に格納されているデータをメモリに格納する（Ｇ１［１］に格納）。
【００６６】
１２行目は、関数ｆｕｎｃから呼び出しプログラムに復帰する。
【００６７】
図５のアセンブラコードは命令スケジューリング処理１０２で最適化（並列化）され、図６のアセンブラコードとなる。命令スケジューリング処理１０２は図４のソースコードに含まれるアプリケーション情報と図８のハードウェア情報を読み取り以下の最適化に用いる。
【００６８】
次に図２を参照しながら説明する。ステップ１１０ではまず”２：ｍｏｖ Ｇ０，ｒ０”が空の状態の命令群Ａに加えられる。ここで、”２：”とは図５の行番号を示している。以下も同様の表記をする。
【００６９】
ステップ１１１では、”３：ｍｏｖ Ｇ１，ｒ１”、”５：ｌｄ （８，ｓｐ），ｒ３”が候補として登録される。ステップ１１２では、まず”３：ｍｏｖ Ｇ１，ｒ１”が命令Ｂとされ、ステップ１１３で並列実行可否判定処理が行われる。”２：ｍｏｖ Ｇ０，ｒ０”と”３：ｍｏｖ Ｇ１，ｒ１”はデータ依存関係、演算器資源競合、物理メモリ資源競合はないので並列実行可と判定される。ステップ１１５で”３：ｍｏｖ Ｇ１，ｒ１”が命令群Ａに加えられ候補から外される。ステップ１１６では目的機械の最大並列実行数の３に到達しておらず、ステップ１１７では候補がまだ存在するのでステップ１１２に戻る。”５：ｌｄ （８，ｓｐ），ｒ３”も同様に並列実行可能と判定され命令群Ａに加えられる。
【００７０】
ステップ１１７で候補がなくなったので、ステップ１１８で命令群Ａに含まれる命令をすべて処理済とし、図６の２行目のアセンブラコードを生成する。このとき”５：ｌｄ （８，ｓｐ），ｒ３”はメモリアクセス命令であるので命令の置き換えがなされる。すなわち、当該命令の生成要因は自動変数アクセスであるので論理メモリとしてｓｔａｃｋが割り当てられていることがわかる。論理メモリｓｔａｃｋは図８のハードウェア情報によると物理メモリとしてＸメモリを使用するので、Ｘメモリをアクセスするための命令を生成する。同時に論理メモリｓｔａｃｋにはアクセス方法属性としてｃａｃｈｅが指定されているのでキャッシュをアクセスするための属性を命令に付与する。すなわち、”ｌｄ ｃ，Ｘ（８，ｓｐ），ｒ３”が生成される。
【００７１】
さらに、次のエラーチェックもなされる。
【００７２】
アドレス範囲属性
この場合スタックアクセスであるのでアドレスを特定することができないためアドレス範囲のエラー検出は行われない。
【００７３】
アクセスサイズ属性
命令が”ｌｄ”なので４バイトをロードする命令である。論理メモリｓｔａｃｋは１バイト単位のアクセスが可能であることが図８のハードウェア情報からわかり、４バイトは１バイトの２のべき乗倍であるのでエラーとはならない。
【００７４】
リードライト属性
命令はロード命令であり、論理メモリｓｔａｃｋは”ｒｗ”（リードライト可能）であるので同様にエラーとならない。
【００７５】
ステップ１１９では未処理命令がまだ存在するので、ステップ１１０に戻る。
【００７６】
ステップ１１０で、”４：ｌｄ （ｒ０），ｒ２”が空の状態の命令群Ａに加えられる。ステップ１１１では、候補を得るが、この場合候補がないのでステップ１１８に進み、”４：ｌｄ （ｒ０），ｒ２”を処理済とし、図６の３行目のアセンブラコードを生成する。この場合、並列実行可能な命令は存在しない。このとき”４：ｌｄ （ｒ０），ｒ２”はメモリアクセス命令であるので命令の置き換えがなされる。すなわち、当該命令の生成要因は静的変数Ｇ０のアクセスであり、図４のアプリケーション情報からＧ０は論理メモリｍ０に割り当てられていることがわかる。論理メモリｍ０は図８のハードウェア情報によると物理メモリとしてＹメモリを使用するので、Ｙメモリをアクセスするための命令を生成する。同時に論理メモリｍ０にはアクセス方法属性としてｓｔｒｅａｍが指定されているのでストリームをアクセスするための属性を命令に付与する。すなわち、”ｌｄ ｓ，Ｙ（ｒ０），ｒ２”が生成される。
【００７７】
さらに、次のエラーチェックもなされる。
【００７８】
アドレス範囲属性
この場合、静的変数Ｇ０のアクセスであり、アドレスであるレジスタｒ０の内容はプログラムの流れからアドレスＧ０であることがわかる。図８において論理メモリＹのアドレス範囲属性は０ｘ０００〜０ｘＦＦＦ（０ｘは１６進数を表す接頭辞）であり、アドレスＧ０はこの範囲に置かれるのでエラーとならない。
【００７９】
アクセスサイズ属性
命令が”ｌｄ”なので４バイトをロードする命令である。論理メモリｍ０は４バイト単位のアクセスが可能であることが図８のハードウェア情報からわかり、サイズは同じなのでエラーとはならない。
【００８０】
リードライト属性
命令はロード命令であり、論理メモリｍ０は”ｒｏ”（リードオンリ）であるので同様にエラーとならない。
【００８１】
ステップ１１９では未処理命令がまだ存在するので、ステップ１１０に戻る。
【００８２】
次にステップ１１０で”６：ｍｕｌ ｒ２，ｒ３，ｒ４”を空の状態の命令群Ａに加える。ステップ１１１で”８：ｌｄ （４，ｒ０），ｒ２”、”９：ｌｄ （４，ｓｐ），ｒ３”を候補とする。ステップ１１２で”８：ｌｄ （４，ｒ０），ｒ２”が命令Ｂとされ、ステップ１１３で並列実行可否判定処理が行われる。”６：ｍｕｌ ｒ２，ｒ３，ｒ４”と”８：ｌｄ （４，ｒ０），ｒ２”はデータ依存関係、演算器資源競合、物理メモリ資源競合は存在しないので並列実行可能と判定される。ステップ１１５で”８：ｌｄ （４，ｒ０），ｒ２”が命令群Ａに加えられ候補から外される。ステップ１１６では目的機械の最大並列実行数の３に到達しておらず、ステップ１１７では候補がまだ存在するのでステップ１１２に戻る。
【００８３】
次に、ステップ１１２で”９：ｌｄ （４，ｓｐ），ｒ３”が命令Ｂとされ、ステップ１１３で並列実行可否判定処理が行われる。”６：ｍｕｌ ｒ２，ｒ３，ｒ４”と”９：ｌｄ （４，ｓｐ），ｒ３”データ依存関係、演算器資源競合、物理メモリ資源競合は存在しない。次に”８：ｌｄ （４，ｒ０），ｒ２”と”９：ｌｄ （４，ｓｐ），ｒ３”ではデータ依存関係、演算器資源競合は存在しないが、物理メモリの競合の可能性がある。
【００８４】
”８：ｌｄ （４，ｒ０），ｒ２”は図４のソースコードにおける整数配列Ｇ０のインデックス１のデータを読み出す命令である。配列Ｇ０は論理メモリｍ０に割り当てられていることが図４のアプリケーション情報から知ることができる。図８のハードウェア情報を参照すると論理メモリｍ０は物理メモリＹと対応付けがなされている。一方、”９：ｌｄ （４，ｓｐ），ｒ３”はスタックフレームアクセス命令であり、自動的に論理メモリｓｔａｃｋに割り当てられ、論理メモリｓｔａｃｋは物理メモリＸへ対応付けられている。したがって、それぞれ使用する物理メモリが異なるので、物理メモリの競合を起しておらず並列実行可能であると判定される。
【００８５】
従来のプログラム処理方法ではこの２命令が同時にアクセス可能なメモリを使用していることを判定する手段がないため、メモリ資源の競合を起していると判定され、並列実行可能とされない。
【００８６】
ステップ１１５で”９：ｌｄ （４，ｓｐ），ｒ３”が命令群Ａに加えられ候補から外される。ステップ１１６では目的機械の最大並列実行数の３に到達したのでステップ１１８に進み、命令群Ａに含まれる命令を処理済とし、図６の４行目のコードを生成する。このとき”８：ｌｄ （４，ｒ０），ｒ２”、”９：ｌｄ （４，ｓｐ），ｒ３”はメモリアクセス命令であるので命令の置き換えがなされる。
【００８７】
まず、”８：ｌｄ （４，ｒ０），ｒ２”の生成要因は静的変数Ｇ０のアクセスであり、図４のアプリケーション情報からＧ０は論理メモリｍ０に割り当てられていることがわかる。論理メモリｍ０は図８のハードウェア情報によると物理メモリとしてＹメモリを使用するので、Ｙメモリをアクセスするための命令を生成する。同時に論理メモリｍ０にはアクセス方法属性としてｓｔｒｅａｍが指定されているのでストリームをアクセスするための属性を命令に付与する。すなわち、”ｌｄ ｓ，Ｙ（４，ｒ０），ｒ２”が生成される。
【００８８】
さらに、次のエラーチェックもなされる。
【００８９】
アドレス範囲属性
この場合、静的変数Ｇ０のアクセスであり、アドレスであるレジスタｒ０の内容はプログラムの流れからアドレスＧ０＋４であることがわかる。図８において論理メモリＹのアドレス範囲属性は０ｘ０００〜０ｘＦＦＦ（０ｘは１６進数を表す接頭辞）であり、アドレスＧ０はこの範囲に置かれるのでエラーとならない。
【００９０】
アクセスサイズ属性
命令が”ｌｄ”なので４バイトをロードする命令である。論理メモリｍ０は４バイト単位のアクセスが可能であることが図８のハードウェア情報からわかり、サイズは同じなのでエラーとはならない。
【００９１】
リードライト属性
命令はロード命令であり、論理メモリｍ０は”ｒｏ”（リードオンリ）であるので同様にエラーとならない。
【００９２】
次に、”９：ｌｄ （４，ｓｐ），ｒ３”の生成要因は自動変数アクセスであるので論理メモリとしてｓｔａｃｋが割り当てられていることがわかる。論理メモリｓｔａｃｋは図８のハードウェア情報によると物理メモリとしてＸメモリを使用するので、Ｘメモリをアクセスするための命令を生成する。同時に論理メモリｓｔａｃｋにはアクセス方法属性としてｃａｃｈｅが指定されているのでキャッシュをアクセスするための属性を命令に付与する。すなわち、”ｌｄ ｃ，Ｘ（４，ｓｐ），ｒ３”が生成される。
【００９３】
さらに、次のエラーチェックもなされる。
【００９４】
アドレス範囲属性
この場合スタックアクセスであるのでアドレスを特定することができないためアドレス範囲のエラー検出は行われない。
【００９５】
アクセスサイズ属性
命令が”ｌｄ”なので４バイトをロードする命令である。論理メモリｓｔａｃｋは１バイト単位のアクセスが可能であることが図８のハードウェア情報からわかり、４バイトは１バイトの２のべき乗倍であるのでエラーとはならない。
【００９６】
リードライト属性
命令はロード命令であり、論理メモリｓｔａｃｋは”ｒｗ”（リードライト可能）であるので同様にエラーとならない。
【００９７】
以降、同様に図６の５行目、６行目が生成される。
【００９８】
図７に従来のプログラム処理方法で命令スケジューリング処理した場合のアセンブラコードを示す。図６のコードは図７のコードに対して３行少ない、すなわち、より実行時間が短いことを示している。
【００９９】
つまり、目的機械が並列実行可能な物理メモリを有し、論理メモリの定義とともにハードウェア情報として提供され、また、プログラマがアプリケーションの特性と論理メモリを用いて適切にアプリケーション情報を提供することで、プログラム処理方法における命令スケジューリング処理でこれらを用いることで目的機械のハードウェア資源を最大限に使ったより実行時間の短いアセンブラコードを得ることができる。
【０１００】
また、物理メモリにアドレス範囲、アクセスサイズ、リードライトなどの属性を与えることで、ソースコードのエラーチェックを容易にすることができ、ソフトウェアの生産性を向上することができる。さらに、物理メモリにアクセス方法などの属性を与えることで、ソフトウェアによるより細かいメモリアクセス方法の指定ができ、目的機械をメモリ機能を最大限に活用したプログラミングができる。
【０１０１】
なお、本実施の形態では物理メモリとしてＸメモリ、Ｙメモリ、Ｚメモリを搭載した目的機械を想定したが、より多くのメモリを搭載した目的機械においても同様に効果を出すことができる。
【０１０２】
一方、本実施の形態における実行形式コードではＸメモリ、Ｙメモリ、Ｚメモリの３つのメモリを使用しているが、それ以上のメモリを使うことはないことがわかる。したがって、４つ以上のメモリを搭載した目的機械で使用しないメモリは電源供給やクロック供給を止めることで低消費電力状態にすることで目的機械システムの低消費電力化にもなる。
【０１０３】
【発明の効果】
以上説明したように本発明によれば、目的機械が並列実行可能な物理メモリを有し、論理メモリの定義とともにハードウェア情報として提供され、また、プログラマがアプリケーションの特性と論理メモリを用いて適切にアプリケーション情報を提供することで、プログラム処理方法における命令スケジューリング処理にこれらを用いることで目的機械のハードウェア資源を最大限に使ったより実行時間の短いアセンブラコードを得ることができるという有利な効果が得られる。
【０１０４】
また、物理メモリにアドレス範囲、アクセスサイズ、リードライトなどの属性を与えることで、ソースコードのエラーチェックを容易にすることができ、ソフトウェアの生産性を向上することができ、さらに、物理メモリにアクセス方法などの属性を与えることで、ソフトウェアによるより細かいメモリアクセス方法の指定ができ、目的機械をメモリ機能を最大限に活用したプログラミングができるという有利な効果が得られる。
【０１０５】
また、目的機械で本発明により生成した実行形式コードを実行する際、使用しないメモリがあれば電力供給やクロック供給を停止することで目的機械システムにおける低電力化ができるという有利な効果が得られる。
【図面の簡単な説明】
【図１】本発明の実施の形態におけるプログラム処理方法の処理の流れとファイルの入出力関係を示すフローチャート
【図２】図１に示す本発明の実施の形態における命令スケジューリング処理１０２の処理の流れを示すフローチャート
【図３】図２に示す本発明の実施の形態における並列実行可否判定処理１１３の処理の流れを示すフローチャート
【図４】本発明の実施の形態における説明用のアプリケーション情報を含んだＣ言語ソースコードを示す図
【図５】本発明の実施の形態における命令スケジューリング処理を行う前のアセンブラコードを示す図
【図６】本発明の実施の形態における命令スケジューリング処理後のアセンブラコードを示す図
【図７】本発明の従来のプログラム処理方法による命令スケジューリング処理後のアセンブラコードを示す図
【図８】本発明の実施の形態の図１３の目的機械に対応した説明用のハードウェア情報を示す図
【図９】本発明の実施の形態の説明用のスタックフレーム構成図
【図１０】本発明の実施の形態および従来のプログラム処理方法における説明用のアプリケーション情報を含まないＣ言語ソースコードを示す図
【図１１】本発明の実施の形態のハードウェア情報のフォーマットを示す図
【図１２】本発明の従来のプログラム処理方法の目的機械モデルを示す図
【図１３】本発明の実施の形態の説明用の目的機械を示す図
【符号の説明】
１００  コンパイラ上流処理
１０１  アセンブラコード生成処理
１０２  命令スケジューリング処理
１０３  オブジェクトコード生成処理
１０４  連結編集処理
２００  ソースコードファイル
２０１  アプリケーション情報ファイル
２０２  ハードウェア情報ファイル
２０３  オブジェクトコードファイル
２０４  実行形式コードファイル
【図１】
0003692884.tif 000002
【図２】
0003692884.tif 000003
【図３】
0003692884.tif 000004
【図４】
0003692884.tif 000005
【図５】
0003692884.tif 000006
【図６】
0003692884.tif 000007
【図７】
0003692884.tif 000008
【図８】
0003692884.tif 000009
【図９】
0003692884.tif 000010
【図１０】
0003692884.tif 000011
【図１１】
0003692884.tif 000012
【図１２】
0003692884.tif 000013
【図１３】
0003692884.tif 000014