(57)【要約】【課題】条件分岐命令の条件判定処理と、分岐後の各命令がグローバル変数に依存している場合に、条件分岐命令の条件判定処理と、分岐後の各命令が並列処理されても誤動作しないオブジェクトプログラムを生成するコンパイラ装置を提供する。【解決手段】本発明のコンパイラ装置は、グローバル変数の値に基づいてグローバル変数の値を変更する処理を含む関数を、コア割り当て対象関数として抽出するコア割り当て対象関数抽出部と、コア割り当て対象関数が、条件分岐命令の条件判定処理による分岐後の呼出し関数となる場合には、マルチコアプロセッサの各ＣＰＵコアにコア割り当て対象関数を割り当て、条件分岐命令の条件判定処理によって、グローバル変数が変更された場合には、グローバル変数の値に基づいてグローバル変数の値を変更する処理を、コア割り当て対象関数にリトライさせるようにソースプログラムを修正するソース修正部とを備える。【選択図】図１
2012103923.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムを読み込む読み込み部と、
前記ソースプログラムの字句解析を行う字句解析部と、
前記ソースプログラムの構文解析を行う構文解析部と、
前記ソースプログラムに含まれる関数から、グローバル変数の値に基づいて前記グローバル変数の値を変更する処理を含む関数を、コア割り当て対象関数として抽出するコア割り当て対象関数抽出部と、
前記コア割り当て対象関数が、条件分岐命令の条件判定処理による分岐後の呼出し関数となる場合には、前記コア割り当て対象関数を呼び出す関数が実行されるマルチコアプロセッサのコアとは、別のＣＰＵコアに対して前記コア割り当て対象関数を１：１に割り当て、前記条件分岐命令の前記条件判定処理と、前記コア割り当て対象関数の処理を各前記ＣＰＵコアで並列処理させ、前記条件分岐命令の前記条件判定処理によって、前記グローバル変数が変更された場合には、前記グローバル変数の値に基づいて前記グローバル変数の値を変更する処理を、前記コア割り当て対象関数にリトライさせるように前記ソースプログラムを修正するソース修正部と、
前記ソースプログラムを前記ソース修正部により修正したソースプログラムから中間言語による中間語を作成する中間語作成部と、
前記中間語を最適化する最適化部と、
最適化された前記中間語からオブジェクトプログラムを生成するオブジェクト生成部と
を備えるコンパイラ装置。
【請求項２】
前記コア割り当て対象関数抽出部は、前記ソースプログラムに含まれる関数が、ｍａｉｎ関数ではなく、かつ、前記関数の戻り値が前記条件分岐命令の前記条件判定処理に利用されておらず、かつ、前記関数からグローバル変数へのアクセスがあり、かつ、前記関数から前記グローバル変数へのアクセスが前記関数内の繰り返し処理の中からアクセスされておらず、又は、前記関数からグローバル変数へのアクセスがない場合に、マルチコアプロセッサの前記コア割り当て対象関数とする
請求項１に記載のコンパイラ装置。
【請求項３】
前記ソース修正部は、前記コア割り当て対象関数を呼び出す関数に対しては、前記コア割り当て対象関数を前記マルチコアプロセッサに割り当てる処理と、前記コア割り当て対象関数の処理の終了を待ち合わせる処理と、前記コア割り当て対象関数の処理結果を有効化する処理を追加する修正を行い、
前記条件分岐命令の前記条件判定処理に使用されている関数に対しては、前記コア割り当て対象関数に、変更後の前記グローバル変数の値を通知する処理を追加する修正を行い、
前記コア割り当て対象関数に対しては、前記グローバル変数を変更する前の値を保持する処理と、前記通知する処理による通知を受信するまで待ち合わせる処理と、前記通知する処理による前記通知を受信するまで待ち合わせる処理の後に、前記保持する処理で保持したグローバル変数の値と、前記グローバル変数の値を比較し、前記グローバル変数の値が同一でない場合には、前記コア割り当て対象関数による前記グローバル変数の値を変更する処理をリトライする処理を追加する修正を行う
請求項１又は２に記載のコンパイラ装置。
【請求項４】
前記構文解析部は、前記ソースプログラムに含まれるグローバル変数のｒｅａｄ箇所及びｗｒｉｔｅ箇所の情報を、前記ソースプログラムに含まれる関数ごとに所持するグローバル変数テーブルを作成し、
前記コア割り当て対象関数抽出部は、前記ソースプログラムに含まれる関数に対して、前記マルチコアプロセッサの各ＣＰＵコアに割り当てる対象となる関数であるかどうかの情報を記憶するコア割り当て対象関数テーブルを作成し、
前記ソース修正部は、前記グローバル変数テーブル及び前記コア割り当て対象関数テーブルに基づいて前記ソースプログラムを修正する
請求項１乃至３いずれか１項に記載のコンパイラ装置。
【請求項５】
読み込み部が、ソースプログラムを読み込むステップと、
字句解析部が、前記ソースプログラムの字句解析を行うステップと、
構文解析部が、前記ソースプログラムの構文解析を行うステップと、
コア割り当て対象関数抽出部が、前記ソースプログラムに含まれる関数から、グローバル変数の値に基づいて前記グローバル変数の値を変更する処理を含む関数を、コア割り当て対象関数として抽出するステップと、
ソース修正部が、前記コア割り当て対象関数が、条件分岐命令の条件判定処理による分岐後の呼出し関数となる場合には、前記コア割り当て対象関数を呼び出す関数が実行されるマルチコアプロセッサのコアとは、別のＣＰＵコアに対して前記コア割り当て対象関数を１：１に割り当て、前記条件分岐命令の前記条件判定処理と、前記コア割り当て対象関数の処理を各前記ＣＰＵコアで並列処理させ、前記条件分岐命令の前記条件判定処理によって、前記グローバル変数が変更された場合には、前記グローバル変数の値に基づいて前記グローバル変数の値を変更する処理を、前記コア割り当て対象関数にリトライさせるように前記ソースプログラムを修正するステップと、
中間語作成部が、前記ソースプログラムを前記ソース修正部により修正したソースプログラムから中間言語による中間語を作成するステップと、
最適化部が、前記中間語を最適化するステップと、
オブジェクト生成部が、最適化された前記中間語からオブジェクトプログラムを生成するステップと
を含むコンパイル方法。
【請求項６】
前記コア割り当て対象関数として抽出するステップは、
前記コア割り当て対象関数抽出部が、前記ソースプログラムに含まれる関数が、ｍａｉｎ関数ではなく、かつ、前記関数の戻り値が前記条件分岐命令の前記条件判定処理に利用されておらず、かつ、前記関数からグローバル変数へのアクセスがあり、かつ、前記関数から前記グローバル変数へのアクセスが前記関数内の繰り返し処理の中からアクセスされておらず、又は、前記関数からグローバル変数へのアクセスがない場合に、マルチコアプロセッサの前記コア割り当て対象関数とするステップ
を含む請求項５に記載のコンパイル方法。
【請求項７】
前記ソースプログラムを修正するステップは、前記ソース修正部が、前記コア割り当て対象関数を呼び出す関数に対しては、前記コア割り当て対象関数を前記マルチコアプロセッサに割り当てる処理と、前記コア割り当て対象関数の処理の終了を待ち合わせる処理と、前記コア割り当て対象関数の処理結果を有効化する処理を追加する修正を行うステップと、
前記ソース修正部が、前記条件分岐命令の前記条件判定処理に使用されている関数に対しては、前記コア割り当て対象関数に、変更後の前記グローバル変数の値を通知する処理を追加する修正を行うステップと、
前記ソース修正部が、前記コア割り当て対象関数に対しては、前記グローバル変数を変更する前の値を保持する処理と、前記通知する処理による通知を受信するまで待ち合わせる処理と、前記通知する処理による前記通知を受信するまで待ち合わせる処理の後に、前記保持する処理で保持したグローバル変数の値と、前記グローバル変数の値を比較し、前記グローバル変数の値が同一でない場合には、前記コア割り当て対象関数による前記グローバル変数の値を変更する処理をリトライする処理を追加する修正を行うステップと
を含む請求項５又は６に記載のコンパイル方法。
【請求項８】
前記構文解析を行うステップは、前記構文解析部が、前記ソースプログラムに含まれるグローバル変数のｒｅａｄ箇所及びｗｒｉｔｅ箇所の情報を、前記ソースプログラムに含まれる関数ごとに所持するグローバル変数テーブルを作成するステップと、
前記コア割り当て対象関数として抽出するステップは、前記コア割り当て対象関数抽出部が、前記ソースプログラムに含まれる関数に対して、前記マルチコアプロセッサの各ＣＰＵコアに割り当てる対象となる関数であるかどうかの情報を記憶するコア割り当て対象関数テーブルを作成するステップと、
前記ソース修正部が、前記グローバル変数テーブル及び前記コア割り当て対象関数テーブルに基づいて前記ソースプログラムを修正するステップと
を含む請求項１乃至３いずれか１項に記載のコンパイル方法。
【請求項９】
請求項５乃至８のいずれか１項に記載のコンパイル方法をコンピュータに実行させるためのコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ装置に関し、特にマルチコアプロセッサに対するオブジェクトプログラムを生成するコンパイラ装置に関する。
【背景技術】
【０００２】
近年、半導体集積回路が多くの製品に搭載され、様々な製品において、複雑な制御が行われており、製品の処理能力を向上させるために、複数のコアをプロセッサに搭載したマルチコアプロセッサが利用されることが多くなってきた。そのため、複数のコアを搭載したプロセッサの特性を利用したオブジェクトプログラムを生成することができるコンパイラ装置の必要性が高まってきている。
【０００３】
特開２００８−２１００２７号公報（特許文献１）には、複数のＣＰＵコアを有するマルチコアプロセッサにおいて、分岐命令を各ＣＰＵコアに割り当てることによって、分岐命令を並列処理させるオブジェクトプログラムを生成するコンパイラ装置が記載されている。このコンパイラ装置では、各ＣＰＵコアで所持している分岐命令の処理結果を、共有メモリに書き込む際に、分岐命令の条件判定を行っているメインスレッドの条件判定結果に基づいて、各ＣＰＵコアのストア制御機構の共有メモリ更新禁止フラグを利用して、共有メモリへの処理結果の反映を制御するオブジェクトプログラムを生成している。
【０００４】
従来技術では、各ＣＰＵコアにおいて、共有メモリ内の同一のグローバル変数を更新して、分岐命令の条件判定処理と、分岐命令の条件判定結果に基づいて実行する各命令を並列処理すると、共有メモリのグローバル変数の値の整合性がとれないという課題がある。例えば、メインスレッドの分岐命令の条件判定処理において、グローバル変数の更新処理を含み、その結果を分岐先の命令で参照・更新する場合である。
【０００５】
図９は、コンパイルすると分岐命令を含むオブジェクトプログラムを生成するソースプログラムの例である。問題となるのは、図９において、条件判定処理に使用される変数Ｘが、グローバル変数の更新を含むｆ（ａ，ｂ，ｃ，ｄ）の演算結果によって決定され、各ＣＰＵコアへの割り当てる対象となるｇ０（ｘ０）、ｇ１（ｘ１）及びｇ２（ｘ２）が、同一のグローバル変数の更新処理を含む場合である。各ＣＰＵコアによって並列処理が行われるため、各ＣＰＵコアに割り当てた分岐命令が参照するグローバル変数は、メインスレッドの分岐命令の条件判定処理後のグローバル変数を参照するという保障がない。そのため、分岐命令を投機的に並列処理させるＣＰＵコアが、メインスレッドによる更新前のグローバル変数に基づいて、演算を行った場合は、共有メモリのグローバル変数の値の整合性がとれなくなる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００８−２１００２７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明の目的は、条件分岐命令の条件判定処理と、分岐後の各命令がグローバル変数に依存している場合に、マルチコアプロセッサによって、投機的に条件分岐命令の条件判定処理と、分岐後の各命令が並列処理されても誤動作しないオブジェクトプログラムを生成するコンパイラ装置を提供することにある。
【課題を解決するための手段】
【０００８】
本発明のコンパイラ装置は、ソースプログラムを読み込む読み込み部と、ソースプログラムの字句解析を行う字句解析部と、ソースプログラムの構文解析を行う構文解析部と、ソースプログラムに含まれる関数から、グローバル変数の値に基づいてグローバル変数の値を変更する処理を含む関数を、コア割り当て対象関数として抽出するコア割り当て対象関数抽出部と、コア割り当て対象関数が、条件分岐命令の条件判定処理による分岐後の呼出し関数となる場合には、マルチコアプロセッサの各ＣＰＵコアにコア割り当て対象関数を割り当て、条件分岐命令の条件判定処理と、コア割り当て対象関数の処理を並列処理させ、条件分岐命令の条件判定処理によって、グローバル変数が変更された場合には、グローバル変数の値に基づいてグローバル変数の値を変更する処理を、コア割り当て対象関数にリトライさせるようにソースプログラムを修正するソース修正部と、ソースプログラムをソース修正部により修正したソースプログラムから中間言語による中間語を作成する中間語作成部と、中間語を最適化する最適化部と、最適化された中間語からオブジェクトプログラムを生成するオブジェクト生成部とを備える。
【０００９】
本発明のコンパイル方法は、読み込み部が、ソースプログラムを読み込むステップと、字句解析部が、ソースプログラムの字句解析を行うステップと、構文解析部が、ソースプログラムの構文解析を行うステップと、コア割り当て対象関数抽出部が、ソースプログラムに含まれる関数から、グローバル変数の値に基づいてグローバル変数の値を変更する処理を含む関数を、コア割り当て対象関数として抽出するステップと、ソース修正部が、コア割り当て対象関数が、条件分岐命令の条件判定処理による分岐後の呼出し関数となる場合には、マルチコアプロセッサの各ＣＰＵコアにコア割り当て対象関数を割り当て、条件分岐命令の条件判定処理と、コア割り当て対象関数の処理を並列処理させ、条件分岐命令の条件判定処理によって、グローバル変数が変更された場合には、グローバル変数の値に基づいてグローバル変数の値を変更する処理を、コア割り当て対象関数にリトライさせるようにソースプログラムを修正するステップと、中間語作成部が、ソースプログラムをソース修正部により修正したソースプログラムから中間言語による中間語を作成するステップと、最適化部が、中間語を最適化するステップと、オブジェクト生成部が、最適化された中間語からオブジェクトプログラムを生成するステップとを含む。
【発明の効果】
【００１０】
本発明によれば、条件分岐命令の条件判定処理と、分岐後の各命令がグローバル変数に依存している場合に、マルチコアプロセッサによって、投機的に条件分岐命令の条件判定処理と、分岐後の各命令が並列処理されても誤動作しないオブジェクトプログラムを生成するコンパイラ装置を提供することができる。
【図面の簡単な説明】
【００１１】
【図１】図１は、本発明の実施形態におけるコンパイラ装置のブロック図である。
【図２】図２は、本発明の実施形態におけるコンパイラ装置のコア割り当て対象関数抽出部４４において、コア割り当て対象関数の抽出方法のフローチャートである。
【図３Ａ】図３Ａは、本発明の実施形態におけるコンパイラ装置のソース修正部４５において、コア割り当て対象関数に対するソースコード修正方法のフローチャートである。
【図３Ｂ】図３Ｂは、本発明の実施形態におけるコンパイラ装置のソース修正部４５において、コア割り当て対象関数に対するソースコード修正方法のフローチャートである。
【図４】図４は、本発明の実施例１におけるコンパイラ装置を説明するためのコンパイル対象のＣ言語のソースプログラム３０である。
【図５】図５は、本発明の実施例１におけるコンパイラ装置において、図４のソースプログラム３０に対応するグローバル変数テーブル３３の例である。
【図６】図６は、本発明の実施例１におけるコンパイラ装置において、図４のソースプログラム３０に対応するコア割り当て対象関数テーブル３４の例である。
【図７】図７は、本発明の実施例１におけるコンパイラ装置において、図４のソースプログラム３０が、ソース修正部４５によって修正された後のソースプログラムの例である。
【図８】図８は、本発明の実施例１におけるコンパイラ装置によって生成された、図７のソースプログラムに対応するオブジェクトプログラムを実行した場合の動作説明図である。
【図９】図９は、コンパイルすると分岐命令を含むオブジェクトプログラムを生成するソースプログラムの例である。
【図１０】図１０は、本発明の実施形態におけるコンパイラ装置４０のハードウェア構成図である。
【図１１】図１１は、本発明の実施形態におけるコンパイラ装置４０によって生成されたオブジェクトプログラムが実行されるマルチコアプロセッサの例である。
【発明を実施するための形態】
【００１２】
添付図面を参照して、本発明の実施形態によるコンパイラ装置４０を以下に説明する。
【００１３】
［構成の説明］
はじめに、本実施形態におけるコンパイラ装置４０の構成の説明を行う。図１は、本発明の実施形態におけるコンパイラ装置４０のブロック図である。本発明の実施形態におけるコンパイラ装置４０は、読み込み部４１、字句解析部４２、構文解析部４３、割り当て対象関数抽出部４４、ソース修正部４５、中間語作成部４６、最適化部４７、オブジェクト生成部４８、変数名、定数等の各種情報のテーブル３２、グローバル変数テーブル３３及びコア割り当て対象関数テーブル３４を備える。
【００１４】
読み込み部４１は、コンパイルの対象となるソースプログラム３０をコンパイラ装置４０に読み込む。
【００１５】
字句解析部４２は、従来技術の一般のコンパイラ装置と同様の方法で、ソースプログラム３０の字句解析を行う。
【００１６】
構文解析部４３は、従来技術の一般のコンパイラ装置と同様の方法で、ソースプログラム３０の構文解析を行う。ただし、グローバル変数の管理について、ソースプログラム３０に含まれるグローバル変数のｒｅａｄ箇所及びｗｒｉｔｅ箇所の情報を、ソースプログラム３０に含まれる関数ごとに所持するグローバル変数テーブル３３を作成する。
【００１７】
コア割り当て対象関数抽出部４４は、ソースプログラム３０に含まれる関数の中から、マルチコアプロセッサにおける各ＣＰＵコアに対して、割り当てる対象となる関数を抽出する。
【００１８】
ソース修正部４５は、条件分岐命令の条件判定処理と、分岐後の各命令がグローバル変数に依存している場合に、マルチコアプロセッサによって、投機的に条件分岐命令の条件判定処理と、分岐後の各命令が並列処理されても誤動作しないオブジェクトプログラムを生成できるように、ソースプログラム３０を修正する。
【００１９】
中間語作成部４６は、従来技術の一般のコンパイラ装置と同様の方法で、ソースプログラム３０から中間言語による中間語を作成する。
【００２０】
最適化部４７は、従来技術の一般のコンパイラ装置と同様の方法で、中間語作成部４６により作成された中間語を最適化する。
【００２１】
オブジェクト生成部４８は、従来技術の一般のコンパイラ装置と同様の方法で、最適化部４７により最適化された中間語からオブジェクトプログラムを生成する。
【００２２】
変数名、定数等の各種情報のテーブル３２は、コンパイラ装置が、ソースプログラム３０からオブジェクトプログラムを生成するために必要となる情報を保持するためのテーブルである。従来技術の一般のコンパイラ装置と同様の情報を、変数名、定数等の各種情報のテーブル３２で保持している。
【００２３】
グローバル変数テーブル３３は、ソースプログラム３０に含まれるグローバル変数のｒｅａｄ箇所及びｗｒｉｔｅ箇所の情報を、ソースプログラム３０に含まれる関数ごとに所持するテーブルである。
【００２４】
コア割り当て対象関数テーブル３４は、ソースプログラム３０に含まれる関数に対して、マルチコアプロセッサの各ＣＰＵコアに割り当てる対象となる関数であるかどうかを管理しているテーブルである。
【００２５】
次に、本実施形態におけるコンパイラ装置４０のハードウェア構成についての説明を行う。図１０は、本発明の実施形態におけるコンパイラ装置４０のハードウェア構成図である。
【００２６】
コンパイラ装置４０は、表示部２０、入力部２１、ＣＰＵ２２、補助記憶装置２３、メモリ２４及びシステムバス２５を備える。
【００２７】
メモリ２４は、コンパイラ装置４０の主記憶装置である。コンパイラ装置４０を利用する際には、本実施形態におけるコンパイラ装置４０を実現するためのコンパイラプログラム１０が、メモリ２４上に展開される。表示部２０は、コンパイラ装置４０の実行結果が表示される。入力部２１は、利用者がコンパイラ装置４０を操作するためのインタフェースである。ＣＰＵ２２は、メモリ２４上に展開されたコンピュータプログラムを実行する制御装置である。補助記憶装置２３は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）及びアプリケーションプログラムが記憶されている装置である。補助記憶装置２３には、本実施形態におけるコンパイラ装置４０を実現するためのコンパイラプログラム１０が記憶されている。システムバス２５は、表示部２０、入力部２１、ＣＰＵ２２、補助記憶装置２３及びメモリ２４とデータの送受信を行う通信路である。
【００２８】
次に、本発明の実施形態におけるコンパイラ装置４０によって生成されたオブジェクトプログラムが実行されるマルチコアプロセッサについて説明する。図１１は、本発明の実施形態におけるコンパイラ装置４０によって生成されたオブジェクトプログラムが実行されるマルチコアプロセッサ７の例である。
【００２９】
マルチコアプロセッサ７は、ＣＰＵコア０〜２、ローカルメモリ３〜５及び共有メモリ６を備える。ＣＰＵコア０〜２は、それぞれ独立に動作することができるマルチコアプロセッサ７のプロセッサコアである。ローカルメモリ３〜５は、ＣＰＵコア０〜２がそれぞれ独立に使用するメモリである。ＣＰＵコア０〜２は、共有メモリ６から演算に必要なデータを、対応するローカルメモリ３〜５にコピーし、それぞれのローカルメモリ３〜５を利用して演算を行い、演算結果をそれぞれのローカルメモリ３〜５で保持する。ＣＰＵコア０〜２は、それぞれのローカルメモリ３〜５で保持している演算結果を、必要に応じて共有メモリ６に反映する。共有メモリ６は、マルチコアプロセッサ７のそれぞれのＣＰＵコア０〜２が共有することができるメモリである。
【００３０】
［動作方法の説明］
次に、本実施形態におけるコンパイラ装置４０において、コンパイル方法の説明を行う。本実施形態のコンパイラ装置４０において、コア割り当て対象関数抽出部４４及びソース修正部４５以外の機能ブロックについては、従来技術の一般のコンパイラ装置における処理と同様である。したがって、コア割り当て対象関数抽出部４４及びソース修正部４５についての動作方法について説明する。
【００３１】
まず、本発明の実施形態におけるコンパイラ装置のコア割り当て対象関数抽出部４４についての動作方法について説明する。図２は、本発明の実施形態におけるコンパイラ装置のコア割り当て対象関数抽出部４４において、コア割り当て対象関数の抽出方法のフローチャートである。
【００３２】
（ステップＳ１０１）
はじめに、コア割り当て対象抽出部４４は、コンパイル対象のソースプログラム３０に含まれる関数が、ｍａｉｎ関数であるかどうかを判断する。コア割り当て対象抽出部４４は、ｍａｉｎ関数であれば、ステップＳ１０７に進み、ｍａｉｎ関数でなければ、ステップＳ１０２に進む。
【００３３】
（ステップＳ１０２）
次に、コア割り当て対象抽出部４４は、コンパイル対象のソースプログラム３０に含まれる関数が、戻り値として値を返すかどうかを判断する。コア割り当て対象抽出部４４は、戻り値として値を返す関数であれば、ステップＳ１０３に進み、戻り値として値を返す関数でなければ、ステップＳ１０４に進む。
【００３４】
（ステップＳ１０３）
次に、コア割り当て対象抽出部４４は、コンパイル対象のソースプログラム３０に含まれる関数が、戻り値を分岐命令の条件判定に利用しているかどうかを判断する。コア割り当て対象抽出部４４は、戻り値を分岐命令の条件判定に利用していれば、ステップＳ１０７に進み、戻り値を分岐命令の条件判定に利用していなければ、ステップＳ１０４に進む。
【００３５】
（ステップＳ１０４）
次に、コア割り当て対象抽出部４４は、コンパイル対象のソースプログラム３０に含まれる関数が、関数内でグローバル変数にアクセスしているかどうかを判断する。コア割り当て対象抽出部４４は、関数内でグローバル変数にアクセスしていれば、ステップＳ１０５に進み、関数内でグローバル変数にアクセスしていなければ、ステップＳ１０６に進む。
【００３６】
（ステップＳ１０５）
次に、コア割り当て対象抽出部４４は、コンパイル対象のソースプログラム３０に含まれる関数が、繰り返し文の中でグローバル変数にアクセスしているかどうかを判断する。コア割り当て対象抽出部４４は、繰り返し文の中でグローバル変数にアクセスしていれば、ステップＳ１０７に進み、繰り返し文の中でグローバル変数にアクセスしていなければ、ステップＳ１０６に進む。
【００３７】
繰り返し文の中でグローバル変数にアクセスしている場合に、コア割り当て対象外の関数とする理由は、繰り返し文の中でグローバル変数にアクセスすると、グローバル変数のアクセスにオーバーヘッドがかかるためである。
【００３８】
（ステップＳ１０６）
コア割り当て対象抽出部４４は、コア割り当て対象となる条件を満たした関数を、コア割り当て対象としてコア割り当て対象関数テーブル３４に記録する。
【００３９】
（ステップＳ１０７）
コア割り当て対象抽出部４４は、コア割り当て対象となる条件を満たさない関数を、コア割り当て対象外としてコア割り当て対象関数テーブル３４に記録する。
【００４０】
（ステップＳ１０８）
コア割り当て対象抽出部４４は、コンパイル対象のソースプログラム３０に含まれる関数で、まだコア割り当て対象となる条件を満たすかどうかをチェックしていない関数があるかどうかを判断する。コア割り当て対象抽出部４４は、未チェックの関数がある場合には、ステップＳ１０１に進み、未チェックの関数がない場合には、コア割り当て対象関数抽出処理を終了する。
【００４１】
次に、本発明の実施形態におけるコンパイラ装置のソース修正部４５についての動作方法について説明する。図３Ａ及び図３Ｂは、本発明の実施形態におけるコンパイラ装置のソース修正部４５において、コア割り当て対象関数に対するソースプログラム修正方法のフローチャートである。
【００４２】
（ステップＳ２０１）
はじめに、ソース修正部４５は、ソースプログラム３０に含まれる関数が、コア割り当て対象の関数の呼び出し元の関数となっているかどうかを判断する。ソース修正部４５は、コア割り当て対象の関数の呼び出し元の関数となっていれば、ステップＳ２１１に進み、コア割り当て対象の関数の呼び出し元の関数となっていなければ、ステップＳ２０２に進む。
【００４３】
（ステップＳ２０２）
次に、ソース修正部４５は、ソースプログラム３０に含まれる関数が、コア割り当て対象の関数であるかどうかを判断する。ソース修正部４５は、コア割り当て対象の関数であれば、ステップＳ２０３に進み、コア割り当て対象の関数でなければ、ソースプログラム修正処理を終了する。
【００４４】
（ステップＳ２０３）
次に、ソース修正部４５は、コア割り当て対象の関数がグローバル変数をｒｅａｄしているかどうかを判断する。ソース修正部４５は、コア割り当て対象の関数にグローバル変数をｒｅａｄしていれば、ステップＳ２０４に進み、コア割り当て対象の関数にグローバル変数をｒｅａｄしていなければ、ステップＳ２０７に進む。
【００４５】
（ステップＳ２０４）
次に、ソース修正部４５は、ソース修正処理中のコア割り当て対象関数の呼び出し元の関数において、ソース修正処理中のコア割り当て対象関数の呼び出し前に、他のコア割り当て対象関数が呼び出されているかどうかを判断する。ソース修正部４５は、他のコア割り当て対象関数が呼び出されていれば、ステップＳ２０５に進み、他のコア割り当て対象関数が呼び出されていなければ、ステップＳ２０７に進む。
【００４６】
（ステップＳ２０５）
次に、ソース修正部４５は、ステップＳ２０４の他のコア割り当て対象関数において、グローバル変数をｗｒｉｔｅしているかどうかを判断する。ソース修正部４５は、グローバル変数をｗｒｉｔｅしていれば、ステップＳ２０６に進み、グローバル変数をｗｒｉｔｅしていなければ、ステップＳ２０７に進む。
【００４７】
（ステップＳ２０６）
次に、ソース修正部４５は、他のＣＰＵコアで実行されている関数によって、グローバル変数の値が変更された場合には、他のＣＰＵコアから通知されたグローバル変数の値を利用して、グローバル変数のｒｅａｄをリトライするようにソースプログラム３０を修正する。また、ソース修正部は、ソース修正処理中の関数を呼び出す関数に対して、ソース修正処理中の関数の終了を通知するようにソースプログラム３０を修正する。ソース修正部４５は、ステップＳ２０７に進む。
【００４８】
（ステップＳ２０７）
次に、ソース修正部４５は、コア割り当て対象の関数がグローバル変数をｗｒｉｔｅしているかどうかを判断する。ソース修正部４５は、コア割り当て対象の関数にグローバル変数をｗｒｉｔｅしていれば、ステップＳ２０８に進み、コア割り当て対象の関数にグローバル変数をｗｒｉｔｅしていなければ、ソースプログラム修正処理を終了する。
【００４９】
（ステップＳ２０８）
次に、ソース修正部４５は、ソース修正処理中のコア割り当て対象関数の呼び出し元の関数において、ソース修正処理中のコア割り当て対象関数の呼び出し後に、他のコア割り当て対象関数が呼び出されているかどうかを判断する。ソース修正部４５は、他のコア割り当て対象関数が呼び出されていれば、ステップＳ２０９に進み、他のコア割り当て対象関数が呼び出されていなければ、ソースプログラム修正処理を終了する。
【００５０】
（ステップＳ２０９）
次に、ソース修正部４５は、ステップＳ２０８の他のコア割り当て対象関数において、グローバル変数をｒｅａｄしているかどうかを判断する。ソース修正部４５は、グローバル変数をｒｅａｄしていれば、ステップＳ２１０に進み、グローバル変数をｒｅａｄしていなければ、ソースプログラム修正処理を終了する。
【００５１】
（ステップＳ２１０）
次に、ソース修正部４５は、他のＣＰＵコアによって実行される、グローバル変数のｒｅａｄを含む関数に、変更した後のグローバル変数の値を通知するようにソースプログラム３０を修正する。ソース修正部４５は、ソースプログラム修正処理を終了する。
【００５２】
（ステップＳ２１１）
ソース修正部４５は、コア割り当て対象関数をＣＰＵコアへ割り当てる関数をソースプログラム３０に追加する。
【００５３】
（ステップＳ２１２）
ソース修正部４５は、他のＣＰＵコアへ割り当てた関数の終了を待つ処理をソースプログラム３０に追加する。
【００５４】
（ステップＳ２１３）
ソース修正部４５は、他のＣＰＵコアへ割り当てた関数の処理結果を、対応するＣＰＵコアのローカルメモリから、共有メモリ６へ反映するようにソースプログラム３０を修正する。
【００５５】
以上が、本発明の実施形態におけるコンパイラ装置４０のコア割り当て対象関数抽出部４４及びソース修正部４５についての動作方法の説明である。
【実施例１】
【００５６】
次に、Ｃ言語の具体的なソースプログラムの例に基づいて、本発明の実施例１におけるコンパイラ装置４０を説明する。図４は、本発明の実施例１におけるコンパイラ装置を説明するためのコンパイル対象のＣ言語のソースプログラム３０である。
【００５７】
まず、図４のソースプログラム３０について説明する。
【００５８】
まず、１行目には、整数型のグローバル変数ｇ＿ｎＣｏｕｎｔが定義され、０で初期化されている。
【００５９】
２行目〜５行目には、グローバル変数ｇ＿ｎＣｏｕｎｔの値に１を加算する関数ＣｏｕｎｔＯｎｅが記載されている。
【００６０】
７行目〜１０行目には、ｇ＿ｎＣｏｕｎｔの値にｎＡｄｄを加算する関数ＣｏｎｕｔＮが記載されている。ここで、ｎＡｄｄは、整数型の変数で、関数ＣｏｕｎｔＮの引数である。
【００６１】
１２行目〜１６行目には、グローバル変数ｇ＿ｎＣｏｕｎｔに１を代入し、ｎが０の場合には１、ｎが０以外の場合には０を戻り値として返却する関数ｃｏｎｄが記載されている。ここで、ｎは、整数型の変数で、関数ｃｏｎｄの引数である。
【００６２】
１８行目〜２４行目では、ｍａｉｎ関数が記載されている。ｍａｉｎ関数では、はじめにｃｏｎｄ関数が呼び出される。次に、ｃｏｎｄ関数の戻り値が０でない場合には、ＣｏｎｄＯｎｅ関数が呼び出され、ｃｏｎｄ関数の戻り値が０の場合には、引数に１０を設定したＣｏｕｎｄＮを呼び出す。最後に、戻り値として０を返却して処理を終了する。
【００６３】
次に、図４のソースプログラム３０に対応するグローバル変数テーブル３３について説明する。図５は、本発明の実施例１におけるコンパイラ装置において、図４のソースプログラム３０に対応するグローバル変数テーブル３３の例である。図５のグローバル変数テーブル３３は、グローバル変数名フィールド及び関数ごとのｒｅａｄ箇所、ｗｒｉｔｅ箇所を格納するフィールドを有する。図４のソースプログラム３０では、グローバル変数ｇ＿ｎＣｏｕｎｔは、関数ＣｏｕｎｔＯｎｅの４行目でｒｅａｄ及びｗｒｉｔｅされ、関数ＣｏｕｎｔＮの９行目でｒｅａｄ及びｗｒｉｔｅされ、関数ｃｏｎｄの１４行目でｗｒｉｔｅされ、ｍａｉｎ関数ではアクセスされていない。したがって、図４のソースプログラム３０に対応するグローバル変数テーブル３３の各フィールドの値は図５のようになる。グローバル変数テーブル３３によって、グローバル変数ｇ＿ｎＣｏｕｎｔのｒｅａｄ箇所及びｗｒｉｔｅ箇所を関数ごとに把握することができる。
【００６４】
次に、図４のソースプログラム３０に対応するコア割り当て対象関数テーブル３４について説明する。図６は、本発明の実施例１におけるコンパイラ装置において、図４のソースプログラム３０に対応するコア割り当て対象関数テーブル３４の例である。図６のコア割り当て対象関数テーブル３４は、関数名フィールド、図２のフローチャートのコア割り当て対象となる条件に対応するフィールド、及びコア割り当て対象かどうかの情報を格納するフィールドを有する。図４のソースプログラム３０に対して、図２のコア割り当て対象関数の抽出方法のフローチャートに基づいて、各関数について、フィールドの値が格納されている。図６では、ｍａｉｎ関数は、ステップＳ１０１により、コア割り当て対象外の関数として除外されている。ｃｏｎｄ関数は、１５行目で戻り値を返し、ｍａｉｎ関数の２１行目で、戻り値が条件判定に利用されているため、ステップＳ１０３により、コア割り当て対象外の関数として除外されている。ＣｏｕｎｔＯｎｅ関数及びＣｏｕｎｔＮ関数は、ｍａｉｎ関数ではなく、戻り値もなく、グローバル変数へのアクセスがあるが、繰り返し文内でアクセスしていないため、コア割り当て対象の関数となる。
【００６５】
次に、図４のソースプログラム３０が、本発明の実施例１におけるコンパイラ装置のソース修正部４５によって、修正された後のソースプログラムについて説明する。図７は、本発明の実施例１におけるコンパイラ装置において、図４のソースプログラム３０が、ソース修正部４５によって修正された後のソースプログラムの例である。
【００６６】
まず、ソースプログラム３０に記載されている関数に対して、ソース修正部４５が、関数内部に新規に追加しているＳＴＡＲＴ関数、ＷＡＩＴ関数、ＷＲＩＴＥＢＡＣＫ関数、ＳＥＮＤ＿ＴＯ関数、ＲＥＣＶ＿ＦＲＯＭ関数及びＥＮＤ関数について説明する。
【００６７】
ＳＴＡＲＴ関数は、引数に指定された関数をＣＰＵコア０〜２のいずれかに割り当て、引数に指定された関数の処理に必要な変数を共有メモリ６から、ＣＰＵ０〜２に対応するローカルメモリ３〜５にコピーし、ＣＰＵコア０〜２のいずれかで処理を開始させる。
【００６８】
ＷＡＩＴ関数は、他のＣＰＵコアに割り当てられた関数が終了するまで（他のＣＰＵコアに割り当てられた関数内で呼ばれるＥＮＤ関数が終了するまで）、ＷＡＩＴ関数を呼び出す関数の処理を停止させる。
【００６９】
ＷＲＩＴＥＢＡＣＫ関数は、ＣＰＵコア０〜２のいずれかで処理され、ＣＰＵコア０〜２に対応するローカルメモリ３〜５のいずれかで保持されている、引数で指定されている関数の演算結果を共有メモリ６に反映する。
【００７０】
ＳＥＮＤ＿ＴＯ関数は、ＳＥＮＤ＿ＴＯ関数を呼び出す関数が実行されているＣＰＵコアから、引数に指定された関数が実行されている他のＣＰＵコアへ、引数に指定された変数の値を送信する。
【００７１】
ＲＥＣＶ＿ＦＲＯＭ関数は、ＳＥＮＤ＿ＴＯ関数に対応する関数であり、引数に指定された関数が実行されている他のＣＰＵコアから、引数に指定された変数の値を受信する。
【００７２】
ＥＮＤ関数は、ＷＡＩＴ関数に対応する関数であり、ＣＰＵコアに割り当てられた関数の終了処理を行い、ＷＡＩＴ関数を呼び出すことにより終了を待ち合わせている他のコアで実行されている関数に対して、処理が終了したことを通知する。
【００７３】
次に、図４のソースプログラム３０に含まれていた関数が、ソース修正部４５によって、どのように修正されるかについて説明する。
【００７４】
まず、ｍａｉｎ関数について説明する。ソース修正部４５は、ｍａｉｎ関数では、まず、図７の４５、４６行目において、ＳＴＡＲＴ関数によってＣｏｕｎｔＯｎｅ関数、ＣｏｕｎｔＮ関数を呼び出す修正を行う。この修正によって、他のＣＰＵコアにＣｏｕｎｔＯｎｅ関数の処理とＣｏｕｎｔＮ関数の処理を実行させる。次に、図７の４８行目において、ＷＡＩＴ関数の呼び出す処理を追加する。この修正によって、他のＣＰＵコアに割り当てたＣｏｕｎｔＯｎｅ関数、ＣｏｕｎｔＮ関数の処理の終了を待ち合わせる。次に、図７の４９行目、５０行目において、ＷＲＩＴＥＢＡＣＫ関数を使用する修正を行う。この修正により、図７の４７行目の条件判定の結果に基づいて、他のＣＰＵコアに割り当てたＣｏｕｎｔＯｎｅ関数又はＣｏｕｎｔＮ関数の処理結果を、ＣＰＵコアのローカルメモリから、共有メモリ６に反映させる。
【００７５】
次に、ｃｏｎｄ関数について説明する。ソース修正部４５は、ｃｏｎｄ関数では、図７の３７、３８行目において、ＳＥＮＤ＿ＴＯ関数により、ＣｏｕｎｔＯｎｅ関数及びＣｏｕｎｔＮ関数に対して、ｇ＿ｎＣｏｕｎｔの値を通知する。この修正により、ｍａｉｎ関数でＣｏｕｎｔＯｎｅ関数及びＣｏｕｎｔＮ関数をＳＴＡＲＴ関数によって呼び出すことにより、他のＣＰＵコアによって実行されているＣｏｕｎｔＯｎｅ関数及びＣｏｕｎｔＮ関数に、ｃｏｎｄ関数で変更した後のｇ＿ｎＣｏｕｎｔの値を通知することができる。
【００７６】
次に、ＣｏｕｎｔＯｎｅ関数、ＣｏｕｎｔＮ関数について説明する。ソース修正部４５によるＣｏｕｎｔＯｎｅ関数とＣｏｕｎｔＮ関数に対する修正は、同様であるため、ＣｏｕｎｔＯｎｅ関数についてのみ説明する。
【００７７】
ＣｏｕｎｔＯｎｅ関数がＳＴＡＲＴ関数によって呼び出される場合には、ＣｏｕｎｔＯｎｅ関数呼び出し時に共有メモリ６のｇ＿ｎＣｏｕｎｔが、ＣｏｕｎｔＯｎｅ関数が実行されるＣＰＵコアのローカルメモリへコピーされている。ソース修正部４５は、図７の６〜１４行目において、他のＣＰＵコアによって実行されているｃｏｎｄ関数によって、ｇ＿ｎＣｏｕｎｔの値が変更された場合には、通知されたｇ＿ｎＣｏｕｎｔの値を利用して図７の８行目の処理をリトライする修正を行う。この修正により、ｃｏｎｄ関数によって、ｇ＿ｎＣｏｕｎｔの値が変更された場合には、ＣｏｕｎｔＯｎｅ関数によって、ｇ＿ｎＣｏｕｎｔの値を変更する処理がリトライされる。また、ソース修正部４５は、図７の１５行目において、ＥＮＤ関数を呼び出す処理を追加する。この修正によって、ｍａｉｎ関数において、図７の４８行目のＷＡＩＴ関数によるＣｏｕｎｔＯｎｅ関数の終了を待ち合わせることができる。
【００７８】
次に、本発明の実施例１におけるコンパイラ装置によって生成された、図７のソースプログラムに対応するオブジェクトプログラムが、マルチコアプロセッサ７で実行された場合の動作について説明する。図８は、本発明の実施例１におけるコンパイラ装置によって生成された、図７のソースプログラムに対応するオブジェクトプログラムを実行した場合の動作説明図である。
【００７９】
まず、ｍａｉｎ関数が実行されるＣＰＵコア０の動作について説明する。
【００８０】
（ステップＳ３０１）
はじめに、ＣＰＵコア０でｍａｉｎ関数の実行が開始される。
【００８１】
（ステップＳ３０２）
次に、ｍａｉｎ関数が、ＣｏｕｎｔＯｎｅ関数及びＣｏｕｎｔＮ関数の処理を各ＣＰＵコアに割り当てる。
【００８２】
（ステップＳ３０３）
次に、ＣＰＵコア０で引数に１が設定されたＣｏｎｄ関数が実行される。
【００８３】
（ステップＳ３０４）
次に、ＣＰＵコア０で実行されているｍａｉｎ関数は、他のＣＰＵコアへ処理を割り当てたＣｏｕｎｔＯｎｅ関数及びＣｏｕｎｔＮ関数の処理の終了を待つ。
【００８４】
（ステップＳ３０５）
次に、ｃｏｎｄ（１）の実行結果が代入されるｃの値に基づいて、ｃが０以外の場合には、ＣｏｕｎｔＯｎｅ関数の処理結果を共有メモリ６に反映し、ｃが０の場合には、引数を１０に設定したＣｏｕｎｔＮ関数の処理結果を共有メモリに反映する。
【００８５】
（ステップＳ３０６）
ＣＰＵコア０のｍａｉｎ関数は、処理を終了する。
【００８６】
次に、ｍａｉｎ関数によってＣＰＵコア１に割り当てられるＣｏｕｎｔＯｎｅ関数の動作について説明する。
【００８７】
（ステップＳ３０７）
はじめに、ＣｏｕｎｔＯｎｅ関数は、ＣｏｕｎｔＯｎｅ関数読み出し時に、共有メモリ６からローカルメモリ４にコピーされたｇ＿ｎＣｏｕｎｔの値を、ＣｏｕｎｔＯｎｅ関数内部のローカル変数で保持する。
【００８８】
（ステップＳ３０８）
次に、ＣｏｕｎｔＯｎｅ関数は、ｇ＿ｎＣｏｕｎｔの値を＋１加算する処理を行う。
【００８９】
（ステップＳ３０９）
次に、ＣｏｕｎｔＯｎｅ関数は、ＣＰＵ０のｃｏｎｄ関数が、ｇ＿ｎＣｏｕｎｔを１に書き換えた後の通知を待つ。
【００９０】
（ステップＳ３１０）
次に、ＣｏｕｎｔＯｎｅ関数は、ステップＳ３０７で読み出したｇ＿ｎＣｏｕｎｔの値と、ＣＰＵ０のｃｏｎｄ関数が書き換えた後のｇ＿ｎＣｏｕｎｔの値が同一であるかどうかを判断する。ｇ＿ｎＣｏｕｎｔの値が同一であれば、ステップＳ３０８の演算結果をＣＰＵコア１のローカルメモリ４で所持し、ｇ＿ｎＣｏｕｎｔの値が同一でなければ、ステップＳ３０７に戻って、処理をリトライする。
【００９１】
（ステップＳ３１１）
ＣＰＵコア１のＣｏｕｎｔＯｎｅ関数は、処理を終了する。
【００９２】
次に、ｍａｉｎ関数によってＣＰＵコア２に割り当てられるＣｏｕｎｔＮ関数の動作について説明する。
【００９３】
（ステップＳ３１２）
はじめに、ＣｏｕｎｔＮ関数は、ＣｏｕｎｔＮ関数読み出し時に、共有メモリ６からローカルメモリ４にコピーされたｇ＿ｎＣｏｕｎｔの値を、ＣｏｕｎｔＮ関数内部のローカル変数で保持する。
【００９４】
（ステップＳ３１３）
次に、ＣｏｕｎｔＮ関数は、引数に１０が設定されているため、ｇ＿ｎＣｏｕｎｔの値を＋１０加算する処理を行う。
【００９５】
（ステップＳ３１４）
次に、ＣｏｕｎｔＮ関数は、ＣＰＵ０のｃｏｎｄ関数が、ｇ＿ｎＣｏｕｎｔを１に書き換えた後の通知を待つ。
【００９６】
（ステップＳ３１５）
次に、ＣｏｕｎｔＮ関数は、ステップＳ３１２で読み出したｇ＿ｎＣｏｕｎｔの値と、ＣＰＵ０のｃｏｎｄ関数が書き換えた後のｇ＿ｎＣｏｕｎｔの値が同一であるかどうかを判断する。ｇ＿ｎＣｏｕｎｔの値が同一であれば、ステップＳ３１３の演算結果をローカルメモリ５で所持し、ｇ＿ｎＣｏｕｎｔの値が同一でなければ、ステップＳ３１２に戻って、処理をリトライする。
【００９７】
（ステップＳ３１６）
ＣＰＵコア２のＣｏｕｎｔＮ関数は、処理を終了する。
【００９８】
本実施例１によれば、条件分岐命令の条件判定処理と、分岐後の各命令がグローバル変数に依存している場合に、マルチコアプロセッサによって、投機的に条件分岐命令の条件判定処理と、分岐後の各命令が並列処理されても誤動作しないオブジェクトプログラムを生成するコンパイラ装置を提供することができる。
【００９９】
また、本実施例１によれば、特許文献１の共有メモリ更新フラグを使用せずに、グローバル変数の更新を行うことができる。ＣＰＵコアに割り当てられた関数は、グローバル変数の更新情報を、ＣＰＵコア間のメッセージ送受信によって、知ることができるからである。
【０１００】
以上、本発明の実施の形態が添付の図面を参照することにより説明された。但し、本発明は、上述の実施の形態に限定されず、要旨を逸脱しない範囲で当業者により適宜変更され得る。
【符号の説明】
【０１０１】
０  ＣＰＵコア
１  ＣＰＵコア
２  ＣＰＵコア
３  ローカルメモリ
４  ローカルメモリ
５  ローカルメモリ
６  共有メモリ
７  マルチコアプロセッサ
１０  コンパイラプログラム
２０  表示部
２１  入力部
２２  ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）
２３  補助記憶装置
２４  メモリ
２５  システムバス
３０  原始プログラム（ソースプログラム）
３１  目的プログラム（オブジェクトプログラム）
３２  変数名、定数等の各種情報のテーブル
３３  グローバル変数テーブル
３４  コア割り当て対象関数テーブル
４０  コンパイラ装置
４１  読み込み部
４２  字句解析部
４３  構文解析部
４４  コア割り当て対象関数抽出部
４５  ソース修正部
４６  中間語作成部
４７  最適化部
４８  オブジェクト生成部
【図１】
2012103923.tif 000003
【図２】
2012103923.tif 000004
【図３Ａ】
2012103923.tif 000005
【図３Ｂ】
2012103923.tif 000006
【図４】
2012103923.tif 000007
【図５】
2012103923.tif 000008
【図６】
2012103923.tif 000009
【図７】
2012103923.tif 000010
【図８】
2012103923.tif 000011
【図９】
2012103923.tif 000012
【図１０】
2012103923.tif 000013
【図１１】
2012103923.tif 000014