JP2009140451A - コンパイラ装置、コンパイル方法およびそのプログラム - Google Patents

コンパイラ装置、コンパイル方法およびそのプログラム Download PDF

Info

Publication number
JP2009140451A
JP2009140451A JP2007319152A JP2007319152A JP2009140451A JP 2009140451 A JP2009140451 A JP 2009140451A JP 2007319152 A JP2007319152 A JP 2007319152A JP 2007319152 A JP2007319152 A JP 2007319152A JP 2009140451 A JP2009140451 A JP 2009140451A
Authority
JP
Japan
Prior art keywords
list structure
loop
structure loop
processing
cpus
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.)
Pending
Application number
JP2007319152A
Other languages
English (en)
Inventor
Rikika Wada
力佳 和田
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 JP2007319152A priority Critical patent/JP2009140451A/ja
Publication of JP2009140451A publication Critical patent/JP2009140451A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】リスト構造ループの処理を高速化することを課題とする。
【解決手段】本発明のコンパイラ装置は、原始プログラム108を記憶する補助記憶装置104と、補助記憶装置104に記憶された原始プログラム108を読み出してリスト構造ループを認識するリスト構造ループ解析部106と、各CPUに、リスト構造ループ内で各要素を辿った回数に基づいてリスト構造ループの制御文の処理を実行する要素を振り分けることにより、リスト構造ループの制御文の並列処理を行わせるリスト構造ループ処理部110を、目的プログラム109中に生成して、当該目的プログラム109を補助記憶装置104に記憶させるリスト構造ループ変形部107と、を備える。
【選択図】図1

Description

本発明は、プログラム中のループ(for文など)の処理を高速化するためのコンパイラに関し、特に、リスト構造(同じ型の複数の要素のそれぞれが次の要素へのポインタをメンバーに持つ構造)を持つデータ(以下、「リスト構造データ」と呼ぶ。)を扱うコンパイラによるループ(以下、「リスト構造ループ」と呼ぶ。)の処理の高速化技術に関する。
例えば、C言語では、リスト構造データを利用することができる。そして、従来のコンパイラでは、リスト構造ループを含む原始プログラムをコンパイルした場合、リスト構造ループに対して並列化が困難であるという問題点があった。その理由は、リスト構造データのある要素(データ)を取得するためには、前の要素が持つ次の要素へのポインタの値が必要であり、そのためリスト構造ループの繰り返し処理の間の依存関係を解決できなかったからである。
このため、従来は、プログラマ自身が原始プログラムを慎重にプログラミングし直して最適化を可能にする必要があった。
例えば、前記した依存関係の問題を解決し、リスト構造データの繰り返し処理を並列化できる既存の技術として、特許文献1に開示されている「コンパイラおよびリスト構造データを処理するループの高速化方法」では、リスト構造データの各要素のアドレスを作業配列に格納し、リスト構造ループを、作業配列を参照するループに置き換えることで、ループの並列化を実現している。
特開2003−337707号公報
しかしながら、特許文献1の技術では、実行時にリスト構造データの要素数に依存した作業配列を確保する必要があるので、事前に作業配列の確保することに伴うメモリ消費量の問題と、リスト構造データの各要素のアドレスを作業配列に格納することに伴う処理オーバーヘッドの問題がある。
本発明は、前記問題に鑑みてなされたものであり、リスト構造ループの処理を高速化することを課題とする。
本発明は、同じ型の複数の要素のそれぞれが次の要素へのポインタをメンバーに持つリスト構造データにおいてその要素ごとに処理を行うループであるリスト構造ループを有する原始プログラムから、複数のCPUを有する共有メモリ型並列計算機上で動作する共有メモリ向けの目的プログラムを生成するコンパイラ装置である。
コンパイラ装置は、前記原始プログラムを記憶する記憶装置と、前記記憶装置に記憶された原始プログラムを読み出して前記リスト構造ループを認識するリスト構造ループ解析部と、各前記CPUに、前記リスト構造ループ内で各前記要素を辿った回数に基づいて前記リスト構造ループの制御文の処理を実行する要素を振り分けることにより、前記リスト構造ループの制御文の並列処理を行わせるリスト構造ループ処理機能を、前記目的プログラム中に生成して、当該目的プログラムを前記記憶装置に記憶させるリスト構造ループ変形部と、を備える。
その他の手段については後記する。
本発明によれば、リスト構造ループの処理を高速化することができる。
以下、本発明によるリスト構造ループの処理の高速化方法を実施するための最良の形態(以下、「実施形態」と呼ぶ。)を、図面を参照(直接言及する図以外の図も適宜参照)して詳細に説明する。なお、本実施形態では、まず図1〜図9を参照して上位概念的内容を説明し、その後に図10A〜図15を参照してプログラムの具体例を踏まえた下位概念的内容を説明する。
また、本実施形態によるリスト構造ループの高速化方法が適用されたコンパイラは任意の計算機上に実装され、生成された目的プログラムは共有メモリ型並列計算機上で実行される。
図1は、本実施形態によるリスト構造ループの処理の高速化方法が適用されたコンパイラを含む計算機の構成を表す図の一例である。
計算機101は、メモリ等で実現される主記憶装置102、CPU(Central Processing Unit)103、HDD(Hard Disk Drive)等の装置で実現される補助記憶装置104(記憶装置)を有する。
CPU103が補助記憶装置104から主記憶装置102上にコンパイラ105を読み込み、CPU103がコンパイラ105を実行することで補助記憶装置104に保存された原始プログラム108を翻訳(コンパイル)し、共有メモリ型の並列計算機上で実行可能な目的プログラム109を生成する。原始プログラム108がリスト構造ループを含んでいる場合は、目的プログラム109中にリスト構造ループ処理部110(リスト構造ループ処理機能)が生成される。なお、以下において、動作主体のCPU103の記載を省略することがある。
コンパイラ105は、リスト構造ループ解析部106とリスト構造ループ変形部107とを含む。
リスト構造ループ解析部106は、入力として原始プログラム108を受け取る。リスト構造ループ解析部106は、入力された原始プログラム108からリスト構造ループを解析し、解析結果をリスト構造ループ変形部107に渡す。
リスト構造ループ変形部107は、リスト構造ループ解析部106の解析結果を受け取り、解析結果にリスト構造ループが含まれている場合、目的プログラム109中にリスト構造ループ処理部110を生成する。
図2は、本実施形態のコンパイラ105から生成された目的プログラム109を実行する時の共有メモリ型並列計算機201の構成を表す図の一例である。
共有メモリ型並列計算機201は、N個のCPU(CPU(0)〜(N−1))202と、いずれのCPU202からもアクセス可能な共有メモリである主記憶装置203を有し、CPU202が主記憶装置203上に目的プログラム109を読み込む。
なお、目的プログラム109は、リスト構造ループ変形部107により生成されたリスト構造ループ処理部110を含む。
リスト構造ループ処理部110は、並列化閾値決定部204(並列化閾値決定機能)、要素数判定部205(要素数判定機能)、リスト構造ループ並列処理部206(リスト構造ループ処理機能)、リスト構造ループ逐次処理部207(リスト構造ループ逐次処理機能)、ループ内処理長情報208、並列化オーバーヘッド情報209、実行時CPU情報テーブル210、並列化閾値情報211から構成される。
実行時CPU情報テーブル210は、CPU数212とCPU番号213から構成される。
並列化閾値決定部204は、目的プログラム109の実行時までに得られる情報をもとに、使用するCPU202の並列化によって性能向上を期待できるループ長の閾値を、リスト構造データの最小の要素数という形で求め、その値を並列化閾値情報211に設定する。なお、並列化閾値を求めるための計算式や必要となる情報の種類は、共有メモリ型並列計算機201が並列化を行う際のハードウェア特性に依存する。本実施形態では、並列化閾値を求めるために特定の計算式を使用しているが、これをハードウェア特性に合わせて変更してもよい。また、本実施形態では、入力としてループ内処理長情報208と並列化オーバーヘッド情報209と実行時CPU情報テーブル210とを使用するが、目的プログラム109の実行時までに得られる情報であれば、これ以外の情報を使用してもよい。
要素数判定部205は、リスト構造ループを実行する時の実際の要素数と、並列化閾値情報211に格納された要素数とを比較し、並列化による性能向上(効果)を期待できるどうかを判断する。
並列化の効果が期待できる場合、リスト構造ループ並列処理部206は、リスト構造ループを並列実行(並列処理)する。
並列化の効果が期待できない場合、リスト構造ループ逐次処理部207は、リスト構造ループを逐次実行(逐次処理)する。
ループ内処理長情報208には、共有メモリ型並列計算機201がリスト構造ループ内の処理を1回実行する時に必要な時間の長さが格納される。
並列化オーバーヘッド情報209には、共有メモリ型並列計算機201が並列実行を開始するために必要な処理時間の長さが格納される。
並列化閾値情報211には、並列化によって性能向上を期待できるループ長の閾値(要素数)が格納される。リスト構造ループを実行する時の実際の要素数が、並列化閾値情報211の値以上であれば、並列化による性能向上を期待できるとみなす。
CPU数212は、並列実行時に使用可能なCPU202の数を示す。
CPU番号213は、並列実行時にそれぞれのCPU202に割り当てられるID番号(連続番号)を示す。このテーブルの値は各CPU202がそれぞれに持ち、値は「0」〜「CPU数−1」の範囲であり、CPU202間で重複しない。
図3は、リスト構造ループ処理部110内の参照や設定の関係を表す図の一例である。
ループ内処理長情報208の値は、原始プログラム108のコンパイル時にリスト構造ループ変形部107によって設定され、並列化閾値決定部204から参照される。
並列化オーバーヘッド情報209の値は、原始プログラム108のコンパイル時にリスト構造ループ変形部107によって設定され、並列化閾値決定部204から参照される。
実行時CPU情報テーブル210の値は、目的プログラム109の実行時に共有メモリ型並列計算機201の並列プログラム実行部(不図示)によって設定され、内部のCPU数212が並列化閾値決定部204から参照され、また、内部のCPU数212およびCPU番号213がリスト構造ループ並列処理部206から参照される。
並列化閾値情報211の値は、並列化閾値決定部204によって設定され、要素数判定部205から参照される。
図4は、本実施形態のコンパイラ105の処理の流れを表す図の一例である。
処理402において、コンパイラ105は、リスト構造ループ解析部106を実行する。つまり、入力となる原始プログラム108を読み込み、リスト構造ループを解析して認識する。処理402の詳細は図5に記載する。
処理403において、コンパイラ105は、リスト構造ループ変形部107を実行する。つまり、リスト構造ループ解析部106の解析結果を受け取り、目的プログラム109中にリスト構造ループ処理部110を出力する。処理403の詳細は図6に記載する。
図5は、リスト構造ループ解析部106の処理の流れを表す図の一例である。
処理502において、リスト構造ループ解析部106は、原始プログラム108中のデータ宣言文を解析し、リスト構造データ型を認識する。具体的には、まず、処理502中の手順1にあるように、原始プログラム108中の全てのデータ宣言文を解析する。次に、処理502中の手順2にあるように、自分自身の型へのポインタを持つ型を見つけ出す。このようにして見つかったデータ型を、リスト構造データ型として認識する。
処理503において、リスト構造ループ解析部106は、原始プログラム108中のリスト構造データを利用したループ制御文を認識する。具体的には、まず、処理503中の手順1にあるように、原始プログラム108中の全てのループ制御文を解析する。次に、処理503中の手順2にあるように、「(1)ループの終了条件を、リスト構造データ型の変数の値で判定している」および「(2)ループの増分式で、リスト構造データ型を更新している」という条件を満たすループ制御文を見つけ出す。
処理504において、リスト構造ループ解析部106は、処理503で認識されたループ内の処理の依存関係を解析し、並列化可否を判断する。具体的には、処理504中の手順1にあるように、「ループ内の処理に、ループ間での依存関係が無い」および「ループ内で、リスト構造データの個数や並び順が変化しない」という条件を満たすとき、並列化可能と判断する。
リスト構造ループ解析部106においてこのようなループを解析できた場合、そのループが並列化できることをリスト構造ループ変形部107に通知する。
図6は、リスト構造ループ変形部107の処理の流れを表す図の一例である。
処理602において、リスト構造ループ変形部107は、並列処理のための各種情報を生成する。具体的には、まず、処理602中の手順1にあるように、ループ内処理長を計測し、ループ内処理長情報208を生成する。次に、処理602中の手順2にあるように、並列化オーバーヘッドを計測し、並列化オーバーヘッド情報209を生成する。最後に、処理602中の手順3にあるように、並列プログラム実行部が設定する実行時CPU情報テーブル210のための領域を生成する。
処理603において、リスト構造ループ変形部107は、並列化閾値決定部204を生成する。具体的には、処理603中の手順1にあるように、並列化閾値決定部204を呼び出し、結果を並列化閾値情報211に格納する処理を生成する。
処理604において、リスト構造ループ変形部107は、要素数判定部205を生成する。具体的には、まず、処理604中の手順1にあるように、要素数判定部205の内部で使用する要素数カウンタを生成する。次に、処理604中の手順2にあるように、原始プログラム108中のループ制御文の部分を複製する。さらに、処理604中の手順3にあるように、手順2で生成されたループ制御文のループ内処理として、リスト構造データの要素数を並列化閾値情報211の値までカウントする処理を生成する。最後に、処理604中の手順4にあるように、並列化閾値情報211の値と要素数カウンタの値を比較して分岐する処理を挿入する。
処理605において、リスト構造ループ変形部107は、リスト構造ループ並列処理部206を生成する。具体的には、まず、処理605中の手順1にあるように、リスト構造ループ並列処理部206の内部で使用する要素番号カウンタを生成する。次に、処理605中の手順2にあるように、複数のCPU202でこれ以降の処理を実行するために、主記憶装置203上の目的プログラム109をCPU数212分だけ複製する処理を生成する。さらに、処理605中の手順3にあるように、原始プログラム108中のループ制御文の部分を複製する。さらに、処理605中の手順4にあるように、手順3で生成されたループ制御文のループ内処理として、要素数をカウントする処理と、要素番号カウンタの値をCPU数212で割った時の剰余がCPU番号213に等しいかどうかの条件判定文を生成する。最後に、処理605中の手順5にあるように、手順4で生成された条件判定を満たす時だけ、原始プログラム108中のループ内処理が実行されるよう、処理を複製する。
処理606において、リスト構造ループ変形部107は、リスト構造ループ逐次処理部207を生成する。具体的には、処理606中の手順1にあるように、原始プログラム108中のリスト構造ループの制御文とループ内処理を複製する。
図7は、リスト構造ループ処理部110の処理の流れを表す図の一例である。
処理702において、並列化閾値決定部204を実行する。具体的には、入力として与えられたループ内処理長情報208と並列化オーバーヘッド情報209および実行時CPU情報テーブル210をもとに、並列化の効果が期待できる要素数を実行時に計算し、その値を並列化閾値情報211に出力する。なお、並列化閾値決定部204の内部実装は共有メモリ型並列計算機201のハードウェア特性に依存するものであるが、その内部実装の一例については図12の破線部1203の領域(以下、「の領域」は省略)に示している(詳細は後記)。
処理703において、要素数判定部205を実行する。入力として与えられた並列化閾値情報211の値をもとに、実際に要素数のカウントを行う。処理703の詳細は図8に記載する。
処理704において、実際の要素数と並列化閾値情報211の値を比較する、つまり、要素数カウンタの値が並列化閾値以上であるかどうかを判断する。
処理704での比較の結果、要素数が並列化閾値以上であり(Yes)並列化による性能向上が期待できる場合は、処理705において、リスト構造ループ並列処理部206を実行する。処理705の詳細は図9に記載する。
処理704での比較の結果、要素数が並列化閾値未満であり(No)並列化による性能向上が期待できない場合は、処理706において、リスト構造ループ逐次処理部207を実行する。
図8は、処理703(図7)における要素数判定部205の処理の流れを表す図の一例である。
処理802において、要素数カウンタを「0」に初期化する。
処理803において、リスト構造ループの初期化式および条件式(判定式)を実行する。
処理804において、リスト構造ループの終了条件を満たすなら(Yes)、要素数判定部205を終了し、そうでなければ(No)、処理805に進む。
処理805において、要素数カウンタの値が並列化閾値に達したなら(Yes)、要素数判定部205を終了し、そうでなければ(No)、処理806に進む。
処理806において、要素数カウンタの値を「1」増やす。
処理807において、リスト構造ループの増分式および条件式を実行し、処理804に戻る。
なお、リスト構造データの終端に辿りつく前に、処理803以降のループ処理をM回実行したとすると、リスト構造データの要素は最低でもM個あることになる。また、処理803以降のループ処理の実行中に、要素数カウンタの値が並列化閾値情報211の値に到達した場合は、処理805によってループから抜け出し、要素数のカウントを終了する。要素数判定部205の処理は、リスト構造データが並列化による性能向上を期待できるだけの要素数を持っているかどうかを確認することが目的である。そのため並列化閾値情報211の値に到達したことが分かれば、要素数のカウントに必要な処理時間を削減する目的で、要素数のカウント処理を中断する。
図9は、処理705(図7)におけるリスト構造ループ並列処理部206の処理の流れを表す図の一例である。
処理902において、要素番号カウンタを「0」に初期化する。
処理903において、これ以降の処理を全CPU202で同時実行するように並列化する。
処理904において、リスト構造ループの初期化式および条件式を実行する。
処理905において、リスト構造ループの終了条件を満たすなら(Yes)、リスト構造ループ並列処理部206を終了し、そうでなければ(No)、処理906に進む。
処理906において、要素番号カウンタの値をCPU数212で割った時の剰余がCPU番号213に等しいかどうかの条件判定を行う。
処理906の条件判定を満たすなら(Yes)、処理907においてループ内の処理を実行する。
処理906の条件判定を満たさないなら(No)、処理907を実行せず、処理908に進む。
処理908において要素番号カウンタの値を「1」増やす。
処理909において、リスト構造ループの増分式および条件式を実行し、処理905に戻る。
なお、同時実行に使用するCPU数がN個の時、CPU数212はNであり、それぞれのCPU202でCPU番号213は「0」から「N−1」の値を重複せずに持つ。このとき、要素番号カウンタがどのような値であっても、必ずいずれか一つのCPU202で結果が真になる。また、リスト構造データの要素数がMの時、要素番号カウンタの値は「1」ずつ増えながら「0」から「M−1」の値をとるので、処理906における条件判定をM回繰り返す時、CPU202ごとに結果が真になる回数は均一(差が「0」か「1」)になる。つまり、処理904以降の処理を全CPU202で同時実行すれば、ループ内の処理907が実行される回数がCPU202ごとに均一になり、並列化と同等の結果が得られる。
図10Aは、コンパイラ105がC言語で作成された原始プログラム1000(108)を入力にしてコンパイルする時の、リスト構造ループ解析部106の動作例(動作例1)を表す図(図5に対応)である。
まず、原始プログラム1000の内容について説明し、その後、原始プログラム1000とフローチャートとの対応について説明する。なお、原始プログラム1000において、プログラムの実行処理と関係のないコメント(行番号1008,1013)以外の箇所における「*」はポインタを意味する。
行番号1001では、malloc関数を使用するために必要なヘッダファイルを記載した。
行番号1002では、char*型(文字データの先頭アドレスを指し示す型)のnameとint型(整数型)のidとを持つDATA型(構造体)を定義した。
行番号1003では、先に定義したDATA型のdとLIST*型(LIST型の変数のメモリ上のアドレスを持つことができる型)のlを持つLIST型(構造体)を定義した。
行番号1004では、DATA型のinitial_dataという変数を定義した。この変数の初期値は、initial_data.d=“n/a”で、initial_data.l=0である。これは大域変数で、並列実行時にスレッドごとに共有される。
行番号1005では、LIST*型のlstartを定義した。これは大域変数で、並列実行時にスレッドごとに共有される。
行番号1006では、int型の値を返すmain関数(最初に実行される関数)を定義した。
行番号1007では、int型のiという変数と、LIST*型のlpという変数を定義した。
行番号1008では、コメントを記載した。
行番号1009では、LIST型のデータの領域を確保して、その領域のアドレスをlstartに代入した後、lpに代入する処理を記載した。なお、sizeof(struct LIST)は、LIST型の変数を作るのに必要なメモリのサイズを返すことを意味する。また、malloc関数は、そのメモリのサイズの領域を確保して、その領域を指す先頭アドレスを返す関数である。
行番号1010と1011では、いわゆるfor文(行番号1010の()内の左から、初期化式:判定式:増分式)を記載した。ここでのこのfor文は、LIST型の変数を作るのに必要なサイズのメモリの領域を10個確保し、それぞれの要素のポインタ部分に次の要素の先頭アドレスを格納する処理を示す。
行番号1012では、前記for文によって生成したリスト構造データの最後の要素を指すポインタにNULLを代入する処理を記載した。
行番号1013では、コメントを記載した。
行番号1014と1015では、for文を記載した。このfor文は、先に生成した合計11個のLIST型のd(DATA型)の部分に次々とinitial_dataを代入する処理を示す。なお、「lp=lp−>l」は、lpの示すLIST型のデータのlの先頭アドレスに対応するLIST型のデータに移動すること、つまり、次の要素へ移動することを示す。
行番号1016では、main関数が「0」を返す。通常は、正常終了を意味する。
行番号1017では、main関数の終了が示されている。
図10Bは、図10Aに示す原始プログラムを実行した場合にメモリ上に生成されるデータ(変数)の概要図である。
メモリ上には、図10Bに示すように、データ(1)〜(11)の11個のLIST型のデータが生成される。データ(1)は、先頭アドレスが「1000」で、DATA型のdには「n/a」と「0」が格納され、LIST*型のlにはデータ(2)の先頭アドレスである「2000」が格納される。同様に、データ(2)〜(10)が生成される。データ(11)は、LIST*型のl(ポインタ)に「NULL」が格納される点で他のデータと異なっている。
このように生成されたリスト構造データであるデータ(1)〜(11)は、データ(1)から順にポインタによって次のデータの先頭アドレスを特定することで連鎖的にデータを辿ることができ、データ(11)のポインタが「NULL」であることでそのデータが最後のデータであることがわかる。
これらを踏まえ、図10Aに戻って説明を続ける。
処理502において、リスト構造ループ解析部106は、原始プログラム1000中のデータ宣言文を解析し、リスト構造データの型を認識する。具体的には、行番号1003を解析し、原始プログラム1000中で構造体であるLISTが定義され、その内部にLIST型へのポインタ“l”を持っていることから、この構造体はリスト構造データとして利用可能であると認識する。
処理503において、リスト構造ループ解析部106は、原始プログラム1000中のリスト構造データを利用したループ制御文を認識する。具体的には、行番号1014を解析し、この行は、原始プログラム1000のループの初期化式・判定式・増分式であり、ループの終了条件をLIST型の変数“lp”の値で判定していて、ループの増分式では“lp”が“lp−>l”で更新されていることから、このループがリスト構造ループであると認識する。
処理504において、リスト構造ループ解析部106は、処理503で認識されたループ内の処理の依存関係を解析し、並列化可否を判断する。具体的には、行番号1015を解析し、この行は、原始プログラム1000のループ内の処理であると判断する。また、この例では、ループ内の処理に依存関係がなく(つまり、LIST型の各データにおけるd(DATA型)に関する処理が独立しており)、また、ループ内で“lp−>l”を更新せずリスト構造データの個数や並び順がループ内で変化しないことから、このリスト構造ループが並列化可能であると判断する。
リスト構造ループ解析部106においてこのようなループを解析できた場合、そのループが並列化できることをリスト構造ループ変形部107に通知する。
図11は、コンパイラ105が図10A中の原始プログラム1000をコンパイルして目的プログラム1100を生成する時の、リスト構造ループ変形部107の動作例(動作例2)を表す図(図6に対応)である。
処理602において、リスト構造ループ変形部107は、破線部1102および破線部1104のように、並列処理のための各種情報を生成する。具体的には、まず、破線部1102に示すように、リスト構造ループ処理部110を構成する関数を持った“parallelize.h”を目的プログラムに取り込む。
次に、破線部1104に示すように、行番号1014および1015(図10A参照)のループ内処理長を計測し、計測結果が「50」であった場合、ループ内処理長情報208を“interaction_length”という名称で生成し「50」を設定する。
さらに、並列化オーバーヘッドを計測し、計測結果が「100」であった場合、並列化オーバーヘッド情報209を“parallelize_overhead”という名称で生成し「100」を設定する。さらに、並列化閾値情報211を“threshold”という名称で生成し、要素数判定部205の内部で使用する要素数カウンタを“elemnum”という名称で生成する。
最後に、実行時CPU情報テーブル210内のCPU数212のための領域を“cpunum”という名称で生成し、共有メモリ型並列計算機201から並列実行に最適なCPU数を取得するための“get_cpunum”関数を呼び出す処理を実行するための処理を生成する。なお、“get_cpunum”関数は、“parallelize.h”から提供される。“get_cpunum”関数の実装例は図12に示す。
処理603において、リスト構造ループ変形部107は、破線部1105のように並列化閾値決定部204を生成する。具体的には、“get_threshold”という名称で定義された並列化閾値決定部204を呼び出し、その結果を“threshold”に格納する処理を生成する。なお、“get_threshold”関数は、“parallelize.h”から提供される。“get_threshold”関数の実装例は図12に示す。
処理604において、リスト構造ループ変形部107は、破線部1106のように要素数判定部205を生成する。具体的には、まず、原始プログラム1000中の行番号1014(図10A参照)に示されるループ制御文の部分を複製する。さらに、このループ制御文のループ内処理として、“elemnum”を用いてリスト構造データの要素数を並列化閾値情報211の値までカウントする処理を生成する。最後に、並列化閾値情報211の値と要素数カウンタの値を比較して分岐する処理を挿入する。
処理605において、リスト構造ループ変形部107は、破線部1103のようにリスト構造ループ並列処理部206を生成する。具体的には、複数のCPU202で並列に実行されるリスト構造ループの処理を“parallelized_listloop”関数という関数として生成する。次に、CPU202ごとに持つCPU番号213を“cpuid”という名称の変数として生成し、それを“parallelized_listloop”の引数で初期化する。さらに、その関数内にリスト構造ループ並列処理部206の内部で使用する要素番号カウンタを“elemid”という名称で生成する。
さらに、原始プログラム1000中の行番号1014(図10A参照)に示されるループ制御文の部分を複製する。さらに、生成されたループ制御文のループ内処理として、要素数をカウントする処理と、要素番号カウンタの値をCPU数212で割った時の剰余がCPU番号213に等しいかどうかの条件判定文を生成する。最後に、この条件判定を満たす時だけ、原始プログラム1000中の行番号1015(図10A参照)に示されるループ内処理が実行されるよう、処理を複製する。
また、破線部1107のように、関数“parallelized_listloop”を複数のCPU202で並列に実行するための“parallelize”関数を呼び出す処理を挿入する。“parallelize”関数は、“parallelize.h”から提供される。なお、“parallelize”関数の実装例は図12に示す。
処理606において、リスト構造ループ変形部107は、破線部1108のようにリスト構造ループ逐次処理部207を生成する。具体的には、原始プログラム108中の行番号1014および1015(図10A参照)に示されるリスト構造ループの制御文とループ内処理を複製する。
図12は、リスト構造ループ処理部110を構成する関数を持つ“parallelize.h”の実装例を示す図である。
破線部1202に示すように、CPU数212を表す大域変数“cpunum”はこのファイルの中で定義する。
破線部1204に示すように、“get_cpunum”関数は、オペレーティングシステムから提供される“sysconf”関数を実行して利用可能なCPU数を返す。
破線部1205に示すように、“get_threshold”関数は、ループ内処理長情報208、並列化オーバーヘッド情報209、CPU数212の値から、並列化閾値情報211に格納する値を算出して返す。本関数の具体的な動作例は図13で後記する。
破線部1203に示すように、“parallelize”関数は、オペレーティングシステムから提供される“pthread_create”関数を実行して主記憶装置203上の目的プログラム109を複製する。この関数は、複製した目的プログラム109に実行させる関数と、関数に渡す引数を1つ指定できる。
実行する関数は、この関数の呼び出し側が決定できる。本例では呼び出し側が“parallelized_listloop”関数を指定している。“parallelized_listloop”関数に渡す引数は、「0」から「cpunum−1」の範囲をとり重複しない値であり、その値が各CPU202でCPU番号213として利用される。複製の終了後は、“pthread_join”関数を実行して複製した目的プログラム109が全て終了したことを確認してから、“parallelize”関数を終了する。
図13は、並列化閾値決定部204の動作例(動作例3)を表す図である。
目的プログラム1301中に破線部1302(図11の破線部1105と同様)に示す要素数判定部205が生成された場合を例に説明する。
破線部1302に示す並列化閾値決定部(204)“get_threshold”の内部実装例を符号1306(図12の破線部1205と対応)に示す。本例では、pがループ内処理長、oが並列化オーバーヘッド、nがCPU数、tiがCPU202がi個の時の実行時間、lがループ長であるとき、共有メモリ型並列計算機201上における逐次実行時の実行時間t1=p*l、並列実行時の実行時間tn=o+(p*l)/nになるものとし、p*l>=o+(p*l)/nの時に並列化の効果を期待できるとする。よって、この不等式を方程式としてlについて解くと、並列化閾値となるループ長はl=(o*n)/(p*(n−1))(端数切り上げ)となる。なお、仮にn=1である時はCPU数が「1」であり並列実行ができないので、この関数はそれを示すために「−1」を返す。また、ceil関数は、浮動小数点(ここではdouble型)の値を切り上げる関数である。
符号1306で示す“get_threshold”の入力となるループ内処理長情報1303の値が「50」であり、CPU数1304の値が「3」であり、並列化オーバーヘッド情報1305の値が「100」である場合、並列化閾値決定部204は、上記の計算式を用いてlを求め、並列化閾値情報1307に「3」を設定する。
図14は、要素数判定部205の動作例(動作例4)を表す図である。
この例では、目的プログラム1401中に破線部1402(図11の破線部1106と同様)に示す要素数判定部205が生成され、符号1404に示す“threshold”(並列化閾値情報211)の値が「3」であり、リスト構造データの要素数が「3」以上ある場合について説明する。
破線部1402に示す要素数判定部205は、リスト構造ループ変形部107の処理604で生成されたループを実行することで、符号1403に示すリスト構造データの要素をひとつずつ辿りながら、“elemnum”(要素数カウンタ)を「1」ずつ増やしていく。
上記の処理を3回実行し、“elemnum”(要素数カウンタ)の値が「3」になった時、“threshold”(並列化閾値情報211)の値が「3」であることから“if(elemnum>=threshold)”の条件を満たしているので、break文を実行して破線部1402に示す要素数判定部205のループ処理から抜け出す。
破線部1402に示す要素数判定部205の処理の後、改めて“if((elemnum>=threshold)&&(threshold!=−1))”の条件判定を行い(図11の破線部1109)、この条件を満たすなら並列化の効果が期待できるとみなし、リスト構造ループ並列処理部206(図11の破線部1107)を実行する。
図15は、リスト構造ループ並列処理部206の動作例(動作例5)を表す図である。
目的プログラム1501中に、破線部1502(図11の破線部1103と同様)に示すリスト構造ループ並列処理部206が生成され、リスト構造データ1506の要素数が「7」であり、“cpunum”(CPU数212)が「3」であり、それぞれのCPU202の“cpuid”(CPU番号213)に「0」、「1」、「2」が設定された場合を例に説明する。
まず、破線部1509に示すように、複数のCPU202で破線部1502に示す“parallelized_listloop”を実行するために、“parallelize”関数を呼び出す。次に、“parallelize”関数の中で、複数のCPU202を用いて“parallelized_listloop”関数を実行する。
この処理を実行した時、例えば、“cpuid”(CPU番号213)が「1」であるCPU202で破線部1503に示すループ制御文を1回目に実行した時には、“elemid”が「0」であり、“if(elemid++%cpunum==cpuid)”の条件を満たさないので、処理1504を実行せずにループ制御文に戻る。そしてループ制御文を2回目に実行した時には、“elemid”が「1」であり、“if(elemid++%cpunum==cpuid)”の条件を満たすので、処理1504を実行してからループ制御文に戻る。この処理をリスト構造データ1506の終端1508が見つかるまで繰り返すと、破線部1507に示すように、“cpuid”(CPU番号213)が「1」であるCPU202ではリスト構造データの要素のうち2個目と5個目の要素のみに対してd(DATA型)に関する処理を行い、他の要素のd(DATA型)に関する処理は他のCPU202が行うことになる。
この結果、各CPU202がリスト構造データ1506の全要素を均等に選択して処理を行い、並列化と同等の効果が得られる。つまり、各CPU202は、各要素のポインタを参照することでリスト構造データ1506の全要素を辿るが、d(DATA型)に関する処理は自身の担当分しか行わないので、作業配列等を使うことなくリスト構造ループの処理を並列化して高速化することができる。
以上で実施形態の説明を終えるが、本発明の態様はこれらに限定されるものではない。
例えば、d(DATA型)に関する処理は、リスト構造データの全ての要素に対して同じ内容ではなく、独立した処理であれば、異なった処理であってもよい。
また、原始プログラムの言語は、C言語でなくても、C++やJava(登録商標)など、他の言語であってもよい。
その他、ハードウェア、プログラム、表示画面などの具体的な構成について、本発明の主旨を逸脱しない範囲で適宜変更が可能である。
本実施形態によるリスト構造ループの処理の高速化方法が適用されたコンパイラを含む計算機の構成を表す図の一例である。 本実施形態のコンパイラ105から生成された目的プログラム109を実行する時の共有メモリ型並列計算機201の構成を表す図の一例である。 リスト構造ループ処理部110内の参照や設定の関係を表す図の一例である。 本実施形態のコンパイラ105の処理の流れを表す図の一例である。 リスト構造ループ解析部106の処理の流れを表す図の一例である。 リスト構造ループ変形部107の処理の流れを表す図の一例である。 リスト構造ループ処理部110の処理の流れを表す図の一例である。 処理703における要素数判定部205の処理の流れを表す図の一例である。 処理705におけるリスト構造ループ並列処理部206の処理の流れを表す図の一例である。 コンパイラ105が原始プログラム1000(108)を入力にしてコンパイルする時の、リスト構造ループ解析部106の動作例(動作例1)を表す図である。 図10Aに示す原始プログラムを実行した場合にメモリ上に生成されるデータの概要図である。 コンパイラ105が図10A中の原始プログラム1000をコンパイルして目的プログラム1100を生成する時の、リスト構造ループ変形部107の動作例(動作例2)を表す図である。 リスト構造ループ処理部110を構成する関数を持つ“parallelize.h”の実装例を示す図である。 並列化閾値決定部204の動作例(動作例3)を表す図である。 要素数判定部205の動作例(動作例4)を表す図である。 リスト構造ループ並列処理部206の動作例(動作例5)を表す図である。
符号の説明
101 計算機
102 主記憶装置
103 CPU
104 補助記憶装置(記憶装置)
105 コンパイラ
106 リスト構造ループ解析部
107 リスト構造ループ変形部
108 原始プログラム
109 目的プログラム
110 リスト構造ループ処理部(リスト構造ループ処理機能)
201 共有メモリ型並列計算機
202 CPU
203 主記憶装置
204 並列化閾値決定部(並列化閾値決定機能)
205 要素数判定部(要素数判定機能)
206 リスト構造ループ並列処理部(リスト構造ループ処理機能)
207 リスト構造ループ逐次処理部(リスト構造ループ逐次処理機能)
208 ループ内処理長情報
209 並列化オーバーヘッド情報
210 実行時CPU情報テーブル
211 並列化閾値情報
212 CPU数
213 CPU番号

Claims (9)

  1. 同じ型の複数の要素のそれぞれが次の要素へのポインタをメンバーに持つリスト構造データにおいてその要素ごとに処理を行うループであるリスト構造ループを有する原始プログラムから、複数のCPUを有する共有メモリ型並列計算機上で動作する共有メモリ向けの目的プログラムを生成するコンパイラ装置であって、
    前記原始プログラムを記憶する記憶装置と、
    前記記憶装置に記憶された原始プログラムを読み出して前記リスト構造ループを認識するリスト構造ループ解析部と、
    各前記CPUに、前記リスト構造ループ内で各前記要素を辿った回数に基づいて前記リスト構造ループの制御文の処理を実行する要素を振り分けることにより、前記リスト構造ループの制御文の並列処理を行わせるリスト構造ループ処理機能を、前記目的プログラム中に生成して、当該目的プログラムを前記記憶装置に記憶させるリスト構造ループ変形部と、を備える
    ことを特徴とするコンパイラ装置。
  2. 前記リスト構造ループ変形部は、
    各前記CPUに、前記リスト構造ループ内で各前記要素を辿った回数に基づいて前記リスト構造ループの制御文の処理を実行する要素を振り分けるとき、各前記要素に与えられた連続番号を複数の前記CPUの数で割った剰余に基づいて振り分ける
    ことを特徴とする請求項1に記載のコンパイラ装置。
  3. 前記リスト構造ループ変形部は、
    前記目的プログラムが実行される場合に単一の前記CPUによる逐次処理よりも複数の前記CPUによる並列処理のほうが処理時間が短くなる前記要素の数の閾値を決定するための並列化閾値決定機能と、その閾値と実際の前記要素の数を比較するための要素数判定機能と、実際の前記要素の数が前記閾値を下回るときは前記リスト構造ループを前記逐次処理するリスト構造ループ逐次処理機能とを、前記目的プログラム中に生成する
    ことを特徴とする請求項1に記載のコンパイラ装置。
  4. 前記並列化閾値決定機能は、
    複数の前記CPUによる並列処理に起因するオーバーヘッドを踏まえて前記閾値を決定する
    ことを特徴とする請求項3に記載のコンパイラ装置。
  5. 同じ型の複数の要素のそれぞれが次の要素へのポインタをメンバーに持つリスト構造データにおいてその要素ごとに処理を行うループであるリスト構造ループを有する原始プログラムから、複数のCPUを有する共有メモリ型並列計算機上で動作する共有メモリ向けの目的プログラムを生成するコンパイラ装置によるコンパイル方法であって、
    前記コンパイラ装置は、前記原始プログラムを記憶する記憶装置と、リスト構造ループ解析部と、リスト構造ループ変形部と、を備え、
    前記リスト構造ループ解析部は、前記記憶装置に記憶された原始プログラムを読み出して前記リスト構造ループを認識し、
    前記リスト構造ループ変形部は、各前記CPUに、前記リスト構造ループ内で各前記要素を辿った回数に基づいて前記リスト構造ループの制御文の処理を実行する要素を振り分けることにより、前記リスト構造ループの制御文の並列処理を行わせるリスト構造ループ処理機能を、前記目的プログラム中に生成して、当該目的プログラムを前記記憶装置に記憶させる
    ことを特徴とするコンパイル方法。
  6. 前記リスト構造ループ変形部は、
    各前記CPUに、前記リスト構造ループ内で各前記要素を辿った回数に基づいて前記リスト構造ループの制御文の処理を実行する要素を振り分けるとき、各前記要素に与えられた連続番号を複数の前記CPUの数で割った剰余に基づいて振り分ける
    ことを特徴とする請求項5に記載のコンパイル方法。
  7. 前記リスト構造ループ変形部は、さらに、
    前記目的プログラムが実行される場合に単一の前記CPUによる逐次処理よりも複数の前記CPUによる並列処理のほうが処理時間が短くなる前記要素の数の閾値を決定するための並列化閾値決定機能と、その閾値と実際の前記要素の数を比較するための要素数判定機能と、実際の前記要素の数が前記閾値を下回るときは前記リスト構造ループを前記逐次処理するリスト構造ループ逐次処理機能とを、前記目的プログラム中に生成する
    ことを特徴とする請求項5に記載のコンパイル方法。
  8. 前記並列化閾値決定機能は、
    複数の前記CPUによる並列処理に起因するオーバーヘッドを踏まえて前記閾値を決定する
    ことを特徴とする請求項7に記載のコンパイル方法。
  9. 請求項5から請求項8のいずれか1項に記載のコンパイル方法をコンピュータに実行させることを特徴とするプログラム。
JP2007319152A 2007-12-11 2007-12-11 コンパイラ装置、コンパイル方法およびそのプログラム Pending JP2009140451A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2007319152A JP2009140451A (ja) 2007-12-11 2007-12-11 コンパイラ装置、コンパイル方法およびそのプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007319152A JP2009140451A (ja) 2007-12-11 2007-12-11 コンパイラ装置、コンパイル方法およびそのプログラム

Publications (1)

Publication Number Publication Date
JP2009140451A true JP2009140451A (ja) 2009-06-25

Family

ID=40870956

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007319152A Pending JP2009140451A (ja) 2007-12-11 2007-12-11 コンパイラ装置、コンパイル方法およびそのプログラム

Country Status (1)

Country Link
JP (1) JP2009140451A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015099494A (ja) * 2013-11-19 2015-05-28 日本電気株式会社 情報処理装置、情報処理方法およびプログラム

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015099494A (ja) * 2013-11-19 2015-05-28 日本電気株式会社 情報処理装置、情報処理方法およびプログラム

Similar Documents

Publication Publication Date Title
Thies et al. A practical approach to exploiting coarse-grained pipeline parallelism in C programs
Meng et al. GROPHECY: GPU performance projection from CPU code skeletons
US7882498B2 (en) Method, system, and program of a compiler to parallelize source code
US8645932B2 (en) Control flow analysis methods and computing devices for converting COBOL-sourced programs to object-oriented program structures
JP4042604B2 (ja) プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
JP6141365B2 (ja) 逐次コンピュータプログラムコードを並列処理する方法及びシステム
WO2010013370A1 (ja) プログラム変換装置及びプログラム変換方法
JPH01121938A (ja) オブジェクト生成方法
US20100153937A1 (en) System and method for parallel execution of a program
Acar et al. Heartbeat scheduling: Provable efficiency for nested parallelism
Puschner Transforming execution-time boundable code into temporally predictable code
Sun et al. WCCV: Improving the vectorization of IF-statements with warp-coherent conditions
Bertolacci et al. Identifying and scheduling loop chains using directives
Lehr et al. Tool-supported mini-app extraction to facilitate program analysis and parallelization
JP2009140451A (ja) コンパイラ装置、コンパイル方法およびそのプログラム
Bloch et al. SIMD Parallel Execution on GPU from High-Level Dataflow Synthesis
US10761820B2 (en) Assisting parallelization of a computer program
Bridges The velocity compiler: Extracting efficient multicore execution from legacy sequential codes
RAS GRAPHITE-OpenCL: Generate OpenCL code from parallel loops
Yuki et al. Checking race freedom of clocked X10 programs
US20150082443A1 (en) System to automate compliance with licenses of software third-party content
Muller et al. Modeling and analyzing evaluation cost of CUDA kernels
Scholbe Extending DaCe to support the Scalable Vector Extension
JP2007108838A (ja) コンパイル方法及びコンパイル装置
Lamzed-Short et al. Towards automated kernel fusion for the optimisation of scientific applications