JP2004310651A - コスト解析に基づいてループの自動並列化処理を行う情報処理装置 - Google Patents
コスト解析に基づいてループの自動並列化処理を行う情報処理装置 Download PDFInfo
- Publication number
- JP2004310651A JP2004310651A JP2003106370A JP2003106370A JP2004310651A JP 2004310651 A JP2004310651 A JP 2004310651A JP 2003106370 A JP2003106370 A JP 2003106370A JP 2003106370 A JP2003106370 A JP 2003106370A JP 2004310651 A JP2004310651 A JP 2004310651A
- Authority
- JP
- Japan
- Prior art keywords
- loop
- code
- parallelized
- memory
- execution
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
【課題】逐次プログラムに対して動的にコスト計算を行い、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムの並列化を可能とすること。
【解決手段】逐次プログラムの実行中に、ループに入ったことをループ解析装置3が検出し、通信コストと演算コストを計算し、並列実行が可能なループを発見する。コードコンバータ4は、並列実行が可能なループを並列化し、並列化したコードを生成してサブメモリ5に書き込む。上記ループを再びアクセスしたことがループ検出装置6で検出されると、メモリコントローラ7はサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知し、また、セレクタ8に信号を送ってサブメモリ5をアクセスさせる。並列コードの実行が終了したら、メモリコントローラ7が再びセレクタ8に信号を送り、メインメモリ2にある通常の逐次コードにアクセスを切り替えて処理を続行する。
【選択図】 図1
【解決手段】逐次プログラムの実行中に、ループに入ったことをループ解析装置3が検出し、通信コストと演算コストを計算し、並列実行が可能なループを発見する。コードコンバータ4は、並列実行が可能なループを並列化し、並列化したコードを生成してサブメモリ5に書き込む。上記ループを再びアクセスしたことがループ検出装置6で検出されると、メモリコントローラ7はサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知し、また、セレクタ8に信号を送ってサブメモリ5をアクセスさせる。並列コードの実行が終了したら、メモリコントローラ7が再びセレクタ8に信号を送り、メインメモリ2にある通常の逐次コードにアクセスを切り替えて処理を続行する。
【選択図】 図1
Description
【0001】
【発明の属する技術分野】
本発明は、分散メモリ型マルチプロセッサシステムにおいてループ自動並列化を行う情報処理装置に関する。
【0002】
【従来の技術】
近年、分散メモリ型マルチプロセッサシステムの研究が進んでいる。分散メモリ型マルチプロセッサシステムの資源をうまく活用するためには、並列プログラミング技術が必要とされる。
共有メモリ型のマルチプロセッサシステムにおいて、コンパイラによるプログラムの自動並列化処理を行うものとして、例えば特許文献1に記載のものが提案されている。
上記特許文献1に記載のものは、並列性を阻害するデータ依存関係が解消されるようにプログラムを変形し、データ階層を判別してシステムで利用可能なプロセッサ数分の同一プロセス実行タスク間共有データを割り当て、並列実行用の並列コードを生成することにより、マクロ演算として比較的使用頻度の高い総和、累積等のループを排他/同期制御を用いないで並列化し、オーバヘッドを抑止するようにしたものである。
また、分散メモリ型並列計算機における完全自動並列化を実現するコンパイラおよびその実行システムとして、特許文献2に記載のものが提案されている。
上記特許文献2に記載のものは、データ処理実行に必要となる全データ、およびデータ処理実行に必要となる手続きを分割して、各プロセッサエレメントのローカルメモリに展開し、各プロセッサエレメントが自ローカルメモリに展開される手続きに従い、自ローカルメモリに展開されるデータを用いてデータ処理を実行するようにしたものである。
その他、分散メモリ型並列計算機用並列化を行うコンパイラ技術に関するものとして特許文献3に記載のものがある。
【0003】
【特許文献1】
特開平5−61899号公報
【特許文献2】
特開平9−62636号公報
【特許文献3】
特開平6−231099号公報
【0004】
【発明が解決しようとする課題】
上述したように並列プログラミング技術が種々提案されているが、分散メモリ型マルチプロセッサシステムにおいては、予め並列化可能なループを手作業で探し、並列化コンパイラを用いて並列化コードを生成し、並列化処理を行うのが一般的であった。しかし、並列プログラミングは困難な作業であり、その結果として高性能なアプリケーションソフトは不足していた。
ここで、複数のノードを持つある分散メモリ型マルチプロセッサシステムを考える。各ノードには、プロセッサエレメント(PE)やメモリなどが含まれている。
まず、図14(a)のような逐次プログラムを考えた場合は、図14(b)のように1ノードのPE(PE1)でA(1)〜A(n)のn個の配列データを演算する。
ここで並列プログラムでは、n回回転するループの処理が完全に分割できるとすれば、例えば2ノードを使用した時には、図14(c)のように各ノードのPE1とPE2においてn/2個の配列データを演算すれば良いことになる。
しかしながら、ループ終了後に各ノードにおけるデータのコンシステンシを保つために、各ノードで演算した結果をお互いに交換する必要がある。そのため、図14(d)のようにデータ通信が発生する。
この通信コストが、1/2になった演算コストよりも小さければ、図14(e)のタイムチャートに示したように並列化によって性能が向上する。
【0005】
一方、図15(a)のようにインデックスiの配列データを計算するために、インデックスi−1の配列データを必要とするような場合は、ループ内に依存関係がある。
この場合は、2ノードで処理を分割しても、PE1での演算が終了するまでPE2で演算を行うことができないため、図15(b)のように並列化効果は期待できない。
また、メモリ容量を考慮にいれると、各ノードごとにデータ分割を行う必要がある。例えば図16(a)のように、全ノードでデータを全て保持して演算のみを分割すると、配列データA(n)が8バイトの場合に各ノードで8nバイトのデータを保持することになる。データ分散を行った場合、図16(b)のように各ノードが保持するデータは4nバイトとなりメモリ使用量は1/2になる。データ分割を行うことでメモリ使用量を大幅に減らすことができるが、並列プログラミングはより困難なものとなる。
【0006】
以上のように、並列プログラミングには難しい点が多いが、その中でも特に重要な問題となるのが、並列化することで分割された演算コストと増大する通信コストの計算である。
特に通信コストは、ハードウエアや使用する実行ライブラリの特性に大きく依存するために、プログラムのコーディング時やコンパイル時に計算を行うことは非常に難しく、演算コストおよび通信コストを考慮しつつ、並列プログラムを作成するのは非常に困難である。
本発明は上記事情を考慮してなされたものであって、本発明の目的は、逐次プログラムに対して動的にコスト計算を行い、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムの並列化を可能とすることである。
【0007】
【課題を解決するための手段】
上記課題を本発明においては、以下のようにして解決する。
(1)自動並列化処理を行う分散マルチプロセッサシステムにおいて、ある逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを生成して記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスする。
(2)自動並列化処理を行う分散マルチプロセッサシステムにおいて、プロセッサにより、逐次プログラムの実行中に、コンパイラが付加したループの存在を示す命令を検出し、該命令が付加されたループの通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスする。
(3)上記(1)において、並列実行が可能なループを並列化し、並列化したコードを生成するとともに、データ分割を行い、並列化したコードおよび分割したデータを記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードおよび分割したデータをアクセスする。
(4)上記(2)において、並列実行が可能なループを並列化し、並列化したコードを生成するとともに、データ分割を行い、並列化したコードおよび分割したデータを記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードおよび分割したデータをアクセスする。
(5)上記(1)(2)(3)(4)において、プログラムの実行を終了したら上記記憶領域に記憶された並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換える。
【0008】
上記(1)(2)のように、逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを生成して、記憶領域に書き込み、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスするように構成することにより、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムを並列化し、並列化処理を行うことができる。
また、上記(3)(4)のように、並列化したコードを生成するとともに、データ分割を行うことにより、使用メモリ量を大幅に削減することができる。
さらに、上記(5)のようにプログラムの実行を終了したら上記記憶領域に記憶された並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換えることにより、2度目以降の逐次プログラムの実行では、メインメモリにアクセスするだけで、並列プログラムを実行することが可能となる。
【0009】
【発明の実施の形態】
以下、本発明の実施の形態について説明する。
図1は本発明の第1の実施例の構成を示す図である。
図1において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
1ノード内に、プロセッサ1と、メインメモリ2と、ループを検出してかつ通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再びアクセスしたことを検出するループ検出装置6と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8を有する。
【0010】
図2は、本実施例の動作を説明するタイムチャートであり、同図を参照しながら本実施例のシステムの動作について説明する。なお、図2は、図1に示したサブメモリ5、メインメモリ2、PE(プロセッサ1)、ループ解析装置3およびコードコンバータ4(後述する第3の実施例の場合はデータコンバータも含む)、ループ検出装置6、セレクタ8の各動作タイミングを示している。
ここでは、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
プログラムの実行中にループに入ったことは、ループ解析装置3が検出し、その後ループの解析を始める(図2A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、M(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
【0011】
上記演算コストの計算について図9により説明する。
図9(a)に示したソースコードのループは、同図(b)のようにコンパイルされているとする。
ループ内には、2つのadd命令と2つのload命令、fmul命令とstore命令が一つずつ存在し、これらの命令の実行に伴うレイテンシをそれぞれτadd 、τload、τfmul、τstore と定義する。
ループの回転数はn回であるが、Nノードで分割したこれらの命令が1命令ずつ順次処理されるとすれば、各ノードにおける演算コストは、同図(b)の場合、演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/Nと計算できる。ここで、簡単な例として、nはNの倍数と仮定する。スーパースカラ等、複数の命令が同時に実行できる場合は、そのオーバラップ分を考慮して上記の式を変更する。
【0012】
次に、通信コストの計算について、図10により説明する。
図9(a)に示したループのコードを各ノードに分割するとする。この場合、コンシステンシの保持のために、図10(a)に示すようにループの演算処理の最後にブロードキャスト(MPI_BCAST)を行う必要がある。
ブロードキャストのレイテンシ(通信コスト)は、通信データサイズおよび何ノードヘ通信するかで変化する。このレイテンシは通常線形にはならず、図10(b)のように非線型な値を示す。
このレイテンシに関するデータが、ループ解析装置3に保持されており、通信データサイズおよび分割したノード数に対応するレイテンシは瞬時に呼び出すことができる。
通信コストは、ノード1からNノードにブロードキャストするに要する時間のN倍として求めることができ、従って、図10に示すように、通信コスト=τbcast _1node _to_Nnode *Nで計算することができる。
ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、適宜そのレイテンシを呼び出して通信オーバヘッドを計算できる。
【0013】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ5に並列化されたコードが転送され書き込まれる(図2B)。また、ループ解析装置3からループ検出装置6に並列化部分の先頭アドレス、終了アドレスが送られ、ループ検出装置6はこのアドレスを記憶する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。並列化されたコードを再びアクセスしたことは、上記記憶したアドレスに基づきループ検出装置6によって検出され、メモリコントローラ7に信号が送られる。
メモリコントローラ7が信号を受け取ると、メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリをアクセスさせる(図2C)。
並列コードの実行が終了したら、メモリコントローラ5が再びセレクタ8に信号を送り、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図2D)。
そして、並列化されたコードが再びアクセスされると、上記と同様に、セレクタ8に信号を送ってサブメモリをアクセスさせ(図2E)、並列コードの実行が終了したら、セレクタ8を切り換え、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図2F)。
【0014】
図3は本発明の第2の実施例の構成を示す図であり、本実施例は前記第1の実施例のものにサブメモリの内容をメインメモリに書き戻すライトバック装置を付加したものである。
図3において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
第1の実施例と同様、1ノード内に、プロセッサ1と、メインメモリ2と、ループを検出してかつ通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再びアクセスしたことを検出するループ検出装置6と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8を有する。さらに、本実施例では、上記に加え、1回目のプログラムの実行を終了したら、サブメモリの内容をメインメモリに書き戻すライトバック装置9が設けられている。
【0015】
次に、本実施例の動作について前記図2を参照しながら説明する。
前記と同様、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
プログラムの実行中にループに入ったことは、ループ解析装置3が検出し、その後ループの解析を始める(図2A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにM(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図9、図10で説明したのと同じであり、図9、図10の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/N
通信コスト=τbcast _1node _to_Nnode *N
なお、ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【0016】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ5に並列化されたコードが転送され書き込まれる(図2B)。また、ループ解析装置3からループ検出装置6に並列化部分の先頭アドレス、終了アドレスが送られ、ループ検出装置6はこのアドレスを記憶する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。上記の並列化されたコードを再びアクセスしたことは、前記したように、ループ検出装置6によつて検出され、ここからメモリコントローラ7に信号が送られる。
メモリコントローラ7が信号を受け取ると、メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリをアクセスさせる(図2C)。
並列コードの実行が終了したら、メモリコントローラ5が再びセレクタ8に信号を送り、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図2D)。
そして、プログラムの実行が終了すると、ライトバック装置9が各ノードのサブメモリ5からメインメモリ2ヘとコードを書き換える。この作業により、2回目以降のプログラムの実行では、並列化されたプログラムが実行されることになる。
以上のように、本実施例では、ライトバック装置9を設けて、各ノードのサブメモリからメインメモリヘとコードを書き換えるようにしているので、2回目移行の逐次プログラムの実行では、セレクタ8を切り換えてメインメモリからサブメモリへアクセスを切り換えることなく、並列プログラムの実行が可能となる。
【0017】
図4は本発明の第3の実施例の構成を示す図であり、本実施例は、前記第2の実施例のものに配列データの分割とデータの書き込みを行うデータコンバータを設けたものである。
図4において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
第2の実施例と同様、1ノード内に、プロセッサ1と、メインメモリ2と、ループを検出してかつ通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再びアクセスしたことを検出するループ検出装置6と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8と、サブメモリの内容をメインメモリに書き戻すライトバック装置9を有する。
さらに、本実施例では、上記に加え配列データの分割とデータの書き込みを行うデータコンバータ10が設けられている。
【0018】
次に、本実施例の動作について前記図2を参照しながら説明する。
前記と同様、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
プログラムの実行中にループに入ったことは、ループ解析装置3が検出し、その後ループの解析を始める(図2A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにM(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図9、図10で説明したのと同じであり、図9、図10の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/N
通信コスト=τbcast _1node _to_Nnode *N
なお、ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【0019】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成される。また、データコンバータ10に信号が送られ、各ノードのサブメモリ5ヘデータを分割するためのアドレス計算およびインデックス計算を行う。
その後、各ノードのサブメモリ5に並列化されたコードおよび分割が行われたデータが転送されて書き込まれる。(図2B)。
また、前記したようにループ解析装置3からループ検出装置6に並列化部分の先頭アドレス、終了アドレスが送られ、ループ検出装置6はこのアドレスを記憶する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。上記の並列化されたコードを再びアクセスしたことは、前記したように、ループ検出装置6によつて検出され、ここからメモリコントローラ7に信号が送られる。
メモリコントローラ7が信号を受け取ると、メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリをアクセスさせる(図2C)。
並列コードの実行が終了したら、メモリコントローラ5が再びセレクタ8に信号を送り、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図2D)。
そして、プログラムの実行が終了すると、ライトバック装置9が各ノードのサブメモリ5からメインメモリ2へとコードを書き換える。この作業により、前記第2の実施例と同様、2回目以降のプログラムの実行では、並列化されたプログラムが実行されることになる。
本実施例では、上記のようにデータコンバータ10を設け配列データを分割しているので、使用メモリ量を大幅に削減することができる。
【0020】
次に、上記第1〜第3の実施例を具体例により説明する。
前記したように、システム内にN個のノードか含まれ、それらはネットワークで結合されている。プログラムはノード1のメインメモリ2に格納されており、プロセッサ1で実行される。
実行されるプログラムは、前記図14(a)および図15(a)に示したようなループAおよびループBを含んでいるとする。
すなわち、ループAのようにループ内での依存関係がないものと、ループBのようにループ内に依存関係があるものである。ループAの場合は、処理を分割してもループ内に依存関係がないので、図14(e)に示したように、並列に処理を行った後にデータ通信で結果を集めればよい。
しかしながら、ループBではループ内に依存関係があるために単純な分割を行っても全く効果がない。すなわち図15(b)のように、PE1(ノード1を構成するプロセッサエレメント)とPE2で処理を分割し、インデックス1〜(n/2)をPE1で、インデックス(n/2+1)〜nをPE2で演算するとすると、PE1での演算を終えない限りPE2での演算が行えないために並列化効果がでない。
【0021】
プログラムの実行中にループが実行されると、ループ解析装置3は、以下のように並列化効果が得られるか否かを検出し、並列度を決定する。
ループ解析装置3では、まずそのループが並列化可能か否かを解析する。上記例では、図14のループAは並列化可能で、図15のループBは並列化不可とする。
並列化可能なループAに関しては、分割ノード数による演算コストを計算すると同時に、そのために発生する通信コストの計算を行う。演算コストは、前記図9に示したようにループ内の各命令のレイテンシの和で求める。
スーパスカラのように複数の命令が同時に発行できる場合には、そのオーバラップ分も計算に入れる。通信コストは、実際に使用している実行ライブラリ関数の通信レイテンシがループ解析装置に記憶されており、その値を用いて計算する。こうして、並列化された演算コストと通信コストの和が一番小さくなるように並列度を決定する。どう分割しても演算コストの性能向上分よりも通信コストが増大する場合は、並列化を行わない。
こうして、並列化可能であると判断すると、コードコンバータ4に並列化情報および逐次コードが送られ並列化される。
【0022】
データ分割を行わない第1、第2の実施例では、図11(b)のようにループAの逐次コードが並列化コードヘとコンバートされ、図11(c)のようにPE1とPE2、それぞれに対応するノード上のメモリにデータが割り付けられる。データ分割を行う第3の実施例では、図12(b)のように逐次コードは並列化コードヘとコンバートされる。また、データコンバータ10に並列化情報およびデータが送られ、データ分割が行われる。データ分割を行うと、前記図16で説明したように使用メモリ量が大幅に削滅されるが、図12(c)に示すようにアドレス変換を行うとともに、図12(b)に示すように、インデックス変換を行う必要がある。
並列化されたコードは、各ノードのサブメモリ5に転送されて書き込まれる。また、第3の実施例では、分割されたデータもサブメモリ5に転送されて書き込まれる。
【0023】
この後、前記図2に示したように、再び並列化されたループをアクセスすると、ループ検出装置6がそのことを検出し、メモリコントロ一ラ7に通知する。メモリコントローラ7は、各ノードのセレクタ8に信号を送り、いままでのメインメモリ2上の逐次プログラムから、サブメモリ5上の並列プログラムを実行するように処理を切り替える。
並列化されたコードの実行が終了すると、メモリコントローラ7に信号か送られる。メモリコントローラ7からはセレクタ8に信号が送られ、メインメモリ2の逐次プログラムを実行するように切り変わる。こうして処理は続行され、プログラムの処理は終了する。
さらに、第2、第3の実施例の場合は、実行終了後にサブメモリ5の並列プログラムを、ライトバック装置9が、各ノードのメインメモリ2ヘと書き戻す。こうして2度目以降の実行では、メモリコントローラ7が逐次プログラムと並列プログラムを切り替えることなくプログラムを実行することができる。
【0024】
次に、前記第4〜第6の実施例について説明する。第4〜第6の実施例は、前記第1〜第3の実施例の変形例であり、前記第1〜3の実施例のようにループ検出装置を設けずに、コンパイラにより並列化部分に命令を付加し、これにより並列化部分を検出するようにしたものである。
図5は本発明の第4の実施例の構成を示す図である。
図5において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
1ノード内に、プロセッサ1と、メインメモリ2と、コンパイラによって付加された命令によってプロセッサ1が検出したループに対して通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8を有する。
【0025】
図6は、本実施例の動作を説明するタイムチャートであり、同図を参照しながら本実施例のシステムの動作について説明する。なお、図6は、図5に示したサブメモリ5、メインメモリ2、PE(プロセッサ1)、ループ解析装置3およびコードコンバータ4(後述する第6の実施例の場合はデータコンバータも含む)、セレクタ8の各動作タイミングを示している。
次に、本実施例の動作について前記図6を参照しながら説明する。
前記と同様、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
コンパイラは、ループの最初と最後に命令(例えば図6に示す”imply”)を付加しており、プロセッサ1はその命令を検知するとループ解析装置3に信号を送る(図6A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにM(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図9、図10で説明したのと同じであり、図9、図10の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/N
通信コスト=τbcast _1node _to_Nnode *N
なお、ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【0026】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ5に並列化されたコードが転送され書き込まれる(図6B)。この際に、メインメモリの逐次プログラムに付加されている、ループを示す命令(図6の”imply”)を並列化されたことを示す命令(図6の”par”)に書き換え、並列化されたことを記録する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。上記の並列化されたコードを再びアクセスしたことは、プロセッサ1によつて検出され、ここからメモリコントローラ7に信号が送られる。
メモリコントローラ7が信号を受け取ると、メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリ5をアクセスさせる(図6C)。並列コードの実行が終了したら、メモリコントローラ7が再びセレクタ8に信号を送り、メインメモリ2にある通常の逐次コードにアクセスを切り替えて処理を続行する(図6D)。
以下同様に、並列化されたコードが再びアクセスされたら、サブメモリ5をアクセスし、並列コードの実行が終了したら、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図6E,F)。
【0027】
図7は本発明の第5の実施例の構成を示す図であり、本実施例は前記第4の実施例のものにサブメモリの内容をメインメモリに書き戻すライトバック装置を付加したものである。
図7において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
第4の実施例と同様、1ノード内に、プロセッサ1と、メインメモリ2と、コンパイラによって付加された命令によってプロセッサが検出したループに対して、通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8を有する。さらに、本実施例では、上記に加え、1回目のプログラムの実行を終了したら、サブメモリの内容をメインメモリに書き戻すライトバック装置9が設けられている。
【0028】
次に、本実施例の動作について前記図6を参照しながら説明する。
前記と同様、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
コンパイラは、前記したようにループに対して命令をつけており、プロセッサ1はその命令を検知するとループ解析装置3に信号を送る(図6A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにM(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図9、図10で説明したのと同じであり、図9、図10の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/N
通信コスト=τbcast _1node _to_Nnode *N
なお、ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【0029】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ5に並列化されたコードが転送され書き込まれる(図6B)。この際に、前記したようにメインメモリの逐次プログラムに付加されている、ループを示す命令を並列化されたことを示す命令に書き換え、並列化されたことを記録する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされると、前記したように、プロセッサ1によって並列化されたコードを再びアクセスしたことが検出され、ここからメモリコントローラ7に信号が送られる。
メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリ5をアクセスさせる(図6C)。
並列コードの実行が終了したら、メモリコントローラ7が再びセレクタ8に信号を送り、メインメモリ2にある通常の逐次コードにアクセスを切り替えて処理を続行する(図6D)。
以下同様に、並列化されたコードが再びアクセスされたら、サブメモリ5をアクセスし、並列コードの実行が終了したら、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図6E,F)。
プログラムの実行が終了すると、ライトバック装置9が各ノードのサブメモリからメインメモリヘとコードを書き換える。この作業により、前記第2の実施例で説明したように、2回目以降の逐次プログラムの実行では、並列化されたプログラムが実行されることになる。
【0030】
図8は本発明の第6の実施例の構成を示す図であり、本実施例は前記第5の実施例のものに、配列データの分割とデータの書き込みを行うデータコンバータを設けたものである。
図8において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
第5の実施例と同様、1ノード内に、プロセッサ1と、メインメモリ2と、コンパイラによって付加された命令によってプロセッサが検出したループに対して、通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8と、1回目のプログラムの実行を終了したら、サブメモリ5の内容をメインメモリ2に書き戻すライトバック装置9を有する。さらに、本実施例では、上記に加え、データの分割および書き込みを行うデータコンバータ10が設けられている。
【0031】
次に、本実施例の動作について前記図6を参照しながら説明する。
前記と同様、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
コンパイラは、前記したようにループに対して命令を付加しており、プロセッサ1はその命令を検知するとループ解析装置3に信号を送る(図6A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにM(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図9、図10で説明したのと同じであり、図9、図10の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/N
通信コスト=τbcast _1node _to_Nnode *N
なお、ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【0032】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成される。また、データコンバータ10に信号が送られ、各ノードのサブメモリ5ヘデータを分割するためのアドレス計算およびインデックス計算を行う。
その後、各ノードのサブメモリ5に並列化されたコードが転送され書き込まれる(図6B)。この際に、前記したようにメインメモリの逐次プログラムに付加されている、ループを示す命令を並列化されたことを示す命令に書き換え、並列化されたことを記録する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされると、前記したように、プロセッサ1によって並列化されたコードを再びアクセスしたことが検出され、ここからメモリコントローラ7に信号が送られる。
メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリ5をアクセスさせる(図6C)。
並列コードの実行が終了したら、メモリコントローラ7が再びセレクタ8に信号を送り、メインメモリ2にある通常の逐次コードにアクセスを切り替えて処理を続行する(図6D)。
以下同様に、並列化されたコードが再びアクセスされたら、サブメモリ5をアクセスし、並列コードの実行が終了したら、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図6E,F)。
プログラムの実行が終了すると、ライトバック装置9が各ノードのサブメモリからメインメモリヘとコードを書き換える。この作業により、前記第2の実施例で説明したように、2回目以降の逐次プログラムの実行では、並列化されたプログラムが実行されることになる。
【0033】
次に、上記第4〜第6の実施例を具体例により説明する。
システム内にN個のノードが含まれ、それらはネットワークで結合されている。プログラムはノード1のメインメモリ2に格納されており、プロセッサ1で実行される。
実行されるプログラムは、図14(a)および図15(a)に示したようなループAおよびループBを含んでいるとする。
すなわち、ループAのようにループ内での依存関係がないものと、ループBのようにループ内に依存関係があるものである。ループAの場合は、処理を分割してもループ内に依存関係がないので、図14(e)に示したように、並列に処理を行った後にデータ通信で結果を集めればよい。
しかしながら、ループBではループ内に依存関係があるために単純な分割を行っても全く効果がない。すなわち図15(b)のように、PE1とPE2で処理を分割し、インデックス1〜(n/2)をPE1で、インデックス(n/2+1)〜nをPE2で演算するとすると、PE1での演算を終えない限りPE2での演算が行えないために並列化効果がでない。
【0034】
第4〜第6の実施例では、図13(a)に示すように、コンパイラにより、プログラムのループ開始部にループの開始であることを示す命令(例えば”imply loop_st” )が付加され、終了部にはループの終了であることを示す命令(例えば”imply loop_end”)が付加されている。
プログラムの実行中にループが実行されると、そのことはプロセッサ1が検出し、ループ解析装置3に通知する。
ループ解析装置3は、前記と同様、並列化効果が得られるか否かを検出し、並列度を決定する。上記の例では、ループAは並列化可能で、ループBは並列化不可である。
並列化可能なループAに関しては、分割ノード数による演算コストを計算すると同時に、そのために発生する通信コストの計算を行う。演算コストは、図9に示したようにループ内の各命令のレイテンシの和で求める。
前記したようにスーパスカラのように複数の命令が同時に発行できる場合には、そのオーバラップ分も計算に入れる。通信コストは、実際に使用している実行ライブラリ関数の通信レイテンシがループ解析装置に記憶されており、その値を用いて計算する。
こうして、並列化された演算コストと通信コストの和が一番小さくなるように並列度を決定する。どう分割しても演算コストの性能向上分よりも通信コストが増大する場合は、並列化を行わない。
こうして、並列化可能であると判断すると、コードコンバータ4に並列化情報および逐次コードが送られ、並列化される。
【0035】
データ分割を行わない第4、第5の実施例では、図11(b)のようにループAの逐次コードが並列化コードヘとコンバートされ、図11(c)のようにPE1とPE2、それぞれに対応するノード上のメモリにデータが割り付けられる。また、データ分割を行う第6の実施例では図12(b)のように逐次コードは並列化コードヘとコンバートされる。第6の実施例の場合は、データコンバータ10に並列化情報およびデータが送られ、データ分割が行われる。データ分割を行うと、前記図16に示したように使用メモリ量が大幅に削減されるが、図12(c)に示すようにアドレス変換を行うとともに、図12(b)に示すように、インデックス変換を行う必要がある。
並列化されたコードは、各ノードのサブメモリ5に転送されて書き込まれる。また第6の実施例では、分割されたデータもサブメモリ5に転送されて書き込まれる。
また、ループの並列化が行われた際には、ループ解析装置3が、逐次コードのループを示す命令を図13(b)のように書き換えて、ループの並列化が行われたことを示す。すなわち、前記したようにループを示す命令(図13(a)の”imply”)を並列化されたことを示す命令(図13(b)の”par”)に書き換える。
【0036】
この後、前記図6に示したように、再び並列化されたループをアクセスすると、プロセッサ1は図13(b)の命令を検知し、メモリコントローラ7に通知する。メモリコントローラ7は、各ノードのセレクタ8に信号を送り、いままでのメインメモリ上の逐次プログラムからサブメモリ5上の並列プログラムを実行するよ引こ処理を切り替える。
並列化されたコードの実行が終了すると、メモリコントローラ7に信号が送られる。メモリコントローラ7からはセレクタ8に信号が送られ、メインメモリ2の逐次プログラムを実行するように切り変わる。こうして処理は続行され、プログラムの処理は終了する。
さらに、第5、第6の実施例の場合は、前記したように、実行終了後にサブメモリ5の並列プログラムを、ライトバック装置9が、各ノードのメインメモリ2へと書き戻す。こうして2度目以降の逐次プログラムの実行では、メモリコントローラ7が逐次プログラムと並列プログラムを切り替えることなく逐次プログラムが実行できる。
【0037】
【発明の効果】
以上説明したように、本発明においては、以下の効果を得ることができる。
(1)逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを生成して、記憶領域に書き込み、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスするように構成したので、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムを並列化し、並列化処理を行うことができる。
(2)上記において、並列化したコードを生成するとともに、データ分割を行うことにより、使用メモリ量を大幅に削減することができる。
(3)プログラムの実行を終了したら上記記憶領域に記憶された並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換えることにより、2度目以降の逐次プログラムの実行では、メインメモリにアクセスするだけで、並列プログラムを実行することが可能となる。
【図面の簡単な説明】
【図1】本発明の第1の実施例の構成を示す図である。
【図2】第1、第2、第3の実施例の動作を説明するタイムチャートである。
【図3】本発明の第2の実施例の構成を示す図である。
【図4】本発明の第3の実施例の構成を示す図である。
【図5】本発明の第4の実施例の構成を示す図である。
【図6】第4、第5、第6の実施例の動作を説明するタイムチャートである。
【図7】本発明の第5の実施例の構成を示す図である。
【図8】本発明の第6の実施例の構成を示す図である。
【図9】ループ解析装置の内部で行われる演算コストの計算を説明する図である。
【図10】ループ解析装置の内部で行われる通信コストの計算を説明する図である。
【図11】第1,2,4,5の実施例において、逐次コードを並列コードにコンバートした時のイメージを示す図である。
【図12】第3,6の実施例において、逐次コードを並列コードにコンバートした時のイメージを示す図である。
【図13】コンパイラが付加したループであることを示す命令およびループ解析装置が付加したループの並列化が行われたことを示す命令の例を示す図である。
【図14】ループ内に依存関係のないループ(ループA)の例を示す図である。
【図15】ループ内に依存関係のあるループ(ループB)の例を示す図である。
【図16】データ分割を説明する図である。
【符号の説明】
1 プロセッサ
2 メインメモリ
3 ループ解析装置
4 コードコンバータ
5 サブメモリ
6 ループ検出装置
7 メモリコントローラ
8 セレクタ
9 ライトバック装置
10 データコンバータ
【発明の属する技術分野】
本発明は、分散メモリ型マルチプロセッサシステムにおいてループ自動並列化を行う情報処理装置に関する。
【0002】
【従来の技術】
近年、分散メモリ型マルチプロセッサシステムの研究が進んでいる。分散メモリ型マルチプロセッサシステムの資源をうまく活用するためには、並列プログラミング技術が必要とされる。
共有メモリ型のマルチプロセッサシステムにおいて、コンパイラによるプログラムの自動並列化処理を行うものとして、例えば特許文献1に記載のものが提案されている。
上記特許文献1に記載のものは、並列性を阻害するデータ依存関係が解消されるようにプログラムを変形し、データ階層を判別してシステムで利用可能なプロセッサ数分の同一プロセス実行タスク間共有データを割り当て、並列実行用の並列コードを生成することにより、マクロ演算として比較的使用頻度の高い総和、累積等のループを排他/同期制御を用いないで並列化し、オーバヘッドを抑止するようにしたものである。
また、分散メモリ型並列計算機における完全自動並列化を実現するコンパイラおよびその実行システムとして、特許文献2に記載のものが提案されている。
上記特許文献2に記載のものは、データ処理実行に必要となる全データ、およびデータ処理実行に必要となる手続きを分割して、各プロセッサエレメントのローカルメモリに展開し、各プロセッサエレメントが自ローカルメモリに展開される手続きに従い、自ローカルメモリに展開されるデータを用いてデータ処理を実行するようにしたものである。
その他、分散メモリ型並列計算機用並列化を行うコンパイラ技術に関するものとして特許文献3に記載のものがある。
【0003】
【特許文献1】
特開平5−61899号公報
【特許文献2】
特開平9−62636号公報
【特許文献3】
特開平6−231099号公報
【0004】
【発明が解決しようとする課題】
上述したように並列プログラミング技術が種々提案されているが、分散メモリ型マルチプロセッサシステムにおいては、予め並列化可能なループを手作業で探し、並列化コンパイラを用いて並列化コードを生成し、並列化処理を行うのが一般的であった。しかし、並列プログラミングは困難な作業であり、その結果として高性能なアプリケーションソフトは不足していた。
ここで、複数のノードを持つある分散メモリ型マルチプロセッサシステムを考える。各ノードには、プロセッサエレメント(PE)やメモリなどが含まれている。
まず、図14(a)のような逐次プログラムを考えた場合は、図14(b)のように1ノードのPE(PE1)でA(1)〜A(n)のn個の配列データを演算する。
ここで並列プログラムでは、n回回転するループの処理が完全に分割できるとすれば、例えば2ノードを使用した時には、図14(c)のように各ノードのPE1とPE2においてn/2個の配列データを演算すれば良いことになる。
しかしながら、ループ終了後に各ノードにおけるデータのコンシステンシを保つために、各ノードで演算した結果をお互いに交換する必要がある。そのため、図14(d)のようにデータ通信が発生する。
この通信コストが、1/2になった演算コストよりも小さければ、図14(e)のタイムチャートに示したように並列化によって性能が向上する。
【0005】
一方、図15(a)のようにインデックスiの配列データを計算するために、インデックスi−1の配列データを必要とするような場合は、ループ内に依存関係がある。
この場合は、2ノードで処理を分割しても、PE1での演算が終了するまでPE2で演算を行うことができないため、図15(b)のように並列化効果は期待できない。
また、メモリ容量を考慮にいれると、各ノードごとにデータ分割を行う必要がある。例えば図16(a)のように、全ノードでデータを全て保持して演算のみを分割すると、配列データA(n)が8バイトの場合に各ノードで8nバイトのデータを保持することになる。データ分散を行った場合、図16(b)のように各ノードが保持するデータは4nバイトとなりメモリ使用量は1/2になる。データ分割を行うことでメモリ使用量を大幅に減らすことができるが、並列プログラミングはより困難なものとなる。
【0006】
以上のように、並列プログラミングには難しい点が多いが、その中でも特に重要な問題となるのが、並列化することで分割された演算コストと増大する通信コストの計算である。
特に通信コストは、ハードウエアや使用する実行ライブラリの特性に大きく依存するために、プログラムのコーディング時やコンパイル時に計算を行うことは非常に難しく、演算コストおよび通信コストを考慮しつつ、並列プログラムを作成するのは非常に困難である。
本発明は上記事情を考慮してなされたものであって、本発明の目的は、逐次プログラムに対して動的にコスト計算を行い、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムの並列化を可能とすることである。
【0007】
【課題を解決するための手段】
上記課題を本発明においては、以下のようにして解決する。
(1)自動並列化処理を行う分散マルチプロセッサシステムにおいて、ある逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを生成して記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスする。
(2)自動並列化処理を行う分散マルチプロセッサシステムにおいて、プロセッサにより、逐次プログラムの実行中に、コンパイラが付加したループの存在を示す命令を検出し、該命令が付加されたループの通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスする。
(3)上記(1)において、並列実行が可能なループを並列化し、並列化したコードを生成するとともに、データ分割を行い、並列化したコードおよび分割したデータを記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードおよび分割したデータをアクセスする。
(4)上記(2)において、並列実行が可能なループを並列化し、並列化したコードを生成するとともに、データ分割を行い、並列化したコードおよび分割したデータを記憶領域に書き込む。
そして、上記のループを再びアクセスしたことを検出し、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードおよび分割したデータをアクセスする。
(5)上記(1)(2)(3)(4)において、プログラムの実行を終了したら上記記憶領域に記憶された並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換える。
【0008】
上記(1)(2)のように、逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを生成して、記憶領域に書き込み、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスするように構成することにより、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムを並列化し、並列化処理を行うことができる。
また、上記(3)(4)のように、並列化したコードを生成するとともに、データ分割を行うことにより、使用メモリ量を大幅に削減することができる。
さらに、上記(5)のようにプログラムの実行を終了したら上記記憶領域に記憶された並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換えることにより、2度目以降の逐次プログラムの実行では、メインメモリにアクセスするだけで、並列プログラムを実行することが可能となる。
【0009】
【発明の実施の形態】
以下、本発明の実施の形態について説明する。
図1は本発明の第1の実施例の構成を示す図である。
図1において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
1ノード内に、プロセッサ1と、メインメモリ2と、ループを検出してかつ通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再びアクセスしたことを検出するループ検出装置6と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8を有する。
【0010】
図2は、本実施例の動作を説明するタイムチャートであり、同図を参照しながら本実施例のシステムの動作について説明する。なお、図2は、図1に示したサブメモリ5、メインメモリ2、PE(プロセッサ1)、ループ解析装置3およびコードコンバータ4(後述する第3の実施例の場合はデータコンバータも含む)、ループ検出装置6、セレクタ8の各動作タイミングを示している。
ここでは、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
プログラムの実行中にループに入ったことは、ループ解析装置3が検出し、その後ループの解析を始める(図2A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、M(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
【0011】
上記演算コストの計算について図9により説明する。
図9(a)に示したソースコードのループは、同図(b)のようにコンパイルされているとする。
ループ内には、2つのadd命令と2つのload命令、fmul命令とstore命令が一つずつ存在し、これらの命令の実行に伴うレイテンシをそれぞれτadd 、τload、τfmul、τstore と定義する。
ループの回転数はn回であるが、Nノードで分割したこれらの命令が1命令ずつ順次処理されるとすれば、各ノードにおける演算コストは、同図(b)の場合、演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/Nと計算できる。ここで、簡単な例として、nはNの倍数と仮定する。スーパースカラ等、複数の命令が同時に実行できる場合は、そのオーバラップ分を考慮して上記の式を変更する。
【0012】
次に、通信コストの計算について、図10により説明する。
図9(a)に示したループのコードを各ノードに分割するとする。この場合、コンシステンシの保持のために、図10(a)に示すようにループの演算処理の最後にブロードキャスト(MPI_BCAST)を行う必要がある。
ブロードキャストのレイテンシ(通信コスト)は、通信データサイズおよび何ノードヘ通信するかで変化する。このレイテンシは通常線形にはならず、図10(b)のように非線型な値を示す。
このレイテンシに関するデータが、ループ解析装置3に保持されており、通信データサイズおよび分割したノード数に対応するレイテンシは瞬時に呼び出すことができる。
通信コストは、ノード1からNノードにブロードキャストするに要する時間のN倍として求めることができ、従って、図10に示すように、通信コスト=τbcast _1node _to_Nnode *Nで計算することができる。
ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、適宜そのレイテンシを呼び出して通信オーバヘッドを計算できる。
【0013】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ5に並列化されたコードが転送され書き込まれる(図2B)。また、ループ解析装置3からループ検出装置6に並列化部分の先頭アドレス、終了アドレスが送られ、ループ検出装置6はこのアドレスを記憶する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。並列化されたコードを再びアクセスしたことは、上記記憶したアドレスに基づきループ検出装置6によって検出され、メモリコントローラ7に信号が送られる。
メモリコントローラ7が信号を受け取ると、メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリをアクセスさせる(図2C)。
並列コードの実行が終了したら、メモリコントローラ5が再びセレクタ8に信号を送り、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図2D)。
そして、並列化されたコードが再びアクセスされると、上記と同様に、セレクタ8に信号を送ってサブメモリをアクセスさせ(図2E)、並列コードの実行が終了したら、セレクタ8を切り換え、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図2F)。
【0014】
図3は本発明の第2の実施例の構成を示す図であり、本実施例は前記第1の実施例のものにサブメモリの内容をメインメモリに書き戻すライトバック装置を付加したものである。
図3において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
第1の実施例と同様、1ノード内に、プロセッサ1と、メインメモリ2と、ループを検出してかつ通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再びアクセスしたことを検出するループ検出装置6と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8を有する。さらに、本実施例では、上記に加え、1回目のプログラムの実行を終了したら、サブメモリの内容をメインメモリに書き戻すライトバック装置9が設けられている。
【0015】
次に、本実施例の動作について前記図2を参照しながら説明する。
前記と同様、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
プログラムの実行中にループに入ったことは、ループ解析装置3が検出し、その後ループの解析を始める(図2A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにM(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図9、図10で説明したのと同じであり、図9、図10の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/N
通信コスト=τbcast _1node _to_Nnode *N
なお、ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【0016】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ5に並列化されたコードが転送され書き込まれる(図2B)。また、ループ解析装置3からループ検出装置6に並列化部分の先頭アドレス、終了アドレスが送られ、ループ検出装置6はこのアドレスを記憶する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。上記の並列化されたコードを再びアクセスしたことは、前記したように、ループ検出装置6によつて検出され、ここからメモリコントローラ7に信号が送られる。
メモリコントローラ7が信号を受け取ると、メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリをアクセスさせる(図2C)。
並列コードの実行が終了したら、メモリコントローラ5が再びセレクタ8に信号を送り、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図2D)。
そして、プログラムの実行が終了すると、ライトバック装置9が各ノードのサブメモリ5からメインメモリ2ヘとコードを書き換える。この作業により、2回目以降のプログラムの実行では、並列化されたプログラムが実行されることになる。
以上のように、本実施例では、ライトバック装置9を設けて、各ノードのサブメモリからメインメモリヘとコードを書き換えるようにしているので、2回目移行の逐次プログラムの実行では、セレクタ8を切り換えてメインメモリからサブメモリへアクセスを切り換えることなく、並列プログラムの実行が可能となる。
【0017】
図4は本発明の第3の実施例の構成を示す図であり、本実施例は、前記第2の実施例のものに配列データの分割とデータの書き込みを行うデータコンバータを設けたものである。
図4において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
第2の実施例と同様、1ノード内に、プロセッサ1と、メインメモリ2と、ループを検出してかつ通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再びアクセスしたことを検出するループ検出装置6と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8と、サブメモリの内容をメインメモリに書き戻すライトバック装置9を有する。
さらに、本実施例では、上記に加え配列データの分割とデータの書き込みを行うデータコンバータ10が設けられている。
【0018】
次に、本実施例の動作について前記図2を参照しながら説明する。
前記と同様、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
プログラムの実行中にループに入ったことは、ループ解析装置3が検出し、その後ループの解析を始める(図2A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにM(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図9、図10で説明したのと同じであり、図9、図10の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/N
通信コスト=τbcast _1node _to_Nnode *N
なお、ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【0019】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成される。また、データコンバータ10に信号が送られ、各ノードのサブメモリ5ヘデータを分割するためのアドレス計算およびインデックス計算を行う。
その後、各ノードのサブメモリ5に並列化されたコードおよび分割が行われたデータが転送されて書き込まれる。(図2B)。
また、前記したようにループ解析装置3からループ検出装置6に並列化部分の先頭アドレス、終了アドレスが送られ、ループ検出装置6はこのアドレスを記憶する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。上記の並列化されたコードを再びアクセスしたことは、前記したように、ループ検出装置6によつて検出され、ここからメモリコントローラ7に信号が送られる。
メモリコントローラ7が信号を受け取ると、メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリをアクセスさせる(図2C)。
並列コードの実行が終了したら、メモリコントローラ5が再びセレクタ8に信号を送り、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図2D)。
そして、プログラムの実行が終了すると、ライトバック装置9が各ノードのサブメモリ5からメインメモリ2へとコードを書き換える。この作業により、前記第2の実施例と同様、2回目以降のプログラムの実行では、並列化されたプログラムが実行されることになる。
本実施例では、上記のようにデータコンバータ10を設け配列データを分割しているので、使用メモリ量を大幅に削減することができる。
【0020】
次に、上記第1〜第3の実施例を具体例により説明する。
前記したように、システム内にN個のノードか含まれ、それらはネットワークで結合されている。プログラムはノード1のメインメモリ2に格納されており、プロセッサ1で実行される。
実行されるプログラムは、前記図14(a)および図15(a)に示したようなループAおよびループBを含んでいるとする。
すなわち、ループAのようにループ内での依存関係がないものと、ループBのようにループ内に依存関係があるものである。ループAの場合は、処理を分割してもループ内に依存関係がないので、図14(e)に示したように、並列に処理を行った後にデータ通信で結果を集めればよい。
しかしながら、ループBではループ内に依存関係があるために単純な分割を行っても全く効果がない。すなわち図15(b)のように、PE1(ノード1を構成するプロセッサエレメント)とPE2で処理を分割し、インデックス1〜(n/2)をPE1で、インデックス(n/2+1)〜nをPE2で演算するとすると、PE1での演算を終えない限りPE2での演算が行えないために並列化効果がでない。
【0021】
プログラムの実行中にループが実行されると、ループ解析装置3は、以下のように並列化効果が得られるか否かを検出し、並列度を決定する。
ループ解析装置3では、まずそのループが並列化可能か否かを解析する。上記例では、図14のループAは並列化可能で、図15のループBは並列化不可とする。
並列化可能なループAに関しては、分割ノード数による演算コストを計算すると同時に、そのために発生する通信コストの計算を行う。演算コストは、前記図9に示したようにループ内の各命令のレイテンシの和で求める。
スーパスカラのように複数の命令が同時に発行できる場合には、そのオーバラップ分も計算に入れる。通信コストは、実際に使用している実行ライブラリ関数の通信レイテンシがループ解析装置に記憶されており、その値を用いて計算する。こうして、並列化された演算コストと通信コストの和が一番小さくなるように並列度を決定する。どう分割しても演算コストの性能向上分よりも通信コストが増大する場合は、並列化を行わない。
こうして、並列化可能であると判断すると、コードコンバータ4に並列化情報および逐次コードが送られ並列化される。
【0022】
データ分割を行わない第1、第2の実施例では、図11(b)のようにループAの逐次コードが並列化コードヘとコンバートされ、図11(c)のようにPE1とPE2、それぞれに対応するノード上のメモリにデータが割り付けられる。データ分割を行う第3の実施例では、図12(b)のように逐次コードは並列化コードヘとコンバートされる。また、データコンバータ10に並列化情報およびデータが送られ、データ分割が行われる。データ分割を行うと、前記図16で説明したように使用メモリ量が大幅に削滅されるが、図12(c)に示すようにアドレス変換を行うとともに、図12(b)に示すように、インデックス変換を行う必要がある。
並列化されたコードは、各ノードのサブメモリ5に転送されて書き込まれる。また、第3の実施例では、分割されたデータもサブメモリ5に転送されて書き込まれる。
【0023】
この後、前記図2に示したように、再び並列化されたループをアクセスすると、ループ検出装置6がそのことを検出し、メモリコントロ一ラ7に通知する。メモリコントローラ7は、各ノードのセレクタ8に信号を送り、いままでのメインメモリ2上の逐次プログラムから、サブメモリ5上の並列プログラムを実行するように処理を切り替える。
並列化されたコードの実行が終了すると、メモリコントローラ7に信号か送られる。メモリコントローラ7からはセレクタ8に信号が送られ、メインメモリ2の逐次プログラムを実行するように切り変わる。こうして処理は続行され、プログラムの処理は終了する。
さらに、第2、第3の実施例の場合は、実行終了後にサブメモリ5の並列プログラムを、ライトバック装置9が、各ノードのメインメモリ2ヘと書き戻す。こうして2度目以降の実行では、メモリコントローラ7が逐次プログラムと並列プログラムを切り替えることなくプログラムを実行することができる。
【0024】
次に、前記第4〜第6の実施例について説明する。第4〜第6の実施例は、前記第1〜第3の実施例の変形例であり、前記第1〜3の実施例のようにループ検出装置を設けずに、コンパイラにより並列化部分に命令を付加し、これにより並列化部分を検出するようにしたものである。
図5は本発明の第4の実施例の構成を示す図である。
図5において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
1ノード内に、プロセッサ1と、メインメモリ2と、コンパイラによって付加された命令によってプロセッサ1が検出したループに対して通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8を有する。
【0025】
図6は、本実施例の動作を説明するタイムチャートであり、同図を参照しながら本実施例のシステムの動作について説明する。なお、図6は、図5に示したサブメモリ5、メインメモリ2、PE(プロセッサ1)、ループ解析装置3およびコードコンバータ4(後述する第6の実施例の場合はデータコンバータも含む)、セレクタ8の各動作タイミングを示している。
次に、本実施例の動作について前記図6を参照しながら説明する。
前記と同様、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
コンパイラは、ループの最初と最後に命令(例えば図6に示す”imply”)を付加しており、プロセッサ1はその命令を検知するとループ解析装置3に信号を送る(図6A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにM(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図9、図10で説明したのと同じであり、図9、図10の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/N
通信コスト=τbcast _1node _to_Nnode *N
なお、ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【0026】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ5に並列化されたコードが転送され書き込まれる(図6B)。この際に、メインメモリの逐次プログラムに付加されている、ループを示す命令(図6の”imply”)を並列化されたことを示す命令(図6の”par”)に書き換え、並列化されたことを記録する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされる。上記の並列化されたコードを再びアクセスしたことは、プロセッサ1によつて検出され、ここからメモリコントローラ7に信号が送られる。
メモリコントローラ7が信号を受け取ると、メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリ5をアクセスさせる(図6C)。並列コードの実行が終了したら、メモリコントローラ7が再びセレクタ8に信号を送り、メインメモリ2にある通常の逐次コードにアクセスを切り替えて処理を続行する(図6D)。
以下同様に、並列化されたコードが再びアクセスされたら、サブメモリ5をアクセスし、並列コードの実行が終了したら、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図6E,F)。
【0027】
図7は本発明の第5の実施例の構成を示す図であり、本実施例は前記第4の実施例のものにサブメモリの内容をメインメモリに書き戻すライトバック装置を付加したものである。
図7において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
第4の実施例と同様、1ノード内に、プロセッサ1と、メインメモリ2と、コンパイラによって付加された命令によってプロセッサが検出したループに対して、通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8を有する。さらに、本実施例では、上記に加え、1回目のプログラムの実行を終了したら、サブメモリの内容をメインメモリに書き戻すライトバック装置9が設けられている。
【0028】
次に、本実施例の動作について前記図6を参照しながら説明する。
前記と同様、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
コンパイラは、前記したようにループに対して命令をつけており、プロセッサ1はその命令を検知するとループ解析装置3に信号を送る(図6A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにM(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図9、図10で説明したのと同じであり、図9、図10の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/N
通信コスト=τbcast _1node _to_Nnode *N
なお、ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【0029】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成され、その後、各ノードのサブメモリ5に並列化されたコードが転送され書き込まれる(図6B)。この際に、前記したようにメインメモリの逐次プログラムに付加されている、ループを示す命令を並列化されたことを示す命令に書き換え、並列化されたことを記録する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされると、前記したように、プロセッサ1によって並列化されたコードを再びアクセスしたことが検出され、ここからメモリコントローラ7に信号が送られる。
メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリ5をアクセスさせる(図6C)。
並列コードの実行が終了したら、メモリコントローラ7が再びセレクタ8に信号を送り、メインメモリ2にある通常の逐次コードにアクセスを切り替えて処理を続行する(図6D)。
以下同様に、並列化されたコードが再びアクセスされたら、サブメモリ5をアクセスし、並列コードの実行が終了したら、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図6E,F)。
プログラムの実行が終了すると、ライトバック装置9が各ノードのサブメモリからメインメモリヘとコードを書き換える。この作業により、前記第2の実施例で説明したように、2回目以降の逐次プログラムの実行では、並列化されたプログラムが実行されることになる。
【0030】
図8は本発明の第6の実施例の構成を示す図であり、本実施例は前記第5の実施例のものに、配列データの分割とデータの書き込みを行うデータコンバータを設けたものである。
図8において、システム内には、N個のノード1〜nを含み、それらはネットワークで結合されている。
第5の実施例と同様、1ノード内に、プロセッサ1と、メインメモリ2と、コンパイラによって付加された命令によってプロセッサが検出したループに対して、通信コストおよび演算コストの計算を行うループ解析装置3と、ループの並列化およびコードの書き込みを行うコードコンバータ4と、並列化したコードを書き込むサブメモリ5と、並列化したループを再び実行する際に、サブメモリ5ヘとアクセスを切り替えるメモリコントローラ7と、セレクタ8と、1回目のプログラムの実行を終了したら、サブメモリ5の内容をメインメモリ2に書き戻すライトバック装置9を有する。さらに、本実施例では、上記に加え、データの分割および書き込みを行うデータコンバータ10が設けられている。
【0031】
次に、本実施例の動作について前記図6を参照しながら説明する。
前記と同様、逐次プログラムは、ノード1でまず実行されるとする。この逐次プログラムは、ノード1のメインメモリ2から読み出され、プロセッサ1において実行される。
コンパイラは、前記したようにループに対して命令を付加しており、プロセッサ1はその命令を検知するとループ解析装置3に信号を送る(図6A)。ループ解析装置3では、ループ内での並列化可能なコードを調査する。
この際に、前記したようにM(M≦N)ノードでの処理を分割した時の演算コストと、その際に生じるデータ通信コストを計算し、並列化による高速化が可能か、また高速化が可能ならば最適な分割ノード数を計算する。
演算コストの計算、通信コストの計算は、前記図9、図10で説明したのと同じであり、図9、図10の場合、演算コスト、通信コストを以下の式で計算する。
演算コスト=(2*τadd +2*τload+τfmul+τstore )*n/N
通信コスト=τbcast _1node _to_Nnode *N
なお、ブロードキャストだけでなく、1対1通信であるMPI_SENDとMPI_RECVなどに関するデータもループ解析装置に保持されており、前記したように、適宜そのレイテンシを呼び出して通信オーバヘッドを計算する。
【0032】
並列化による高速化が可能ならば、ループ解析装置3からコードコンバータ4に信号が送られ、並列化コードが生成される。また、データコンバータ10に信号が送られ、各ノードのサブメモリ5ヘデータを分割するためのアドレス計算およびインデックス計算を行う。
その後、各ノードのサブメモリ5に並列化されたコードが転送され書き込まれる(図6B)。この際に、前記したようにメインメモリの逐次プログラムに付加されている、ループを示す命令を並列化されたことを示す命令に書き換え、並列化されたことを記録する。
続いて、プログラムの実行が進み、上記並列化されたコードが再びアクセスされると、前記したように、プロセッサ1によって並列化されたコードを再びアクセスしたことが検出され、ここからメモリコントローラ7に信号が送られる。
メモリコントローラ7は各ノードのサブメモリ5からコードを読み出すように各ノードのプロセッサ1に通知する。また、セレクタ8に信号を送ってサブメモリ5をアクセスさせる(図6C)。
並列コードの実行が終了したら、メモリコントローラ7が再びセレクタ8に信号を送り、メインメモリ2にある通常の逐次コードにアクセスを切り替えて処理を続行する(図6D)。
以下同様に、並列化されたコードが再びアクセスされたら、サブメモリ5をアクセスし、並列コードの実行が終了したら、メインメモリにある通常の逐次コードにアクセスを切り替えて処理を続行する(図6E,F)。
プログラムの実行が終了すると、ライトバック装置9が各ノードのサブメモリからメインメモリヘとコードを書き換える。この作業により、前記第2の実施例で説明したように、2回目以降の逐次プログラムの実行では、並列化されたプログラムが実行されることになる。
【0033】
次に、上記第4〜第6の実施例を具体例により説明する。
システム内にN個のノードが含まれ、それらはネットワークで結合されている。プログラムはノード1のメインメモリ2に格納されており、プロセッサ1で実行される。
実行されるプログラムは、図14(a)および図15(a)に示したようなループAおよびループBを含んでいるとする。
すなわち、ループAのようにループ内での依存関係がないものと、ループBのようにループ内に依存関係があるものである。ループAの場合は、処理を分割してもループ内に依存関係がないので、図14(e)に示したように、並列に処理を行った後にデータ通信で結果を集めればよい。
しかしながら、ループBではループ内に依存関係があるために単純な分割を行っても全く効果がない。すなわち図15(b)のように、PE1とPE2で処理を分割し、インデックス1〜(n/2)をPE1で、インデックス(n/2+1)〜nをPE2で演算するとすると、PE1での演算を終えない限りPE2での演算が行えないために並列化効果がでない。
【0034】
第4〜第6の実施例では、図13(a)に示すように、コンパイラにより、プログラムのループ開始部にループの開始であることを示す命令(例えば”imply loop_st” )が付加され、終了部にはループの終了であることを示す命令(例えば”imply loop_end”)が付加されている。
プログラムの実行中にループが実行されると、そのことはプロセッサ1が検出し、ループ解析装置3に通知する。
ループ解析装置3は、前記と同様、並列化効果が得られるか否かを検出し、並列度を決定する。上記の例では、ループAは並列化可能で、ループBは並列化不可である。
並列化可能なループAに関しては、分割ノード数による演算コストを計算すると同時に、そのために発生する通信コストの計算を行う。演算コストは、図9に示したようにループ内の各命令のレイテンシの和で求める。
前記したようにスーパスカラのように複数の命令が同時に発行できる場合には、そのオーバラップ分も計算に入れる。通信コストは、実際に使用している実行ライブラリ関数の通信レイテンシがループ解析装置に記憶されており、その値を用いて計算する。
こうして、並列化された演算コストと通信コストの和が一番小さくなるように並列度を決定する。どう分割しても演算コストの性能向上分よりも通信コストが増大する場合は、並列化を行わない。
こうして、並列化可能であると判断すると、コードコンバータ4に並列化情報および逐次コードが送られ、並列化される。
【0035】
データ分割を行わない第4、第5の実施例では、図11(b)のようにループAの逐次コードが並列化コードヘとコンバートされ、図11(c)のようにPE1とPE2、それぞれに対応するノード上のメモリにデータが割り付けられる。また、データ分割を行う第6の実施例では図12(b)のように逐次コードは並列化コードヘとコンバートされる。第6の実施例の場合は、データコンバータ10に並列化情報およびデータが送られ、データ分割が行われる。データ分割を行うと、前記図16に示したように使用メモリ量が大幅に削減されるが、図12(c)に示すようにアドレス変換を行うとともに、図12(b)に示すように、インデックス変換を行う必要がある。
並列化されたコードは、各ノードのサブメモリ5に転送されて書き込まれる。また第6の実施例では、分割されたデータもサブメモリ5に転送されて書き込まれる。
また、ループの並列化が行われた際には、ループ解析装置3が、逐次コードのループを示す命令を図13(b)のように書き換えて、ループの並列化が行われたことを示す。すなわち、前記したようにループを示す命令(図13(a)の”imply”)を並列化されたことを示す命令(図13(b)の”par”)に書き換える。
【0036】
この後、前記図6に示したように、再び並列化されたループをアクセスすると、プロセッサ1は図13(b)の命令を検知し、メモリコントローラ7に通知する。メモリコントローラ7は、各ノードのセレクタ8に信号を送り、いままでのメインメモリ上の逐次プログラムからサブメモリ5上の並列プログラムを実行するよ引こ処理を切り替える。
並列化されたコードの実行が終了すると、メモリコントローラ7に信号が送られる。メモリコントローラ7からはセレクタ8に信号が送られ、メインメモリ2の逐次プログラムを実行するように切り変わる。こうして処理は続行され、プログラムの処理は終了する。
さらに、第5、第6の実施例の場合は、前記したように、実行終了後にサブメモリ5の並列プログラムを、ライトバック装置9が、各ノードのメインメモリ2へと書き戻す。こうして2度目以降の逐次プログラムの実行では、メモリコントローラ7が逐次プログラムと並列プログラムを切り替えることなく逐次プログラムが実行できる。
【0037】
【発明の効果】
以上説明したように、本発明においては、以下の効果を得ることができる。
(1)逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見して、並列実行が可能なループを並列化し、並列化したコードを生成して、記憶領域に書き込み、2回目以降のアクセスに対しては、上記記憶領域に書き込まれた並列化したコードをアクセスするように構成したので、演算コストと通信コストを考慮しつつ、自動的に逐次プログラムを並列化し、並列化処理を行うことができる。
(2)上記において、並列化したコードを生成するとともに、データ分割を行うことにより、使用メモリ量を大幅に削減することができる。
(3)プログラムの実行を終了したら上記記憶領域に記憶された並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換えることにより、2度目以降の逐次プログラムの実行では、メインメモリにアクセスするだけで、並列プログラムを実行することが可能となる。
【図面の簡単な説明】
【図1】本発明の第1の実施例の構成を示す図である。
【図2】第1、第2、第3の実施例の動作を説明するタイムチャートである。
【図3】本発明の第2の実施例の構成を示す図である。
【図4】本発明の第3の実施例の構成を示す図である。
【図5】本発明の第4の実施例の構成を示す図である。
【図6】第4、第5、第6の実施例の動作を説明するタイムチャートである。
【図7】本発明の第5の実施例の構成を示す図である。
【図8】本発明の第6の実施例の構成を示す図である。
【図9】ループ解析装置の内部で行われる演算コストの計算を説明する図である。
【図10】ループ解析装置の内部で行われる通信コストの計算を説明する図である。
【図11】第1,2,4,5の実施例において、逐次コードを並列コードにコンバートした時のイメージを示す図である。
【図12】第3,6の実施例において、逐次コードを並列コードにコンバートした時のイメージを示す図である。
【図13】コンパイラが付加したループであることを示す命令およびループ解析装置が付加したループの並列化が行われたことを示す命令の例を示す図である。
【図14】ループ内に依存関係のないループ(ループA)の例を示す図である。
【図15】ループ内に依存関係のあるループ(ループB)の例を示す図である。
【図16】データ分割を説明する図である。
【符号の説明】
1 プロセッサ
2 メインメモリ
3 ループ解析装置
4 コードコンバータ
5 サブメモリ
6 ループ検出装置
7 メモリコントローラ
8 セレクタ
9 ライトバック装置
10 データコンバータ
Claims (5)
- 自動並列化処理を行う分散マルチプロセッサシステムにおける情報処理装置であって、
ある逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見する手段と、
上記並列実行が可能なループを並列化し、並列化したコードを生成する手段と、
並列化したコードを書き込む記憶領域と、
上記のループを再びアクセスしたことを検出する手段と、
2回目以降のアクセスに対しては、上記並列化したコードをアクセスする手段とを備えたことを特徴とする情報処理装置。 - 自動並列化処理を行う分散マルチプロセッサシステムにおける情報処理装置であって、
逐次プログラムの実行中に、コンパイラが付加したループの存在を示す命令を検出するプロセッサと、
上記命令が付加されたループの通信コストと演算コストを計算し、並列実行が可能なループを発見する手段と、
上記並列実行が可能なループを並列化し、並列化したコードを生成する手段と、
並列化したコードを書き込む記憶領域と、
2回目以降のアクセスに対しては上記並列化したコードをアクセスする手段とを備えたことを特徴とする情報処理装置。 - 自動並列化処理を行う分散マルチプロセッサシステムにおける情報処理装置であって、
逐次プログラムの実行中に、通信コストと演算コストを計算し、並列実行が可能なループを発見する手段と、
上記並列実行が可能なループを並列化し、並列化したコードを生成する手段と、
データ分割を行う手段と、
並列化したコードおよび分割したデータを書き込む記憶領域と、
上記のループを再びアクセスしたことを検出する手段と、
2回目以降のアクセスに対しては、上記並列化したコードおよび分割したデータをアクセスする手段とを備えた、ことを特徴とする情報処理装置。 - 自動並列化処理を行う分散マルチプロセッサシステムにおける情報処理装置であって、
逐次プログラムの実行中に、コンパイラが付加したループの存在を示す命令を検出するプロセッサと、
上記命令が付加されたループの通信コストと演算コストを計算し、並列実行が可能なループを発見する手段と、
上記並列実行が可能なループを並列化し、並列化したコードを生成する手段と、
データ分割を行う手段と、
並列化したコードおよび分割したデータを書き込む記憶領域と、
2回目以降のアクセスに対しては並列化したコードおよび分割したデータをアクセスする手段とを備えた、ことを特徴とする情報処理装置。 - プログラムの実行を終了したら上記記憶領域に書き込まれた並列化コード、または、並列化したコードおよび分割したデータを、上記逐次プログラムが記憶されたメインメモリの内容と置き換える手段を備えたことを特徴とする請求項1,2,3または請求項4の情報処理装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003106370A JP2004310651A (ja) | 2003-04-10 | 2003-04-10 | コスト解析に基づいてループの自動並列化処理を行う情報処理装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003106370A JP2004310651A (ja) | 2003-04-10 | 2003-04-10 | コスト解析に基づいてループの自動並列化処理を行う情報処理装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2004310651A true JP2004310651A (ja) | 2004-11-04 |
Family
ID=33468579
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2003106370A Withdrawn JP2004310651A (ja) | 2003-04-10 | 2003-04-10 | コスト解析に基づいてループの自動並列化処理を行う情報処理装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2004310651A (ja) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009151645A (ja) * | 2007-12-21 | 2009-07-09 | Mitsubishi Electric Corp | 並列処理装置及びプログラム並列化装置 |
US8495090B2 (en) | 2007-02-14 | 2013-07-23 | Fujitsu Limited | Storage medium containing parallel process control program, parallel processs control system, and parallel process control method |
US8677051B2 (en) | 2010-04-19 | 2014-03-18 | Kabushiki Kaisha Toshiba | Memory system, control method thereof, and information processing apparatus |
JP2015207318A (ja) * | 2008-12-01 | 2015-11-19 | ケーピーアイティ テクノロジーズ リミテッド | 逐次コンピュータプログラムコードを並列処理する方法及びシステム |
US9934012B2 (en) | 2015-03-31 | 2018-04-03 | Denso Corporation | Parallelization compiling method, parallelization compiler, and vehicular device |
-
2003
- 2003-04-10 JP JP2003106370A patent/JP2004310651A/ja not_active Withdrawn
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8495090B2 (en) | 2007-02-14 | 2013-07-23 | Fujitsu Limited | Storage medium containing parallel process control program, parallel processs control system, and parallel process control method |
JP2009151645A (ja) * | 2007-12-21 | 2009-07-09 | Mitsubishi Electric Corp | 並列処理装置及びプログラム並列化装置 |
JP2015207318A (ja) * | 2008-12-01 | 2015-11-19 | ケーピーアイティ テクノロジーズ リミテッド | 逐次コンピュータプログラムコードを並列処理する方法及びシステム |
US8677051B2 (en) | 2010-04-19 | 2014-03-18 | Kabushiki Kaisha Toshiba | Memory system, control method thereof, and information processing apparatus |
US9934012B2 (en) | 2015-03-31 | 2018-04-03 | Denso Corporation | Parallelization compiling method, parallelization compiler, and vehicular device |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Chen et al. | GFlink: An in-memory computing architecture on heterogeneous CPU-GPU clusters for big data | |
Tian et al. | Supporting speculative parallelization in the presence of dynamic data structures | |
US6598130B2 (en) | Technique for referencing distributed shared memory locally rather than remotely | |
Kishimoto et al. | Scalable, parallel best-first search for optimal sequential planning | |
Sinha et al. | Parallel simulation of mixed-abstraction SystemC models on GPUs and multicore CPUs | |
US8990551B2 (en) | Analysis and visualization of cluster resource utilization | |
JP2009104422A (ja) | マルチプロセッサ向け最適コード生成方法及びコンパイル装置 | |
Farhad et al. | Orchestration by approximation: mapping stream programs onto multicore architectures | |
Choi et al. | Stream compilation for real-time embedded multicore systems | |
JP2014216021A (ja) | バッチスレッド処理のためのプロセッサ、コード生成装置及びバッチスレッド処理方法 | |
Samadi et al. | Paragon: Collaborative speculative loop execution on gpu and cpu | |
Nozal et al. | Load balancing in a heterogeneous world: CPU-Xeon Phi co-execution of data-parallel kernels | |
KR20140046897A (ko) | 멀티코어 프로세서에서 수행되는 프로그램의 컴파일 방법, 멀티코어 프로세서의 태스크 매핑 방법 및 태스크 스케줄링 방법 | |
Anantpur et al. | Runtime dependence computation and execution of loops on heterogeneous systems | |
KR102062208B1 (ko) | 멀티스레드 프로그램 코드의 변환 장치 및 방법 | |
Jin et al. | Towards dataflow-based graph accelerator | |
Zhou et al. | Collectives in hybrid MPI+ MPI code: Design, practice and performance | |
Guo et al. | Compiler-assisted overlapping of communication and computation in MPI applications | |
JP2004310651A (ja) | コスト解析に基づいてループの自動並列化処理を行う情報処理装置 | |
Carter et al. | Performance and Programming Experience on the Tera MTA. | |
Yan et al. | Homp: Automated distribution of parallel loops and data in highly parallel accelerator-based systems | |
Eisenbeis et al. | Compiler techniques for optimizing memory and register usage on the Cray 2 | |
Maghazeh et al. | Cache-aware kernel tiling: An approach for system-level performance optimization of GPU-based applications | |
Rogers et al. | Supporting SPMD execution for dynamic data structures | |
Ranganath et al. | Lc-memento: A memory model for accelerated architectures |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A300 | Withdrawal of application because of no request for examination |
Free format text: JAPANESE INTERMEDIATE CODE: A300 Effective date: 20060704 |