JP4339907B2 - マルチプロセッサ向け最適コード生成方法及びコンパイル装置 - Google Patents

マルチプロセッサ向け最適コード生成方法及びコンパイル装置 Download PDF

Info

Publication number
JP4339907B2
JP4339907B2 JP2007275886A JP2007275886A JP4339907B2 JP 4339907 B2 JP4339907 B2 JP 4339907B2 JP 2007275886 A JP2007275886 A JP 2007275886A JP 2007275886 A JP2007275886 A JP 2007275886A JP 4339907 B2 JP4339907 B2 JP 4339907B2
Authority
JP
Japan
Prior art keywords
code
processors
data
main memory
source code
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.)
Expired - Fee Related
Application number
JP2007275886A
Other languages
English (en)
Other versions
JP2009104422A (ja
Inventor
恒一 高山
直伸 助川
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.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2007275886A priority Critical patent/JP4339907B2/ja
Priority to US12/068,421 priority patent/US8296746B2/en
Publication of JP2009104422A publication Critical patent/JP2009104422A/ja
Application granted granted Critical
Publication of JP4339907B2 publication Critical patent/JP4339907B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops

Description

本発明は、マルチプロセッサ向け最適コード生成方法及びコンパイル装置に関し、特に、複数のプロセッサを効率良く動作させるため、並列処理を行うコードを生成する方法、ならびにコンパイル装置に関する。
半導体製造技術の発展と共にトランジスタの高集積化が可能となりプロセッサは高い演算性能を実現した。しかし、プロセッサの高い動作周波数やリーク電流により消費電力が多くなる弊害も出ている。この弊害を避ける方法として、例えば非特許文献2に記載されているように、複数のSIMD(Single Instruction Multi Data)型プロセッサまたは複数のベクトル型プロセッサを主記憶やキャッシュメモリに共有結合する方法がある。これにより、動作周波数を高くせずに消費電力を抑えながら、演算器を多く並べることによって高い演算性能を実現している。
また、特許文献1には、ループ制御変数の要素を分割する要素並列化と共に、ループ内の命令列を分割するセクション並列化を用いて並列計算機用のオブジェクトコードを生成するコンパイル処理方法が記載されている。特許文献2には、ループ繰り返しにまたがるデータ依存が存在する多重ループをマルチプロセッサでパイプライン的に並列実行可能にするコンパイル方法が示されている。この方法は、多重ループの前後にバリア同期を発行するループを生成し、分割したループの直後にバリア同期を発行する文を生成するものである。非特許文献1および非特許文献3には、コンパイラの具体的な実装方法などが記載されている。
特開2006−268070号公報 特開2000−20482号公報 Hans Zima and Barbara Chapman共著、村岡洋一訳、「スーパーコンパイラ」、オーム社、1995年 C. Scott Ananian, Krste Asanovic, Bradley C. Kuszmaul, Charles E. Leiserson, and Sean Lie、「Cache Refill/Access Decoupling for Vector Machines」、37th International Symposium on Microarchitecture (MICRO-37)、Portland, Oregon、2004年12月 A.V.エイホ,R.セシィ,J.D.ウルマン著、「コンパイラ」、サイエンス社、1990年
前述したように、複数のSIMD型プロセッサや複数のベクトル型プロセッサ等の適用に伴い、プロセッサの処理性能は高まっているが、主記憶からのデータ供給性能はプロセッサの処理性能に見合った向上が図られていない。そのため、主記憶からのデータ転送時間が長くなり、その間にプロセッサ内の処理が進まなくなって、複数のプロセッサの性能を引き出すことができない問題が生じている。これは一般的にメモリウォール問題として知られている。
また、特許文献1等に記載されているように、演算ループを複数のプロセッサに処理を分割して実行する際、演算ループの制御変数を分割してプロセッサに割付けて各プロセッサで演算実行することが行われている。この時の演算を実行する計算機システムの構成図の例を図1に示し、演算の並列化の例を図2に示す。図1の計算機は、キャッシュメモリ107を共有する4つのプロセッサ(CPU)106の構成である。図2では、プログラム201が演算ループの制御変数により4分割され、この4分割されたプログラム202が各プロセッサに割り当てられている。各プロセッサは、同じ配列名の違う要素を使って同時に計算を実行するため、4つのプロセッサはキャッシュメモリを共有しているが、1つのプロセッサが計算に使えるキャッシュメモリの容量は1/4に減ってしまう。そのため、1つのプロセッサが受け持つキャッシュメモリの容量が少なくなり、再利用できるデータ量が減ってしまう問題がある。
ここで、計算機の演算性能を高めるために非特許文献2に示されるようなSIMD型プロセッサまたはベクトル型プロセッサを用いる場合を想定する。SIMD型プロセッサまたはベクトル型プロセッサは演算器が多数並んでいるため、各プロセッサの実行効率を高めるためには、1つのプロセッサで処理する演算ループ長を一定以上に長く保つことが必要である。しかし、演算ループのループ長を延ばすことによりキャッシュメモリに登録するデータ量が増えるため、キャッシュメモリのローカルデータアクセスが損なわれ、データの再利用性が低下することが問題となる。
本発明は、このようなことを鑑みてなされたものであり、本発明の前記ならびにその他の目的と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば、次の通りである。
本発明の一実施の形態の最適化コードの生成方法は、主記憶またはキャッシュメモリを共有する複数のプロセッサから構成される計算機に対して、主記憶からプロセッサへのデータ転送量を削減しながらプロセッサの実行効率を高めることを目的として、ソースコードから各プロセッサが処理をする最適な並列コードを生成する方法となっている。具体的には、コンピュータシステムは、ソースコードに含まれる複数の処理を複数のプロセッサに分割すると共に、この分割されたソースコードを解析し、プロセッサの演算量および演算順序依存関係や、キャッシュメモリのデータの再利用性や、主記憶またはキャッシュメモリに対するロードデータ量およびストアデータ量などの分析を行う。そして、コンピュータシステムは、予めユーザによって定義された計算機の性能(例えば主記憶のアクセス時間、キャッシュメモリのアクセス時間、キャッシュメモリの容量等)を用いて、前記分割されたソースコードの実行サイクル時間を見積りながら、実行サイクル時間が最短となる並列コードを生成する。このようなコンピュータシステムの処理によって、複数のプロセッサの実行効率を高めるための最適な並列コードが生成可能となる。
なお、ソースコードに含まれる複数の処理を複数のプロセッサに分割する際には、キャッシュメモリのデータの再利用性を高めると共に複数のプロセッサから主記憶に向けたアクセス回数を少なくする第1方式の分割や、あるいは、複数のプロセッサによる演算処理量を均等にする第2方式の分割を行う。また、第1方式の分割が行われたソースコードに対して更に第2方式の分割を行う。そして、このような分割が行われたソースコードに対してそれぞれ実行サイクル時間を見積り、その結果、実行サイクル時間が最短となるソースコードに対応した並列コードを生成する。これによって、主記憶アクセスの観点とプロセッサの処理量均等化の観点と、それらの組合せを総合して、最適な並列コードを生成可能となる。
また、本発明の一実施の形態の最適化コードの生成方法は、予めユーザが、ソースコード内の任意の範囲を決めて、そこに前述した第1方式の分割を適用するか第2方式の分割を適用するかを指定することも可能となっている。これによって、ユーザの知見や経験等を活用しながら、ソースコード内の各範囲毎にその処理内容に応じた最適化を図ることができ、その結果、全体として最適な並列コードを生成することが可能となる。
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば、次の通りである。
本発明の一実施の形態による最適化コードの生成方法を用いると、主記憶またはキャッシュメモリを共有する複数のプロセッサ間で主記憶からのデータ転送量を減らしながら、各プロセッサを効率的に動作させる並列コードを生成可能となる。
以下、本発明の実施の形態を図面に基づいて詳細に説明する。実施の形態を説明するための全図において、同一の部材には原則として同一の符号を付し、その繰り返しの説明は省略する。また、以下の実施の形態においては便宜上その必要があるときは、複数のセクションまたは実施の形態に分割して説明するが、特に明示した場合を除き、それらはお互いに無関係なものではなく、一方は他方の一部または全部の変形例、詳細、補足説明等の関係にある。
また、以下の実施の形態において、要素の数等(個数、数値、量、範囲等を含む)に言及する場合、特に明示した場合および原理的に明らかに特定の数に限定される場合等を除き、その特定の数に限定されるものではなく、特定の数以上でも以下でも良い。さらに、以下の実施の形態において、その構成要素(要素ステップ等も含む)は、特に明示した場合および原理的に明らかに必須であると考えられる場合等を除き、必ずしも必須のものではないことは言うまでもない。同様に、以下の実施の形態において、構成要素等の形状、位置関係等に言及するときは、特に明示した場合および原理的に明らかにそうでないと考えられる場合等を除き、実質的にその形状等に近似または類似するもの等を含むものとする。このことは、上記数値および範囲についても同様である。
(実施の形態1)
図1は、本発明の実施の形態1によるコード生成方法において、その生成されたコードを用いて制御を実行する計算機システムの一例を示した構成図である。この計算機システムは、コードを実行するためのディスプレイ装置101、端末装置102、コマンドを入力するキーボード103、端末に接続された外部記憶装置104、コードを実行する計算ノード群105、計算ノード群に接続された外部記憶装置109からなる。
1つの計算ノードは、主記憶装置108またはキャッシュメモリ107を共有する複数のプロセッサ(CPU)106からできており、1つまたは複数の計算ノードから計算ノード群は構成される。キーボード103及び端末装置102からコマンドを投入して、生成されたコードを計算ノード群105で実行する。本実施の形態では、計算ノード群105の複数のプロセッサ106を効率的に動作させる並列コードの生成方法を示す。
本実施の形態の並列コード生成方法は、端末装置102または計算ノード群105または別の計算機システムで実現される。コードを生成する計算機システムの構成図を図3に示す。この計算機システムは、ディスプレイ装置301、キーボード302、プロセッサ(CPU)303、主記憶装置304、外部記憶装置305から構成される。並列コードを生成する際には、キーボード302からユーザのコード生成起動のコマンドを入力する。コード生成の状況及びエラーメッセージや終了メッセージはディスプレイ装置301に表示される。
外部記憶装置305には、ソースコード314と最終的に生成された並列コード315が格納される。主記憶装置304には、構文解析部306や、中間コードを生成する中間コードの生成部307や、並列コードの生成に伴い解析を行う解析部308などが格納される。さらに、主記憶装置304には、解析部308を実行する際に途中で生成される処理内容テーブル309、再利用データテーブル310、主記憶データテーブル311、並びに各CPUの処理分割テーブル312と、最適化コード生成部313とが格納される。並列コード生成処理はプロセッサ(CPU)303で制御され実行される。
図3でソースコードから並列コードを生成する際の処理の大まかな流れを図4に示す。コードの生成は、ソースコード401をコード変換部(コンパイラ)400に入力することで行われる。コード変換部400は、まず、構文解析部402と中間コードの生成部403を用いた処理を行う。構文解析の方法に関しては、例えば非特許文献3に記述されている。中間コードの生成部403の処理に関しては図7で説明する。次いで、コード変換部400は、中間コードに対して解析部404を用いて解析を行う。
本実施の形態のコード生成方法は、この解析部404による処理内容が主要な特徴となっている。図4の例では、中間コードに対して解析部404を用いた解析を行っており、この場合のコード変換部400は、一般的にコンパイル装置(コンパイラ)と呼ばれているものに該当する。ただし、本実施の形態のコード生成方法では、中間コードに対して解析部404を用いた解析を行うのみならず、ソースコード401に対して解析部404を用いた解析を行うことも可能となっている。この場合、コード変換部400は、例えば、ソースコード401を解析した後に、各CPU毎の処理が明確化された最適化ソースコードを生成することになる。そして、この最適化ソースコードを通常のコンパイル装置でコンパイルすることで最適化コードが得られる。
解析部404は、順に、ループ演算切り出し部405、依存処理と独立処理解析部406、データの再利用性解析部407、主記憶データ引用解析部408、並列化方法評価部409を用いた処理を行う。初めに、ループ演算切り出し部405では、演算ループ単位とその前後の処理の主記憶アクセスの分析、及び処理の並列化を行う。その詳細については図11、図28で説明する。ループ演算切り出し部405の結果を基に、依存処理と独立処理解析部406では、演算やファイルからのデータ読込みやプロセッサ間の通信といった処理と、この処理の際にプロセッサで引用するデータとプロセッサからキャッシュメモリまたは主記憶に書き込むデータの順序を求める。データを書き込む際に処理の順序を保障する必要がある場合には、依存処理として、データの種類を処理内容テーブル414に記録する。
続いて、データの再利用性解析部407では、処理の際に利用するデータが再利用データである場合、再利用するデータの量と再利用する時点までのデータの引用間隔を解析する。このときの詳細手順は図12、図16で説明する。再利用データである場合は、再利用データテーブル415に記録する。次いで、主記憶データ引用解析部408では、処理に使用するデータが主記憶から引用されているのか解析し、主記憶から引用したデータを主記憶データテーブル416に登録する。この際の詳細な解析手順は図12、図16で説明する。
最後に、並列化方法評価部409では、ユーザが入力した並列化コード生成方針412、計算機条件入力部413、処理内容テーブル414、再利用データテーブル415、主記憶データテーブル416を基に並列時の処理の分割を決める。この際の詳細手順は図17、図18、図20、図21、図22で説明する。そして、これによって求めた結果を各CPUの処理分割テーブル417に記録する。このような解析部404での処理を経て、コード変換部400は、並列化方法評価部409の結果と各CPUの処理分割テーブル417を基に、最適化コード生成部410を用いて最適化コードの生成を行い、その結果、並列コード411が生成される。
ユーザが指定する並列化方針に関して図5、図6に示す。図5はコンパイルオプションの例を示す。本実施の形態の並列化方法を適用する際、並列化方針のコマンド501を入力し、その後に詳細な指定を続ける。ファイル名、サブルーチン名または関数名、ソースコードで指定されたファイル名の中の行数502を入力する。更に並列化の際に各プロセッサで実行する演算量の負荷均等化を優先して並列化コードを生成する場合には「calculation」、キャッシュメモリの再利用性を高める等をして主記憶へのアクセス時間を最短にすることを優先して並列コードを生成する場合には「data」として並列化方針503を入力する。
また、並列化方針は、コマンドのみならず、ソースコード内でその一部の箇所を指定して与えることも可能となっている。ソースコードに並列化方針の指示を与えたときの例を図6に示す。並列化方針のコマンドは、601、604で示す。その次の引数602、605で並列化方針を指定する範囲を行数で示す。最後に適用する並列化方針として、演算量の負荷均等化を優先して並列化コードを作成する場合は「calculation」、またキャッシュメモリの再利用性を高める等をして主記憶へのアクセス時間を最短にすることを優先して並列化コードを作成する場合には「data」により指定する(603、606)。
図6の例において、並列化方針601で指定している処理は、演算ループの並列化を対象としている。一方、並列化方針604で指定している処理は、演算だけではなく、ディスクから主記憶へのデータの読込み(read文)と、プロセッサ間のデータの通信(call mpi_isend文)が含まれている。この処理に関して、「data」により4つのプロセッサに向けて並列化された場合、例えば、プロセッサ0番がディスクから主記憶への読み込み、プロセッサ1番がプロセッサ間の通信処理、プロセッサ2、3番が演算を分けて処理することもできる。
本明細書では、処理ループの制御変数を分けて処理の負荷を均等化する並列化方法を演算負荷均等並列化法と呼ぶことにする。また、ループ構造となっていない処理を分割してプロセッサに割当てる並列化、および前述した図6の例のようにループ構造となっていない処理の分割とループ制御変数による分割を混合して用いる方法を主記憶アクセス削減並列化法と呼ぶことにする。主記憶アクセス削減並列化法は、図5または図6のコンパイルオプションやディレクティブで並列化方針が「data」で指定されたときにソースコードの解析が実施される。
図7では、図4の構文解析部402と中間コードの生成部403の処理により、ソースコード701から中間コード702を生成したときの例を示す。中間コードでは基本ブロックをエッジで結んだグラフで表現される。こういったグラフは制御フローグラフと呼ばれている。B0からB3は、基本ブロックを表す。基本ブロックは複数の文で構成され、各文は実効命令にほぼ対応しているので、「命令」と呼ばれることもある。B2の「r0=load(x[i])」は配列型の変数xのi要素値をロードして変数r0に代入することを表している。本実施の形態では最適化に関係するキャッシュメモリアクセスまたは主記憶アクセスを「load」で表している。
図7の中間コード702を用いて、4つのプロセッサ上で実行するときに演算を分割して各CPUで行う中間コードを図8に示す。図7では、ループ演算の制御変数iをB1で1にセットしてからB2の演算を開始する。B2の中でiをカウントアップしていきi=401になった時点でB2の演算を終了してB3に処理を移行する。この演算を均等に4分割して各プロセッサで実行することを図8が表している。図8のB2では、i=1〜100、i=101〜200、i=201〜300、i=301〜400の4分割をすることにより、各プロセッサでの演算量を均等に分割できる。このような分割方法は、演算量の負荷均等化を優先した並列化法(すなわち演算負荷均等並列化法)となる。
演算量の負荷均等化を優先した並列化方法では、各プロセッサが演算するデータが違っているため、図1の計算ノード群105の1つの計算ノードで4プロセッサがキャッシュメモリ107を共有している場合、1プロセッサが使用する共有キャッシュメモリの容量は全容量の1/4となる。もし、図8で使用するプロセッサがベクトルプロセッサであった場合の中間コードの例を図9に示す。ベクトル長を100とすると、B2の1行目の「r0=load(x[i])」はvload命令を使った「r0=vload(x)」となり、iの1要素に対して実行されるのではなく、i=1〜100までの要素を一度に実行する。そのため、r0は1要素ではなく1〜100までの要素を持つ変数となる。その後に実行される命令である、「r1=vload(y)」「r2=r0+r1」などに関しても全て100要素に対するデータの読み込みと演算である。
ここで、変数の1要素のデータ量が8Byteの場合、1変数当たり要素数が100であるため、1変数のデータ量は800Byteである。図1の計算ノード群105の1つの計算ノードで実行する場合、再利用データのロードが共有キャッシュメモリから実行できると、主記憶からロードする場合に比べて高速に実行できる。演算B2の中では、変数xだけが2回利用している。2回目に変数xがロードされるまでに他の変数が8種類(x,y,u,v,a,b,p,q)で各変数が800Byteであるため、1プロセッサ当たりが使うキャッシュメモリは6.4KByteとなる。4プロセッサでは、6.4KByteの4倍の25.6KByteになる。
図10に、図9に示した各プロセッサの演算量の負荷均等化を優先した並列化法とは異なる並列化の方法を示す。図10では、B2のループ制御変数は分割していないため、各プロセッサのループ実行回数は並列化前と同じである。そのかわり、ループの中にある演算を4つに分割して各プロセッサに割当てる。図9と図10ではループ内で変数a、b、c、dを求めている。図9では各プロセッサが分担した範囲で変数を求めているが、図10では4つに分割した1001で変数a、1002で変数b、1003で変数c、1004で変数dを計算している。この場合は、1001と1003の初めの演算を実行すれば1004の計算を実行でき、各変数の100要素を全てキャッシュメモリに読み込む前に演算を終えることも可能となるため、使用するキャッシュメモリは例えば15要素分(x[1−2],y[1−2],a[1],u[1−2],v[1−2],p[1−2],q[1−2],c[1]×2)のデータ量である120Byteとなる。したがって、図9に示した演算量の負荷均等化を優先した並列化の場合の25.6KByteに比べて小さくなっている。
図10のようにキャッシュメモリを利用する容量を削減しながら再利用データの計算を実行する方法は、主記憶へのアクセス時間を最短にする並列化法(主記憶アクセス削減並列化法)となる。ただし、各B2の行数から1001と1003の処理量は少ないが、1002と1004の処理量は多くなっており、1001〜1004の処理量に負荷の均等化が図れていない。そのため、プロセッサの処理性能が高い割りに主記憶からのデータ転送能力が低い場合、プロセッサの処理性能が高い割りにキャッシュメモリの容量が少ない場合に、演算量の均等化が図れなくても主記憶からのデータ転送量を削減できるため、主記憶へのアクセス時間を最短にする並列化法が有効となる。
以上のように、図5のコンパイルオプション503、図6のソースコードの指示行603と606で、Calculationを指示した場合は、図9のような演算負荷均等並列化法による最適化を用いたコードの生成が行われ、dataを指示した場合は、図10のような主記憶アクセス削減並列化法による最適化を用いたコードの生成が行われる。
図11に、図4のループ演算切り出し部405が行う詳細な処理ループの分割手順を示す。図28は、図11の補足図である。まず、図28を用いて、図11の分割手順が行う処理の概要について説明する。図28には、一例として多重ループを含むソースコードが示されている。この多重ループにおいて、最内側ループ2801の処理11を調査して演算に依存が無いことが分かれば、ループ2801を複数のCPUにより並列化して独立に演算することが可能となる。演算に依存が無い場合とは、例えば、処理11に含まれる複数の命令文の中で、ある命令文の結果を他の命令文で使用することが無いような場合を意味する。その後、ループ2801の外側に位置するループ2811の処理を調査する。ここで、処理21、処理31、処理41に演算の依存が無いことが分かれば、ループ2811を複数のCPUによって並列化して独立に演算することが可能となる。
続いて、更にループ2811の外側に位置するループ2812の処理を調査する。ループ2812では、処理12が処理11に依存のある演算となっている。このように依存がある処理が含まれると、そのループ2812に対して単純に主記憶アクセス削減並列化法や演算負荷均等並列化法を適用するのは困難となる。したがって、この場合、複数のCPUで分割できる最大の単位はループ2811である。ループ2811を分割する際、演算負荷均等並列化法を用いて4CPUに処理を分割して実行する場合、例えば、ループ2811のループ長300を75(=300/4)ずつに分けて実行する。一方、主記憶アクセス削減並列化法を用いる場合、例えば、ループ2811に含まれるループ2801、ループ2802、ループ2803、ループ2804をそれぞれ4つのCPUに分割すればよい。
なお、分割可能な最大ループであるループ2811の代わりに、例えば最内側ループ2801を対象として、演算負荷均等並列化法などを用いて複数のCPUに分割することも可能である。ただし、この場合は、例えば4つのCPUを用いてループ2801を実行した後に、4つのCPUを用いてループ2802を実行するといった処理の流れとなり、このループ2801とループ2802の繋ぎ目で各CPU間の同期が必要となる場合がある。このような同期は実行効率を低下させる要因となるため、前述したように、演算の依存性がない範囲で可能な限り最大ループを探索し、この最大ループを対象として各種分割方法の適用を検討することが望ましい。
このように、例えば図28のループ2811のような複数のCPUで分割できる最大の単位を探索するため、図4のループ切り出し部405は、図11の分割手順を行う。図11においては、まず初めに中間コードの中からループ処理をする部分を特定する(1102)。この時点では、特定したループの内側に他のループ処理が含まれていても良い。特定したループの内側に別のループが存在しているのか判断する(1103)。内側にループ処理がある場合は内側のループを対象として(1104)、再度対象ループの中に別のループ処理が含まれるか判断する(1103)。これにより、最内側のループを特定する。
最内側ループの中に含まれる処理の間に演算の依存性を判断し(1105)、依存性が無い場合には、最内側ループの1つ外側のループを評価対象とする。そのため、外側にループが存在するのか判断を行う(1106)。外側にループが無い場合には、この最内側ループが評価対象処理ループとなる(1110)。外側にループがある場合には、そのループを評価対象として、外側処理の間でデータの依存関係を持つ処理が含まれるのか判断する(1107)。データ間に依存関係の無い処理であれば、更に外側のループを評価対象とする(1106)。このように、評価対象ループの範囲を広げることで、レジスタ上のデータの再利用性、キャッシュメモリ上のデータの再利用性を高め、主記憶へのアクセス時間の短縮を図りやすくする。すなわち、主記憶アクセス削減並列化法の適用が容易となる。
また、最内側ループの処理の依存性の判定(1105)で依存がある場合、最内側ループ内の処理で使用するデータの間に依存関係が無く独立に実行できる処理の有無を判定する(1108)。独立に実行できる処理が無い場合は、逐次処理(1109)として、本実施の形態の並列化評価の対象としない。独立に実行できる処理の有無の判定(1108)で、独立に処理ができる場合は、本実施の形態の並列化評価の対象となり、評価対象処理ループ(1110)とする。
図12に、図4の依存処理と独立処理解析部406、データ再利用性解析部407、主記憶データ引用解析部408の詳細な評価手順を示す。なお、データ再利用性解析部407、主記憶データ引用解析部408の評価は図16でも行われる。図12では、図11の結果として得られた評価対象ループ(1201)を基に評価する。評価対象処理ループ内に処理があることを判定して(1202)、処理を1つずつ取り出して評価を実行する(1203)。
1つの処理の中で引用するデータが前の処理結果に依存するのか判定を行い(1204)、依存しない場合(1205)は、演算量の算出(1206)をした後、独立処理であることを処理内容テーブルに登録する(1207)。その上で、使用したデータが他の処理との依存関係が無く、主記憶から読み込むことになるため、主記憶データテーブルに使用したデータを登録する(1208)。また、処理の結果を主記憶にストアすることになるが、このデータに関しても主記憶データテーブルに記録する(1208)。
一方、処理で使用するデータが前の処理結果に依存する判定(1204)で依存がある(1210)の場合は、演算量の算出(1211)をした後、依存処理を処理内容テーブルに登録する(1212)。次いで、前の処理結果を引用するデータを再利用データテーブルに登録する(1213)。ここで登録される再利用データは、例えば図7のソースコード701の例では、a(i)とc(i)に該当する。更に、前の処理に依存しない引用データまたは書き出しデータを主記憶データテーブルに登録する(1208)。また、再利用データテーブルに登録した引用データが主記憶データテーブルのストアの項目にある場合は、主記憶データテーブルのストア記録を削除する。
この手順により1つの処理に関する依存処理と独立処理解析が終了する。この後、評価対象処理に後続の処理があるか判断して(1202)、後続の処理がある場合には、次の1つの処理の解析(1203)へと続ける。1202で後続の処理が無くなった段階で、処理の解析を終了する(1209)。
図12の依存処理と独立処理の解析に使用した処理内容テーブルの例を図13に示す。解析した処理毎に識別番号として処理番号1301をつける。処理の項目1302として、演算の種類、プロセッサ間の通信関数名、ファイルの入出力を記述する。この処理項目の内容でデータの依存性の有無を1303に記述する。また、処理を実行する際に使用する変数名1304、依存のある変数名1305、処理を実行する際の演算量[Flop]1306、並列化方法として演算負荷均等並列化法を優先するか主記憶アクセス削減並列化法を優先するのかを1307に記述する。表の各項目1301〜1307の内容は、図12の1205、1206、1207、1210、1211、1212の中で求める。
図12の依存処理と独立処理の解析に使用した再利用データテーブルの例を図14に示す。このテーブルでは、図13の処理内容テーブルで割付けた処理番号1301毎に区別して処理番号1401を管理する。同じ処理番号1401の中に複数の読み込みデータと書込みデータがあり区別する必要があるため、補助番号1402で区別する。このほかに再利用データテーブルには、再利用変数名1403、変数のデータ長[Byte]1404、要素数1405、各要素の間隔を示すストライド幅[Byte]1406、一度使ってから再利用するまでのデータ間隔を示す再利用間隔[Byte]1407を記載する。
図12の依存処理と独立処理の解析に使用した主記憶データテーブルの例を図15に示す。このテーブルでは、図13の処理内容テーブルで割り付けた処理番号1301毎に区別して処理番号1501を管理する。同じ処理番号1501の中に複数の読み込みデータと書込みデータがあり区別する必要があるため、補助番号1502で区別する。主記憶データテーブルにはこの他、主記憶引用変数名1503、変数のデータ長[Byte]1504、変数の要素数1505、各要素の間隔を示すストライド幅[Byte]1506、読み込みデータと書き出しデータの区別1507を記載する。
図12では処理間に依存がある際に、処理間のデータの再利用性を解析した。ただし、処理間に依存関係が無く、引用するデータが同じである場合にも再利用データ(即ち、例えば図7のソースコード701の例では、d(i)の演算時に用いているx(i)に該当)となるので、図16の手順で再利用データの調査を行う。図16において、まず、評価対象となる処理ループを入力する(1601)。評価対象の処理に後続処理があるのか判断をして(1602)、無ければ再利用データの解析処理を終了する(1603)。1602の判断で後続の処理がある場合、後続処理を1つ取り出して評価対象とする。評価対象の引用データがそれ以前の処理で利用したデータであるのか判断をする(1604)。
引用データが以前の処理で使われていない場合、主記憶データテーブルに登録していないときは、登録して(1605)、後続の処理の評価(1602)に移る。引用データが以前の処理に使われている場合、再利用する引用データが再利用データテーブルに登録済みか判断する(1606)。登録済みであれば後続処理の評価(1602)に戻る。登録されていない場合、主記憶データテーブルに記録されているのか確認する(1607)。主記憶データテーブルに記録されていなければ、再利用データテーブルへ登録して(1609)、後続の処理の評価(1602)に戻る。主記憶データテーブルへの確認(1607)で登録されていれば、主記憶データテーブルの登録を削除してから(1608)、再利用データテーブルへ登録して(1609)、後続の処理の評価(1602)に戻る。この操作を、評価対象の処理について実行して、図14の再利用データテーブル及び図15の主記憶データテーブルを作成する。
図4において、前述したような手順で処理内容テーブル414、再利用データテーブル415、主記憶データテーブル416が作成されると、その後、並列化方法評価部409による処理が実行される。図17に、並列化方法評価部の詳細な評価手順を示す。図17に示すように、並列化方法評価部409は、まず、ユーザによって並列化コード生成方針(1702)が入力され、その後、評価対象がループ処理だけしか含まないか判断する(1703)。ループ処理しか含まないときは、図18で後述するようなキャッシュメモリデータの再利用性が無い場合のコード生成解析(1704a)を行い、この結果によって主記憶アクセス削減並列化法の解析を行うか演算負荷均等並列化法の解析を行うかを選択する(1704b)。一方、ループ処理以外の処理を含むときは、キャッシュメモリ上のデータの再利用だけではなく、処理の分割も考慮する必要があるため、1704a,bの処理を実施せずに1705の処理に移行する。
次に、1703において評価対象にループ処理以外の処理が含まれる場合、または1704bにおいてキャッシュメモリデータの再利用性がある場合は、1702で入力された並列化コードの生成方針が「data」であるのか判定する(1705)。「data」である場合は、主記憶アクセス削減並列化法の解析(1706)を実施する。その後、演算負荷均等並列化法の解析(1707)と、実行サイクル数が最短となるコード生成の解析(1708)を実施する。一方、1705の並列化方針の判定で「data」では無かった場合、または1704bでキャッシュメモリデータの再利用性が無いと判定された場合は、演算負荷均等並列化法の解析(1707)を行い、演算負荷均等並列化コードの生成(1709)に処理を移す。なお、1708および1709の処理は、図4の最適化コード生成部410の処理に相当する。
以下では、データ再利用性の無い場合のコードの生成解析(1704a)を図18で、主記憶アクセス削減並列化法の解析(1706)を図20で、演算負荷均等並列化法の解析(1707)を図21で、実行サイクル数が最短となるコード生成の解析(1708)を図22で説明する。
図18に、評価対象処理ループを基に、データ再利用性の無い場合のコード解析の手順を示す。評価対象処理ループの入力(1801)の後、計算機条件の入力(1802)、再利用データテーブルの入力(1803)を行う。この計算機条件入力(1802)で使用する入力内容の例を図19に示す。テーブルの項目としては、レジスタ数、プロセッサ数、独立キャッシュ容量、共有キャッシュ容量、キャッシュメモリからのロードコスト、主記憶からのロードコスト、主記憶からのストアコスト、同期取得コスト、他がある。
次いで、図18において、再利用データテーブルに記載されている変数の再利用間隔(図14の1407)とキャッシュメモリの容量を比較する(1804)。全ての再利用データの再利用間隔とキャッシュメモリの容量の比較(1805)の結果、キャッシュメモリ容量よりも再利用間隔が大きい場合、キャッシュメモリ上のデータの再利用性がないため、図10で述べたようなキャッシュデータの再利用性を高めるような処理の分割(セクション分割)を検討する必要がある。そこで、各CPUの処理分割テーブルの生成(1806)を行って、主記憶アクセス削減並列化法を選択する(1807)。各CPUの処理分割テーブルは、各プロセッサが実行するループ制御変数の範囲と処理内容が記録され、並列コード生成の基になる。実際のコード生成の処理に関しては、従来技術を使用する。従来技術として例えば、非特許文献1、特許文献2に記載された技術が知られている。
全ての再利用データの再利用間隔とキャッシュメモリの容量の比較(1805)において、キャッシュメモリ容量の方が大きい場合、再利用データテーブルの変数量と再利用間隔をレジスタ数と比較して(1808)、変数量がレジスタ数よりも小さい場合、再利用データをレジスタ割当てるようにブロック化することが可能である(1809)。このときは、キャッシュメモリ上のデータの再利用ではなく、レジスタ上のデータの再利用となり、主記憶アクセス削減並列化法を適用してもキャッシュメモリのデータの再利用性が変化しない。そこで、各CPUの処理分割テーブルの作成を行い(1810)、演算負荷均等並列化法の選択を行う(1811)。
一方、再利用データテーブルの変数量と再利用間隔がレジスタ容量よりも大きいときは、主記憶アクセス削減並列化法の適用の評価をするため、図13に示した処理内容テーブルの入力(1812)を行い、処理内容の評価をする。処理数と使用するプロセッサ数を比較して処理数が多い場合は、各処理を適宜複数のプロセッサに振り分けていく主記憶アクセス削減並列化法の適用効果が見込めるため、主記憶アクセス削減並列化法を選択する(1817)。また、依存処理、独立処理数がプロセッサ数よりも少ない場合でも、制御変数分割と処理分割の併用を判断して(1814)、併用できる場合は主記憶アクセス削減並列化法を選択する(1817)。制御変数分割と処理分割の併用を判断して(1814)、併用ができない場合、図10のように各プロセッサに処理内容を振り分ける並列化方法が適用できないことになる。そこで、各CPUの処理分割テーブルの生成を行い(1815)、演算負荷均等並列化法の選択を行う(1816)。
図20に、図17の主記憶アクセス削減並列化法の解析(1706)の詳細手順を示す。図18の解析の結果、主記憶アクセス削減コード生成の解析の開始に移る(2001)。図20の解析内容を大まかに説明すると、まず、依存のある処理を1プロセッサに割り当て、他の処理を残りのプロセッサに割り当て、処理と主記憶アクセスの負荷が均等になるようにして、実行に要するサイクル数を求める。その後、依存のある処理を割り当てるプロセッサ数を増やしながら、実行に要するサイクル数を求める。この操作を、依存のある処理の数とプロセッサの数の内、小さい方の数だけ繰り返して、処理サイクル数の最小値とそれを実現する処理分割法を求める。
以下、図20の解析内容の詳細を説明するにあたり、まずは、図29を用いて図20の解析内容の具体的なイメージを説明し、その後に図20の詳細な説明を行う。図29は、図20の補足図であり、図20の処理内で生成される各CPUの処理分割テーブルの一例を示す図である。処理分割テーブルは、例えば図13に示した処理内容テーブル内の複数の処理番号にそれぞれ対応する複数の処理を、各CPU毎に分割したようなものである。図29の例では、処理11、処理12、処理13、処理14に演算の依存があるものとする。最初の段階では、CPU0においてこの依存のある処理11〜処理14を全て実行しており、これらの実行サイクル数を図20の処理で算出した結果が150となっている。
次に、この実行サイクル数を更に短くするため、CPU1に処理12を分割する。これに伴いCPU0とCPU1の間で同期を取る処理が加わる(図29の「同期(0,1)」)。この場合に算出された実行サイクル数は130である。更に実行サイクル数を短くするためCPU2に処理13を分担する。これに伴いCPU0とCPU2の間で同期を取る処理が加わる(図29中の「同期(0,2)」)。この場合に算出された実行サイクル数は120である。このようにして、実行サイクル数が最小となる(この場合は120)となる処理分割方法が決定され、これに基づいて実際のコードが生成される。
図20において、具体的には、まず、依存のある処理を1プロセッサに割り当て(2002)、独立な処理を残りのプロセッサに割り当て(2003)、分割方法を各CPUの処理分割テーブルに記録する(2004a)。この処理分割テーブルでは、各プロセッサの識別番号毎にそれぞれが実行する処理内容が記述される。続いて、再利用データテーブルと主記憶データテーブルを更新する(2004b)。すなわち、処理の分割によって、再利用データテーブル内の再利用間隔1407が変わることがあり、これに応じて主記憶データテーブルにおける主記憶引用変数名1503も変わることがあるため、これらの見直しを行う。その後、処理内容テーブルや処理分割テーブルを参照して、各プロセッサの演算量からそれに要する演算サイクル数を算出する(2005)。処理の分割方法毎の実行サイクル数を変数として、2005で算出した演算サイクル数を代入する(2006)。
次いで、依存処理を実行するときのプロセッサ間の同期回数を算出する(2007)。依存処理を1プロセッサで実行するときにはプロセッサ間の同期は0回であるが、依存処理を複数のプロセッサに割り当てて実行する時には、処理の順番を保障するため、プロセッサ間の同期が必要になる。同期は依存処理を担当したプロセッサ間でのみ取得すればよいため、同期を取るプロセッサの識別番号を求めて、各CPUの処理分割テーブルに記録しておく。2007で求めた同期回数に図19の計算機条件に記載された同期取得コストをかけて、同期実行サイクル数を算出する(2008)。ここで求めた同期実行サイクル数を実行サイクル数に足しこむ(2009)。
続いて、処理で使用するデータのアクセスサイクル数を求める。再利用データテーブルに登録された変数を使った処理があるか判断する(2010)。この処理がある場合は、計算機のキャッシュメモリ容量が再利用データテーブルの1つの変数の再利用間隔よりも大きいのか判断して(2011)、データ量のカウントをする。キャッシュメモリ容量の方が再利用間隔よりも小さいときは、この変数はキャッシュメモリからデータが溢れてしまい、再利用する時には主記憶からデータを読み込むため、主記憶アクセスデータ量としてカウントアップする(2012)。その後、再利用データテーブルに登録された次の変数があるのか判断する(2010)。
また、2011でキャッシュメモリ容量よりも再利用データテーブルの再利用間隔が小さいと判断した場合は、変数を再利用するときにキャッシュメモリ上にあるため、キャッシュメモリアクセスデータ量としてカウントアップ(2013)した上で、2010の処理に移り、再利用データテーブルに登録された次の変数の評価を行う。2010で次に処理するべき変数がなくなった場合、主記憶アクセスサイクル数とキャッシュメモリアクセスサイクル数の算出をする。
具体的には、まず、主記憶データテーブルのデータ量を主記憶アクセスデータ量に足し込み(2014)、主記憶アクセスデータ量と主記憶ロードコストから主記憶アクセスサイクル数を算出して(2015)、実行サイクル数に主記憶アクセスサイクル数を足し込む(2016)。また、主記憶へのストアデータに関しては、図15からデータ量が求まっているため、図19の主記憶ストアコストを使って主記憶アクセスサイクル数が求められるので、このサイクル数を実行サイクル数に足し込む。次に、キャッシュメモリアクセスデータ量とキャッシュロードコストからキャッシュアクセスサイクル数を算出し(2017)、キャッシュアクセスサイクル数を実行サイクル数に足し込む(2018)。これにより、1つの分割方法に対する実行サイクル数が求まる。
その後、依存処理部分の処理を更に分割した場合の実行サイクル数の算出に移る。まず、依存処理部分の更なる分割が可能であるか判断をする(2019)。分割ができない場合は、これまで算出した実行サイクル数で最小となる値を算出して(2021)、主記憶アクセス削減並列化法の決定となる(2022)。2019で依存処理が更に分割できる場合、分割した依存処理を新たに割当てるプロセッサが存在するのかどうか判断する(2020)。割当てるプロセッサが存在しない場合は、2021の処理に移り、実行サイクル数で最小となる値を算出して、主記憶アクセス削減並列化法の決定となる(2022)。2020で分割を割当てるプロセッサが存在する場合は、依存のある処理を実行するプロセッサ数を1つ増やして(2023)、2003の処理に移行する。図20のプロセスを実行することにより、実行サイクル数が最短となる、主記憶アクセス削減並列化法を求める。
図21に、図17の演算負荷均等並列化法の解析(1707)の手順を示す。図21において、演算負荷均等化コード生成の解析を開始し(2101)、初めに、ループ制御変数分割を適用してプロセッサに処理の割付けを行う(2102)。この分割方法を各CPUの処理分割テーブルに記録する(2103a)。処理分割テーブルでは、各プロセッサの識別番号毎にそれぞれの処理内容を記述する。続いて、再利用データテーブルと主記憶データテーブルを更新する(2103b)。ただし、この2103bの処理は、通常、ループ制御変数の分割を行っても再利用データテーブル内の再利用間隔1407が変わることはないため、場合によっては不要である。
次に、演算サイクル数とプロセッサ間の同期サイクル数をそれぞれ求め合計値を実行サイクル数として算出する。具体的には、まず、処理内容テーブルや処理分割テーブルを参照して各プロセッサの演算量を求め、図19に記載の演算性能等から演算に要するサイクル数を求める(2104)。求めた演算サイクル数を実行サイクル数に代入する(2105)。処理を実行するときのプロセッサ間の同期回数を算出する(2106)。この同期回数に図19で登録された同期取得コストをかけて同期実行サイクル数を算出する(2107)。求めた同期実行サイクル数を実行サイクル数に足し込む(2108)。
続いて、処理で使用するデータのアクセス時間を求める。使用するデータに関して、キャッシュメモリから入出力する場合と主記憶から入出力する場合に分けて、そのアクセス時間を求める。初めに、再利用データテーブルに登録されたデータがあるのか判断する(2109)。登録されたデータがある場合には、登録の順番に従い変数1つずつの評価を行う。評価する変数に関して、キャッシュメモリの容量と変数の再利用間隔の比較を行う(2110)。キャッシュメモリの容量が再利用間隔よりも小さい場合、この変数は主記憶から入出力されるデータとなり、主記憶アクセスデータ量としてカウントアップする(2111)。その後、再利用データテーブルに登録された次の変数があるのか判断する(2109)。2110でキャッシュメモリの容量が再利用間隔よりも大きい場合、再利用データはキャッシュメモリから入出力されるため、キャッシュメモリアクセスデータ量としてカウントアップする(2112)。その後、再利用データテーブルに登録された次の変数があるのか判断する(2109)。このループ処理を繰り返すことにより再利用データテーブルに登録された全ての変数を1つずつ解析する。
全ての解析が終わった時点で、主記憶アクセスのサイクル数とキャッシュメモリアクセスのサイクル数を求める。具体的には、2109で次に解析すべき登録変数がなくなった場合に、主記憶データテーブルのデータ量を主記憶アクセスデータ量に足し込む(2113)。次に、主記憶アクセスデータ量と主記憶ロードコストから主記憶アクセスサイクル数を算出して(2114)、実行サイクル数に主記憶アクセスサイクル数を足し込む(2115)。また、主記憶へのストアデータに関しては、図15からデータ量が求まっているため、図19の主記憶ストアコストを使って主記憶アクセスサイクル数が求められるので、このサイクル数を実行サイクル数に足し込む。
キャッシュメモリアクセスに関しては、キャッシュメモリアクセスデータ量とキャッシュメモリロードコストからキャッシュアクセスサイクル数を算出して(2116)、キャッシュアクセスサイクル数を実行サイクル数に足し込む(2117)。これらの手順により、各CPUの処理分割テーブルと実行サイクル数が求まり、演算負荷均等並列化法の分割法とそれに対応する実行サイクルの決定となる(2118)。
図22に、図17の実行サイクル数が最短のコード生成の解析(1708)の詳細手順を示す。図22の並列化法による実行サイクル数の評価(2201)で、図20で求めた主記憶アクセス削減並列化法のサイクル数(2202)と図21で求めた演算負荷均等並列化法のサイクル数(2203)を入力する。演算負荷均等並列化法のサイクル数と主記憶アクセス削減並列化法のサイクル数を比較して(2204)、演算付加均等並列化法のサイクル数が小さい場合は、各CPUの処理分割テーブルとして、演算付加均等並列化法を適用したときに図21の2118で求まった各CPUの処理分割テーブルを記録して(2205)、演算負荷均等並列化コード生成の処理に移行する(2206)。各CPUの処理分割テーブルでは、実行するプロセッサ毎に識別番号を付けて、各プロセッサが行う処理を記録する。そのため、プロセッサ毎に違う処理をするときには、コード生成の段階で識別番号に応じた条件分岐を埋め込むことにより、制御できる。
一方、2204において、主記憶アクセス削減並列化法の実行サイクル数の方が小さい場合は、各CPUの処理分割テーブルに主記憶アクセス削減並列化法の分割を記録してから(2207)、主記憶アクセス削減並列化コードの生成処理に移行する(2208)。この場合も、各CPUの処理分割テーブルでは、実行するプロセッサ毎に識別番号を付けて、各プロセッサが行う処理、及び特定のプロセッサで取得する同期処理を記録する。そのため、プロセッサ毎に違う処理をするときには、コード生成の段階で識別番号に応じた条件分岐を埋め込むことにより、制御できる。
前述した演算負荷均等並列化法の指針に沿った実際のコード生成方法または主記憶アクセス削減並列化法の指針にそった実際のコード生成方法は、特許文献2、非特許文献1、非特許文献3の方法が知られている。
以上、本実施の形態1による最適コード生成方法を用いることで、主記憶アクセス削減の観点と、プロセッサによる演算負荷均等の観点と、それらの組合せを考慮して、実際の実行サイクル時間を最短となる最適な並列コードを生成できる。そして、これによって、特に複数のSIMD型またはベクトル型プロセッサの実行効率を高めることが可能となる。
(実施の形態2)
本実施の形態2では、前述した実施の形態1の図1でCPUが共有キャッシュを備えない場合のコード生成方法の一例を示す。図23は、本発明の実施の形態2によるコード生成方法において、その生成されたコードを用いて制御を実行する計算機システムの一例を示した構成図である。図23の計算機システムは、図1の計算機システムから共有キャッシュを省いた構成となっており、計算ノード群2305の中で各プロセッサ(CPU)2306に共有メモリ2307が接続された構成となっている。
このように、複数のプロセッサ間に共有キャッシュを備えていない場合でも、実施の形態1と同様に2種類の並列化法がある。例えば図6の606で「calculation」を選択した場合は、ループ制御変数を分割する演算付加均等並列化法が適用され、「data」を選択した場合は、通信関数や配列データの読み込みも分割する主記憶アクセス削減並列化法が適用される。実施の形態1との違いは、キャッシュメモリが無いため、キャッシュメモリアクセスサイクル数の算出が不要になることである。この算出に関与する処理は、図4の並列化方法評価部409である。図17に示した並列化方法評価部409の手順でキャッシュメモリの評価に関係する部分は、主記憶アクセス削減並列化方法の解析(1706)と演算負荷均等並列化法の解析(1707)である。
図24にキャッシュメモリの評価をしない場合の主記憶アクセス削減並列化法の解析手順を示す。図24の2401〜2409は、分割した演算のサイクル数とプロセッサ間のサイクル数の算出であり、実施の形態1で示したキャッシュメモリの評価を含む図20の2001〜2009とほぼ同様である。ただし、キャッシュメモリが存在しないため、図20の2004bにおける再利用データテーブルおよび主記憶データテーブルの更新処理が不要となっている点が異なっている。
次に、主記憶アクセスのサイクル数の算出を行う。キャッシュメモリを搭載していない計算機システムの場合は、処理に必要な全てのデータを主記憶へのアクセスで得るため、主記憶データテーブルと再利用データテーブルのデータ量の合計を主記憶アクセスデータ量とする(2410)。主記憶アクセスデータ量と主記憶ロードコストから主記憶アクセスサイクル数を算出する(2411)。この主記憶アクセスサイクル数を実行サイクル数に足し込む(2412)。また、主記憶へのストアデータに関しては、図15からデータ量が求まっており、図19の主記憶ストアコストを使って主記憶アクセスサイクル数が求められるので、このサイクル数を実行サイクル数に足し込む。これにより、1つの分割法による全体の実行サイクル数が求められる。この後、依存処理部を他のプロセッサに分割して最適な分割方法を求める。このときの手順である2413〜2417は、キャッシュメモリを備えた場合の図20の2019〜2023と同じである。
図25にキャッシュメモリを搭載しない計算機システムの演算負荷均等並列化法の解析手順を示す。図25の2501〜2508は、分割した演算のサイクル数とプロセッサ間のサイクル数の算出であり、実施の形態1に示したキャッシュメモリの評価を含む図21の2101〜2108とほぼ同様である。ただし、キャッシュメモリが存在しないため、図21の2103bにおける再利用データテーブルおよび主記憶データテーブルの更新処理が不要となっている点が異なっている。
次に、主記憶アクセスのサイクル数の算出を行う。キャッシュメモリを搭載していない計算機システムの場合は、処理に必要な全てのデータを主記憶へのアクセスで得るため、主記憶データテーブルと再利用データテーブルのデータ量の合計を主記憶アクセスデータ量とする(2509)。主記憶アクセスデータ量と主記憶ロードコストから主記憶アクセスサイクル数を算出する(2510)。主記憶アクセスサイクル数を実行サイクル数に足し込む(2511)。主記憶へのストアデータに関しては、図15からデータ量が求まっており、図19の主記憶ストアコストを使って主記憶アクセスサイクル数が求められるので、このサイクル数を実行サイクル数に足し込む。これにより、演算負荷均等並列化法の分割法と実行サイクル数を決める(2512)。この後に実行される、図17の実行サイクル数が最短のコード生成の解析(1708)は、キャッシュメモリを備えている実施の形態1の場合と同様に図22の手順に従って処理を行う。
以上、本実施の形態2による最適コード生成方法を用いることで、CPUが共有キャッシュを備えない場合においても実行サイクル時間が最短となる最適コードを生成可能となる。
(実施の形態3)
本実施の形態2では、前述した実施の形態1の図7でソースコード701のループ制御変数が定数ではなく変数で与えられている場合のコード生成方法の一例を示す。図26は、本発明の実施の形態3によるコード生成方法において、その評価対象となるソースコードの一例を示す図である。図26に示すソースコード2601は、図7のソースコード701において定数となっているループ制御変数i=1〜400が、変数i=m〜nで与えられている。
このような場合は、図12における依存処理と独立処理の解析及びデータ再利用性の解析の手順と、図16における利用データの再利用性の解析手順はデータ量を変数のまま解析する。図14の再利用データテーブルの例と図15の主記憶データテーブルの例でデータ量、ストライド幅、再利用間隔が未定の場合はループ制御変数に依存した式で表す。図17の並列化方法の評価の際、ループ制御変数の値により、実行サイクル数が最短となる並列化方法が変わる場合には、ループ制御変数の値による条件分岐を付けて、複数の並列コードを生成する。例えば図26の例において、ループ制御変数m,nの値が実行時に決められるものとし、この場合における生成コードの例を図27に示す。
図27に示す生成コードは、コードを計算機上で実行する時に決まるループ制御変数mとnの値によって、並列化法1(主記憶アクセス削減並列化法)2701、並列化法2(主記憶アクセス削減並列化法)2702、並列化3(演算負荷均等並列化法)を切り替えて実行するものとなっている。そのため、コンパイラ等によるコード生成の際は、従来のように1つの並列コードを生成するのではなく、対応する並列コードを複数生成することになる。そして、計算機システムは、このような複数の並列コードをメモリ上に配置し、実行時に動的に算出されたループ制御変数の値を判断して、その後に実行する並列コードを適宜選択するような動作を行う。
以上、本実施の形態3による最適コード生成方法を用いることで、ループ制御変数の値が動的に変更する場合であっても、実行サイクル時間が最短となる最適コードを生成することが可能となる。
以上、本発明者よりなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
本発明によれば、キャッシュメモリまたは主記憶を共有した複数のプロセッサから構成される計算機に対して、各プロセッサの負荷を均等に分割する並列化と主記憶へのアクセスを削減する並列化の中から最も実行時間が短くして実行効率の高い並列化方法のコードを生成できる。並列処理に適したコンパイラまたはコード生成に適用できる。
本発明の実施の形態1によるコード生成方法において、その生成されたコードを用いて制御を実行する計算機システムの一例を示した構成図である。 演算の並列化の一例を示す説明図である。 本発明の実施の形態1によるコード生成方法において、そのコードを生成する計算機システムの一例を示した構成図である。 図3の計算機システムにおいて、その並列化コードを生成する機能の詳細な一例を示した構成図である。 コンパイルオプションによって並列化方針の指示を与えた場合の具体例を示す説明図である。 ソースコードに対して並列化方針の指示を与えた場合の具体例を示す説明図である。 ソースコードから生成される中間語の具体例を示す説明図である。 図7の中間語に対して演算並列化を行った場合の具体例を示す説明図である。 ベクトルプロセッサを対象に、演算負荷均等並列化法を用いて生成された中間語の具体例を示す説明図である。 ベクトルプロセッサを対象に、主記憶アクセス削減並列化法を用いて生成された中間語の具体例を示す説明図である。 図4におけるループ演算切り出し部の詳細な処理内容の一例を示すフロー図である。 図4における依存処理と独立処理解析部、データ再利用性解析部及び主記憶データ引用解析部の詳細な処理内容の一例を示すフロー図である。 図4における処理内容テーブルの構成例を示す説明図である。 図4における再利用データテーブルの構成例を示す説明図である。 図4における主記憶データテーブルの構成例を示す説明図である。 図4のデータ再利用性解析部において、図12に加えて行われる詳細な処理内容の一例を示すフロー図である。 図4の並列化方法評価部の詳細な処理内容の一例を示すフロー図である。 図17のフローにおいて、キャッシュメモリ上のデータ再利用性が無い場合のコード生成手順の一例を示すフロー図である。 図4における計算機条件入力部の詳細な一例を示す説明図である。 図17における主記憶アクセス削減並列化法の解析を行う際の詳細な処理内容の一例を示すフロー図である。 図17における演算負荷均等並列化法の解析を行う際の詳細な処理内容の一例を示すフロー図である。 図17における実行サイクル数が最短のコード生成の解析を行う際の詳細な処理内容の一例を示すフロー図である。 本発明の実施の形態2によるコード生成方法において、その生成されたコードを用いて制御を実行する計算機システムの一例を示した構成図である。 図23の計算機システムを対象として主記憶アクセス削減並列化法の解析を行う際の詳細な処理内容の一例を示すフロー図である。 図23の計算機システムを対象として演算負荷均等並列化法の解析を行う際の詳細な処理内容の一例を示すフロー図である。 本発明の実施の形態3によるコード生成方法において、その評価対象となるソースコードの一例を示す図である。 本発明の実施の形態3によるコード生成方法において、その生成された並列コードの一例を示す図である。 図11の補足図である。 図20の処理内で生成される各CPUの処理分割テーブルの一例を示す図である。
符号の説明
101,301,2301 ディスプレイ装置
102,2302 端末装置
103,302,2303 キーボード
104,2304 外部記憶装置
105,2305 計算ノード群
109,305,2309 外部記憶装置
108,304 主記憶装置
107 キャッシュメモリ
106,303,2306 プロセッサ(CPU)
301 ディスプレイ装置
302 キーボード
314,401,701,2601 ソースコード
315,411 並列コード
306,402 構文解析部
307,403 中間コードの生成部
308,404 解析部
309,414 処理内容テーブル
310,415 再利用データテーブル
311,416 主記憶データテーブル
312,417 処理分割テーブル
313 最適化コード生成部
400 コード変換部(コンパイラ)
405 ループ演算切り出し部
406 依存処理と独立処理解析部
407 データの再利用性解析部
408 主記憶データ引用解析部
409 並列化方法評価部
412 並列化コード生成方針
413 計算機条件入力部
410 最適化コード生成部
702 中間コード
2307 共有メモリ

Claims (13)

  1. 主記憶またはキャッシュメモリを共有する複数のプロセッサから構成される計算機に対して、前記主記憶から前記複数のプロセッサへのデータ転送量を削減しながら前記複数のプロセッサの実行効率を高めることを目的として、ソースコードから前記複数のプロセッサが処理をする最適な並列コードをコンピュータシステムを用いて生成する方法であって、
    前記コンピュータシステムは、
    前記ソースコードの処理内容を解析して、前記複数のプロセッサの演算量および演算順序依存関係と、前記キャッシュメモリのデータの再利用性と、前記主記憶または前記キャッシュメモリと前記複数のプロセッサとの間のロードデータ量およびストアデータ量とを分析する第1ステップと、
    前記計算機の性能としてユーザによって入力された、前記複数のプロセッサの数量、前記主記憶のアクセス時間または前記キャッシュメモリのアクセス時間、レジスタ数、前記キャッシュメモリの容量、前記複数のプロセッサ間の同期の取得方法と同期にかかる時間を保持する第2ステップと、
    前記ソースコードの処理内容を前記複数のプロセッサに分割し、この分割されたソースコードを前記複数のプロセッサで実行した場合の実行サイクル時間を前記第1ステップおよび前記第2ステップに基づいて見積りながら、前記実行サイクル時間が最短となる並列コードを生成する第3ステップとを実行することを特徴とする最適化コードの生成方法。
  2. 請求項1記載の最適化コードの生成方法において、
    前記複数のプロセッサのそれぞれは、SIMD型またはベクトル型プロセッサであることを特徴とする最適化コードの生成方法。
  3. 請求項1または2記載の最適化コードの生成方法において、
    前記第3ステップは、前記ソースコード内に含まれる複数の処理に対して、前記キャッシュメモリのデータの再利用性を高めると共に前記複数のプロセッサから前記主記憶に向けたアクセス回数を少なくする第1方式の分割を行うことを特徴とする最適化コードの生成方法。
  4. 請求項3記載の最適化コードの生成方法において、
    前記第3ステップは、更に、前記ソースコード内に含まれる複数の処理に対して、前記複数のプロセッサによる演算処理量を均等にする第2方式の分割を行うことを特徴とする最適化コードの生成方法。
  5. 請求項4記載の最適化コードの生成方法において、
    前記第3ステップは、前記第1方式の分割が行われた第1ソースコードに対して更に前記第2方式の分割を行うことで第2ソースコードを生成し、前記第1ソースコードと前記第2ソースコードの前記実行サイクル時間を比較して、いずれか実行サイクル時間が短くなる方のソースコードに対応した並列コードを生成することを特徴とする最適化コードの生成方法。
  6. 請求項4記載の最適化コードの生成方法において、
    前記コンピュータシステムは、更に、ユーザによって予め指定された、前記第1方式の分割を行うか前記第2方式の分割を行うかの選択を保持する第4ステップを実行することを特徴とする最適化コードの生成方法。
  7. 請求項6記載の最適化コードの生成方法において、
    前記第4ステップは、前記ユーザが前記ソースコード内に、並列化対象範囲と、前記並列化対象範囲に対して前記第1方式の分割を適用するか前記第2方式の分割を適用するかを記載することで実現されることを特徴とする最適化コードの生成方法。
  8. 請求項6記載の最適化コードの生成方法において、
    前記第4ステップは、前記ユーザがコンパイラコマンドライン上で、ファイル名及び行数を含む並列化対象範囲と、前記並列化対象範囲に対して前記第1方式の分割を適用するか前記第2方式の分割を適用するかを指定することで実現されることを特徴とする最適化コードの生成方法。
  9. 請求項4記載の最適化コードの生成方法において、
    前記第1ステップによって、前記ソースコードに含まれる演算ループのループ制御変数が前記計算機上で並列コードを実行するときまで未確定となることが判明した場合、
    前記第3ステップは、前記ループ制御変数の大きさを変更しながら、前記第1方式の分割を適用した場合の前記実行サイクル時間と前記第2方式の分割を適用した場合の前記実行サイクル時間を見積り、前記ループ制御変数の大きさ毎に、前記第1方式の分割か前記第2方式の分割かいずれか前記実行サイクル時間が短い方の方式を選択できるように、前記ループ制御変数の大きさに応じて適用する方式を切り替えるための条件分岐を並列コードに埋め込むことを特徴とする最適化コードの生成方法。
  10. コンピュータシステムによって実現され、主記憶またはキャッシュメモリを共有する複数のプロセッサから構成される計算機に対して、前記主記憶から前記複数のプロセッサへのデータ転送量を削減しながら前記複数のプロセッサの実行効率を高めることを目的として、ソースコードから前記複数のプロセッサが処理をする最適な並列コードを生成するコンパイル装置であって、
    前記ソースコードの処理内容を解析して、前記複数のプロセッサの演算量および演算順序依存関係と、前記キャッシュメモリのデータの再利用性と、前記主記憶または前記キャッシュメモリと前記複数のプロセッサとの間のロードデータ量およびストアデータ量とを分析する第1機能と、
    前記計算機の性能としてユーザによって入力された、前記複数のプロセッサの数量、前記主記憶のアクセス時間または前記キャッシュメモリのアクセス時間、レジスタ数、前記キャッシュメモリの容量、前記複数のプロセッサ間の同期の取得方法と同期にかかる時間を保持する第2機能と、
    前記ソースコードの処理内容を前記複数のプロセッサに分割し、この分割されたソースコードを前記複数のプロセッサで実行した場合の実行サイクル時間を前記第1機能および前記第2機能に基づいて見積りながら、前記実行サイクル時間が最短となる並列コードを生成する第3機能とを有することを特徴とするコンパイル装置。
  11. 請求項10記載のコンパイル装置において、
    前記第3機能は、前記ソースコード内に含まれる複数の処理に対して、前記キャッシュメモリのデータの再利用性を高めると共に前記複数のプロセッサから前記主記憶に向けたアクセス回数を少なくする第1方式の分割を行うことを特徴とするコンパイル装置。
  12. 請求項11記載のコンパイル装置において、
    前記第3機能は、更に、前記ソースコード内に含まれる複数の処理に対して、前記複数のプロセッサによる演算処理量を均等にする第2方式の分割を行うことを特徴とするコンパイル装置。
  13. 請求項12記載のコンパイル装置において、
    前記第3機能は、前記第1方式の分割が行われた第1ソースコードに対して更に前記第2方式の分割を行うことで第2ソースコードを生成し、前記第1ソースコードと前記第2ソースコードの前記実行サイクル時間を比較して、いずれか実行サイクル時間が短くなる方のソースコードに対応した並列コードを生成することを特徴とするコンパイル装置。
JP2007275886A 2007-10-24 2007-10-24 マルチプロセッサ向け最適コード生成方法及びコンパイル装置 Expired - Fee Related JP4339907B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2007275886A JP4339907B2 (ja) 2007-10-24 2007-10-24 マルチプロセッサ向け最適コード生成方法及びコンパイル装置
US12/068,421 US8296746B2 (en) 2007-10-24 2008-02-06 Optimum code generation method and compiler device for multiprocessor

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007275886A JP4339907B2 (ja) 2007-10-24 2007-10-24 マルチプロセッサ向け最適コード生成方法及びコンパイル装置

Publications (2)

Publication Number Publication Date
JP2009104422A JP2009104422A (ja) 2009-05-14
JP4339907B2 true JP4339907B2 (ja) 2009-10-07

Family

ID=40584573

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007275886A Expired - Fee Related JP4339907B2 (ja) 2007-10-24 2007-10-24 マルチプロセッサ向け最適コード生成方法及びコンパイル装置

Country Status (2)

Country Link
US (1) US8296746B2 (ja)
JP (1) JP4339907B2 (ja)

Families Citing this family (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8509569B2 (en) * 2008-02-11 2013-08-13 Apple Inc. Optimization of image processing using multiple processing units
CN102144222B (zh) * 2008-07-02 2014-11-05 国立大学法人东京工业大学 执行时间估计方法、执行时间估计程序以及执行时间估计装置
JP5148674B2 (ja) * 2010-09-27 2013-02-20 株式会社東芝 プログラム並列化装置およびプログラム
US9489183B2 (en) 2010-10-12 2016-11-08 Microsoft Technology Licensing, Llc Tile communication operator
US9430204B2 (en) 2010-11-19 2016-08-30 Microsoft Technology Licensing, Llc Read-only communication operator
US8479185B2 (en) * 2010-12-09 2013-07-02 Oracle International Corporation Method and system for utilizing parallelism across loops
US9507568B2 (en) 2010-12-09 2016-11-29 Microsoft Technology Licensing, Llc Nested communication operator
JP5810316B2 (ja) * 2010-12-21 2015-11-11 パナソニックIpマネジメント株式会社 コンパイル装置、コンパイルプログラム及びループ並列化方法
US9395957B2 (en) 2010-12-22 2016-07-19 Microsoft Technology Licensing, Llc Agile communication operator
US8516197B2 (en) 2011-02-11 2013-08-20 International Business Machines Corporation Write-through cache optimized for dependence-free parallel regions
US8752036B2 (en) * 2011-10-31 2014-06-10 Oracle International Corporation Throughput-aware software pipelining for highly multi-threaded systems
US20140068581A1 (en) * 2012-08-30 2014-03-06 International Business Machines Corporation Optimized division of work among processors in a heterogeneous processing system
US9244677B2 (en) * 2012-09-28 2016-01-26 Intel Corporation Loop vectorization methods and apparatus
US10133557B1 (en) * 2013-01-11 2018-11-20 Mentor Graphics Corporation Modifying code to reduce redundant or unnecessary power usage
WO2014115613A1 (ja) * 2013-01-23 2014-07-31 学校法人 早稲田大学 並列性の抽出方法及びプログラムの作成方法
EP2972781A4 (en) 2013-03-15 2016-10-19 Intel Corp METHOD AND SYSTEMS FOR VECTORIZING SCALAR COMPUTER PROGRAM GRINDINGS WITH GRINDING DEPENDENCIES
JP6160232B2 (ja) 2013-05-17 2017-07-12 富士通株式会社 コンパイルプログラムおよびコンパイル方法
US9698791B2 (en) 2013-11-15 2017-07-04 Scientific Concepts International Corporation Programmable forwarding plane
US10326448B2 (en) 2013-11-15 2019-06-18 Scientific Concepts International Corporation Code partitioning for the array of devices
US9294097B1 (en) 2013-11-15 2016-03-22 Scientific Concepts International Corporation Device array topology configuration and source code partitioning for device arrays
JP6201788B2 (ja) 2014-01-29 2017-09-27 富士通株式会社 ループ分割検出プログラム及びループ分割検出方法
WO2018115970A1 (en) * 2016-12-19 2018-06-28 (Un)Manned N.V. Method and apparatus for real-time control loop application execution from a high-level description
JP2021005287A (ja) 2019-06-27 2021-01-14 富士通株式会社 情報処理装置及び演算プログラム
US20220019491A1 (en) * 2020-07-17 2022-01-20 Preferred Networks, Inc. Method of determining split scheme, determining device, and computing system
JP2023076223A (ja) 2021-11-22 2023-06-01 富士通株式会社 分割プログラムおよび分割方法
JP2023084609A (ja) * 2021-12-07 2023-06-19 富士通株式会社 変換プログラムおよび変換方法

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2109799A1 (en) * 1991-05-24 1992-12-10 Daniel Mark Nosenchuck Optimizing compiler for computers
US6226790B1 (en) * 1997-02-28 2001-05-01 Silicon Graphics, Inc. Method for selecting optimal parameters for compiling source code
JP3729644B2 (ja) 1998-06-29 2005-12-21 株式会社日立製作所 ループ並列化方法
US7143401B2 (en) * 2000-02-17 2006-11-28 Elbrus International Single-chip multiprocessor with cycle-precise program scheduling of parallel execution
US7275242B2 (en) * 2002-10-04 2007-09-25 Hewlett-Packard Development Company, L.P. System and method for optimizing a program
US8276135B2 (en) * 2002-11-07 2012-09-25 Qst Holdings Llc Profiling of software and circuit designs utilizing data operation analyses
FR2865047B1 (fr) * 2004-01-14 2006-04-07 Commissariat Energie Atomique Systeme de generation automatique de codes optimises
US7765534B2 (en) * 2004-04-30 2010-07-27 International Business Machines Corporation Compiler with cache utilization optimizations
JP2006268070A (ja) 2005-03-22 2006-10-05 Hitachi Ltd 並列化コンパイル処理方法及び並列化されたオブジェクトコードを実行する並列計算機
US20060236310A1 (en) * 2005-04-19 2006-10-19 Domeika Max J Methods and apparatus to iteratively compile software to meet user-defined criteria
US8447580B2 (en) * 2005-05-31 2013-05-21 The Mathworks, Inc. Modeling of a multiprocessor system
KR100806274B1 (ko) * 2005-12-06 2008-02-22 한국전자통신연구원 멀티 쓰레디드 프로세서 기반의 병렬 시스템을 위한 적응형실행 방법
US8104030B2 (en) * 2005-12-21 2012-01-24 International Business Machines Corporation Mechanism to restrict parallelization of loops
US7765536B2 (en) * 2005-12-21 2010-07-27 Management Services Group, Inc. System and method for the distribution of a program among cooperating processors
JP4784827B2 (ja) * 2006-06-06 2011-10-05 学校法人早稲田大学 ヘテロジニアスマルチプロセッサ向けグローバルコンパイラ
US8136102B2 (en) * 2006-06-20 2012-03-13 Google Inc. Systems and methods for compiling an application for a parallel-processing computer system
JP4231516B2 (ja) * 2006-08-04 2009-03-04 株式会社日立製作所 実行コードの生成方法及びプログラム

Also Published As

Publication number Publication date
JP2009104422A (ja) 2009-05-14
US8296746B2 (en) 2012-10-23
US20090113404A1 (en) 2009-04-30

Similar Documents

Publication Publication Date Title
JP4339907B2 (ja) マルチプロセッサ向け最適コード生成方法及びコンパイル装置
JP6525286B2 (ja) プロセッサコア及びプロセッサシステム
JP4042604B2 (ja) プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
US6718541B2 (en) Register economy heuristic for a cycle driven multiple issue instruction scheduler
US9639371B2 (en) Solution to divergent branches in a SIMD core using hardware pointers
US8683468B2 (en) Automatic kernel migration for heterogeneous cores
JP2921190B2 (ja) 並列実行方式
US20050193359A1 (en) Method and apparatus for designing circuits using high-level synthesis
EP2951682B1 (en) Hardware and software solutions to divergent branches in a parallel pipeline
JP2014216021A (ja) バッチスレッド処理のためのプロセッサ、コード生成装置及びバッチスレッド処理方法
JP6492943B2 (ja) 計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム
JP3765923B2 (ja) ハードウェア合成方法およびハードウェア合成装置並びにハードウェア合成プログラムを記録した記録媒体
JP4830108B2 (ja) プログラム処理装置、プログラム処理方法、並列処理プログラム用コンパイラおよび並列処理プログラム用コンパイラを格納した記録媒体
US20050257200A1 (en) Generating code for a configurable microprocessor
KR102062208B1 (ko) 멀티스레드 프로그램 코드의 변환 장치 및 방법
JP2000284970A (ja) プログラム変換装置及びプロセッサ
US9383981B2 (en) Method and apparatus of instruction scheduling using software pipelining
JP5979965B2 (ja) 回路設計支援装置及び回路設計支援方法及びプログラム
JPH04293150A (ja) コンパイル方法
JP7115563B2 (ja) コンパイル装置、コンパイル方法、及び制御プログラム
JP7088276B1 (ja) コンパイル装置、コンパイル方法、及びコンパイルプログラム
US11675572B2 (en) Sharing data structures
EP4227795A1 (en) A computer-implemented method and a computer-readable medium
JP5821697B2 (ja) コンパイル方法、コンパイルプログラム及びコンパイル装置
JPH04252336A (ja) プログラム最適化処理装置

Legal Events

Date Code Title Description
TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20090609

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20090702

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120710

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130710

Year of fee payment: 4

LAPS Cancellation because of no payment of annual fees