(57)【要約】【課題】マルチプロセッサによって並列処理を行う際に、複雑なハードウェア構成を不要とし、プロセッサ間通信で発生する遅延時間を短縮することを課題とする。【解決手段】各プロセッサＰが、プロセッサＰ間の制御をデータフローマシン型のデータ駆動制御方式により行う通信処理部６０と、プロセッサＰ内の制御をノイマン型プログラム駆動制御方式により行うプログラム処理部７０とを備え、通信処理部６０が、プログラム処理部７０との同期を行うことで、プロセッサＰ間での通信を実行し、プロセッサＰ間の通信データハザードを検出する機能を有し、プログラム処理部７０が、ローカルメモリ８０に格納された実行コードに基づいて処理を行い、データハザードの検出結果に応じて、実行コードの実行または中断状態を制御する機能を有する構成とした。【選択図】図３５
2007193430.tif 000002
【特許請求の範囲】
【請求項１】
スレッド記述が追加された並列処理プログラムを入力し、各スレッドに当該プログラムを分割し、マルチプロセッサシステムのための実行コードの生成を行うプログラム処理装置であって、
前記プログラム処理装置は、記憶部と、処理部とを備え、
前記処理部は、
前記記憶部に入力された前記並列処理プログラム中の各スレッドの開始地点および終了地点を、予約されたキーワードまたは記号によって特定し、特定された開始地点および終了地点によって指定されたスレッド領域に含まれる各演算命令にスレッド属性を付加した中間語を生成する構文解析部と、
前記中間語を入力し、当該中間語から命令ブロック入出力データを抽出して、当該命令ブロック入出力データに基づいて、単一演算命令によって生成または参照されるデータの依存性である単一データ依存性に関する情報と、データ構造に作用する命令間のデータ依存性であるデータ構造依存性に関する情報と、ポインタ参照データに作用する命令間のデータ依存性であるポインタエイリアスデータ依存性に関する情報とを含むデータ依存枝情報を生成するデータ依存性抽出部と、
前記中間語と前記データ依存枝情報とを入力し、当該データ依存枝情報に基づいて、当該中間語から異なるスレッド同士を接続するデータ依存枝と、当該データ依存枝に対応するスレッド出力データ生成命令およびスレッド入力参照命令とを抽出して、スレッド間データ依存命令対情報を生成するスレッド間データ依存性抽出部と、
前記中間語を入力し、前記異なるスレッド同士を接続するデータ依存枝の中からポインタデータを抽出し、前記中間語の当該ポインタデータを定義する命令の直前にポインタエイリアスＩＤ演算命令を挿入して、第１のプログラムを生成するポインタ通信補助命令生成部と、
前記第１のプログラムと前記スレッド間データ依存命令対情報とを入力し、前記スレッド間データ依存命令対情報に基づいて、前記第１のプログラムの前記スレッド出力データ生成命令の直後にスレッド間データ送信命令を挿入し、前記スレッド間データ依存命令対情報に基づいて、前記第１のプログラムの前記スレッド入力データ参照命令の直前にスレッド間データ受信同期命令を挿入し、スレッド起動命令をそのスレッドが制御依存する分岐命令または関数入り口箇所に挿入して、第２のプログラムを生成するスレッド間データ通信命令挿入部と、
前記第２のプログラムを入力し、当該プログラムを各命令の前記スレッド属性に基づいて各スレッドに分割し、実行コードに変換するプログラム分割・コード生成部と
を備えることを特徴とするプログラム処理装置。
【請求項２】
請求項１に記載のプログラム処理装置の記憶部に入力される並列処理プログラムであって、
前記プログラム処理装置の処理部によって、各スレッド処理の開始地点と終了地点が、前記並列処理プログラム内に記述された予約されたキーワードまたは記号によって特定され、特定された開始地点および終了地点によって指定されたスレッド領域に含まれる各演算命令にスレッド属性が付加され、当該スレッド属性に基づいて前記各スレッドが行う処理に分割され、実行コードに変換される
ことを特徴とする並列処理プログラム。
【請求項３】
スレッド記述が追加された並列処理プログラムを入力し、各スレッドに当該プログラムを分割し、マルチプロセッサシステムのための実行コードの生成を行うプログラム処理装置によるプログラム処理方法であって、
前記プログラム処理装置は、記憶部と、処理部とを備え、
前記処理部は、
前記記憶部に入力された前記並列処理プログラム中の各スレッドの開始地点および終了地点を、予約されたキーワードまたは記号によって特定し、特定された開始地点および終了地点によって指定されたスレッド領域に含まれる各演算命令にスレッド属性を付加した中間語を生成し、
前記中間語を入力し、当該中間語から命令ブロック入出力データを抽出して、当該命令ブロック入出力データに基づいて、単一演算命令によって生成または参照されるデータの依存性である単一データ依存性に関する情報と、データ構造に作用する命令間のデータ依存性であるデータ構造依存性に関する情報と、ポインタ参照データに作用する命令間のデータ依存性であるポインタエイリアスデータ依存性に関する情報とを含むデータ依存枝情報を生成し、
前記中間語と前記データ依存枝情報とを入力し、当該データ依存枝情報に基づいて、当該中間語から異なるスレッド同士を接続するデータ依存枝と、当該データ依存枝に対応するスレッド出力データ生成命令およびスレッド入力参照命令とを抽出して、スレッド間データ依存命令対情報を生成し、
前記中間語を入力し、前記異なるスレッド同士を接続するデータ依存枝の中からポインタデータを抽出し、前記中間語の当該ポインタデータを定義する命令の直前にポインタエイリアスＩＤ演算命令を挿入して、第１のプログラムを生成し、
前記第１のプログラムと前記スレッド間データ依存命令対情報とを入力し、前記スレッド間データ依存命令対情報に基づいて、前記第１のプログラムの前記スレッド出力データ生成命令の直後にスレッド間データ送信命令を挿入し、前記スレッド間データ依存命令対情報に基づいて、前記第１のプログラムの前記スレッド入力データ参照命令の直前にスレッド間データ受信同期命令を挿入し、スレッド起動命令をそのスレッドが制御依存する分岐命令または関数入り口箇所に挿入して、第２のプログラムを生成し、
前記第２のプログラムを入力し、当該プログラムを各命令の前記スレッド属性に基づいて各スレッドに分割し、実行コードに変換する
ことを特徴とするプログラム処理方法。
【請求項４】
請求項３に記載のプログラム処理方法をコンピュータに実行させるための並列処理コンパイラ。
【請求項５】
請求項４に記載の並列処理コンパイラを格納した記録媒体。
【請求項６】
請求項１に記載のプログラム処理装置によって、並列処理プログラムが各スレッドに分割され、生成された実行コードに基づいて処理を行うマルチプロセッサシステムであって、
前記マルチプロセッサシステムは、各プロセッサに記憶部と、処理部とを備え、
前記処理部は、
前記プロセッサ間の制御を、データフローマシン型のデータ駆動制御方式により行うプロセッサ間通信処理部と、
前記プロセッサ内の制御を、ノイマン型プログラム駆動制御方式により行うプロセッサ内処理部と
を備え、
前記プロセッサ間通信処理部は、
前記プロセッサ内処理部との同期を行うことで、前記プロセッサ間での通信を実行し、前記プロセッサ間の通信データハザードを検出する機能を有し、
前記プロセッサ内処理部は、
前記記憶部に格納された前記実行コードに基づいて処理を行い、前記データハザードの検出結果に応じて、前記実行コードの実行または中断状態を制御する機能を有する
ことを特徴とするマルチプロセッサシステム。
【請求項７】
前記記憶部は、
ポート情報を保持するデータ通信ポートテーブルを格納し、
当該ポート情報は、
直接アクセス型データのプロセッサ間通信を行うためのデータサイズと、データ格納アドレスと、送信ポートＩＤの情報に加え、
ポインタ参照データまたはポインタデータのプロセッサ間通信を行うためのポートエイリアス情報を含み、
当該ポートエイリアス情報は、
ポインタが参照し得るすべてのデータオブジェクトのデータサイズと、データ格納アドレスと、エイリアスＩＤとからなるポインタエイリアスに関する情報を含み、
直接アクセス型データをプロセッサ間通信する場合は、
送信側の前記プロセッサの前記プロセッサ間通信処理部が、
前記直接アクセス型データのポート情報を取得し、当該ポート情報のデータ格納アドレスにより当該直接アクセス型データの送信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、当該データ格納アドレスのデータと、前記送信ポートＩＤとを受信側の前記プロセッサに送信し、
受信側の前記プロセッサの前記プロセッサ間通信処理部が、
受信した前記送信ポートＩＤからデータの受信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、受信した前記データを当該データ格納アドレスに格納し、
ポインタ参照データをプロセッサ間通信する場合は、
送信側の前記プロセッサの前記プロセッサ間通信処理部が、
当該ポインタ参照データの前記ポートエイリアス情報を取得し、当該ポートエイリアス情報から当該ポインタが参照しているデータオブジェクトの送信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、前記送信ポートＩＤと、前記ポインタ参照データのエイリアスＩＤと、当該ポインタが参照しているデータオブジェクト全体とを受信側の前記プロセッサに送信し、
受信側の前記プロセッサの前記プロセッサ間通信処理部が、
受信した前記送信ポートＩＤと、前記エイリアスＩＤとからデータオブジェクトの受信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、受信した前記データオブジェクトを当該データ格納アドレスに格納し、
ポインタデータをプロセッサ間通信する場合は、
前記送信側の前記プロセッサの前記プロセッサ間通信処理部が、
当該ポインタの前記ポートエイリアス情報を取得し、当該ポートエイリアス情報から当該ポインタが参照しているデータオブジェクトの送信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、当該ポインタの値から当該データ格納アドレスを引いたポインタオフセット値を計算し、前記送信ポートＩＤと、前記ポインタのエイリアスＩＤと、当該ポインタオフセット値とを受信側の前記プロセッサに送信し、
前記受信側の前記プロセッサの前記プロセッサ間通信処理部が、
受信した前記送信ポートＩＤと、前記エイリアスＩＤとからデータオブジェクトの受信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、受信した前記ポインタオフセット値に当該データ格納アドレスを足すことによって前記受信側の前記プロセッサの前記記憶部で有効となるポインタ値を求め、前記受信側の前記プロセッサの前記記憶部に当該ポインタ値を格納する
ことを特徴とする請求項６に記載のマルチプロセッサシステム。
【請求項８】
前記プロセッサ内処理部は、
外部データを最初に参照する命令の直前に前記プログラム処理装置によって挿入されたスレッド間データ受信同期命令を実行するにおいて、当該スレッド間データ受信同期命令に含まれる当該データの受信ポート情報を前記プロセッサ間通信処理部に転送し、
前記プロセッサ間通信処理部は、
当該受信ポート情報からデータ受信状態を調べ、データが未受信の場合は前記プロセッサ内処理部における処理の実行を中断させる
ことを特徴とする請求項６または請求項７に記載のマルチプロセッサシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列処理システムを実現するためのプログラム開発およびマルチプロセッサ構成技術、特に、並列処理システムを実現するためのコンパイラおよび実行システムの技術に関する。
【背景技術】
【０００２】
従来、並列処理システムを実現するためのプログラム開発技術には、主に二つの技術が存在していた。一つは、逐次プログラムの自動並列コンパイラをベースとした開発環境を提供する技術（自動並列コンパイラ技術）であり、もう一つは、逐次処理言語を拡張した並列処理言語を用いた開発環境を提供する技術（並列処理言語技術）である。
【０００３】
前者の自動並列コンパイラ技術として、マルチプロセッサ用自動並列化コンパイラ技術がある（例えば、非特許文献１、２または３参照）。これは、高級プログラミング言語（主にＦｏｒｔｒａｎまたはＣ言語）によって記述された逐次プログラムから並列処理プログラムを自動生成する技術である。具体的には、ループ（繰り返し処理部分）を分割して、それぞれの分割されたループを別々のプロセッサが並列実行するループ並列や、並列して実行することが可能な処理部分を別々のプロセッサが並列実行するブロック並列などが主な並列化手法である。
【０００４】
また、自動並列コンパイラ技術として、命令レベル並列化コンパイラ技術がある（例えば、非特許文献４または５参照）。これは、高級プログラミング言語（主にＣ言語）またはそれに類似する言語によって記述された逐次プログラムから、ＶＬＩＷ（Very Long Instruction Word）型プロセッサ（複数の演算器を持つプロセッサ）のための実行コードを自動生成する技術である。この実行コードは、水平命令コードと言われ、すべての演算器に対する実行命令が一つの命令の中に埋め込まれたものである。また、ＶＬＩＷは、依存関係にない複数の命令を一つの命令にまとめて同時に実行するマイクロプロセッサの高速化技術の一つである。
【０００５】
後者の並列処理言語技術として、並列プログラミング言語がある（例えば、非特許文献６、７または８参照）。これは、マルチプロセッサ用並列処理プログラムを直接記述する言語である。高級プログラミング言語をベースに、並列実行ループや並列実行ブロックなどを明示的に記述するための拡張をしたものであり、数多くの並列プログラミング言語が提唱されている。なお、非特許文献６はＶＰＰ  Fortranについて、非特許文献７はＨＰＦ（High Performance Fortran）について、非特許文献８はConcurrent Cについて記載されたものである。
【０００６】
また、並列処理言語技術として、メッセージ通信方式プログラミング技術がある（例えば、非特許文献９または１０参照）。これは、高級プログラミング言語（主にFortranまたはＣ言語）に、プロセッサ間メッセージ通信関数をライブラリ化した並列プログラミング環境（ＭＰＩ：Message Passing Interface，  ＰＶＭ：Parallel Virtual Machine）を提供する技術である。このメッセージ通信方式プログラミング技術では、ネットワークを介して接続された複数のＰＣ（Personal Computer）や、ワークステーションなどでプログラムを並列実行する。さらに、このメッセージ通信方式プログラミング技術は、分散メモリ型マルチプロセッサシステムや共有メモリ型マルチプロセッサシステムのための並列実行プログラムの開発にも利用される。なお、非特許文献９はＭＰＩ（Message Passing Interface）について、非特許文献１０はＰＶＭ（Parallel Virtual Machine）について記載されたものである。
【０００７】
並列処理システムを実現するためのマルチプロセッサ構成技術には、主に三つの技術が存在する。ノイマン型プログラム駆動制御方式、データフローマシン型データ駆動制御方式、そしてそれらの融合技術であるハイブリッドデータフローマシンによる制御方式（融合型アーキテクチャ）である。
【０００８】
ノイマン型プログラム駆動制御方式は、メモリに格納されたプログラムを、プログラムカウンタにより逐次的に読み出して実行する方式である（例えば、非特許文献１１または１２参照）。現在実用化されているマルチプロセッサシステムには、一般的にノイマン型プロセッサが搭載されている。この方式は、ノイマン型プロセッサが必要とするデータ送信命令、データ受信命令や、同期処理命令などがプログラム内に埋め込まれており、各プロセッサが読み込んだ命令を順番に実行する方式である。
【０００９】
また、データフローマシン型データ駆動制御方式は、参照データ（入力データ）がすべて生成されて実行可能になった命令から順次に実行する方式である（例えば、非特許文献１３ないし１６参照）。
【００１０】
さらに、ハイブリッドデータフローマシンによる制御方式は、複数の命令を集めた命令ブロックをデータフロー処理の単位とし、命令ブロック間の同期処理をデータ駆動で制御し、命令ブロック内部の処理をプログラム駆動で制御する方式である。この方式は、具体的には、各プロセッサの実行プログラムとデータ送信命令とをプログラム駆動による制御で実行する。また、データ受信命令と同期命令とをプログラム駆動による制御で実行するのではなく、プロセッサ間データ通信とこのデータを参照する命令との依存関係を保証する機構（外部データを参照する命令が、その外部データを受信するまで実行を中断する機構）によって実行する方式である（例えば、非特許文献１７参照）。ハイブリッドデータフローマシンは、例えば、非特許文献１７の30ページのTable 1のCategoryでMacro-dataflowとHybridにおいて提案されている。
【００１１】
【非特許文献１】岡本、合田、宮沢、本多、笠原、「OSCARマルチグレインコンパイラにおける階層型マクロデータフロー処理」、情報処理学会論文誌、Vol. 35, No. 4, pp.513-521 (1994)
【非特許文献２】Eigenmann, Hoeflinger, Padua, “On the Automatic Parallelization of the Perfect Benchmarks”, IEEE Trans. on Parallel and Distributed Systems, Vol. 9, No.1, pp.5-21 (1998)
【非特許文献３】Hall, Anderson, Amarasinghe, Murphy, Liao, Bugnion, Lam, “Maximizing Multiprocessor Performance with the SUIF Compiler”, IEEE Computer, Vol. 29, No. 12, pp.84-89 (1996)
【非特許文献４】Fisher, “Trace scheduling: A Technique for global Microcode Compaction”, IEEE Trans. Computers, Vol. 30, No. 7, pp.478-490, 1981
【非特許文献５】Wakabayashi, Tanaka, “Global Scheduling Independent of Control Dependencies Based on Condition Vectors”, Proceedings of 29th ACM/IEEE Conference on Design Automation, pp.112-115, 1992
【非特許文献６】岩下英俊、「HPFからみたVPP Fortran」、情報処理、38巻2号、pp.114-121、1997年2月
【非特許文献７】“HPF推進協議会 (HPFPC)”、[online]、[平成１７年８月１０日検索]、インターネット＜URL : http://www.hpfpc.org/＞
【非特許文献８】Gehani, et al, “Concurrent C”, Software, Practice and Experience, Vol.16, No. 9, pp.821-844, 1986
【非特許文献９】“Message Passing Interface Forum”、[online]、[平成１７年８月１０日検索]、インターネット＜URL : http://www.mpi-forum.org/index.html＞
【非特許文献１０】“PVM”、[online]、[平成１７年８月１０日検索]、インターネット＜URL : http://www.csm.ornl.gov/pvm/pvm＿home.html＞
【非特許文献１１】Hennessy, Patterson, “Computer Architecture: A Quantitative Approach”, Morgan Kaufman, San Mateo (1990)
【非特許文献１２】Kai Hwang, “Advanced Computer Architecture with Parallel Programming”, McGraw-Hill (1993)
【非特許文献１３】Arvind, Iannucci, “A Critique of multiprocessing von Neumann style”, Proceedings of 10th Annual Symposium on Computer Architecture (1983)
【非特許文献１４】Srini, “An Architectural Comparison of Dataflow Systems”, IEEE Computer, Vol 19, No. 3, pp.68-88 (1986)
【非特許文献１５】Arvind, Nikhil, “Executing a Program on the MIT Tagged-Token Dataflow Architecture”, IEEE Trans. Computer, Vol. 39, pp.300-318 (1990)
【非特許文献１６】児玉、坂井、山口,「データ駆動型シングルチッププロセッサEMC-Rの動作原理と実装」, 情報処理学会論文誌, Vol. 32, No. 7 (1991)
【非特許文献１７】Ben Lee, Ali R. Hurson: “Dataflow Architectures and Multithreading”, IEEE Computer, Volume 27, Number 8, pp.27-39, 1994）
【発明の開示】
【発明が解決しようとする課題】
【００１２】
しかしながら、前記自動並列コンパイラ技術によれば、逐次プログラムから並列処理プログラムを自動的に生成することが可能であるが、プログラムの分割方法や、分割されたプログラムのプロセッサへの割当方法などを柔軟に変更することができないため、プログラマがプログラム分割や、プロセッサ割当などに直接関与することができない。また、サーバ用途のＣＭＰ（Chip MultiProcessor）への応用が進んでおり、計算負荷が大きい科学計算などが主な応用分野であるが、応用分野が限定されており、例えば、システムＬＳＩ（Large Scale Integration）などといった分野に応用する技術がない。ここで、ＣＭＰとは、複数のプロセッサを１チップに集積し、共有バスで結合する技術のことをいう。
【００１３】
また、前記命令レベル並列化コンパイラ技術は、専用ＩＣ（Integrated Circuit）の回路設計にも応用されており、実用的な技術ではあるが、実現できる並列度が比較的低い。したがって、比較的高い並列度の並列処理システムには応用できない。
【００１４】
さらに、前記並列プログラミング言語は、科学技術分野などの特定の分野が対象となっており、限定された分野においてのみ使用されている。したがって、さらに幅広い分野には応用できない。
【００１５】
また、前記メッセージ通信方式プログラミング技術は、システムＬＳＩの上流設計においても採用されている技術であるが、個々のプロセッサ用にプログラムを開発し、通信命令を明示的に記述する必要があるために、プログラムの開発効率が悪い。つまり、プログラムのデバッグが困難であり、プロセッサに対する処理の割当の変更などのチューニングが困難である。
【００１６】
そこで、プログラマ等が逐次プログラムに簡単な記述を追加するだけで、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することを可能にする技術を出願人は開発したが、実際上この実行コードをマルチプロセッサシステムに適用するにあたっては、さらにマルチプロセッサシステムがポインタの通信処理およびポインタ参照データの通信処理を適切に行うための実行コードを生成する手段を開発する必要が生じている。
【００１７】
前記したノイマン型プログラム駆動制御方式は、データ依存性の保証（データを生成する命令とこれを参照する命令の実行順序を守る）を、プログラム制御によって実現する方式である。したがって、データ送信命令、データ受信命令や、同期処理命令などがソフトウェアによって実行され、これらの命令が各プロセッサによって順番に実行されるため、これらの処理時間が並列処理を行う上での大きなボトルネックになる。
さらに、分散メモリ型マルチプロセッサシステムは、共有メモリ型マルチプロセッサに比べると、共有メモリへのアクセス競合がないために高い並列性を発揮できるが、各プロセッサのメモリ空間が独立であるために、ポインタデータやポインタ参照データをプロセッサ間で共有することができず、並列処理プログラムを開発する上で大きな制約になる。
【００１８】
また、前記したデータフローマシン型データ駆動制御方式は、実行可能になった命令から順次に実行する方式であるため、理論上は高い並列性を実現することが可能である。しかし、実行可能な命令を管理する機構や、実行可能になった命令を複数のプロセッサに割り当てる機構が必要であるため、ハードウェア構成が複雑になる。また、実行プログラムを作成するために、データフローマシン専用のプログラミング言語とそのための専用のコンパイラとを用いる必要があり、プログラム開発上大きな制約となっている。したがって、実用化が難しい。
【００１９】
さらに、前記したハイブリッドデータフローマシンによる制御方式は、命令ブロック間の同期処理をデータ駆動で制御するため、ノイマン型プログラム駆動制御方式と比較して、並列処理に要する時間を軽減することができる。また、ハイブリッドデータフローマシンによる制御方式は、命令ブロック内部の処理をプログラム駆動で制御するため、データフローマシン型データ駆動制御方式と比較して、実行可能な命令を管理するための処理のオーバヘッドを軽減することができる。しかし、プログラム駆動制御で実行される命令ブロックの起動がデータ駆動制御方式（通信されたデータの中に起動すべき命令ブロックが指定されている方式）によるものであり、データフローマシンの複雑なハードウェア機構が必要不可欠である。また、命令ブロック起動時に、命令ブロック内で参照する外部データが揃っている必要があるため、命令ブロックを起動するために待機時間が発生するため、それがプロセッサ間通信において、遅延時間を発生する原因となる。
【００２０】
そこで本発明は、以上のような問題点に鑑みてなされたものであり、プログラマ等が逐次プログラムに簡単な記述を追加するだけで、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することを可能とし、さらにポインタの通信処理およびポインタ参照データの通信処理を行う場合にも適用できる実行コードを生成することを可能とすることを課題とする。また、マルチプロセッサによって並列処理を行う際に、複雑なハードウェア構成を不要とし、プロセッサ間通信で発生する遅延時間を短縮し、高性能なマルチプロセッサシステムの開発を容易にすることを課題とする。さらに、ポインタデータやポインタ参照データを異なるメモリ空間を持つプロセッサ間で共有することを可能にし、並列処理プログラムの開発の上で大きな自由度を提供することを課題とする。
【課題を解決するための手段】
【００２１】
本発明は、課題を解決するために創案されたものであり、請求項１に記載のプログラム処理装置は、スレッド記述が追加された並列処理プログラムを入力し、各スレッドに当該プログラムを分割し、マルチプロセッサシステムのための実行コードの生成を行うプログラム処理装置であって、前記プログラム処理装置は、記憶部と、処理部とを備え、前記処理部が、前記記憶部に入力された前記並列処理プログラム中の各スレッドの開始地点および終了地点を、予約されたキーワードまたは記号によって特定し、特定された開始地点および終了地点によって指定されたスレッド領域に含まれる各演算命令にスレッド属性を付加した中間語を生成する構文解析部と、前記中間語を入力し、当該中間語から命令ブロック入出力データを抽出して、当該命令ブロック入出力データに基づいて、単一演算命令によって生成または参照されるデータの依存性である単一データ依存性に関する情報と、データ構造に作用する命令間のデータ依存性であるデータ構造依存性に関する情報と、ポインタ参照データに作用する命令間のデータ依存性であるポインタエイリアスデータ依存性に関する情報とを含むデータ依存枝情報を生成するデータ依存性抽出部と、前記中間語と前記データ依存枝情報とを入力し、当該データ依存枝情報に基づいて、当該中間語から異なるスレッド同士を接続するデータ依存枝と、当該データ依存枝に対応するスレッド出力データ生成命令およびスレッド入力参照命令とを抽出して、スレッド間データ依存命令対情報を生成するスレッド間データ依存性抽出部と、前記中間語を入力し、前記異なるスレッド同士を接続するデータ依存枝の中からポインタデータを抽出し、前記中間語の当該ポインタデータを定義する命令の直前にポインタエイリアスＩＤ演算命令を挿入して、第１のプログラムを生成するポインタ通信補助命令生成部と、前記第１のプログラムと前記スレッド間データ依存命令対情報とを入力し、前記スレッド間データ依存命令対情報に基づいて、前記第１のプログラムの前記スレッド出力データ生成命令の直後にスレッド間データ送信命令を挿入し、前記スレッド間データ依存命令対情報に基づいて、前記第１のプログラムの前記スレッド入力データ参照命令の直前にスレッド間データ受信同期命令を挿入し、スレッド起動命令をそのスレッドが制御依存する分岐命令または関数入り口箇所に挿入して、第２のプログラムを生成するスレッド間データ通信命令挿入部と、前記第２のプログラムを入力し、当該プログラムを各命令の前記スレッド属性に基づいて各スレッドに分割し、実行コードに変換するプログラム分割・コード生成部とを備える構成とした。
【００２２】
このような構成によれば、構文解析部は、スレッド記述が追加された並列処理プログラムからスレッド領域に含まれる各演算命令にスレッド属性を付加した中間語を生成することが可能である。また、データ依存性抽出部は、構文解析部によって生成された中間語から命令ブロック入出力データを抽出し、単一演算命令によって生成または参照されるデータの依存性である単一データ依存性に関する情報と、データ構造に作用する命令間のデータ依存性であるデータ構造依存性に関する情報と、ポインタ参照データに作用する命令間のデータ依存性であるポインタエイリアスデータ依存性に関する情報とを含むデータ依存枝情報を生成することが可能である。さらに、スレッド間データ依存性抽出部は、構文解析部によって生成された中間語から、データ依存性抽出部によって抽出されたデータ依存枝情報に基づいて、異なるスレッド同士を接続するデータ依存枝と、データ依存枝に対応するスレッド出力データ生成命令およびスレッド入力参照命令とを抽出して、スレッド間データ依存命令対情報を生成することが可能である。また、ポインタ通信補助命令生成部は、異なるスレッド同士を接続するデータ依存枝の中からポインタデータを抽出し、中間語のポインタデータを定義する命令の直前にポインタエイリアスＩＤ演算命令を挿入して、第１のプログラムを生成することが可能である。さらに、スレッド間データ通信命令挿入部は、スレッド間データ依存命令対情報に基づいて、第１のプログラムのスレッド出力データ生成命令の直後にスレッド間データ送信命令を挿入し、スレッド間データ依存命令対情報に基づいて、第１のプログラムのスレッド入力データ参照命令の直前にスレッド間データ受信同期命令を挿入し、スレッド起動命令をそのスレッドが制御依存する分岐命令または関数入り口箇所に挿入して、第２のプログラムを生成することが可能である。また、プログラム分割・コード生成部は、第２のプログラムを各命令のスレッド属性に基づいて各スレッドに分割し、実行コードに変換することが可能である。したがって、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、プログラマ等が逐次プログラムに簡単な記述を追加するだけで、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能である。
【００２３】
また、請求項２に記載の並列処理プログラムは、請求項１に記載のプログラム処理装置の記憶部に入力される並列処理プログラムであって、前記プログラム処理装置の処理部によって、各スレッド処理の開始地点と終了地点が、前記並列処理プログラム内に記述された予約されたキーワードまたは記号によって特定され、特定された開始地点および終了地点によって指定されたスレッド領域に含まれる各演算命令にスレッド属性が付加され、当該スレッド属性に基づいて前記各スレッドが行う処理に分割され、実行コードに変換される構成とした。
【００２４】
このような構成によれば、プログラム処理装置の処理部は、各スレッドの開始地点と終了地点を、プログラム処理装置の記憶部に入力された並列処理プログラム内に記述された予約されたキーワードまたは記号によって特定し、特定した開始地点および終了地点によって指定したスレッド領域に含まれる各演算命令にスレッド属性を付加し、当該スレッド属性に基づいて各スレッドに分割し、実行コードに変換することが可能である。したがって、このようなプログラムを入力することによってプログラム処理装置は、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能である。
【００２５】
また、請求項３に記載のプログラム処理方法は、スレッド記述が追加された並列処理プログラムを入力し、各スレッドに当該プログラムを分割し、マルチプロセッサシステムのための実行コードの生成を行うプログラム処理装置によるプログラム処理方法であって、前記プログラム処理装置が、記憶部と、処理部とを備え、前記処理部が、前記記憶部に入力された前記並列処理プログラム中の各スレッドの開始地点および終了地点を、予約されたキーワードまたは記号によって特定し、特定された開始地点および終了地点によって指定されたスレッド領域に含まれる各演算命令にスレッド属性を付加した中間語を生成し、前記中間語を入力し、当該中間語から命令ブロック入出力データを抽出して、当該命令ブロック入出力データに基づいて、単一演算命令によって生成または参照されるデータの依存性である単一データ依存性に関する情報と、データ構造に作用する命令間のデータ依存性であるデータ構造依存性に関する情報と、ポインタ参照データに作用する命令間のデータ依存性であるポインタエイリアスデータ依存性に関する情報とを含むデータ依存枝情報を生成し、前記中間語と前記データ依存枝情報とを入力し、当該データ依存枝情報に基づいて、当該中間語から異なるスレッド同士を接続するデータ依存枝と、当該データ依存枝に対応するスレッド出力データ生成命令およびスレッド入力参照命令とを抽出して、スレッド間データ依存命令対情報を生成し、前記中間語を入力し、前記異なるスレッド同士を接続するデータ依存枝の中からポインタデータを抽出し、前記中間語の当該ポインタデータを定義する命令の直前にポインタエイリアスＩＤ演算命令を挿入して、第１のプログラムを生成し、前記第１のプログラムと前記スレッド間データ依存命令対情報とを入力し、前記スレッド間データ依存命令対情報に基づいて、前記第１のプログラムの前記スレッド出力データ生成命令の直後にスレッド間データ送信命令を挿入し、前記スレッド間データ依存命令対情報に基づいて、前記第１のプログラムの前記スレッド入力データ参照命令の直前にスレッド間データ受信同期命令を挿入し、スレッド起動命令をそのスレッドが制御依存する分岐命令または関数入り口箇所に挿入して、第２のプログラムを生成し、前記第２のプログラムを入力し、当該プログラムを各命令の前記スレッド属性に基づいて各スレッドに分割し、実行コードに変換する構成とした。
【００２６】
このような方法によれば、プログラム処理装置の処理部は、スレッド記述が追加された並列処理プログラムからスレッド領域に含まれる各演算命令にスレッド属性を付加した中間語を生成することが可能である。また、プログラム処理装置の処理部は、中間語から命令ブロック入出力データを抽出し、単一演算命令によって生成または参照されるデータの依存性である単一データ依存性に関する情報と、データ構造に作用する命令間のデータ依存性であるデータ構造依存性に関する情報と、ポインタ参照データに作用する命令間のデータ依存性であるポインタエイリアスデータ依存性に関する情報とを含むデータ依存枝情報を生成することが可能である。さらに、プログラム処理装置の処理部は、中間語から、データ依存枝情報に基づいて、異なるスレッド同士を接続するデータ依存枝と、データ依存枝に対応するスレッド出力データ生成命令およびスレッド入力参照命令とを抽出して、スレッド間データ依存命令対情報を生成することが可能である。また、プログラム処理装置の処理部は、異なるスレッド同士を接続するデータ依存枝の中からポインタデータを抽出し、中間語のポインタデータを定義する命令の直前にポインタエイリアスＩＤ演算命令を挿入して、第１のプログラムを生成することが可能である。さらに、プログラム処理装置の処理部は、スレッド間データ依存命令対情報に基づいて、第１のプログラムのスレッド出力データ生成命令の直後にスレッド間データ送信命令を挿入し、スレッド間データ依存命令対情報に基づいて、第１のプログラムのスレッド入力データ参照命令の直前にスレッド間データ受信同期命令を挿入し、スレッド起動命令をそのスレッドが制御依存する分岐命令または関数入り口箇所に挿入して、第２のプログラムを生成することが可能である。また、プログラム処理装置の処理部は、第２のプログラムを各命令のスレッド属性に基づいて各スレッドに分割し、実行コードに変換することが可能である。したがって、プログラム処理装置は、このような方法を実行することで、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、スレッド記述が追加された並列処理プログラムを入力して、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能である。
【００２７】
さらに、請求項４に記載の並列処理コンパイラは、請求項３に記載のプログラム処理方法をコンピュータに実行させるための並列処理コンパイラとした。
【００２８】
このような構成によれば、並列処理コンパイラは、コンピュータに前記したプログラム処理方法を実行させることが可能である。したがって、この並列処理コンパイラをコンピュータに組み込み、コンピュータに前記したプログラム処理方法を実行させることによって、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、スレッド記述が追加された並列処理プログラムを入力して、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能である。
【００２９】
また、請求項５に記載の記録媒体は、請求項４に記載の並列処理コンパイラを格納した記録媒体とした。
【００３０】
このような構成によれば、記録媒体に格納された並列処理コンパイラをコンピュータに組み込み、コンピュータに前記したプログラム処理方法を実行させることによって、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、スレッド記述が追加された並列処理プログラムを入力して、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能である。
【００３１】
さらに、請求項６に記載のマルチプロセッサシステムは、請求項１に記載のプログラム処理装置によって、並列処理プログラムが各スレッドに分割され、生成された実行コードに基づいて処理を行うマルチプロセッサシステムであって、前記マルチプロセッサシステムが、各プロセッサに記憶部と、処理部とを備え、前記処理部が、前記プロセッサ間の制御を、データフローマシン型のデータ駆動制御方式により行うプロセッサ間通信処理部と、前記プロセッサ内の制御を、ノイマン型プログラム駆動制御方式により行うプロセッサ内処理部とを備え、前記プロセッサ間通信処理部が、前記プロセッサ内処理部との同期を行うことで、前記プロセッサ間での通信を実行し、前記プロセッサ間の通信データハザードを検出する機能を有し、前記プロセッサ内処理部が、前記記憶部に格納された前記実行コードに基づいて処理を行い、前記データハザードの検出結果に応じて、前記実行コードの実行または中断状態を制御する機能を有する構成とした。
【００３２】
このような構成によれば、マルチプロセッサシステムは、請求項１に記載のプログラム処理装置によって生成された通信命令を含む実行コードに基づいて処理を行なうので、データフローマシン型のデータ駆動制御方式により行うプロセッサ間通信処理部が、通信されたデータの中で起動すべき命令ブロックを指定する必要がなくなり、複雑なハードウェア構成が不要となる。また、プロセッサ間通信処理部とプロセッサ内処理部とが構造的に分離されながらも、プロセッサ間通信処理部におけるデータ通信ハザード検出とプロセッサ内処理部における処理の実行または中断状態の制御を密に同期させることが可能となり、プロセッサ間通信で発生する遅延時間を短縮することができる。さらに、マルチプロセッサシステムで必要とされるデータ送受信や同期処理機能をすべてプロセッサ間通信処理部が備える構成をとることにより、プログラム制御方式により処理を行う部分（プロセッサ内処理部）のプログラムの開発が容易になり、高性能なマルチプロセッサシステムの開発が容易になる。
【００３３】
また、請求項７に記載のマルチプロセッサシステムは、請求項６に記載のマルチプロセッサシステムにおいて、前記記憶部が、ポート情報を保持するデータ通信ポートテーブルを格納し、当該ポート情報が、直接アクセス型データのプロセッサ間通信を行うためのデータサイズと、データ格納アドレスと、送信信ポートＩＤの情報に加え、ポインタ参照データまたはポインタデータのプロセッサ間通信を行うためのポートエイリアス情報を含み、当該ポートエイリアス情報が、ポインタが参照し得るすべてのデータオブジェクトのデータサイズと、データ格納アドレスと、エイリアスＩＤとからなるポインタエイリアスに関する情報を含み、直接アクセス型データをプロセッサ間通信する場合は、送信側の前記プロセッサの前記プロセッサ間通信処理部が、前記直接アクセス型データのポート情報を取得し、当該ポート情報のデータ格納アドレスにより当該直接アクセス型データの送信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、当該データ格納アドレスのデータと、前記送信ポートＩＤとを受信側の前記プロセッサに送信し、受信側の前記プロセッサの前記プロセッサ間通信処理部が、受信した前記送信ポートＩＤからデータの受信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、受信した前記データを当該データ格納アドレスに格納し、ポインタ参照データをプロセッサ間通信する場合は、送信側の前記プロセッサの前記プロセッサ間通信処理部が、当該ポインタ参照データの前記ポートエイリアス情報を取得し、当該ポートエイリアス情報から当該ポインタが参照しているデータオブジェクトの送信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、前記送信ポートＩＤと、前記ポインタ参照データのエイリアスＩＤと、当該ポインタが参照しているデータオブジェクト全体とを受信側の前記プロセッサに送信し、受信側の前記プロセッサの前記プロセッサ間通信処理部が、受信した前記送信ポートＩＤと、前記エイリアスＩＤとからデータオブジェクトの受信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、受信した前記データオブジェクトを当該データ格納アドレスに格納し、ポインタデータをプロセッサ間通信する場合は、前記送信側の前記プロセッサの前記プロセッサ間通信処理部が、当該ポインタの前記ポートエイリアス情報を取得し、当該ポートエイリアス情報から当該ポインタが参照しているデータオブジェクトの送信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、当該ポインタの値から当該データ格納アドレスを引いたポインタオフセット値を計算し、前記送信ポートＩＤと、前記ポインタのエイリアスＩＤと、当該ポインタオフセット値とを受信側の前記プロセッサに送信し、前記受信側の前記プロセッサの前記プロセッサ間通信処理部が、受信した前記送信ポートＩＤと、前記エイリアスＩＤとからデータオブジェクトの受信側の前記プロセッサの前記記憶部におけるデータ格納アドレスを特定し、受信した前記ポインタオフセット値に当該データ格納アドレスを足すことによって前記受信側の前記プロセッサの前記記憶部で有効となるポインタ値を求め、前記受信側の前記プロセッサの前記記憶部に当該ポインタ値を格納する構成とした。
【００３４】
このような構成によれば、プロセッサ間通信処理部がポートエイリアス情報を備えることにより、ポインタデータやポインタ参照データを異なるメモリ空間を持つプロセッサ間で共有することを可能にし、並列処理プログラムの開発の上で大きな自由度を提供できる。
【００３５】
さらに、請求項８に記載のマルチプロセッサシステムは、請求項６または請求項７に記載のマルチプロセッサシステムにおいて、前記プロセッサ内処理部が、外部データを最初に参照する命令の直前に前記プログラム処理装置によって挿入されたスレッド間データ受信同期命令を実行するにおいて、当該スレッド間データ受信同期命令に含まれる当該データの受信ポート情報を前記プロセッサ間通信処理部に転送し、前記プロセッサ間通信処理部が、当該受信ポート情報からデータ受信状態を調べ、データが未受信の場合は前記プロセッサ内処理部における処理の実行を中断させる構成とした。
【００３６】
このような構成によれば、プロセッサ間通信処理部が、他のプロセッサから送信されるデータの個別の受信状態を瞬時に調べ、必要な外部データが未受信の場合は、直ちにプロセッサ内処理部の実行を中断させる機能を備えているため、命令ブロック内で参照する外部データがすべて揃う前にプロセッサ内処理部における処理の実行を開始することが可能であり、データ待機時間を大幅に短縮することができる。
【発明の効果】
【００３７】
請求項１に記載のプログラム処理装置によれば、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、スレッド記述が追加された並列処理プログラムを入力して、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能である。したがって、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、プログラマ等が逐次プログラムに簡単な記述を追加するだけで、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能になる。
【００３８】
また、請求項２に記載の並列処理プログラムによれば、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、並列処理プログラムがプログラム処理装置に入力されることによって、プログラム処理装置が、並列処理プログラムをマルチプロセッサシステムに高性能な並列処理を実行させるための実行コードに変換することが可能である。したがって、プログラマ等が逐次プログラムに簡単な記述を追加するだけで、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能になる。
【００３９】
さらに、請求項３に記載のプログラム処理方法によれば、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、プログラム処理装置が、プログラム処理方法を実行することで、スレッド記述が追加された並列処理プログラムを入力して、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能である。したがって、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、プログラマ等が逐次プログラムに簡単な記述を追加するだけで、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能になる。
【００４０】
また、請求項４に記載の並列処理コンパイラによれば、この並列処理コンパイラをコンピュータに組み込み、コンピュータに前記したプログラム処理方法を実行させることによって、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、コンピュータは、スレッド記述が追加された並列処理プログラムを入力して、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能である。したがって、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、プログラマ等が逐次プログラムに簡単な記述を追加するだけで、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能になる。
【００４１】
さらに、請求項５に記載の記録媒体によれば、この記録媒体に格納された並列処理コンパイラをコンピュータに組み込み、コンピュータに前記したプログラム処理方法を実行させることによって、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、スレッド記述が追加された並列処理プログラムを入力して、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能である。したがって、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、プログラマ等が逐次プログラムに簡単な記述を追加するだけで、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能になる。
【００４２】
また、請求項６に記載のマルチプロセッサシステムによれば、マルチプロセッサによって並列処理を行う際に、複雑なハードウェア構成が不要となり、プロセッサ間通信で発生する遅延時間を短縮し、高性能なマルチプロセッサシステムの開発を容易にすることが可能となる。
さらに、請求項７に記載のマルチプロセッサシステムによれば、ポインタデータやポインタ参照データを異なるメモリ空間を持つプロセッサ間で共有することを可能にし、並列処理プログラムの開発の上で大きな自由度を提供できる。
また、請求項８に記載のマルチプロセッサシステムによれば、データ待機時間を大幅に短縮することができる。
【発明を実施するための最良の形態】
【００４３】
以下、図面を用いて本発明の実施形態について説明する。
（第１の実施形態）
以下、図面（図１〜図１６）を用いて本発明の第１の実施形態について説明する。
図１は、プログラム処理装置の機能例を示す機能ブロック図である。図１に示すように、プログラム処理装置１Ａは、並列処理プログラム５０Ａを入力して、通信命令を含む分割プログラム５５Ａを出力する。ここで、図２および図３を用いて、本実施形態で用いる並列処理プログラム５０Ａの説明をする。
【００４４】
図２に示すプログラムは、プログラマ等が記述したプログラムであり、スレッド記述を追加する前のプログラムの一例である。なお、このプログラムはＣ言語で記述されたものである。
【００４５】
また、図３に示すプログラムは、プログラマ等が記述したプログラムであり、図２に示したプログラムにスレッド記述を追加した後のプログラム（以下、並列処理プログラムともいう）の一例である。ここで、「スレッド」とは、一つのプロセッサが実行するプログラムの単位であるとし、これらのスレッドを別々のプロセッサで並列処理することを想定している。
なお、このプログラムは、Ｃ言語に「THREAD」という新たなキーワードが追加された拡張Ｃ言語によって記述されており、THREADに続く「（スレッド名）」によってスレッド名が指定され、これに続く括弧記号｛  …  ｝で囲まれたコード領域（スレッド領域）によってスレッドの有効な範囲が示されている。スレッド記述が追加されたプログラム（並列処理プログラム）とは、このようにスレッドの有効な範囲が記述されたプログラムのことを指すものとする。なお、いずれのスレッドにも含まれないコード領域の処理は「ベーススレッド」と呼ぶことにし、その他のスレッドと同等に扱うこととする。既存のＣコンパイラを用いて、この拡張Ｃ言語によって書かれたソースコードから実行コードを生成するためには、例えばスレッド宣言を無効化するプリプロセッサ「#define THREAD(n)」を予めプログラムの最上部（またはプログラム内）に挿入すればよい。このプリプロセッサにより、例えば「THREAD(p1)」が空の文字列に変換され、これに続く括弧記号｛  …  ｝が通常のＣ言語におけるスコープ宣言として解釈され、既存のＣコンパイラで正常に処理される。
【００４６】
図１に戻って、プログラム処理装置１Ａの説明を続ける。
図１に示すように、プログラム処理装置１Ａは、構文解析部３１と、データ依存性抽出部３２Ａと、スレッド間データ依存性抽出部３３と、通信命令挿入部３５Ａと、プログラム分割・コード生成部３９とを含んで構成されている。以下、プログラム処理装置１Ａを構成する各要素について説明する。
【００４７】
（構文解析部３１の説明）
構文解析部３１は、並列処理プログラム５０Ａを入力して、当該プログラムの構文を解析する。また、並列処理プログラム５０Ａから中間語を生成する。構文解析部３１は、通常のコンパイラが有する公知の構文解析の機能に加え、拡張Ｃ言語の予約語に追加されたTHREADキーワードを認識し、それに続く「（スレッド名）」でスレッド名を抽出し、これに続くスコープ（{…}）で囲まれるコード領域（スレッド領域）が、このスレッドであることを判別し、中間語に変換された各演算命令にスレッドの属性（スレッド属性）を付加する機能を有する。スレッド属性は、各演算命令がどのスレッドに含まれるかを判別するための情報であり、各スレッドに固有の番号を予め割り当てておき、スレッドに含まれるすべての演算命令にこの番号を割り振ることでスレッド属性情報を付加することができる。
【００４８】
ここで、スレッド領域が入れ子構造をなす場合、即ち、あるスレッド領域の中に別のスレッド領域が存在する場合、各演算命令は、これを含むスレッド領域のうち最も内側のもののスレッド属性を持つとする。例えば、
THREAD(p0){
a = 1;
THREAD(p1){
b = 2;
}
}
という入れ子構造（スレッドp0の領域内にスレッドp1が含まれる構造）が存在した場合、演算b = 2;はスレッドp0とスレッドp1とに含まれる。このとき、この演算b = 2;は、最も内側のスレッドp1のスレッド属性を持つ。また、演算a = 1;のスレッド属性はスレッドp0である。
さらに、スレッド領域に関数呼出し命令が含まれる場合、その関数のベーススレッドは関数呼出し命令が属するスレッドと同一であるものとする。例えば、図３に示した並列処理プログラム５０Ａの２１行目（RandomSignal()）および２５行目(printf())の命令は、それぞれスレッドp4内およびスレッドp5内における関数呼出し命令であり、これらの関数の処理は、これらを呼び出したスレッドで実行されることになるので、RandomSignal()およびprintf()のベーススレッドは、それぞれスレッドp4およびスレッドp5と同一となる。
また、説明の都合上、以下では、中間語として適宜、並列処理プログラム５０Ａを用いて説明することにする。
【００４９】
（データ依存性抽出部３２Ａの説明）
データ依存性抽出部３２Ａは、構文解析部３１によって生成された中間語を入力し、データ依存性を抽出する。データ依存性抽出部３２Ａは、命令参照・生成データ抽出部３２１と、関数内間接参照・生成データ抽出部３２３と、命令ブロック抽出部３２４と、命令ブロック入出力データ抽出部３２５Ａと、データ依存枝生成部３２６と、出力データ生成命令・入力データ参照命令抽出部３２７とを含んで構成されている。
【００５０】
（命令参照・生成データ抽出部３２１の説明）
命令参照・生成データ抽出部３２１は、構文解析部３１によって生成された中間語を入力し、中間語内の各命令の参照データリストおよび生成データリストを生成する。
命令参照・生成データ抽出部３２１で生成される各命令の参照データリストは、その命令が直接参照するすべてのデータからなり、単項演算命令の場合は一つの参照データを持ち、二項演算命令の場合は二つの参照データを持ち、関数呼出し命令の場合は関数呼出引数データすべてが参照データと見なされる。
また、命令参照・生成データ抽出部３２１で生成される各命令の生成データリストは、その命令が直接生成するデータからなり、戻り値のない関数の関数呼出し命令では直接生成するデータはなく、それ以外の命令では一つの直接生成するデータを持つ。
命令参照・生成データ抽出部３２１によって生成された参照データリストおよび生成データリストは、関数内間接参照・生成データ抽出部３２３に引き渡される。また、命令参照・生成データ抽出部３２１によって生成された参照データリストおよび生成データリストは、各命令の依存性を抽出する処理において、適宜利用される。
【００５１】
（関数内間接参照・生成データ抽出部３２３の説明）
関数内間接参照・生成データ抽出部３２３は、命令参照・生成データ抽出部３２１によって生成された参照データリストと生成データリストとを入力し、関数呼出し命令が存在した場合、呼出された関数内で参照または生成されるグローバル変数やポインタ型関数引数によるポインタ参照データ（以下、間接依存データという）を抽出するものである。
関数呼出し命令のデータ依存性解析においては、通常の演算命令としてのデータ依存性（以下、直接的データ依存性という）を考慮しなければならない他、関数内部の演算で発生したデータ依存性のうち関数呼出し側まで伝播する依存性（以下、間接的データ依存性という）を考慮しなくてはならない場合がある。直接的データ依存性を示すものとしては、関数呼出し引数（直接参照データ）や関数戻り値（直接生成データ）などがあり、この直接参照データおよび直接生成データは、命令参照・生成データ抽出部３２１から受け取った参照データリストおよび生成データリスト内に存在している。
【００５２】
関数内間接参照・生成データ抽出部３２３は、命令参照・生成データ抽出部３２１から受け取った参照データリストおよび生成データリストを参照して、関数内部で参照される（関数引数以外の）間接依存データ（関数内間接参照データ）を抽出し、各関数呼出し命令の参照データリストに追加する。また、関数内間接参照・生成データ抽出部３２３は、命令参照・生成データ抽出部３２１から受け取った参照データリストおよび生成データリストを参照して、関数内部で生成される（書換えられる）（関数戻り値以外の）関数依存データ（関数内間接生成データ）を抽出し、各関数呼出し命令の生成データリストに追加する。関数内間接参照・生成データ抽出部３２３の処理は、通常のコンパイラが有する公知の間接依存データを抽出する処理と特に変わらないため、説明を省略する。
関数内間接参照・生成データ抽出部３２３によって生成された関数呼出し命令の参照データリストおよび生成データリストは、各命令の依存性を抽出する処理において、適宜利用される。これにより、並列処理プログラム５０Ａ内の大局的なデータ依存性が抽出できるようになる。
【００５３】
（命令ブロック抽出部３２４の説明）
命令ブロック抽出部３２４は、構文解析部３１によって生成された中間語を入力し、その中間語から命令ブロックを抽出する。ここで、命令ブロックとは、プログラムを分岐点、合流点および関数呼出命令の前後と、スレッド境界とを境界線として分割した結果生じるブロックのことである。以下、図３および図４を用いて、命令ブロック抽出部３２４の機能の一例について説明する。
【００５４】
命令ブロック抽出部３２４は、並列処理プログラム５０Ａの７行目にある繰り返し文を見付け、条件式「t<signalLength」の前でプログラムが合流すると判定し、プログラム合流点（合流ブロック）Ｃ１を抽出する。また、命令ブロック抽出部３２４は、並列処理プログラム５０Ａの７行目にある条件式「t<signalLength」の後でプログラムが分岐すると判定し、プログラム分岐点（分岐ブロック）Ｂ１を抽出する（図４参照）。さらに、命令ブロック抽出部３２４は、並列処理プログラム５０Ａの２１行目にある関数呼出命令Ｄ１「RandomSignal」と、２５行目にある関数呼出命令Ｄ２「printf」とを抽出する（図４参照）。また、命令ブロック抽出部３２４は、並列処理プログラム５０Ａから各スレッドｐ１〜ｐ５による処理の直前と直後の各スレッド境界Ｅ１〜Ｅ６を抽出する（図４参照）。
【００５５】
図４は、命令ブロック抽出部３２４が、構文解析部３１によって生成された中間語から命令ブロックを抽出した結果を示すプログラムグラフである。なお、図４の各演算の左に示した記号（例えば［p1］）は、その演算を実行するスレッド名を示しており、［*］は前記説明のベーススレッドを示している。構文解析部３１によって生成された中間語における各演算処理は、２項演算または単項演算に分割される（演算が分割される際に利用される途中変数には、「$xx」という名の一時変数が割り当てられる）。
【００５６】
以上説明した命令ブロック抽出部３２４の機能によって、命令ブロック抽出部３２４は、並列処理プログラム５０Ａからプログラム分岐点Ｂ１、プログラム合流点Ｃ１、関数呼出命令Ｄ１、関数呼出命令Ｄ２およびスレッド境界Ｅ１〜Ｅ６を抽出することによって、図４に示すように、並列処理プログラム５０Ａを命令ブロックＡ１〜Ａ７に分割することができる。このように、命令ブロック抽出部３２４は、並列処理プログラム５０Ａ内の各命令に命令ブロックおよびスレッドを対応付けた命令ブロックに関する情報（命令ブロック情報）を生成することができる。
【００５７】
また、命令ブロック抽出部３２４によって生成された命令ブロックに関する情報（命令ブロック情報）は、命令ブロック入出力データ抽出部３２５Ａに引き渡される。
【００５８】
（命令ブロック入出力データ抽出部３２５Ａの説明）
命令ブロック入出力データ抽出部３２５Ａは、構文解析部３１によって生成された中間語と、命令ブロック抽出部３２４によって抽出された命令ブロック情報とを入力し、その命令ブロック情報を用いて、その中間語から命令ブロック入力データと、命令ブロック出力データとを抽出する。命令ブロック入力データとは、命令ブロック内の各命令が参照するデータのうち、別の命令ブロック内で生成されるものである。また、命令ブロック出力データとは、命令ブロック内の各命令が生成するデータのうち、別のブロック内で参照されるものである。以下、図３および図５を用いて、命令ブロック入出力データ抽出部３２５Ａの機能の一例について説明する。
【００５９】
命令ブロック入出力データ抽出部３２５Ａは、命令ブロック内の各命令が参照するデータとして、例えば、並列処理プログラム５０Ａの９行目にある変数sigIn2を見付ける。命令ブロック入出力データ抽出部３２５Ａは、命令ブロック抽出部３２４によって抽出された命令ブロック情報を参照して、この変数sigIn2が命令ブロックＡ３内の命令で参照されていると判定する。また、命令ブロック入出力データ抽出部３２５Ａは、命令ブロック抽出部３２４によって抽出された命令ブロック情報と、命令参照・生成データ抽出部３２１によって生成された参照データリストおよび生成データリストとを参照して、この変数sigIn2が、参照される命令ブロックＡ３以外の命令ブロック（命令ブロックＡ１内の命令または命令ブロックＡ４）で生成されていると判定する。その結果、命令ブロック入出力データ抽出部３２５Ａは、命令ブロック入力データとして、変数sigIn2を抽出することができる。
【００６０】
また、命令ブロック入出力データ抽出部３２５Ａは、命令ブロック内の各命令が生成するデータとして、例えば、並列処理プログラム５０Ａの１０行目にある変数sigOutを見付ける。命令ブロック入出力データ抽出部３２５Ａは、命令ブロック抽出部３２４によって抽出された命令ブロック情報を参照して、この変数sigOutが命令ブロックＡ３内の命令で生成されていると判定する。また、命令ブロック入出力データ抽出部３２５Ａは、命令ブロック抽出部３２４によって抽出された命令ブロック情報と、命令参照・生成データ抽出部３２１によって生成された参照データリストおよび生成データリストとを参照して、この変数sigOutが、生成される命令ブロックＡ３以外の命令ブロック（命令ブロックＡ４）で参照されていると判定する。その結果、命令ブロック入出力データ抽出部３２５Ａは、命令ブロック出力データとして、変数sigOutを抽出することができる。
【００６１】
図５は、命令ブロック入出力データ抽出部３２５Ａが、構文解析部３１によって生成された中間語から命令ブロック入力データと、命令ブロック出力データとを抽出した結果を示すプログラムグラフである。図５には、例として、命令ブロック入力データＦ１や、命令ブロック出力データＧ１などが示されている。
【００６２】
以上説明した命令ブロック入出力データ抽出部３２５Ａの機能によって、命令ブロック入出力データ抽出部３２５Ａは、命令ブロック情報を用いて、図５に示すように、並列処理プログラム５０Ａから命令ブロック入出力データを抽出することができる。このように、命令ブロック入出力データ抽出部３２５Ａは、命令ブロック抽出部３２４によって抽出された命令ブロックと、その命令ブロック内の入出力データとを対応付けた命令ブロック入出力データに関する情報（命令ブロック入出力データ情報）を生成することができる。
【００６３】
また、命令ブロック抽出部３２４によって生成された命令ブロック情報と、命令ブロック入出力データ抽出部３２５Ａによって生成された命令ブロック入出力データに関する情報（命令ブロック入出力データ情報）とは、データ依存枝生成部３２６に引き渡される。
【００６４】
（データ依存枝生成部３２６の説明）
データ依存枝生成部３２６は、構文解析部３１によって生成された中間語と、命令ブロック抽出部３２４によって生成された命令ブロック情報と、命令ブロック入出力データ抽出部３２５Ａによって生成された命令ブロック入出力データ情報とを入力し、その命令ブロック情報と命令ブロック入出力データ情報とを用いて、データ依存枝を生成する。
データ依存枝とは、入力データと出力データとの間に依存関係（あるブロックの出力データを別のブロックが入力データとして使うという関係）が存在する場合に、命令ブロックの入出力データを「ノード（頂点）」とみなし、出力データノードから入力データノードに向けて接続するものである。ただし、このデータ依存関係が分岐点や合流点を隔てる場合は、対応する分岐ブロックまたは合流ブロックにデータノードを付加して、データ依存枝がこのデータノードを経由するようにする。なお、このデータ依存枝のグラフ構造は、公知の論文であるJohnson, Pingali, "Dependence-Based Program Analysis", ACM Conference on Programming Language Design and Implementation, pp.78-89 (1993)によって提案されたDependence Flow Graphがベースとなっている。このDependence Flow Graphは、前記説明の分岐点や合流点を隔てるデータ依存関係において、対応する分岐ブロックまたは合流ブロックにデータノードを付加して、データ依存枝がこのデータノードを経由することを特徴とするデータ依存関係を表現するためのグラフ構造である。以下、図３、図５および図６を用いて、データ依存枝生成部３２６の機能の一例について説明する。
【００６５】
図６は、データ依存枝生成部３２６が、構文解析部３１によって生成された中間語からデータ依存枝を生成した結果を示すプログラムグラフである。
【００６６】
データ依存枝生成部３２６は、命令ブロック入出力データ抽出部３２５Ａによって生成された命令ブロック入出力データ情報を参照して、例えば、命令ブロックＡ５の命令ブロック入力データとしてsigIn0を見付ける。ここで、命令ブロックＡ５からプログラムグラフ上を逆方向に辿りながら、sigIn0を生成する命令ブロック（即ち出力データとしてsigIn0を持つ命令ブロック）を探索する。この逆方向探索の途中で分岐ブロックＢ１をT分岐枝（命令ブロックＡ２の条件文が成立する、即ち「True」の場合にプログラムが進行する方向）を経由して通過するので、その分岐ブロックＢ１にsigIn0(T)のデータノードを付加し、このデータノードと命令ブロックＡ５の入力データノードsigIn0の間をデータ依存枝Ｋ１で接続する。さらに探索を続けると、合流ブロックＣ１を通過するので、この合流ブロックＣ１にもsigIn0のデータノードを付加し、このデータノードと分岐ブロックＢ１のデータノードsigIn0(T)の間をデータ依存枝Ｋ２で接続する。合流ブロックＣ１からの探索は、命令ブロックＡ１と命令ブロックＡ７への２つの合流元の方向に続ける。命令ブロックＡ１は出力データとしてsigIn0を持つので、この出力データノードと合流ブロックＣ１のデータノードsigIn0をデータ依存枝Ｋ３で接続し、この方向の探索を終了する。一方、命令ブロックＡ７への探索については、その後、出力データとしてsigIn0を持つ命令ブロックＡ６に到達するので、同様に、この出力データノードと合流ブロックＣ１のデータノードsigIn0をデータ依存枝Ｋ４で接続し、全体の探索が終了する。
なお、分岐ブロックＢ１に付加された出力データノードsigIn0には、sigIn0(T)と記されているが、これは、命令ブロックＡ２の条件文が成立する場合（Trueの場合）に、分岐ブロックＢ１に付加された出力データノードsigIn0を経由することを表している。
【００６７】
このように、データ依存枝生成部３２６は、データ依存枝を作成することができる。また、命令ブロック抽出部３２４によって生成された命令ブロック情報を用いて命令ブロックとスレッドとの対応を把握し、命令ブロック入出力データ抽出部３２５Ａによって生成された命令ブロック入出力データ情報を用いて命令ブロックと入出力データノードとの対応を把握することで、ノード間を接続したデータ依存枝に関する情報（データ依存枝情報）を生成することができる。データ依存枝情報に関しては、図７を用いて説明する。
【００６８】
図７は、データ依存枝生成部３２６が、構文解析部３１によって生成された中間語と、命令ブロック抽出部３２４によって抽出された命令ブロック情報と、命令ブロック入出力データ抽出部３２５Ａによって抽出された命令ブロック入出力データ情報とを用いて生成した、データ依存枝に関する情報（データ依存枝情報）を示す表である。データ依存枝情報１００Ａは、出力データノードに関する情報（出力データノードのブロック名、スレッド名および変数名）、入力データノードに関する情報（入力データノードのブロック名、スレッド名および変数名）、先行枝および後続枝を含むものである。
ここで、先行枝とは、そのデータ依存枝の始点ノード（命令ブロック出力ノード）を終点とする別のデータ依存枝を意味する。また、後続枝とは、そのデータ依存枝の終点ノード（命令ブロック入力ノード）を始点とする別のデータ依存枝を意味する。ただし、分岐ブロックや合流ブロックに付加されたデータノードはこれらのブロックの入力ノードであると同時に出力ノードでもあると見なす。データ依存枝生成部３２６は、例えば、データ依存枝「５」の始点ノード（命令ブロック出力ノード）を終点とする別のデータ依存枝としてデータ依存枝「４」を発見し、データ依存枝「５」の先行枝としてデータ依存枝「４」を設定する。また同様に、データ依存枝生成部３２６は、例えば、データ依存枝「４」の終点ノード（命令ブロック入力ノード）を始点とする別のデータ依存枝としてデータ依存枝「５」を発見し、データ依存枝「４」の先行枝としてデータ依存枝「５」を設定する。
【００６９】
以上説明したデータ依存枝生成部３２６の機能によって、データ依存枝生成部３２６は、命令ブロック入出力データ抽出部３２５Ａによって抽出された命令ブロック入出力データ情報を用いて、図７に示すように、並列処理プログラム５０Ａからデータ依存枝情報１００Ａを生成することができる。
【００７０】
また、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ａは、出力データ生成命令・入力データ参照命令抽出部３２７に引き渡される。
【００７１】
（出力データ生成命令・入力データ参照命令抽出部３２７の説明）
出力データ生成命令・入力データ参照命令抽出部３２７は、構文解析部３１によって生成された中間語と、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ａ（図７参照）とを入力し、出力データ生成命令および入力データ参照命令を抽出する。以下、図７および図８を用いて、出力データ生成命令・入力データ参照命令抽出部３２７の機能の一例について説明する。
【００７２】
出力データ生成命令・入力データ参照命令抽出部３２７は、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ａを参照して、まず、各データ依存枝の始点側の命令ブロック内でこのデータを生成する命令を探索する。データ依存枝が先行枝を持たない場合は、このデータ依存枝に関わるデータを生成する命令（データ生成命令）が始点側の命令ブロック内に存在することを意味するので、この命令ブロック内で、該当するデータ生成命令を抽出する。同一データを生成する命令が同一命令ブロック内に複数存在する場合は、これらのうち最後に実行される命令をデータ生成命令とする。逆に、データ依存枝が先行枝を持つ場合は、このデータ依存枝に関わるデータを生成する命令（データ生成命令）が始点側の命令ブロック内に存在しないことを意味する。
次に、各データ依存枝の終点側の命令ブロック内でこのデータを参照する命令を探索する。データ依存枝が後続枝を持たない場合は、このデータ依存枝に関わるデータを参照する命令（データ参照命令）が終点側の命令ブロック内に存在することを意味するので、この命令ブロック内で、該当するデータ参照命令を抽出する。同一データを参照する命令が同一命令ブロック内に複数存在する場合は、これらのうち最初に実行される命令をデータ参照命令とする。逆に、データ依存枝が後続枝を持つ場合は、このデータ依存枝に関わるデータを参照する命令（データ参照命令）が終点側の命令ブロック内に存在しないことを意味する。
【００７３】
図８は、出力データ生成命令・入力データ参照命令抽出部３２７が、構文解析部３１によって生成された中間語と、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ａとを用いて前記データ生成命令探索および前記データ参照命令探索によって生成した、出力データ生成命令および入力データ参照命令に関する情報（出力データ生成命令・入力データ参照命令情報）を示す表である。出力データ生成命令・入力データ参照命令情報１１０Ａは、各データ依存枝について、その始点側の命令ブロック内のデータ生成命令に関する情報（ブロック名、スレッド名および命令）、データ生成命令記号、その終点側の命令ブロック内のデータ参照命令に関する情報（ブロック名、スレッド名および命令）およびデータ参照命令記号を含むものである。
【００７４】
データ生成命令記号は、データ生成命令に関する情報を記号化したものであり、「データ依存枝番号：ＤＥＦ」と標記している。また、データ参照命令記号は、データ参照命令に関する情報を記号化したものであり、「データ依存枝番号：ＵＳＥ」と標記している。
図８には、図７で示されたデータ依存枝「６」〜「９」が存在しないが、これらのデータ依存枝がデータ生成命令と参照命令とをいずれも持たないからである。
【００７５】
以上説明した出力データ生成命令・入力データ参照命令抽出部３２７の機能によって、出力データ生成命令・入力データ参照命令抽出部３２７は、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ａを用いて、図８に示すように、出力データ生成命令・入力データ参照命令情報１１０Ａを生成することができる。
【００７６】
また、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ａと、出力データ生成命令・入力データ参照命令抽出部３２７によって生成された出力データ生成命令・入力データ参照命令情報１１０Ａとは、スレッド間データ依存性抽出部３３に引き渡される。
【００７７】
（スレッド間データ依存性抽出部３３の説明）
スレッド間データ依存性抽出部３３は、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ａ（図７参照）と、出力データ生成命令・入力データ参照命令抽出部３２７よって生成された出力データ生成命令・入力データ参照命令情報１１０Ａ（図８参照）とを入力し、スレッド間のデータ依存性を抽出する。スレッド間データ依存性抽出部３３は、スレッド入出力データ抽出部３３１と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２とを含んで構成されている。
【００７８】
（スレッド入出力データ抽出部３３１の説明）
スレッド入出力データ抽出部３３１は、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ａ（図７参照）を入力し、データ依存枝情報１００Ａ（図７参照）を用いて、スレッド入力データおよびスレッド出力データ（スレッド入出力データ）を抽出し、スレッド間データ依存枝情報１２０Ａ（図９参照）を生成する。
スレッド入力データとは、スレッド内の各命令が参照するデータのうち、別のスレッド内で生成されるものである。また、スレッド出力データとは、スレッド内の各命令が生成するデータのうち、別のスレッド内で参照されるものである。つまり、スレッド境界Ｅ１〜Ｅ６（図６参照）を横切るデータ依存枝がスレッド入出力データを表す。以下、図６、図７および図９を用いて、スレッド入出力データ抽出部３３１の機能の一例について説明する。
【００７９】
スレッド入出力データ抽出部３３１は、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ａを参照して、データ依存枝情報１００Ａにスレッド間データ依存枝を挿入したスレッド間データ依存枝情報１２０Ａを生成する。ここで、スレッド間データ依存枝とは、異なるスレッドのデータノードを接続するデータ依存枝を意味する。
図７のデータ依存枝情報１００Ａに示すように、データ依存枝「１」〜「１０」、「１７」、「２０」、「２１」は、出力データノードのスレッドと入力データノードのスレッドとが同一であるので、出力データノードから入力データノードにスレッド間データ依存枝が接続されない。また、データ依存枝「１１」〜「１６」、「１８」、「１９」、「２２」〜「２４」は、出力データノードのスレッドと入力データノードのスレッドとが異なるので、出力データノードから入力データノードにスレッド間データ依存枝が接続される。
【００８０】
図９は、スレッド入出力データ抽出部３３１が、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ａを用いて生成した、スレッド間データ依存枝情報１２０Ａを示す表である。図７のデータ依存枝情報１００Ａと比較して、「スレッド間データ依存枝」の列が追加されており、そこにスレッド間データ依存枝であるか否かを示す値が各データ依存枝に対して設定できるようになっている。
【００８１】
また、スレッド入出力データ抽出部３３１によって生成されたスレッド間データ依存枝情報１２０Ａは、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２に引き渡される。
【００８２】
（スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２の説明）
スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、スレッド入出力データ抽出部３３１によって生成されたスレッド間データ依存枝情報１２０Ａ（図９参照）と、出力データ生成命令・入力データ参照命令抽出部３２７によって生成された出力データ生成命令・入力データ参照命令情報１１０Ａ（図８参照）とを参照して、スレッド入力データ参照命令を抽出する。ここで、スレッド入力データ参照命令とは、スレッド間データ依存枝に関わる入力データ参照命令のことである。以下、図８ないし図１１を用いて、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２の機能の一例について説明する。
【００８３】
図９に示すスレッド間データ依存枝情報１２０Ａを用いて説明する。スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、スレッド入力データ参照命令として、スレッド間データ依存枝「１１」〜「１６」、「１８」、「１９」、「２２」〜「２４」それぞれのデータ参照命令「１１：ＵＳＥ」〜「１６：ＵＳＥ」、「１８：ＵＳＥ」、「１９：ＵＳＥ」、「２２：ＵＳＥ」〜「２４：ＵＳＥ」を抽出する。また、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、抽出したデータ依存枝を用いて、出力データ生成命令・入力データ参照命令抽出部３２７によって生成された出力データ生成命令および入力データ参照命令を参照して、スレッド出力データ生成命令を抽出する。
【００８４】
図８に示す出力データ生成命令・入力データ参照命令情報１１０Ａを用いて説明する。スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、抽出したデータ依存枝「１１」〜「１６」、「１８」、「１９」、「２２」〜「２４」のうち、スレッド入力データ参照命令の直接のデータ生成命令が存在するか否かを判定する。
判定の結果、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、データ依存枝「１３」、「１４」、「１６」、「１８」、「１９」については、スレッド入力データ参照命令の直接のデータ生成命令が存在するので（図８の出力データ生成命令・入力データ参照命令情報１１０Ａを参照すると、データ参照命令と同一行にデータ生成命令が存在するので）、このデータ生成命令をスレッド出力データ生成命令として抽出する。
また、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、データ依存枝「１１」、「１２」、「１５」については、スレッド入力データ参照命令の直接のデータ生成命令が存在しないので（図８の出力データ生成命令・入力データ参照命令情報１１０Ａを参照すると、データ参照命令と同一行にデータ生成命令が存在しないので）、スレッド出力データ生成命令を探索する必要がある。この探索方法については、図１０を用いて説明する。
【００８５】
図１０は、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２が、スレッド入力データ参照命令の直接のデータ生成命令が存在しない場合における、スレッド出力データ生成命令の探索方法を説明するための図である。
スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、スレッド入力データ参照命令の直接のデータ生成命令が存在しない場合、先行枝方向にその出力データ生成命令を探索する。例えば、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、データ依存枝「１１」の先行枝「８」を抽出する。そして、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、データ依存枝「８」のデータ生成命令記号が存在しないので、データ依存枝「８」の先行枝「３」と、先行枝「２４」とを抽出する。
スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、先行枝として抽出したデータ依存枝「３」のデータ生成命令記号「３：ＤＥＦ」を抽出し、探索元のデータ依存枝「１１」の生成命令リスト（スレッド入力データ参照命令のスレッド出力データ生成命令リスト）に追加する。
また、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、先行枝として抽出したデータ依存枝「２４」のデータ生成命令記号「２４：ＤＥＦ」を抽出し、探索元のデータ依存枝「１１」の生成命令リスト（スレッド入力データ参照命令のスレッド出力データ生成命令リスト）に追加する。
【００８６】
以上説明したスレッド抽出データ生成命令の探索方法によって、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、スレッド入力データ参照命令のスレッド出力データ生成命令リストを生成することが可能である。
【００８７】
図１１は、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２が、スレッド入力データ参照命令のスレッド出力データ生成命令リストを、スレッド入出力データ抽出部３３１が生成したスレッド間データ依存枝情報１２０Ａ（図９参照）に挿入して生成した情報（スレッド間データ依存命令対情報）を示す表である。図１１に示すように、スレッド入力データ参照命令のスレッド出力データ生成命令リストは、各データ依存枝に対して、複数存在する場合もある。
【００８８】
また、スレッド入出力データ抽出部３３１によって生成されたスレッド間データ依存枝情報１２０Ａと、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２によって生成されたスレッド間データ依存命令対情報１３０Ａ（図１１参照）とは、通信命令挿入部３５Ａに引き渡される。
【００８９】
（通信命令挿入部３５Ａの説明）
通信命令挿入部３５Ａは、構文解析部３１によって生成された中間語と、スレッド入出力データ抽出部３３１によって生成されたスレッド間データ依存枝情報１２０Ａ（図９参照）と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２によって生成されたスレッド間データ依存命令対情報１３０Ａ（図１１参照）とを入力し、中間語に通信命令を挿入する。通信命令挿入部３５Ａは、データ送信命令挿入部３５１Ａと、データ受信同期命令挿入部３５２Ａとを含んで構成されている。
【００９０】
（データ送信命令挿入部３５１Ａの説明）
データ送信命令挿入部３５１Ａは、スレッド間データ依存命令対情報１３０Ａ（図１１参照）のスレッド入力データ参照命令のスレッド出力データ生成命令リストを参照して、中間語内のスレッド入力データ参照命令のスレッド出力データ生成命令の直後にデータ送信命令を挿入する。以下、図１１を用いて、データ送信命令挿入部３５１Ａの機能の一例について説明する。
【００９１】
データ送信命令挿入部３５１Ａは、例えば、スレッド入力データ参照命令「１３：ＵＳＥ」に対応するスレッド出力データ生成命令「１３：ＤＥＦ」の直後にデータ送信命令を挿入する。また、例えば、データ送信命令挿入部３５１Ａは、スレッド入力データ参照命令「１１：ＵＳＥ」に対応するスレッド出力データ生成命令「３：ＤＥＦ」と「２４：ＤＥＦ」のそれぞれの直後にデータ送信命令を挿入する。
この際、送信先スレッドとしてスレッド入力データ参照命令「１３：ＵＳＥ」が実行されるスレッド「ｐ２」を指定する。
データ送信命令挿入部３５１Ａは、データ送信命令として、例えば、既存の並列プログラミング用メッセージ通信ライブラリ関数のデータ送信処理を行う関数を呼び出す命令を中間語内に挿入することが可能である。
メッセージ通信方式の並列プログラミング環境であるＭＰＩを例にとると、データ送信命令挿入部３５１Ａは、データ送信処理を行う関数として、例えばＭＰＩ＿Ｓｅｎｄ（）関数を呼び出す命令を挿入し、関数呼び出し引数として、データアドレス、データサイズ、データタイプ、送信先スレッド番号（各スレッドに予め割り当てられた固有の番号）、メッセージタグ番号（スレッド入力データ参照命令のデータ依存枝番号）を設定する。
【００９２】
（データ受信同期命令挿入部３５２Ａの説明）
データ受信同期命令挿入部３５２Ａは、スレッド間データ依存命令対情報１３０Ａ（図１１参照）のスレッド入力データ参照命令のスレッド出力データ生成命令リストを参照して、中間語内のスレッド入力データ参照命令の直前にデータ受信同期命令を挿入する。以下、図１１を用いて、データ受信同期命令挿入部３５２Ａの機能の一例について説明する。
【００９３】
データ受信同期命令挿入部３５２Ａは、例えば、スレッド入力データ参照命令「１１：ＵＳＥ」の直前にデータ受信同期命令を挿入する。
データ受信同期命令挿入部３５２Ａは、データ受信同期命令として、例えば、既存の並列プログラミング用メッセージ通信ライブラリ関数のデータ受信処理を行う関数を呼び出す命令を中間語内に挿入することが可能である。
メッセージ通信方式の並列プログラミング環境であるＭＰＩを例にとると、データ受信同期命令挿入部３５２Ａは、データ受信処理を行う関数として、例えばＭＰＩ＿Ｒｅｃｖ（）関数を呼び出す命令を挿入し、関数呼び出し引数として、データアドレス、データサイズ、データタイプ、送信元スレッド番号（ＭＰＩ＿ＡＮＹ＿ＳＯＵＲＣＥ）、メッセージタグ番号（スレッド入力データ参照命令のデータ依存枝番号）を設定する。なお、送信元スレッド番号として「ＭＰＩ＿ＡＮＹ＿ＳＯＵＲＣＥ」（「送信元は任意のスレッド」の意）としているのは、スレッド入力データ参照命令に対応するスレッド出力データ生成命令が複数個存在する場合に対応するためである。
【００９４】
また、通信命令挿入部３５Ａによって中間語に通信命令が挿入されて生成された通信命令を含むプログラムは、プログラム分割・コード生成部３９に引き渡される。
【００９５】
（プログラム分割・コード生成部３９の説明）
プログラム分割・コード生成部３９は、通信命令挿入部３５Ａによって生成された通信命令を含むプログラムを各プロセッサが行うスレッド処理に分割（プログラム分割）し、実行コード（機械コード）に変換（コード生成）するものである。その結果、プログラム分割・コード生成部３９は、通信命令を含む分割プログラム５５Ａ（図１参照）を生成する。
プログラム分割の機能は、構文解析部３１によって各命令に付加されたスレッド属性を参照して、プログラムを各スレッドの処理に分割するものである。
また、コード生成の機能は、通常のコンパイラが有する公知のコード生成の機能と特に変わらないため、コード生成の機能についてのさらに詳細な説明は省略する。
【００９６】
以上説明した第１の実施形態によれば、プログラム処理装置１Ａは、並列処理プログラム５０Ａを解析し、既存の分散メモリシステムおよび既存の共有メモリシステムに適用可能な通信命令を含む分割プログラム５５Ａを生成することが可能である。
【００９７】
図１２は、プログラム処理装置１Ａ（図１参照）のハードウェア構成の一例を示す図である。
図１２に示すように、プログラム処理装置１Ａは、コンピュータであり、中央処理装置（処理部）１０と、主記憶装置（処理部）２０と、ファイル装置（記憶部）４０と、入力装置ＩＮと、出力装置ＯＵＴとを含んで構成されている。また、ファイル装置４０は、並列処理プログラム５０Ａを含んで構成され、主記憶装置２０は、並列処理コンパイラ３０Ａを含んで構成されている。
【００９８】
中央処理装置１０は、例えばＣＰＵ（Central Processing Unit）等から構成され、主記憶装置２０に格納されているプログラムを実行する機能を有する。
主記憶装置２０は、例えばＲＡＭ（Random Access Memory）や、ＲＯＭ（Read Only Memory）等から構成され、中央処理装置１０が実行するプログラムやデータ等を格納するものである。
並列処理コンパイラ３０Ａは、並列処理プログラム５０Ａをマルチプロセッサシステムが実行できる形式に変換する（マルチプロセッサシステムのための実行コードを生成する）ためのプログラムである。
ファイル装置４０は、ファイルを格納するための装置であり、並列処理プログラム５０Ａ等を格納するものである。
並列処理プログラム５０Ａは、マルチプロセッサシステムに並列処理を実行させるためのプログラムであり、プログラマ等によって記述されたものである。
入力装置ＩＮは、キーボードや、マウス等によって構成され、操作者からの指示を入力する機能を有する。
また、出力装置ＯＵＴは、ディスプレイや、プリンタ等によって構成され、文字や画像等を出力する機能を有する。
【００９９】
中央処理装置１０は、主記憶装置２０に格納された並列処理コンパイラ３０Ａの指令を受け、ファイル装置４０に保存された並列処理プログラム５０Ａを主記憶装置２０に読み出す。中央処理装置１０は、主記憶装置２０に読み出した並列処理プログラム５０Ａ中の命令の処理順序や、各命令が参照するデータと、各命令が生成するデータとを解析した結果得られるデータ依存枝情報１００Ａ（図７参照）およびスレッド間データ依存命令対情報１３０Ａ（図１１参照）を生成し、主記憶装置２０に格納する。なお、並列処理プログラム５０Ａは、例えば、プログラマ等が入力装置ＩＮを介して入力し、ファイル装置４０に格納することが可能である。
【０１００】
次いで、中央処理装置１０は、主記憶装置２０に格納された並列処理コンパイラ３０Ａの指令を受け、データ依存枝情報１００Ａ（図７参照）およびスレッド間データ依存命令対情報１３０Ａ（図１１参照）を参照して、通信命令を主記憶装置２０に格納された並列処理プログラム５０Ａ中に埋め込む。
【０１０１】
次いで、中央処理装置１０は、主記憶装置２０に格納された並列処理コンパイラ３０Ａの指令を受け、通信命令が埋め込まれた並列処理プログラム５０Ａをスレッド毎に分割する。中央処理装置１０は、スレッド毎に分割された通信命令を含む分割プログラム５５Ａをファイル装置４０に保存する。また、中央処理装置１０は、出力装置ＯＵＴを介して当該プログラムを出力することが可能である。
【０１０２】
図１３は、プログラム処理装置１Ａ（図１参照）の動作を示すフローチャートである。図１３を参照して（適宜図１参照）、プログラム処理装置１Ａの動作について説明する。
【０１０３】
図１３に示すように、まず、構文解析部３１は、並列処理プログラム５０Ａの構文を解析する処理（構文解析処理）を行う（Ｓ１０）。次に、データ依存性抽出部３２Ａは、構文解析処理の結果生成された中間語を用いて、データ依存性を抽出する処理（データ依存性抽出処理）を行う（Ｓ２０）。スレッド間データ依存性抽出部３３は、スレッド間のデータ依存性を抽出する処理（スレッド間データ依存性抽出処理）を行う（Ｓ３０）。次に、通信命令挿入部３５Ａは、通信命令を挿入して通信命令を含むプログラムを生成する処理（通信命令挿入処理）を行う（Ｓ４０Ａ）。その後、プログラム分割・コード生成部３９は、通信命令を含むプログラムを分割し、実行コードに変換する処理（プログラム分割・コード生成処理）を行う（Ｓ５０）。
【０１０４】
図１４は、データ依存性抽出処理Ｓ２０（図１３参照）の詳細を示すフローチャートである。図１４を参照して（適宜図１参照）、データ依存性抽出処理Ｓ２０（図１３参照）について説明する。
【０１０５】
図１４に示すように、まず、中間語から命令参照・生成データ抽出部３２１は、各命令の参照・生成データを抽出する（Ｓ２１）。次に、関数内間接参照・生成データ抽出部３２３は、中間語から関数内間接参照・生成データを抽出する（Ｓ２２）。そして、命令ブロック抽出部３２４は、中間語から命令ブロックを抽出する（Ｓ２３）。次に、命令ブロック入出力データ抽出部３２５Ａは、中間語から命令ブロック入出力データを抽出する（Ｓ２４）。そして、データ依存枝生成部３２６は、命令ブロック出力データとこれを入力する命令ブロック入力データとの間にデータ依存枝を付加する（Ｓ２５）。この処理により、データ依存枝生成部３２６は、データ依存枝情報１００Ａ（図７参照）を生成することができる。その後、出力データ生成命令・入力データ参照命令抽出部３２７は、出力データ生成命令・入力データ参照命令を抽出する（Ｓ２６）。この処理により、出力データ生成命令・入力データ参照命令抽出部３２７は、出力データ生成命令・入力データ参照命令情報１１０Ａ（図８参照）を生成することができる。これらの処理により、データ依存性抽出部３２Ａは、中間語を用いて、データ依存枝情報１００Ａ（図７参照）および出力データ生成命令・入力データ参照命令情報１１０Ａ（図８参照）を生成することができる。
【０１０６】
図１５は、スレッド間データ依存性抽出処理Ｓ３０（図１３参照）の詳細を示すフローチャートである。図１５を参照して（適宜図１参照）、スレッド間データ依存性抽出処理Ｓ３０（図１５参照）について説明する。
【０１０７】
図１５に示すように、まず、スレッド入出力データ抽出部３３１は、スレッド入出力データを抽出する（Ｓ３１）。これにより、スレッド入出力データ抽出部３３１は、スレッド間データ依存枝情報１２０Ａ（図９参照）を生成することができる。次に、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、スレッド出力データ生成命令・スレッド入力データ参照命令を抽出する（Ｓ３２）。この処理により、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２は、スレッド間データ依存命令対情報１３０Ａ（図１１参照）を生成することができる。これらの処理により、スレッド間データ依存性抽出部３３は、スレッド間データ依存命令対情報１３０Ａ（図１１参照）を生成することができる。
【０１０８】
図１６は、通信命令挿入処理Ｓ４０Ａ（図１３参照）の詳細を示すフローチャートである。図１６を参照して（適宜図１参照）、通信命令挿入処理Ｓ４０Ａ（図１６参照）について説明する。
【０１０９】
図１６に示すように、まず、データ送信命令挿入部３５１Ａは、中間語内のスレッド入力データ参照命令のスレッド出力データ生成命令の直後にデータ送信命令を挿入する（Ｓ４２Ａ）。次に、データ受信同期命令挿入部３５２Ａは、データ送信命令を含む中間語内のスレッド入力データ参照命令のスレッド入力データ参照命令の直前にデータ受信同期命令を挿入する（Ｓ４３Ａ）。これらの処理により、通信命令挿入部３５Ａは、中間語に通信命令を挿入することができる。
【０１１０】
プログラム分割・コード生成処理Ｓ５０（図１３参照）は、プログラム分割・コード生成部３９が、通信命令挿入部３５Ａによって生成された通信命令を含むプログラムを各スレッドが行う処理に分割（プログラム分割）し、実行コードに変換（コード生成）する処理である。その結果、プログラム分割・コード生成部３９は、通信命令を含む分割プログラム５５Ａ（図１参照）を生成することができる。プログラム分割およびコード生成の処理は、通常のコンパイラが有する公知のプログラム分割およびコード生成の処理と特に変わらないため、プログラム分割およびコード生成の処理についてのさらに詳細な説明は省略する。
【０１１１】
（第２の実施形態）
続いて、図面（図１７〜図２２）を用いて本発明の第２の実施形態について説明する。第２の実施形態は、データ構造の依存性に関するものであり、並列処理プログラム内にデータ構造が含まれている場合に、データ構造に作用する命令間の依存性を抽出し、抽出結果を用いて、命令ブロックの入出力データの抽出とデータ依存枝情報の生成とを行い、その命令ブロックのデータ依存枝情報を用いて出力データ生成命令・入力データ参照命令を抽出し、出力データ生成命令・入力データ参照命令情報を生成する点が、第１の実施形態と異なる。したがって、それ以外の第１の実施形態と共通する部分については、同じ符号を付し、説明を省略する。
【０１１２】
データ構造とは、配列データやＣ言語のstructure（structureは通称「構造体」と呼ばれる）のように複数の単一データから構成されるデータの集合体である。ここで、単一データとは、各命令によって生成・参照される情報の対象（演算命令が作用するデータの単位）のことであり、通常の「データ」のことである。以下では、説明の便宜上、各命令によって生成・参照される情報の対象を「単一データ」、複数の単一データから構成されるデータの集合体を「データ構造」と呼ぶことにする。
【０１１３】
単一データの場合、これを生成する命令（代入命令）によって完全に書き換えられるので、データ生成命令からデータ参照命令へと単純なデータ依存性を派生する（データ参照命令がデータ生成命令に依存する）。この単純なデータ依存性がデータフローマシン（データ駆動型制御）の動作原理になる。また、このデータ依存性を単一データ依存性と呼ぶことにする。
【０１１４】
データ構造の場合、一つの演算命令がその一部（データ構造中の一要素）だけをアクセスし（アクセス＝「書換え」または「読出し」）、しかも、アクセスするデータ構造要素の具体的な特定をコンパイル時に行うことが不可能な場合がある。例えば、変数インデックスによる配列アクセスやポインタ参照データがこれに該当する。このため、このデータ構造のアクセスの曖昧さを考慮した依存性（Read-after-write依存性（true dependency）およびWrite-after-write依存性（output dependency））を以下のように定義する。
【０１１５】
Read-after-write依存性は、データ構造の任意の要素に対する「書換え命令」から同データ構造の任意の要素に対する「読出し命令」へ派生する依存性を意味するものとする。これは、単一データのデータ依存性と同性質のものであるが、書換え命令が作用する要素と読出し命令が作用する要素が同一であるとは限らない場合でも、前記した「アクセスの曖昧さ」を考慮して依存性を派生させるものである。
【０１１６】
Write-after-write依存性は、データ構造の任意の要素に対する「書換え命令」から同データ構造の任意の要素に対する「書換え命令」へ派生する依存性を意味するものとする。
【０１１７】
単一データのデータ依存性では、Write-after-write依存性は存在しない。なぜならば、単一データに対するデータ生成命令は、それ以前に実行された同一データに対するデータ生成命令によって定義されたデータを完全に無効化し（完全に書換え）、これらのデータ生成命令が派生するデータ依存性は、論理的に分離されるためである。
【０１１８】
データ構造に対する複数の「書換え命令」については、このような書換えの無効化が必ずしも起こらない（書換える要素が異なる場合がある）ため、データ構造の過去の書換え履歴をすべて記憶しておく必要が生じる。このような過去の書換え履歴をすべて記憶する手段を用いて、書換え命令同士のデータ依存枝による逐次化を図る。このWrite-after-write依存性は、データ構造に対する書換え命令が、仮想的には、「データ構造のすべての要素を読込む」「データ構造の一要素を書き換え、他のすべての要素をそのままにしてデータ構造全体を生成する」という２つの動作で構成されていると解釈することによって、通常のデータ依存性（単一データのデータ依存性）と同様の扱いが可能になる。また、データ構造に作用する命令間のデータ依存性をデータ構造依存性と呼ぶことにする。
【０１１９】
第２の実施形態は、データ構造を含む並列処理プログラム５０Ｂ（図１７参照）から命令ブロック入出力データを抽出し、データ依存枝情報および出力データ生成命令・入力データ参照命令を抽出することができる構成となっている。
【０１２０】
図１７は、第２の実施形態におけるプログラム処理装置の機能例を示す機能ブロック図である。図１７に示すように、プログラム処理装置１Ｂは、データ構造を含む並列処理プログラム５０Ｂを入力して、通信命令を含む分割プログラム５５Ｂを出力する。第２の実施形態では、プログラム処理装置１Ｂのデータ依存性抽出部３２Ｂに含まれる命令ブロック入出力データ抽出部３２５Ｂの機能が、第１の実施形態の命令ブロック入出力データ抽出部３２５Ａの機能と異なる。以下、プログラム処理装置１Ｂを構成する各要素の中で、命令ブロック入出力データ抽出部３２５Ｂの機能について説明する。
【０１２１】
図１８に示すプログラムは、プログラマ等が記述した並列処理プログラムであり、データ構造が含まれる並列処理プログラムの一例である。ここでは、構文解析部３１が並列処理プログラム５０Ｂを入力して、当該プログラムの構文を解析し、中間語を生成する場合について説明する。また、説明の都合上、以下では、中間語として適宜、並列処理プログラム５０Ｂを用いて説明することにする。
【０１２２】
（命令ブロック入出力データ抽出部３２５Ｂの説明）
命令ブロック入出力データ抽出部３２５Ｂは、構文解析部３１によって生成された中間語と、命令ブロック抽出部３２４によって抽出された命令ブロック情報とを入力し、データ構造に作用する命令間の依存性を抽出し、その命令ブロック情報を用いて、その中間語から命令ブロック入力データと、命令ブロック出力データとを抽出する。以下、図１８ないし図２０を用いて（適宜図１７参照）、命令ブロック入出力データ抽出部３２５Ｂの機能のうち、第１の実施形態における命令ブロック入出力データ抽出部３２５Ａの機能との違い（データ構造に作用する命令間の依存性を抽出する機能）のみを説明する。
【０１２３】
図１９は、命令ブロック入出力データ抽出部３２５Ｂが、構文解析部３１によって生成された中間語から命令ブロック入力データと、命令ブロック出力データとを抽出した結果を示すプログラムグラフである。図１９には、例として、命令ブロック入力データノードＦ２や、命令ブロック出力データノードＧ２などが示されている。以下、命令ブロック入出力データ抽出部３２５Ｂによる命令ブロック入出力データの抽出方法を説明する。
【０１２４】
図１９に示すように、並列処理プログラム５０Ｂは、命令ブロック抽出部３２４によって命令ブロックＡ１１〜Ａ１６に分割されている。例えば、図１８に示した並列処理プログラム５０Ｂの３行目のデータ構造要素に作用する命令「a[0] = 1;」は、構文解析部３１によって、
$94 := a[0] ...... (1)
$94 = 1     ...... (2)
という２つの命令に分解される（命令ブロックＡ１１参照）。命令(1)は、配列aの0番目の要素のアドレスを計算し、中間変数$94に記憶する演算である。命令(2)は、アドレス$94に右辺式「1」を代入する演算である。なお、データ構造要素のアドレスを表す中間変数（ここでは$94）は、任意の演算命令で引用される場合（以下に示す書換え命令および読出し命令）、そのアドレスに格納されている要素データ値を指す。
【０１２５】
命令ブロック入出力データ抽出部３２５Ｂは、例えば、配列aの要素のアドレスを計算して中間変数$94に記憶する命令「$94 := a[0]」を命令ブロックＡ１１内に見付ける。また、命令ブロック入出力データ抽出部３２５Ｂは、この中間変数（データ構造要素アドレス）$94が代入式の左辺にある命令「$94 = 1」を命令ブロックＡ１１内に見付け、この命令「$94 = 1」が、配列aに対する書換え命令（データ構造書換え命令）であると判定する。同様な方法を用いて、命令ブロック入出力データ抽出部３２５Ｂは、例えば、命令ブロックＡ１２内にデータ構造書換え命令「$95 = b」、命令ブロックＡ１４内にデータ構造書換え命令「$103 = $101」を見付ける。このようにして、命令ブロック入出力データ抽出部３２５Ｂは、データ構造書換え命令を抽出することができる。
【０１２６】
また、命令ブロック入出力データ抽出部３２５Ｂは、例えば、配列aの要素のアドレスを計算して中間変数$96に記憶する命令「$96 := a[i]」を命令ブロックＡ１３内に見付ける。また、命令ブロック入出力データ抽出部３２５Ｂは、この中間変数（データ構造要素アドレス）$96が代入式の右辺にある命令「$97 := $96 + 1」を命令ブロックＡ１３内に見付け、この命令「$97 := $96 + 1」が、配列aに対する読出し命令（データ構造読出し命令）であると判定する。同様な方法を用いて、命令ブロック入出力データ抽出部３２５Ｂは、例えば、命令ブロックＡ１３内にデータ構造読出し命令「$100 := $99 - 1」、命令ブロックＡ１６内にデータ構造読出し命令「$107 := printf(“a[i + 1] = %d\n”, $105)」を見付ける。このようにして、命令ブロック入出力データ抽出部３２５Ｂは、データ構造読出し命令を抽出することができる。
【０１２７】
命令ブロック入出力データ抽出部３２５Ｂは、データ構造書換え命令からデータ構造書換え命令へと派生する依存関係が存在する場合、その依存関係を前記したWrite-after-write依存性であると判定する。また、データ構造書換え命令からデータ構造読出し命令へと派生する依存関係が存在する場合、その依存関係を前記したRead-after-write依存性であると判定する。
【０１２８】
図２０は、命令ブロック入出力データ抽出部３２５Ｂが抽出したデータ構造の依存性を説明するための図である。図２０に示すように、例えば、データ構造書換え命令「$94 = 1」からデータ構造書換え命令「$95 = b」へ派生する依存性がWrite-after-write依存性として示されている。また、例えば、データ構造書換え命令「$95 = b」からデータ構造読出し命令「$97 := $96 + 1」へ派生する依存性がRead-after-write依存性として示されている。
【０１２９】
命令ブロック入出力データ抽出部３２５Ｂは、Write-after-write依存性またはRead-after-write依存性の依存関係にあるデータを別ブロック内に探し、それを命令ブロック入出力データとして抽出する。命令ブロック入出力データ抽出部３２５Ｂは、命令ブロック抽出部３２４によって抽出された命令ブロック情報を参照して、例えば、配列aに対するデータ構造書換え命令「$94 = 1」が命令ブロックＡ１１内にあると判定する。また、命令ブロック入出力データ抽出部３２５Ｂは、配列aに対するデータ構造書換え命令「$95 = b」が命令ブロックＡ１１以外の命令ブロック（命令ブロックＡ１２）に存在し、この命令が、データ構造書換え命令「$94 = 1」に対してWrite-after-write依存性を示すと判定する。その結果、命令ブロック入出力データ抽出部３２５Ｂは、命令ブロックＡ１１の命令ブロック出力データとして、配列aを抽出することができる。同時に、命令ブロック入出力データ抽出部３２５Ｂは、命令ブロックＡ１２の命令ブロック入力データとして、配列aを抽出することができる。図１９には、それぞれ命令ブロック出力データノードＧ２および命令ブロック入力データノードＦ２として示されている。例えば、命令ブロック出力データノードＧ２および命令ブロック入力データノードＦ２には、*a<3>と標記されているが、これは配列a[3]の任意の要素を示している。
【０１３０】
このような方法により、命令ブロック入出力データ抽出部３２５Ｂは、命令ブロック入出力データを抽出することができる。抽出した結果得られた命令ブロック入出力データは、図１９のプログラムグラフに付加された命令ブロック入出力データノードとして示されている。このように、命令ブロック入出力データ抽出部３２５Ｂは、命令ブロック抽出部３２４によって抽出された命令ブロックと、その命令ブロック内の入出力データ（データ構造を含む）とを対応付けた命令ブロック入出力データに関する情報（命令ブロック入出力データ情報）を生成することができる。
【０１３１】
また、命令ブロック抽出部３２４によって生成された命令ブロック情報と、命令ブロック入出力データ抽出部３２５Ｂによって生成された命令ブロック入出力データ（データ構造を含む）に関する情報（命令ブロック入出力データ情報）とは、データ依存枝生成部３２６に引き渡される。
【０１３２】
図２１は、データ依存枝生成部３２６（図１７参照）によって生成されたデータ依存枝情報を示す表である。データ依存枝生成部３２６は、構文解析部３１によって生成された中間語と、命令ブロック抽出部３２４によって生成された命令ブロック情報と、命令ブロック入出力データ抽出部３２５Ｂによって生成された命令ブロック入出力データ情報とを入力し、単一データのデータ依存枝情報を生成する際と同様の処理によって、データ構造のデータ依存枝情報を生成することが可能である。第２の実施形態においては、並列処理プログラム５０Ｂを用いており、この場合、先行枝および後続枝が存在しないため、データ依存枝情報１００Ｂには、先行枝の項目および後続枝の項目が省略されている。
【０１３３】
図２２は、出力データ生成命令・入力データ参照命令抽出部３２７（図１７参照）によって生成された出力データ生成命令・入力データ参照命令情報を示す表である。出力データ生成命令・入力データ参照命令抽出部３２７は、構文解析部３１によって生成された中間語と、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ｂ（図２１参照）とを入力し、単一データのデータ依存枝情報を生成する際と同様の処理によって、出力データ生成命令および入力データ参照命令を抽出することが可能である。
【０１３４】
以上説明した第２の実施形態によれば、プログラム処理装置１Ｂは、データ構造を含む並列処理プログラム５０Ｂを解析し、既存の分散メモリシステムおよび既存の共有メモリシステムに適用可能な通信命令を含む分割プログラム５５Ｂを生成することが可能である。
【０１３５】
また、プログラム処理装置１Ｂのハードウェア構成については、プログラム処理装置１Ａ（図１参照）のハードウェア構成と変わらないため、説明を省略する。
【０１３６】
（第３の実施形態）
続いて、図面（図２３〜図３４）を用いて本発明の第３の実施形態について説明する。第３の実施形態は、ポインタ（メモリ上のアドレスを記憶する変数）が指すデータオブジェクト間のデータ依存性を抽出し、得られたポインタエイリアスデータ依存性を用いて、ポインタ参照データ（ポインタによって指定されたメモリ上のアドレスに記憶されたデータ）の出力データ生成命令・入力データ参照命令を抽出する点が、第２の実施形態と異なる。また、スレッド間でのポインタによる通信が存在する場合に、スレッド間で転送されるポインタを抽出し、ポインタエイリアスＩＤ演算命令を挿入する機能が追加された点が、第２の実施形態と異なる。また、データ送信命令およびデータ受信命令を挿入する機能が、第２の実施形態と異なる。さらに、スレッド起動命令を挿入する機能が追加された点が、第２の実施形態と異なる。したがって、それ以外の第２の実施形態と共通する部分については、同じ符号を付し、説明を省略する。
【０１３７】
ポインタを介してアクセスするポインタ参照データは、ポインタがデータ構造（配列データ等）を指す可能性があることから、これもデータ構造の一種と見なすことにする。
【０１３８】
図２３は、第３の実施形態におけるプログラム処理装置の機能例を示す機能ブロック図である。図２３に示すように、プログラム処理装置１Ｃは、ポインタ参照データを含む並列処理プログラム５０Ｃを入力して、通信命令を含む分割プログラム５５Ｃを出力する。第３の実施形態では、プログラム処理装置１Ｃのデータ依存性抽出部３２Ｃに含まれるポインタエイリアス解析部３２２の機能が追加された点が第２の実施形態と異なり、プログラム処理装置１Ｃのデータ依存性抽出部３２Ｃに含まれる命令ブロック入出力データ抽出部３２５Ｃの機能が、第２の実施形態の命令ブロック入出力データ抽出部３２５Ｂの機能と異なる。以下、プログラム処理装置１Ｃを構成する各要素の中で、ポインタエイリアス解析部３２２の機能および命令ブロック入出力データ抽出部３２５Ｃについて説明する。その他の第２の実施形態と異なる点については、後記する。
【０１３９】
図２４に示すプログラムは、プログラマ等が記述した並列処理プログラムであり、データ構造が含まれる並列処理プログラムの一例である。ここでは、構文解析部３１が並列処理プログラム５０Ｃを入力して、当該プログラムの構文を解析し、中間語を生成する場合について説明する。また、説明の都合上、以下では、中間語として適宜、並列処理プログラム５０Ｃを用いて説明することにする。
【０１４０】
（ポインタエイリアス解析部３２２の説明）
ポインタエイリアス解析部３２２は、エイリアスリスト（ポートエイリアス情報）を生成する。エイリアスリストとは、ポインタが指すすべてのデータオブジェクト（データ構造または単一データ）のリストのことである。ポインタエイリアス解析部３２２は、命令参照・生成データ抽出部３２１によって抽出された命令の参照データリストおよび生成データリストを用いて、エイリアスリストを順次更新していく。エイリアスリストの更新は、ポインタへの代入命令において行う。エイリアスリストの更新方法については、公知の方法と特に変わらない。
【０１４１】
図２４に示した並列処理プログラム５０Ｃを例に、エイリアスリストの更新について説明する。ポインタ変数への代入命令の中には、データ構造のアドレスを代入する命令（データ構造アドレス代入命令）と、ポインタ値を代入する命令（ポインタ値代入命令）とが存在する。
【０１４２】
データ構造アドレス代入命令は、ポインタをp1とすると、「p1 = [データ構造のアドレス] + (整数変数または整数定数)」という形で表せる命令である。ポインタエイリアス解析部３２２は、この命令において、ポインタp1のエイリアスリストにデータ構造を追加する。例えば、ポインタエイリアス解析部３２２は、並列処理プログラム５０Ｃの３行目の命令「pa = a + 1」において、ポインタpaが指すすべてのデータオブジェクトに相当する「*a<3>」をpaのエイリアスリストに追加する。paのエイリアスリストには何もなかったので、追加した後は、paのエイリアスリスト:{*a<3>}に更新される。同様に、例えば、ポインタエイリアス解析部３２２は、並列処理プログラム５０Ｃの５行目の命令「pa1 = &a1」において、ポインタpa1が指すすべてのデータオブジェクトに相当する「a1」をpa1のエイリアスリストに追加する。pa1のエイリアスリストには何もなかったので、追加した後は、pa1のエイリアスリスト:{a1}に更新される。
【０１４３】
ポインタ値代入命令は、ポインタをp1およびp2とすると、「p1 = p2 + (整数変数または整数定数)」という形で表せる命令である。ポインタエイリアス解析部３２２は、この命令において、ポインタp1のエイリアスリストにp2のエイリアスリストの全要素を追加する。例えば、ポインタエイリアス解析部３２２は、並列処理プログラム５０Ｃの４行目の命令「paa = pa + 1」において、paのエイリアスリストの全要素を追加する。この段階において、paのエイリアスリストは、{*a<3>}である（前記した通り、３行目の命令「pa = a + 1」において、paのエイリアスリスト:{*a<3>}と更新された）ので、ポインタエイリアス解析部３２２は、paのエイリアスリスト:{*a<3>}をpaaのエイリアスリストに追加する。paaのエイリアスリストには何もなかったので、追加した後は、paaのエイリアスリスト:{*a<3>}に更新される。
【０１４４】
（命令ブロック入出力データ抽出部３２５Ｃの説明）
命令ブロック入出力データ抽出部３２５Ｃは、構文解析部３１によって生成された中間語と、命令ブロック抽出部３２４によって抽出された命令ブロック情報と、ポインタエイリアス解析部３２２によって生成されたポインタのエイリアスリストとを入力し、ポインタエイリアスデータ依存性を抽出し、その命令ブロック情報を用いて、その中間語から命令ブロック入力データと、命令ブロック出力データとを抽出する。以下、図２４ないし図２７を用いて（適宜図２３参照）、命令ブロック入出力データ抽出部３２５Ｃの機能のうち、第２の実施形態における命令ブロック入出力データ抽出部３２５Ｂの機能との違い（ポインタエイリアスデータ依存性を抽出する機能）のみを説明する。
【０１４５】
図２５は、命令ブロック入出力データ抽出部３２５Ｃが、構文解析部３１によって生成された中間語から命令ブロック入力データと、命令ブロック出力データとを抽出した結果を示すプログラムグラフである。以下、命令ブロック入出力データ抽出部３２５Ｃによる命令ブロック入出力データの抽出方法を説明する。
【０１４６】
ポインタ参照データは、ポインタのエイリアスリストの各オブジェクトおよびエイリアスリストが一部（または全部）重複する他のポインタ参照データに対して（即ち同じデータを指す可能性があるすべてのデータに対して）データ依存性を持つ。このデータ依存性をポインタエイリアスデータ依存性と呼ぶことにする。命令ブロック入出力データ抽出部３２５Ｃは、このポインタエイリアスデータ依存性を抽出する機能も有する。
【０１４７】
命令ブロック入出力データ抽出部３２５Ｃは、例えば、ポインタpaに対するデータ参照命令「$118 := *pa」がＡ２２ブロック内にあると判定する。また、命令ブロック入出力データ抽出部３２５Ｃは、ポインタpaに対するデータ書換え命令「pa = $112」が命令ブロックＡ２２以外の命令ブロック（命令ブロックＡ２１）に存在すると判定する。その結果、命令ブロック入出力データ抽出部３２５Ｃは、命令ブロックＡ２１の命令ブロック出力データとして、ポインタpaを抽出することができる。同時に、命令ブロック入出力データ抽出部３２５Ｃは、命令ブロックＡ２２の命令ブロック入力データとして、ポインタpaを抽出することができる。図２５には、それぞれ命令ブロック出力データノードＧ３および命令ブロック入力データノードＦ３として示されている。例えば、命令ブロック出力データノードＧ３および命令ブロック入力データノードＦ３には、pa{*a<3>}と標記されているが、これはポインタpaの値と、paのエイリアスリスト:{*a<3>}とが命令ブロックＡ２１から出力され、命令ブロックＡ２２に入力されることを示している。同様の方法により、命令ブロック入力データノードＦ４、命令ブロック入力データノードＦ５、命令ブロック出力データノードＧ４、命令ブロック出力データノードＧ５が抽出される。
【０１４８】
また、命令ブロック入出力データ抽出部３２５Ｃは、ポインタpaによるポインタ参照データ*paに対するデータ書換え命令「$118 = b」がＡ２２ブロック内にあると判定する。また、命令ブロック入出力データ抽出部３２５Ｃは、命令「$118 = b」におけるpaのエイリアスリストを参照する。前記した通り、命令ブロックＡ２２は、命令ブロック入力データとして、命令ブロックＡ２１からpaのエイリアスリスト:{*a<3>}を受け取り、その後、命令「$118 = b」までにpaのエイリアスリストの追加は行われていないので、命令「$118 = b」におけるpaのエイリアスリストは、paのエイリアスリスト:{*a<3>}である。同様に、命令ブロックＡ２４は、命令ブロック入力データとして、命令ブロックＡ２１からpaaのエイリアスリスト:{*a<3>}を受け取り、その後、命令「$126 = $125」までにpaaのエイリアスリストの追加は行われていないので、命令「$126 = $125」におけるpaaのエイリアスリストは、paaのエイリアスリスト:{*a<3>}である。
【０１４９】
命令ブロック入出力データ抽出部３２５Ｃは、paのエイリアスリストの各オブジェクトおよびこのpaのエイリアスリストが一部（または全部）重複する他のポインタ参照データを探し、ポインタエイリアスデータ依存性を示すデータとして抽出する。つまり、命令ブロック入出力データ抽出部３２５Ｃは、命令「$118 = b」におけるpaのエイリアスリストのオブジェクトとして*a<3>を抽出し、（命令「$118 = b」におけるpaのエイリアスリスト:{*a<3>}が、命令「$126 = $125」におけるpaaのエイリアスリスト:{*a<3>}と全部が重複するので）命令「$118 = b」におけるpaのエイリアスリストが一部（または全部）重複する他のポインタ参照データとして*paaを抽出する。したがって、命令「$118 = b」におけるpaは、*a<3>および*paaとポインタエイリアスデータ依存性を持つ。
【０１５０】
命令ブロック入出力データ抽出部３２５Ｃは、例えば、ポインタ参照データ*paとポインタエイリアスデータ依存性を示すオブジェクト*a<3>またはポインタ参照データ*paaの中で、Write-after-write依存性またはRead-after-write依存性の依存関係にあるデータを別ブロック内に探し、それを命令ブロック入出力データとして抽出する。命令ブロック入出力データ抽出部３２５Ｃは、命令ブロック抽出部３２４によって抽出された命令ブロック情報を参照して、ポインタ参照データ*paによるデータ書換え命令「$118 = b」が命令ブロックＡ２２にあると判定し、これとWrite-after-write依存性を示すポインタ参照データ*paaによるデータ書換え命令「$126 = $125」が命令ブロックＡ２２以外の命令ブロック（命令ブロックＡ２４）にあると判定する。その結果、命令ブロック入出力データ抽出部３２５Ｃは、命令ブロックＡ２２の命令ブロック出力データとして、ポインタ参照データ*paを抽出することができる。同時に、命令ブロック入出力データ抽出部３２５Ｃは、命令ブロックＡ２４の命令ブロック入力データとして、ポインタ参照データ*paaを抽出することができる。図２５には、それぞれ命令ブロック出力データノードＩ１および命令ブロック入力データノードＨ１として示されている。
【０１５１】
また、命令ブロック入出力データ抽出部３２５Ｃは、命令ブロック抽出部３２４によって抽出された命令ブロック情報を参照して、ポインタ参照データ*paによるデータ書換え命令「$118 = b」が命令ブロックＡ２２にあると判定し、これとRead-after-write依存性を示す配列aに対するデータ読出し命令「$120 := $119 + 1」が命令ブロックＡ２２以外の命令ブロック（命令ブロックＡ２３）にあると判定する。その結果、命令ブロック入出力データ抽出部３２５Ｃは、命令ブロックＡ２２の命令ブロック出力データとして、ポインタ参照データ*paを抽出することができる。同時に、命令ブロック入出力データ抽出部３２５Ｃは、命令ブロックＡ２３の命令ブロック入力データとして、*a<3>を抽出することができる。図２５には、それぞれ命令ブロック出力データノードＩ１および命令ブロック入力データノードＨ２として示されている。同様の方法により、命令ブロック入力データノードＨ３〜Ｈ６、命令ブロック出力データノードＩ２〜Ｉ５が抽出される。さらに、図２５において、符号の付されていない命令ブロック入出力データノードは、単一データ間のデータ依存性を示すものであり、命令ブロック入出力データ抽出部３２５Ａと同様の機能により抽出できる。
【０１５２】
このような方法により、命令ブロック入出力データ抽出部３２５Ｃは、ポインタエイリアスデータ依存性を含む命令ブロック入出力データを抽出することができる。このように、命令ブロック入出力データ抽出部３２５Ｃは、命令ブロック抽出部３２４によって抽出された命令ブロックと、その命令ブロック内の入出力データ（ポインタエイリアスデータ依存性を含む）とを対応付けた命令ブロック入出力データに関する情報（命令ブロック入出力データ情報）を生成することができる。
【０１５３】
また、命令ブロック抽出部３２４によって生成された命令ブロック情報と、命令ブロック入出力データ抽出部３２５Ｃによって生成された命令ブロック入出力データ（ポインタエイリアスデータ依存性を含む）に関する情報（命令ブロック入出力データ情報）とは、データ依存枝生成部３２６に引き渡される。
【０１５４】
図２６は、データ依存枝生成部３２６（図２３参照）によって生成されたデータ依存枝情報を示す表である。データ依存枝生成部３２６は、構文解析部３１によって生成された中間語と、命令ブロック抽出部３２４によって生成された命令ブロック情報と、命令ブロック入出力データ抽出部３２５Ｃによって生成された命令ブロック入出力データ情報とを入力し、単一データのデータ依存枝情報を生成する際と同様の処理によって、ポインタ参照データのデータ依存枝情報を生成することが可能である。第３の実施形態においては、並列処理プログラム５０Ｃを用いており、この場合、先行枝および後続枝が存在しないため、データ依存枝情報１００Ｃには、先行枝の項目および後続枝の項目が省略されている。
【０１５５】
図２７は、出力データ生成命令・入力データ参照命令抽出部３２７（図２３参照）によって生成された出力データ生成命令・入力データ参照命令情報を示す表である。出力データ生成命令・入力データ参照命令抽出部３２７は、構文解析部３１によって生成された中間語と、データ依存枝生成部３２６によって生成されたデータ依存枝情報１００Ｃ（図２６参照）とを入力し、単一データのデータ依存枝情報を生成する際と同様の処理によって、出力データ生成命令および入力データ参照命令を抽出することが可能である。なお、データ依存枝２（図２７参照）のデータ生成命令は、本来ならば存在しない（a1に代入する命令が命令ブロックＡ２１内に存在しない）。このような場合は、a1をプログラムコード上で宣言する箇所に仮想的に挿入された「変数宣言命令」である[*] a1 : declaredを便宜上のデータ生成命令としている。
【０１５６】
また、図２３に示すように、プログラム処理装置１Ｃは、スレッド間で転送されるポインタを含む並列処理プログラム５０Ｄを入力して、ポインタエイリアスＩＤ演算命令が挿入されたプログラムを生成する。また、それを元にして通信命令を含む分割プログラム５５Ｄを出力する。第３の実施形態では、前記した相違点の他、プログラム処理装置１Ｃの通信命令挿入部３５Ｃに含まれるポインタ通信補助命令生成部３４（スレッド間転送ポインタ抽出部３４１およびポインタエイリアスＩＤ演算命令挿入部３４２を含む）の機能が追加された点が第２の実施形態と異なり、プログラム処理装置１Ｃの通信命令挿入部３５Ｃに含まれるデータ送信命令挿入部３５１Ｃおよびデータ受信同期命令挿入部３５２Ｃの機能が、第２の実施形態のデータ送信命令挿入部３５１Ａおよびデータ受信同期命令挿入部３５２Ａの機能と異なる。さらに、第３の実施形態では、プログラム処理装置１Ｃの通信命令挿入部３５Ｃに含まれるスレッド起動命令挿入部３５３の機能が追加された点が第２の実施形態と異なる。以下、プログラム処理装置１Ｃを構成する各要素の中で、ポインタ通信補助命令生成部３４（スレッド間転送ポインタ抽出部３４１およびポインタエイリアスＩＤ演算命令挿入部３４２を含む）およびスレッド間データ通信命令挿入部（データ送信命令挿入部３５１Ｃ、データ受信同期命令挿入部３５２Ｃおよびスレッド起動命令挿入部３５３）について説明する。
【０１５７】
図２８に示すプログラムは、プログラマ等が記述した並列処理プログラムであり、スレッド間で転送されるポインタを含む並列処理プログラムの一例である。ポインタ通信補助命令生成部３４の機能の説明では、構文解析部３１が並列処理プログラム５０Ｄを入力して、当該プログラムの構文を解析し、中間語を生成し、その中間語を用いてプログラム処理装置１Ｃが処理を行う場合について説明する。また、説明の都合上、ポインタ通信補助命令生成部３４の機能の説明では、中間語として適宜、並列処理プログラム５０Ｄを用いて説明することにする。さらに、データ送信命令挿入部３５１Ｃ、データ受信同期命令挿入部３５２Ｃおよびスレッド起動命令挿入部３５３の機能の説明では、構文解析部３１が並列処理プログラム５０Ａを入力して、当該プログラムの構文を解析し、中間語を生成する場合について説明する。また、説明の都合上、データ送信命令挿入部３５１Ｃ、データ受信同期命令挿入部３５２Ｃおよびスレッド起動命令挿入部３５３の機能の説明では、中間語として適宜、並列処理プログラム５０Ａを用いて説明することにする。
【０１５８】
（ポインタ通信補助命令生成部３４の説明）
ポインタ通信補助命令生成部３４は、構文解析部３１によって生成された中間語と、スレッド入出力データ抽出部３３１によって生成されたスレッド間データ依存枝情報と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２によって生成されたスレッド間データ依存命令対情報と、ポインタエイリアス解析部３２２によって生成されたエイリアスリストとを入力し、スレッド間で転送されるポインタを抽出し、構文解析部３１によって生成された中間語にポインタエイリアスＩＤ演算命令を挿入する。ポインタ通信補助命令生成部３４は、スレッド間転送ポインタ抽出部３４１と、ポインタエイリアスＩＤ演算命令挿入部３４２とを含んで構成されている。
【０１５９】
（スレッド間転送ポインタ抽出部３４１の説明）
スレッド間転送ポインタ抽出部３４１は、スレッド入出力データ抽出部３３１によって生成されたスレッド間データ依存枝情報を参照して、ポインタ型のスレッド間データ依存枝（ポインタ型スレッド間データ依存枝）を抽出する。それにより、スレッド間で転送されるポインタ（スレッド間転送ポインタ）を抽出する。以下、図２８または図２９を用いて、スレッド間転送ポインタ抽出部３４１の機能の一例について説明する。
【０１６０】
図２９は、並列処理プログラム５０Ｄ内の関数GetDataのプログラムグラフである。図２９に示すように、スレッド間転送ポインタ抽出部３４１は、ポインタaaのスレッド間データ依存枝Ｋ１１がベーススレッド[*]とスレッド[p0]を横切ることを抽出し、スレッド間転送ポインタとしてポインタaaを抽出する。スレッド間転送ポインタに関する情報（ポインタaaがスレッド間転送ポインタであるという情報）は、ポインタエイリアスＩＤ演算命令挿入部３４２に引き渡される。
【０１６１】
（ポインタエイリアスＩＤ演算命令挿入部３４２の説明）
ポインタエイリアスＩＤ演算命令挿入部３４２は、構文解析部３１によって生成された中間語と、ポインタエイリアス解析部３２２によって抽出されたエイリアスリストと、スレッド間転送ポインタ抽出部３４１によって抽出されたスレッド間転送ポインタに関する情報とを参照して、構文解析部３１によって生成された中間語にポインタエイリアスＩＤ演算命令を挿入する。以下、図２８ないし図３０を用いて、ポインタエイリアスＩＤ演算命令挿入部３４２の機能の一例について説明する。
【０１６２】
ここで、ポインタエイリアス解析部３２２の機能の補足をする。ポインタ型関数引数は、関数呼出し命令の呼出し引数の代入命令であると解釈する。例えば、図２８に示した並列処理プログラム５０Ｄの１２行目から１９行目には、関数GetData(int * aa)が存在するが、この関数のポインタ型関数引数int * aaは、これを呼び出す命令（PointerTest内のGetData(a)等）の呼出し引数(a)の代入命令であると解釈する（aa = aと解釈する）。
【０１６３】
ポインタ型関数引数は関数呼出し命令の呼出し引数の代入命令であるという解釈に基づいて、図２８に示した並列処理プログラム５０Ｄの関数GetDataの引数int * aaのエイリアスリストについて説明する。図２８に示した並列処理プログラム５０Ｄの４行目「GetData(a)」において、ポインタエイリアス解析部３２２は、aaのエイリアスリストに*a<10>を追加し、aaのエイリアスリスト:{*a<10>}とする。同様に、５行目「GetData(b)において、ポインタエイリアス解析部３２２は、aaのエイリアスリストに*b<10>を追加し、aaのエイリアスリスト:{*a<10>,*b<10>}とする。６行目「p = c + 5」において、ポインタエイリアス解析部３２２は、pのエイリアスリストに*c<20>を追加し、pのエイリアスリスト:{*c<20>}とする。７行目「GetData(p)」において、ポインタエイリアス解析部３２２は、pのエイリアスリスト:{*c<20>}をaaのエイリアスリスト:{*a<10>,*b<10>}に追加し、aaのエイリアスリスト:{*b<10>,*a<10>,*c<20>}とする。８行目「p = b」において、ポインタエイリアス解析部３２２は、pのエイリアスリスト:{*c<20>}に*b<10>を追加し、pのエイリアスリスト:{*b<10>,*c<20>}とする。９行目「GetData(p)」において、ポインタエイリアス解析部３２２は、pのエイリアスリスト:{*b<10>,*c<20>}をaaのエイリアスリスト:{*b<10>,*a<10>,*c<20>}に追加し、aaのエイリアスリスト:{*b<10>,*a<10>,*c<20>}とする。
【０１６４】
ポインタエイリアスＩＤ演算命令挿入部３４２は、以上説明したように、pのエイリアスリスト:{*b<10>,*c<20>}と、aaのエイリアスリスト:{*b<10>,*a<10>,*c<20>}とを含んだエイリアスリストをポインタエイリアス解析部３２２から入力する。
【０１６５】
並列処理プログラム５０Ｄのように、ポインタ変数を含むプログラムの場合、分散メモリシステムにおけるポインタの通信およびポインタ参照データの通信の実装は難しい問題である。ポインタaaが参照するデータを操作するスレッドp0内では、aaのエイリアスオブジェクトすべてに別々のメモリを割り当て、お互いの干渉を回避する必要がある。また、スレッド間通信としては、aaが実際に参照するデータ（いずれも配列データ）をベーススレッドからスレッドp0に転送し、スレッドp0を実行後、aaが参照するデータをベーススレッドへ転送する。ポインタおよびポインタ参照データを通信するためには、ポインタが実際にどのオブジェクトを参照しているかを実行時に把握（エイリアスを解決）する必要がある。また、異なるプロセッサにおけるメモリ空間はそれぞれ独立しているため、プロセッサ間のアドレス変換が必要になる。ここでは、エイリアスＩＤの演算命令を中間語に挿入することにより、ポインタのエイリアス情報をプログラム上で管理する機構を示す。
【０１６６】
ポインタエイリアスＩＤ演算命令挿入部３４２は、スレッド間転送ポインタ抽出部３４１によって抽出されたスレッド間転送ポインタ変数と、そのポインタ値計算に関わるポインタ変数ごとにエイリアスＩＤ変数を割り当てる。言い換えると、ポインタエイリアスＩＤ演算命令挿入部３４２は、「スレッド間転送ポインタ変数」および「エイリアスＩＤ変数を必要とするポインタ変数へのポインタ値代入命令で参照されるポインタ」にはエイリアスＩＤ変数が必要であると判定し、エイリアスＩＤ変数を割り当てる。エイリアスＩＤ変数は、グローバルスコープを持つ整数型データであり、その値は、ポインタのエイリアスリストの要素番号（インデックス）を指す。
【０１６７】
ポインタエイリアスＩＤ演算命令挿入部３４２は、スレッド間転送ポインタ抽出部３４１によって抽出されたスレッド間転送ポインタ変数としてaa、aaへのポインタ値代入命令で参照されるポインタとしてpを抽出する。その結果、ポインタエイリアスＩＤ演算命令挿入部３４２は、エイリアスＩＤ変数を必要とするポインタとして、aaおよびpを抽出し、これらのポインタにエイリアスＩＤ変数を割り当てる。ポインタaaのエイリアスＩＤ変数Ｎ１「aa＿3e859b0」と、ポインタpのエイリアスＩＤ変数Ｎ２「p＿bbfb78」とが示されている。
【０１６８】
また、ポインタエイリアスＩＤ演算命令挿入部３４２は、これらのエイリアスＩＤ変数の定義域（取り得る整数値の範囲）を指定する。ポインタエイリアスＩＤ演算命令挿入部３４２は、aaのエイリアスリストが{*b<10>,*a<10>,*c<20>}なので、それぞれの要素番号をID = 0, ID = 1, ID = 2としてポインタaaのエイリアスＩＤ変数Ｎ１の定義域を{0,1,2}とする。同様に、pのエイリアスリストが{*b<10>,*c<20>}なので、それぞれの要素番号をID = 0, ID = 1としてポインタpのエイリアスＩＤ変数Ｎ２の定義域を{0,1}とする。
【０１６９】
ポインタエイリアスＩＤ演算命令挿入部３４２は、ポインタ変数にエイリアスオブジェクトのアドレスや別のポインタ変数が代入またはオフセット代入（アドレス値 + オフセット値）されるポインタ代入演算の直前に、そのポインタのエイリアスＩＤを計算する演算を挿入する。エイリアスＩＤ演算命令は、以下のエイリアスＩＤ代入演算命令と、エイリアスＩＤ変換演算命令とを含むものである。
【０１７０】
図３０は、（並列処理プログラム５０Ｄ内の関数PointerTestに）ポインタエイリアスＩＤの演算命令が挿入された結果を示すプログラムグラフである。図３０に示すように、エイリアスＩＤ変数には、エイリアスＩＤ変数Ｎ１や、エイリアスＩＤ変数Ｎ２が存在する。ポインタエイリアスＩＤ演算命令挿入部３４２は、エイリアスＩＤ代入演算命令Ｑ１、Ｑ２、Ｑ３およびＱ４、エイリアスＩＤ変換演算命令Ｒ１およびＲ２を挿入する。以下に、エイリアスＩＤ代入演算命令およびエイリアスＩＤ変換演算命令の挿入方法について説明する。
【０１７１】
ポインタエイリアスＩＤ演算命令挿入部３４２は、ポインタ代入演算の右辺値がエイリアスオブジェクトのアドレスの場合、そのオブジェクトに対応する要素番号をエイリアスＩＤ変数に代入するエイリアスＩＤ代入演算命令を挿入する。例えば、図３０に示した例では、命令「GetData(a)」は、関数呼出し命令の呼出し引数の代入命令であると解釈され、このポインタ代入演算命令の右辺値がエイリアスオブジェクト*a<10>のアドレスであるので、そのオブジェクト*a<10>に対応する要素番号である<ID = 1>をエイリアスＩＤ変数に代入する演算命令を、命令Ｔ１の直前にエイリアスＩＤ代入演算命令Ｑ１として挿入する。同様に、ポインタエイリアスＩＤ演算命令挿入部３４２は、<ID = 0>をエイリアスＩＤ変数に代入する演算命令を、命令Ｔ２の直前にエイリアスＩＤ代入演算命令Ｑ２として挿入する。
【０１７２】
また、ポインタエイリアスＩＤ演算命令挿入部３４２は、ポインタ代入演算の右辺値が別のポインタ変数の場合、エイリアスＩＤ変換テーブルを作成して、エイリアスＩＤを変換するエイリアスＩＤ変換演算命令を挿入する。エイリアスＩＤ変換テーブルとは、右辺ポインタのエイリアスリストの要素番号と左辺ポインタのエイリアスリストの要素番号とを対応付けたテーブルである。
例えば、図３０に示した例では、命令Ｔ３は、関数呼出し命令の呼出し引数の代入命令であると解釈され、このポインタ代入演算命令の右辺値が別のポインタ変数pであるので、ポインタエイリアスＩＤ演算命令挿入部３４２は、エイリアスＩＤ変換テーブルを作成する。エイリアスＩＤ変換テーブルでは、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>とが対応付けられている。したがって、ポインタエイリアスＩＤ演算命令挿入部３４２は、エイリアスＩＤ変換テーブルを作成して、pのエイリアスＩＤ変数が取り得る値{0,1}をそれぞれ{0,2}に変換する演算命令を、命令Ｕ１の直前にエイリアスＩＤ変換演算命令Ｒ１として挿入する。同様に、ポインタエイリアスＩＤ演算命令挿入部３４２は、pのエイリアスＩＤ変数が取り得る値{0,1}をそれぞれ{0,2}に変換する演算命令を、命令Ｕ２の直前にエイリアスＩＤ変換演算命令Ｒ２として挿入する。
【０１７３】
さらに、関数PointerTestから呼び出される関数GetData内において、ポインタaaが参照しうるオブジェクトは、エイリアスＩＤ変数aa＿3e859b0によって、その特定が可能となる。
【０１７４】
以上説明したように、ポインタ通信補助命令生成部３４は、構文解析部３１が生成した中間語にポインタのエイリアスＩＤ演算命令を挿入し、ポインタエイリアスＩＤ演算命令を含むプログラムを生成することができる。したがって、ポインタが参照するオブジェクトの特定が可能となる。
【０１７５】
（スレッド間データ通信命令挿入部３６の説明）
スレッド間データ通信命令挿入部３６は、ポインタ通信補助命令生成部３４によってポインタエイリアスＩＤ演算命令が挿入されたプログラムと、出力データ生成命令・入力データ参照命令抽出部３２７によって抽出された出力データ生成命令・入力データ参照命令情報１１０Ａ（図８参照）と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２によって生成されたスレッド間データ依存命令対情報１３０Ａ（図１１参照）とを入力し、スレッド間における通信命令をポインタエイリアスＩＤ演算命令が挿入されたプログラムに挿入する。スレッド間データ通信命令挿入部３６は、データ送信命令挿入部３５１Ｃと、データ受信同期命令挿入部３５２Ｃと、スレッド起動命令挿入部３５３とを含んで構成されている。
【０１７６】
（データ送信命令挿入部３５１Ｃの説明）
データ送信命令挿入部３５１Ｃは、ポインタ通信補助命令生成部３４によってポインタエイリアスＩＤ演算命令が挿入されたプログラムと、出力データ生成命令・入力データ参照命令抽出部３２７によって抽出された出力データ生成命令・入力データ参照命令情報１１０Ａ（図８参照）と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２によって生成されたスレッド間データ依存命令対情報１３０Ａ（図１１参照）とを入力し、そのスレッド間データ依存命令対情報１３０Ａ（図１１参照）を参照して、そのプログラム内のスレッド出力データを生成する命令の直後にスレッド間データ送信命令を挿入するものである。以下、図８、図１１および図３１を用いて、データ送信命令挿入部３５１Ｃの機能の一例について説明する。
【０１７７】
図３１は、ポインタエイリアスＩＤの演算命令を含むプログラムにスレッド間データ送信命令およびスレッド間データ受信同期命令が挿入された結果を示すプログラムグラフである。図３１に示すように、データ送信命令挿入部３５１Ｃは、スレッド間データ送信命令Ｖ１〜Ｖ１０を挿入し、データ受信同期命令挿入部３５２Ｃは、スレッド間データ受信同期命令Ｗ１〜Ｗ７を挿入する。スレッド間データ受信同期命令Ｗ１〜Ｗ７の説明については後記する。
【０１７８】
データ送信命令挿入部３５１Ｃは、例えば、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２によって生成されたスレッド間データ依存命令対情報１３０Ａのスレッド入力データ参照命令のスレッド出力データ生成命令リストを参照して、スレッド入力データ参照命令「１３：ＵＳＥ」のスレッド出力データ生成命令「１３：ＤＥＦ」を見付ける。また、データ送信命令挿入部３５１Ｃは、出力データ生成命令・入力データ参照命令抽出部３２７によって抽出された出力データ生成命令・入力データ参照命令情報１１０Ａを参照して、スレッド出力データ生成命令「１３：ＤＥＦ」のスレッド名「ｐ１」および命令「sigOut = $31」を取得する。同様に、データ送信命令挿入部３５１Ｃは、出力データ生成命令・入力データ参照命令抽出部３２７によって抽出された出力データ生成命令・入力データ参照命令情報１１０Ａを参照して、スレッド入力データ参照命令「１３：ＵＳＥ」のスレッド「ｐ２」および命令「sigOut += $34」を取得する。その後、データ送信命令挿入部３５１Ｃは、スレッド出力データ生成命令「１３：ＤＥＦ」の出力データ「sigOut」からスレッド「ｐ２」にあるスレッド入力データ参照命令「１３：ＵＳＥ」の「sigOut」にデータを送信する命令（スレッド間データ送信命令）Ｖ１「DT:sigOut => (p2:sigOut)」を、ポインタ通信補助命令生成部３４によってポインタエイリアスＩＤ演算命令が挿入されたプログラム内のスレッド出力データ生成命令「sigOut = $31」の直前に挿入する。図３１では、データを送信する命令をＤＴ（Data Transfer）で示している。
【０１７９】
同様な方法により、データ送信命令挿入部３５１Ｃは、ポインタ通信補助命令生成部３４によってポインタエイリアスＩＤ演算命令が挿入されたプログラム内にスレッド間データ送信命令Ｖ２〜Ｖ１０を挿入する。
【０１８０】
また、データ送信命令挿入部３５１Ｃによって生成されたポインタエイリアスＩＤ演算命令およびスレッド間データ送信命令を含むプログラムは、データ受信同期命令挿入部３５２Ｃに引き渡される。
【０１８１】
（データ受信同期命令挿入部３５２Ｃの説明）
データ受信同期命令挿入部３５２Ｃは、データ送信命令挿入部３５１Ｃによって生成されたポインタエイリアスＩＤ演算命令およびスレッド間データ送信命令を含むプログラムと、出力データ生成命令・入力データ参照命令抽出部３２７によって抽出された出力データ生成命令・入力データ参照命令情報１１０Ａ（図８参照）と、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２によって生成されたスレッド間データ依存命令対情報１３０Ａ（図１１参照）とを入力し、そのスレッド間データ依存命令対情報１３０Ａ（図１１参照）を参照して、そのプログラム内のスレッド入力データを参照する命令の直前にスレッド間データ受信同期命令を挿入するものである。以下、図８、図１１および図３１を用いて、データ受信同期命令挿入部３５２Ｃの機能の一例について説明する。
【０１８２】
データ受信同期命令挿入部３５２Ｃは、例えば、スレッド出力データ生成命令・スレッド入力データ参照命令抽出部３３２によって生成されたスレッド間データ依存命令対情報１３０Ａのスレッド入力データ参照命令のスレッド出力データ生成命令リストを参照して、スレッド入力データ参照命令「１３：ＵＳＥ」を見付ける。また、データ受信同期命令挿入部３５２Ｃは、出力データ生成命令・入力データ参照命令抽出部３２７によって抽出された出力データ生成命令・入力データ参照命令情報１１０Ａを参照して、スレッド入力データ参照命令「１３：ＵＳＥ」の命令「sigOut += $34」を取得する。その後、データ受信同期命令挿入部３５２Ｃは、スレッド入力データ参照命令「１３：ＵＳＥ」のスレッド入力データ「sigOut」によるスレッド間データの受信同期命令（スレッド間データ受信同期命令）Ｗ１「DS:sigOut」を、データ送信命令挿入部３５１Ｃによって生成されたポインタエイリアスＩＤ演算命令およびスレッド間データ送信命令を含むプログラム内のスレッド入力データ参照命令「sigOut += $34」の直前に挿入する。図３１では、データの受信同期命令をＤＳ（Data Synchronize）で示している。
【０１８３】
同様な方法により、データ受信同期命令挿入部３５２Ｃは、データ送信命令挿入部３５１Ｃによって生成されたポインタエイリアスＩＤ演算命令およびスレッド間データ送信命令を含むプログラム内にスレッド間データ受信同期命令Ｗ２〜Ｗ７を挿入する。これにより、データが受信されていない場合、処理が一時停止し、受信後に次の命令が実行可能になる（データ受信要求を明示的に発行するわけではない）。
【０１８４】
また、データ受信同期命令挿入部３５２Ｃによって生成されたポインタエイリアスＩＤ演算命令、スレッド間データ送信命令およびスレッド間データ受信同期命令を含むプログラムは、スレッド起動命令挿入部３５３に引き渡される。
【０１８５】
（スレッド起動命令挿入部３５３の説明）
スレッド起動命令挿入部３５３は、データ受信同期命令挿入部３５２Ｃによって生成されたポインタエイリアスＩＤ演算命令、スレッド間データ送信命令およびスレッド間データ受信同期命令を含むプログラムと、命令ブロック抽出部３２４によって生成された命令ブロック情報とを入力し、その命令ブロック情報を参照して、スレッドが制御依存する分岐命令において、そのスレッドに到達する分岐枝の直後にスレッドを起動する命令（スレッド起動命令）を挿入する。以下、図３２を用いて、スレッド起動命令挿入部３５３の機能の一例について説明する。
【０１８６】
図３２は、ポインタエイリアスＩＤの演算命令、スレッド間データ送信命令およびスレッド間データ受信同期命令を含むプログラムにスレッド起動命令が挿入された結果を示すプログラムグラフである。図３２に示すように、スレッド起動命令挿入部３５３は、スレッド起動命令Ｘ１を挿入する。
【０１８７】
スレッド起動命令挿入部３５３は、命令ブロック抽出部３２４によって生成された命令ブロック情報を参照して、スレッド（ｐ１〜ｐ５）が制御依存する分岐命令として分岐ブロックＢ１を見付ける。それらのスレッドに到達する分岐枝（分岐ブロックＢ１から命令ブロックＡ３に接続される分岐枝）の直後にスレッド（ｐ１〜ｐ５）を起動する命令（スレッド起動命令）Ｘ１を挿入する。図３２では、スレッドを起動する命令をＣＴ（Control Transfer）で示している。
【０１８８】
また、スレッド起動命令挿入部３５３によって生成されたポインタエイリアスＩＤ演算命令、スレッド間データ送信命令、スレッド間データ受信同期命令およびスレッド起動命令を含むプログラムは、プログラム分割・コード生成部３９に引き渡される。
【０１８９】
以上説明した第３の実施形態によれば、プログラム処理装置１Ｃは、ポインタ変数を含む並列処理プログラム５０Ｄを解析して、ポインタの通信処理およびポインタ参照データの通信処理を行う場合であっても、分散メモリシステムに適用可能な通信命令を含む分割プログラム５５Ｄを生成することが可能である。
【０１９０】
また、プログラム処理装置１Ｃ（図２３参照）のハードウェア構成については、プログラム処理装置１Ａ（図１参照）のハードウェア構成と変わらないため、説明を省略する。
【０１９１】
図３３は、第３の実施形態における通信命令挿入処理Ｓ４０Ｃの詳細を示すフローチャートである。図３３を参照して（適宜図２３参照）、通信命令挿入処理Ｓ４０Ｃについて説明する。この通信命令挿入処理Ｓ４０Ｃは、第１の実施形態における通信命令挿入処理Ｓ４０Ａに対応するものである。
【０１９２】
図３３に示すように、まず、データ送信命令挿入部３５１Ｃは、ポインタ通信補助命令生成処理Ｓ４１を行い、ポインタエイリアスＩＤ演算命令を含むプログラムを生成する。このポインタ通信補助命令生成処理Ｓ４１の詳細な説明については後記する。また、データ送信命令挿入部３５１Ｃは、ポインタエイリアスＩＤ演算命令を含むプログラム内のスレッド入力データ参照命令のスレッド出力データ生成命令の直後にスレッド間データ送信命令を挿入する（Ｓ４２Ｃ）。さらに、データ受信同期命令挿入部３５２Ｃは、ポインタエイリアスＩＤ演算命令およびスレッド間データ送信命令を含むプログラム内のスレッド入力データ参照命令の直前にスレッド間データ受信同期命令を挿入する（Ｓ４３Ｃ）。その後、スレッド起動命令挿入部３５３は、ポインタエイリアスＩＤ演算命令、スレッド間データ送信命令およびスレッド間データ受信同期命令を含むプログラム内のスレッドが制御依存する分岐命令において、そのスレッドに到達する分岐枝の直後にスレッド起動命令を挿入する（Ｓ４４Ｃ）。これらの処理により、通信命令挿入部３５Ｃは、構文解析部３１によって生成された中間語に通信命令（ポインタエイリアスＩＤ演算命令、スレッド間データ送信命令、スレッド間データ受信同期命令およびスレッド起動命令を含む通信命令）を挿入することができる。
【０１９３】
図３４は、ポインタ通信補助命令生成処理Ｓ４１の詳細を示すフローチャートである。図３４を参照して（適宜図２３参照）、ポインタ通信補助命令生成処理Ｓ４１について説明する。
【０１９４】
図３４に示すように、まず、スレッド間転送ポインタ抽出部３４１は、スレッド間で転送されるポインタを抽出する（Ｓ４１１）。次に、スレッド間転送ポインタ抽出部３４１は、構文解析部３１によって生成された中間語内のスレッド間で転送されるポインタを定義する命令に対してポインタエイリアスＩＤ演算命令を挿入する（Ｓ４１２）。これらの処理により、スレッド間転送ポインタ抽出部３４１は、構文解析部３１によって生成された中間語にポインタエイリアスＩＤ演算命令を挿入することができる。
【０１９５】
以上の第１の実施形態ないし第３の実施形態に係るプログラム処理装置によれば、プログラマ等が逐次プログラムに簡単な記述を追加するだけで、マルチプロセッサシステムが高性能な並列処理を実行するための実行コードを生成することが可能である。
【０１９６】
（マルチプロセッサシステム）
以下、図面（図３５〜図４２）を用いて本発明の実施形態におけるマルチプロセッサシステムについて説明する。
図３５は、マルチプロセッサシステム全体の構成を示す図である。図３５に示すように、プロセッサＰ（Ｐ０）、プロセッサＰ（Ｐ１）およびプロセッサＰ（Ｐ２）が通信ネットワークＣＳによって接続されている。ここで、プロセッサの数は特に限定されるものではない。
プロセッサＰは、プロセッサ間通信処理部（処理部）（以下、「通信処理部６０」と表す）と、プロセッサ内処理部（処理部）（以下、「プログラム処理部７０」と表す）と、ローカルメモリ（記憶部）８０とを含んで構成される。通信処理部６０は、プログラム処理部７０との同期を行うことで、プロセッサＰ間での通信を実行し、プロセッサＰ間の通信データハザードを検出する機能を有する。また、プログラム処理部７０は、ローカルメモリ８０に格納された実行コード（プログラム処理装置１Ｃによって生成された通信命令を含む分割プログラム５５Ｄ（図２３参照））に基づいて処理を行い、通信処理部６０が検出したデータハザードの検出結果に応じて、実行コードの実行または中断状態を制御する機能を有する。実行コードに含まれる通信命令は、プログラム処理部７０と通信処理部６０とが協調しながら実行する。
なお、図３５には、プロセッサＰ０の構成が示されている。プロセッサＰ１およびプロセッサＰ２の構成については、プロセッサＰ０の構成と同様であるため、図３５には示されていない。
【０１９７】
通信処理部６０は、プログラム処理部７０からのデータ送信指令を受け、受信側のプロセッサにデータを送信する。一方、受信側の通信処理部６０は、受信したデータをローカルメモリ８０に格納する。
【０１９８】
プログラム処理部７０は、外部データを参照する命令を実行する際に、その外部データが未受信の場合、データが到着するまで命令の実行を中断する。また、データ送信命令を実行する際、通信ネットワークＣＳの状態または送信先のプロセッサの状態によってデータ送信ができない場合も、データ送信障害が解消されてデータ送信が完了するまで処理を中断する。
【０１９９】
通信が必要なプロセッサ対には、通信チャネルが割り当てられているとする。通信チャネルは、ルータを用いたパケット通信方式、回路スイッチング方式や、リコンフィギャラブルスイッチングネットワーク等の通信ネットワークによって実現される。
【０２００】
図３６は、通信処理部６０の詳細な構成を示す図である。
図３６に示すように、通信処理部６０は、データ受信部６１と、データ通信ポートテーブル６２と、データ送信部６３とを含んで構成される。
データ受信部６１は、各入力ポートに独立に割り当てられたＦＩＦＯ(first-in-first-out)型受信バッファ６１ａを含み、これら受信バッファ６１ａは、各入力ポートから受信するデータをローカルメモリ８０へ書き込む操作を制御する。
受信バッファ６１ａは、バッファメモリ６１ｂと、状態フラグ６１ｃと、カウンタ６１ｄとを含んで構成される。
バッファメモリ６１ｂは、受信データを一時的に格納する。
状態フラグ６１ｃは、バッファの３つの状態（"empty”, “full”, “non-empty”）を示す。”empty”は、受信データがローカルメモリ８０にもバッファメモリ６１ｂにも存在しない状態を表し、”full”はバッファメモリ６１ｂが埋まった状態を表し、”non-empty”は”empty”でも”full”でもない状態を表す。
カウンタ６１ｄは、バッファメモリ６１ｂに格納されているデータブロック数を示す。ここで、データブロックとは、一回のデータ通信で転送されるデータの集合である。
受信バッファ６１ａは、ループ（繰り返し実行される処理）の内部に別々のプロセッサが並列実行するスレッドが埋め込まれている場合に、これらのスレッド間（プロセッサ間）で繰り返し発生するデータ通信を一時的にバッファリングするために設けられており、このことにより、これらのスレッド（プロセッサ）がパイプライン方式で並列実行することが可能になる。
【０２０１】
図３７は、データ通信ポートテーブル６２のデータ構造を示す図である。
図３７に示すように、データ通信ポートテーブル６２は、プロセッサ間データ通信を実行するためのポート情報６２０を保持するテーブルであり、各プロセッサの通信処理部６０（図３６参照）の中に搭載されるものである。ポート情報６２０は、ポートＩＤ６２１と、ポートタイプ６２２と、ポートサイズ６２３と、ポートアドレス６２４と、ポートバッファアドレス６２５と、エイリアスＩＤアドレス６２６と、送信先テーブル６２７と、ポートエイリアステーブル６２８とを含んで構成される。
【０２０２】
ポートＩＤ６２１は、データ送信命令の中で、送信データを指定するためのＩＤである。
ポートタイプ６２２は、通信方向（入力、出力）、データタイプ（直接アクセスデータ、間接アクセスデータ、ポインタデータ）などの種別を表すものである。
ここで、「直接アクセスデータ（直接アクセス型データ）」とは、ポインタ型データ以外の、データ格納アドレスが静的に定まる関数内ローカル変数またはグローバル変数を指す。「間接アクセスデータ（ポインタ参照データ）」とは、ポインタによってその格納アドレスが定まるデータを指す。「ポインタデータ」とは、ポインタ型データを指す。
ポートサイズ６２３は、ポートが扱うデータの大きさでありバイト単位で表す。
ポートアドレス６２４は、データが格納されているローカルメモリ８０内のアドレスを表すものである。
ポートバッファアドレス６２５は、受信データを一時的に格納するポートバッファ（受信バッファ）へのポインタ（受信データを一時的に格納するポートバッファ（受信バッファ）のアドレス）である。なお、ポートバッファアドレス６２５は、ポートタイプ６２２の通信方向が入力のときに有効となる情報である。
エイリアスＩＤアドレス６２６は、エイリアスＩＤ変数が格納されているローカルメモリ８０内のアドレスを表すものである。なお、エイリアスＩＤアドレス６２６は、ポートタイプ６２２のデータタイプが間接アクセスデータまたはポインタデータのときに有効となる情報である。
送信先テーブル６２７は、送信先プロセッサのプロセッサＩＤ６２７ａと、ポートＩＤ６２７ｂとを保持するものである。ここで、プロセッサＩＤ６２７ａは、送信先プロセッサを識別するためのＩＤであり、ポートＩＤ６２７ｂは、送信先プロセッサへデータ送信要求と一緒に送信するデータＩＤとして使用するものである。
ポートエイリアステーブル６２８は、送信データがポインタを介した「間接アクセスデータ」や、「ポインタデータ」の場合、ポインタのエイリアスオブジェクトのエイリアスＩＤ、データサイズ、データ格納アドレスなどを含んだポインタエイリアスに関する情報を（それぞれエイリアスＩＤ６２８ａ、オブジェクトサイズ６２８ｂ、オブジェクトアドレス６２８ｃとして）テーブル化したものである。
【０２０３】
図３６に戻って、図３７を参照しながら、通信処理部６０の構成の説明を続ける。
データ送信部６３は、プログラム処理部７０によってデータ送信命令が実行されると、プログラム処理部７０から送信データに対応するポートＩＤを受け取る。
また、データ送信部６３は、送信データに対応するポートＩＤを受け取ると、データ通信ポートテーブル６２内からそのポートＩＤにマッチするポート情報６２０を取得する。
さらに、データ送信部６３は、ポート情報を取得すると、各送信先プロセッサに対して、データ送信要求を出し、送信許可が返信されるまで待ち続ける。データ送信要求には、受信ポートＩＤ、エイリアスＩＤなどの通信情報が付加される。ここで、エイリアスＩＤには、送信データがポインタを介した間接アクセスデータまたはポインタデータである場合は、実行コード（実行プログラム）中のエイリアスＩＤ演算命令によって適宜更新されているポインタのエイリアスＩＤ変数の値を使用し、送信データが直接アクセスデータである場合は、任意の値を使用する。
【０２０４】
また、データ送信部６３は、ポートタイプが間接アクセスデータまたはポインタデータの場合は、ポートエイリアステーブル６２８の当該エイリアスＩＤ６２８ａがポインタのエイリアスＩＤ変数の値と一致する情報（以下、ポートエイリアス情報ともいう）を取得する。
さらに、データ送信部６３は、ここで、ポートタイプに応じた方法で、ローカルメモリ８０から送信データを読み出し、通信ネットワークＣＳを介して送信する。ポートタイプに応じた方法とは、ポートタイプが直接アクセスデータの場合は、ポートアドレス６２４に格納アドレスからデータを読み出して送信先プロセッサに送信し、ポートタイプが間接アクセスデータの場合は、ポートエイリアステーブル６２８から取得したポートエイリアス情報のオブジェクトアドレス６２８ｃによって指定されるアドレスからデータを読み出して送信先プロセッサに送信し、ポートタイプがポインタデータの場合は、ポインタ値からポートエイリアス情報のオブジェクトアドレス６２８ｃを引いたポインタオフセット値を計算し、このオフセット値を送信先プロセッサに送信する。
【０２０５】
データ受信部６１は、送信元プロセッサからデータ送信要求を受信する。
また、データ受信部６１は、データ送信要求の中に含まれている通信情報（受信ポートＩＤ、エイリアスＩＤ）を用いて、データ通信ポートテーブル６２内の該当ポートＩＤを持つポート情報６２０を取得する。
さらに、データ受信部６１は、ポートタイプが「間接アクセスデータ」または「ポインタデータ」の場合は、ポートエイリアステーブル（図３７参照）の当該エイリアスＩＤ６２８ａがポインタのエイリアスＩＤ変数の値と一致するポートエイリアス情報を取得する。
さらに、データ受信部６１は、受信データを一時的に格納する受信バッファ６１ａを、ポート情報に含まれるポートバッファアドレス６２５（図３７参照）を用いて選択する。
【０２０６】
また、データ受信部６１は、データ受信障害がない場合、データ送信許可を返信する。データ受信障害とは、別のプロセッサからのデータ送信が進行している場合や、複数のプロセッサから同時にデータ送信要求が到着し、その中で優先度が一番高いものではない場合、受信バッファ６１ａの状態フラグ６１ｃが”full"の場合などである。また、データ受信部６１は、データ受信障害がある場合、データ送信不許可を返信し、受信を拒否する。
また、データ受信部６１は、通信ネットワークＣＳを介して受信したデータを、ポートタイプに応じた方法で受信バッファ６１ａに転送する。ここで、ポートタイプに応じた方法とは、ポートタイプが直接アクセスデータの場合は、受信データを受信バッファ６１ａに転送し、ポートタイプが間接アクセスデータの場合は、受信データとエイリアスＩＤを受信バッファ６１ａに転送し、ポインタデータの場合は、受信したポインタオフセット値にポートエイリアス情報のオブジェクトアドレス６２８ｃを加えてポインタ値を計算し、このポインタ値とエイリアスＩＤを受信バッファ６１ａに転送する方法である。
【０２０７】
受信バッファ６１ａは、データ受信部６１から転送データを受け取ると、受信バッファ６１ａの状態フラグ６１ｃに応じてローカルメモリ８０への書込み操作を制御する。
状態フラグ６１ｃが”empty”の場合は、受信バッファ６１ａは、データ受信部６１から受け取った転送データをローカルメモリ８０へ直接書き込む。このときの書込み先アドレスは、ポートタイプが直接アクセスデータまたはポインタデータの場合は、ポートアドレス（ポートアドレス６２４によって指定されるアドレス）であり、ポートタイプが間接アクセスデータの場合は、ポートエイリアス情報（ポートエイリアステーブル６２８から取得した情報）に含まれるオブジェクトアドレス（オブジェクトアドレス６２８ｃによって指定されるアドレス）である。さらに、受信バッファ６１ａは、ポートタイプが間接アクセスデータまたはポインタデータの際には、転送データとともにデータ受信部６１から受け取ったエイリアスＩＤを、エイリアスＩＤアドレス（エイリアスＩＤアドレス６２６によって指定されるアドレス）に格納する。
【０２０８】
状態フラグ６１ｃが”non-empty”の場合は、ローカルメモリ８０に受信データが存在していることを意味するので、受信バッファ６１ａは、データ受信部６１から受け取った転送データをバッファメモリ６１ｂへ書き込む。
受信バッファ６１ａに蓄えられるデータは、現在のスレッド処理では参照されずに（現在のスレッド処理で参照する受信データがすでに存在するので）、次回のスレッド処理以降で参照されるデータである。
状態フラグ６１ｃが”empty”または”non-empty”のいずれの場合も、受信データを格納後、状態フラグ６１ｃは、”non-empty”または”full”になる。
受信バッファ６１ａの状態フラグ６１ｃが初めから”full"のときは、前記説明の通り受信を拒否するので、データが受信バッファ６１ａに転送されることはない。
【０２０９】
プログラム処理部７０において現在のスレッド処理が終了した場合、スレッド終了信号がデータ受信部６１に送信される。データ受信部６１は、このスレッド終了信号を受けて、各受信バッファ６１ａにおいて、カウンタ６１ｄが１以上の場合、即ちバッファメモリ６１ｂにデータが蓄えられている場合、先頭データブロックをローカルメモリ８０に書き込む。このときの書込み先アドレスは、データ通信ポートテーブル６２から得られるポート情報６２０およびポートエイリアス情報（ポートエイリアステーブル６２８から取得した情報）をアクセスし、ポートタイプが直接アクセスデータまたはポインタデータの場合は、ポートアドレス６２４に格納されているアドレスを使用し、ポートタイプが間接アクセスデータの場合は、ポートエイリアス情報に含まれるオブジェクトアドレス６２８ｃに格納されているアドレスを使用する。
さらに間接アクセスデータまたはポインタデータの際に同時にバッファメモリ６１ｂに格納されているエイリアスＩＤは、エイリアスＩＤアドレス６２６に格納される。
前記説明の通り、スレッド処理が終了した時に、受信バッファ６１ａに一時的に蓄えられた先頭データブロックをローカルメモリ８０に自動的に転送する機能は、次回のスレッド処理で参照されるデータを直ちに参照可能にするために必要である。
【０２１０】
また、前記説明の通り、プログラム処理部７０によってデータ送信命令が実行されると、データ送信部６３は、各送信先プロセッサに対して、データ送信要求を出し、送信許可が返信されるまで待ち続けるが、この間データ出力ハザードが発生し、データ送信部６３は、その出力データハザードが解消されるまで、プログラム処理部７０における以降の命令実行を中断させる信号を発生する。
【０２１１】
プログラム処理部７０においてデータ受信同期命令が実行された場合、受信データに対応する受信バッファアドレスをプログラム処理部７０がデータ受信部６１へ転送し、当該受信バッファアドレスに対応する受信バッファ６１ａの状態フラグ６１ｃが”empty”の場合、データ入力ハザードが発生し、データ受信部６１は、このハザードが解消されるまで、プログラム処理部７０における以降の命令実行を中断させる信号を発生する。
【０２１２】
図３８は、データ送信処理の流れを示すフローチャートである。図３８を参照（適宜図３６および図３７参照）して、データ送信処理の流れを説明する。
まず、プログラム処理部７０は、データ送信命令を実行し（Ｓ１０１）、ポートＩＤ（送信ポートＩＤ）をデータ送信部６３に転送する（Ｓ１０２）。
【０２１３】
データ送信部６３は、ポートＩＤ（受信ポートＩＤ）を受信し、データ通信ポートテーブル６２からポート情報６２０を取得する（Ｓ１０３）。データ送信部６３は、ポート情報６２０を取得すると、各送信先プロセッサに対して、受信ポートＩＤ、エイリアスＩＤなどの通信情報が付加されたデータ送信要求を送信し、送信許可を受信するまで待機する（Ｓ１０４）。データ送信部６３は、取得したポート情報６２０内のポートタイプ６２２の判定を行う（Ｓ１０５）。ポートタイプ６２２が「間接アクセスデータ」または「ポインタデータ」の場合は（Ｓ１０５で「間接アクセスデータ」or「ポインタデータ」）、データ送信部６３は、ポートエイリアステーブル６２８からポートエイリアス情報を取得し（Ｓ１０６）、Ｓ１０７に進む。ポートタイプ６２２が「直接アクセスデータ」の場合は（Ｓ１０５で「直接アクセスデータ」）、Ｓ１０７に進む。
【０２１４】
Ｓ１０７では、データ送信部６３は、取得したポート情報６２０内のポートタイプ６２２の判定を行う（Ｓ１０７）。ポートタイプ６２２が「直接アクセスデータ」の場合は（Ｓ１０７で「直接アクセスデータ」）、データ送信部６３は、ポートアドレス（ポートアドレス６２４によって指定されるアドレス）からデータを読み出して、送信データとして設定する（Ｓ１０８）。ポートタイプ６２２が「間接アクセスデータ」の場合は（Ｓ１０７で「間接アクセスデータ」or「ポインタデータ」）、データ送信部６３は、（ポートエイリアステーブル６２８から取得したポートエイリアス情報の）オブジェクトアドレス（オブジェクトアドレス６２８ｃによって指定されるアドレス）からデータを読み出して、送信データとして設定する（Ｓ１０９）。ポートタイプ６２２が「ポインタデータ」の場合は、データ送信部６３は、ポインタオフセット値を送信データとして設定する（Ｓ１１０）。ポインタオフセット値は、ポインタ値からポートエイリアス情報のオブジェクトアドレス６２８ｃを引いて算出する。データ送信部６３は、通信ネットワークＣＳを介して送信データを（送信先プロセッサに）送信する（Ｓ１１１）。
【０２１５】
図３９は、データ受信処理の流れを示すフローチャートである。図３９を参照（適宜図３６および図３７参照）して、データ受信処理の流れを説明する。
まず、データ受信部６１は、送信元プロセッサからデータ送信要求を受信し（Ｓ２０１）、受信したデータ送信要求内の通信情報を用いて、データ通信ポートテーブル６２からポート情報６２０を取得する（Ｓ２０２）。データ受信部６１は、取得したポート情報６２０内のポートタイプ６２２の判定を行う（Ｓ２０３）。ポートタイプ６２２が「間接アクセスデータ」または「ポインタデータ」の場合は（Ｓ２０３で「間接アクセスデータ」or「ポインタデータ」）、データ受信部６１は、ポートエイリアステーブル６２８からポートエイリアス情報を取得し（Ｓ２０４）、Ｓ２０５に進む。ポートタイプ６２２が「直接アクセス」の場合は（Ｓ２０３で「直接アクセスデータ」）、Ｓ２０５に進む。
【０２１６】
Ｓ２０５では、データ受信部６１は、受信障害があるか否かを判定する（Ｓ２０５）。データ受信部６１は、受信障害があると判定した場合（Ｓ２０５で「あり」）、送信不許可を返信し（Ｓ２０６）受信処理を終了する。受信障害がないと判定した場合（Ｓ２０５で「なし」）、送信許可を返信し（Ｓ２０７）、Ｓ２０８に進む。
【０２１７】
Ｓ２０８では、データ受信部６１は、通信ネットワークＣＳを介してデータを受信する（Ｓ２０８）。また、データ受信部６１は、取得したポート情報６２０内のポートタイプ６２２の判定を行う（Ｓ２０９）。ポートタイプ６２２が「直接アクセスデータ」の場合は（Ｓ２０９で「直接アクセスデータ」）、データ受信部６１は、受信データを受信バッファ６１ａに転送する（Ｓ２１０）。ポートタイプ６２２が「間接アクセスデータ」の場合は（Ｓ２０９で「間接アクセスデータ」）、データ受信部６１は、受信データとエイリアスＩＤからなるデータブロックを受信バッファ６１ａに転送する（Ｓ２１１）。ポートタイプ６２２が「ポインタデータ」の場合は（Ｓ２０９で「ポインタデータ」）、データ受信部６１は、受信したポインタオフセット値から計算したポインタ値と受信エイリアスＩＤからなるデータブロックを受信バッファに転送する（Ｓ２１２）。ポインタ値は、受信したポインタオフセット値にポートエイリアス情報のオブジェクトアドレス６２８ｃを加えて算出される。
【０２１８】
図４０は、受信バッファにおける転送データ格納処理の流れを示すフローチャートである。図４０を参照（適宜図３６および図３７参照）して、受信バッファ６１ａにおける転送データ格納処理の流れを説明する。
受信バッファ６１ａは、データ受信部６１から転送データを受け取り（Ｓ３０１）、状態フラグ６１ｃの判定を行う（Ｓ３０２）。
状態フラグ６１ｃが”empty”でなければ（Ｓ３０２でＮｏ」）、バッファメモリ６１ｂに受信データを格納する（Ｓ３０３）。
【０２１９】
状態フラグ６１ｃが”empty”であれば（Ｓ３０２でＹｅｓ」）、データはローカルメモリ８０に格納されるので、さらにポートタイプの判定を行う（Ｓ３０４）。ポートタイプが「直接アクセスデータ」の場合は（Ｓ３０４で「直接アクセスデータ」）、受信バッファ６１ａは、（ポート情報６２０の）ポートアドレス（ポートアドレス６２４によって指定されるアドレス）に受信データを書き込む（Ｓ３０５）。ポートタイプが「間接アクセスデータ」の場合は（Ｓ３０４で「間接アクセスデータ」）、受信バッファ６１ａは、ポートエイリアス情報のオブジェクトアドレス（オブジェクトアドレス６２８ｃによって指定されるアドレス）に受信データを書き込み、さらに、（データ受信部６１から受信した）エイリアスＩＤをエイリアスＩＤアドレス（エイリアスＩＤアドレス６２６によって指定されるアドレス）に書き込む（Ｓ３０６）。ポートタイプ６２２が「ポインタデータ」の場合は（Ｓ３０４で「ポインタデータ」）、受信バッファ６１ａは、ポートアドレス（ポートアドレス６２４によって指定されるアドレス）に受信データを書き込み、さらに、エイリアスＩＤをエイリアスＩＤアドレス（エイリアスＩＤアドレス６２６によって指定されるアドレス）に書き込む（Ｓ３０７）。
【０２２０】
図４１は、スレッド処理終了時の受信バッファ更新処理の流れを示すフローチャートである。図４１を参照（適宜図３６および図３７参照）して、スレッド処理終了時の受信バッファ更新処理の流れを説明する。
プログラム処理部７０が、現在のスレッド処理を終了した後にスレッド処理終了信号をデータ受信部６１に送信し（Ｓ４０１）、データ受信部６１は、すべての受信バッファ６１ａについて以下の処理（図４１の破線で囲まれた処理）を行う。
データ受信部６１は、各受信バッファ６１ａにおいて、そのカウンタ６１ｄが１以上か否かの判定を行う（Ｓ４０２）。１以上の場合（Ｓ４０２でＹｅｓ）、バッファメモリ６１ｂにデータが格納されていることを意味するので、バッファメモリ６１ｂに格納されている先頭データブロックを読出し（Ｓ４０３）、さらにデータ通信ポートテーブル６２からポートＩＤ６２１をもとに該当するポート情報６２０を取得し（Ｓ４０４）、ポートタイプ６２２の判定を行う（Ｓ４０５）。
【０２２１】
ポートタイプ６２２が「直接アクセスデータ」の場合は（Ｓ４０５で「直接アクセスデータ」）、受信バッファ６１ａは、（ポート情報６２０の）ポートアドレス（ポートアドレス６２４によって指定されるアドレス）に受信データを書き込む（Ｓ４０６）。ポートタイプ６２２が「間接アクセスデータ」の場合は（Ｓ４０５で「間接アクセスデータ」）、受信バッファ６１ａは、（ポートエイリアス情報の）オブジェクトアドレス（オブジェクトアドレス６２８ｃによって指定されるアドレス）に受信データ（バッファメモリ６１ｂに格納されているデータ）を書き込み、さらに、エイリアスＩＤ（バッファメモリ６１ｂに格納されているデータ）をエイリアスＩＤアドレス（エイリアスＩＤアドレス６２６によって指定されるアドレス）に書き込む（Ｓ４０７）。ポートタイプ６２２が「ポインタデータ」の場合は（Ｓ４０５で「ポインタデータ」）、受信バッファ６１ａは、ポートアドレス（ポートアドレス６２４によって指定されるアドレス）に受信データを書き込み、さらに、エイリアスＩＤをエイリアスＩＤアドレス（エイリアスＩＤアドレス６２６によって指定されるアドレス）に書き込む（Ｓ４０８）。
【０２２２】
図４２は、通信データ入力ハザード検出処理の流れを示すフローチャートである。図４２を参照（適宜図３６および図３７参照）して、通信データ入力ハザード検出処理の流れを説明する。
プログラム処理部７０がデータ受信同期命令を実行した場合（Ｓ５０１）、受信データに対応する受信バッファ６１ａのアドレスをプログラム処理部７０がデータ受信部６１に転送し（Ｓ５０２）、Ｓ５０３に進む。
【０２２３】
Ｓ５０３では、データ受信部６１は、受け取った受信バッファ６１ａのアドレスを用いて該当する受信バッファ６１ａを選択し、その状態フラグ６１ｃの判定を行う（Ｓ５０３）。
状態フラグ６１ｃが”empty”の場合は（Ｓ５０３でＹｅｓ）、命令中断フラグをプログラム処理部７０に通知し（プログラム処理部７０に命令の実行を中断させる信号を発生し）（Ｓ５０４）、Ｓ５０３に戻る。状態フラグ６１ｃが”empty”でない場合は（Ｓ５０３でＮｏ）、処理を終了する。
【０２２４】
以上の実施形態において説明したように、本実施形態におけるマルチプロセッサシステムは、プログラム処理装置によって生成された通信命令を含む実行コードに基づいて処理を行なうので、データフローマシン型のデータ駆動制御方式により行う通信処理部が、通信されたデータの中で起動すべき命令ブロックを指定する必要がなくなり、複雑なハードウェア構成が不要となる。また、通信処理部とプログラム処理部とが構造的に分離されながらも、通信処理部におけるデータ通信ハザード検出とプログラム処理部における処理の実行または中断状態の制御を密に同期させることが可能となり、プロセッサ間通信で発生する遅延時間を短縮することができる。さらに、マルチプロセッサシステムで必要とされるデータ送受信や同期処理機能をすべて通信処理部が備える構成をとることにより、プログラム制御方式により処理を行う部分（プログラム処理部）として、例えば既存のマイクロプロセッサを使用する構成も可能となり、プログラム処理部のプログラムの開発が容易になり、高性能なマルチプロセッサシステムの開発が容易になる。
【０２２５】
また、通信処理部がポートエイリアス情報を備えることにより、ポインタデータやポインタ参照データを異なるメモリ空間を持つプロセッサ間で共有することを可能にし、並列処理プログラムの開発の上で大きな自由度を提供できる。
【０２２６】
さらに、通信データ入力ハザード検出処理により、データ受信部６１は、他のプロセッサから送信されるデータの個別の受信状態を瞬時に調べ、必要な外部データが未受信の場合は、直ちにプログラム処理部７０における処理の実行を中断させる機能を備えているため、命令ブロック内で参照する外部データがすべて揃う前にプログラム処理部７０における処理の実行を開始することが可能であり、データ待機時間を大幅に短縮することができる。
【図面の簡単な説明】
【０２２７】
【図１】第１の実施形態に係るプログラム処理装置の機能例を示す機能ブロック図である。
【図２】第１の実施形態に係るスレッド記述追加前のプログラムの一例である。
【図３】第１の実施形態に係るスレッド記述追加後のプログラム（並列処理プログラム）の一例である。
【図４】第１の実施形態に係る中間語から命令ブロックを抽出した結果を示すプログラムグラフである。
【図５】第１の実施形態に係る中間語から命令ブロック入出力データを抽出した結果を示すプログラムグラフである。
【図６】第１の実施形態に係る中間語からデータ依存枝を生成した結果を示すプログラムグラフである。
【図７】第１の実施形態に係るデータ依存枝情報を示す表である。
【図８】第１の実施形態に係る出力データ生成命令・入力データ参照命令情報を示す表である。
【図９】第１の実施形態に係るスレッド間データ依存枝情報を示す表である。
【図１０】第１の実施形態に係るスレッド出力データ生成命令の探索方法を説明するための図である。
【図１１】第１の実施形態に係るスレッド間データ依存命令対情報を示す表である。
【図１２】第１の実施形態に係るプログラム処理装置のハードウェア構成の一例を示す図である。
【図１３】第１の実施形態に係るプログラム処理装置の動作を示すフローチャートである。
【図１４】第１の実施形態に係るデータ依存性抽出処理の流れを示すフローチャートである。
【図１５】第１の実施形態に係るスレッド間データ依存性抽出処理の詳細を示すフローチャートである。
【図１６】第１の実施形態に係る通信命令挿入処理の詳細を示すフローチャートである。
【図１７】第２の実施形態に係るプログラム処理装置の機能例を示す機能ブロック図である。
【図１８】第２の実施形態に係る並列処理プログラムの一例である。
【図１９】第２の実施形態に係る中間語から命令ブロック入出力データを抽出した結果を示すプログラムグラフである。
【図２０】第２の実施形態に係るデータ構造の依存性を説明するための図である。
【図２１】第２の実施形態に係るデータ依存枝情報を示す表である。
【図２２】第２の実施形態に係る出力データ生成命令・入力データ参照命令情報を示す表である。
【図２３】第３の実施形態に係るプログラム処理装置の機能例を示す機能ブロック図である。
【図２４】第３の実施形態に係る並列処理プログラムの一例である。
【図２５】第３の実施形態に係る中間語から命令ブロック入出力データを抽出した結果を示すプログラムグラフである。
【図２６】第３の実施形態に係るデータ依存枝情報を示す表である。
【図２７】第３の実施形態に係る出力データ生成命令・入力データ参照命令情報を示す表である。
【図２８】第３の実施形態に係る並列処理プログラムの一例である。
【図２９】第３の実施形態に係る並列処理プログラム内の呼び出し先の関数のプログラムグラフである。
【図３０】第３の実施形態に係る並列処理プログラム内の呼び出し元の関数のプログラムグラフである。
【図３１】第３の実施形態に係る中間語にデータ送信命令およびデータ受信同期命令を挿入した結果を示すプログラムグラフである。
【図３２】第３の実施形態に係る中間語にスレッド起動命令を挿入した結果を示すプログラムグラフである。
【図３３】第３の実施形態に係る通信命令挿入処理の詳細を示すフローチャートである。
【図３４】第３の実施形態に係るポインタ通信補助命令生成処理の詳細を示すフローチャートである。
【図３５】マルチプロセッサシステム全体の構成を示す図である。
【図３６】通信処理部の詳細な構成を示す図である。
【図３７】データ通信ポートテーブルのデータ構造を示す図である。
【図３８】データ送信処理の流れを示すフローチャートである。
【図３９】データ受信処理の流れを示すフローチャートである。
【図４０】受信バッファにおける転送データ格納処理の流れを示すフローチャートである。
【図４１】スレッド処理終了時の受信バッファ更新処理の流れを示すフローチャートである。
【図４２】通信データ入力ハザード検出処理の流れを示すフローチャートである。
【符号の説明】
【０２２８】
１Ａ、１Ｂ、１Ｃ  プログラム処理装置
１０    中央処理装置（処理部）
２０    主記憶装置（処理部）
３０Ａ  並列処理コンパイラ
３１    構文解析部
３２Ａ、３２Ｂ、３２Ｃ  データ依存性抽出部
３３    スレッド間データ依存性抽出部
３４    ポインタ通信補助命令生成部
３５Ａ、３５Ｃ  通信命令挿入部
３６    スレッド間データ通信命令挿入部
３９    プログラム分割・コード生成部
４０    ファイル装置（記憶部）
５０Ａ、５０Ｂ、５０Ｃ、５０Ｄ  並列処理プログラム
５５Ａ、５５Ｂ、５５Ｃ、５５Ｄ    通信命令を含む分割プログラム
３２１  命令参照・生成データ抽出部
３２２  ポインタエイリアス解析部
３２３  関数内間接参照・生成データ抽出部
３２４  命令ブロック抽出部
３２５Ａ、３２５Ｂ、３２５Ｃ  命令ブロック入出力データ抽出部
３２６  データ依存枝生成部
３２７  出力データ生成命令・入力データ参照命令抽出部
３３１  スレッド入出力データ抽出部
３３２  スレッド出力データ生成命令・スレッド入力データ参照命令抽出部
３３３  プロセッサ間通信命令挿入部
３４１  スレッド間転送ポインタ抽出部
３４２  ポインタエイリアスＩＤ演算命令挿入部
３５１Ａ、３５１Ｃ  データ送信命令挿入部
３５２Ａ、３５２Ｃ  データ受信同期命令挿入部
３５３  スレッド起動命令挿入部
ＩＮ    入力装置
ＯＵＴ  出力装置
Ｐ      プロセッサ
５５    通信命令を含む分割プログラム
６０    通信処理部
６１    データ受信部
６２    データ通信ポートテーブル
６３    データ送信部
７０    プログラム処理部
８０    ローカルメモリ
６２０  ポート情報
６２２  ポートタイプ
６２３  ポートサイズ
６２４  ポートアドレス
６２７  送信先テーブル
６２８  ポートエイリアステーブル
６２８ｃ  オブジェクトアドレス
ＣＳ    通信ネットワーク
【図１】
2007193430.tif 000003
【図２】
2007193430.tif 000004
【図３】
2007193430.tif 000005
【図４】
2007193430.tif 000006
【図５】
2007193430.tif 000007
【図６】
2007193430.tif 000008
【図７】
2007193430.tif 000009
【図８】
2007193430.tif 000010
【図９】
2007193430.tif 000011
【図１０】
2007193430.tif 000012
【図１１】
2007193430.tif 000013
【図１２】
2007193430.tif 000014
【図１３】
2007193430.tif 000015
【図１４】
2007193430.tif 000016
【図１５】
2007193430.tif 000017
【図１６】
2007193430.tif 000018
【図１７】
2007193430.tif 000019
【図１８】
2007193430.tif 000020
【図１９】
2007193430.tif 000021
【図２０】
2007193430.tif 000022
【図２１】
2007193430.tif 000023
【図２２】
2007193430.tif 000024
【図２３】
2007193430.tif 000025
【図２４】
2007193430.tif 000026
【図２５】
2007193430.tif 000027
【図２６】
2007193430.tif 000028
【図２７】
2007193430.tif 000029
【図２８】
2007193430.tif 000030
【図２９】
2007193430.tif 000031
【図３０】
2007193430.tif 000032
【図３１】
2007193430.tif 000033
【図３２】
2007193430.tif 000034
【図３３】
2007193430.tif 000035
【図３４】
2007193430.tif 000036
【図３５】
2007193430.tif 000037
【図３６】
2007193430.tif 000038
【図３７】
2007193430.tif 000039
【図３８】
2007193430.tif 000040
【図３９】
2007193430.tif 000041
【図４０】
2007193430.tif 000042
【図４１】
2007193430.tif 000043
【図４２】
2007193430.tif 000044