(57)【要約】【課題】逐次プログラムに対して動的にコスト計算を行い、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムの並列化を可能とすること。【解決手段】逐次プログラムの実行中に、ループに入ったことをループ解析装置３が検出し、通信コストと演算コストを計算し、並列実行が可能なループを発見する。コードコンバータ４は、並列実行が可能なループを並列化し、並列化したコードを生成してサブメモリ５に書き込む。上記ループを再びアクセスしたことがループ検出装置６で検出されると、メモリコントローラ７はサブメモリ５からコードを読み出すように各ノードのプロセッサ１に通知し、また、セレクタ８に信号を送ってサブメモリ５をアクセスさせる。並列コードの実行が終了したら、メモリコントローラ７が再びセレクタ８に信号を送り、メインメモリ２にある通常の逐次コードにアクセスを切り替えて処理を続行する。【選択図】          図１
2004310651.tif 000002
【特許請求の範囲】
【請求項１】
自動並列化処理を行う分散マルチプロセッサシステムにおける情報処理装置であって、
ある逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見する手段と、
上記並列実行が可能なループを並列化し、並列化したコードを生成する手段と、
並列化したコードを書き込む記憶領域と、
上記のループを再びアクセスしたことを検出する手段と、
２回目以降のアクセスに対しては、上記並列化したコードをアクセスする手段とを備えたことを特徴とする情報処理装置。
【請求項２】
自動並列化処理を行う分散マルチプロセッサシステムにおける情報処理装置であって、
逐次プログラムの実行中に、コンパイラが付加したループの存在を示す命令を検出するプロセッサと、
上記命令が付加されたループの通信コストと演算コストを計算し、並列実行が可能なループを発見する手段と、
上記並列実行が可能なループを並列化し、並列化したコードを生成する手段と、
並列化したコードを書き込む記憶領域と、
２回目以降のアクセスに対しては上記並列化したコードをアクセスする手段とを備えたことを特徴とする情報処理装置。
【請求項３】
自動並列化処理を行う分散マルチプロセッサシステムにおける情報処理装置であって、
逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見する手段と、
上記並列実行が可能なループを並列化し、並列化したコードを生成する手段と、
データ分割を行う手段と、
並列化したコードおよび分割したデータを書き込む記憶領域と、
上記のループを再びアクセスしたことを検出する手段と、
２回目以降のアクセスに対しては、上記並列化したコードおよび分割したデータをアクセスする手段とを備えた、ことを特徴とする情報処理装置。
【請求項４】
自動並列化処理を行う分散マルチプロセッサシステムにおける情報処理装置であって、
逐次プログラムの実行中に、コンパイラが付加したループの存在を示す命令を検出するプロセッサと、
上記命令が付加されたループの通信コストと演算コストを計算し、並列実行が可能なループを発見する手段と、
上記並列実行が可能なループを並列化し、並列化したコードを生成する手段と、
データ分割を行う手段と、
並列化したコードおよび分割したデータを書き込む記憶領域と、
２回目以降のアクセスに対しては並列化したコードおよび分割したデータをアクセスする手段とを備えた、ことを特徴とする情報処理装置。
【請求項５】
プログラムの実行を終了したら上記記憶領域に書き込まれた並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換える手段を備えたことを特徴とする請求項１，２，３または請求項４の情報処理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、分散メモリ型マルチプロセッサシステムにおいてループ自動並列化を行う情報処理装置に関する。
【０００２】
【従来の技術】
近年、分散メモリ型マルチプロセッサシステムの研究が進んでいる。分散メモリ型マルチプロセッサシステムの資源をうまく活用するためには、並列プログラミング技術が必要とされる。
共有メモリ型のマルチプロセッサシステムにおいて、コンパイラによるプログラムの自動並列化処理を行うものとして、例えば特許文献１に記載のものが提案されている。
上記特許文献１に記載のものは、並列性を阻害するデータ依存関係が解消されるようにプログラムを変形し、データ階層を判別してシステムで利用可能なプロセッサ数分の同一プロセス実行タスク間共有データを割り当て、並列実行用の並列コードを生成することにより、マクロ演算として比較的使用頻度の高い総和、累積等のループを排他／同期制御を用いないで並列化し、オーバヘッドを抑止するようにしたものである。
また、分散メモリ型並列計算機における完全自動並列化を実現するコンパイラおよびその実行システムとして、特許文献２に記載のものが提案されている。
上記特許文献２に記載のものは、データ処理実行に必要となる全データ、およびデータ処理実行に必要となる手続きを分割して、各プロセッサエレメントのローカルメモリに展開し、各プロセッサエレメントが自ローカルメモリに展開される手続きに従い、自ローカルメモリに展開されるデータを用いてデータ処理を実行するようにしたものである。
その他、分散メモリ型並列計算機用並列化を行うコンパイラ技術に関するものとして特許文献３に記載のものがある。
【０００３】
【特許文献１】
特開平５−６１８９９号公報
【特許文献２】
特開平９−６２６３６号公報
【特許文献３】
特開平６−２３１０９９号公報
【０００４】
【発明が解決しようとする課題】
上述したように並列プログラミング技術が種々提案されているが、分散メモリ型マルチプロセッサシステムにおいては、予め並列化可能なループを手作業で探し、並列化コンパイラを用いて並列化コードを生成し、並列化処理を行うのが一般的であった。しかし、並列プログラミングは困難な作業であり、その結果として高性能なアプリケーションソフトは不足していた。
ここで、複数のノードを持つある分散メモリ型マルチプロセッサシステムを考える。各ノードには、プロセッサエレメント（ＰＥ）やメモリなどが含まれている。
まず、図１４（ａ）のような逐次プログラムを考えた場合は、図１４（ｂ）のように１ノードのＰＥ（ＰＥ１）でＡ（１）〜Ａ（ｎ）のｎ個の配列データを演算する。
ここで並列プログラムでは、ｎ回回転するループの処理が完全に分割できるとすれば、例えば２ノードを使用した時には、図１４（ｃ）のように各ノードのＰＥ１とＰＥ２においてｎ／２個の配列データを演算すれば良いことになる。
しかしながら、ループ終了後に各ノードにおけるデータのコンシステンシを保つために、各ノードで演算した結果をお互いに交換する必要がある。そのため、図１４（ｄ）のようにデータ通信が発生する。
この通信コストが、１／２になった演算コストよりも小さければ、図１４（ｅ）のタイムチャートに示したように並列化によって性能が向上する。
【０００５】
一方、図１５（ａ）のようにインデックスｉの配列データを計算するために、インデックスｉ−１の配列データを必要とするような場合は、ループ内に依存関係がある。
この場合は、２ノードで処理を分割しても、ＰＥ１での演算が終了するまでＰＥ２で演算を行うことができないため、図１５（ｂ）のように並列化効果は期待できない。
また、メモリ容量を考慮にいれると、各ノードごとにデータ分割を行う必要がある。例えば図１６（ａ）のように、全ノードでデータを全て保持して演算のみを分割すると、配列データＡ（ｎ）が８バイトの場合に各ノードで８ｎバイトのデータを保持することになる。データ分散を行った場合、図１６（ｂ）のように各ノードが保持するデータは４ｎバイトとなりメモリ使用量は１／２になる。データ分割を行うことでメモリ使用量を大幅に減らすことができるが、並列プログラミングはより困難なものとなる。
【０００６】
以上のように、並列プログラミングには難しい点が多いが、その中でも特に重要な問題となるのが、並列化することで分割された演算コストと増大する通信コストの計算である。
特に通信コストは、ハードウエアや使用する実行ライブラリの特性に大きく依存するために、プログラムのコーディング時やコンパイル時に計算を行うことは非常に難しく、演算コストおよび通信コストを考慮しつつ、並列プログラムを作成するのは非常に困難である。
本発明は上記事情を考慮してなされたものであって、本発明の目的は、逐次プログラムに対して動的にコスト計算を行い、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムの並列化を可能とすることである。
【０００７】
【課題を解決するための手段】
上記課題を本発明においては、以下のようにして解決する。
（１）自動並列化処理を行う分散マルチプロセッサシステムにおいて、ある逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを生成して記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、２回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスする。
（２）自動並列化処理を行う分散マルチプロセッサシステムにおいて、プロセッサにより、逐次プログラムの実行中に、コンパイラが付加したループの存在を示す命令を検出し、該命令が付加されたループの通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、２回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスする。
（３）上記（１）において、並列実行が可能なループを並列化し、並列化したコードを生成するとともに、データ分割を行い、並列化したコードおよび分割したデータを記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、２回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードおよび分割したデータをアクセスする。
（４）上記（２）において、並列実行が可能なループを並列化し、並列化したコードを生成するとともに、データ分割を行い、並列化したコードおよび分割したデータを記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、２回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードおよび分割したデータをアクセスする。
（５）上記（１）（２）（３）（４）において、プログラムの実行を終了したら上記記憶領域に記憶された並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換える。
【０００８】
上記（１）（２）のように、逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを生成して、記憶領域に書き込み、２回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスするように構成することにより、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムを並列化し、並列化処理を行うことができる。
また、上記（３）（４）のように、並列化したコードを生成するとともに、データ分割を行うことにより、使用メモリ量を大幅に削減することができる。
さらに、上記（５）のようにプログラムの実行を終了したら上記記憶領域に記憶された並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換えることにより、２度目以降の逐次プログラムの実行では、メインメモリにアクセスするだけで、並列プログラムを実行することが可能となる。
【０００９】
【発明の実施の形態】
以下、本発明の実施の形態について説明する。
図１は本発明の第１の実施例の構成を示す図である。
図１において、システム内には、Ｎ個のノード１〜ｎを含み、それらはネットワークで結合されている。
１ノード内に、プロセッサ１と、メインメモリ２と、ループを検出してかつ通信コストおよび演算コストの計算を行うループ解析装置３と、ループの並列化およびコードの書き込みを行うコードコンバータ４と、並列化したコードを書き込むサブメモリ５と、並列化したループを再びアクセスしたことを検出するループ検出装置６と、並列化したループを再び実行する際に、サブメモリ５ヘとアクセスを切り替えるメモリコントローラ７と、セレクタ８を有する。
【００１０】
図２は、本実施例の動作を説明するタイムチャートであり、同図を参照しながら本実施例のシステムの動作について説明する。なお、図２は、図１に示したサブメモリ５、メインメモリ２、ＰＥ（プロセッサ１）、ループ解析装置３およびコードコンバータ４（後述する第３の実施例の場合はデータコンバータも含む）、ループ検出装置６、セレクタ８の各動作タイミングを示している。
ここでは、逐次プログラムは、ノード１でまず実行されるとする。この逐次プログラムは、ノード１のメインメモリ２から読み出され、プロセッサ１において実行される。
プログラムの実行中にループに入ったことは、ループ解析装置３が検出し、その後ループの解析を始める（図２Ａ）。ループ解析装置３では、ループ内での並列化可能なコードを調査する。
この際に、Ｍ（Ｍ≦Ｎ）ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
【００１１】
上記演算コストの計算について図９により説明する。
図９（ａ）に示したソースコードのループは、同図（ｂ）のようにコンパイルされているとする。
ループ内には、２つのａｄｄ命令と２つのｌｏａｄ命令、ｆｍｕｌ命令とｓｔｏｒｅ命令が一つずつ存在し、これらの命令の実行に伴うレイテンシをそれぞれτａｄｄ  、τｌｏａｄ、τｆｍｕｌ、τｓｔｏｒｅ  と定義する。
ループの回転数はｎ回であるが、Ｎノードで分割したこれらの命令が１命令ずつ順次処理されるとすれば、各ノードにおける演算コストは、同図（ｂ）の場合、演算コスト＝（２＊τａｄｄ  ＋２＊τｌｏａｄ＋τｆｍｕｌ＋τｓｔｏｒｅ  ）＊ｎ／Ｎと計算できる。ここで、簡単な例として、ｎはＮの倍数と仮定する。スーパースカラ等、複数の命令が同時に実行できる場合は、そのオーバラップ分を考慮して上記の式を変更する。
【００１２】
次に、通信コストの計算について、図１０により説明する。
図９（ａ）に示したループのコードを各ノードに分割するとする。この場合、コンシステンシの保持のために、図１０（ａ）に示すようにループの演算処理の最後にブロードキャスト（ＭＰＩ＿ＢＣＡＳＴ）を行う必要がある。
ブロードキャストのレイテンシ（通信コスト）は、通信データサイズおよび何ノードヘ通信するかで変化する。このレイテンシは通常線形にはならず、図１０（ｂ）のように非線型な値を示す。
このレイテンシに関するデータが、ループ解析装置３に保持されており、通信データサイズおよび分割したノード数に対応するレイテンシは瞬時に呼び出すことができる。
通信コストは、ノード１からＮノードにブロードキャストするに要する時間のＮ倍として求めることができ、従って、図１０に示すように、通信コスト＝τｂｃａｓｔ  ＿１ｎｏｄｅ  ＿ｔｏ＿Ｎｎｏｄｅ  ＊Ｎで計算することができる。
ブロードキャストだけでなく、１対１通信であるＭＰＩ＿ＳＥＮＤとＭＰＩ＿ＲＥＣＶなどに関するデータもループ解析装置に保持されており、適宜そのレイテンシを呼び出して通信オーバヘッドを計算できる。
【００１３】
並列化による高速化が可能ならば、ループ解析装置３からコードコンバータ４に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ５に並列化されたコードが転送され書き込まれる（図２Ｂ）。また、ループ解析装置３からループ検出装置６に並列化部分の先頭アドレス、終了アドレスが送られ、ループ検出装置６はこのアドレスを記憶する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。並列化されたコードを再びアクセスしたことは、上記記憶したアドレスに基づきループ検出装置６によって検出され、メモリコントローラ７に信号が送られる。
メモリコントローラ７が信号を受け取ると、メモリコントローラ７は各ノードのサブメモリ５からコードを読み出すように各ノードのプロセッサ１に通知する。また、セレクタ８に信号を送ってサブメモリをアクセスさせる（図２Ｃ）。
並列コードの実行が終了したら、メモリコントローラ５が再びセレクタ８に信号を送り、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する（図２Ｄ）。
そして、並列化されたコードが再びアクセスされると、上記と同様に、セレクタ８に信号を送ってサブメモリをアクセスさせ（図２Ｅ）、並列コードの実行が終了したら、セレクタ８を切り換え、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する（図２Ｆ）。
【００１４】
図３は本発明の第２の実施例の構成を示す図であり、本実施例は前記第１の実施例のものにサブメモリの内容をメインメモリに書き戻すライトバック装置を付加したものである。
図３において、システム内には、Ｎ個のノード１〜ｎを含み、それらはネットワークで結合されている。
第１の実施例と同様、１ノード内に、プロセッサ１と、メインメモリ２と、ループを検出してかつ通信コストおよび演算コストの計算を行うループ解析装置３と、ループの並列化およびコードの書き込みを行うコードコンバータ４と、並列化したコードを書き込むサブメモリ５と、並列化したループを再びアクセスしたことを検出するループ検出装置６と、並列化したループを再び実行する際に、サブメモリ５ヘとアクセスを切り替えるメモリコントローラ７と、セレクタ８を有する。さらに、本実施例では、上記に加え、１回目のプログラムの実行を終了したら、サブメモリの内容をメインメモリに書き戻すライトバック装置９が設けられている。
【００１５】
次に、本実施例の動作について前記図２を参照しながら説明する。
前記と同様、逐次プログラムは、ノード１でまず実行されるとする。この逐次プログラムは、ノード１のメインメモリ２から読み出され、プロセッサ１において実行される。
プログラムの実行中にループに入ったことは、ループ解析装置３が検出し、その後ループの解析を始める（図２Ａ）。ループ解析装置３では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにＭ（Ｍ≦Ｎ）ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図９、図１０で説明したのと同じであり、図９、図１０の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト＝（２＊τａｄｄ  ＋２＊τｌｏａｄ＋τｆｍｕｌ＋τｓｔｏｒｅ  ）＊ｎ／Ｎ
通信コスト＝τｂｃａｓｔ  ＿１ｎｏｄｅ  ＿ｔｏ＿Ｎｎｏｄｅ  ＊Ｎ
なお、ブロードキャストだけでなく、１対１通信であるＭＰＩ＿ＳＥＮＤとＭＰＩ＿ＲＥＣＶなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【００１６】
並列化による高速化が可能ならば、ループ解析装置３からコードコンバータ４に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ５に並列化されたコードが転送され書き込まれる（図２Ｂ）。また、ループ解析装置３からループ検出装置６に並列化部分の先頭アドレス、終了アドレスが送られ、ループ検出装置６はこのアドレスを記憶する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。上記の並列化されたコードを再びアクセスしたことは、前記したように、ループ検出装置６によつて検出され、ここからメモリコントローラ７に信号が送られる。
メモリコントローラ７が信号を受け取ると、メモリコントローラ７は各ノードのサブメモリ５からコードを読み出すように各ノードのプロセッサ１に通知する。また、セレクタ８に信号を送ってサブメモリをアクセスさせる（図２Ｃ）。
並列コードの実行が終了したら、メモリコントローラ５が再びセレクタ８に信号を送り、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する（図２Ｄ）。
そして、プログラムの実行が終了すると、ライトバック装置９が各ノードのサブメモリ５からメインメモリ２ヘとコードを書き換える。この作業により、２回目以降のプログラムの実行では、並列化されたプログラムが実行されることになる。
以上のように、本実施例では、ライトバック装置９を設けて、各ノードのサブメモリからメインメモリヘとコードを書き換えるようにしているので、２回目移行の逐次プログラムの実行では、セレクタ８を切り換えてメインメモリからサブメモリへアクセスを切り換えることなく、並列プログラムの実行が可能となる。
【００１７】
図４は本発明の第３の実施例の構成を示す図であり、本実施例は、前記第２の実施例のものに配列データの分割とデータの書き込みを行うデータコンバータを設けたものである。
図４において、システム内には、Ｎ個のノード１〜ｎを含み、それらはネットワークで結合されている。
第２の実施例と同様、１ノード内に、プロセッサ１と、メインメモリ２と、ループを検出してかつ通信コストおよび演算コストの計算を行うループ解析装置３と、ループの並列化およびコードの書き込みを行うコードコンバータ４と、並列化したコードを書き込むサブメモリ５と、並列化したループを再びアクセスしたことを検出するループ検出装置６と、並列化したループを再び実行する際に、サブメモリ５ヘとアクセスを切り替えるメモリコントローラ７と、セレクタ８と、サブメモリの内容をメインメモリに書き戻すライトバック装置９を有する。
さらに、本実施例では、上記に加え配列データの分割とデータの書き込みを行うデータコンバータ１０が設けられている。
【００１８】
次に、本実施例の動作について前記図２を参照しながら説明する。
前記と同様、逐次プログラムは、ノード１でまず実行されるとする。この逐次プログラムは、ノード１のメインメモリ２から読み出され、プロセッサ１において実行される。
プログラムの実行中にループに入ったことは、ループ解析装置３が検出し、その後ループの解析を始める（図２Ａ）。ループ解析装置３では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにＭ（Ｍ≦Ｎ）ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図９、図１０で説明したのと同じであり、図９、図１０の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト＝（２＊τａｄｄ  ＋２＊τｌｏａｄ＋τｆｍｕｌ＋τｓｔｏｒｅ  ）＊ｎ／Ｎ
通信コスト＝τｂｃａｓｔ  ＿１ｎｏｄｅ  ＿ｔｏ＿Ｎｎｏｄｅ  ＊Ｎ
なお、ブロードキャストだけでなく、１対１通信であるＭＰＩ＿ＳＥＮＤとＭＰＩ＿ＲＥＣＶなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【００１９】
並列化による高速化が可能ならば、ループ解析装置３からコードコンバータ４に信号が送られ、並列化コードが生成される。また、データコンバータ１０に信号が送られ、各ノードのサブメモリ５ヘデータを分割するためのアドレス計算およびインデックス計算を行う。
その後、各ノードのサブメモリ５に並列化されたコードおよび分割が行われたデータが転送されて書き込まれる。（図２Ｂ）。
また、前記したようにループ解析装置３からループ検出装置６に並列化部分の先頭アドレス、終了アドレスが送られ、ループ検出装置６はこのアドレスを記憶する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。上記の並列化されたコードを再びアクセスしたことは、前記したように、ループ検出装置６によつて検出され、ここからメモリコントローラ７に信号が送られる。
メモリコントローラ７が信号を受け取ると、メモリコントローラ７は各ノードのサブメモリ５からコードを読み出すように各ノードのプロセッサ１に通知する。また、セレクタ８に信号を送ってサブメモリをアクセスさせる（図２Ｃ）。
並列コードの実行が終了したら、メモリコントローラ５が再びセレクタ８に信号を送り、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する（図２Ｄ）。
そして、プログラムの実行が終了すると、ライトバック装置９が各ノードのサブメモリ５からメインメモリ２へとコードを書き換える。この作業により、前記第２の実施例と同様、２回目以降のプログラムの実行では、並列化されたプログラムが実行されることになる。
本実施例では、上記のようにデータコンバータ１０を設け配列データを分割しているので、使用メモリ量を大幅に削減することができる。
【００２０】
次に、上記第１〜第３の実施例を具体例により説明する。
前記したように、システム内にＮ個のノードか含まれ、それらはネットワークで結合されている。プログラムはノード１のメインメモリ２に格納されており、プロセッサ１で実行される。
実行されるプログラムは、前記図１４（ａ）および図１５（ａ）に示したようなループＡおよびループＢを含んでいるとする。
すなわち、ループＡのようにループ内での依存関係がないものと、ループＢのようにループ内に依存関係があるものである。ループＡの場合は、処理を分割してもループ内に依存関係がないので、図１４（ｅ）に示したように、並列に処理を行った後にデータ通信で結果を集めればよい。
しかしながら、ループＢではループ内に依存関係があるために単純な分割を行っても全く効果がない。すなわち図１５（ｂ）のように、ＰＥ１（ノード１を構成するプロセッサエレメント）とＰＥ２で処理を分割し、インデックス１〜（ｎ／２）をＰＥ１で、インデックス（ｎ／２＋１）〜ｎをＰＥ２で演算するとすると、ＰＥ１での演算を終えない限りＰＥ２での演算が行えないために並列化効果がでない。
【００２１】
プログラムの実行中にループが実行されると、ループ解析装置３は、以下のように並列化効果が得られるか否かを検出し、並列度を決定する。
ループ解析装置３では、まずそのループが並列化可能か否かを解析する。上記例では、図１４のループＡは並列化可能で、図１５のループＢは並列化不可とする。
並列化可能なループＡに関しては、分割ノード数による演算コストを計算すると同時に、そのために発生する通信コストの計算を行う。演算コストは、前記図９に示したようにループ内の各命令のレイテンシの和で求める。
スーパスカラのように複数の命令が同時に発行できる場合には、そのオーバラップ分も計算に入れる。通信コストは、実際に使用している実行ライブラリ関数の通信レイテンシがループ解析装置に記憶されており、その値を用いて計算する。こうして、並列化された演算コストと通信コストの和が一番小さくなるように並列度を決定する。どう分割しても演算コストの性能向上分よりも通信コストが増大する場合は、並列化を行わない。
こうして、並列化可能であると判断すると、コードコンバータ４に並列化情報および逐次コードが送られ並列化される。
【００２２】
データ分割を行わない第１、第２の実施例では、図１１（ｂ）のようにループＡの逐次コードが並列化コードヘとコンバートされ、図１１（ｃ）のようにＰＥ１とＰＥ２、それぞれに対応するノード上のメモリにデータが割り付けられる。データ分割を行う第３の実施例では、図１２（ｂ）のように逐次コードは並列化コードヘとコンバートされる。また、データコンバータ１０に並列化情報およびデータが送られ、データ分割が行われる。データ分割を行うと、前記図１６で説明したように使用メモリ量が大幅に削滅されるが、図１２（ｃ）に示すようにアドレス変換を行うとともに、図１２（ｂ）に示すように、インデックス変換を行う必要がある。
並列化されたコードは、各ノードのサブメモリ５に転送されて書き込まれる。また、第３の実施例では、分割されたデータもサブメモリ５に転送されて書き込まれる。
【００２３】
この後、前記図２に示したように、再び並列化されたループをアクセスすると、ループ検出装置６がそのことを検出し、メモリコントロ一ラ７に通知する。メモリコントローラ７は、各ノードのセレクタ８に信号を送り、いままでのメインメモリ２上の逐次プログラムから、サブメモリ５上の並列プログラムを実行するように処理を切り替える。
並列化されたコードの実行が終了すると、メモリコントローラ７に信号か送られる。メモリコントローラ７からはセレクタ８に信号が送られ、メインメモリ２の逐次プログラムを実行するように切り変わる。こうして処理は続行され、プログラムの処理は終了する。
さらに、第２、第３の実施例の場合は、実行終了後にサブメモリ５の並列プログラムを、ライトバック装置９が、各ノードのメインメモリ２ヘと書き戻す。こうして２度目以降の実行では、メモリコントローラ７が逐次プログラムと並列プログラムを切り替えることなくプログラムを実行することができる。
【００２４】
次に、前記第４〜第６の実施例について説明する。第４〜第６の実施例は、前記第１〜第３の実施例の変形例であり、前記第１〜３の実施例のようにループ検出装置を設けずに、コンパイラにより並列化部分に命令を付加し、これにより並列化部分を検出するようにしたものである。
図５は本発明の第４の実施例の構成を示す図である。
図５において、システム内には、Ｎ個のノード１〜ｎを含み、それらはネットワークで結合されている。
１ノード内に、プロセッサ１と、メインメモリ２と、コンパイラによって付加された命令によってプロセッサ１が検出したループに対して通信コストおよび演算コストの計算を行うループ解析装置３と、ループの並列化およびコードの書き込みを行うコードコンバータ４と、並列化したコードを書き込むサブメモリ５と、並列化したループを再び実行する際に、サブメモリ５ヘとアクセスを切り替えるメモリコントローラ７と、セレクタ８を有する。
【００２５】
図６は、本実施例の動作を説明するタイムチャートであり、同図を参照しながら本実施例のシステムの動作について説明する。なお、図６は、図５に示したサブメモリ５、メインメモリ２、ＰＥ（プロセッサ１）、ループ解析装置３およびコードコンバータ４（後述する第６の実施例の場合はデータコンバータも含む）、セレクタ８の各動作タイミングを示している。
次に、本実施例の動作について前記図６を参照しながら説明する。
前記と同様、逐次プログラムは、ノード１でまず実行されるとする。この逐次プログラムは、ノード１のメインメモリ２から読み出され、プロセッサ１において実行される。
コンパイラは、ループの最初と最後に命令（例えば図６に示す”ｉｍｐｌｙ”）を付加しており、プロセッサ１はその命令を検知するとループ解析装置３に信号を送る（図６Ａ）。ループ解析装置３では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにＭ（Ｍ≦Ｎ）ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図９、図１０で説明したのと同じであり、図９、図１０の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト＝（２＊τａｄｄ  ＋２＊τｌｏａｄ＋τｆｍｕｌ＋τｓｔｏｒｅ  ）＊ｎ／Ｎ
通信コスト＝τｂｃａｓｔ  ＿１ｎｏｄｅ  ＿ｔｏ＿Ｎｎｏｄｅ  ＊Ｎ
なお、ブロードキャストだけでなく、１対１通信であるＭＰＩ＿ＳＥＮＤとＭＰＩ＿ＲＥＣＶなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【００２６】
並列化による高速化が可能ならば、ループ解析装置３からコードコンバータ４に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ５に並列化されたコードが転送され書き込まれる（図６Ｂ）。この際に、メインメモリの逐次プログラムに付加されている、ループを示す命令（図６の”ｉｍｐｌｙ”）を並列化されたことを示す命令（図６の”ｐａｒ”）に書き換え、並列化されたことを記録する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。上記の並列化されたコードを再びアクセスしたことは、プロセッサ１によつて検出され、ここからメモリコントローラ７に信号が送られる。
メモリコントローラ７が信号を受け取ると、メモリコントローラ７は各ノードのサブメモリ５からコードを読み出すように各ノードのプロセッサ１に通知する。また、セレクタ８に信号を送ってサブメモリ５をアクセスさせる（図６Ｃ）。並列コードの実行が終了したら、メモリコントローラ７が再びセレクタ８に信号を送り、メインメモリ２にある通常の逐次コードにアクセスを切り替えて処理を続行する（図６Ｄ）。
以下同様に、並列化されたコードが再びアクセスされたら、サブメモリ５をアクセスし、並列コードの実行が終了したら、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する（図６Ｅ，Ｆ）。
【００２７】
図７は本発明の第５の実施例の構成を示す図であり、本実施例は前記第４の実施例のものにサブメモリの内容をメインメモリに書き戻すライトバック装置を付加したものである。
図７において、システム内には、Ｎ個のノード１〜ｎを含み、それらはネットワークで結合されている。
第４の実施例と同様、１ノード内に、プロセッサ１と、メインメモリ２と、コンパイラによって付加された命令によってプロセッサが検出したループに対して、通信コストおよび演算コストの計算を行うループ解析装置３と、ループの並列化およびコードの書き込みを行うコードコンバータ４と、並列化したコードを書き込むサブメモリ５と、並列化したループを再び実行する際に、サブメモリ５ヘとアクセスを切り替えるメモリコントローラ７と、セレクタ８を有する。さらに、本実施例では、上記に加え、１回目のプログラムの実行を終了したら、サブメモリの内容をメインメモリに書き戻すライトバック装置９が設けられている。
【００２８】
次に、本実施例の動作について前記図６を参照しながら説明する。
前記と同様、逐次プログラムは、ノード１でまず実行されるとする。この逐次プログラムは、ノード１のメインメモリ２から読み出され、プロセッサ１において実行される。
コンパイラは、前記したようにループに対して命令をつけており、プロセッサ１はその命令を検知するとループ解析装置３に信号を送る（図６Ａ）。ループ解析装置３では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにＭ（Ｍ≦Ｎ）ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図９、図１０で説明したのと同じであり、図９、図１０の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト＝（２＊τａｄｄ  ＋２＊τｌｏａｄ＋τｆｍｕｌ＋τｓｔｏｒｅ  ）＊ｎ／Ｎ
通信コスト＝τｂｃａｓｔ  ＿１ｎｏｄｅ  ＿ｔｏ＿Ｎｎｏｄｅ  ＊Ｎ
なお、ブロードキャストだけでなく、１対１通信であるＭＰＩ＿ＳＥＮＤとＭＰＩ＿ＲＥＣＶなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【００２９】
並列化による高速化が可能ならば、ループ解析装置３からコードコンバータ４に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ５に並列化されたコードが転送され書き込まれる（図６Ｂ）。この際に、前記したようにメインメモリの逐次プログラムに付加されている、ループを示す命令を並列化されたことを示す命令に書き換え、並列化されたことを記録する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされると、前記したように、プロセッサ１によって並列化されたコードを再びアクセスしたことが検出され、ここからメモリコントローラ７に信号が送られる。
メモリコントローラ７は各ノードのサブメモリ５からコードを読み出すように各ノードのプロセッサ１に通知する。また、セレクタ８に信号を送ってサブメモリ５をアクセスさせる（図６Ｃ）。
並列コードの実行が終了したら、メモリコントローラ７が再びセレクタ８に信号を送り、メインメモリ２にある通常の逐次コードにアクセスを切り替えて処理を続行する（図６Ｄ）。
以下同様に、並列化されたコードが再びアクセスされたら、サブメモリ５をアクセスし、並列コードの実行が終了したら、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する（図６Ｅ，Ｆ）。
プログラムの実行が終了すると、ライトバック装置９が各ノードのサブメモリからメインメモリヘとコードを書き換える。この作業により、前記第２の実施例で説明したように、２回目以降の逐次プログラムの実行では、並列化されたプログラムが実行されることになる。
【００３０】
図８は本発明の第６の実施例の構成を示す図であり、本実施例は前記第５の実施例のものに、配列データの分割とデータの書き込みを行うデータコンバータを設けたものである。
図８において、システム内には、Ｎ個のノード１〜ｎを含み、それらはネットワークで結合されている。
第５の実施例と同様、１ノード内に、プロセッサ１と、メインメモリ２と、コンパイラによって付加された命令によってプロセッサが検出したループに対して、通信コストおよび演算コストの計算を行うループ解析装置３と、ループの並列化およびコードの書き込みを行うコードコンバータ４と、並列化したコードを書き込むサブメモリ５と、並列化したループを再び実行する際に、サブメモリ５ヘとアクセスを切り替えるメモリコントローラ７と、セレクタ８と、１回目のプログラムの実行を終了したら、サブメモリ５の内容をメインメモリ２に書き戻すライトバック装置９を有する。さらに、本実施例では、上記に加え、データの分割および書き込みを行うデータコンバータ１０が設けられている。
【００３１】
次に、本実施例の動作について前記図６を参照しながら説明する。
前記と同様、逐次プログラムは、ノード１でまず実行されるとする。この逐次プログラムは、ノード１のメインメモリ２から読み出され、プロセッサ１において実行される。
コンパイラは、前記したようにループに対して命令を付加しており、プロセッサ１はその命令を検知するとループ解析装置３に信号を送る（図６Ａ）。ループ解析装置３では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにＭ（Ｍ≦Ｎ）ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図９、図１０で説明したのと同じであり、図９、図１０の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト＝（２＊τａｄｄ  ＋２＊τｌｏａｄ＋τｆｍｕｌ＋τｓｔｏｒｅ  ）＊ｎ／Ｎ
通信コスト＝τｂｃａｓｔ  ＿１ｎｏｄｅ  ＿ｔｏ＿Ｎｎｏｄｅ  ＊Ｎ
なお、ブロードキャストだけでなく、１対１通信であるＭＰＩ＿ＳＥＮＤとＭＰＩ＿ＲＥＣＶなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【００３２】
並列化による高速化が可能ならば、ループ解析装置３からコードコンバータ４に信号が送られ、並列化コードが生成される。また、データコンバータ１０に信号が送られ、各ノードのサブメモリ５ヘデータを分割するためのアドレス計算およびインデックス計算を行う。
その後、各ノードのサブメモリ５に並列化されたコードが転送され書き込まれる（図６Ｂ）。この際に、前記したようにメインメモリの逐次プログラムに付加されている、ループを示す命令を並列化されたことを示す命令に書き換え、並列化されたことを記録する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされると、前記したように、プロセッサ１によって並列化されたコードを再びアクセスしたことが検出され、ここからメモリコントローラ７に信号が送られる。
メモリコントローラ７は各ノードのサブメモリ５からコードを読み出すように各ノードのプロセッサ１に通知する。また、セレクタ８に信号を送ってサブメモリ５をアクセスさせる（図６Ｃ）。
並列コードの実行が終了したら、メモリコントローラ７が再びセレクタ８に信号を送り、メインメモリ２にある通常の逐次コードにアクセスを切り替えて処理を続行する（図６Ｄ）。
以下同様に、並列化されたコードが再びアクセスされたら、サブメモリ５をアクセスし、並列コードの実行が終了したら、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する（図６Ｅ，Ｆ）。
プログラムの実行が終了すると、ライトバック装置９が各ノードのサブメモリからメインメモリヘとコードを書き換える。この作業により、前記第２の実施例で説明したように、２回目以降の逐次プログラムの実行では、並列化されたプログラムが実行されることになる。
【００３３】
次に、上記第４〜第６の実施例を具体例により説明する。
システム内にＮ個のノードが含まれ、それらはネットワークで結合されている。プログラムはノード１のメインメモリ２に格納されており、プロセッサ１で実行される。
実行されるプログラムは、図１４（ａ）および図１５（ａ）に示したようなループＡおよびループＢを含んでいるとする。
すなわち、ループＡのようにループ内での依存関係がないものと、ループＢのようにループ内に依存関係があるものである。ループＡの場合は、処理を分割してもループ内に依存関係がないので、図１４（ｅ）に示したように、並列に処理を行った後にデータ通信で結果を集めればよい。
しかしながら、ループＢではループ内に依存関係があるために単純な分割を行っても全く効果がない。すなわち図１５（ｂ）のように、ＰＥ１とＰＥ２で処理を分割し、インデックス１〜（ｎ／２）をＰＥ１で、インデックス（ｎ／２＋１）〜ｎをＰＥ２で演算するとすると、ＰＥ１での演算を終えない限りＰＥ２での演算が行えないために並列化効果がでない。
【００３４】
第４〜第６の実施例では、図１３（ａ）に示すように、コンパイラにより、プログラムのループ開始部にループの開始であることを示す命令（例えば”ｉｍｐｌｙ  ｌｏｏｐ＿ｓｔ”  ）が付加され、終了部にはループの終了であることを示す命令（例えば”ｉｍｐｌｙ  ｌｏｏｐ＿ｅｎｄ”）が付加されている。
プログラムの実行中にループが実行されると、そのことはプロセッサ１が検出し、ループ解析装置３に通知する。
ループ解析装置３は、前記と同様、並列化効果が得られるか否かを検出し、並列度を決定する。上記の例では、ループＡは並列化可能で、ループＢは並列化不可である。
並列化可能なループＡに関しては、分割ノード数による演算コストを計算すると同時に、そのために発生する通信コストの計算を行う。演算コストは、図９に示したようにループ内の各命令のレイテンシの和で求める。
前記したようにスーパスカラのように複数の命令が同時に発行できる場合には、そのオーバラップ分も計算に入れる。通信コストは、実際に使用している実行ライブラリ関数の通信レイテンシがループ解析装置に記憶されており、その値を用いて計算する。
こうして、並列化された演算コストと通信コストの和が一番小さくなるように並列度を決定する。どう分割しても演算コストの性能向上分よりも通信コストが増大する場合は、並列化を行わない。
こうして、並列化可能であると判断すると、コードコンバータ４に並列化情報および逐次コードが送られ、並列化される。
【００３５】
データ分割を行わない第４、第５の実施例では、図１１（ｂ）のようにループＡの逐次コードが並列化コードヘとコンバートされ、図１１（ｃ）のようにＰＥ１とＰＥ２、それぞれに対応するノード上のメモリにデータが割り付けられる。また、データ分割を行う第６の実施例では図１２（ｂ）のように逐次コードは並列化コードヘとコンバートされる。第６の実施例の場合は、データコンバータ１０に並列化情報およびデータが送られ、データ分割が行われる。データ分割を行うと、前記図１６に示したように使用メモリ量が大幅に削減されるが、図１２（ｃ）に示すようにアドレス変換を行うとともに、図１２（ｂ）に示すように、インデックス変換を行う必要がある。
並列化されたコードは、各ノードのサブメモリ５に転送されて書き込まれる。また第６の実施例では、分割されたデータもサブメモリ５に転送されて書き込まれる。
また、ループの並列化が行われた際には、ループ解析装置３が、逐次コードのループを示す命令を図１３（ｂ）のように書き換えて、ループの並列化が行われたことを示す。すなわち、前記したようにループを示す命令（図１３（ａ）の”ｉｍｐｌｙ”）を並列化されたことを示す命令（図１３（ｂ）の”ｐａｒ”）に書き換える。
【００３６】
この後、前記図６に示したように、再び並列化されたループをアクセスすると、プロセッサ１は図１３（ｂ）の命令を検知し、メモリコントローラ７に通知する。メモリコントローラ７は、各ノードのセレクタ８に信号を送り、いままでのメインメモリ上の逐次プログラムからサブメモリ５上の並列プログラムを実行するよ引こ処理を切り替える。
並列化されたコードの実行が終了すると、メモリコントローラ７に信号が送られる。メモリコントローラ７からはセレクタ８に信号が送られ、メインメモリ２の逐次プログラムを実行するように切り変わる。こうして処理は続行され、プログラムの処理は終了する。
さらに、第５、第６の実施例の場合は、前記したように、実行終了後にサブメモリ５の並列プログラムを、ライトバック装置９が、各ノードのメインメモリ２へと書き戻す。こうして２度目以降の逐次プログラムの実行では、メモリコントローラ７が逐次プログラムと並列プログラムを切り替えることなく逐次プログラムが実行できる。
【００３７】
【発明の効果】
以上説明したように、本発明においては、以下の効果を得ることができる。
（１）逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを生成して、記憶領域に書き込み、２回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスするように構成したので、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムを並列化し、並列化処理を行うことができる。
（２）上記において、並列化したコードを生成するとともに、データ分割を行うことにより、使用メモリ量を大幅に削減することができる。
（３）プログラムの実行を終了したら上記記憶領域に記憶された並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換えることにより、２度目以降の逐次プログラムの実行では、メインメモリにアクセスするだけで、並列プログラムを実行することが可能となる。
【図面の簡単な説明】
【図１】本発明の第１の実施例の構成を示す図である。
【図２】第１、第２、第３の実施例の動作を説明するタイムチャートである。
【図３】本発明の第２の実施例の構成を示す図である。
【図４】本発明の第３の実施例の構成を示す図である。
【図５】本発明の第４の実施例の構成を示す図である。
【図６】第４、第５、第６の実施例の動作を説明するタイムチャートである。
【図７】本発明の第５の実施例の構成を示す図である。
【図８】本発明の第６の実施例の構成を示す図である。
【図９】ループ解析装置の内部で行われる演算コストの計算を説明する図である。
【図１０】ループ解析装置の内部で行われる通信コストの計算を説明する図である。
【図１１】第１，２，４，５の実施例において、逐次コードを並列コードにコンバートした時のイメージを示す図である。
【図１２】第３，６の実施例において、逐次コードを並列コードにコンバートした時のイメージを示す図である。
【図１３】コンパイラが付加したループであることを示す命令およびループ解析装置が付加したループの並列化が行われたことを示す命令の例を示す図である。
【図１４】ループ内に依存関係のないループ（ループＡ）の例を示す図である。
【図１５】ループ内に依存関係のあるループ（ループＢ）の例を示す図である。
【図１６】データ分割を説明する図である。
【符号の説明】
１    プロセッサ
２    メインメモリ
３    ループ解析装置
４    コードコンバータ
５    サブメモリ
６    ループ検出装置
７    メモリコントローラ
８    セレクタ
９    ライトバック装置
１０  データコンバータ
【図１】
2004310651.tif 000003
【図２】
2004310651.tif 000004
【図３】
2004310651.tif 000005
【図４】
2004310651.tif 000006
【図５】
2004310651.tif 000007
【図６】
2004310651.tif 000008
【図７】
2004310651.tif 000009
【図８】
2004310651.tif 000010
【図９】
2004310651.tif 000011
【図１０】
2004310651.tif 000012
【図１１】
2004310651.tif 000013
【図１２】
2004310651.tif 000014
【図１３】
2004310651.tif 000015
【図１４】
2004310651.tif 000016
【図１５】
2004310651.tif 000017
【図１６】
2004310651.tif 000018