(57)【特許請求の範囲】
【請求項１】
低電力化機能を有するＣＰＵと、キャッシュメモリ及び主記憶を含む計算機で実行する実行コードに、前記ＣＰＵの低電力化機能を有効にする低電力化コードを付加する実行コードの生成方法であって、
前記計算機が、ソースコードから生成された中間コードを読み込む手順と、
前記計算機が、前記読み込んだ中間コードを解析して前記中間コードに対応する命令を前記ＣＰＵで演算するときのサイクル数を第１のサイクル数として求める手順と、
前記計算機が、前記読み込んだ中間コードを解析して前記中間コードに対応する命令を前記ＣＰＵで実行したときに前記キャッシュメモリにアクセスする命令の数と、前記ＣＰＵがキャッシュメモリに読み書きするデータ量に前記命令の数を乗じてメモリアクセス量を求め、前記メモリアクセス量を前記ＣＰＵのサイクル数に変換して第２のサイクル数として演算する手順と、
前記計算機が、前記第１のサイクル数と第２のサイクル数の比率をＣＰＵ負荷比率として求める手順と、
前記計算機が、前記中間コードのうち、前記ＣＰＵ負荷比率が所定の値以下となる領域を判定する手順と、
前記計算機が前記前記ＣＰＵ負荷比率が所定の値以下と判定された前記領域に、前記低電力化機能を有効にする低電力化コードを前記中間コードに付加する手順と、
前記中間コードから前記計算機で実行可能な中間コードを生成する手順と、
を含むことを特徴とする中間コードの生成方法。
【請求項２】
前記低電力化機能を有効にする低電力化コードを前記中間コードに付加する手順は、
前記ＣＰＵ負荷比率に比例してＣＰＵの動作周波数または動作電圧を段階的に求める手順と、
前記求めた動作周波数または動作電圧を設定する低電力化コードを前記中間コードに付加する手順と、
を含むことを特徴とする請求項１に記載の中間コードの生成方法。
【請求項３】
前記計算機が、前記中間コードのうちループ演算を含む範囲を対象領域として抽出し、当該抽出した対象領域を分割する手順をさらに含み、
前記計算機が、前記中間コードを読み込んで、当該中間コードに対応する命令を前記ＣＰＵで演算するときのサイクル数を第１のサイクル数として求める手順は、
前記分割された対象領域を読み込んで、前記対象領域に含まれる命令を前記ＣＰＵで演算するときのサイクル数を第１のサイクル数として求め、
前記計算機が前記読み込んだ中間コードを解析してキャッシュメモリにアクセスする命令の数と、前記ＣＰＵがキャッシュメモリに読み書きするデータ量に前記命令の数を乗じてメモリアクセス量を求め、前記メモリアクセス量を前記ＣＰＵのサイクル数に変換して第２のサイクル数として演算する手順は、
前記分割された対象領域を読み込んで、前記対象領域を解析してキャッシュメモリにアクセスする命令の数と、前記ＣＰＵがキャッシュメモリに読み書するデータ量に前記命令の数を乗じてメモリアクセス量を求め、前記メモリアクセス量を前記ＣＰＵのサイクル数に変換して第２のサイクル数として演算することを特徴とする請求項１に記載の中間コードの生成方法。
【請求項４】
前記計算機は、前記中間コードに対応する命令を並列的に実行する複数のノードを備え、
前記計算機が、前記中間コードのうちループ演算を含む範囲を対象領域として抽出し、当該抽出した対象領域を分割する手順は、
前記中間コードに含まれる命令を並列的に実行するときに指定される前記ノードの数と、前記ループ回数から、前記対象領域を前記ノードの数で分割し、当該分割後の対象領域のループ演算の回数として前記指定されたループ回数を前記ノードの数で除した値に設定することを特徴とする請求項３に記載の中間コードの生成方法。
【請求項５】
前記低電力化機能を有効にする低電力化コードを前記中間コードに付加する手順は、
前記中間コードに対応する命令の実行時に、前記対象領域のループ演算の回数と前記ノードの数の比が所定の条件を満たしたときに低電力化機能を有効にする低電力化コードを実行する条件分岐命令を付加する手順を含むことを特徴とする請求項４に記載の中間コードの生成方法。
【請求項６】
低電力化機能を有するＣＰＵと、キャッシュメモリ及び主記憶を含む計算機で実行する中間コードに、前記ＣＰＵの低電力化機能を有効にするコードを付加するプログラムであって、
ソースコードから生成された中間コードを読み込む処理と、
前記読み込んだ中間コードを解析して前記中間コードに対応する命令を前記ＣＰＵで演算するときのサイクル数を第１のサイクル数として求める処理と、
前記読み込んだ中間コードを解析して前記中間コードに対応する命令を前記ＣＰＵで実行したときに前記キャッシュメモリにアクセスする命令の数と、前記ＣＰＵがキャッシュメモリに読み書きするデータ量に前記命令の数を乗じてメモリアクセス量を求め、前記メモリアクセス量を前記ＣＰＵのサイクル数に変換して第２のサイクル数として演算する処理と、
前記第１のサイクル数と第２のサイクル数の比率をＣＰＵ負荷比率として求める処理と、
前記前記ＣＰＵ負荷比率が所定の値以下と判定された前記領域に、前記低電力化機能を有効にする低電力化コードを前記中間コードに付加する処理と、
前記中間コードから前記計算機で実行可能な中間コードを生成する処理と、
を前記計算機に実行させることを特徴とするプログラム。
【請求項７】
前記低電力化機能を有効にする低電力化コードを前記中間コードに付加する処理は、
前記ＣＰＵ負荷比率に比例してＣＰＵの動作周波数または動作電圧を段階的に求める処理と、
前記求めた動作周波数または動作電圧を設定する低電力化コードを前記中間コードに付加する処理と、
を含むことを特徴とする請求項６に記載のプログラム。
【請求項８】
前記中間コードのうちループ演算を含む範囲を対象領域として抽出し、当該抽出した対象領域を分割する処理をさらに含み、
前記中間コードを読み込んで、当該中間コードに対応する命令を前記ＣＰＵで演算するときのサイクル数を第１のサイクル数として求める処理は、
前記分割された対象領域を読み込んで、前記対象領域に含まれる命令を前記ＣＰＵで演算するときのサイクル数を第１のサイクル数として求め、
前記読み込んだ中間コードを解析してキャッシュメモリにアクセスする命令の数と、前記ＣＰＵがキャッシュメモリに読み書きするデータ量に前記命令の数を乗じてメモリアクセス量を求め、前記メモリアクセス量を前記ＣＰＵのサイクル数に変換して第２のサイクル数として演算する処理は、
前記分割された対象領域を読み込んで、前記対象領域を解析してキャッシュメモリにアクセスする命令の数と、前記ＣＰＵがキャッシュメモリ読み書きするデータ量に前記命令の数を乗じてメモリアクセス量を求め、前記メモリアクセス量を前記ＣＰＵのサイクル数に変換して第２のサイクル数として演算することを特徴とする請求項６に記載のプログラム。
【請求項９】
前記計算機は、前記中間コードに対応する命令を並列的に実行する複数のノードを備え、
前記中間コードのうちループ演算を含む範囲を対象領域として抽出し、当該抽出した対象領域を分割する処理は、
前記中間コードに対応する命令を並列的に実行するときに指定される前記ノードの数と、前記ループ回数から、前記対象領域を前記ノードの数で分割し、当該分割後の対象領域のループ演算の回数として前記指定されたループ回数を前記ノードの数で除した値に設定することを特徴とする請求項８に記載のプログラム。
【請求項１０】
前記低電力化機能を有効にする低電力化コードを前記中間コードに付加する処理は、
前記中間コードに対応する命令の実行時に、前記対象領域のループ演算の回数と前記ノードの数の比が所定の条件を満たしたときに低電力化機能を有効にする低電力化コードを実行する条件分岐命令を付加する処理を含むことを特徴とする請求項９に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のＣＰＵを効率よく動作させる技術に関し、特に、並列処理を行うプログラムを生成するコンパイラに関する。
【背景技術】
【０００２】
近年、半導体製造技術の進歩による素子の微細化により、膨大な数のトランジスタを集積することが可能となっている。この進歩によってＣＰＵ（プロセッサ）の高周波数化も進んだが、ＣＰＵの消費電力の増加や、リーク電流に起因する待機時電力の増加により、消費電力を低減しながらＣＰＵの処理能力を向上させることが検討されている。
【０００３】
特に、数十ないし数百のＣＰＵを用いて並列処理を行う大規模な並列計算機などでは、多大な電力を必要とし、また、電力に応じた計算機からの多大な発熱に対処する必要が生じている。
【０００４】
ＣＰＵの消費電力を低減させるべく、近年ではＣＰＵの動作周波数と動作電圧を動的に変更可能にする省電力機構（低電力化機能）を備えたＣＰＵが普及しつつある。この種のＣＰＵでは、アイドル時には動作周波数と動作電圧を最低値に切り替え、高負荷時にのみ動作周波数と動作電圧を最大値に切り替える。また、負荷の状況に応じて動作周波数と動作電圧を段階的に切り替えるＣＰＵも知られている。動作周波数と動作電圧の切替は、ＯＳまたはＯＳを介したアプリケーションからＣＰＵに対して所定のコマンドを発行することで制御することができる。
【０００５】
このような省電力機構を備えたＣＰＵを備えた計算機で実行するプログラムでは、ソースコードを実行コードに変換するコンパイルの際に、省電力機構を機能させるコードを埋め込む手法が知られている（例えば、特許文献１）。
【０００６】
これらは、まず、ユーザプログラム（ソースコード）に対して予めパラメータを設定してコンパイラへ入力し、コンパイラは暫定コード（アセンブラ）を出力する。次に、暫定コードを実行し、実行中の状態をプロファイルとして記憶させる。
【０００７】
そして、暫定コードの実行によって得られたプロファイルを参照しながらユーザプログラムをコンパイルして目的とする出力コードを生成する。コンパイラは、プロファイルを参照することで計算機のリソースの利用状態などからＣＰＵの発熱を考慮した最適な出力コード（ロードモジュール）を生成する。
【特許文献１】特開２００３−４４２８９号
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、上記従来例ではソースコードを１回コンパイルした暫定コードを実行させて実行時のプロファイルを取得しておき、２回目のコンパイル時にプロファイルを用いて消費電力を抑制する最適化を行って出力コードを生成する構成となっている。このため、プロファイルを取得するための暫定コードの実行と、本来の目的である演算結果を得るための出力コードの実行とを行うため、同一の演算を２回行わねばならない。したがって、目的とする出力コードを実行させるまでに多大な時間を要することになって、ソースコードの入力から出力コードの実行を迅速に行うことができない、という問題があった。
【０００９】
また、暫定コードを実行させる演算では、消費電力の低減のためのプロファイルを取得するために出力コードの実行時と同様の演算を行うので、ひとつの出力コードを得るまでに多大な電力が必要になる、という問題があった。
【００１０】
さらに、上記従来例による出力コードでは、プロファイルを取得した条件と同一の条件で出力コードを実行する必要があり、同一の条件で実行できない場合には、プロファイルに基づく電力の低減を実現できない場合があった。
【００１１】
例えば、並列計算機を用いて並列処理を行うようなシミュレーションの出力コードでは、ループ演算の長さ（ループ長）やループ演算の実行回数を変更して出力コードの実行を行う場合がある。この場合では、プロファイルの取得時とループ長が異なるため、予定していた電力の低減を実現することができない。
【００１２】
また、並列計算機では並列処理を実行するノード数（またはＣＰＵ数あるいはコア数）を変更する場合がある。この場合では、ノード数の変化によってＣＰＵの２次キャッシュメモリなどのヒット率が変化するため、プロファイルの取得時とはＣＰＵの動作条件が異なるため、予定していた電力の低減を実現することができない、という問題があった。
【００１３】
そこで本発明は、上記問題点に鑑みてなされたもので、ソースコードのコンパイルから出力コードの実行までを迅速にしながらも、計算機の消費電力を確実に低減させることを目的とする。
【課題を解決するための手段】
【００１４】
本発明は、低電力化機能を有するＣＰＵと、キャッシュメモリ及び主記憶を含む計算機で実行する実行コードに、前記ＣＰＵの低電力化機能を有効にする低電力化コードを付加する実行コードの生成方法であって、前記計算機が、ソースコードから生成された中間コードを読み込む手順と、前記計算機が、前記読み込んだ中間コードを解析して前記中間コードに対応する命令を前記ＣＰＵで演算するときのサイクル数を第１のサイクル数として求める手順と、前記計算機が、前記読み込んだ中間コードを解析して前記中間コードに対応する命令を前記ＣＰＵで実行したときに前記キャッシュメモリにアクセスする命令の数と、前記ＣＰＵがキャッシュメモリに読み書きするデータ量に前記命令の数を乗じてメモリアクセス量を求め、前記メモリアクセス量を前記ＣＰＵのサイクル数に変換して第２のサイクル数として演算する手順と、前記計算機が、前記第１のサイクル数と第２のサイクル数の比率をＣＰＵ負荷比率として求める手順と、前記計算機が、前記中間コードのうち、前記ＣＰＵ負荷比率が所定の値以下となる領域を判定する手順と、前記計算機が前記前記ＣＰＵ負荷比率が所定の値以下と判定された前記領域に、前記低電力化機能を有効にする低電力化コードを前記中間コードに付加する手順と、前記中間コードから前記計算機で実行可能な中間コードを生成する手順と、を含む。
【００１５】
また、前記計算機は、前記実行コードを並列的に実行する複数のノードを備え、前記計算機が、前記中間コードのうちループ演算を含む範囲を対象領域として抽出し、当該抽出した対象領域を分割する手順は、前記実行コードを並列的に実行するときに指定される前記ノードの数と、前記ループ回数から、前記対象領域を前記ノードの数で分割し、当該分割後の対象領域のループ演算の回数として前記指定されたループ回数を前記ノードの数で除した値に設定する。
【発明の効果】
【００１６】
したがって、本発明は、メモリアクセスの実行比率が所定値を超えてＣＰＵの実行比率よりも高い領域では、ＣＰＵの省電力機構を機能させて動作周波数または動作電圧を低減して、ＣＰＵの消費電力を確実に低減させることができる。
【００１７】
そして、本発明によれば、一回の処理で実行コードを作成することができ、また、生成した実行コードは、実行するノード数の変化に係わらず実行可能であるため、前記従来例のように、最初にコンパイルしたロードモジュールを実行させてプロファイルを取得し、プロファイルに基づいて再度コンパイルする場合に比して、極めて迅速に実行コードを得ることができるのである。
【発明を実施するための最良の形態】
【００１８】
以下、本発明の一実施形態を添付図面に基づいて説明する。
【００１９】
図１は、本発明の第１の実施形態を示す計算機システムのブロック図である。並列処理を実行する計算機１は、ソースプログラム、ロードモジュール（実行コード）、コンパイラまたはデータを格納するストレージ装置２に接続される。
【００２０】
計算機１は、ネットワーク５を介して複数のユーザ端末（クライアント）３に接続され、複数のユーザが計算機１を利用可能となっている。なお、各ユーザ端末３にはストレージ装置４が接続され、データやソースプログラムを格納することができる。各ユーザ端末３のユーザは、計算機１にソースプログラムのコンパイルを指令したり、コンパイルで生成されたロードモジュールを実行させて演算結果を利用することができる。
【００２１】
図２は計算機１の構成を示すブロック図である。計算機１は複数のノード１０−１〜ｎと、各ノード１０−１〜ｎを接続するスイッチ１６とを備える。なお、スイッチ１６は図示しないネットワークインターフェースに接続されており、各ノード１０−１〜ｎをネットワーク５に接続する。また、スイッチ１６は図示しないファイバチャネルアダプタにも接続され、計算機１とストレージ装置４とを接続する。
【００２２】
各ノード１０−１〜ｎは同様に構成され、演算処理を行うＣＰＵ１１とデータやロードモジュールを格納する主記憶１５を含んで構成される。なお、各ノード１０−１〜ｎとスイッチ１６は、各ノード１０−１〜ｎに備えた図示しないブリッジ(例えば、チップセット)等を介して接続される。
【００２３】
ＣＰＵ１１は、１つのＣＰＵに複数のコアを備えたもので、複数の演算器（演算ユニット）１２−１，１２−２はそれぞれ１次（Ｌ１）キャッシュメモリ１３−１，１３−２を有し、演算器１２−１と１２−２で共有する２次キャッシュメモリ１４から構成される。
【００２４】
演算器１２−１、１２−２は、主記憶１５から読み込んだデータまたは実行コードを２次キャッシュメモリ１４へ一旦格納する。そして、各演算器１２−１と１２−２は、実行に必要な２次キャッシュメモリ１４の情報をそれぞれの演算器に接続した１次キャッシュメモリ１３−１または１３−２へ読み込んでから演算器１２−１、１２−２で実行する。なお、図２において、主記憶１５は各ノード１０−１〜ｎに設けたが、図示はしないが各ノード１０−１〜ｎからアクセス可能な共有メモリで構成しても良い。また、ＣＰＵ１１は単一のコアで構成されても良く、各ノード１０−１〜ｎで並列処理を実行できればよい。
【００２５】
ＣＰＵ１１は、ＯＳなどから所定のコマンド（低電力化コード）を受け付けると、動作周波数の変更（動作周波数の増大または減少）や動作電圧の変更（動作電圧の上昇または降下）を行う省電力機構を備えている。
【００２６】
また、計算機１には並列処理を効率よく行うために図示しないバリア同期機構を設けても良い。
【００２７】
図３、図４は計算機１で実行されるソフトウエアの概略を示すブロック図で、図３はソースプログラム（ソースコード）５０をコンパイルする際のブロック図を示し、図４はコンパイルによって得られたロードモジュール５００を実行する際のブロック図を示す。
【００２８】
図３は、ユーザ端末３が選択した任意のノード（例えばノード１０−１）でコンパイルを行う例を示す。各ノード１０−１〜ｎではＯＳ１００がそれぞれ実行されており、ノード１０−１には、ユーザ端末３からの指令によって最適化コード３００を出力するコンパイラ２００と、最適化コード３００を解析してＣＰＵ１１の省電力機構を制御する低電力化コード生成モジュール４００と、がロードされている。
【００２９】
ノード１０−１は、ユーザ端末３からの指示に基づいて、コンパイラ２００を実行する。コンパイラ２００はストレージ装置２からユーザ端末３が指定したソースプログラム５０を読み込んで、最適化コード３００を出力する。最適化コード３００は、例えば、中間コードやオブジェクトコード（実行コード）で構成される。そして、コンパイラ２００は最適化コード３００をストレージ装置２へ格納する。
【００３０】
次に、ユーザ端末３からの指令に基づいて、低電力化コード生成モジュール４００をノード１０−１で起動する。低電力化コード生成モジュール４００は、最適化コード３００を読み込んで、プログラムの内容を解析してＣＰＵ１１の駆動周波数の切り換えや駆動電圧の切り換えを行う省電力機構を制御するための低電力化コードを最適化コード３００に付加し、ロードモジュール（実行コード）５００として出力する。なお、低電力化コード生成モジュール４００はロードモジュール５００をストレージ装置２へ格納する。
【００３１】
本実施形態では、ソースプログラム５０は科学技術計算などのシミュレーションを行うもので、大量のループ演算を実行するため並列処理を行うものである。
【００３２】
図４は、コンパイラ２００と低電力化コード生成モジュール４００で生成されたロードモジュール５００を、ユーザ端末３からの指示に基づくノード数で実行する例を示す。図４では、３つのノード１０−１〜１０−３でそれぞれロードモジュール５００を読み込んで、実行する例を示す。各ノードのロードモジュール５００は、ユーザ端末３で指定されたデータをストレージ装置２などから読み込んで、それぞれ並列して実行される。ロードモジュール５００は、シミュレーションの演算結果をユーザ端末３やファイルとして出力する。
【００３３】
図５は、コンパイラ２００と低電力化コード生成モジュール４００の構成の一例を示すブロック図である。
【００３４】
コンパイラ２００は、周知のコンパイラと同様に構成されており、入力されたソースプログラム５０を解析するソース解析部２１０と、ソースプログラム５０の解析結果に基づいて、周知の最適化法を用い、ソースプログラム５０のステートメントの順序や演算順序の変更などを行って、実行効率の良い処理の最適化を行う最適化法適用部２２０と、実行効率の良い中間コードまたは実行コードを生成し、出力する最適化コード生成部２３０とを備える。
【００３５】
なお、コンパイラ２００は、前記従来例のように、ロードモジュール５００の実行状態（実行プロフィール）などを参照せずに、ソースプログラム５０とユーザ端末３からの指定などに基づいてコンパイルを実行する。
【００３６】
低電力化コード生成モジュール４００は、コンパイラ２００の出力結果である最適化コードを読み込んで、ＣＰＵ１１の省電力機構を制御する低電力化コードを付加したロードモジュール５００を生成し、出力する。
【００３７】
低電力化コード生成モジュール４００は、最適化コード３００を読み込んで、並列処理の領域（対象領域）毎に解析を行い、対象領域毎にデータ再利用テーブル４３０を作成し、このデータ再利用テーブル４３０に基づいて低電力化コードの付加の適否を決定する低電力化解析部４１０と、ロードモジュール５００を実行する計算機１の設定（または構成）に関する情報を入力する設定入力部４４０と、上記決定と設定情報に基づいて低電力化コードを付加したロードモジュール５００を生成するコード生成部４２０と、を含んで構成される。コード生成部４２０は、さらに、対象領域の大きさ（ループ長）に応じて低電力化コードを実行するか否かの条件分岐をロードモジュール５００に付加することができる。
【００３８】
図６は、低電力化コード生成モジュール４００で実行される処理の一例を示すフローチャートである。この処理は、ユーザ端末３からの指示に基づいて計算機１の任意のノード１０−１〜ｎで実行される。
【００３９】
まず、ステップＳ１では使用する計算機１の設定や構成に関する情報（設定情報）をユーザ端末３から受け付ける。設定情報としては、計算機１のキャッシュの容量（２次キャッシュメモリ１４の容量）や構成、動作周波数の切り換えに要する時間や駆動電圧の切り換えに要する時間などを入力する。この他、計算機１の利用するノード１０−１〜ｎの基準となる動作周波数や、動作周波数や駆動電圧の切り換え条件（低電力化コード付加の条件分岐）を手動にて設定するようにしてもよい。
【００４０】
次に、ステップＳ２では、コンパイラ２００が出力した最適化コード３００を読み込む。次に、ステップＳ３では、最適化コード３００を解析してループ演算の範囲を対象領域として抽出する。
【００４１】
例えば、図７に示すように、最適化コード３００に、Ｘ（ｉ）を求めるループ演算と、Ｘ（ｉ）を用いて、Ｙ（ｉ）を求めるループ演算を含む場合、データの依存性に基づいてこれらの２つのループ演算を対象領域３１０として抽出する。そして、ロードモジュール５００の実行時に指定されるループ指標（ループ回数）ｎと並列指標（ノード数）ｐから複数の対象領域３１０−１〜３１０−Ｐに分割する。ただし、この時点で、ループ指標ｎと並列指標ｐは未定であるので、条件式として分割しておく。この例では、Ｐ個の対象領域に分割したものとする。
【００４２】
次に、ステップＳ４では、各対象領域３１０−１〜Ｐ毎にＣＰＵ１１の演算量と、２次キャッシュメモリ１４のメモリアクセス量を算出する。ＣＰＵ１１の演算量は、分割した対象領域３１０−１〜Ｐ内の演算子毎に、計算機１が演算処理を行うサイクル数を予め設定しておき、各対象領域３１０−１〜Ｐのサイクル数を演算する。例えば、図７の例では、Ｙ（ｉ）＋Ｚ（ｉ）×ａであるので、加算と乗算に要するサイクル数を求める。
【００４３】
メモリアクセス量は、各対象領域３１０−１〜Ｐ毎に主記憶１５と２次キャッシュメモリ１４の間で行われるアクセス（ロード命令またはプリフェッチ命令あるいはストア命令）の数と、データ量からアクセス量をバイト数などで算出する。
【００４６】
次に、ステップＳ５では、各対象領域３１０−１〜Ｐからループ長（総演算回数）を決定する指標を抽出する。図７の例では、分割後の対象領域３１０−１〜Ｐのループ指標ｎをノードの数を示す並列指標ｐで除したｎ／ｐをループ長決定指標として抽出される。つまり、各対象領域３１０−１〜Ｐ毎の総ループ数を求める指標を抽出し、所定の変数へ代入する。
【００４７】
次に、ステップＳ６では、２次キャッシュメモリ１４上のデータを再利用する時間間隔を示す指標としてループ長（ｎ／ｐ）を求めて所定の変数へ代入する。図７の分割した対象領域３１０−１〜Ｐでは、２×ｎ／ｐ−１がループ長となる。
【００４８】
次に、ステップＳ７では、並列処理数に依存する指標を各対象領域３１０−１〜Ｐから抽出する。図７の例では、実行するノード数を示す並列指標ｐを抽出する。ステップＳ８では、対象領域３１０−１〜Ｐ毎に２次キャッシュメモリ１４へ読み込んだデータの再利用回数を演算する。この再利用回数は、変数の数と再利用した回数で構成される。図７の例では、２回目のループ演算でｘ（ｉ−１）とＺ（ｉ）が１回目のデータを再利用しているため、再利用性は、（１回、２変数）となる。
【００４９】
ステップＳ９では、ＣＰＵ１１のキャッシュメモリ１４の容量と、再利用するデータ量を比較するため、再利用するデータ量と、再利用するまでに２次キャッシュメモリ１４へ読み込まれる他のデータ量（再利用までの他のデータ量）を求める。
【００５０】
Ｓ１０では、上記Ｓ８で求めた再利用回数と、Ｓ９で求めた再利用までの他のデータ量と、Ｓ４〜Ｓ７で求めた演算量と、ループ長決定指標ｎ／ｐと、並列指標ｐをデータ再利用テーブル４３０に格納する。
【００５１】
ここで、データ再利用テーブル４３０は、図８で示すように構成され、各対象領域３１０−１〜Ｐ毎に生成される。データ再利用テーブル４３０には、分割後の対象領域における変数名、データの性質（連続したデータまたはストライド）、データの引用間隔（バイト数）、データの引用間隔を決定する間隔制御変数、データ再利用回数、再利用までの他のデータ量、他のデータ量（バイト数）、演算量から構成される。なお、データの性質は、連続またはストライド（飛び飛び）のいずれかを設定するもので、２次キャッシュメモリ１４へ読み込むデータから低電力化コード生成モジュール４００が決定しても良いし、ユーザ端末３から設定するようにしてもよい。ストライドの判定は、２次キャッシュメモリ１４のキャッシュラインへ読み込んだデータのうち、ひとつまたは一部のみを利用する場合をストライドと判定することができる。
【００５２】
なお、図８のデータ再利用テーブル４３０の内容は、図９に示す分割した対象領域３１０’の内容に基づくものである。
【００５３】
次に、Ｓ１１では、上記データ再利用テーブル４３０と設定情報に基づいて、低電力化コードを付加したロードモジュール５００を生成する。
【００５４】
図１０は、上記Ｓ１１で行われる低電力化コード付加のサブルーチンを示すフローチャートで、各対象領域３１０−１〜Ｐ毎に実行される。
【００５５】
まず、ステップＳ２０では、対象領域の処理が完了するまでの時間と、ＣＰＵ１１の実際の実行時間との比率をＣＰＵ１１の実行比率とし、対象領域の処理が完了するまでの時間と、２次キャッシュメモリ１４がデータの転送に要する時間との比率をメモリアクセス実行比率とし、ＣＰＵ１１の実行比率と２次キャッシュメモリ１４のメモリアクセス実行比率の比率をＣＰＵ負荷とする。
【００５６】
次に、ステップ２１では、各対象領域３１０−１〜Ｐ毎にＳ２０で求めたＣＰＵ負荷をＣＰＵ１１の平均負荷比率（以下、ＣＰＵ負荷比率）とする。
【００５７】
なお、上記Ｓ４では、演算量をサイクル数で求め、メモリアクセス量をバイト数で求めたので、メモリアクセス量をサイクル数に変換し、
ＣＰＵ負荷比率＝メモリアクセス量（サイクル数）／演算量
としてもよい。なお、メモリアクセス量のサイクル数への変換は、主記憶１５の転送レートからメモリアクセス量（バイト数）に応じた時間を求め、この時間をＣＰＵ１１の最大動作周波数からサイクル数へ変換すればよい。
【００５８】
ステップＳ２２では、ＣＰＵ負荷比率を所定の切り換え条件と比較して低電力化コードの付加の有無を判定する。所定の切り換え条件は、予め低電力化コード生成モジュール４００に設定した値(例えば、７０％)または図６のＳ１で入力した周波数／電圧切り換えの条件である。ＣＰＵ負荷比率が切り換え条件を超えていれば、演算器１２−１，２は効率よく（ストールを起こさず）実行できるので、ステップ２５に進んで低電力化コードは付加せず（または、最大の動作周波数と最高の動作電圧を設定）に最大の動作周波数でＣＰＵ１１を駆動する。
【００５９】
一方、ＣＰＵ負荷比率が切り換え条件以下であれば、この対象領域ではメモリアクセスの時間が長く、ＣＰＵ１１がストールを起こす可能性が大きいため、ステップ２３でＣＰＵ負荷比率に応じた低電力化コードを設定する。なお、ＣＰＵ１１の動作周波数と動作電圧が段階的に変更可能であれば、ＣＰＵ負荷比率が小さくなるにつれて、動作周波数と動作電圧を段階的に小さくなるような低電力化コードを求める。
【００６０】
なお、除算命令のように１命令のサイクル数が大きい命令を含む場合では、２次キャッシュメモリ１４のメモリアクセス量が多くても演算量が多くなり、ＣＰＵ負荷比率は切り換え条件を超えて最大の動作周波数で駆動されることになる。このため、対象領域内のＣＰＵ１１の演算時間とメモリアクセスの時間の比率を平均ＣＰＵ負荷比率として演算することで、メモリアクセス量が多くても演算量が多い場合には、動作周波数や動作電圧を低下させることなく、高速な処理を実現できるのである。
【００６１】
そして、ステップＳ２４では、Ｓ２３で求めた低電力化コードを最適化コード３００に付加し、ロードモジュール５００として出力する。なお、Ｓ１で低電力化コード実行の条件分岐が設定されていれば、各対象領域３１０−１〜Ｐ毎に低電力化コードを実行するか否かを判定する条件分岐を付加する。なお、最適化コード３００が中間コードの場合には、上記Ｓ２４またはＳ２５で計算機１の実行コードに変換してロードモジュール５００を得る。
【００６２】
上記ステップＳ２４で低電力化コードを付加したロードモジュール５００に相当するプログラムの例を図１１に示す。各対象領域３１０−１〜Ｐには、上記ステップ１で設定した条件分岐「ｉｆ（ｎ／ｐ＊３＊Ｂ＞Ｍ）  」が設定され、この条件分岐に設定された条件（ｎ／ｐ＊３＊Ｂ＞Ｍ）を満たしたときに、低電力化コード（周波数低下指令Ａ１）が実行される。そして、一つの対象領域が終了すると、条件分岐の設定条件を満たしていた場合には、通常の動作周波数へ戻す指令Ａ２が実行されるようにロードモジュール５００が生成される。なお、低電力化コードを実行する条件分岐は、例えば、ループ長（ｎ／ｐ）が長く、データ量（Ｂ）が２次キャッシュメモリ１４の容量（Ｍ）に比して大きいときに実行するようにする。つまり、ロードモジュール５００を実行するノード数が多いときには、各対象領域３１０−１〜Ｐのループ長は短く、データ量も少なくなってＣＰＵ負荷比率が高くなるので、演算器（演算パイプライン）１２−１，２はストールすることなく低電力化コードを実行する必要はない。一方、ロードモジュール５００を実行するノード数が少ないときには、各対象領域３１０−１〜Ｐのループ長は長く、データ量も多くなってＣＰＵ負荷比率が低くなるので、演算器（演算パイプライン）１２−１，２はストールを起こす可能性が高いので、低電力化コードを実行させることで演算器の無駄な電力消費を防いで、計算機１の消費電力の低減を実現でき、かつ演算処理の遅延を防ぐことができる。したがって、低電力化コードを実行するか否かの判定を行う条件分岐は、ロードモジュール５００の実行時のループ長に応じて行うようにすればよい。
【００６３】
以上のような処理により生成されたロードモジュール５００を、図４で示したように計算機１にループ指標ｎと並列処理の指標Ｐを設定して所望のノード１０−１〜ｎで実行させると、メモリアクセスの実行比率が所定値を超えてＣＰＵ実行比率よりも高い対象領域３１０−１〜Ｐでは、ＣＰＵ１１の省電力機構を機能して動作周波数または動作電圧を低減して、ＣＰＵ１１の消費電力を確実に低減させることができる。メモリアクセスの実行比率が高いときには、ＣＰＵ１１の演算器１２−１，２は主記憶１５からのデータを待ってストールしやすいため、動作周波数または動作電圧を低減させても実行コードの実行速度は低下することはない。
【００６４】
そして、本発明によれば、コンパイラ２００と低電力化コード生成モジュール４００は、１回の処理でロードモジュール５００を得ることができるので、前記従来例のように、最初にコンパイルしたロードモジュールを実行させてプロファイルを取得し、プロファイルに基づいて再度コンパイルする場合に比して、極めて迅速にロードモジュール５００を得ることができるのである。
【００６５】
さらに、ロードモジュール５００は並列指標ｐを変更することで、実行させるノード数を任意に設定できるので、前記従来例のように再コンパイルの必要はなくなって、科学技術などのシミュレーション演算を効率よく行うことができるのである。
【００６６】
なお、上記第１の実施形態ではＣＰＵ１１をデュアルコアで構成した例を示したが、シングルコアやクワッドコアで構成しても良い。
【００６７】
また、本実施形態では、低電力化コード生成モジュール４００が中間コードを受け付けるようにしたため、コンパイラ２００に既存のものを用いることが可能となって、低コストで低電力化コードを付加することができる。
【００６８】
＜第２実施形態＞
図１２、図１３は第２の実施形態を示し、前記第１実施形態のＣＰＵ１１が３次キャッシュメモリ１７を備える例を示す。
【００６９】
図１２において、ＣＰＵ１１の２次キャッシュメモリ１４は、主記憶１５側に３次キャッシュメモリ１４を備える。その他の構成は前記第１実施形態と同様である。
【００７０】
図１３は、低電力化コード生成モジュール４００の上記ステップＳ１１で実行されるサブルーチンを示す。
【００７１】
図１３において、ステップＳ２０〜Ｓ２２及びＳ２５は、前記第１実施形態の図１０と同様であり、低電力化コードを付加するステップＳ３０以降が第１実施形態とは異なる。
【００７２】
ステップＳ２２の判定で、ＣＰＵ負荷比率が切り換え条件以下であれば、この対象領域ではメモリアクセスの時間が長く、ＣＰＵ１１がストールを起こす可能性が大きいため、ステップＳ３１以降で低電力化コードを付加する。
【００７３】
ステップＳ３１では、対象領域の演算に必要なデータの読み込み時点であれば、読み込むデータが２次キャッシュメモリ１４に存在するかを判定する。２次キャッシュメモリ１４に読み込むデータが存在すれば、Ｓ３６へ進んでＣＰＵ負荷比率に応じた動作周波数と動作電圧を算出し、Ｓ３７でＳ３６で決定した動作周波数と動作電圧に対応する低電力化コードを付加する。
【００７４】
一方、２次キャッシュメモリ１４に読み込むデータが存在しない場合には、Ｓ３２へ進む。
【００７５】
ステップＳ３２では、対象領域の演算に必要なデータの読み込み時点であれば、読み込むデータが３次キャッシュメモリ１７に存在するかを判定する。３次キャッシュメモリ１７に読み込むデータが存在すれば、Ｓ３８へ進んで２次キャッシュメモリ１４のキャッシュミスによるレイテンシとＣＰＵ負荷比率に応じた動作周波数と動作電圧を算出し、Ｓ３９でＳ３８で決定した動作周波数と動作電圧に対応する低電力化コードを付加する。
【００７６】
ステップＳ３２の判定で、３次キャッシュメモリ１７にも読み込むデータが存在しない場合には、Ｓ３３へ進む。
【００７７】
ステップＳ３３では、３次キャッシュメモリ１７のキャッシュミスによるレイテンシ（主記憶１５から読み込むレイテンシ）とＣＰＵ負荷比率に応じた動作周波数と動作電圧を算出し、Ｓ３４ではＳ３３で決定した動作周波数と動作電圧に対応する低電力化コードを付加する。
【００７８】
このように、２次キャッシュメモリ１４と３次キャッシュメモリ１７を備える場合では、キャッシュミスが発生した位置から、データが存在する位置に応じてレイテンシを変更し、動作周波数と動作電圧を変更すればよい。なお、レイテンシは、主記憶１５や３次キャッシュメモリ１７のデータ転送レートから予め設定しておけばよい。
【００７９】
なお、３次キャッシュメモリ１７は、主記憶１５側に設けた例を示したが、図示はしないがバックサイドバスに設けても良い。
【００８０】
＜第３実施形態＞
図１４は、第３の実施形態を示し、前記第１実施形態の低電力化コード生成モジュール４００をコンパイラに組み込んだもので、その他の構成は前記第１実施形態と同様である。
【００８１】
コンパイラ２００Ａの最適化コード生成部２３０は、最適化コードを低電力化コード生成モジュール４００へ出力する。低電力化コード生成モジュール４００は、最適化コードを解析し、前記第１実施形態と同様に低電力化コードを付加したロードモジュール５００を出力する。
【００８２】
この例では、中間コードを出力する必要がないので、ロードモジュール５００をさらに迅速に得ることができる。
【００８３】
なお、上記第１実施形態ないし第３実施形態では、低電力化コードを付加する対象領域を、読み込んだ最適化コードの演算領域からループ演算を選択したが、これに限定されるものではなく、予め設定したプログラム構造であればよく、サブルーチンなどに適用しても良い。
【産業上の利用可能性】
【００８４】
以上のように、本発明では、１回のコンパイルと低電力化コード生成モジュールの実行で、並列処理に適したロードモジュールに低電力化コードを付加することができ、並列処理に適したコンパイラまたはロードモジュール生成プログラムに適用することができる。
【図面の簡単な説明】
【００８５】
【図１】第１の実施形態を示す計算機システムのブロック図である。
【図２】計算機の構成を示すブロック図である。
【図３】ソースプログラムをコンパイルする際の計算機システムのブロック図を示す。
【図４】コンパイルによって得られたロードモジュールを実行する際の計算機システムのブロック図を示す。
【図５】コンパイラと低電力化コード生成モジュールの構成の一例を示すブロック図である。
【図６】低電力化コード生成モジュール４００で実行される処理の一例を示すフローチャートである。
【図７】対象領域の分割の様子を示す説明図である。
【図８】データ再利用テーブルの一例を示す説明図である。
【図９】対象領域の一例を示す説明図である。
【図１０】図６のＳ１１で行われる低電力化コード付加のサブルーチンを示すフローチャート
【図１１】低電力化コードを付加したロードモジュールに相当するプログラムの一例を示す説明図である。
【図１２】は第２の実施形態を示し、ＣＰＵのブロック図である。
【図１３】低電力化コード生成モジュール４００の上記図６のステップＳ１１で実行されるサブルーチンの他の例を示す。
【図１４】第３の実施形態を示し、コンパイラのブロック図である。
【符号の説明】
【００８６】
１  計算機
１４  ２次キャッシュメモリ１４
５０  ソースプログラム
２００  コンパイラ
３００  最適化コード
４００  低電力化コード生成モジュール
５００  ロードモジュール
【図１】
0004231516.tif 000002
【図２】
0004231516.tif 000003
【図３】
0004231516.tif 000004
【図４】
0004231516.tif 000005
【図５】
0004231516.tif 000006
【図６】
0004231516.tif 000007
【図７】
0004231516.tif 000008
【図８】
0004231516.tif 000009
【図９】
0004231516.tif 000010
【図１０】
0004231516.tif 000011
【図１１】
0004231516.tif 000012
【図１２】
0004231516.tif 000013
【図１３】
0004231516.tif 000014
【図１４】
0004231516.tif 000015