JP2012103923A - コンパイラ装置、コンパイル方法及びコンパイラプログラム - Google Patents

コンパイラ装置、コンパイル方法及びコンパイラプログラム Download PDF

Info

Publication number
JP2012103923A
JP2012103923A JP2010252280A JP2010252280A JP2012103923A JP 2012103923 A JP2012103923 A JP 2012103923A JP 2010252280 A JP2010252280 A JP 2010252280A JP 2010252280 A JP2010252280 A JP 2010252280A JP 2012103923 A JP2012103923 A JP 2012103923A
Authority
JP
Japan
Prior art keywords
function
core
global variable
allocation target
target function
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
JP2010252280A
Other languages
English (en)
Inventor
Namiyo Nagashima
奈美代 長島
Kazuo Nishikata
和夫 西片
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.)
Renesas Electronics Corp
Original Assignee
Renesas Electronics Corp
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 Renesas Electronics Corp filed Critical Renesas Electronics Corp
Priority to JP2010252280A priority Critical patent/JP2012103923A/ja
Publication of JP2012103923A publication Critical patent/JP2012103923A/ja
Withdrawn legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】条件分岐命令の条件判定処理と、分岐後の各命令がグローバル変数に依存している場合に、条件分岐命令の条件判定処理と、分岐後の各命令が並列処理されても誤動作しないオブジェクトプログラムを生成するコンパイラ装置を提供する。
【解決手段】本発明のコンパイラ装置は、グローバル変数の値に基づいてグローバル変数の値を変更する処理を含む関数を、コア割り当て対象関数として抽出するコア割り当て対象関数抽出部と、コア割り当て対象関数が、条件分岐命令の条件判定処理による分岐後の呼出し関数となる場合には、マルチコアプロセッサの各CPUコアにコア割り当て対象関数を割り当て、条件分岐命令の条件判定処理によって、グローバル変数が変更された場合には、グローバル変数の値に基づいてグローバル変数の値を変更する処理を、コア割り当て対象関数にリトライさせるようにソースプログラムを修正するソース修正部とを備える。
【選択図】図1

Description

本発明は、コンパイラ装置に関し、特にマルチコアプロセッサに対するオブジェクトプログラムを生成するコンパイラ装置に関する。
近年、半導体集積回路が多くの製品に搭載され、様々な製品において、複雑な制御が行われており、製品の処理能力を向上させるために、複数のコアをプロセッサに搭載したマルチコアプロセッサが利用されることが多くなってきた。そのため、複数のコアを搭載したプロセッサの特性を利用したオブジェクトプログラムを生成することができるコンパイラ装置の必要性が高まってきている。
特開2008−210027号公報(特許文献1)には、複数のCPUコアを有するマルチコアプロセッサにおいて、分岐命令を各CPUコアに割り当てることによって、分岐命令を並列処理させるオブジェクトプログラムを生成するコンパイラ装置が記載されている。このコンパイラ装置では、各CPUコアで所持している分岐命令の処理結果を、共有メモリに書き込む際に、分岐命令の条件判定を行っているメインスレッドの条件判定結果に基づいて、各CPUコアのストア制御機構の共有メモリ更新禁止フラグを利用して、共有メモリへの処理結果の反映を制御するオブジェクトプログラムを生成している。
従来技術では、各CPUコアにおいて、共有メモリ内の同一のグローバル変数を更新して、分岐命令の条件判定処理と、分岐命令の条件判定結果に基づいて実行する各命令を並列処理すると、共有メモリのグローバル変数の値の整合性がとれないという課題がある。例えば、メインスレッドの分岐命令の条件判定処理において、グローバル変数の更新処理を含み、その結果を分岐先の命令で参照・更新する場合である。
図9は、コンパイルすると分岐命令を含むオブジェクトプログラムを生成するソースプログラムの例である。問題となるのは、図9において、条件判定処理に使用される変数Xが、グローバル変数の更新を含むf(a,b,c,d)の演算結果によって決定され、各CPUコアへの割り当てる対象となるg0(x0)、g1(x1)及びg2(x2)が、同一のグローバル変数の更新処理を含む場合である。各CPUコアによって並列処理が行われるため、各CPUコアに割り当てた分岐命令が参照するグローバル変数は、メインスレッドの分岐命令の条件判定処理後のグローバル変数を参照するという保障がない。そのため、分岐命令を投機的に並列処理させるCPUコアが、メインスレッドによる更新前のグローバル変数に基づいて、演算を行った場合は、共有メモリのグローバル変数の値の整合性がとれなくなる。
特開2008−210027号公報
本発明の目的は、条件分岐命令の条件判定処理と、分岐後の各命令がグローバル変数に依存している場合に、マルチコアプロセッサによって、投機的に条件分岐命令の条件判定処理と、分岐後の各命令が並列処理されても誤動作しないオブジェクトプログラムを生成するコンパイラ装置を提供することにある。
本発明のコンパイラ装置は、ソースプログラムを読み込む読み込み部と、ソースプログラムの字句解析を行う字句解析部と、ソースプログラムの構文解析を行う構文解析部と、ソースプログラムに含まれる関数から、グローバル変数の値に基づいてグローバル変数の値を変更する処理を含む関数を、コア割り当て対象関数として抽出するコア割り当て対象関数抽出部と、コア割り当て対象関数が、条件分岐命令の条件判定処理による分岐後の呼出し関数となる場合には、マルチコアプロセッサの各CPUコアにコア割り当て対象関数を割り当て、条件分岐命令の条件判定処理と、コア割り当て対象関数の処理を並列処理させ、条件分岐命令の条件判定処理によって、グローバル変数が変更された場合には、グローバル変数の値に基づいてグローバル変数の値を変更する処理を、コア割り当て対象関数にリトライさせるようにソースプログラムを修正するソース修正部と、ソースプログラムをソース修正部により修正したソースプログラムから中間言語による中間語を作成する中間語作成部と、中間語を最適化する最適化部と、最適化された中間語からオブジェクトプログラムを生成するオブジェクト生成部とを備える。
本発明のコンパイル方法は、読み込み部が、ソースプログラムを読み込むステップと、字句解析部が、ソースプログラムの字句解析を行うステップと、構文解析部が、ソースプログラムの構文解析を行うステップと、コア割り当て対象関数抽出部が、ソースプログラムに含まれる関数から、グローバル変数の値に基づいてグローバル変数の値を変更する処理を含む関数を、コア割り当て対象関数として抽出するステップと、ソース修正部が、コア割り当て対象関数が、条件分岐命令の条件判定処理による分岐後の呼出し関数となる場合には、マルチコアプロセッサの各CPUコアにコア割り当て対象関数を割り当て、条件分岐命令の条件判定処理と、コア割り当て対象関数の処理を並列処理させ、条件分岐命令の条件判定処理によって、グローバル変数が変更された場合には、グローバル変数の値に基づいてグローバル変数の値を変更する処理を、コア割り当て対象関数にリトライさせるようにソースプログラムを修正するステップと、中間語作成部が、ソースプログラムをソース修正部により修正したソースプログラムから中間言語による中間語を作成するステップと、最適化部が、中間語を最適化するステップと、オブジェクト生成部が、最適化された中間語からオブジェクトプログラムを生成するステップとを含む。
本発明によれば、条件分岐命令の条件判定処理と、分岐後の各命令がグローバル変数に依存している場合に、マルチコアプロセッサによって、投機的に条件分岐命令の条件判定処理と、分岐後の各命令が並列処理されても誤動作しないオブジェクトプログラムを生成するコンパイラ装置を提供することができる。
図1は、本発明の実施形態におけるコンパイラ装置のブロック図である。 図2は、本発明の実施形態におけるコンパイラ装置のコア割り当て対象関数抽出部44において、コア割り当て対象関数の抽出方法のフローチャートである。 図3Aは、本発明の実施形態におけるコンパイラ装置のソース修正部45において、コア割り当て対象関数に対するソースコード修正方法のフローチャートである。 図3Bは、本発明の実施形態におけるコンパイラ装置のソース修正部45において、コア割り当て対象関数に対するソースコード修正方法のフローチャートである。 図4は、本発明の実施例1におけるコンパイラ装置を説明するためのコンパイル対象のC言語のソースプログラム30である。 図5は、本発明の実施例1におけるコンパイラ装置において、図4のソースプログラム30に対応するグローバル変数テーブル33の例である。 図6は、本発明の実施例1におけるコンパイラ装置において、図4のソースプログラム30に対応するコア割り当て対象関数テーブル34の例である。 図7は、本発明の実施例1におけるコンパイラ装置において、図4のソースプログラム30が、ソース修正部45によって修正された後のソースプログラムの例である。 図8は、本発明の実施例1におけるコンパイラ装置によって生成された、図7のソースプログラムに対応するオブジェクトプログラムを実行した場合の動作説明図である。 図9は、コンパイルすると分岐命令を含むオブジェクトプログラムを生成するソースプログラムの例である。 図10は、本発明の実施形態におけるコンパイラ装置40のハードウェア構成図である。 図11は、本発明の実施形態におけるコンパイラ装置40によって生成されたオブジェクトプログラムが実行されるマルチコアプロセッサの例である。
添付図面を参照して、本発明の実施形態によるコンパイラ装置40を以下に説明する。
[構成の説明]
はじめに、本実施形態におけるコンパイラ装置40の構成の説明を行う。図1は、本発明の実施形態におけるコンパイラ装置40のブロック図である。本発明の実施形態におけるコンパイラ装置40は、読み込み部41、字句解析部42、構文解析部43、割り当て対象関数抽出部44、ソース修正部45、中間語作成部46、最適化部47、オブジェクト生成部48、変数名、定数等の各種情報のテーブル32、グローバル変数テーブル33及びコア割り当て対象関数テーブル34を備える。
読み込み部41は、コンパイルの対象となるソースプログラム30をコンパイラ装置40に読み込む。
字句解析部42は、従来技術の一般のコンパイラ装置と同様の方法で、ソースプログラム30の字句解析を行う。
構文解析部43は、従来技術の一般のコンパイラ装置と同様の方法で、ソースプログラム30の構文解析を行う。ただし、グローバル変数の管理について、ソースプログラム30に含まれるグローバル変数のread箇所及びwrite箇所の情報を、ソースプログラム30に含まれる関数ごとに所持するグローバル変数テーブル33を作成する。
コア割り当て対象関数抽出部44は、ソースプログラム30に含まれる関数の中から、マルチコアプロセッサにおける各CPUコアに対して、割り当てる対象となる関数を抽出する。
ソース修正部45は、条件分岐命令の条件判定処理と、分岐後の各命令がグローバル変数に依存している場合に、マルチコアプロセッサによって、投機的に条件分岐命令の条件判定処理と、分岐後の各命令が並列処理されても誤動作しないオブジェクトプログラムを生成できるように、ソースプログラム30を修正する。
中間語作成部46は、従来技術の一般のコンパイラ装置と同様の方法で、ソースプログラム30から中間言語による中間語を作成する。
最適化部47は、従来技術の一般のコンパイラ装置と同様の方法で、中間語作成部46により作成された中間語を最適化する。
オブジェクト生成部48は、従来技術の一般のコンパイラ装置と同様の方法で、最適化部47により最適化された中間語からオブジェクトプログラムを生成する。
変数名、定数等の各種情報のテーブル32は、コンパイラ装置が、ソースプログラム30からオブジェクトプログラムを生成するために必要となる情報を保持するためのテーブルである。従来技術の一般のコンパイラ装置と同様の情報を、変数名、定数等の各種情報のテーブル32で保持している。
グローバル変数テーブル33は、ソースプログラム30に含まれるグローバル変数のread箇所及びwrite箇所の情報を、ソースプログラム30に含まれる関数ごとに所持するテーブルである。
コア割り当て対象関数テーブル34は、ソースプログラム30に含まれる関数に対して、マルチコアプロセッサの各CPUコアに割り当てる対象となる関数であるかどうかを管理しているテーブルである。
次に、本実施形態におけるコンパイラ装置40のハードウェア構成についての説明を行う。図10は、本発明の実施形態におけるコンパイラ装置40のハードウェア構成図である。
コンパイラ装置40は、表示部20、入力部21、CPU22、補助記憶装置23、メモリ24及びシステムバス25を備える。
メモリ24は、コンパイラ装置40の主記憶装置である。コンパイラ装置40を利用する際には、本実施形態におけるコンパイラ装置40を実現するためのコンパイラプログラム10が、メモリ24上に展開される。表示部20は、コンパイラ装置40の実行結果が表示される。入力部21は、利用者がコンパイラ装置40を操作するためのインタフェースである。CPU22は、メモリ24上に展開されたコンピュータプログラムを実行する制御装置である。補助記憶装置23は、OS(Operating System)及びアプリケーションプログラムが記憶されている装置である。補助記憶装置23には、本実施形態におけるコンパイラ装置40を実現するためのコンパイラプログラム10が記憶されている。システムバス25は、表示部20、入力部21、CPU22、補助記憶装置23及びメモリ24とデータの送受信を行う通信路である。
次に、本発明の実施形態におけるコンパイラ装置40によって生成されたオブジェクトプログラムが実行されるマルチコアプロセッサについて説明する。図11は、本発明の実施形態におけるコンパイラ装置40によって生成されたオブジェクトプログラムが実行されるマルチコアプロセッサ7の例である。
マルチコアプロセッサ7は、CPUコア0〜2、ローカルメモリ3〜5及び共有メモリ6を備える。CPUコア0〜2は、それぞれ独立に動作することができるマルチコアプロセッサ7のプロセッサコアである。ローカルメモリ3〜5は、CPUコア0〜2がそれぞれ独立に使用するメモリである。CPUコア0〜2は、共有メモリ6から演算に必要なデータを、対応するローカルメモリ3〜5にコピーし、それぞれのローカルメモリ3〜5を利用して演算を行い、演算結果をそれぞれのローカルメモリ3〜5で保持する。CPUコア0〜2は、それぞれのローカルメモリ3〜5で保持している演算結果を、必要に応じて共有メモリ6に反映する。共有メモリ6は、マルチコアプロセッサ7のそれぞれのCPUコア0〜2が共有することができるメモリである。
[動作方法の説明]
次に、本実施形態におけるコンパイラ装置40において、コンパイル方法の説明を行う。本実施形態のコンパイラ装置40において、コア割り当て対象関数抽出部44及びソース修正部45以外の機能ブロックについては、従来技術の一般のコンパイラ装置における処理と同様である。したがって、コア割り当て対象関数抽出部44及びソース修正部45についての動作方法について説明する。
まず、本発明の実施形態におけるコンパイラ装置のコア割り当て対象関数抽出部44についての動作方法について説明する。図2は、本発明の実施形態におけるコンパイラ装置のコア割り当て対象関数抽出部44において、コア割り当て対象関数の抽出方法のフローチャートである。
(ステップS101)
はじめに、コア割り当て対象抽出部44は、コンパイル対象のソースプログラム30に含まれる関数が、main関数であるかどうかを判断する。コア割り当て対象抽出部44は、main関数であれば、ステップS107に進み、main関数でなければ、ステップS102に進む。
(ステップS102)
次に、コア割り当て対象抽出部44は、コンパイル対象のソースプログラム30に含まれる関数が、戻り値として値を返すかどうかを判断する。コア割り当て対象抽出部44は、戻り値として値を返す関数であれば、ステップS103に進み、戻り値として値を返す関数でなければ、ステップS104に進む。
(ステップS103)
次に、コア割り当て対象抽出部44は、コンパイル対象のソースプログラム30に含まれる関数が、戻り値を分岐命令の条件判定に利用しているかどうかを判断する。コア割り当て対象抽出部44は、戻り値を分岐命令の条件判定に利用していれば、ステップS107に進み、戻り値を分岐命令の条件判定に利用していなければ、ステップS104に進む。
(ステップS104)
次に、コア割り当て対象抽出部44は、コンパイル対象のソースプログラム30に含まれる関数が、関数内でグローバル変数にアクセスしているかどうかを判断する。コア割り当て対象抽出部44は、関数内でグローバル変数にアクセスしていれば、ステップS105に進み、関数内でグローバル変数にアクセスしていなければ、ステップS106に進む。
(ステップS105)
次に、コア割り当て対象抽出部44は、コンパイル対象のソースプログラム30に含まれる関数が、繰り返し文の中でグローバル変数にアクセスしているかどうかを判断する。コア割り当て対象抽出部44は、繰り返し文の中でグローバル変数にアクセスしていれば、ステップS107に進み、繰り返し文の中でグローバル変数にアクセスしていなければ、ステップS106に進む。
繰り返し文の中でグローバル変数にアクセスしている場合に、コア割り当て対象外の関数とする理由は、繰り返し文の中でグローバル変数にアクセスすると、グローバル変数のアクセスにオーバーヘッドがかかるためである。
(ステップS106)
コア割り当て対象抽出部44は、コア割り当て対象となる条件を満たした関数を、コア割り当て対象としてコア割り当て対象関数テーブル34に記録する。
(ステップS107)
コア割り当て対象抽出部44は、コア割り当て対象となる条件を満たさない関数を、コア割り当て対象外としてコア割り当て対象関数テーブル34に記録する。
(ステップS108)
コア割り当て対象抽出部44は、コンパイル対象のソースプログラム30に含まれる関数で、まだコア割り当て対象となる条件を満たすかどうかをチェックしていない関数があるかどうかを判断する。コア割り当て対象抽出部44は、未チェックの関数がある場合には、ステップS101に進み、未チェックの関数がない場合には、コア割り当て対象関数抽出処理を終了する。
次に、本発明の実施形態におけるコンパイラ装置のソース修正部45についての動作方法について説明する。図3A及び図3Bは、本発明の実施形態におけるコンパイラ装置のソース修正部45において、コア割り当て対象関数に対するソースプログラム修正方法のフローチャートである。
(ステップS201)
はじめに、ソース修正部45は、ソースプログラム30に含まれる関数が、コア割り当て対象の関数の呼び出し元の関数となっているかどうかを判断する。ソース修正部45は、コア割り当て対象の関数の呼び出し元の関数となっていれば、ステップS211に進み、コア割り当て対象の関数の呼び出し元の関数となっていなければ、ステップS202に進む。
(ステップS202)
次に、ソース修正部45は、ソースプログラム30に含まれる関数が、コア割り当て対象の関数であるかどうかを判断する。ソース修正部45は、コア割り当て対象の関数であれば、ステップS203に進み、コア割り当て対象の関数でなければ、ソースプログラム修正処理を終了する。
(ステップS203)
次に、ソース修正部45は、コア割り当て対象の関数がグローバル変数をreadしているかどうかを判断する。ソース修正部45は、コア割り当て対象の関数にグローバル変数をreadしていれば、ステップS204に進み、コア割り当て対象の関数にグローバル変数をreadしていなければ、ステップS207に進む。
(ステップS204)
次に、ソース修正部45は、ソース修正処理中のコア割り当て対象関数の呼び出し元の関数において、ソース修正処理中のコア割り当て対象関数の呼び出し前に、他のコア割り当て対象関数が呼び出されているかどうかを判断する。ソース修正部45は、他のコア割り当て対象関数が呼び出されていれば、ステップS205に進み、他のコア割り当て対象関数が呼び出されていなければ、ステップS207に進む。
(ステップS205)
次に、ソース修正部45は、ステップS204の他のコア割り当て対象関数において、グローバル変数をwriteしているかどうかを判断する。ソース修正部45は、グローバル変数をwriteしていれば、ステップS206に進み、グローバル変数をwriteしていなければ、ステップS207に進む。
(ステップS206)
次に、ソース修正部45は、他のCPUコアで実行されている関数によって、グローバル変数の値が変更された場合には、他のCPUコアから通知されたグローバル変数の値を利用して、グローバル変数のreadをリトライするようにソースプログラム30を修正する。また、ソース修正部は、ソース修正処理中の関数を呼び出す関数に対して、ソース修正処理中の関数の終了を通知するようにソースプログラム30を修正する。ソース修正部45は、ステップS207に進む。
(ステップS207)
次に、ソース修正部45は、コア割り当て対象の関数がグローバル変数をwriteしているかどうかを判断する。ソース修正部45は、コア割り当て対象の関数にグローバル変数をwriteしていれば、ステップS208に進み、コア割り当て対象の関数にグローバル変数をwriteしていなければ、ソースプログラム修正処理を終了する。
(ステップS208)
次に、ソース修正部45は、ソース修正処理中のコア割り当て対象関数の呼び出し元の関数において、ソース修正処理中のコア割り当て対象関数の呼び出し後に、他のコア割り当て対象関数が呼び出されているかどうかを判断する。ソース修正部45は、他のコア割り当て対象関数が呼び出されていれば、ステップS209に進み、他のコア割り当て対象関数が呼び出されていなければ、ソースプログラム修正処理を終了する。
(ステップS209)
次に、ソース修正部45は、ステップS208の他のコア割り当て対象関数において、グローバル変数をreadしているかどうかを判断する。ソース修正部45は、グローバル変数をreadしていれば、ステップS210に進み、グローバル変数をreadしていなければ、ソースプログラム修正処理を終了する。
(ステップS210)
次に、ソース修正部45は、他のCPUコアによって実行される、グローバル変数のreadを含む関数に、変更した後のグローバル変数の値を通知するようにソースプログラム30を修正する。ソース修正部45は、ソースプログラム修正処理を終了する。
(ステップS211)
ソース修正部45は、コア割り当て対象関数をCPUコアへ割り当てる関数をソースプログラム30に追加する。
(ステップS212)
ソース修正部45は、他のCPUコアへ割り当てた関数の終了を待つ処理をソースプログラム30に追加する。
(ステップS213)
ソース修正部45は、他のCPUコアへ割り当てた関数の処理結果を、対応するCPUコアのローカルメモリから、共有メモリ6へ反映するようにソースプログラム30を修正する。
以上が、本発明の実施形態におけるコンパイラ装置40のコア割り当て対象関数抽出部44及びソース修正部45についての動作方法の説明である。
次に、C言語の具体的なソースプログラムの例に基づいて、本発明の実施例1におけるコンパイラ装置40を説明する。図4は、本発明の実施例1におけるコンパイラ装置を説明するためのコンパイル対象のC言語のソースプログラム30である。
まず、図4のソースプログラム30について説明する。
まず、1行目には、整数型のグローバル変数g_nCountが定義され、0で初期化されている。
2行目〜5行目には、グローバル変数g_nCountの値に1を加算する関数CountOneが記載されている。
7行目〜10行目には、g_nCountの値にnAddを加算する関数ConutNが記載されている。ここで、nAddは、整数型の変数で、関数CountNの引数である。
12行目〜16行目には、グローバル変数g_nCountに1を代入し、nが0の場合には1、nが0以外の場合には0を戻り値として返却する関数condが記載されている。ここで、nは、整数型の変数で、関数condの引数である。
18行目〜24行目では、main関数が記載されている。main関数では、はじめにcond関数が呼び出される。次に、cond関数の戻り値が0でない場合には、CondOne関数が呼び出され、cond関数の戻り値が0の場合には、引数に10を設定したCoundNを呼び出す。最後に、戻り値として0を返却して処理を終了する。
次に、図4のソースプログラム30に対応するグローバル変数テーブル33について説明する。図5は、本発明の実施例1におけるコンパイラ装置において、図4のソースプログラム30に対応するグローバル変数テーブル33の例である。図5のグローバル変数テーブル33は、グローバル変数名フィールド及び関数ごとのread箇所、write箇所を格納するフィールドを有する。図4のソースプログラム30では、グローバル変数g_nCountは、関数CountOneの4行目でread及びwriteされ、関数CountNの9行目でread及びwriteされ、関数condの14行目でwriteされ、main関数ではアクセスされていない。したがって、図4のソースプログラム30に対応するグローバル変数テーブル33の各フィールドの値は図5のようになる。グローバル変数テーブル33によって、グローバル変数g_nCountのread箇所及びwrite箇所を関数ごとに把握することができる。
次に、図4のソースプログラム30に対応するコア割り当て対象関数テーブル34について説明する。図6は、本発明の実施例1におけるコンパイラ装置において、図4のソースプログラム30に対応するコア割り当て対象関数テーブル34の例である。図6のコア割り当て対象関数テーブル34は、関数名フィールド、図2のフローチャートのコア割り当て対象となる条件に対応するフィールド、及びコア割り当て対象かどうかの情報を格納するフィールドを有する。図4のソースプログラム30に対して、図2のコア割り当て対象関数の抽出方法のフローチャートに基づいて、各関数について、フィールドの値が格納されている。図6では、main関数は、ステップS101により、コア割り当て対象外の関数として除外されている。cond関数は、15行目で戻り値を返し、main関数の21行目で、戻り値が条件判定に利用されているため、ステップS103により、コア割り当て対象外の関数として除外されている。CountOne関数及びCountN関数は、main関数ではなく、戻り値もなく、グローバル変数へのアクセスがあるが、繰り返し文内でアクセスしていないため、コア割り当て対象の関数となる。
次に、図4のソースプログラム30が、本発明の実施例1におけるコンパイラ装置のソース修正部45によって、修正された後のソースプログラムについて説明する。図7は、本発明の実施例1におけるコンパイラ装置において、図4のソースプログラム30が、ソース修正部45によって修正された後のソースプログラムの例である。
まず、ソースプログラム30に記載されている関数に対して、ソース修正部45が、関数内部に新規に追加しているSTART関数、WAIT関数、WRITEBACK関数、SEND_TO関数、RECV_FROM関数及びEND関数について説明する。
START関数は、引数に指定された関数をCPUコア0〜2のいずれかに割り当て、引数に指定された関数の処理に必要な変数を共有メモリ6から、CPU0〜2に対応するローカルメモリ3〜5にコピーし、CPUコア0〜2のいずれかで処理を開始させる。
WAIT関数は、他のCPUコアに割り当てられた関数が終了するまで(他のCPUコアに割り当てられた関数内で呼ばれるEND関数が終了するまで)、WAIT関数を呼び出す関数の処理を停止させる。
WRITEBACK関数は、CPUコア0〜2のいずれかで処理され、CPUコア0〜2に対応するローカルメモリ3〜5のいずれかで保持されている、引数で指定されている関数の演算結果を共有メモリ6に反映する。
SEND_TO関数は、SEND_TO関数を呼び出す関数が実行されているCPUコアから、引数に指定された関数が実行されている他のCPUコアへ、引数に指定された変数の値を送信する。
RECV_FROM関数は、SEND_TO関数に対応する関数であり、引数に指定された関数が実行されている他のCPUコアから、引数に指定された変数の値を受信する。
END関数は、WAIT関数に対応する関数であり、CPUコアに割り当てられた関数の終了処理を行い、WAIT関数を呼び出すことにより終了を待ち合わせている他のコアで実行されている関数に対して、処理が終了したことを通知する。
次に、図4のソースプログラム30に含まれていた関数が、ソース修正部45によって、どのように修正されるかについて説明する。
まず、main関数について説明する。ソース修正部45は、main関数では、まず、図7の45、46行目において、START関数によってCountOne関数、CountN関数を呼び出す修正を行う。この修正によって、他のCPUコアにCountOne関数の処理とCountN関数の処理を実行させる。次に、図7の48行目において、WAIT関数の呼び出す処理を追加する。この修正によって、他のCPUコアに割り当てたCountOne関数、CountN関数の処理の終了を待ち合わせる。次に、図7の49行目、50行目において、WRITEBACK関数を使用する修正を行う。この修正により、図7の47行目の条件判定の結果に基づいて、他のCPUコアに割り当てたCountOne関数又はCountN関数の処理結果を、CPUコアのローカルメモリから、共有メモリ6に反映させる。
次に、cond関数について説明する。ソース修正部45は、cond関数では、図7の37、38行目において、SEND_TO関数により、CountOne関数及びCountN関数に対して、g_nCountの値を通知する。この修正により、main関数でCountOne関数及びCountN関数をSTART関数によって呼び出すことにより、他のCPUコアによって実行されているCountOne関数及びCountN関数に、cond関数で変更した後のg_nCountの値を通知することができる。
次に、CountOne関数、CountN関数について説明する。ソース修正部45によるCountOne関数とCountN関数に対する修正は、同様であるため、CountOne関数についてのみ説明する。
CountOne関数がSTART関数によって呼び出される場合には、CountOne関数呼び出し時に共有メモリ6のg_nCountが、CountOne関数が実行されるCPUコアのローカルメモリへコピーされている。ソース修正部45は、図7の6〜14行目において、他のCPUコアによって実行されているcond関数によって、g_nCountの値が変更された場合には、通知されたg_nCountの値を利用して図7の8行目の処理をリトライする修正を行う。この修正により、cond関数によって、g_nCountの値が変更された場合には、CountOne関数によって、g_nCountの値を変更する処理がリトライされる。また、ソース修正部45は、図7の15行目において、END関数を呼び出す処理を追加する。この修正によって、main関数において、図7の48行目のWAIT関数によるCountOne関数の終了を待ち合わせることができる。
次に、本発明の実施例1におけるコンパイラ装置によって生成された、図7のソースプログラムに対応するオブジェクトプログラムが、マルチコアプロセッサ7で実行された場合の動作について説明する。図8は、本発明の実施例1におけるコンパイラ装置によって生成された、図7のソースプログラムに対応するオブジェクトプログラムを実行した場合の動作説明図である。
まず、main関数が実行されるCPUコア0の動作について説明する。
(ステップS301)
はじめに、CPUコア0でmain関数の実行が開始される。
(ステップS302)
次に、main関数が、CountOne関数及びCountN関数の処理を各CPUコアに割り当てる。
(ステップS303)
次に、CPUコア0で引数に1が設定されたCond関数が実行される。
(ステップS304)
次に、CPUコア0で実行されているmain関数は、他のCPUコアへ処理を割り当てたCountOne関数及びCountN関数の処理の終了を待つ。
(ステップS305)
次に、cond(1)の実行結果が代入されるcの値に基づいて、cが0以外の場合には、CountOne関数の処理結果を共有メモリ6に反映し、cが0の場合には、引数を10に設定したCountN関数の処理結果を共有メモリに反映する。
(ステップS306)
CPUコア0のmain関数は、処理を終了する。
次に、main関数によってCPUコア1に割り当てられるCountOne関数の動作について説明する。
(ステップS307)
はじめに、CountOne関数は、CountOne関数読み出し時に、共有メモリ6からローカルメモリ4にコピーされたg_nCountの値を、CountOne関数内部のローカル変数で保持する。
(ステップS308)
次に、CountOne関数は、g_nCountの値を+1加算する処理を行う。
(ステップS309)
次に、CountOne関数は、CPU0のcond関数が、g_nCountを1に書き換えた後の通知を待つ。
(ステップS310)
次に、CountOne関数は、ステップS307で読み出したg_nCountの値と、CPU0のcond関数が書き換えた後のg_nCountの値が同一であるかどうかを判断する。g_nCountの値が同一であれば、ステップS308の演算結果をCPUコア1のローカルメモリ4で所持し、g_nCountの値が同一でなければ、ステップS307に戻って、処理をリトライする。
(ステップS311)
CPUコア1のCountOne関数は、処理を終了する。
次に、main関数によってCPUコア2に割り当てられるCountN関数の動作について説明する。
(ステップS312)
はじめに、CountN関数は、CountN関数読み出し時に、共有メモリ6からローカルメモリ4にコピーされたg_nCountの値を、CountN関数内部のローカル変数で保持する。
(ステップS313)
次に、CountN関数は、引数に10が設定されているため、g_nCountの値を+10加算する処理を行う。
(ステップS314)
次に、CountN関数は、CPU0のcond関数が、g_nCountを1に書き換えた後の通知を待つ。
(ステップS315)
次に、CountN関数は、ステップS312で読み出したg_nCountの値と、CPU0のcond関数が書き換えた後のg_nCountの値が同一であるかどうかを判断する。g_nCountの値が同一であれば、ステップS313の演算結果をローカルメモリ5で所持し、g_nCountの値が同一でなければ、ステップS312に戻って、処理をリトライする。
(ステップS316)
CPUコア2のCountN関数は、処理を終了する。
本実施例1によれば、条件分岐命令の条件判定処理と、分岐後の各命令がグローバル変数に依存している場合に、マルチコアプロセッサによって、投機的に条件分岐命令の条件判定処理と、分岐後の各命令が並列処理されても誤動作しないオブジェクトプログラムを生成するコンパイラ装置を提供することができる。
また、本実施例1によれば、特許文献1の共有メモリ更新フラグを使用せずに、グローバル変数の更新を行うことができる。CPUコアに割り当てられた関数は、グローバル変数の更新情報を、CPUコア間のメッセージ送受信によって、知ることができるからである。
以上、本発明の実施の形態が添付の図面を参照することにより説明された。但し、本発明は、上述の実施の形態に限定されず、要旨を逸脱しない範囲で当業者により適宜変更され得る。
0 CPUコア
1 CPUコア
2 CPUコア
3 ローカルメモリ
4 ローカルメモリ
5 ローカルメモリ
6 共有メモリ
7 マルチコアプロセッサ
10 コンパイラプログラム
20 表示部
21 入力部
22 CPU(Central Processing Unit)
23 補助記憶装置
24 メモリ
25 システムバス
30 原始プログラム(ソースプログラム)
31 目的プログラム(オブジェクトプログラム)
32 変数名、定数等の各種情報のテーブル
33 グローバル変数テーブル
34 コア割り当て対象関数テーブル
40 コンパイラ装置
41 読み込み部
42 字句解析部
43 構文解析部
44 コア割り当て対象関数抽出部
45 ソース修正部
46 中間語作成部
47 最適化部
48 オブジェクト生成部

Claims (9)

  1. ソースプログラムを読み込む読み込み部と、
    前記ソースプログラムの字句解析を行う字句解析部と、
    前記ソースプログラムの構文解析を行う構文解析部と、
    前記ソースプログラムに含まれる関数から、グローバル変数の値に基づいて前記グローバル変数の値を変更する処理を含む関数を、コア割り当て対象関数として抽出するコア割り当て対象関数抽出部と、
    前記コア割り当て対象関数が、条件分岐命令の条件判定処理による分岐後の呼出し関数となる場合には、前記コア割り当て対象関数を呼び出す関数が実行されるマルチコアプロセッサのコアとは、別のCPUコアに対して前記コア割り当て対象関数を1:1に割り当て、前記条件分岐命令の前記条件判定処理と、前記コア割り当て対象関数の処理を各前記CPUコアで並列処理させ、前記条件分岐命令の前記条件判定処理によって、前記グローバル変数が変更された場合には、前記グローバル変数の値に基づいて前記グローバル変数の値を変更する処理を、前記コア割り当て対象関数にリトライさせるように前記ソースプログラムを修正するソース修正部と、
    前記ソースプログラムを前記ソース修正部により修正したソースプログラムから中間言語による中間語を作成する中間語作成部と、
    前記中間語を最適化する最適化部と、
    最適化された前記中間語からオブジェクトプログラムを生成するオブジェクト生成部と
    を備えるコンパイラ装置。
  2. 前記コア割り当て対象関数抽出部は、前記ソースプログラムに含まれる関数が、main関数ではなく、かつ、前記関数の戻り値が前記条件分岐命令の前記条件判定処理に利用されておらず、かつ、前記関数からグローバル変数へのアクセスがあり、かつ、前記関数から前記グローバル変数へのアクセスが前記関数内の繰り返し処理の中からアクセスされておらず、又は、前記関数からグローバル変数へのアクセスがない場合に、マルチコアプロセッサの前記コア割り当て対象関数とする
    請求項1に記載のコンパイラ装置。
  3. 前記ソース修正部は、前記コア割り当て対象関数を呼び出す関数に対しては、前記コア割り当て対象関数を前記マルチコアプロセッサに割り当てる処理と、前記コア割り当て対象関数の処理の終了を待ち合わせる処理と、前記コア割り当て対象関数の処理結果を有効化する処理を追加する修正を行い、
    前記条件分岐命令の前記条件判定処理に使用されている関数に対しては、前記コア割り当て対象関数に、変更後の前記グローバル変数の値を通知する処理を追加する修正を行い、
    前記コア割り当て対象関数に対しては、前記グローバル変数を変更する前の値を保持する処理と、前記通知する処理による通知を受信するまで待ち合わせる処理と、前記通知する処理による前記通知を受信するまで待ち合わせる処理の後に、前記保持する処理で保持したグローバル変数の値と、前記グローバル変数の値を比較し、前記グローバル変数の値が同一でない場合には、前記コア割り当て対象関数による前記グローバル変数の値を変更する処理をリトライする処理を追加する修正を行う
    請求項1又は2に記載のコンパイラ装置。
  4. 前記構文解析部は、前記ソースプログラムに含まれるグローバル変数のread箇所及びwrite箇所の情報を、前記ソースプログラムに含まれる関数ごとに所持するグローバル変数テーブルを作成し、
    前記コア割り当て対象関数抽出部は、前記ソースプログラムに含まれる関数に対して、前記マルチコアプロセッサの各CPUコアに割り当てる対象となる関数であるかどうかの情報を記憶するコア割り当て対象関数テーブルを作成し、
    前記ソース修正部は、前記グローバル変数テーブル及び前記コア割り当て対象関数テーブルに基づいて前記ソースプログラムを修正する
    請求項1乃至3いずれか1項に記載のコンパイラ装置。
  5. 読み込み部が、ソースプログラムを読み込むステップと、
    字句解析部が、前記ソースプログラムの字句解析を行うステップと、
    構文解析部が、前記ソースプログラムの構文解析を行うステップと、
    コア割り当て対象関数抽出部が、前記ソースプログラムに含まれる関数から、グローバル変数の値に基づいて前記グローバル変数の値を変更する処理を含む関数を、コア割り当て対象関数として抽出するステップと、
    ソース修正部が、前記コア割り当て対象関数が、条件分岐命令の条件判定処理による分岐後の呼出し関数となる場合には、前記コア割り当て対象関数を呼び出す関数が実行されるマルチコアプロセッサのコアとは、別のCPUコアに対して前記コア割り当て対象関数を1:1に割り当て、前記条件分岐命令の前記条件判定処理と、前記コア割り当て対象関数の処理を各前記CPUコアで並列処理させ、前記条件分岐命令の前記条件判定処理によって、前記グローバル変数が変更された場合には、前記グローバル変数の値に基づいて前記グローバル変数の値を変更する処理を、前記コア割り当て対象関数にリトライさせるように前記ソースプログラムを修正するステップと、
    中間語作成部が、前記ソースプログラムを前記ソース修正部により修正したソースプログラムから中間言語による中間語を作成するステップと、
    最適化部が、前記中間語を最適化するステップと、
    オブジェクト生成部が、最適化された前記中間語からオブジェクトプログラムを生成するステップと
    を含むコンパイル方法。
  6. 前記コア割り当て対象関数として抽出するステップは、
    前記コア割り当て対象関数抽出部が、前記ソースプログラムに含まれる関数が、main関数ではなく、かつ、前記関数の戻り値が前記条件分岐命令の前記条件判定処理に利用されておらず、かつ、前記関数からグローバル変数へのアクセスがあり、かつ、前記関数から前記グローバル変数へのアクセスが前記関数内の繰り返し処理の中からアクセスされておらず、又は、前記関数からグローバル変数へのアクセスがない場合に、マルチコアプロセッサの前記コア割り当て対象関数とするステップ
    を含む請求項5に記載のコンパイル方法。
  7. 前記ソースプログラムを修正するステップは、前記ソース修正部が、前記コア割り当て対象関数を呼び出す関数に対しては、前記コア割り当て対象関数を前記マルチコアプロセッサに割り当てる処理と、前記コア割り当て対象関数の処理の終了を待ち合わせる処理と、前記コア割り当て対象関数の処理結果を有効化する処理を追加する修正を行うステップと、
    前記ソース修正部が、前記条件分岐命令の前記条件判定処理に使用されている関数に対しては、前記コア割り当て対象関数に、変更後の前記グローバル変数の値を通知する処理を追加する修正を行うステップと、
    前記ソース修正部が、前記コア割り当て対象関数に対しては、前記グローバル変数を変更する前の値を保持する処理と、前記通知する処理による通知を受信するまで待ち合わせる処理と、前記通知する処理による前記通知を受信するまで待ち合わせる処理の後に、前記保持する処理で保持したグローバル変数の値と、前記グローバル変数の値を比較し、前記グローバル変数の値が同一でない場合には、前記コア割り当て対象関数による前記グローバル変数の値を変更する処理をリトライする処理を追加する修正を行うステップと
    を含む請求項5又は6に記載のコンパイル方法。
  8. 前記構文解析を行うステップは、前記構文解析部が、前記ソースプログラムに含まれるグローバル変数のread箇所及びwrite箇所の情報を、前記ソースプログラムに含まれる関数ごとに所持するグローバル変数テーブルを作成するステップと、
    前記コア割り当て対象関数として抽出するステップは、前記コア割り当て対象関数抽出部が、前記ソースプログラムに含まれる関数に対して、前記マルチコアプロセッサの各CPUコアに割り当てる対象となる関数であるかどうかの情報を記憶するコア割り当て対象関数テーブルを作成するステップと、
    前記ソース修正部が、前記グローバル変数テーブル及び前記コア割り当て対象関数テーブルに基づいて前記ソースプログラムを修正するステップと
    を含む請求項1乃至3いずれか1項に記載のコンパイル方法。
  9. 請求項5乃至8のいずれか1項に記載のコンパイル方法をコンピュータに実行させるためのコンパイラプログラム。
JP2010252280A 2010-11-10 2010-11-10 コンパイラ装置、コンパイル方法及びコンパイラプログラム Withdrawn JP2012103923A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2010252280A JP2012103923A (ja) 2010-11-10 2010-11-10 コンパイラ装置、コンパイル方法及びコンパイラプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2010252280A JP2012103923A (ja) 2010-11-10 2010-11-10 コンパイラ装置、コンパイル方法及びコンパイラプログラム

Publications (1)

Publication Number Publication Date
JP2012103923A true JP2012103923A (ja) 2012-05-31

Family

ID=46394237

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010252280A Withdrawn JP2012103923A (ja) 2010-11-10 2010-11-10 コンパイラ装置、コンパイル方法及びコンパイラプログラム

Country Status (1)

Country Link
JP (1) JP2012103923A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2014115613A1 (ja) * 2013-01-23 2014-07-31 学校法人 早稲田大学 並列性の抽出方法及びプログラムの作成方法
WO2016032234A1 (ko) * 2014-08-27 2016-03-03 주식회사 파수닷컴 소스 코드 분석 장치, 이를 위한 컴퓨터 프로그램, 그 기록매체
JP2018073054A (ja) * 2016-10-27 2018-05-10 株式会社Dtsインサイト オブジェクト分析装置、オブジェクト分析方法、及びプログラム
US10496516B2 (en) 2014-08-27 2019-12-03 Sparrow Co., Ltd. Source code analysis device, computer program for same, and recording medium thereof

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2014115613A1 (ja) * 2013-01-23 2014-07-31 学校法人 早稲田大学 並列性の抽出方法及びプログラムの作成方法
WO2016032234A1 (ko) * 2014-08-27 2016-03-03 주식회사 파수닷컴 소스 코드 분석 장치, 이를 위한 컴퓨터 프로그램, 그 기록매체
US10496516B2 (en) 2014-08-27 2019-12-03 Sparrow Co., Ltd. Source code analysis device, computer program for same, and recording medium thereof
JP2018073054A (ja) * 2016-10-27 2018-05-10 株式会社Dtsインサイト オブジェクト分析装置、オブジェクト分析方法、及びプログラム

Similar Documents

Publication Publication Date Title
US7730463B2 (en) Efficient generation of SIMD code in presence of multi-threading and other false sharing conditions and in machines having memory protection support
US11900113B2 (en) Data flow processing method and related device
US8832672B2 (en) Ensuring register availability for dynamic binary optimization
US8327109B2 (en) GPU support for garbage collection
US9015690B2 (en) Proactive loop fusion of non-adjacent loops with intervening control flow instructions
EP3066560B1 (en) A data processing apparatus and method for scheduling sets of threads on parallel processing lanes
JPH01166141A (ja) デバッグ情報提供方法
US20100095286A1 (en) Register reduction and liveness analysis techniques for program code
JP2011070256A (ja) デバッガおよびプログラム
JP2005332387A (ja) メモリ命令をグループ化及び管理する方法及びシステム
US9513886B2 (en) Heap data management for limited local memory(LLM) multi-core processors
US7480768B2 (en) Apparatus, systems and methods to reduce access to shared data storage
JP2019049843A (ja) 実行ノード選定プログラム、実行ノード選定方法及び情報処理装置
JP2010009495A (ja) 情報処理装置、プログラム処理方法及びコンピュータプログラム
US11226798B2 (en) Information processing device and information processing method
JP2012103923A (ja) コンパイラ装置、コンパイル方法及びコンパイラプログラム
KR20220016993A (ko) 그래픽 처리 유닛(Graphics Processing Unit, GPU)의 명시적 독립 마스크 레지스터의 마스크 조작 방법
US8949777B2 (en) Methods and systems for mapping a function pointer to the device code
US20200371827A1 (en) Method, Apparatus, Device and Medium for Processing Data
US10496433B2 (en) Modification of context saving functions
JP5293609B2 (ja) マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラム
US20140223419A1 (en) Compiler, object code generation method, information processing apparatus, and information processing method
JP6217386B2 (ja) マルチプロセッサ用プログラム生成方法
US20050251795A1 (en) Method, system, and program for optimizing code
US20200409746A1 (en) Information processing apparatus and recording medium

Legal Events

Date Code Title Description
A300 Withdrawal of application because of no request for examination

Free format text: JAPANESE INTERMEDIATE CODE: A300

Effective date: 20140204