JP4923240B2 - プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラ、並列処理コンパイラを格納した記録媒体およびマルチプロセッサシステム - Google Patents
プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラ、並列処理コンパイラを格納した記録媒体およびマルチプロセッサシステム Download PDFInfo
- Publication number
- JP4923240B2 JP4923240B2 JP2006008870A JP2006008870A JP4923240B2 JP 4923240 B2 JP4923240 B2 JP 4923240B2 JP 2006008870 A JP2006008870 A JP 2006008870A JP 2006008870 A JP2006008870 A JP 2006008870A JP 4923240 B2 JP4923240 B2 JP 4923240B2
- Authority
- JP
- Japan
- Prior art keywords
- data
- instruction
- thread
- program
- pointer
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/457—Communication
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/004—Error avoidance
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
- G06F8/434—Pointers; Aliasing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/451—Code distribution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/456—Parallelism detection
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Quality & Reliability (AREA)
- Devices For Executing Special Programs (AREA)
Description
さらに、分散メモリ型マルチプロセッサシステムは、共有メモリ型マルチプロセッサに比べると、共有メモリへのアクセス競合がないために高い並列性を発揮できるが、各プロセッサのメモリ空間が独立であるために、ポインタデータやポインタ参照データをプロセッサ間で共有することができず、並列処理プログラムを開発する上で大きな制約になる。
さらに、請求項7に記載のマルチプロセッサシステムによれば、ポインタデータやポインタ参照データを異なるメモリ空間を持つプロセッサ間で共有することを可能にし、並列処理プログラムの開発の上で大きな自由度を提供できる。
また、請求項8に記載のマルチプロセッサシステムによれば、データ待機時間を大幅に短縮することができる。
(第1の実施形態)
以下、図面(図1〜図16)を用いて本発明の第1の実施形態について説明する。
図1は、プログラム処理装置の機能例を示す機能ブロック図である。図1に示すように、プログラム処理装置1Aは、並列処理プログラム50Aを入力して、通信命令を含む分割プログラム55Aを出力する。ここで、図2および図3を用いて、本実施形態で用いる並列処理プログラム50Aの説明をする。
なお、このプログラムは、C言語に「THREAD」という新たなキーワードが追加された拡張C言語によって記述されており、THREADに続く「(スレッド名)」によってスレッド名が指定され、これに続く括弧記号{ … }で囲まれたコード領域(スレッド領域)によってスレッドの有効な範囲が示されている。スレッド記述が追加されたプログラム(並列処理プログラム)とは、このようにスレッドの有効な範囲が記述されたプログラムのことを指すものとする。なお、いずれのスレッドにも含まれないコード領域の処理は「ベーススレッド」と呼ぶことにし、その他のスレッドと同等に扱うこととする。既存のCコンパイラを用いて、この拡張C言語によって書かれたソースコードから実行コードを生成するためには、例えばスレッド宣言を無効化するプリプロセッサ「#define THREAD(n)」を予めプログラムの最上部(またはプログラム内)に挿入すればよい。このプリプロセッサにより、例えば「THREAD(p1)」が空の文字列に変換され、これに続く括弧記号{ … }が通常のC言語におけるスコープ宣言として解釈され、既存のCコンパイラで正常に処理される。
図1に示すように、プログラム処理装置1Aは、構文解析部31と、データ依存性抽出部32Aと、スレッド間データ依存性抽出部33と、通信命令挿入部35Aと、プログラム分割・コード生成部39とを含んで構成されている。以下、プログラム処理装置1Aを構成する各要素について説明する。
構文解析部31は、並列処理プログラム50Aを入力して、当該プログラムの構文を解析する。また、並列処理プログラム50Aから中間語を生成する。構文解析部31は、通常のコンパイラが有する公知の構文解析の機能に加え、拡張C言語の予約語に追加されたTHREADキーワードを認識し、それに続く「(スレッド名)」でスレッド名を抽出し、これに続くスコープ({…})で囲まれるコード領域(スレッド領域)が、このスレッドであることを判別し、中間語に変換された各演算命令にスレッドの属性(スレッド属性)を付加する機能を有する。スレッド属性は、各演算命令がどのスレッドに含まれるかを判別するための情報であり、各スレッドに固有の番号を予め割り当てておき、スレッドに含まれるすべての演算命令にこの番号を割り振ることでスレッド属性情報を付加することができる。
THREAD(p0){
a = 1;
THREAD(p1){
b = 2;
}
}
という入れ子構造(スレッドp0の領域内にスレッドp1が含まれる構造)が存在した場合、演算b = 2;はスレッドp0とスレッドp1とに含まれる。このとき、この演算b = 2;は、最も内側のスレッドp1のスレッド属性を持つ。また、演算a = 1;のスレッド属性はスレッドp0である。
さらに、スレッド領域に関数呼出し命令が含まれる場合、その関数のベーススレッドは関数呼出し命令が属するスレッドと同一であるものとする。例えば、図3に示した並列処理プログラム50Aの21行目(RandomSignal())および25行目(printf())の命令は、それぞれスレッドp4内およびスレッドp5内における関数呼出し命令であり、これらの関数の処理は、これらを呼び出したスレッドで実行されることになるので、RandomSignal()およびprintf()のベーススレッドは、それぞれスレッドp4およびスレッドp5と同一となる。
また、説明の都合上、以下では、中間語として適宜、並列処理プログラム50Aを用いて説明することにする。
データ依存性抽出部32Aは、構文解析部31によって生成された中間語を入力し、データ依存性を抽出する。データ依存性抽出部32Aは、命令参照・生成データ抽出部321と、関数内間接参照・生成データ抽出部323と、命令ブロック抽出部324と、命令ブロック入出力データ抽出部325Aと、データ依存枝生成部326と、出力データ生成命令・入力データ参照命令抽出部327とを含んで構成されている。
命令参照・生成データ抽出部321は、構文解析部31によって生成された中間語を入力し、中間語内の各命令の参照データリストおよび生成データリストを生成する。
命令参照・生成データ抽出部321で生成される各命令の参照データリストは、その命令が直接参照するすべてのデータからなり、単項演算命令の場合は一つの参照データを持ち、二項演算命令の場合は二つの参照データを持ち、関数呼出し命令の場合は関数呼出引数データすべてが参照データと見なされる。
また、命令参照・生成データ抽出部321で生成される各命令の生成データリストは、その命令が直接生成するデータからなり、戻り値のない関数の関数呼出し命令では直接生成するデータはなく、それ以外の命令では一つの直接生成するデータを持つ。
命令参照・生成データ抽出部321によって生成された参照データリストおよび生成データリストは、関数内間接参照・生成データ抽出部323に引き渡される。また、命令参照・生成データ抽出部321によって生成された参照データリストおよび生成データリストは、各命令の依存性を抽出する処理において、適宜利用される。
関数内間接参照・生成データ抽出部323は、命令参照・生成データ抽出部321によって生成された参照データリストと生成データリストとを入力し、関数呼出し命令が存在した場合、呼出された関数内で参照または生成されるグローバル変数やポインタ型関数引数によるポインタ参照データ(以下、間接依存データという)を抽出するものである。
関数呼出し命令のデータ依存性解析においては、通常の演算命令としてのデータ依存性(以下、直接的データ依存性という)を考慮しなければならない他、関数内部の演算で発生したデータ依存性のうち関数呼出し側まで伝播する依存性(以下、間接的データ依存性という)を考慮しなくてはならない場合がある。直接的データ依存性を示すものとしては、関数呼出し引数(直接参照データ)や関数戻り値(直接生成データ)などがあり、この直接参照データおよび直接生成データは、命令参照・生成データ抽出部321から受け取った参照データリストおよび生成データリスト内に存在している。
関数内間接参照・生成データ抽出部323によって生成された関数呼出し命令の参照データリストおよび生成データリストは、各命令の依存性を抽出する処理において、適宜利用される。これにより、並列処理プログラム50A内の大局的なデータ依存性が抽出できるようになる。
命令ブロック抽出部324は、構文解析部31によって生成された中間語を入力し、その中間語から命令ブロックを抽出する。ここで、命令ブロックとは、プログラムを分岐点、合流点および関数呼出命令の前後と、スレッド境界とを境界線として分割した結果生じるブロックのことである。以下、図3および図4を用いて、命令ブロック抽出部324の機能の一例について説明する。
命令ブロック入出力データ抽出部325Aは、構文解析部31によって生成された中間語と、命令ブロック抽出部324によって抽出された命令ブロック情報とを入力し、その命令ブロック情報を用いて、その中間語から命令ブロック入力データと、命令ブロック出力データとを抽出する。命令ブロック入力データとは、命令ブロック内の各命令が参照するデータのうち、別の命令ブロック内で生成されるものである。また、命令ブロック出力データとは、命令ブロック内の各命令が生成するデータのうち、別のブロック内で参照されるものである。以下、図3および図5を用いて、命令ブロック入出力データ抽出部325Aの機能の一例について説明する。
データ依存枝生成部326は、構文解析部31によって生成された中間語と、命令ブロック抽出部324によって生成された命令ブロック情報と、命令ブロック入出力データ抽出部325Aによって生成された命令ブロック入出力データ情報とを入力し、その命令ブロック情報と命令ブロック入出力データ情報とを用いて、データ依存枝を生成する。
データ依存枝とは、入力データと出力データとの間に依存関係(あるブロックの出力データを別のブロックが入力データとして使うという関係)が存在する場合に、命令ブロックの入出力データを「ノード(頂点)」とみなし、出力データノードから入力データノードに向けて接続するものである。ただし、このデータ依存関係が分岐点や合流点を隔てる場合は、対応する分岐ブロックまたは合流ブロックにデータノードを付加して、データ依存枝がこのデータノードを経由するようにする。なお、このデータ依存枝のグラフ構造は、公知の論文であるJohnson, Pingali, "Dependence-Based Program Analysis", ACM Conference on Programming Language Design and Implementation, pp.78-89 (1993)によって提案されたDependence Flow Graphがベースとなっている。このDependence Flow Graphは、前記説明の分岐点や合流点を隔てるデータ依存関係において、対応する分岐ブロックまたは合流ブロックにデータノードを付加して、データ依存枝がこのデータノードを経由することを特徴とするデータ依存関係を表現するためのグラフ構造である。以下、図3、図5および図6を用いて、データ依存枝生成部326の機能の一例について説明する。
なお、分岐ブロックB1に付加された出力データノードsigIn0には、sigIn0(T)と記されているが、これは、命令ブロックA2の条件文が成立する場合(Trueの場合)に、分岐ブロックB1に付加された出力データノードsigIn0を経由することを表している。
ここで、先行枝とは、そのデータ依存枝の始点ノード(命令ブロック出力ノード)を終点とする別のデータ依存枝を意味する。また、後続枝とは、そのデータ依存枝の終点ノード(命令ブロック入力ノード)を始点とする別のデータ依存枝を意味する。ただし、分岐ブロックや合流ブロックに付加されたデータノードはこれらのブロックの入力ノードであると同時に出力ノードでもあると見なす。データ依存枝生成部326は、例えば、データ依存枝「5」の始点ノード(命令ブロック出力ノード)を終点とする別のデータ依存枝としてデータ依存枝「4」を発見し、データ依存枝「5」の先行枝としてデータ依存枝「4」を設定する。また同様に、データ依存枝生成部326は、例えば、データ依存枝「4」の終点ノード(命令ブロック入力ノード)を始点とする別のデータ依存枝としてデータ依存枝「5」を発見し、データ依存枝「4」の先行枝としてデータ依存枝「5」を設定する。
出力データ生成命令・入力データ参照命令抽出部327は、構文解析部31によって生成された中間語と、データ依存枝生成部326によって生成されたデータ依存枝情報100A(図7参照)とを入力し、出力データ生成命令および入力データ参照命令を抽出する。以下、図7および図8を用いて、出力データ生成命令・入力データ参照命令抽出部327の機能の一例について説明する。
次に、各データ依存枝の終点側の命令ブロック内でこのデータを参照する命令を探索する。データ依存枝が後続枝を持たない場合は、このデータ依存枝に関わるデータを参照する命令(データ参照命令)が終点側の命令ブロック内に存在することを意味するので、この命令ブロック内で、該当するデータ参照命令を抽出する。同一データを参照する命令が同一命令ブロック内に複数存在する場合は、これらのうち最初に実行される命令をデータ参照命令とする。逆に、データ依存枝が後続枝を持つ場合は、このデータ依存枝に関わるデータを参照する命令(データ参照命令)が終点側の命令ブロック内に存在しないことを意味する。
図8には、図7で示されたデータ依存枝「6」〜「9」が存在しないが、これらのデータ依存枝がデータ生成命令と参照命令とをいずれも持たないからである。
スレッド間データ依存性抽出部33は、データ依存枝生成部326によって生成されたデータ依存枝情報100A(図7参照)と、出力データ生成命令・入力データ参照命令抽出部327よって生成された出力データ生成命令・入力データ参照命令情報110A(図8参照)とを入力し、スレッド間のデータ依存性を抽出する。スレッド間データ依存性抽出部33は、スレッド入出力データ抽出部331と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332とを含んで構成されている。
スレッド入出力データ抽出部331は、データ依存枝生成部326によって生成されたデータ依存枝情報100A(図7参照)を入力し、データ依存枝情報100A(図7参照)を用いて、スレッド入力データおよびスレッド出力データ(スレッド入出力データ)を抽出し、スレッド間データ依存枝情報120A(図9参照)を生成する。
スレッド入力データとは、スレッド内の各命令が参照するデータのうち、別のスレッド内で生成されるものである。また、スレッド出力データとは、スレッド内の各命令が生成するデータのうち、別のスレッド内で参照されるものである。つまり、スレッド境界E1〜E6(図6参照)を横切るデータ依存枝がスレッド入出力データを表す。以下、図6、図7および図9を用いて、スレッド入出力データ抽出部331の機能の一例について説明する。
図7のデータ依存枝情報100Aに示すように、データ依存枝「1」〜「10」、「17」、「20」、「21」は、出力データノードのスレッドと入力データノードのスレッドとが同一であるので、出力データノードから入力データノードにスレッド間データ依存枝が接続されない。また、データ依存枝「11」〜「16」、「18」、「19」、「22」〜「24」は、出力データノードのスレッドと入力データノードのスレッドとが異なるので、出力データノードから入力データノードにスレッド間データ依存枝が接続される。
スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332は、スレッド入出力データ抽出部331によって生成されたスレッド間データ依存枝情報120A(図9参照)と、出力データ生成命令・入力データ参照命令抽出部327によって生成された出力データ生成命令・入力データ参照命令情報110A(図8参照)とを参照して、スレッド入力データ参照命令を抽出する。ここで、スレッド入力データ参照命令とは、スレッド間データ依存枝に関わる入力データ参照命令のことである。以下、図8ないし図11を用いて、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332の機能の一例について説明する。
判定の結果、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332は、データ依存枝「13」、「14」、「16」、「18」、「19」については、スレッド入力データ参照命令の直接のデータ生成命令が存在するので(図8の出力データ生成命令・入力データ参照命令情報110Aを参照すると、データ参照命令と同一行にデータ生成命令が存在するので)、このデータ生成命令をスレッド出力データ生成命令として抽出する。
また、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332は、データ依存枝「11」、「12」、「15」については、スレッド入力データ参照命令の直接のデータ生成命令が存在しないので(図8の出力データ生成命令・入力データ参照命令情報110Aを参照すると、データ参照命令と同一行にデータ生成命令が存在しないので)、スレッド出力データ生成命令を探索する必要がある。この探索方法については、図10を用いて説明する。
スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332は、スレッド入力データ参照命令の直接のデータ生成命令が存在しない場合、先行枝方向にその出力データ生成命令を探索する。例えば、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332は、データ依存枝「11」の先行枝「8」を抽出する。そして、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332は、データ依存枝「8」のデータ生成命令記号が存在しないので、データ依存枝「8」の先行枝「3」と、先行枝「24」とを抽出する。
スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332は、先行枝として抽出したデータ依存枝「3」のデータ生成命令記号「3:DEF」を抽出し、探索元のデータ依存枝「11」の生成命令リスト(スレッド入力データ参照命令のスレッド出力データ生成命令リスト)に追加する。
また、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332は、先行枝として抽出したデータ依存枝「24」のデータ生成命令記号「24:DEF」を抽出し、探索元のデータ依存枝「11」の生成命令リスト(スレッド入力データ参照命令のスレッド出力データ生成命令リスト)に追加する。
通信命令挿入部35Aは、構文解析部31によって生成された中間語と、スレッド入出力データ抽出部331によって生成されたスレッド間データ依存枝情報120A(図9参照)と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332によって生成されたスレッド間データ依存命令対情報130A(図11参照)とを入力し、中間語に通信命令を挿入する。通信命令挿入部35Aは、データ送信命令挿入部351Aと、データ受信同期命令挿入部352Aとを含んで構成されている。
データ送信命令挿入部351Aは、スレッド間データ依存命令対情報130A(図11参照)のスレッド入力データ参照命令のスレッド出力データ生成命令リストを参照して、中間語内のスレッド入力データ参照命令のスレッド出力データ生成命令の直後にデータ送信命令を挿入する。以下、図11を用いて、データ送信命令挿入部351Aの機能の一例について説明する。
この際、送信先スレッドとしてスレッド入力データ参照命令「13:USE」が実行されるスレッド「p2」を指定する。
データ送信命令挿入部351Aは、データ送信命令として、例えば、既存の並列プログラミング用メッセージ通信ライブラリ関数のデータ送信処理を行う関数を呼び出す命令を中間語内に挿入することが可能である。
メッセージ通信方式の並列プログラミング環境であるMPIを例にとると、データ送信命令挿入部351Aは、データ送信処理を行う関数として、例えばMPI_Send()関数を呼び出す命令を挿入し、関数呼び出し引数として、データアドレス、データサイズ、データタイプ、送信先スレッド番号(各スレッドに予め割り当てられた固有の番号)、メッセージタグ番号(スレッド入力データ参照命令のデータ依存枝番号)を設定する。
データ受信同期命令挿入部352Aは、スレッド間データ依存命令対情報130A(図11参照)のスレッド入力データ参照命令のスレッド出力データ生成命令リストを参照して、中間語内のスレッド入力データ参照命令の直前にデータ受信同期命令を挿入する。以下、図11を用いて、データ受信同期命令挿入部352Aの機能の一例について説明する。
データ受信同期命令挿入部352Aは、データ受信同期命令として、例えば、既存の並列プログラミング用メッセージ通信ライブラリ関数のデータ受信処理を行う関数を呼び出す命令を中間語内に挿入することが可能である。
メッセージ通信方式の並列プログラミング環境であるMPIを例にとると、データ受信同期命令挿入部352Aは、データ受信処理を行う関数として、例えばMPI_Recv()関数を呼び出す命令を挿入し、関数呼び出し引数として、データアドレス、データサイズ、データタイプ、送信元スレッド番号(MPI_ANY_SOURCE)、メッセージタグ番号(スレッド入力データ参照命令のデータ依存枝番号)を設定する。なお、送信元スレッド番号として「MPI_ANY_SOURCE」(「送信元は任意のスレッド」の意)としているのは、スレッド入力データ参照命令に対応するスレッド出力データ生成命令が複数個存在する場合に対応するためである。
プログラム分割・コード生成部39は、通信命令挿入部35Aによって生成された通信命令を含むプログラムを各プロセッサが行うスレッド処理に分割(プログラム分割)し、実行コード(機械コード)に変換(コード生成)するものである。その結果、プログラム分割・コード生成部39は、通信命令を含む分割プログラム55A(図1参照)を生成する。
プログラム分割の機能は、構文解析部31によって各命令に付加されたスレッド属性を参照して、プログラムを各スレッドの処理に分割するものである。
また、コード生成の機能は、通常のコンパイラが有する公知のコード生成の機能と特に変わらないため、コード生成の機能についてのさらに詳細な説明は省略する。
図12に示すように、プログラム処理装置1Aは、コンピュータであり、中央処理装置(処理部)10と、主記憶装置(処理部)20と、ファイル装置(記憶部)40と、入力装置INと、出力装置OUTとを含んで構成されている。また、ファイル装置40は、並列処理プログラム50Aを含んで構成され、主記憶装置20は、並列処理コンパイラ30Aを含んで構成されている。
主記憶装置20は、例えばRAM(Random Access Memory)や、ROM(Read Only Memory)等から構成され、中央処理装置10が実行するプログラムやデータ等を格納するものである。
並列処理コンパイラ30Aは、並列処理プログラム50Aをマルチプロセッサシステムが実行できる形式に変換する(マルチプロセッサシステムのための実行コードを生成する)ためのプログラムである。
ファイル装置40は、ファイルを格納するための装置であり、並列処理プログラム50A等を格納するものである。
並列処理プログラム50Aは、マルチプロセッサシステムに並列処理を実行させるためのプログラムであり、プログラマ等によって記述されたものである。
入力装置INは、キーボードや、マウス等によって構成され、操作者からの指示を入力する機能を有する。
また、出力装置OUTは、ディスプレイや、プリンタ等によって構成され、文字や画像等を出力する機能を有する。
続いて、図面(図17〜図22)を用いて本発明の第2の実施形態について説明する。第2の実施形態は、データ構造の依存性に関するものであり、並列処理プログラム内にデータ構造が含まれている場合に、データ構造に作用する命令間の依存性を抽出し、抽出結果を用いて、命令ブロックの入出力データの抽出とデータ依存枝情報の生成とを行い、その命令ブロックのデータ依存枝情報を用いて出力データ生成命令・入力データ参照命令を抽出し、出力データ生成命令・入力データ参照命令情報を生成する点が、第1の実施形態と異なる。したがって、それ以外の第1の実施形態と共通する部分については、同じ符号を付し、説明を省略する。
命令ブロック入出力データ抽出部325Bは、構文解析部31によって生成された中間語と、命令ブロック抽出部324によって抽出された命令ブロック情報とを入力し、データ構造に作用する命令間の依存性を抽出し、その命令ブロック情報を用いて、その中間語から命令ブロック入力データと、命令ブロック出力データとを抽出する。以下、図18ないし図20を用いて(適宜図17参照)、命令ブロック入出力データ抽出部325Bの機能のうち、第1の実施形態における命令ブロック入出力データ抽出部325Aの機能との違い(データ構造に作用する命令間の依存性を抽出する機能)のみを説明する。
$94 := a[0] ...... (1)
$94 = 1 ...... (2)
という2つの命令に分解される(命令ブロックA11参照)。命令(1)は、配列aの0番目の要素のアドレスを計算し、中間変数$94に記憶する演算である。命令(2)は、アドレス$94に右辺式「1」を代入する演算である。なお、データ構造要素のアドレスを表す中間変数(ここでは$94)は、任意の演算命令で引用される場合(以下に示す書換え命令および読出し命令)、そのアドレスに格納されている要素データ値を指す。
続いて、図面(図23〜図34)を用いて本発明の第3の実施形態について説明する。第3の実施形態は、ポインタ(メモリ上のアドレスを記憶する変数)が指すデータオブジェクト間のデータ依存性を抽出し、得られたポインタエイリアスデータ依存性を用いて、ポインタ参照データ(ポインタによって指定されたメモリ上のアドレスに記憶されたデータ)の出力データ生成命令・入力データ参照命令を抽出する点が、第2の実施形態と異なる。また、スレッド間でのポインタによる通信が存在する場合に、スレッド間で転送されるポインタを抽出し、ポインタエイリアスID演算命令を挿入する機能が追加された点が、第2の実施形態と異なる。また、データ送信命令およびデータ受信命令を挿入する機能が、第2の実施形態と異なる。さらに、スレッド起動命令を挿入する機能が追加された点が、第2の実施形態と異なる。したがって、それ以外の第2の実施形態と共通する部分については、同じ符号を付し、説明を省略する。
ポインタエイリアス解析部322は、エイリアスリスト(ポートエイリアス情報)を生成する。エイリアスリストとは、ポインタが指すすべてのデータオブジェクト(データ構造または単一データ)のリストのことである。ポインタエイリアス解析部322は、命令参照・生成データ抽出部321によって抽出された命令の参照データリストおよび生成データリストを用いて、エイリアスリストを順次更新していく。エイリアスリストの更新は、ポインタへの代入命令において行う。エイリアスリストの更新方法については、公知の方法と特に変わらない。
命令ブロック入出力データ抽出部325Cは、構文解析部31によって生成された中間語と、命令ブロック抽出部324によって抽出された命令ブロック情報と、ポインタエイリアス解析部322によって生成されたポインタのエイリアスリストとを入力し、ポインタエイリアスデータ依存性を抽出し、その命令ブロック情報を用いて、その中間語から命令ブロック入力データと、命令ブロック出力データとを抽出する。以下、図24ないし図27を用いて(適宜図23参照)、命令ブロック入出力データ抽出部325Cの機能のうち、第2の実施形態における命令ブロック入出力データ抽出部325Bの機能との違い(ポインタエイリアスデータ依存性を抽出する機能)のみを説明する。
ポインタ通信補助命令生成部34は、構文解析部31によって生成された中間語と、スレッド入出力データ抽出部331によって生成されたスレッド間データ依存枝情報と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332によって生成されたスレッド間データ依存命令対情報と、ポインタエイリアス解析部322によって生成されたエイリアスリストとを入力し、スレッド間で転送されるポインタを抽出し、構文解析部31によって生成された中間語にポインタエイリアスID演算命令を挿入する。ポインタ通信補助命令生成部34は、スレッド間転送ポインタ抽出部341と、ポインタエイリアスID演算命令挿入部342とを含んで構成されている。
スレッド間転送ポインタ抽出部341は、スレッド入出力データ抽出部331によって生成されたスレッド間データ依存枝情報を参照して、ポインタ型のスレッド間データ依存枝(ポインタ型スレッド間データ依存枝)を抽出する。それにより、スレッド間で転送されるポインタ(スレッド間転送ポインタ)を抽出する。以下、図28または図29を用いて、スレッド間転送ポインタ抽出部341の機能の一例について説明する。
ポインタエイリアスID演算命令挿入部342は、構文解析部31によって生成された中間語と、ポインタエイリアス解析部322によって抽出されたエイリアスリストと、スレッド間転送ポインタ抽出部341によって抽出されたスレッド間転送ポインタに関する情報とを参照して、構文解析部31によって生成された中間語にポインタエイリアスID演算命令を挿入する。以下、図28ないし図30を用いて、ポインタエイリアスID演算命令挿入部342の機能の一例について説明する。
例えば、図30に示した例では、命令T3は、関数呼出し命令の呼出し引数の代入命令であると解釈され、このポインタ代入演算命令の右辺値が別のポインタ変数pであるので、ポインタエイリアスID演算命令挿入部342は、エイリアスID変換テーブルを作成する。エイリアスID変換テーブルでは、aaのエイリアスリスト:{*b<10>,*a<10>,*c<20>}の*b<10>の要素番号<ID = 0>とpのエイリアスリスト:{*b<10>,*c<20>}の*b<10>の要素番号<ID = 0>とが対応付けられており、aaのエイリアスリスト:{*b<10>,*a<10>,*c<20>}の*c<20>の要素番号<ID = 2>とpのエイリアスリスト:{*b<10>,*c<20>}の*c<20>の要素番号<ID = 1>とが対応付けられている。したがって、ポインタエイリアスID演算命令挿入部342は、エイリアスID変換テーブルを作成して、pのエイリアスID変数が取り得る値{0,1}をそれぞれ{0,2}に変換する演算命令を、命令U1の直前にエイリアスID変換演算命令R1として挿入する。同様に、ポインタエイリアスID演算命令挿入部342は、pのエイリアスID変数が取り得る値{0,1}をそれぞれ{0,2}に変換する演算命令を、命令U2の直前にエイリアスID変換演算命令R2として挿入する。
スレッド間データ通信命令挿入部36は、ポインタ通信補助命令生成部34によってポインタエイリアスID演算命令が挿入されたプログラムと、出力データ生成命令・入力データ参照命令抽出部327によって抽出された出力データ生成命令・入力データ参照命令情報110A(図8参照)と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332によって生成されたスレッド間データ依存命令対情報130A(図11参照)とを入力し、スレッド間における通信命令をポインタエイリアスID演算命令が挿入されたプログラムに挿入する。スレッド間データ通信命令挿入部36は、データ送信命令挿入部351Cと、データ受信同期命令挿入部352Cと、スレッド起動命令挿入部353とを含んで構成されている。
データ送信命令挿入部351Cは、ポインタ通信補助命令生成部34によってポインタエイリアスID演算命令が挿入されたプログラムと、出力データ生成命令・入力データ参照命令抽出部327によって抽出された出力データ生成命令・入力データ参照命令情報110A(図8参照)と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332によって生成されたスレッド間データ依存命令対情報130A(図11参照)とを入力し、そのスレッド間データ依存命令対情報130A(図11参照)を参照して、そのプログラム内のスレッド出力データを生成する命令の直後にスレッド間データ送信命令を挿入するものである。以下、図8、図11および図31を用いて、データ送信命令挿入部351Cの機能の一例について説明する。
データ受信同期命令挿入部352Cは、データ送信命令挿入部351Cによって生成されたポインタエイリアスID演算命令およびスレッド間データ送信命令を含むプログラムと、出力データ生成命令・入力データ参照命令抽出部327によって抽出された出力データ生成命令・入力データ参照命令情報110A(図8参照)と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部332によって生成されたスレッド間データ依存命令対情報130A(図11参照)とを入力し、そのスレッド間データ依存命令対情報130A(図11参照)を参照して、そのプログラム内のスレッド入力データを参照する命令の直前にスレッド間データ受信同期命令を挿入するものである。以下、図8、図11および図31を用いて、データ受信同期命令挿入部352Cの機能の一例について説明する。
スレッド起動命令挿入部353は、データ受信同期命令挿入部352Cによって生成されたポインタエイリアスID演算命令、スレッド間データ送信命令およびスレッド間データ受信同期命令を含むプログラムと、命令ブロック抽出部324によって生成された命令ブロック情報とを入力し、その命令ブロック情報を参照して、スレッドが制御依存する分岐命令において、そのスレッドに到達する分岐枝の直後にスレッドを起動する命令(スレッド起動命令)を挿入する。以下、図32を用いて、スレッド起動命令挿入部353の機能の一例について説明する。
以下、図面(図35〜図42)を用いて本発明の実施形態におけるマルチプロセッサシステムについて説明する。
図35は、マルチプロセッサシステム全体の構成を示す図である。図35に示すように、プロセッサP(P0)、プロセッサP(P1)およびプロセッサP(P2)が通信ネットワークCSによって接続されている。ここで、プロセッサの数は特に限定されるものではない。
プロセッサPは、プロセッサ間通信処理部(処理部)(以下、「通信処理部60」と表す)と、プロセッサ内処理部(処理部)(以下、「プログラム処理部70」と表す)と、ローカルメモリ(記憶部)80とを含んで構成される。通信処理部60は、プログラム処理部70との同期を行うことで、プロセッサP間での通信を実行し、プロセッサP間の通信データハザードを検出する機能を有する。また、プログラム処理部70は、ローカルメモリ80に格納された実行コード(プログラム処理装置1Cによって生成された通信命令を含む分割プログラム55D(図23参照))に基づいて処理を行い、通信処理部60が検出したデータハザードの検出結果に応じて、実行コードの実行または中断状態を制御する機能を有する。実行コードに含まれる通信命令は、プログラム処理部70と通信処理部60とが協調しながら実行する。
なお、図35には、プロセッサP0の構成が示されている。プロセッサP1およびプロセッサP2の構成については、プロセッサP0の構成と同様であるため、図35には示されていない。
図36に示すように、通信処理部60は、データ受信部61と、データ通信ポートテーブル62と、データ送信部63とを含んで構成される。
データ受信部61は、各入力ポートに独立に割り当てられたFIFO(first-in-first-out)型受信バッファ61aを含み、これら受信バッファ61aは、各入力ポートから受信するデータをローカルメモリ80へ書き込む操作を制御する。
受信バッファ61aは、バッファメモリ61bと、状態フラグ61cと、カウンタ61dとを含んで構成される。
バッファメモリ61bは、受信データを一時的に格納する。
状態フラグ61cは、バッファの3つの状態("empty”, “full”, “non-empty”)を示す。”empty”は、受信データがローカルメモリ80にもバッファメモリ61bにも存在しない状態を表し、”full”はバッファメモリ61bが埋まった状態を表し、”non-empty”は”empty”でも”full”でもない状態を表す。
カウンタ61dは、バッファメモリ61bに格納されているデータブロック数を示す。ここで、データブロックとは、一回のデータ通信で転送されるデータの集合である。
受信バッファ61aは、ループ(繰り返し実行される処理)の内部に別々のプロセッサが並列実行するスレッドが埋め込まれている場合に、これらのスレッド間(プロセッサ間)で繰り返し発生するデータ通信を一時的にバッファリングするために設けられており、このことにより、これらのスレッド(プロセッサ)がパイプライン方式で並列実行することが可能になる。
図37に示すように、データ通信ポートテーブル62は、プロセッサ間データ通信を実行するためのポート情報620を保持するテーブルであり、各プロセッサの通信処理部60(図36参照)の中に搭載されるものである。ポート情報620は、ポートID621と、ポートタイプ622と、ポートサイズ623と、ポートアドレス624と、ポートバッファアドレス625と、エイリアスIDアドレス626と、送信先テーブル627と、ポートエイリアステーブル628とを含んで構成される。
ポートタイプ622は、通信方向(入力、出力)、データタイプ(直接アクセスデータ、間接アクセスデータ、ポインタデータ)などの種別を表すものである。
ここで、「直接アクセスデータ(直接アクセス型データ)」とは、ポインタ型データ以外の、データ格納アドレスが静的に定まる関数内ローカル変数またはグローバル変数を指す。「間接アクセスデータ(ポインタ参照データ)」とは、ポインタによってその格納アドレスが定まるデータを指す。「ポインタデータ」とは、ポインタ型データを指す。
ポートサイズ623は、ポートが扱うデータの大きさでありバイト単位で表す。
ポートアドレス624は、データが格納されているローカルメモリ80内のアドレスを表すものである。
ポートバッファアドレス625は、受信データを一時的に格納するポートバッファ(受信バッファ)へのポインタ(受信データを一時的に格納するポートバッファ(受信バッファ)のアドレス)である。なお、ポートバッファアドレス625は、ポートタイプ622の通信方向が入力のときに有効となる情報である。
エイリアスIDアドレス626は、エイリアスID変数が格納されているローカルメモリ80内のアドレスを表すものである。なお、エイリアスIDアドレス626は、ポートタイプ622のデータタイプが間接アクセスデータまたはポインタデータのときに有効となる情報である。
送信先テーブル627は、送信先プロセッサのプロセッサID627aと、ポートID627bとを保持するものである。ここで、プロセッサID627aは、送信先プロセッサを識別するためのIDであり、ポートID627bは、送信先プロセッサへデータ送信要求と一緒に送信するデータIDとして使用するものである。
ポートエイリアステーブル628は、送信データがポインタを介した「間接アクセスデータ」や、「ポインタデータ」の場合、ポインタのエイリアスオブジェクトのエイリアスID、データサイズ、データ格納アドレスなどを含んだポインタエイリアスに関する情報を(それぞれエイリアスID628a、オブジェクトサイズ628b、オブジェクトアドレス628cとして)テーブル化したものである。
データ送信部63は、プログラム処理部70によってデータ送信命令が実行されると、プログラム処理部70から送信データに対応するポートIDを受け取る。
また、データ送信部63は、送信データに対応するポートIDを受け取ると、データ通信ポートテーブル62内からそのポートIDにマッチするポート情報620を取得する。
さらに、データ送信部63は、ポート情報を取得すると、各送信先プロセッサに対して、データ送信要求を出し、送信許可が返信されるまで待ち続ける。データ送信要求には、受信ポートID、エイリアスIDなどの通信情報が付加される。ここで、エイリアスIDには、送信データがポインタを介した間接アクセスデータまたはポインタデータである場合は、実行コード(実行プログラム)中のエイリアスID演算命令によって適宜更新されているポインタのエイリアスID変数の値を使用し、送信データが直接アクセスデータである場合は、任意の値を使用する。
さらに、データ送信部63は、ここで、ポートタイプに応じた方法で、ローカルメモリ80から送信データを読み出し、通信ネットワークCSを介して送信する。ポートタイプに応じた方法とは、ポートタイプが直接アクセスデータの場合は、ポートアドレス624に格納アドレスからデータを読み出して送信先プロセッサに送信し、ポートタイプが間接アクセスデータの場合は、ポートエイリアステーブル628から取得したポートエイリアス情報のオブジェクトアドレス628cによって指定されるアドレスからデータを読み出して送信先プロセッサに送信し、ポートタイプがポインタデータの場合は、ポインタ値からポートエイリアス情報のオブジェクトアドレス628cを引いたポインタオフセット値を計算し、このオフセット値を送信先プロセッサに送信する。
また、データ受信部61は、データ送信要求の中に含まれている通信情報(受信ポートID、エイリアスID)を用いて、データ通信ポートテーブル62内の該当ポートIDを持つポート情報620を取得する。
さらに、データ受信部61は、ポートタイプが「間接アクセスデータ」または「ポインタデータ」の場合は、ポートエイリアステーブル(図37参照)の当該エイリアスID628aがポインタのエイリアスID変数の値と一致するポートエイリアス情報を取得する。
さらに、データ受信部61は、受信データを一時的に格納する受信バッファ61aを、ポート情報に含まれるポートバッファアドレス625(図37参照)を用いて選択する。
また、データ受信部61は、通信ネットワークCSを介して受信したデータを、ポートタイプに応じた方法で受信バッファ61aに転送する。ここで、ポートタイプに応じた方法とは、ポートタイプが直接アクセスデータの場合は、受信データを受信バッファ61aに転送し、ポートタイプが間接アクセスデータの場合は、受信データとエイリアスIDを受信バッファ61aに転送し、ポインタデータの場合は、受信したポインタオフセット値にポートエイリアス情報のオブジェクトアドレス628cを加えてポインタ値を計算し、このポインタ値とエイリアスIDを受信バッファ61aに転送する方法である。
状態フラグ61cが”empty”の場合は、受信バッファ61aは、データ受信部61から受け取った転送データをローカルメモリ80へ直接書き込む。このときの書込み先アドレスは、ポートタイプが直接アクセスデータまたはポインタデータの場合は、ポートアドレス(ポートアドレス624によって指定されるアドレス)であり、ポートタイプが間接アクセスデータの場合は、ポートエイリアス情報(ポートエイリアステーブル628から取得した情報)に含まれるオブジェクトアドレス(オブジェクトアドレス628cによって指定されるアドレス)である。さらに、受信バッファ61aは、ポートタイプが間接アクセスデータまたはポインタデータの際には、転送データとともにデータ受信部61から受け取ったエイリアスIDを、エイリアスIDアドレス(エイリアスIDアドレス626によって指定されるアドレス)に格納する。
受信バッファ61aに蓄えられるデータは、現在のスレッド処理では参照されずに(現在のスレッド処理で参照する受信データがすでに存在するので)、次回のスレッド処理以降で参照されるデータである。
状態フラグ61cが”empty”または”non-empty”のいずれの場合も、受信データを格納後、状態フラグ61cは、”non-empty”または”full”になる。
受信バッファ61aの状態フラグ61cが初めから”full"のときは、前記説明の通り受信を拒否するので、データが受信バッファ61aに転送されることはない。
さらに間接アクセスデータまたはポインタデータの際に同時にバッファメモリ61bに格納されているエイリアスIDは、エイリアスIDアドレス626に格納される。
前記説明の通り、スレッド処理が終了した時に、受信バッファ61aに一時的に蓄えられた先頭データブロックをローカルメモリ80に自動的に転送する機能は、次回のスレッド処理で参照されるデータを直ちに参照可能にするために必要である。
まず、プログラム処理部70は、データ送信命令を実行し(S101)、ポートID(送信ポートID)をデータ送信部63に転送する(S102)。
まず、データ受信部61は、送信元プロセッサからデータ送信要求を受信し(S201)、受信したデータ送信要求内の通信情報を用いて、データ通信ポートテーブル62からポート情報620を取得する(S202)。データ受信部61は、取得したポート情報620内のポートタイプ622の判定を行う(S203)。ポートタイプ622が「間接アクセスデータ」または「ポインタデータ」の場合は(S203で「間接アクセスデータ」or「ポインタデータ」)、データ受信部61は、ポートエイリアステーブル628からポートエイリアス情報を取得し(S204)、S205に進む。ポートタイプ622が「直接アクセス」の場合は(S203で「直接アクセスデータ」)、S205に進む。
受信バッファ61aは、データ受信部61から転送データを受け取り(S301)、状態フラグ61cの判定を行う(S302)。
状態フラグ61cが”empty”でなければ(S302でNo」)、バッファメモリ61bに受信データを格納する(S303)。
プログラム処理部70が、現在のスレッド処理を終了した後にスレッド処理終了信号をデータ受信部61に送信し(S401)、データ受信部61は、すべての受信バッファ61aについて以下の処理(図41の破線で囲まれた処理)を行う。
データ受信部61は、各受信バッファ61aにおいて、そのカウンタ61dが1以上か否かの判定を行う(S402)。1以上の場合(S402でYes)、バッファメモリ61bにデータが格納されていることを意味するので、バッファメモリ61bに格納されている先頭データブロックを読出し(S403)、さらにデータ通信ポートテーブル62からポートID621をもとに該当するポート情報620を取得し(S404)、ポートタイプ622の判定を行う(S405)。
プログラム処理部70がデータ受信同期命令を実行した場合(S501)、受信データに対応する受信バッファ61aのアドレスをプログラム処理部70がデータ受信部61に転送し(S502)、S503に進む。
状態フラグ61cが”empty”の場合は(S503でYes)、命令中断フラグをプログラム処理部70に通知し(プログラム処理部70に命令の実行を中断させる信号を発生し)(S504)、S503に戻る。状態フラグ61cが”empty”でない場合は(S503でNo)、処理を終了する。
10 中央処理装置(処理部)
20 主記憶装置(処理部)
30A 並列処理コンパイラ
31 構文解析部
32A、32B、32C データ依存性抽出部
33 スレッド間データ依存性抽出部
34 ポインタ通信補助命令生成部
35A、35C 通信命令挿入部
36 スレッド間データ通信命令挿入部
39 プログラム分割・コード生成部
40 ファイル装置(記憶部)
50A、50B、50C、50D 並列処理プログラム
55A、55B、55C、55D 通信命令を含む分割プログラム
321 命令参照・生成データ抽出部
322 ポインタエイリアス解析部
323 関数内間接参照・生成データ抽出部
324 命令ブロック抽出部
325A、325B、325C 命令ブロック入出力データ抽出部
326 データ依存枝生成部
327 出力データ生成命令・入力データ参照命令抽出部
331 スレッド入出力データ抽出部
332 スレッド出力データ生成命令・スレッド入力データ参照命令抽出部
333 プロセッサ間通信命令挿入部
341 スレッド間転送ポインタ抽出部
342 ポインタエイリアスID演算命令挿入部
351A、351C データ送信命令挿入部
352A、352C データ受信同期命令挿入部
353 スレッド起動命令挿入部
IN 入力装置
OUT 出力装置
P プロセッサ
55 通信命令を含む分割プログラム
60 通信処理部
61 データ受信部
62 データ通信ポートテーブル
63 データ送信部
70 プログラム処理部
80 ローカルメモリ
620 ポート情報
622 ポートタイプ
623 ポートサイズ
624 ポートアドレス
627 送信先テーブル
628 ポートエイリアステーブル
628c オブジェクトアドレス
CS 通信ネットワーク
Claims (8)
- スレッド記述が追加された並列処理プログラムを入力し、各スレッドに当該プログラムを分割し、マルチプロセッサシステムのための実行コードの生成を行うプログラム処理装置であって、
前記プログラム処理装置は、記憶部と、処理部とを備え、
前記処理部は、
前記記憶部に入力された前記並列処理プログラム中の各スレッドの開始地点および終了地点を、予約されたキーワードまたは記号によって特定し、特定された開始地点および終了地点によって指定されたスレッド領域に含まれる各演算命令にスレッド属性を付加した中間語を生成する構文解析部と、
前記中間語を入力し、当該中間語から命令ブロック入出力データを抽出して、当該命令ブロック入出力データに基づいて、単一演算命令によって生成または参照されるデータの依存性である単一データ依存性に関する情報と、データ構造に作用する命令間のデータ依存性であるデータ構造依存性に関する情報と、ポインタ参照データに作用する命令間のデータ依存性であるポインタエイリアスデータ依存性に関する情報とを含むデータ依存枝情報を生成するデータ依存性抽出部と、
前記中間語と前記データ依存枝情報とを入力し、当該データ依存枝情報に基づいて、当該中間語から異なるスレッド同士を接続するデータ依存枝と、当該データ依存枝に対応するスレッド出力データ生成命令およびスレッド入力参照命令とを抽出して、スレッド間データ依存命令対情報を生成するスレッド間データ依存性抽出部と、
前記中間語を入力し、前記異なるスレッド同士を接続するデータ依存枝の中からポインタデータを抽出し、前記中間語の当該ポインタデータを定義する命令の直前にポインタエイリアスID演算命令を挿入して、第1のプログラムを生成するポインタ通信補助命令生成部と、
前記第1のプログラムと前記スレッド間データ依存命令対情報とを入力し、前記スレッド間データ依存命令対情報に基づいて、前記第1のプログラムの前記スレッド出力データ生成命令の直後にスレッド間データ送信命令を挿入し、前記スレッド間データ依存命令対情報に基づいて、前記第1のプログラムの前記スレッド入力データ参照命令の直前にスレッド間データ受信同期命令を挿入し、スレッド起動命令をそのスレッドが制御依存する分岐命令または関数入り口箇所に挿入して、第2のプログラムを生成するスレッド間データ通信命令挿入部と、
前記第2のプログラムを入力し、当該プログラムを各命令の前記スレッド属性に基づいて各スレッドに分割し、実行コードに変換するプログラム分割・コード生成部と
を備えることを特徴とするプログラム処理装置。 - 請求項1に記載のプログラム処理装置の記憶部に入力される並列処理プログラムであって、
前記プログラム処理装置の処理部によって、各スレッド処理の開始地点と終了地点が、前記並列処理プログラム内に記述された予約されたキーワードまたは記号によって特定され、特定された開始地点および終了地点によって指定されたスレッド領域に含まれる各演算命令にスレッド属性が付加され、当該スレッド属性に基づいて前記各スレッドが行う処理に分割され、実行コードに変換される
ことを特徴とする並列処理プログラム。 - スレッド記述が追加された並列処理プログラムを入力し、各スレッドに当該プログラムを分割し、マルチプロセッサシステムのための実行コードの生成を行うプログラム処理装置によるプログラム処理方法であって、
前記プログラム処理装置は、記憶部と、処理部とを備え、
前記処理部は、
前記記憶部に入力された前記並列処理プログラム中の各スレッドの開始地点および終了地点を、予約されたキーワードまたは記号によって特定し、特定された開始地点および終了地点によって指定されたスレッド領域に含まれる各演算命令にスレッド属性を付加した中間語を生成し、
前記中間語を入力し、当該中間語から命令ブロック入出力データを抽出して、当該命令ブロック入出力データに基づいて、単一演算命令によって生成または参照されるデータの依存性である単一データ依存性に関する情報と、データ構造に作用する命令間のデータ依存性であるデータ構造依存性に関する情報と、ポインタ参照データに作用する命令間のデータ依存性であるポインタエイリアスデータ依存性に関する情報とを含むデータ依存枝情報を生成し、
前記中間語と前記データ依存枝情報とを入力し、当該データ依存枝情報に基づいて、当該中間語から異なるスレッド同士を接続するデータ依存枝と、当該データ依存枝に対応するスレッド出力データ生成命令およびスレッド入力参照命令とを抽出して、スレッド間データ依存命令対情報を生成し、
前記中間語を入力し、前記異なるスレッド同士を接続するデータ依存枝の中からポインタデータを抽出し、前記中間語の当該ポインタデータを定義する命令の直前にポインタエイリアスID演算命令を挿入して、第1のプログラムを生成し、
前記第1のプログラムと前記スレッド間データ依存命令対情報とを入力し、前記スレッド間データ依存命令対情報に基づいて、前記第1のプログラムの前記スレッド出力データ生成命令の直後にスレッド間データ送信命令を挿入し、前記スレッド間データ依存命令対情報に基づいて、前記第1のプログラムの前記スレッド入力データ参照命令の直前にスレッド間データ受信同期命令を挿入し、スレッド起動命令をそのスレッドが制御依存する分岐命令または関数入り口箇所に挿入して、第2のプログラムを生成し、
前記第2のプログラムを入力し、当該プログラムを各命令の前記スレッド属性に基づいて各スレッドに分割し、実行コードに変換する
ことを特徴とするプログラム処理方法。 - 記憶部を備え、スレッド記述が追加された並列処理プログラムを入力し、各スレッドに当該プログラムを分割し、マルチプロセッサシステムのための実行コードの生成を行うコンピュータに、
前記記憶部に入力された前記並列処理プログラム中の各スレッドの開始地点および終了地点を、予約されたキーワードまたは記号によって特定し、特定された開始地点および終了地点によって指定されたスレッド領域に含まれる各演算命令にスレッド属性を付加した中間語を生成し、
前記中間語を入力し、当該中間語から命令ブロック入出力データを抽出して、当該命令ブロック入出力データに基づいて、単一演算命令によって生成または参照されるデータの依存性である単一データ依存性に関する情報と、データ構造に作用する命令間のデータ依存性であるデータ構造依存性に関する情報と、ポインタ参照データに作用する命令間のデータ依存性であるポインタエイリアスデータ依存性に関する情報とを含むデータ依存枝情報を生成し、
前記中間語と前記データ依存枝情報とを入力し、当該データ依存枝情報に基づいて、当該中間語から異なるスレッド同士を接続するデータ依存枝と、当該データ依存枝に対応するスレッド出力データ生成命令およびスレッド入力参照命令とを抽出して、スレッド間データ依存命令対情報を生成し、
前記中間語を入力し、前記異なるスレッド同士を接続するデータ依存枝の中からポインタデータを抽出し、前記中間語の当該ポインタデータを定義する命令の直前にポインタエイリアスID演算命令を挿入して、第1のプログラムを生成し、
前記第1のプログラムと前記スレッド間データ依存命令対情報とを入力し、前記スレッド間データ依存命令対情報に基づいて、前記第1のプログラムの前記スレッド出力データ生成命令の直後にスレッド間データ送信命令を挿入し、前記スレッド間データ依存命令対情報に基づいて、前記第1のプログラムの前記スレッド入力データ参照命令の直前にスレッド間データ受信同期命令を挿入し、スレッド起動命令をそのスレッドが制御依存する分岐命令または関数入り口箇所に挿入して、第2のプログラムを生成し、
前記第2のプログラムを入力し、当該プログラムを各命令の前記スレッド属性に基づいて各スレッドに分割し、実行コードに変換することを
実行させるための並列処理コンパイラ。 - 請求項4に記載の並列処理コンパイラを格納した記録媒体。
- 請求項1に記載のプログラム処理装置によって、並列処理プログラムが各スレッドに分割され、生成された実行コードに基づいて処理を行うマルチプロセッサシステムであって、
前記マルチプロセッサシステムは、各プロセッサに記憶部と、処理部とを備え、
前記処理部は、
前記プロセッサ間の制御を、データフローマシン型のデータ駆動制御方式により行うプロセッサ間通信処理部と、
前記プロセッサ内の制御を、ノイマン型プログラム駆動制御方式により行うプロセッサ内処理部と
を備え、
前記プロセッサ間通信処理部は、
前記プロセッサ内処理部との同期を行うことで、前記プロセッサ間での通信を実行し、前記プロセッサ間の通信データハザードを検出する機能を有し、
前記プロセッサ内処理部は、
前記記憶部に格納された前記実行コードに基づいて処理を行い、前記データハザードの検出結果に応じて、前記実行コードの実行または中断状態を制御する機能を有する
ことを特徴とするマルチプロセッサシステム。 - 前記記憶部は、
ポート情報を保持するデータ通信ポートテーブルを格納し、
当該ポート情報は、
直接アクセス型データのプロセッサ間通信を行うためのデータサイズと、データ格納アドレスと、送信ポートIDの情報に加え、
ポインタ参照データまたはポインタデータのプロセッサ間通信を行うためのポートエイリアス情報を含み、
当該ポートエイリアス情報は、
ポインタが参照し得るすべてのデータオブジェクトのデータサイズと、データ格納アドレスと、エイリアスIDとからなるポインタエイリアスに関する情報を含み、
直接アクセス型データをプロセッサ間通信する場合は、
送信側の前記プロセッサの前記プロセッサ間通信処理部が、
前記直接アクセス型データのポート情報を取得し、当該ポート情報のデータ格納アドレスにより当該直接アクセス型データの送信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、当該データ格納アドレスのデータと、前記送信ポートIDとを受信側の前記プロセッサに送信し、
受信側の前記プロセッサの前記プロセッサ間通信処理部が、
受信した前記送信ポートIDからデータの受信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、受信した前記データを当該データ格納アドレスに格納し、
ポインタ参照データをプロセッサ間通信する場合は、
送信側の前記プロセッサの前記プロセッサ間通信処理部が、
当該ポインタ参照データの前記ポートエイリアス情報を取得し、当該ポートエイリアス情報から当該ポインタが参照しているデータオブジェクトの送信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、前記送信ポートIDと、前記ポインタ参照データのエイリアスIDと、当該ポインタが参照しているデータオブジェクト全体とを受信側の前記プロセッサに送信し、
受信側の前記プロセッサの前記プロセッサ間通信処理部が、
受信した前記送信ポートIDと、前記エイリアスIDとからデータオブジェクトの受信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、受信した前記データオブジェクトを当該データ格納アドレスに格納し、
ポインタデータをプロセッサ間通信する場合は、
前記送信側の前記プロセッサの前記プロセッサ間通信処理部が、
当該ポインタの前記ポートエイリアス情報を取得し、当該ポートエイリアス情報から当該ポインタが参照しているデータオブジェクトの送信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、当該ポインタの値から当該データ格納アドレスを引いたポインタオフセット値を計算し、前記送信ポートIDと、前記ポインタのエイリアスIDと、当該ポインタオフセット値とを受信側の前記プロセッサに送信し、
前記受信側の前記プロセッサの前記プロセッサ間通信処理部が、
受信した前記送信ポートIDと、前記エイリアスIDとからデータオブジェクトの受信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、受信した前記ポインタオフセット値に当該データ格納アドレスを足すことによって前記受信側の前記プロセッサの前記記憶部で有効となるポインタ値を求め、前記受信側の前記プロセッサの前記記憶部に当該ポインタ値を格納する
ことを特徴とする請求項6に記載のマルチプロセッサシステム。 - 前記プロセッサ内処理部は、
外部データを最初に参照する命令の直前に前記プログラム処理装置によって挿入されたスレッド間データ受信同期命令を実行するにおいて、当該スレッド間データ受信同期命令に含まれる当該データの受信ポート情報を前記プロセッサ間通信処理部に転送し、
前記プロセッサ間通信処理部は、
当該受信ポート情報からデータ受信状態を調べ、データが未受信の場合は前記プロセッサ内処理部における処理の実行を中断させる
ことを特徴とする請求項6または請求項7に記載のマルチプロセッサシステム。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006008870A JP4923240B2 (ja) | 2006-01-17 | 2006-01-17 | プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラ、並列処理コンパイラを格納した記録媒体およびマルチプロセッサシステム |
US11/913,162 US8234635B2 (en) | 2006-01-17 | 2007-01-16 | Program processing device, parallel processing program, program processing method, parallel processing compiler, recording medium containing the parallel processing compiler, and multi-processor system |
PCT/JP2007/050470 WO2007083613A1 (ja) | 2006-01-17 | 2007-01-16 | プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラ、並列処理コンパイラを格納した記録媒体およびマルチプロセッサシステム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006008870A JP4923240B2 (ja) | 2006-01-17 | 2006-01-17 | プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラ、並列処理コンパイラを格納した記録媒体およびマルチプロセッサシステム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2007193430A JP2007193430A (ja) | 2007-08-02 |
JP4923240B2 true JP4923240B2 (ja) | 2012-04-25 |
Family
ID=38287566
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2006008870A Active JP4923240B2 (ja) | 2006-01-17 | 2006-01-17 | プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラ、並列処理コンパイラを格納した記録媒体およびマルチプロセッサシステム |
Country Status (3)
Country | Link |
---|---|
US (1) | US8234635B2 (ja) |
JP (1) | JP4923240B2 (ja) |
WO (1) | WO2007083613A1 (ja) |
Families Citing this family (40)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPWO2008072334A1 (ja) * | 2006-12-14 | 2010-03-25 | 富士通株式会社 | コンパイル方法及びコンパイラ |
WO2009113034A1 (en) * | 2008-03-12 | 2009-09-17 | Nxp B.V. | Look-ahead task management |
KR101406693B1 (ko) | 2008-07-02 | 2014-06-12 | 고쿠리츠다이가쿠호진 토쿄고교 다이가꾸 | 실행시간 추정방법, 실행시간 추정 프로그램 및 실행시간 추정장치 |
US8302076B2 (en) * | 2008-11-12 | 2012-10-30 | Landmark Graphics Corporation | Systems and methods for improved parallel ILU factorization in distributed sparse linear systems |
US8561041B1 (en) * | 2009-06-22 | 2013-10-15 | The Mathworks, Inc. | Parallel execution of function calls in a graphical model |
JP5057256B2 (ja) | 2009-12-02 | 2012-10-24 | 株式会社Mush−A | データ処理装置、データ処理システムおよびデータ処理方法 |
WO2011067896A1 (en) | 2009-12-02 | 2011-06-09 | Mush-A Co., Ltd. | Data processing apparatus, data processing system, packet, recording medium, storage device, and data processing method |
US8650554B2 (en) * | 2010-04-27 | 2014-02-11 | International Business Machines Corporation | Single thread performance in an in-order multi-threaded processor |
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 |
US8924946B2 (en) * | 2010-11-24 | 2014-12-30 | International Business Machines Corporation | Systems and methods for automatically optimizing high performance computing programming languages |
US9507568B2 (en) | 2010-12-09 | 2016-11-29 | Microsoft Technology Licensing, Llc | Nested communication operator |
US9395957B2 (en) | 2010-12-22 | 2016-07-19 | Microsoft Technology Licensing, Llc | Agile communication operator |
US8752018B2 (en) * | 2011-06-21 | 2014-06-10 | Nvidia Corporation | Emitting coherent output from multiple threads for printf |
BR112014000515B1 (pt) * | 2011-07-10 | 2021-04-27 | Blendology Limited | Dispositivo de compartilhamento de dados eletrônico e modo de uso |
US20130055224A1 (en) * | 2011-08-25 | 2013-02-28 | Nec Laboratories America, Inc. | Optimizing compiler for improving application performance on many-core coprocessors |
KR101276600B1 (ko) | 2011-10-13 | 2013-06-19 | 강릉원주대학교산학협력단 | 프로세서 간 데이터 통신방법, 이 방법을 구현하는 코드를 포함하는 컴퓨터로 읽을 수 있는 매체, 및 멀티 프로세서 컴퓨팅 시스템 |
WO2013105158A1 (ja) * | 2012-01-13 | 2013-07-18 | パナソニック株式会社 | データ依存解析支援装置、データ依存解析支援プログラム、及びデータ依存解析支援方法 |
US20140156703A1 (en) * | 2012-11-30 | 2014-06-05 | Altera Corporation | Method and apparatus for translating graphical symbols into query keywords |
US9465594B2 (en) * | 2013-02-27 | 2016-10-11 | Hewlett Packard Enterprise Development Lp | Distributed implementation of sequential code that includes a future |
US9792252B2 (en) | 2013-05-31 | 2017-10-17 | Microsoft Technology Licensing, Llc | Incorporating a spatial array into one or more programmable processor cores |
US9575916B2 (en) | 2014-01-06 | 2017-02-21 | International Business Machines Corporation | Apparatus and method for identifying performance bottlenecks in pipeline parallel processing environment |
US9501377B2 (en) | 2014-03-18 | 2016-11-22 | International Business Machines Corporation | Generating and implementing data integration job execution design recommendations |
US9424160B2 (en) | 2014-03-18 | 2016-08-23 | International Business Machines Corporation | Detection of data flow bottlenecks and disruptions based on operator timing profiles in a parallel processing environment |
US9658855B2 (en) | 2014-10-10 | 2017-05-23 | Fujitsu Limited | Compile method and compiler apparatus |
US9830134B2 (en) * | 2015-06-15 | 2017-11-28 | Qualcomm Incorporated | Generating object code from intermediate code that includes hierarchical sub-routine information |
US9952867B2 (en) | 2015-06-26 | 2018-04-24 | Microsoft Technology Licensing, Llc | Mapping instruction blocks based on block size |
US10191747B2 (en) | 2015-06-26 | 2019-01-29 | Microsoft Technology Licensing, Llc | Locking operand values for groups of instructions executed atomically |
US10169044B2 (en) | 2015-06-26 | 2019-01-01 | Microsoft Technology Licensing, Llc | Processing an encoding format field to interpret header information regarding a group of instructions |
US10346168B2 (en) | 2015-06-26 | 2019-07-09 | Microsoft Technology Licensing, Llc | Decoupled processor instruction window and operand buffer |
US10409606B2 (en) | 2015-06-26 | 2019-09-10 | Microsoft Technology Licensing, Llc | Verifying branch targets |
US10409599B2 (en) | 2015-06-26 | 2019-09-10 | Microsoft Technology Licensing, Llc | Decoding information about a group of instructions including a size of the group of instructions |
US10175988B2 (en) | 2015-06-26 | 2019-01-08 | Microsoft Technology Licensing, Llc | Explicit instruction scheduler state information for a processor |
US9946548B2 (en) | 2015-06-26 | 2018-04-17 | Microsoft Technology Licensing, Llc | Age-based management of instruction blocks in a processor instruction window |
US9720693B2 (en) | 2015-06-26 | 2017-08-01 | Microsoft Technology Licensing, Llc | Bulk allocation of instruction blocks to a processor instruction window |
JP2017107448A (ja) * | 2015-12-10 | 2017-06-15 | 株式会社デンソー | 並列化方法、並列化ツール、車載装置 |
EP3343351B1 (en) * | 2016-12-28 | 2023-04-26 | Waseda University | Parallel program generating method and parallelization compiling apparatus |
US20220350613A1 (en) * | 2021-04-30 | 2022-11-03 | Oracle International Corporation | Processor Supporting Self-Relative Addressing Modes |
JP2023009933A (ja) * | 2021-07-08 | 2023-01-20 | 株式会社日立製作所 | 情報処理システム及び情報処理方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3608993B2 (ja) * | 1999-11-10 | 2005-01-12 | 富士通株式会社 | コンパイラ装置及びコンパイラプログラムを記録した記録媒体 |
JP3641997B2 (ja) * | 2000-03-30 | 2005-04-27 | 日本電気株式会社 | プログラム変換装置及び方法並びに記録媒体 |
US7490218B2 (en) * | 2004-01-22 | 2009-02-10 | University Of Washington | Building a wavecache |
WO2005072307A2 (en) * | 2004-01-22 | 2005-08-11 | University Of Washington | Wavescalar architecture having a wave order memory |
-
2006
- 2006-01-17 JP JP2006008870A patent/JP4923240B2/ja active Active
-
2007
- 2007-01-16 US US11/913,162 patent/US8234635B2/en not_active Expired - Fee Related
- 2007-01-16 WO PCT/JP2007/050470 patent/WO2007083613A1/ja active Application Filing
Also Published As
Publication number | Publication date |
---|---|
JP2007193430A (ja) | 2007-08-02 |
US8234635B2 (en) | 2012-07-31 |
WO2007083613A1 (ja) | 2007-07-26 |
US20090055630A1 (en) | 2009-02-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4923240B2 (ja) | プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラ、並列処理コンパイラを格納した記録媒体およびマルチプロセッサシステム | |
US9898292B2 (en) | Hardware instruction generation unit for specialized processors | |
Lee et al. | Dataflow architectures and multithreading | |
US8464214B2 (en) | Apparatus, method and system for building software by composition | |
Treleaven et al. | Data-driven and demand-driven computer architecture | |
JP5817032B2 (ja) | シングルスレッドソフトウェアプログラムの特定用途向けスーパーコンピュータへの変換するための方法とシステム | |
Schauser et al. | Compiler-controlled multithreading for lenient parallel languages | |
US10599404B1 (en) | M/A for compiling parallel program having barrier synchronization for programmable hardware | |
CN103858099A (zh) | 用于在异构计算机上编译和运行高级程序的技术 | |
CN104583949A (zh) | Web浏览器中的脚本的预处理 | |
JP2009104422A (ja) | マルチプロセッサ向け最適コード生成方法及びコンパイル装置 | |
JP4830108B2 (ja) | プログラム処理装置、プログラム処理方法、並列処理プログラム用コンパイラおよび並列処理プログラム用コンパイラを格納した記録媒体 | |
Gropp et al. | Message passing interface | |
JP2000047887A (ja) | 投機的マルチスレッド処理方法および投機的マルチスレッド処理装置 | |
JP2014228891A (ja) | コンパイラおよびコンパイル方法 | |
Krishnan et al. | Executing sequential binaries on a clustered multithreaded architecture with speculation support | |
Jakimovska et al. | Modern processor architectures overview | |
Harvey | A linguistic approach to concurrent, distributed, and adaptive programming across heterogeneous platforms | |
JPH06149751A (ja) | 共有データ更新装置 | |
WO2024120070A1 (zh) | 异常处理方法及装置 | |
Uddin | Microgrid-The microthreaded many-core architecture | |
Holmes | McMPI: a managed-code message passing interface library for high performance communication in C | |
Shabanov et al. | Features of Dataflow Processor Emulator Implementing | |
Jesshope | SVP and µTC-A dynamic model of concurrency and its implementation as a compiler target | |
JPH064498A (ja) | マルチプロセッサ処理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20080919 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20111101 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20111213 |
|
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: 20120110 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |