(57)【特許請求の範囲】
【請求項１】
並列計算機システムにおいてストライドデータ転送機構により不連続データを転送するデータ転送方法であって、
情報処理装置が、ソースプログラムのコンパイル時に、該ソースプログラムの記述にしたがって転送対象データを指定するパラメータを生成し、該パラメータと演算式を用いて前記ストライドデータ転送機構の転送パターンを生成し、該転送パターンと該ストライドデータ転送機構を用いたデータ転送を指示するストライド転送コードを生成し、
前記並列計算機システムが、生成されたストライド転送コードの実行時に、前記転送パターンを前記ストライドデータ転送機構に与えて、前記転送対象データの転送を行わせることを特徴とするデータ転送方法。
【請求項２】
並列計算機システムにおいてストライドデータ転送機構により不連続データを転送するデータ転送方法であって、
情報処理装置が、ソースプログラムのコンパイル時に、前記ストライドデータ転送機構の転送パターンの生成を指示する転送パターン生成コードを生成し、
前記並列計算機システムが、生成された転送パターン生成コードの実行時に、転送対象データを指定するパラメータと演算式を用いて前記転送パターンを生成し、該転送パターンを前記ストライドデータ転送機構に与えて、該転送対象データの転送を行わせることを特徴とするデータ転送方法。
【請求項３】
前記情報処理装置は、前記ソースプログラムのコンパイル時に、前記演算式を含むプログラムを生成することを特徴とする請求項２記載のデータ転送方法。
【請求項４】
前記情報処理装置は、分散メモリ型並列計算機システムのための並列処理言語により前記不連続データの転送処理を一括データ転送として記述した、ソースプログラムをコンパイルすることを特徴とする請求項１、２、または３記載のデータ転送方法。
【請求項５】
前記情報処理装置は、インデックスを用いたループにより前記不連続データの転送処理を記述したソースプログラムをコンパイルし、該ループの開始に対応するインデックスと、該ループの終了に対応するインデックスと、該ループにおけるインデックスの間隔のうち少なくとも１つを前記パラメータとして用いることを特徴とする請求項１、２、または３記載のデータ転送方法。
【請求項６】
前記ストライドデータ転送機構は、一定の間隔をおいて規則的に格納されたデータのストライド転送を行うことを特徴とする請求項１、２、または３記載のデータ転送方法。
【請求項７】
前記転送パターンは、前記転送対象データに含まれる転送単位の大きさと、転送単位の数と、最初の転送単位の位置と、２つの転送単位の間隔のうち、少なくも１つを含むことを特徴とする請求項１、２、または３記載のデータ転送方法。
【請求項８】
前記並列計算機システムは、複数のプロセッサと、該複数のプロセッサのそれぞれに対応する複数のメモリを備え、前記転送対象データの最初の転送単位と最後の転送単位とを互いに異なるメモリに格納し、
前記転送パターンの生成時に、前記最初の転送単位を有するメモリに対応するプロセッサの識別子が生成されることを特徴とする請求項１、２、または３記載のデータ転送方法。
【請求項９】
前記並列計算機システムは、複数のプロセッサと、該複数のプロセッサのそれぞれに対応する複数のメモリを備え、前記転送対象データの最初の転送単位と最後の転送単位とを互いに異なるメモリに格納し、
前記転送パターンの生成時に、前記最後の転送単位を有するメモリに対応するプロセッサの識別子が生成されることを特徴とする請求項１、２、または３記載のデータ転送方法。
【請求項１０】
前記並列計算機システムは、複数のプロセッサと、該複数のプロセッサのそれぞれに対応する複数のメモリを備え、前記転送対象データの最初の転送単位と最後の転送単位とを互いに異なるメモリに格納し、
前記転送パターンの生成時に、前記最初の転送単位と最後の転送単位を共に含まないメモリに対応するプロセッサの識別子が生成されることを特徴とする請求項１、２、または３記載のデータ転送方法。
【請求項１１】
前記並列計算機システムは、複数のプロセッサと、該複数のプロセッサのそれぞれに対応する複数のメモリを備え、前記転送対象データを該複数のメモリのうちの１つに格納し、
前記転送パターンの生成時に、前記１つのメモリに対応するプロセッサの識別子が生成されることを特徴とする請求項１、２、または３記載のデータ転送方法。
【請求項１２】
前記並列計算機システムは、複数のプロセッサと、該複数のプロセッサのそれぞれに対応する複数のメモリを備え、前記転送対象データを２つ以上のメモリにサイクリックに分割して格納し、
前記転送パターンは、前記２つ以上のメモリのうちの１つに格納された転送対象データに関する転送パターンであり、該転送パターンの生成時に、該１つのメモリに対応するプロセッサの識別子が生成されることを特徴とする請求項１、２、または３記載のデータ転送方法。
【請求項１３】
ストライドデータ転送機構により不連続データを転送するデータ転送装置であって、
ソースプログラムのコンパイル時に、該ソースプログラムの記述にしたがって転送対象データを指定するパラメータを生成し、該パラメータと演算式を用いて前記ストライドデータ転送機構の転送パターンを生成し、該転送パターンと該ストライドデータ転送機構を用いたデータ転送を指示するストライド転送コードを生成する手段と、
生成されたストライド転送コードの実行時に、前記転送パターンを前記ストライドデータ転送機構に与えて、前記転送対象データの転送を行わせる手段とを有することを特徴とするデータ転送装置。
【請求項１４】
ストライドデータ転送機構により不連続データを転送するデータ転送装置であって、
ソースプログラムのコンパイル時に、前記ストライドデータ転送機構の転送パターンの生成を指示する転送パターン生成コードを生成する手段と、
生成された転送パターン生成コードの実行時に、転送対象データを指定するパラメータと演算式を用いて前記転送パターンを生成し、該転送パターンを前記ストライドデータ転送機構に与えて、該転送対象データの転送を行わせる手段とを有することを特徴とするデータ転送装置。
【請求項１５】
前記転送パターン生成コードを生成する手段は、前記ソースプログラムのコンパイル時に、前記演算式を含むプログラムを生成することを特徴とする請求項１４記載のデータ転送装置。
【請求項１６】
前記転送パターンは、前記転送対象データに含まれる転送単位の大きさと、転送単位の数と、最初の転送単位の位置と、２つの転送単位の間隔のうち、少なくも１つを含むことを特徴とする請求項１３、１４、または１５記載のデータ転送装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は情報処理装置におけるデータ転送に係り、さらに詳しくは、分散メモリ型並列計算機システムにおいて不連続に格納されたデータの転送方法とその装置に関する。
【０００２】
【従来の技術】
近年、計算機の計算性能向上に対する要求は日増しに高くなり、この要求に答えるために複数のプロセッサが並列に処理を行う並列計算機が作られるようになってきた。初期においては複数のプロセッサがメモリを共有する共有メモリ型並列計算機が主流であったが、今日ではより並列性の高いプログラムに対して多くのプロセッサを実装するために、各プロセッサがそれぞれ別のメモリを持つ分散メモリ型並列計算機が作られるようになってきている。
【０００３】
このような分散メモリ型並列計算機では、１種類のデータを格納した変数を複数のプロセッサのメモリに分散して持たせ、それぞれのプロセッサが極力自己のメモリ内に持っているデータに関してのみ計算を行うようプログラミングをして高速化を図っている（プロセッサローカル）。
【０００４】
しかし実際には、一般的なプログラムの場合に全ての演算をプロセッサローカルで計算することはできず、他のプロセッサの持っているデータを必要とすることがある。このとき、必要なデータを持っているプロセッサからそのデータを必要としているプロセッサへの通信が必要だが、この通信に要する時間は本来の計算処理に対するオーバヘッドとなる。
【０００５】
一般に分散メモリ型並列計算機の通信には、１回毎に送信先を指定したり、ネットワークとの接続を指定したりする処理等の立ち上がりオーバヘッドが存在する。このため、通信により転送されるデータの総量が等しければ、その通信回数が少ないほど全体の通信時間を短縮することができる。そこで、従来から１回の通信でより多くのデータを送れるように、メモリ上の連続領域内のデータはまとめて転送し、不連続な幾つかの領域にまたがるデータ（不連続データ）はソフトウェアによりパッキングして転送していた。
【０００６】
【発明が解決しようとする課題】
しかしながら、従来の不連続データ転送方法では、送信側でデータをパッキングしたり、受信側でパッキングされたデータを展開したりする処理のオーバヘッドが必要であり、高速な通信を行うことができないという問題がある。
【０００７】
また、トランスポーズ転送に代表される規則的なパターンで表現されるような不連続データを転送するハードウェアであるストライドデータ転送機構を持っていても、プログラマにより直接その機構を用いた転送処理が記述されなければ使用することはできなかった。
【０００８】
このため、このような規則的なパターンの通信であっても、一般には不規則な不連続データの通信と同様に、送信側でデータのパッキングを行い、受信側でパッキングされたデータを展開するような転送を指示するコードをコンパイラが生成していた。したがって、ストライドデータ転送機構が十分に活用されず、規則的なパターンの通信時間が短縮されていなかった。
【０００９】
本発明は、情報処理装置における不連続データの転送を高速に行うデータ転送方法とその装置を提供することを目的とする。さらに詳しくは、ストライドデータ転送機構を用いるための通信コードをコンパイラが出力することにより高速な通信を行い、分散メモリ型並列計算機システム等のパフォーマンスを向上させることを目的とする。
【００１０】
【課題を解決するための手段】
本発明は、ループなどにより規則的なパターンとして表現される不連続データをストライドデータ転送機構などのハードウェアにより転送する方法とその装置である。
【００１１】
図１は、本発明のデータ転送方法を示す原理図である。
本発明のデータ転送方法においては、まずデータ転送を伴う処理を記述し（ステップＳＴ１）、記述された処理から転送対象データを指定するパラメータを生成し（ステップＳＴ２）、ハードウェアがサポートする転送パターンを求める演算式を生成する（ステップＳＴ３）。
【００１２】
そして、生成されたパラメータと演算式とを用いて転送パターンを生成し、得られた転送パターンをハードウェアに与えて、転送対象データの転送を行わせる（ステップＳＴ４）。
【００１３】
転送対象データを指定するパラメータは、例えばループの開始インデックス、終了インデックス、連続する２つのインデックスの間隔等に対応する値であり、転送パターンは、例えばストライドデータ転送機構がサポートする不連続データの転送単位の大きさ、転送単位の数、最初の転送単位の位置、２つの転送単位の間隔等により指定される。
【００１４】
本発明では、データ転送を伴う処理のコンパイル時にコンパイラが転送パターンを生成するか、またはプログラムの実行時に自動的に転送パターンを生成させるコードを生成する。後者の場合には、そのコードの実行時にライブラリ等が必要な転送パターンを生成する。
本発明の第１のデータ転送方法では、情報処理装置が、ソースプログラムのコンパイル時に、ソースプログラムの記述にしたがって転送対象データを指定するパラメータを生成し、そのパラメータと演算式を用いてストライドデータ転送機構の転送パターンを生成し、その転送パターンとストライドデータ転送機構を用いたデータ転送を指示するストライド転送コードを生成する。そして、並列計算機システムが、生成されたストライド転送コードの実行時に、転送パターンをストライドデータ転送機構に与えて、転送対象データの転送を行わせる。
本発明の第２のデータ転送方法では、情報処理装置が、ソースプログラムのコンパイル時に、ストライドデータ転送機構の転送パターンの生成を指示する転送パターン生成コードを生成する。そして、並列計算機システムが、生成された転送パターン生成コードの実行時に、転送対象データを指定するパラメータと演算式を用いて転送パターンを生成し、その転送パターンをストライドデータ転送機構に与えて、転送対象データの転送を行わせる。
【００１５】
【作用】
コンパイラまたはプログラム実行時のライブラリ等が、転送対象データを指定するパラメータと転送パターンを求める演算式とを自動的に生成するので、個々の転送対象データに応じた転送パターンを計算することができる。
【００１６】
また、転送パターンを自動的に生成して、ストライドデータ転送機構などのハードウェアに与えるので、プログラム実行時にハードウェアによる不連続データの転送が可能になり、ハードウェアの利用率が向上する。
【００１７】
さらに、不連続領域のデータをパッキングした後に展開するという処理が不要になり、高速なデータ転送が行われる。したがって、情報処理装置のパフォーマンスが大きく向上する。
【００１８】
【実施例】
以下図面を参照しながら、本発明の実施例について説明する。
図２は、本発明のデータ転送方法を用いる分散メモリ型並列計算機システムの構成図である。図２において、Ｎ個のプロセッサ１−１、１−２、・・・、１−Ｎはそれぞれに接続されたメモリ２−１、２−２、・・・、２−Ｎを有し、これらのＮ個のメモリはネットワーク３により接続されている。
【００１９】
各メモリ２−１、２−２、・・・、２−Ｎの一部はそれぞれローカルメモリ５−１、５−２、・・・、５−Ｎとして各プロセッサ１−１、１−２、・・・、１−Ｎが用いるローカル変数等を格納する。また、メモリ２−１、２−２、・・・、２−Ｎの残りの領域はグローバルメモリ４としてプロセッサ１−１、１−２、・・・、１−Ｎが共有するグローバル変数等を格納する。
【００２０】
Ｎ個のプロセッサはグローバルメモリ４と自己の持つローカルメモリにアクセスしながら並列に処理を行い、他のプロセッサの有するデータが必要になるとネットワーク３を介して通信を行う。
【００２１】
本実施例では、多次元のデータパターンのうち、各次元についてループインデックスを持ち、お互いに独立なｄｏループによって記述されるものを対象とする。そして、メモリに格納されたこのデータを処理するソースプログラムをコンパイルするとき、またはそのプログラムを実行したときに、配列の各次元について、メモリ上でのループの開始位置を指定するパラメータと、ループの終了位置を指定するパラメータと、転送すべき配列要素の間隔を指定するパラメータと、対象となる配列データの格納パターンにしたがって解析を行い、ストライドデータ転送のための転送パターン（ストライド転送パターン）を生成する。
【００２２】
図３は、本実施例における１次元のデータのストライド転送パターンを示している。本実施例におけるストライドデータ転送では、通信に関わる２つのプロセッサ（ローカルとリモート）のメモリ上で共通の大きさを持つ連続領域を転送単位（斜線部分）とし、この転送単位の大きさをＳｉｚｅとする。また、ローカル、リモートのそれぞれのメモリ上で、１つの転送単位が現れてから次の転送単位が現れるまでの大きさをＳｔｒｉｄｅとし、転送単位の数ｍをＣｏｕｎｔ  とする。さらに、ストライド転送パターンのメモリ上での開始アドレスをＳｔａｒｔ  として、これらの４つのパラメータＳｔａｒｔ  、Ｓｉｚｅ、Ｓｔｒｉｄｅ、Ｃｏｕｎｔ  によりストライド転送パターンを指定する。
【００２３】
複数次元についてデータが規則的に配置された多次元のストライド転送パターンの場合には、その次元の１つ下の次元のストライド転送パターンを、その次元における転送単位として考える。例えば、２次元のストライド転送パターンにおける転送単位は１次元のストライド転送パターンであり、この１次元のストライド転送パターンの数が２次元のストライド転送パターンにおけるＣｏｕｎｔ  となる。
【００２４】
Ｆｏｒｔｒａｎに代表される既存言語における配列変数間のデータ転送のパターンは多くの場合、各次元毎に独立なループインデックスを持ちお互いに独立なｄｏループによって記述され得るため、このパターンはこれらのループにより規則的に表現できる。また、各次元に対応するストライド転送パターンは互いに直交しているため、各次元毎にＳｔａｒｔ  、Ｓｉｚｅ、Ｓｔｒｉｄｅ、Ｃｏｕｎｔ  で示されるストライド転送パターンを求めれば、１次元のストライド転送パターンを任意のｎ次元にまで拡張することもできる。
【００２５】
図４は、  Ｆｏｒｔｒａｎにおけるｄｏループの一例を示している。図４（ａ）のｄｏループは、インデックスｉの１から５までの各値について、２次元の配列変数ａ（１，２＊ｉ）の値を１次元の配列変数ｂ（ｉ＋１）に書き込む処理を表す。もし、配列変数ａ（１，２＊ｉ）とｂ（ｉ＋１）が同じプロセッサのメモリ内になければ、ネットワーク３を介したデータ転送が必要になる。図４（ａ）に記述された処理は、並列処理言語の表記による一括データ転送に相当する。
【００２６】
図４（ｂ）、（ｃ）のｄｏループは、それぞれ配列変数ａ（ｊ，ｋ）、ｂ（ｈ）を有するプロセッサのプログラムにおいて、図４（ａ）のｄｏループを標準化した結果を示している。ループの標準化はコンパイラにより行われる。図４（ｂ）、（ｃ）のインデックスｉＧ  、ｉＬ  はそれぞれ配列変数ａ（ｊ，ｋ）、ｂ（ｈ）のインデックスｋ、ｈに対応しており、インデックスの添字Ｇ  、Ｌ  はそれぞれ図５におけるグローバル変数、ローカル変数に対応している。
【００２７】
図４（ｂ）において、ｉＧ  ＝２，１０，２はｄｏループの開始位置がｉＧ  ＝２、ｄｏループの終了位置がｉＧ  ＝１０、ｄｏループのインデックスの間隔が２であることを表す。また、図４（ｃ）において、ｉＬ  ＝２，６はｄｏループの開始位置がｉＬ  ＝２、ｄｏループの終了位置がｉＬ  ＝６、ｄｏループのインデックスの間隔が１であることを表す。ｄｏループのインデックスの間隔が１であるときは、このパラメータは省略される。
【００２８】
図４（ｂ）のｄｏループの中の四角は、メモリから読み出されたａ（１，ｉＧ  ）の値を送信するために一時格納する記憶域、または直接通信の場合はネットワーク３を表す。図４（ｃ）のｄｏループの中の四角は、受信したａ（１，ｉＧ  ）の値を一時格納する記憶域、または直接通信の場合はネットワーク３を表す。
【００２９】
本実施例では、ストライド転送がグローバル変数とローカル変数の２変数間で行われるものとする。ここで、ローカル変数はプロセッサが有するローカルメモリを指すローカル空間にある変数であり、グローバル変数はグローバルメモリ４を指すグローバル空間にある変数である。グローバル変数ではインデックスを指定するとそのオーナーであるプロセッサとメモリ上の格納アドレスは一意に決定される。この条件の下でグローバル変数について、転送対象となる次元の分割形状に応じたストライド転送パターンを生成する。
【００３０】
図５は、図４の配列変数ａ（ｊ，ｋ）、ｂ（ｈ）の格納構造の一例とそれらの間のストライド転送を示している。図５において、ａ（ｊ，ｋ）（ｊ＝１，１０、ｋ＝１，１０）はグローバル変数としてグローバルメモリ４に格納されており、ｂ（ｈ）（ｈ＝１，１０）はローカル変数としてローカルメモリ５−１〜５−Ｎのいずれかに格納されている。
【００３１】
この場合、変数ａ（ｊ，ｋ）の最初のインデックスｊはメモリ上でデータが連続して格納される方向（１次元方向）のインデックスで、２番目のインデックスｋはこれに直交する方向（２次元方向）のインデックスである。また、変数ｂ（ｈ）のインデックスｈはメモリ上の連続方向を表す。
【００３２】
変数ａ（ｊ，ｋ）から変数ｂ（ｈ）へ転送すべき配列要素は、ｉ＝１、２、３、４、５に対応して斜線で示されたａ（１，２）、ａ（１，４）、ａ（１，６）、ａ（１，８）、ａ（１，１０）の５つである。これらのデータは、それぞれｂ（２）、ｂ（３）、ｂ（４）、ｂ（５）、ｂ（６）に格納される。
【００３３】
したがって、図５の１つの枡目に対応するデータが転送単位となり、そのメモリ上の大きさがＳｉｚｅで、Ｃｏｕｎｔ  は５である。また、グローバル変数におけるＳｔｒｉｄｅは、メモリ上で例えば転送単位ａ（１，２）が現れてから次の転送単位ａ（１，４）が現れるまでの大きさであり、ここではＳｉｚｅの２０倍に相当する。グローバル変数におけるＳｔａｒｔ  は転送単位ａ（１，２）の先頭アドレスである。
【００３４】
一方、ローカル変数におけるＳｔｒｉｄｅは、例えばｂ（２）からｂ（３）までの大きさでＳｉｚｅに一致する。ローカル変数におけるＳｔａｒｔ  はｂ（２）の先頭アドレスである。
【００３５】
次に、グローバル変数の転送対象となる次元がそれぞれ異なるプロセッサに属するメモリにブロック分割されている場合のストライド転送パターンの導出方法を説明する。
【００３６】
図６は、グローバル変数ａ（ｊ，ｋ）がブロック分割されている場合のストライド転送を示している。グローバル変数がブロック分割されているときは、アクセス対象のデータ領域を持つプロセッサは分割境界で切り替わる。
【００３７】
図６において、グローバル変数ａ（ｊ，ｋ）はプロセッサ１−１、１−２、１−３によりインデックスｋの方向（２次元方向）に３つのブロックに分割されている。ｋ＝１〜４の要素はプロセッサ１−１のメモリ２−１に格納され、ｋ＝５〜８の要素はプロセッサ１−２のメモリ２−２に格納され、ｋ＝９、１０の要素はプロセッサ１−３のメモリ２−３に格納されている。そして、ｋ＝４とｋ＝５、ｋ＝８とｋ＝９の間がそれぞれブロックの分割境界となっている。
【００３８】
グローバル変数がブロック分割されているとき、そのローカル変数へのストライド転送パターンのパラメータは、一般に次式により求められる。
【００３９】
【数１】
0003544565.tif 000002
【００４０】
（１）式において、ｅｌｅｍｅｎｔＳｉｚｅ  はグローバル変数とローカル変数の双方におけるデータの格納単位の大きさを表し、これがそのままストライド転送パターンにおけるＳｉｚｅとなる。例えば図６においてはＳｉｚｅ＝１である。
【００４１】
整数ｍ、ｄに対するＬＡＣＫ（ｍ，ｄ）を定義する（２−１）、（２−２）式において、ＭＯＤ（ｍ，ｄ）はｍをｄで割ったときの整数剰余を表す。ＭＯＤ（ｍ，ｄ）＝０のときは（２−１）式によりＬＡＣＫ（ｍ，ｄ）＝０であり、ＭＯＤ（ｍ，ｄ）≠０のときは（２−２）式によりＬＡＣＫ（ｍ，ｄ）＝ｄ−ＭＯＤ（ｍ，ｄ）である。（２−１）、（２−２）式を用いて、ＬＡＣＫＧ  は（２−３）式により定義される。
【００４２】
（２−３）、（２−４）、（２−５）式において、  ｌｏｏｐＳｔａｒｔＧ  はグローバル変数におけるｄｏループの開始位置を表し、ｂｌｏｃｋＳｔａｒｔＧ  は対応するプロセッサに割り当てられたブロックの開始位置を表す。ここで開始位置とは、メモリ上のアドレスに対応する変数のインデックスを意味する。ｌｏｏｐＳｔｒｉｄｅＧ  はグローバル変数におけるｄｏループのインデックスの間隔を表す。
【００４３】
グローバル変数におけるアドレス  Ｓｔａｒｔに対応する開始位置  ＳｔａｒｔＧ  を求めるとき、対応するプロセッサのメモリ内に  ｌｏｏｐＳｔａｒｔＧ  があれば（２−４）式を用い、  ｌｏｏｐＳｔａｒｔＧ  が他のプロセッサのメモリ内にあれば（２−５）式を用いる。
【００４４】
図６においては、図４（ｂ）に示されるように  ｌｏｏｐＳｔａｒｔＧ  ＝２であり、  ｌｏｏｐＳｔａｒｔＧ  はメモリ２−１内にあるので、プロセッサ１−１については（２−４）式により  ＳｔａｒｔＧ  ＝２となる。
【００４５】
また、図４（ｂ）に示されるようにｌｏｏｐＳｔｒｉｄｅＧ  ＝２であり、プロセッサ１−２については、図６からｂｌｏｃｋＳｔａｒｔＧ  ＝５であるので、（２−３）式によりＬＡＣＫＧ  ＝ＬＡＣＫ（５−２，２）＝ＬＡＣＫ（３，２）となる。ここで、ＭＯＤ（３，２）＝１≠０であるから、（２−２）式によりＬＡＣＫ（３，２）＝２−１＝１となる。したがって、プロセッサ１−２については（２−５）式により  ＳｔａｒｔＧ  ＝５＋１＝６となる。
【００４６】
プロセッサ１−２については図６からｂｌｏｃｋＳｔａｒｔＧ  ＝９であるので、同様に（２−５）式により  ＳｔａｒｔＧ  ＝９＋ＬＡＣＫ（９−２，２）＝１０となる。逆に  ＳｔａｒｔＧ  が決まると、対応するプロセッサの識別子も特定される。
【００４７】
（３）式において、  ｂｌｏｃｋｓｉｚｅＧ  は隣の要素までのメモリ上の大きさを表す。グローバル変数におけるＳｔｒｉｄｅを表すＳｔｒｉｄｅＧ  は、ｌｏｏｐＳｔｒｉｄｅＧ  と  ｂｌｏｃｋｓｉｚｅＧ  の積により求められる。ここでは、  ｂｌｏｃｋｓｉｚｅＧ  はメモリ上でａ（１，ｋ）からａ（１０，ｋ）までの要素数１０に等しいので、（３）式によりＳｔｒｉｄｅＧ  ＝２０となる。
【００４８】
（４）式において、ｌｏｏｐＳｔｒｉｄｅＬ  はローカル変数におけるｄｏループのインデックスの間隔を表し、  ｂｌｏｃｋｓｉｚｅＬ  は隣の要素までのメモリ上の大きさを表す。ローカル変数におけるＳｔｒｉｄｅを表すＳｔｒｉｄｅＬ  は、これらの積により求められる。ここでは、図４（ｃ）に示されるようにｌｏｏｐＳｔｒｉｄｅＬ  ＝１であり、図６から明らかなように  ｂｌｏｃｋｓｉｚｅＬ  ＝１であるので、（４）式によりＳｔｒｉｄｅＬ  ＝１となる。
【００４９】
（５−１）式において、  ｌｏｏｐＥｎｄＧ  はグローバル変数におけるｄｏループの終了位置を表し、（５−２）式において、ｂｌｏｃｋＥｎｄＧ  は対応するブロックの終了位置を表す。ここでの終了位置も開始位置と同様に、メモリ上のアドレスに対応する変数のインデックスを意味する。これらの式において、  ＷｉｄｔｈＧ  は対応するプロセッサに割り当てられたグローバル変数の転送データが存在する範囲の要素数を表している。ここでは、図４（ｂ）に示されるように  ｌｏｏｐＥｎｄＧ  ＝１０である。
【００５０】
グローバル変数におけるｄｏループの終了位置が対応するブロック内にあるときは（５−１）式により、終了位置が他のブロック内にあるときは（５−２）式により、  ＷｉｄｔｈＧ  が求められる。
【００５１】
ここでは、プロセッサ１−１については、  ｌｏｏｐＥｎｄＧ  が対応するブロック内にはなく、  ＳｔａｒｔＧ  ＝２、ｂｌｏｃｋＥｎｄＧ  ＝４なので、（５−２）式により  ＷｉｄｔｈＧ  ＝３となる。プロセッサ１−２についても  ｌｏｏｐＥｎｄＧ  がなく、  ＳｔａｒｔＧ  ＝６、ｂｌｏｃｋＥｎｄＧ  ＝８なので、（５−２）式により  ＷｉｄｔｈＧ  ＝３となる。また、プロセッサ１−３については、  ｌｏｏｐＥｎｄＧ  ＝１０が対応するブロック内にあり、  ＳｔａｒｔＧ  ＝１０なので、（５−１）式により  ＷｉｄｔｈＧ  ＝１となる。
【００５２】
ストライド転送パターンにおけるＣｏｕｎｔ  は、（６）式により求められる。ここでは、プロセッサ１−１、１−２については  ＷｉｄｔｈＧ  ＝３、ｌｏｏｐＳｔｒｉｄｅＧ  ＝２であるので、（６）式によりＣｏｕｎｔ  ＝２となる。また、プロセッサ１−３については  ＷｉｄｔｈＧ  ＝１であるから、（６）式によりＣｏｕｎｔ  ＝１となる。
【００５３】
このようにして、プロセッサのメモリにｄｏループの開始位置のみがある場合（プロセッサ１−１）と、終了位置のみがある場合（プロセッサ１−３）と、どちらもない場合（プロセッサ１−２）とについて、ストライド転送パターンを求めることができる。
【００５４】
グローバル変数の転送対象となる次元がブロックに分割されていない場合は、転送対象となる全ての要素が同じプロセッサのメモリにあるので、ｄｏループの開始位置と終了位置の両方が対応するブロック内にあるものとして扱うことができる。
【００５５】
例えば図５のグローバル変数ａ（ｊ，ｋ）がこの場合に相当し、（２−４）式により  ＳｔａｒｔＧ  ＝  ｌｏｏｐＳｔａｒｔＧ  ＝２となり、  ｌｏｏｐＥｎｄＧ  ＝１０なので（５−１）により  ＷｉｄｔｈＧ  ＝９となる。またｌｏｏｐＳｔｒｉｄｅＧ  ＝２なので、（６）式によりＣｏｕｎｔ  ＝５となる。ＳｉｚｅとＳｔｒｉｄｅＧ  は（１）式と（３）式により求められ、それぞれ１と２０になる。
【００５６】
尚、ローカル変数は常に１つのプロセッサのメモリに格納されるので、そのストライド転送パターンの開始位置  ＳｔａｒｔＬ  は、グローバル変数の分割形態に依らずにローカル変数のｄｏループの開始位置に一致する。例えば、図５、図６の場合には  ＳｔａｒｔＬ  ＝２である。
【００５７】
図７は、グローバル変数ａ（ｊ，ｋ）がサイクリック分割されている場合のストライド転送を示している。グローバル変数の転送対象となる次元がサイクリック分割されている場合、隣合う要素はそのオーナーが別プロセッサとなる。
【００５８】
図７においては、グローバル変数ａ（ｊ，ｋ）は３台のプロセッサ１−１、１−２、１−３によりインデックスｋの方向にサイクリックに分割されている。ｋ＝１、４、７、１０の要素はプロセッサ１−１のメモリ２−１に格納され、ｋ＝２、５、８の要素はプロセッサ１−２のメモリ２−２に格納され、ｋ＝３、６、９の要素はプロセッサ１−３のメモリ２−３に格納されている。そして、ｋ＝３とｋ＝４、ｋ＝６とｋ＝７、ｋ＝９とｋ＝１０の間がそれぞれ分割周期の境界となっている。
【００５９】
グローバル変数がサイクリック分割されているとき、そのローカル変数へのストライド転送パターンのパラメータは、一般に次式により求められる。
【００６０】
【数２】
0003544565.tif 000003
【００６１】
（７）〜（１４）式において、（１）〜（６）式で用いたものと同じ記号は（１）〜（６）式と同様の意味を持つ。また、Ｓｉｚｅを求める（７）式は（１）式と同じである。例えば図７の場合は（７）式によりＳｉｚｅ＝１となる。
【００６２】
（８）、（９）式において、  ｐｒｏｃＮｕｍＧ  はグローバル変数をサイクリック分割しているプロセッサの数を表し、ＧＣＤ（  ｐｒｏｃＮｕｍＧ  ，  ｌｏｏｐＳｔｒｉｄｅＧ  ）  は  ｐｒｏｃＮｕｍＧ  とｌｏｏｐＳｔｒｉｄｅＧ  の最大公約数、ＬＣＭ（  ｐｒｏｃＮｕｍＧ  ，  ｌｏｏｐＳｔｒｉｄｅＧ  ）  は  ｐｒｏｃＮｕｍＧ  とｌｏｏｐＳｔｒｉｄｅＧ  の最小公倍数を表す。ＧＣＤＣＳ、ＬＣＭＣＳは（８）、（９）式により定義される。
【００６３】
図７の場合は、  ｐｒｏｃＮｕｍＧ  ＝３、ｌｏｏｐＳｔｒｉｄｅＧ  ＝２であるので、（８）、（９）式によりＧＣＤＣＳ＝１、ＬＣＭＣＳ＝６となる。
（１０）式のｎは整数を表し、ｏｆｆｓｅｔは｛  ｝内の不等式を満たすｎの値を表す。
【００６４】
ここでは、（１０）式の｛  ｝内の不等式は０＜ｎ＜２となるので、ｏｆｆｓｅｔ＝０、１、２となる。このとき、  ｌｏｏｐＳｔａｒｔＧ  ＝２なので、（１１）式によりｏｆｆｓｅｔの各値に対応して  ＳｔａｒｔＧ  ＝２、４、６となる。これらの  ＳｔａｒｔＧ  の値は、それぞれメモリ２−２、２−１、２−３に格納されているストライド転送パターンの開始位置に対応している。したがって、  ＳｔａｒｔＧ  が決まれば、対応するプロセッサの識別子も特定される。
【００６５】
また、ＳｔｒｉｄｅＧ  とＳｔｒｉｄｅＬ  は（１２）式と（１３）式により求められ、それぞれ２０と３になる。（１２）式の右辺のＬＣＭＣＳ／  ｐｒｏｃＮｕｍＧ  は、実際のプロセッサのメモリ上でのｄｏループのインデックスの間隔を表している。ＳｔｒｉｄｅＧ  の値は図６のブロック分割の場合と同じであるが、ＳｔｒｉｄｅＬ  の値は異なる。これは、例えばメモリ２−２において、転送単位ａ（１，２）の位置から次の転送単位ａ（１，８）の位置までの大きさが２０であるが、変数ｂ（ｈ）においては、これらの転送単位に対応する格納位置がｂ（２）とｂ（５）であって、必ずしも隣接していないことに対応している。
【００６６】
（１４）式においては、右辺の商をＣｏｕｎｔ  の値とする。これは、（  ｌｏｏｐＥｎｄＧ  −  ＳｔａｒｔＧ  ＋１）／ＬＣＭＣＳが割り切れない時に、その商に１を加算した値をＣｏｕｎｔ  とすることに相当する。図７の場合には、  ｌｏｏｐＥｎｄＧ  ＝１０、  ＳｔａｒｔＧ  ＝２、４、６、ＬＣＭＣＳ＝６なので、（１４）式により  ＳｔａｒｔＧ  の各値に対応してＣｏｕｎｔ  ＝２、２、１となる。これらのＣｏｕｎｔ  の値は、それぞれメモリ２−２、２−１、２−３に格納されている転送単位の数に対応している。
【００６７】
図８は、９台のプロセッサによりサイクリック分割されたグローバル変数を示している。図８において、グローバル変数ａ（ｊ，ｋ）（ｊ＝１，１０、ｋ＝１，２０）は、プロセッサ１−１〜１−９のメモリ２−１〜２−９にサイクリックに分割されて格納されており、ｋ＝９とｋ＝１０、ｋ＝１８とｋ＝１９の間がそれぞれ分割周期の境界となっている。ストライド転送パターンの転送単位は斜線で示された５つであり、メモリ２−２、２−５、２−８に分かれて格納されている。
【００６８】
この場合、（７）式によりＳｉｚｅ＝１であり、例えば転送単位ａ（１，２）とａ（１，５）の間隔に対応してｌｏｏｐＳｔｒｉｄｅＧ  ＝３である。また、  ｐｒｏｃＮｕｍＧ  ＝９なので、（８）、（９）式によりＧＣＤＣＳ＝３、ＬＣＭＣＳ＝９となる。
【００６９】
このとき、（１０）式よりｏｆｆｓｅｔ＝０、１、２となり、  ｌｏｏｐＳｔａｒｔＧ  ＝２なので、（１１）式によりｏｆｆｓｅｔの各値に対応して  ＳｔａｒｔＧ  ＝２、５、８となる。これらの  ＳｔａｒｔＧ  の値は、それぞれメモリ２−２、２−５、２−８に格納されているストライド転送パターンの開始位置に対応している。他のメモリには転送単位が格納されていない。
【００７０】
そして、  ｂｌｏｃｋｓｉｚｅＧ  ＝１０、  ｌｏｏｐＥｎｄＧ  ＝１４なので、（１２）によりＳｔｒｉｄｅＧ  ＝１０となり、（１４）式により  ＳｔａｒｔＧ  の各値に対応してＣｏｕｎｔ  ＝２、２、１となる。これらのＣｏｕｎｔ  の値は、それぞれメモリ２−２、２−５、２−８に格納されている転送単位の数に対応している。
【００７１】
次に、図９から図１２までを参照しながら、本実施例の並列計算機システムが実行するプログラムのコンパイルを行うコンパイラの処理と、実行時のプログラムおよびライブラリの処理について説明する。図９および図１０は本実施例におけるコンパイラの処理を示すフローチャートであり、図１１は実行時のプログラムによる処理を示すフローチャートであり、図１２は実行時のライブラリの処理を示すフローチャートである。
【００７２】
本実施例において、ストライド転送パターンをコンパイラが生成する場合はコンパイラは図９の処理を行い、ストライド転送パターンを実行時ライブラリが生成する場合はコンパイラは図１０の処理を行う。
【００７３】
図９において処理が開始されると、コンパイラはまずソースプログラムの中の対象とするループの標準化を行って、プログラマにより記述されたループを変数の格納構造に対応したインデックスにより表されるループに変換する（ステップＳ１）。このとき、例えば図４（ａ）のようなｄｏループは、図４（ｂ）、（ｃ）のようなｄｏループに変換される。
【００７４】
次に、ストライド転送パターンを計算するために必要なパラメータの値が静的に決定可能かどうかを判定する（ステップＳ２）。ここで、必要なパラメータには、標準化されたループに関するループパラメータと変数の格納パターンに関する格納パターンパラメータとが含まれる。
【００７５】
ループパラメータは、標準化されたループの開始位置（  ｌｏｏｐＳｔａｒｔＧ  、  ｌｏｏｐＳｔａｒｔＬ  ）、終了位置（  ｌｏｏｐＥｎｄＧ  、  ｌｏｏｐＥｎｄＬ  ）、およびインデックスの間隔（ｌｏｏｐＳｔｒｉｄｅＧ  、ｌｏｏｐＳｔｒｉｄｅＬ  ）等を指し、格納パターンパラメータは、（１）〜（１４）式におけるｅｌｅｍｅｎｔＳｉｚｅ  、ｂｌｏｃｋＳｔａｒｔＧ  、ｂｌｏｃｋＥｎｄＧ  、  ｂｌｏｃｋｓｉｚｅＧ  、ｂｌｏｃｋｓｉｚｅＬ  、ｂｌｏｃｋＷｉｄｔｈＧ  、  ｐｒｏｃＮｕｍＧ  等を指す。この格納パターンパラメータは、複数のプロセッサによるグローバル変数の分割形態に関する情報を含んでいる。
【００７６】
これらのパラメータの値がコンパイル時において決定され、プログラム実行時に変化しない場合は（ステップＳ２、ＹＥＳ）、ソースプログラムの記述にしたがって各パラメータを生成する（ステップＳ３）。そして、グローバル変数の分割形態に応じて（１）〜（１４）式により、生成されたパラメータの値からストライド転送パターンを計算して出力する（ステップＳ４）。このとき同時に、対応するプロセッサの識別子も出力する。
【００７７】
次に、プログラム実行時にストライドデータ転送機構を用いたデータ転送を行う通信コードであるストライド転送コードを出力して（ステップＳ５）、処理を終了する。
【００７８】
ストライド転送パターンを計算するために必要なパラメータの値がコンパイル時において決定されないとき、あるいはプログラム実行時に動的に変化する場合は（ステップＳ２、ＮＯ）、（１）〜（１４）に示したストライド転送パターンの一般的な演算式を出力する（ステップＳ６）。そして、プログラム実行時にストライド転送パターンを生成するコードである転送パターン生成コードを出力して（ステップＳ７）、処理を終了する。
【００７９】
一方、図２の並列計算機システムによるプログラム実行時にストライド転送コードが現れると、データ転送に関与するプロセッサはコンパイラの出力したストライド転送パターンをストライドデータ転送機構に与える。これにより、ストライドデータ転送機構がデータ転送を行う。
【００８０】
また、プログラム実行時に転送パターン生成コードが現れると、プログラムは図１１に示す処理を行う。図１１において、まず必要なパラメータを生成し（ステップＳ２１）、生成したパラメータを引数としてライブラリを呼び出す（ステップＳ２２）。
【００８１】
プログラムから呼び出されたライブラリは図１２に示す処理を行う。図１２において、まず与えられたパラメータとコンパイラの出力したストライド転送パターン演算式を用いてストライド転送パターンを計算する（ステップＳ３１）。このとき同時に、対応するプロセッサの識別子も決定する。そして、得られたストライド転送パターンをストライドデータ転送機構に与える（ステップＳ３２）。これにより、ストライドデータ転送機構がデータ転送を行う。
【００８２】
コンパイラがストライド転送パターンの生成を行わない場合は、図１０の処理を行う。図１０において処理が開始されると、コンパイラはまず図９のステップＳ１と同様のループの標準化を行い（ステップＳ１１）、標準化されたループのループパラメータを出力する（ステップＳ１２）。そして、ストライド転送パターンを生成する転送パターン生成コードを出力して（ステップＳ１３）、処理を終了する。
【００８３】
一方、転送パターン生成コードが現れると、実行時のプログラムは図１１のフローにしたがって、まず格納パターンパラメータを生成する（ステップＳ２１）。次に、生成した格納パターンパラメータとコンパイラの出力したループパラメータとを引数としてライブラリを呼び出す（ステップＳ２２）。
【００８４】
呼び出されたライブラリは図１２のフローにしたがって、与えられたパラメータと（１）〜（１４）式のストライド転送パターン演算式を用いてストライド転送パターンを計算する（ステップＳ３１）。
【００８５】
この場合、ライブラリが必要なストライド転送パターン演算式を生成してもよく、また、あらかじめストライド転送パターン演算式をライブラリに組み込んでおいてもよい。また、このとき同時に、対応するプロセッサの識別子も決定する。次に、得られたストライド転送パターンをストライドデータ転送機構に与える（ステップＳ３２）。これにより、ストライドデータ転送機構がデータ転送を行う。
【００８６】
【発明の効果】
本発明によれば、コンパイラまたは実行時のライブラリが必要に応じて個々のストライド転送パターンを生成するので、規則的なパターンとして表現される不連続領域のデータを転送するときにストライドデータ転送機構を利用することができる。したがって、不連続領域のデータをパッキングした後に展開するという処理を行うことなく、通信回数を大幅に減少させることが可能となる。
【００８７】
これにより、従来プログラマが指定しなければ利用されなかったストライドデータ転送機構の利用率が著しく向上し、高速な通信が実現される。ひいては分散メモリ型並列計算機システム等の情報処理装置のパフォーマンス向上に大きく寄与する。
【図面の簡単な説明】
【図１】本発明の原理図である。
【図２】一実施例における並列計算機システムの構成図である。
【図３】実施例におけるストライド転送パターンを示す図である。
【図４】実施例におけるｄｏループの一例を示す図である。
【図５】実施例におけるグローバル変数のストライド転送を示す図である。
【図６】実施例におけるブロック分割されたグローバル変数のストライド転送を示す図である。
【図７】実施例におけるサイクリック分割されたグローバル変数のストライド転送を示す図である。
【図８】実施例における９台のプロセッサによりサイクリック分割されたグローバル変数のストライド転送を示す図である。
【図９】実施例におけるコンパイラによる処理のフローチャート（その１）である。
【図１０】実施例におけるコンパイラによる処理のフローチャート（その２）である。
【図１１】実施例におけるプログラムによる処理のフローチャートである。
【図１２】実施例におけるライブラリによる処理のフローチャートである。
【符号の説明】
１−１、２、・・・、Ｎ  プロセッサ
２−１、２、・・・、Ｎ  メモリ
３  ネットワーク
４  グローバルメモリ
５−１、２、・・・、Ｎ  ローカルメモリ
【図１】
0003544565.tif 000004
【図２】
0003544565.tif 000005
【図３】
0003544565.tif 000006
【図４】
0003544565.tif 000007
【図５】
0003544565.tif 000008
【図６】
0003544565.tif 000009
【図７】
0003544565.tif 000010
【図８】
0003544565.tif 000011
【図９】
0003544565.tif 000012
【図１０】
0003544565.tif 000013
【図１１】
0003544565.tif 000014
【図１２】
0003544565.tif 000015