(57)【要約】【課題】プログラムの開発工数がかからないコンパイラを提供する。【解決手段】高級言語で記述されたソースプログラム７２を機械語プログラムに翻訳するコンパイラ５８であって、生成する機械語プログラムを最適化する旨の指示を取得する指示取得部と、前記ソースプログラム７２を解析するパーサー部７６と、前記パーサー部７６における解析結果に基づいて、前記ソースプログラム７２を中間コードに変換する中間コード変換部７８と、前記指示に従って、前記中間コードを最適化する最適化部６８と、前記中間コードを前記機械語プログラムに変換するコード生成部９０とを備え、前記指示は、キャッシュメモリを利用するプロセッサをターゲットプロセッサとする最適化指示である。【選択図】図７
2011081836.tif 000002
【特許請求の範囲】
【請求項１】
高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、
前記ソースプログラムを解析するパーサー手段と、
前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、
前記指示に従って、前記中間コードを最適化する最適化手段と、
前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、
前記機械語プログラムを実行するプロセッサは、キャッシュメモリを利用するプロセッサであり、
前記キャッシュメモリに含まれる複数のキャッシュエントリーの各々は、前記キャッシュエントリーに格納されたオブジェクトの追い出しやすさを示す値を記憶するウィークフラグを有し、
前記プロセッサが使用するメインメモリは、記憶されているオブジェクトが前記キャッシュメモリに配置されるとともに、当該配置の際に前記ウィークフラグに前記オブジェクトを追い出しやすくする値が設定されるウィーク空間と、記憶されているオブジェクトが前記キャッシュメモリに配置されるとともに、当該配置の際に前記ウィークフラグに前記オブジェクトを追い出しやすくする値が設定されないキャッシャブル空間とを有し、
前記指示取得手段は、前記ソースプログラムの中において、特定のオブジェクトを前記ウィーク空間または前記キャッシャブル空間のいずれに配置するかを示す配置情報に基づいて、前記特定のオブジェクトを前記ウィーク空間または前記キャッシャブル空間に配置する指示と、前記特定のオブジェクトの名前と、前記配置情報とを取得し、
前記最適化手段は、特定のオブジェクトを前記配置情報に従い前記ウィーク空間または前記キャッシャブル空間のいずれかに配置させるための命令を生成する
ことを特徴とするコンパイラ装置。
【請求項２】
高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、
前記ソースプログラムを解析するパーサー手段と、
前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、
前記指示に従って、前記中間コードを最適化する最適化手段と、
前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、
前記機械語プログラムを実行するプロセッサは、キャッシュメモリを利用するプロセッサであり、
前記プロセッサは、前記キャッシュメモリよりも容量の少ないサブキャッシュメモリをさらに使用し、
前記キャッシュメモリに含まれる複数のキャッシュエントリーの各々は、前記キャッシュエントリーに格納されたオブジェクトの追い出しやすさを示す値を記憶するウィークフラグを有し、
前記プロセッサが使用するメインメモリは、記憶されているオブジェクトが前記キャッシュメモリに配置されるとともに、当該配置の際に前記ウィークフラグに前記オブジェクトを追い出しやすくする値が設定されるウィーク空間と、記憶されているオブジェクトが前記キャッシュメモリに配置されるとともに、当該配置の際に前記ウィークフラグに前記オブジェクトを追い出しやすくする値が設定されないキャッシャブル空間と、記憶されているオブジェクトが前記サブキャッシュメモリに配置されるサブキャッシュ空間とを有し、
前記指示取得手段は、前記ソースプログラムを翻訳する旨の指示とともに、前記機械語プログラムの実行解析結果に基づいて前記ソースプログラムに含まれるオブジェクトを配置する前記メインメモリの空間を決定し、当該空間に前記オブジェクトを配置する旨の指示を取得し、
前記最適化手段は、前記機械語プログラムの実行解析結果に基づいて前記ソースプログラムに含まれるオブジェクトを配置する前記メインメモリの空間を決定し、当該空間に前記オブジェクトを配置するための命令を生成する
ことを特徴とするコンパイラ装置。
【請求項３】
高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、
前記ソースプログラムを解析するパーサー手段と、
前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、
前記指示に従って、前記中間コードを最適化する最適化手段と、
前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、
前記機械語プログラムを実行するプロセッサは、キャッシュメモリを利用するプロセッサであり、
前記プロセッサは、前記キャッシュメモリよりも容量の少ないサブキャッシュメモリをさらに使用し、
前記キャッシュメモリに含まれる複数のキャッシュエントリーの各々は、前記キャッシュエントリーに格納されたオブジェクトの追い出しやすさを示す値を記憶するウィークフラグを有し、
前記プロセッサが使用するメインメモリは、記憶されているオブジェクトが前記キャッシュメモリに配置されるとともに、当該配置の際に前記ウィークフラグに前記オブジェクトを追い出しやすくする値が設定されるウィーク空間と、記憶されているオブジェクトが前記キャッシュメモリに配置されるとともに、当該配置の際に前記ウィークフラグに前記オブジェクトを追い出しやすくする値が設定されないキャッシャブル空間と、記憶されているオブジェクトが前記サブキャッシュメモリに配置されるサブキャッシュ空間とを有し、
前記指示取得手段は、前記ソースプログラムの中において、前記機械語プログラムの実行解析結果に基づいて前記ソースプログラムに含まれるオブジェクトを配置する前記メインメモリの空間を決定し、当該空間に前記オブジェクトを配置する旨の指示を取得し、
前記最適化手段は、前記機械語プログラムの実行解析結果に基づいて前記ソースプログラムに含まれるオブジェクトを配置する前記メインメモリの空間を決定し、当該空間に前記オブジェクトを配置するための命令を生成する
ことを特徴とするコンパイラ装置。
【請求項４】
高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、
前記ソースプログラムを解析するパーサー手段と、
前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、
前記指示に従って、前記中間コードを最適化する最適化手段と、
前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、
前記機械語プログラムを実行するプロセッサは、キャッシュメモリを利用するプロセッサであり、
前記指示取得手段は、前記ソースプログラムの中において、前記キャッシュメモリを制御するキャッシュメモリ制御手段の専用コマンドを前記キャッシュメモリ制御手段に実行させる指示を取得し、
前記最適化手段は、前記指示に基づいて前記専用コマンドを前記キャッシュメモリ制御手段に実行させるための命令を生成し、
前記専用コマンドは、指定されたオブジェクトを前記プロセッサが使用するメインメモリより前記キャッシュメモリの所定のキャッシュエントリーに先読みするとともに、当該キャッシュエントリーに格納されているオブジェクトを前記キャッシュメモリにライトバックする必要がある場合には、当該オブジェクトを前記メインメモリにライトバックするコマンドである
ことを特徴とするコンパイラ装置。
【請求項５】
高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、
前記ソースプログラムを解析するパーサー手段と、
前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、
前記指示に従って、前記中間コードを最適化する最適化手段と、
前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、
前記機械語プログラムを実行するプロセッサは、キャッシュメモリを利用するプロセッサであり、
前記指示取得手段は、前記ソースプログラムの中において、前記キャッシュメモリを制御するキャッシュメモリ制御手段の専用コマンドを前記キャッシュメモリ制御手段に実行させる指示を取得し、
前記最適化手段は、前記指示に基づいて前記専用コマンドを前記キャッシュメモリ制御手段に実行させるための命令を生成し、
前記キャッシュメモリに含まれる複数のキャッシュエントリーの各々は、前記キャッシュエントリーに格納されたオブジェクトの追い出しやすさを示す値を記憶するウィークフラグを有し、
前記専用コマンドは、指定されたオブジェクトを前記プロセッサが使用するメインメモリより前記キャッシュメモリの所定のキャッシュエントリーに先読みするとともに、当該キャッシュエントリーのウィークフラグに格納されたオブジェクトを追い出しやすくする値を設定するコマンドである
ことを特徴とするコンパイラ装置。
【請求項６】
高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、
前記ソースプログラムを解析するパーサー手段と、
前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、
前記指示に従って、前記中間コードを最適化する最適化手段と、
前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、
前記機械語プログラムを実行するプロセッサは、キャッシュメモリを利用するプロセッサであり、
前記指示取得手段は、前記ソースプログラムの中において、前記キャッシュメモリを制御するキャッシュメモリ制御手段の専用コマンドを前記キャッシュメモリ制御手段に実行させる指示を取得し、
前記最適化手段は、前記指示に基づいて前記専用コマンドを前記キャッシュメモリ制御手段に実行させるための命令を生成し、
前記専用コマンドは、指定されたオブジェクトを格納するためのキャッシュエントリーを前記キャッシュメモリに事前に確保するとともに、当該キャッシュエントリーに格納されているオブジェクトを前記キャッシュメモリにライトバックする必要がある場合には、当該オブジェクトを前記メインメモリにライトバックするコマンドである
ことを特徴とするコンパイラ装置。
【請求項７】
高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、
前記ソースプログラムを解析するパーサー手段と、
前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、
前記指示に従って、前記中間コードを最適化する最適化手段と、
前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、
前記機械語プログラムを実行するプロセッサは、キャッシュメモリを利用するプロセッサであり、
前記指示取得手段は、前記ソースプログラムの中において、前記キャッシュメモリを制御するキャッシュメモリ制御手段の専用コマンドを前記キャッシュメモリ制御手段に実行させる指示を取得し、
前記最適化手段は、前記指示に基づいて前記専用コマンドを前記キャッシュメモリ制御手段に実行させるための命令を生成し、
前記キャッシュメモリに含まれる複数のキャッシュエントリーの各々は、前記キャッシュエントリーに格納されたオブジェクトの追い出しやすさを示す値を記憶するウィークフラグを有し、
前記専用コマンドは、指定されたオブジェクトを格納するためのキャッシュエントリーを前記キャッシュメモリに事前に確保するとともに、当該キャッシュエントリーのウィークフラグに格納されたオブジェクトを追い出しやすくする値を設定するコマンドである
ことを特徴とするコンパイラ装置。
【請求項８】
高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、
前記ソースプログラムを解析するパーサー手段と、
前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、
前記指示に従って、前記中間コードを最適化する最適化手段と、
前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、
前記機械語プログラムを実行するプロセッサは、キャッシュメモリを利用するプロセッサであり、
前記指示取得手段は、前記ソースプログラムの中において、前記キャッシュメモリを制御するキャッシュメモリ制御手段の専用コマンドを前記キャッシュメモリ制御手段に実行させる指示を取得し、
前記最適化手段は、前記指示に基づいて前記専用コマンドを前記キャッシュメモリ制御手段に実行させるための命令を生成し、
前記専用コマンドは、指定されたオブジェクトを格納するためのキャッシュエントリーに格納されているオブジェクトを前記キャッシュメモリにライトバックする必要がある場合には、当該オブジェクトを前記メインメモリにライトバックするとともに、当該キャッシュエントリーを無効化するコマンドである
ことを特徴とするコンパイラ装置。
【請求項９】
高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、
前記ソースプログラムを解析するパーサー手段と、
前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、
前記指示に従って、前記中間コードを最適化する最適化手段と、
前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、
前記機械語プログラムを実行するプロセッサは、キャッシュメモリを利用するプロセッサであり、
前記指示取得手段は、前記ソースプログラムの中において、前記キャッシュメモリを制御するキャッシュメモリ制御手段の専用コマンドを前記キャッシュメモリ制御手段に実行させる指示を取得し、
前記最適化手段は、前記指示に基づいて前記専用コマンドを前記キャッシュメモリ制御手段に実行させるための命令を生成し、
前記専用コマンドは、指定されたオブジェクトを格納するためのキャッシュエントリーを無効化するコマンドである
ことを特徴とするコンパイラ装置。
【請求項１０】
高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、
前記ソースプログラムを解析するパーサー手段と、
前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、
前記指示に従って、前記中間コードを最適化する最適化手段と、
前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、
前記機械語プログラムを実行するプロセッサは、キャッシュメモリを利用するプロセッサであり、
前記指示取得手段は、前記ソースプログラムの中において、前記キャッシュメモリを制御するキャッシュメモリ制御手段の専用コマンドを前記キャッシュメモリ制御手段に実行させる指示を取得し、
前記最適化手段は、前記指示に基づいて前記専用コマンドを前記キャッシュメモリ制御手段に実行させるための命令を生成し、
前記専用コマンドは、指定されたオブジェクトを格納するためのキャッシュエントリーを前記キャッシュメモリに事前に確保するコマンドである
ことを特徴とするコンパイラ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｃ言語等の高級言語で記述されたソースプログラムを機械語プログラムに変換するコンパイラ装置に関し、特に、コンパイラによる最適化についての指示に関する。
【背景技術】
【０００２】
従来、高級言語で記述されたソースプログラムを機械語命令列にコンパイルする高級言語用コンパイラは各種提案されている（例えば、特許文献１参照。）。
【０００３】
このような高級言語で記述されたソースプログラムを機械語命令列にコンパイルする高級言語用コンパイラでは、キャッシュメモリ等のハードウェア構成を考慮して、実行速度の向上等を図るための機械語命令列の最適化を実現することができなかった。
【０００４】
このため、ハードウェア構成を考慮した機械語命令列を作成するためには、アセンブリ言語でプログラムを作成したり、ハードウェア構成を考慮したアルゴリズムを作成し、そのアルゴリズムに基づいてソースプログラムを作成したりしている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００３−９９２６９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、アセンブリ言語でプログラムを開発するには、開発工数が非常にかかるという課題がある。
【０００７】
また、アセンブリ言語で記述されたプログラムは移植性に乏しいため、資産性が低いという課題もある。
【０００８】
さらに、ハードウェアが大規模化、複雑化している今日においては、ハードウェアを考慮したアルゴリズムを人手で作成して性能をチューニングするのは非常に困難であるという課題もある。
【０００９】
本発明は、上述の課題を解決するためになされたもので、プログラムの開発工数がかからないコンパイラ装置を提供することを第１の目的とする。
【００１０】
また、プログラムの資産性が高いコンパイラ装置を提供することを第２の目的とする。
【００１１】
さらに、人手で性能をチューニングする必要のないコンパイラ装置を提供することを第３の目的とする。
【課題を解決するための手段】
【００１２】
上記目的を達成するために、本発明に係るコンパイラ装置は、高級言語で記述されたソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、生成する機械語プログラムを最適化する旨の指示を取得する指示取得手段と、前記ソースプログラムを解析するパーサー手段と、前記パーサー手段における解析結果に基づいて、前記ソースプログラムを中間コードに変換する中間コード変換手段と、前記指示に従って、前記中間コードを最適化する最適化手段と、前記中間コードを前記機械語プログラムに変換するコード生成手段とを備え、前記指示は、キャッシュメモリを利用するプロセッサをターゲットプロセッサとする最適化指示である。
【００１３】
この構成によると、最適化のための指示に基づいて、中間コードの最適化が行なわれる。このため、アセンブリ言語でプログラムを開発しなくても、指示を与えるだけで、キャッシュメモリを効率よく利用可能な機械語プログラムを生成することができる。そのため、アセンブリ言語でプログラムを開発する場合に比べ、開発工数がかからない。また、ソースプログラムは高級言語で記述され、かつ上述のように指示を与えるだけで、キャッシュメモリを効率よく利用可能な機械語プログラムを生成することができる。このため、指示を様々に変えることにより、様々な最適化が行なわれる。このため、プログラムの資産性が向上する。さらに、人手で性能をチューニングする必要もなくなる。
【００１４】
好ましくは、前記指示取得手段は、前記ソースプログラムの中において、特定のループ処理を当該ループ処理に含まれるオブジェクトが所定の容量ごとに前記キャッシュメモリに配置されるように複数のループ処理に分割する旨の指示を取得し、前記最適化手段は、前記指示取得手段によって取得された指示の対象となったループ処理を前記指示に従い複数のループ処理に分割する。
【００１５】
ループ処理に含まれるオブジェクトがキャッシュメモリに一度に配置されるように、ループ分割が行なわれる。このため、大量のオブジェクトを一度に処理しようとするために、それらのオブジェクトをキャッシュメモリに一度に乗せることができないために起こるヒットミスを防ぐことができる。
【００１６】
さらに好ましくは、前記指示取得手段は、前記ソースプログラムの中において、特定のオブジェクトを、当該オブジェクト参照時までに前記キャッシュメモリに予め格納する旨の指示を取得し、前記最適化手段は、前記オブジェクトを当該オブジェクト参照時までに前記キャッシュメモリに予め格納させる。
【００１７】
この指示を行なうことにより、プログラム実行時に利用しようとするオブジェクトがキャッシュメモリに記憶されていないために起こるヒットミスを防ぐことができる。
【００１８】
さらに好ましくは、前記指示取得手段は、前記ソースプログラムの中において、特定のオブジェクトを前記キャッシュメモリのラインデータのサイズごとにグループ分けし、異なるグループに含まれるオブジェクトは前記キャッシュメモリの異なるセット番号のキャッシュエントリーに配置する旨の指示と、前記特定のオブジェクトの名前とを取得し、前記最適化手段は、前記特定のオブジェクトを前記キャッシュメモリのラインデータのサイズごとにグループ分けし、異なるグループに属するオブジェクト同士が前記キャッシュメモリの同じセット番号のキャッシュエントリーに配置されないようにする。
【００１９】
時間的に近いタイミングでアクセスされるオブジェクト同士でキャッシュメモリの同一のセット番号のブロックを奪い合い、互いにオブジェクトを追い出しあう競合状態によるヒットミスを防ぐことができる。
【００２０】
さらに好ましくは、前記キャッシュメモリに含まれる複数のキャッシュエントリーの各々は、前記キャッシュエントリーに格納されたオブジェクトの追い出しやすさを示す値を記憶するウィークフラグを有し、前記プロセッサが使用するメインメモリは、記憶されているオブジェクトが前記キャッシュメモリに配置されるとともに、当該配置の際に前記ウィークフラグに前記オブジェクトを追い出しやすくする値が設定されるウィーク空間と、記憶されているオブジェクトが前記キャッシュメモリに配置されるとともに、当該配置の際に前記ウィークフラグに前記オブジェクトを追い出しやすくする値が設定されないキャッシャブル空間とを有し、前記指示取得手段は、前記ソースプログラムの中において、特定のオブジェクトを前記ウィーク空間または前記キャッシャブル空間のいずれに配置するかを示す配置情報に基づいて、前記特定のオブジェクトを前記ウィーク空間または前記キャッシャブル空間に配置する指示と、前記特定のオブジェクトの名前と、前記配置情報とを取得し、前記最適化手段は、特定のオブジェクトを前記配置情報に従い前記ウィーク空間または前記キャッシャブル空間のいずれかに配置させる。
【００２１】
オブジェクトを適切な空間に配置することにより、例えば、ウィーク空間を利用することにより、あまり利用されないオブジェクトにウィークビットを立て、優先的に追い出すようにすることもできる。これにより、オブジェクト同士でキャッシュメモリの同一のセット番号のブロックを奪い合い、互いにオブジェクトを追い出しあう競合状態によるヒットミスを防ぐことができる。
【００２２】
さらに好ましくは、前記指示取得手段は、前記ソースプログラムの中において、前記キャッシュメモリを制御するキャッシュメモリ制御手段の専用コマンドを前記キャッシュメモリ制御手段に実行させる指示を取得し、前記最適化手段は、前記指示に基づいて前記専用コマンドを前記キャッシュメモリ制御手段に実行させる。
【００２３】
キャッシュメモリ制御手段が実行する専用コマンドを指定できるようにすることにより、キャッシュメモリの細かな制御をユーザが指定することができ、キャッシュメモリにおけるヒットミスを防ぐことができる。
【００２４】
なお、本発明は、このような特徴的な手段を備えるコンパイラ装置として実現することができるだけでなく、コンパイラ装置に含まれる特徴的な手段をステップとするコンパイル方法として実現したり、コンパイラ装置が備える各手段としてコンピュータを機能させるためのプログラムとして実現したりすることもできる。そして、そのようなプログラムは、ＣＤ−ＲＯＭ等の記録媒体やインターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
【発明の効果】
【００２５】
アセンブリ言語でプログラムを開発する場合に比べ、開発工数がかからない。
【００２６】
また、プログラムの資産性が向上する。
【００２７】
さらに、人手で性能をチューニングする必要もなくなる。
【００２８】
さらにまた、オブジェクトをキャッシュメモリに一度に乗せることができないために起こるヒットミスを防ぐことができる。
【００２９】
また、プログラム実行時に利用しようとするオブジェクトがキャッシュメモリに記憶されていないために起こるヒットミスを防ぐことができる。
【００３０】
さらに、オブジェクト同士でキャッシュメモリの同一のセット番号のブロックを奪い合い、互いにオブジェクトを追い出しあう競合状態によるヒットミスを防ぐことができる。
【図面の簡単な説明】
【００３１】
【図１】本発明の実施の形態に係るコンパイルシステムがターゲットとするコンピュータのハードウェア構成の一部を示すブロック図である。
【図２】キャッシュメモリのハードウェア構成を示すブロック図である。
【図３】キャッシュエントリーにおける詳細なビット構成を示す図である。
【図４】サブキャッシュメモリのハードウェア構成を示すブロック図である。
【図５】メインメモリに含まれる記憶領域の種類を説明するための図である。
【図６】機械語プログラムを開発するプログラム開発システムの構成を示すブロック図である。
【図７】コンパイラの構成を示す機能ブロック図である。
【図８】タイリング処理を説明するための図である。
【図９】容量性ミス発生のチェック処理を説明するための図である。
【図１０】プリフェッチ命令挿入処理の指定方法を説明するための図である。
【図１１】プリフェッチ命令挿入処理の指定方法を説明するための図である。
【図１２】ループ内の配列に対するプラグマ指令によるプリフェッチ命令挿入処理を説明するための図である。
【図１３】プロファイル情報を利用したプリフェッチ命令挿入処理の指定方法を説明するための図である。
【図１４】データ配置処理の概略を説明するための図である。
【図１５】データ配置の指定に関する方法を説明するための図である。
【図１６】データ配置を指定するプラグマ指令を含むソースプログラムの一例を示す図である。
【図１７】グループ分けされたオブジェクトの図である。
【図１８】データ配置を指定するプラグマ指令を含むソースプログラムの一例を示す図である。
【図１９】オブジェクトを特定の空間に配置するための指定方法を示す図である。
【図２０】専用レジスタＤＰＴＥＬに格納される情報を示す図である。
【図２１】組み込み関数の一覧を示す図である。
【図２２】キャッシュコマンド挿入部により生成される中間コード一例を示す図である。
【図２３】図２１に示した組み込み関数が有効に機能しているか否かを調べるための組み込み関数の一覧を示す図である。
【図２４】コンパイラに対して各種情報の入出力を行なうための指定方法を説明するための図である。
【発明を実施するための形態】
【００３２】
図１は、本発明の実施の形態に係るコンパイルシステムがターゲットとするコンピュータのハードウェア構成の一部を示すブロック図である。コンピュータ１０は、プロセッサ１と、メインメモリ２と、キャッシュメモリ３と、サブキャッシュメモリ４と、キャッシュ制御部５とを備えている。プロセッサ１は、機械語プログラムを実行する処理部であり、通常のプロセッサが有する機能に加えて、後述する専用レジスタ６（専用レジスタＤＰＴＥＬ）を有している。
【００３３】
メインメモリ２は、プロセッサ１で実行される機械語命令や各種データなどを記憶するメモリである。
【００３４】
キャッシュメモリ３は、４ウェイセットアソシアティブ方式に従い動作し、メインメモリ２よりも高速にデータの読み書きが可能なメモリである。なお、キャッシュメモリ３の記憶容量は、メインメモリ２のそれに比べて少ない。
【００３５】
サブキャッシュメモリ４は、ダイレクトマッピング方式に従い動作し、メインメモリ２よりも高速にデータの読み書きが可能なメモリである。なお、サブキャッシュメモリ４の記憶容量は、キャッシュメモリ３のそれに比べて少ない。
【００３６】
キャッシュ制御部５は、キャッシュメモリ３およびサブキャッシュメモリ４を制御するための処理部であり、後述する専用レジスタ７〜９（専用レジスタＴＡＣＭ、ＴＡＣＳＺおよびＴＡＣＳＴＡＤ）を有している。
【００３７】
図２は、キャッシュメモリ３のハードウェア構成を示すブロック図である。同図のように、キャッシュメモリ３は、４ウェイセットアソシアティブ方式のキャッシュメモリであり、アドレスレジスタ２０と、デコーダ３０と、４つのウェイ３１ａ〜３１ｄ（以下ウェイ０〜３と略す）と、４つの比較器３２ａ〜３２ｄと、４つのアンド回路３３ａ〜３３ｄと、オア回路３４と、セレクタ３５と、デマルチプレクサ３７とを備える。
【００３８】
アドレスレジスタ２０は、メインメモリ２へのアクセスアドレスを保持するレジスタである。このアクセスアドレスは３２ビットであるものとする。同図に示すように、アクセスアドレスは、最上位ビットから順に、２１ビットのタグアドレスと、４ビットのセットインデックス（図中のＳＩ）とを含む。ここで、タグアドレスはウェイにマッピングされるメモリ中の領域を指す。セットインデックス（ＳＩ）はウェイ０〜３に跨る複数セットの１つを示す。このセット数は、セットインデックス（ＳＩ）が４ビットなので１６セットである。タグアドレスおよびセットインデックス（ＳＩ）で特定されるブロックは、リプレース単位であり、キャッシュメモリに格納されている場合はラインデータ又はラインとも呼ばれる。ラインデータのサイズは、セットインデックス（ＳＩ）よりも下位のアドレスビットで定まるサイズ、すなわち１２８バイトである。１ワードを４バイトとすると、１ラインデータは３２ワードである。アドレスレジスタ２０中の最下位から７ビットは、ウェイのアクセス時には無視される。
【００３９】
デコーダ３０は、セットインデックス（ＳＩ）の４ビットをデコードし、４つのウェイ０〜３に跨る１６セット中の１つを選択する。
【００４０】
４つのウェイ０〜３は、同じ構成を有し、合計４×２ｋバイトの容量を有する。ウェイ０は、１６個のキャッシュエントリーを有する。
【００４１】
図３に１つのキャッシュエントリーにおける詳細なビット構成を示す。同図のように、１つのキャッシュエントリーは、バリッドフラグＶ、２１ビットのタグ、１２８バイトのラインデータ、ウィークフラグＷおよびダーティフラグＤを保持する。バリッドフラグＶは、そのキャッシュエントリーが有効か否かを示す。タグは２１ビットのタグアドレスのコピーである。ラインデータは、タグアドレスおよびセットインデックス（ＳＩ）により特定されるブロック中の１２８バイトデータのコピーである。ダーティフラグＤは、そのキャッシュエントリーに書き込みがあったか否か、つまりキャシュエントリー中にキャッシュされたデータが書き込みによりメモリ中のデータと異なるためメモリに書き戻すこと（ライトバックすること）が必要か否かを示す。ウィークフラグＷは、キャッシュエントリーからの追い出し対象を示すフラグであり、キャッシュミスを起こした場合に、ウィークフラグＷが１のキャッシュエントリーから優先的にデータが追い出される。
【００４２】
ウェイ１〜３についても、ウェイ０と同様である。セットインデックス（ＳＩ）の４ビットによってデコーダ３０を介して選択される４ウェイに跨る４つのキャッシュエントリーは、「セット」と呼ばれる。
【００４３】
比較器３２ａは、アドレスレジスタ２０中のタグアドレスと、セットインデックス（ＳＩ）により選択されたセットに含まれる４つのタグ中のウェイ０のタグとが一致するか否かを比較する。比較器３２ｂ〜３２ｃについても、ウェイ３１ｂ〜３１ｄに対応すること以外は同様である。
【００４４】
アンド回路３３ａは、バリッドフラグＶと比較器３２ａの比較結果とが一致するか否かを比較する。この比較結果をｈ０をする。比較結果ｈ０が１である場合は、アドレスレジスタ２０中のタグアドレスおよびセットインデックス（ＳＩ）に対応するラインデータが存在すること、すなわちウェイ０においてヒットしたことを意味する。比較結果ｈ０が０である場合は、ミスヒットしたことを意味する。アンド回路３３ｂ〜３３ｄについても、ウェイ３１ｂ〜３１ｄに対応すること以外は同様である。その比較結果ｈ１〜ｈ３は、ウェイ１〜３でヒットしたかミスヒットしたかを意味する。
【００４５】
オア回路３４は、比較結果ｈ０〜ｈ３の論理和をとる。この論理和をｈｉｔとする。ｈｉｔは、キャッシュメモリ３にヒットしたか否かを示す。
【００４６】
セレクタ３５は、選択されたセットにおけるウェイ０〜３のラインデータのうち、ヒットしたウェイのラインデータを選択する。
【００４７】
デマルチプレクサ３７は、キャッシュエントリーにデータを書き込む際に、ウェイ０〜３の１つに書き込みデータを出力する。
【００４８】
図４は、サブキャッシュメモリ４のハードウェア構成を示すブロック図である。同図のように、サブキャッシュメモリ４は、ダイレクトマッピング方式（１ウェイセットアソシアティブ方式）のキャッシュメモリであり、アドレスレジスタ４４と、デコーダ４０と、１つのウェイ４１と、比較機４２と、アンド回路４３とを備える。
【００４９】
アドレスレジスタ４４は、メインメモリ２へのアクセスアドレスを保持するレジスタである。このアクセスアドレスは３２ビットであるものとする。同図に示すように、アクセスアドレスは、最上位ビットから順に、２１ビットのタグアドレスと、１ビットのセットインデックス（図中のＳＩ）とを含む。ここで、タグアドレスはウェイにマッピングされるメモリ中の領域を指す。ウェイ４１のセット数は、セットインデックス（ＳＩ）が１ビットなので２セットである。タグアドレスおよびセットインデックス（ＳＩ）で特定されるブロックは、リプレース単位であり、キャッシュメモリに格納されている場合はラインデータ又はラインとも呼ばれる。ラインデータのサイズは、１２８バイトである。１ワードを４バイトとすると、１ラインデータは３２ワードである。アドレスレジスタ２０中の最下位から１０ビットは、ウェイのアクセス時には無視される。
【００５０】
デコーダ４０は、セットインデックス（ＳＩ）の１ビットをデコードし、２セット中の１つを選択する。１つのキャッシュエントリーは、図３に示したものと同様である。
【００５１】
比較器４２は、アドレスレジスタ４４中のタグアドレスと、セットインデックス（ＳＩ）により選択されたセットに含まれるタグとが一致するか否かを比較する。
【００５２】
アンド回路４３は、バリッドフラグＶと比較器４２の比較結果とが一致するか否かを比較する。この比較結果をｈｉｔとする。比較結果ｈｉｔが１である場合は、アドレスレジスタ４４中のタグアドレスおよびセットインデックス（ＳＩ）に対応するラインデータが存在すること、すなわちヒットしたことを意味する。比較結果ｈｉｔが０である場合は、ミスヒットしたことを意味する。
【００５３】
図５は、メインメモリ２に含まれる記憶領域の種類を説明するための図である。当該記憶領域は、キャッシャブル空間と、ウィーク空間と、サブキャッシュ空間と、アンキャッシャブル空間との４種類の記憶領域を有する。キャッシャブル空間およびウィーク空間に配置された命令またはデータは、キャッシュメモリ３との間で読み書きされる。特に、ウィーク空間に配置されたデータは、キャッシュメモリ３に配置される際にウィークビットＷに１が設定される。サブキャッシュ空間に配置された命令またはデータはサブキャッシュメモリ４との間で読み書きされる。アンキャッシャブル空間に配置された命令またはデータは、キャッシュメモリ３およびサブキャッシュメモリ４には配置されずプロセッサ１との間で直接やり取りされる。
【００５４】
図６は、コンピュータ１０のプロセッサ１において実行される機械語プログラムを開発するプログラム開発システム５０の構成を示すブロック図である。プログラム開発システム５０は、デバッガ５２と、シミュレータ５４と、プロファイラ５６と、コンパイラ５８とを備えている。
【００５５】
コンパイラ５８は、ソースプログラムおよびプロファイラ５６より出力されるプロファイル情報６４を読み込み、機械語プログラムへ変換するためのプログラムであり、機械語命令を最適化するための最適化部６８をその内部に備えている。コンパイラ５８の詳細については、後に詳述する。
【００５６】
デバッガ５２は、コンパイラ５８におけるソースプログラムのコンパイル時に見つかったバグの位置や原因を特定するためのプログラムである。シミュレータ５４は、機械語プログラムを仮想的に実行するプログラムであり、実行結果は実行ログ情報６２として出力される。なお、シミュレータ５４は、キャッシュメモリ３およびサブキャッシュメモリ４のヒットおよびミスヒット等のシミュレート結果を実行ログ情報６２に含めて出力するキャッシュメモリ用シミュレータ６０を内部に備えている。
【００５７】
プロファイラ５６は、実行ログ情報６２を解析するとともに、コンパイラ５８における最適化等のヒント情報となるプロファイル情報６４を出力するプログラムである。
【００５８】
図７は、コンパイラ５８の構成を示す機能ブロック図である。このコンパイラはＣ言語やＣ＋＋言語等の高級言語で記述されたソースプログラム７２を、上述のプロセッサ１をターゲットプロセッサとする機械語プログラム９２に変換するクロスコンパイラであり、パーソナルコンピュータ等のコンピュータ上で実行されるプログラムによって実現され、大きく分けて、パーサー部７６と、中間コード変換部７８と、最適化部６８と、コード生成部９０とから構成される。
【００５９】
なお、パーサー部７６は、コンパイルの対象となるソースプログラム７２に対して、予約語（キーワード）等を抽出して字句解析する前置処理部である。
【００６０】
中間コード変換部７８は、パーサー部７６から渡されたソースプログラム７２の各ステートメントを一定規則に基づいて中間コードに変換する処理部である。ここで、中間コードは、典型的には、関数呼び出しの形式で表現されるコード（例えば、「+(int a, int b)」を示すコード；「整数ａに整数ｂを加算する」ことを示す。）である。ただし、中間
コードには、このような関数呼び出し形式のコードだけでなく、プロセッサ１の機械語命令も含まれる。中間コード変換部７８は、中間コードを生成する際に、プロファイル情報６４を参照して、最適な中間コードを生成する。
【００６１】
最適化部６８は、中間コード変換部７８より出力された中間コードについて、命令結合、冗長除去、命令並べ替え、レジスタ割り付け等の処理を行なうことにより、実行速度の向上やコードサイズの削減等を行なう処理部であり、通常の最適化処理に加え、本コンパイラ５８特有の最適化を行なう処理部（タイリング部８４、プリフェッチ命令挿入部８６、配置セット情報設定部８７、キャッシュコマンド挿入部８８）を有する。タイリング部８４、プリフェッチ命令挿入部８６、配置セット情報設定部８７、キャッシュコマンド挿入部８８の実行する処理については後に詳述する。なお、最適化部６８は、キャッシュメモリ３のキャッシュミスに関する情報など、ユーザがソースプログラム７２を再作成する際のヒントとなるチューニングヒント情報９４を合わせて出力する。
【００６２】
コード生成部９０は、最適化部６８から出力された中間コードに対して、内部に保持する変換テーブル等を参照することで、全てのコードを機械語命令に置き換えることで、機械語プログラム９２を生成する。
【００６３】
コンパイラ５８では、特に、キャッシュメモリ３におけるキャッシュミスを削減することを狙いとしている。キャッシュミスは、（１）初期ミス、（２）容量性ミスおよび（３）競合性ミスの３つに大きく分けることができる。「初期ミス」とは、プログラム実行時に利用しようとするオブジェクトがキャッシュメモリ３に記憶されていないために起こるヒットミスを指す。「容量性ミス」とは、大量のオブジェクトを一度に処理しようとするために、それらのオブジェクトをキャッシュメモリ３に一度に乗せることができないために起こるヒットミスを指す。「競合性ミス」とは、キャッシュメモリ３中のキャッシュエントリーを異なるオブジェクトが同時に使用しようとして、互いにキャッシュエントリーからの追い出し合いを行なうことにより発生するヒットミスを指す。
【００６４】
次に、以上のように構成されたコンパイラ５８の特徴的な動作について、具体的な例を示しながら説明する。
【００６５】
（１）タイリング処理
タイリング処理とは、ループ処理において、容量性ミスが生じている場合に、１つのループを複数のループに分割することにより、一度に処理されるオブジェクトの容量をキャッシュメモリ３の容量以下に抑える手法である。このタイリング処理は、タイリング部８４において実行される。
【００６６】
図８は、タイリング処理を説明するための図である。
【００６７】
図８（ａ）および図８（ｂ）は、タイリング処理の実行を指定するためのプラグマの一例を示す図である。なお、「プラグマ（又は、プラグマ指令）」とは、ソースプログラム７２中にユーザが任意に指定（配置）することができるコンパイラ５８への指示であり、「#pragma」で始まる文字列である。
【００６８】
図８（ａ）で示されるプラグマ指令は、ループ処理で使用されるオブジェクトの容量が一定（ＮＵＭで指定されたバイト容量）となるようなタイリング処理の実行を指定する。なお、容量ＮＵＭを指定しなかった場合には、予め定められた（デフォルトの）容量となるようなタイリング処理の実行の指定となる。
【００６９】
図８（ｂ）で示されるプラグマ指令は、ループ処理のループ回数が一定（ＮＵＭで指定された回数）となるようなタイリング処理の実行を指定する。なお、回数ＮＵＭを指定しなかった場合には、デフォルトの回数となるようなタイリング処理の実行の指定となる。
【００７０】
なお、上述のプラグマ指令では、プラグマ指令の直後に記載されたループ処理が処理の対象となる。
【００７１】
図８（ｃ）は、プラグマ指令を含まないループ処理の一例を示す図である。図８（ｄ）は、このループ処理におけるループカウンタの値の変化を模式的に示す図である。図８（ｄ）に示すように、このループ処理では、ループカウンタｉが１ずつ増加するたびに、ループカウンタｊが０から９９９まで１ずつ増加する。したがって、オブジェクトｃがメインメモリ２のキャッシャブル空間またはウィーク空間に配置されている場合には、オブジェクトｃ（１０００個の配列要素）を一度にキャッシュメモリ３に配置しようとし、容量性ミスを発生させてしまう。
【００７２】
このため、図８（ｅ）に示すように、ソースプログラム７２の２番目のループ処理の直前に「#pragma _loop_tiling_times=100」というプラグマ指令を挿入することにより、
図８（ｃ）に示すソースプログラム７２が図８（ｆ）に示すようなソースプログラム７２に変換される。すなわち、ループカウンタｊを０から９９９まで１ずつ１０００回増加させる代わりに、ループカウンタｋを１００回増加させる処理を１０回ループさせる処理に変換される。図８（ｇ）は、変換後のループカウンタの値の変化を模式的に示す図である。図８（ｇ）に示すように、ループカウンタｋを１００回ずつ増加させる処理を１０回繰返す。これにより、キャッシュメモリ３に一度に配置されるオブジェクトを配列ｃの１００個の要素に減らすことができ、容量性ミスの発生を防ぐことができる。なお、タイリング処理は、上述のようにタイリング部８４が行なっている。このため、図８（ｅ）に示すソースプログラム７２から図８（ｆ）に示すソースプログラム７２への変換は、実際には中間コード形式において実行される。
【００７３】
なお、プラグマ指令によれば、キャッシュメモリ３の容量等のハードウェア構成が変更になった場合であっても、容量ＮＵＭまたは回数ＮＵＭの値を変えて、再コンパイルするだけでよい。このため、ソースプログラムの資産性を向上させることが可能である。
【００７４】
なお、タイリング部８４に、容量性ミスが発生していないかどうかをチェックさせるようにしてもよい。図９は、容量性ミス発生のチェック処理を説明するための図である。たとえば、容量性ミスが発生しているか否かの情報をチューニングヒント情報９４として出力させるためのプラグマを図９（ａ）のように定義し、このプラグマをソースプログラム７２のチェックしたいループの直前に記載することにより、指定されたループに対して容量性ミスが発生しているか否かの情報がチューニングヒント情報９４として出力される。
【００７５】
図９（ｂ）は、ループ処理を含むソースプログラム７２の一例を示す図であり、図９（ｃ）は、図９（ｂ）に示したソースプログラム７２に含まれる２つのループの直前に図９（ａ）に示したプラグマ指令を挿入したソースプログラム７２の一例である。図９（ｄ）に示すように、図９（ｃ）に示したソースプログラムをコンパイルすることにより、２つのループ処理において、容量性ミスが発生しているか否かの情報がチューニングヒント情報９４に出力される。ユーザは、出力されたチューニングヒント情報９４を参照することにより、容量性ミスが発生しているか否かを知ることができ、図８（ａ）または図８（ｂ）に示したプラグマ指令をソースプログラム７２中に挿入することにより、タイリング処理を実行させ、容量性ミスを防ぐことができる。
【００７６】
なお、図８（ａ）または図８（ｂ）に示したプラグマ指令と図９（ａ）に示したプラグマ指令とを同じループに対して同時に指定することも可能である。
【００７７】
なお、図９（ａ）に示したプラグマ指令をループの直前に挿入することにより、タイリング部８４が、容量性ミスが発生しているか否かを調べるとともに、容量性ミスが発生しないように、自動的にタイリング処理を実行するようにしてもよい。
【００７８】
（２）プリフェッチ命令挿入処理
プリフェッチ命令挿入処理とは、メインメモリ２に記憶された指定された領域のオブジェクトを予めキャッシュメモリ３にプリフェッチするための命令を、中間コードに挿入するための処理である。このプリフェッチ層命令挿入処理は、プリフェッチ命令挿入部８６において実行される。
【００７９】
図１０および図１１は、プリフェッチ命令挿入処理の指定方法を説明するための図である。図１０（ａ）〜図１０（ｄ）は、特定の変数に対するプリフェッチ命令挿入処理の指定の仕方を示している。
【００８０】
図１０（ａ）および図１０（ｂ）は、プラグマ指令によるプリフェッチ命令挿入処理の指定を示しており、指定した変数名の値を予めキャッシュメモリ３にプリフェッチする命令の挿入指示である。なお、図１０（ｂ）に示すようにサイクル数を指定した場合には、指定した変数が参照されるよりも当該サイクル数だけ前にプリフェッチ命令が挿入される。図１０（ａ）に示すようにサイクル数が指定されなかった場合には、指定された変数が参照されるよりも予め定められたサイクル数（デフォルトサイクル数）だけ前にプリフェッチ命令が挿入される。すなわち、図１０（ｅ）に示すように、例えば、実際に変数ａがアクセスされるよりも指定サイクル数またはデフォルトサイクル数だけ前に変数ａをプリフェッチするプリフェッチ命令が挿入される。
【００８１】
図１０（ｃ）および図１０（ｄ）は、組み込み関数によるプリフェッチ命令挿入処理の指定を示しており、アドレスとサイズを引数することにより、当該アドレスをスタートアドレスとするメインメモリ２中の当該サイズで指定される領域の値を予めキャッシュメモリ３にプリフェッチする命令の挿入指示である。なお、図１０（ｄ）に示すようにサイクル数を指定した場合には、図１０（ｂ）のプラグマ指令と同様の処理が行なわれ、図１０（ｃ）に示すようにサイクル数を指定しなかった場合には、図１０（ａ）のプラグマ指令と同様の処理が行なわれる。
【００８２】
図１１（ａ）および図１１（ｂ）は、プラグマ指令によるループ内の配列に対するプリフェッチ命令挿入処理の指定の仕方を示している。プラグマ指令の直後に記載されたループ処理が処理の対象となる。図１１（ｂ）に示すように、サイクル数を指定した場合には、キャッシュメモリ３のレイテンシを考慮して、実際に配列の要素が参照されるよりも、指定されたサイクル数だけ前に当該要素をプリフェッチするような命令が挿入される。図１１（ａ）に示すように、サイクル数が指定されなかった場合には、デフォルトサイクル数だけ前に当該要素をプリフェッチするような命令が挿入される。
【００８３】
図１２は、ループ内の配列に対するプラグマ指令によるプリフェッチ命令挿入処理を説明するための図である。図１２（ａ）に示すようなソースプログラム７２のループ処理において、図１２（ｂ）に示すように配列ａをプリフェッチするプラグマを記載した場合には、図１２（ｃ）に示すようにプリフェッチ命令挿入コマンドｄｐｒｅｆ（）が挿入される。「ｄｐｒｅｆ（＆ａ［０］）」および「ｄｐｒｅｆ（＆ａ［４］）」が実行されることにより、ループカウンタｉがｉ＝０およびｉ＝１のときに参照される配列の値ａ［０］〜ａ［７］がキャッシュメモリ３にプリフェッチされる。その後、ループ処理が開始され、「ｄｐｒｅｆ（＆ａ［ｉ＋１］）」を実行することにより、２回後のループ処理で使用される配列の要素がキャッシュメモリ３にプリフェッチされる。このように、ループ処理の繰り返し（イタレーション）を跨いで要素がプリフェッチされる。すなわち、配列の要素が参照されるイタレーションよりも前のイタレーションにおいて当該要素がプリフェッチされる。なお、実際には、プリフェッチ命令挿入部８６は、中間コードに対してプリフェッチ命令を挿入する。
【００８４】
以上説明したような、プリフェッチ命令挿入処理を実行することにより、初期ミスを防ぐことができる。
【００８５】
なお、プロファイル情報６４を利用してプリフェッチ命令を自動挿入するようにしてもよい。図１３は、プロファイル情報６４を利用したプリフェッチ命令挿入処理の指定方法を説明するための図である。
【００８６】
図１３（ａ）は、コンパイルオプションによる指定方法である。コンパイル時にこのオプションが付いていた場合には、プロファイル情報６４より初期ミスを起こしているオブジェクトが調べられ、当該オブジェクトをプリフェッチする命令が挿入される。なお、このコンパイルオプションでは、上述の指定方法と同様に、プリフェッチ命令を挿入する位置のサイクル数を指定することも可能である。
【００８７】
図１３（ｂ）〜図１３（ｄ）は、プラグマによる指定方法である。図１３（ｅ）に示されるように、図１３（ｂ）に示すプラグマと図１３（ｃ）に示すプラグマとは対となって使用され、「#pragma _prof_insert_dpref on」と「#pragma _prof_insert_dpref off」とで区切られた範囲について、プロファイル情報６４に基づいてプリフェッチ命令が
挿入される。
【００８８】
図１３（ｄ）に示すプラグマがソースプログラム７２中で指定された場合には、それ以降の命令は、コンパイルオプションに従うことを示している。すなわち、図１３（ａ）に示したコンパイルオプションが設定されている場合には、そのオプションに従い、プロファイル情報６４に基づいてプリフェッチ命令が挿入されるが、コンパイルオプションが設定されていない場合には、プリフェッチ命令の挿入は行なわれない。なお、図１３（ｂ）〜（ｄ）に示すプラグマは、組み込み関数として書いてもよい。
【００８９】
図１３（ｆ）および図１３（ｇ）は、組み込み関数による指定方法である。アドレスとサイズを引数することにより、当該アドレスをスタートアドレスとするメインメモリ２中の当該サイズで指定される領域が、初期ミスを起こしている場合には、当該領域の値を予めキャッシュメモリ３にプリフェッチする命令の挿入指示である。なお、図１３（ｇ）に示すように、上述の指定方法と同様に、プリフェッチ命令を挿入する位置のサイクル数を指定することも可能である。これらの指定は、プラグマ指令としてもよい。
【００９０】
以上説明したように、プリフェッチ命令を挿入することにより、キャッシュメモリ３のレイテンシを考慮して、特定のオブジェクトに対する初期ミスを防止することができる。特に、プロファイル情報６４を考慮したプリフェッチ命令の挿入処理においては、例えばプリフェッチされる変数がアクセスされるよりも前に他の命令が無いような場合には、指定されたサイクル数またはデフォルトサイクル数を空けてプリフェッチ命令を挿入することができない。このため、そのような場合には、プリフェッチ命令を挿入しても無駄であるため、当該命令の挿入は行なわれない。また、すでにキャッシュメモリ３に格納されているオブジェクトについては、プリフェッチする必要がないため、その場合にもプリフェッチ命令の挿入は行なわれない。これらの情報は、プロファイル情報６４を見ることにより分かる。
【００９１】
（３）データ配置指定処理
図１４は、データ配置処理の概略を説明するための図である。図１４（ａ）に示すように、ソースプログラムに含まれる変数のうち、時間的に近いタイミングでアクセスされる変数（例えば生存区間が重なり合う変数）のグループが３つあったとする（変数グループＡ〜Ｃ）。ここで、１つの変数グループに含まれるデータサイズは、キャッシュメモリ３のラインデータのサイズ、すなわち１２８バイトであるものとする。コンパイルシステムでは、これら３つの変数グループがキャッシュメモリ３に書込みされる際には、異なるセット番号のブロックに書き込まれるような機械語命令を生成する。例えば、変数グループＡ、ＢおよびＣをキャッシュメモリ３のセット０、１および１５のブロックにそれぞれ配置するものとすると、図１４（ｂ）に示されるように、変数グループＡ、ＢおよびＣは、キャッシュメモリ３に書き込まれた場合にセット０、１および１５のブロックに書き込まれるようなメインメモリ２の記憶領域に記憶される。このため、図１４（ｃ）に示されるように、変数グループＡ、ＢおよびＣは、メインメモリ２からキャッシュメモリ３に書き込まれる際には、セット０、１および１５のブロックにそれぞれ書き込まれることとなる。このようにすることにより、時間的に近いタイミングでアクセスされるオブジェクト同士でキャッシュメモリの同一のセット番号のブロックを奪い合い、互いにオブジェクトを追い出しあう競合状態が生じない。よって、競合性ミスを低減させることができる。
【００９２】
図１５は、データ配置の指定に関する方法を説明するための図である。図１５（ａ）に示すプラグマによりオブジェクト名を並べて指定した場合には、これらのオブジェクトサイズの総和がラインデータのサイズ（１２８バイト）以下の場合には、キャッシュメモリ３の同一のセットにそれらのオブジェクトを配置するような最適化が行なわれる。１２８以上の場合には、１２８バイトごとにオブジェクトをグループ分けし、異なるグループのオブジェクトはキャッシュメモリ３の異なるセットに配置されるような最適化が行なわれる。
【００９３】
例えば、図１６に示されるように、「#pragma _overlap_access_object a,b,c」というプラグマ指定により、整数型配列ａ［３２］、ｂ［３２］およびｃ［３２］が時間的に近いタイミングでアクセスされることがユーザにより明示的に示されている。配置セット情報設定部８７は、このプラグマの指示により、配列ａ［３２］、ｂ［３２］およびｃ［３２］を１つのオブジェクト群とした場合に、これらを１２８バイトごとにグループ分けする。整数型変数は４バイトであるものとすると、配列ａ［３２］、ｂ［３２］およびｃ［３２］はそれぞれ１２８バイトである。このため、このオブジェクト群は、図１７に示されるような３つのグループ（グループｄａｔａ＿ａ、ｄａｔａ＿ｂおよびｄａｔａ＿ｃ）に分割され、グループｄａｔａ＿ａには配列ａ［３２］が含まれ、グループｄａｔａ＿ｂには配列ｂ［３２］が含まれ、グループｄａｔａ＿ｃには配列ｃ［３２］が含まれることとなる。
【００９４】
グループ分け処理の後、配置セット情報設定部８７は、それぞれのグループに異なるセット番号が付す。例えば、グループｄａｔａ＿ａ、ｄａｔａ＿ｂおよびｄａｔａ＿ｃにはセット番号０、１および２がそれぞれ付されるものとする。
【００９５】
その後、配置セット情報設定部８７は、設定されたセット番号のキャッシュメモリ３のブロックにそのグループのオブジェクトが配置されるよう中間コードを生成する。
【００９６】
図１５（ｂ）に示すプラグマによりオブジェクトが配置されるキャッシュメモリ３のセット番号を指定することも可能である。例えば、図１８に示すように、ソースプログラム７２中にプラグマ「#pragma _cache_set_number=0  i」、「#pragma _cache_set_number=1  j」および「#pragma _cache_set_number=2  k」が指定されている場合には、配列ｉ、ｊおよびｋはそれぞれキャッシュメモリ３のセット番号０、１および２のセットに配置されるような中間コードが生成される。
【００９７】
図１５（ｃ）に示すプラグマによると、オブジェクト名と番地とを指定することにより、配置セット情報設定部８７は、当該オブジェクトをメインメモリ２の指定された番地に格納する中間コードを生成する。例えば、プロファイル情報６４やチューニングヒント情報９４によりオブジェクトを格納するとよい番地が予め分かっているような場合には、この指定方法を利用する。
【００９８】
図１５（ｄ）に示すコンパイルオプションによる指定を行なった場合には、配置セット情報設定部８７は、プロファイル情報６４に基づいて、生存区間の重なり合うオブジェクトが異なるキャッシュメモリ３のセットに配置されるように、オブジェクトのキャッシュメモリ３上のアドレスを決定し、当該アドレスにオブジェクトを配置するような中間コードを生成する。
【００９９】
以上のようなデータ配置指定処理により、オブジェクト同士でキャッシュメモリの同一のセット番号のブロックを奪い合い、互いにオブジェクトを追い出しあう競合状態を生じさせないようにすることができる。よって、競合性ミスを低減させることができる。
【０１００】
（４）メモリ空間指定処理
上述したようにメインメモリ２には４種類のメモリ空間（キャッシャブル空間、ウィーク空間、サブキャッシュ空間およびアンキャッシャブル空間）を有している。図１９は、オブジェクトを特定の空間に配置するための指定方法を示す図である。上述のようにプロセッサ１は、専用レジスタ６（専用レジスタＤＰＴＥＬ）を有している。図２０は、専用レジスタＤＰＴＥＬに格納される情報を示す図である。専用レジスタＤＰＴＥＬには、メインメモリ２のページアドレスと、サブキャッシュ空間であるかウィーク空間であるかを示すＳ／Ｗフラグとが記憶されている。なお、専用レジスタＤＰＴＥＬは４つ存在し、０番から３番まで番号が付けられているものとする。
【０１０１】
図１９（ａ）に示すプラグマがソースプログラム７２中で指定されている場合には、配置セット情報設定部８７は、指定された変数を、指定された番号の専用レジスタＤＰＴＥＬに含まれるページアドレスに配置する中間コードを生成する。なお、当該ページアドレスの種類は専用レジスタＤＰＴＥＬに含まれるＳ／Ｗフラグにより、サブキャッシュ空間であるかウィーク空間であるかが指定されている。例えば、Ｓ／Ｗフラグの値が１であればサブキャッシュ空間を指定し、０であればウィーク空間を指定するようにしてもよい。
【０１０２】
図１９（ｂ）に示すコンパイルオプションがコンパイル時に指定されている場合には、配置セット情報設定部８７は、プロファイル情報６４に基づいて、メインメモリ２のサブキャッシュ空間、ウィーク空間またはアンキャッシャブル空間に配置すると有効な変数を当該空間に配置する中間コードを生成する。例えば、大きな配列を１回だけ参照するような場合には、当該配列はアクセス頻度が少ないため、サブキャッシュ空間に配置する中間コードを生成する。
【０１０３】
図１９（ｃ）に示すプラグマがソースプログラム７２中で指定されている場合には、配置セット情報設定部８７は、プロファイル情報６４に基づいて、プラグマで指定された変数を特定の空間に配置すると有効か否かを調べ、有効な場合には、当該空間に指定された変数を配置する中間コードを生成する。
【０１０４】
このように、オブジェクトを適切な空間に配置することにより、競合性ミスを防ぐことができる。例えば、サブキャッシュ空間を利用することにより、キャッシュメモリ３で頻繁に使用されるオブジェクトを追い出したりすることがなくなる。また、ウィーク空間を利用することにより、あまり利用されないオブジェクトにウィークビットＷを立て、優先的に追い出すようにすることもできる。
【０１０５】
（５）キャッシュコマンド挿入処理
以下では、キャッシュ制御部５が実行する専用コマンドをソースプログラム７２において指定するようにする組み込み関数について説明する。
【０１０６】
図２１は、組み込み関数の一覧を示す図である。
【０１０７】
図２１（ａ）に示される関数は、引数で指定されるメインメモリ２の領域を事前にキャッシュメモリ３に先読みする処理（以下、「ｆｉｌｌ処理」ともいう。）と、ライトバックが必要なラインデータをライトバックする処理（以下、「ｗｒｉｔｅｂａｃｋ処理」ともいう。）とをキャッシュ制御部５に実行させる関数である。なお、引数では、変数名（変数の先頭アドレス）またはアドレスと、当該アドレスからのサイズとによりメインメモリ２の領域が指定される。
【０１０８】
図２１（ｂ）に示される関数は、ｆｉｌｌ処理と、ウィークフラグＷに１を設定する処理（以下、「ｗｅａｋｅｎ処理」ともいう。）とをキャッシュ制御部５に実行させる関数である。
【０１０９】
図２１（ｃ）に示される関数は、引数で指定されるメインメモリ２に対応するキャッシュエントリーを事前に確保するのみの処理（以下、「ｔｏｕｃｈ処理」ともいう。）と、ｗｒｉｔｅｂａｃｋ処理とをキャッシュ制御部５に実行させる関数である。
【０１１０】
図２１（ｄ）に示される関数は、ｔｏｕｃｈ処理と、ｗｅａｋｅｎ処理とをキャッシュ制御部５に実行させる関数である。
【０１１１】
図２１（ｅ）に示される関数は、ｗｒｉｔｅｂａｃｋ処理と、引数で指定されたメインメモリ２の領域に対応するキャッシュメモリ３のキャッシュエントリーを無効にする処理（以下、「ｉｎｖａｌｉｄａｔｅ処理」ともいう。）とをキャッシュ制御部５に実行させる関数である。
【０１１２】
図２１（ｆ）に示される関数は、ｉｎｖａｌｉｄａｔｅ処理をキャッシュ制御部５に実行させる関数である。
【０１１３】
図２１（ｇ）に示される関数は、ｔｏｕｃｈ処理をキャッシュ制御部５に実行させる関数である。
【０１１４】
図２１（ｈ）に示される関数は、ｆｉｌｌ処理をキャッシュ制御部５に実行させる関数である。
【０１１５】
図２１（ａ）〜図２１（ｈ）に示される関数がソースプログラム７２中に含まれる場合には、キャッシュコマンド挿入部８８は、上述した処理をキャッシュ制御部５に実行させるための中間コードを生成する。
【０１１６】
キャッシュ制御部５に専用コマンドを実行させるためには、キャッシュ制御部５の専用レジスタＴＡＣＳＴＡＤに対象となるメインメモリ２の領域の開始アドレスを登録し、専用レジスタＴＡＣＴＳＺに開始アドレスからのサイズを登録し、専用レジスタＴＡＣＭにコマンドを登録すればよい。
【０１１７】
したがって、キャッシュコマンド挿入部８８は、例えば、図２２に示すような中間コードを生成する。なお、この中間コードは、ＶＬＩＷ（Very Long Instruction Word）アーキテクチャを持つプロセッサ１を想定して記述されたものである。まず、コマンドが一旦汎用レジスタｒ０に書き込まれた後、専用レジスタＴＡＣＭに書き込まれる。それと同時にサイズが汎用レジスタｒ１に書き込まれる。専用レジスタＴＡＣＭへの書込みが成功した場合には、フラグＣ０に１が設定され、フラグＣ１に０が設定される。書込みが失敗した場合には、フラグＣ０に０が設定され、フラグＣ１に１が設定される。したがって、専用レジスタＴＡＣＭへの書込みが成功した場合には、３行目および４行目のコマンドが実行され、専用レジスタＴＡＣＳＺおよび専用レジスタＴＡＣＳＴＡＤにそれぞれサイズおよびスタートアドレスが設定される。専用レジスタＴＡＣＭへの書込みが失敗した場合には５行目の処理が実行され、再度１行目から処理が実行される。
【０１１８】
以上説明したように、キャッシュ制御部５が実行するコマンドをユーザが指定できるようにすることにより、キャッシュメモリ３の細かな制御をユーザが指定をすることができ、初期ミス、容量性ミスおよび競合性ミスを防止することができる。
【０１１９】
なお、ｆｉｌｌ処理を実行する組み込み関数の場合には、プリフェッチ命令挿入処理の場合と同様に、指定サイクル数またはデフォルトサイクル数前にｆｉｌｌ処理を実行するような枠組みを設けてもよい。
【０１２０】
また、プロファイル情報６４を確認することにより、キャッシュ制御部５が実行するコマンドが有効に機能しているか否かを調べるような組み込み関数を設けてもよい。図２３は、図２１に示した組み込み関数が有効に機能しているか否かを調べるための組み込み関数の一覧を示す図である。すなわち、図２３（ａ）〜図２３（ｈ）に示した組み込み関数は、図２１（ａ）〜図２１（ｈ）に示した組み込み関数と同じ処理をそれぞれ実行するとともに、各組み込み関数が有効に機能しているか否かをチューニングヒント情報９４として、出力する。また、図２３（ａ）〜図２３（ｈ）に示した組み込み関数は、自動的に無効なキャッシュコマンド（キャッシュ制御部５に実行させるための中間コード）を削除したり、当該中間コード配置位置を調整したりするようにしてもよい。ユーザは、出力されたチューニングヒント情報９４を参照することにより、最適な組み込み関数をソースプログラム中に挿入することができ、キャッシュメモリ３を効率的に利用することができるようになる。
【０１２１】
図２４は、以上説明した（１）〜（５）の処理を実行する際に、コンパイラ５８に対して各種情報の入出力を行なうための指定方法を説明するための図である。図２４（ａ）は、コンパイラ５８へキャッシュメモリ３に関する情報を入力させるためのコンパイルオプションであり、図２４（ｂ）に示すように記述することにより、使用される。なお、図２４（ｃ）は、キャッシュメモリ３に関する情報の一例を示しており、キャッシュメモリ３のサイズや、ラインデータのサイズ、キャッシュメモリ３のレイテンシのサイクル数などが示されている。
【０１２２】
図２４（ｄ）は、コンパイラ５８に入力されるプロファイル情報６４のファイル名を指定するためのコンパイルオプションである。図２４（ｅ）は、コンパイラ５８より出力されるチューニングヒント情報９４の出力ファイル名を指定するためのコンパイルオプションである。
【０１２３】
以上説明したように本実施の形態に係るコンパイルシステムによると、キャッシュメモリ３における初期ミス、容量性ミスおよび競合性ミスを防止することが各種指定方法により可能となる。
【０１２４】
なお、本発明は上述の実施の形態には限定されない。例えば、上述したプラグマ指令によるコンパイラに対する指示を、組み込み関数またはコンパイルオプションを用いてすることができる場合には、そのような指示を行なってもよい。組み込み関数またはコンパイルオプションによるコンパイラに対する指示の場合も同様である。
【産業上の利用可能性】
【０１２５】
本発明は、コンパイラに適用でき、特に、キャッシュメモリを利用するプロセッサをターゲットとするコンパイラ等に適用できる。
【符号の説明】
【０１２６】
１  プロセッサ
２  メインメモリ
３  キャッシュメモリ
４  サブキャッシュメモリ
５  キャッシュ制御部
１０  コンピュータ
５０  プログラム開発システム
５２  デバッガ
５４  シミュレータ
５６  プロファイラ
５８  コンパイラ
６０  キャッシュメモリ用シミュレータ
６２  実行ログ情報
６４  プロファイル情報
６８  最適化部
７２  ソースプログラム
７６  パーサー部
７８  中間コード変換部
８４  タイリング部
８６  プリフェッチ命令挿入部
８７  配置セット情報設定部
８８  キャッシュコマンド挿入部
９０  コード生成部
９２  機械語プログラム
９４  チューニングヒント情報
【図１】
2011081836.tif 000003
【図２】
2011081836.tif 000004
【図３】
2011081836.tif 000005
【図４】
2011081836.tif 000006
【図５】
2011081836.tif 000007
【図６】
2011081836.tif 000008
【図７】
2011081836.tif 000009
【図８】
2011081836.tif 000010
【図９】
2011081836.tif 000011
【図１０】
2011081836.tif 000012
【図１１】
2011081836.tif 000013
【図１２】
2011081836.tif 000014
【図１３】
2011081836.tif 000015
【図１４】
2011081836.tif 000016
【図１５】
2011081836.tif 000017
【図１６】
2011081836.tif 000018
【図１７】
2011081836.tif 000019
【図１８】
2011081836.tif 000020
【図１９】
2011081836.tif 000021
【図２０】
2011081836.tif 000022
【図２１】
2011081836.tif 000023
【図２２】
2011081836.tif 000024
【図２３】
2011081836.tif 000025
【図２４】
2011081836.tif 000026