(57)【特許請求の範囲】
【請求項１】
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置において、
所定の単位に区画された第１の記憶領域に、前記情報処理装置に割り当てられたローカルデータを記憶する記憶部と、
前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出する検出部と、
前記第１の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する送信部と
を有する情報処理装置。
【請求項２】
前記格納領域情報は、前記情報処理装置に割り当てられた前記対象ローカルデータを特定する情報と、前記他の情報処理装置に割り当てられた前記対象ローカルデータを特定する情報を含み、
前記検出部は、前記格納領域情報に基づいて、前記第２の記憶領域の前記連続区画のうち、該連続区画に書き込まれる対象ローカルデータが格納された前記第１の記憶領域の区画が連続する複数の連続区画を検出する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記送信部は、前記記憶部から、前記第２の記憶領域の前記連続区画の区画数だけ、前記第１の記憶領域に格納されたローカルデータを取り出して、所定のバッファ領域に格納し、該バッファ領域に格納したローカルデータを、所定の単位で、前記他の情報処理装置へ送信する
ことを特徴とする請求項１または２に記載の情報処理装置。
【請求項４】
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置において、
所定の単位に区画された第１の記憶領域に、前記情報処理装置にローカルデータ領域を割り当てられた記憶部と、
前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出する検出部と、
前記第２の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求する要求部と
前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第１の記憶領域に格納する受信部と、
を備えることを特徴とする情報処理装置。
【請求項５】
前記格納領域情報は、前記情報処理装置に割り当てられた前記対象ローカルデータを特定する情報と、前記他の情報処理装置に割り当てられた前記対象ローカルデータを特定する情報を含み、
前記検出部は、前記格納領域情報に基づいて、前記第２の記憶領域の前記連続区画のうち、該連続区画からデータが読み出されて格納される前記第１の記憶領域の区画が連続する複数の連続区画を検出する
ことを特徴とする請求項４に記載の情報処理装置。
【請求項６】
前記受信部は、前記ローカルデータを受信して所定のバッファ領域に格納し、該バッファ領域から、検出した前記第２の記憶領域の前記連続区画の区画数だけ取り出して前記第１の記憶領域に格納する
ことを特徴とする請求項４または５に記載の情報処理装置。
【請求項７】
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置は、
前記情報処理装置が備える記憶部において所定の単位に区画された第１の記憶領域に、前記情報処理装置に割り当てられたローカルデータを記憶し、
前記情報処理装置に割り当てられたローカルデータのうち、前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出し、
前記第１の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する
ことを特徴とする通信方法。
【請求項８】
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置は、
前記情報処理装置が備える記憶部において所定の単位に区画された第１の記憶領域に、前記ローカルデータのための領域を割り当て、
前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出し、
前記第２の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求し、
前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第１の記憶領域に格納する
ことを特徴とする通信方法。
【請求項９】
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置に、
前記情報処理装置が備える記憶部において所定の単位に区画された第１の記憶領域に、前記情報処理装置に割り当てられたローカルデータを記憶し、
前記情報処理装置に割り当てられたローカルデータのうち、前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出し、
前記第１の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する
処理を実行させることを特徴とする通信プログラム。
【請求項１０】
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置に、
前記情報処理装置が備える記憶部において所定の単位に区画された第１の記憶領域に、前記ローカルデータのための領域を割り当て、
前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出し、
前記第２の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求し、
前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第１の記憶領域に格納する
処理を実行させることを特徴とする通信プログラム。
【請求項１１】
複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている情報処理システムであって、
第１情報処理装置と第２情報処理装置を備え、
前記第１情報処理装置は、
所定の単位に区画された第１の記憶領域に、前記第１情報処理装置に割り当てられたローカルデータを記憶する記憶部と、
前記第１情報処理装置から前記第２情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記第２情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出する検出部と、
前記第１の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第２情報処理装置に送信する送信部と、を有し、
前記第２情報処理装置は、前記第１情報処理装置から前記連続区画の区画数のローカルデータを受信して、前記第２の記憶領域に格納する
ことを特徴とする情報処理システム。
【請求項１２】
複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている情報処理システムであって、
第１情報処理装置と第２情報処理装置を備え、
前記第１情報処理装置は、
所定の単位に区画された第１の記憶領域に、前記第１情報処理装置にローカルデータ領域を割り当てられた記憶部と、
前記第１情報処理装置に対する第２情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記第２情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出する検出部と、
前記第２の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第１情報処理装置に送信することを、前記第２情報処理装置に要求する要求部と
前記第２情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第１の記憶領域に格納する受信部と、を有し、
前記第２情報処理装置は、前記第１情報処理装置からの前記要求に応じて、前記第２の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第１情報処理装置に送信する
ことを特徴とする情報処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、通信方法、通信プログラム、及び、情報処理システムに関する。
【背景技術】
【０００２】
High Performance Fortran（ＨＰＦ）やUnified Parallel C（ＵＰＣ）などのグローバルビューを持つ並列プログラミング言語では、データは仮想的なグローバル空間上にある。プログラマはノード番号を意識しないでグローバルなデータのやりとりを記述する。また、ストレージのRedundant Arrays of Inexpensive Disks（ＲＡＩＤ）技術では、実際には複数のハードディスクに跨って分割配置されているデータを、仮想的な１つの連続データとしてユーザに見せている。以下の説明では、このようなデータをグローバルデータと呼び、グローバルデータである仮想的な多次元矩形に名前を付けたものをグローバル配列と呼ぶ。ノードへのグローバルデータのマッピングは、コンパイラなどのミドルウェアによって行われる。
【０００３】
グローバルビューのプログラミング言語における通信は、グローバルデータの参照（読み出し）と定義（書き込み）である。具体的には、式中でのグローバル配列の参照、グローバル配列への代入、グローバルデータに関わる入出力文、グローバルデータを引数とする手続き呼出し、通信を明示する構文や通信ライブラリの呼出しなどがある。また、ノード間に分散配置されたファイルを１つのデータとして扱うときには、これもグローバルデータの参照または定義であると言える。グローバルビューのプログラミング言語における通信は、以下のＦｏｒｔｒａｎのFORALL構文で表現される、グローバルデータ間の代入の形で表現できる場合がある。
【０００４】
forall ( j[1] = 0 : N[1]-1, ..., j[D] = 0 : N[D]-1 )
B( k’[1], ..., k’[V] ) = A( k[1], ..., k[U] )
【０００５】
ここで、AとBは、それぞれ任意の次元数UおよびVをもち任意の次元で分散されたグローバル配列である。右辺式A( k[1], ..., k[U] )は参照され送信されるデータ、左辺式B( k’[1], ..., k’[V] )は受信され更新されるデータである。FORALL文のインデックスj = (j[1], ..., j[D]) を通信データのインデックスと呼ぶ。添字式k[u]とk’[v]は、それぞれk[u] = fu( j ), k’[v]= gv( j )と表記できるjの関数である（u = 1, ..., U; v = 1, ..., V）。これらは実際には、スカラ、または、Ｆｏｒｔｒａｎの添字三つ組k1 : k2 : k3でも表現できる単一インデックスのアフィン関数 fu(j) = k1 + k3 * j であることが多い。jの張るD次元空間 [ N[1], ..., N[D] ] を通信データ配列と呼ぶ。ただしFORALL文におけるインデックスj[1], ..., j[D]の出現順序は意味をもたないので、通信データ配列の次元の順序は通信が高速になるように任意に選択することができる。
【０００６】
ノード間の通信は、ネットワークのスループット（througuput, バイト/秒）が高いほど高速であり、遅延時間（latency, 秒）が小さいほど高速である。ここでいう遅延時間は、通信の立ち上がりと完了待ちに要するソフトウェアとハードウェアの時間であり、基本的にデータ量には無関係な値である。１パケットで通信するデータ量をn（バイト）とすると、１回の通信に要する時間は、
T(n) = Latency + n / Throughput  [秒]    （式１）
と表すことができる。（式１）に示すように、一度に通信するデータ量nを大きくするほど、通信時間に占める遅延時間の影響を相対的に小さくすることができる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平９−３４８５５公報
【特許文献２】特開２００５−２８５０４２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
通信が配列要素（区画）の１要素ずつに対して生成される場合には、一度に通信されるデータ量が少ないため、全配列要素を通信する場合、遅延時間の総和が非常に大きくなる。
【０００９】
１つの側面では、本発明は、グローバルデータの通信の効率化を図ることを目的とする。
【課題を解決するための手段】
【００１０】
一態様の情報処理装置は、複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置である。情報処理装置は、記憶部、取得部、検出部、及び送信部を含む。記憶部は、所定の単位に区画された第１の記憶領域に、情報処理装置に割り当てられたローカルデータを記憶する。取得部は、情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得する。検出部は、格納領域情報に基づき、他の情報処理装置が備える他の記憶部において所定の単位に区画された第２の記憶領域のうち、対象ローカルデータを書き込む連続する複数の連続区画を検出する。格納領域情報は、グローバルデータにおいて対象ローカルデータが対応するデータを特定する情報である。送信部は、第１の記憶領域に格納されたローカルデータを、連続区画の区画数だけ取り出して他の情報処理装置に送信する。
【００１１】
また、一態様の情報処理装置は、複数の情報処理装置のうち、複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置である。情報処理装置は、記憶部、取得部、検出部、要求部、及び受信部を含む。記憶部は、所定の単位に区画された第１の記憶領域に、情報処理装置にローカルデータ領域を割り当てられる。取得部は、情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得する。検出部は、格納領域情報に基づき、他の情報処理装置が備える他の記憶部において所定の単位に区画された第２の記憶領域のうち、対象ローカルデータを読み出す連続する複数の連続区画を検出する。格納領域情報は、グローバルデータにおいて対象ローカルデータが対応するデータを特定する情報である。要求部は、第２の記憶領域に格納されたローカルデータを、連続区画の区画数だけ取り出して情報処理装置に送信することを、他の情報処理装置に要求する。受信部は、他の情報処理装置から、要求に応じて送信された連続区画の区画数のローカルデータを受信して第１の記憶領域に格納する。
【発明の効果】
【００１２】
一態様によれば、グローバルデータの通信の効率化を図ることができる。
【図面の簡単な説明】
【００１３】
【図１】グローバルデータの各ノードへのマッピングを説明するための図である。
【図２】２次元のグローバル配列Aを大きさ４の１次元のノード配列Pに分散配置する例を示す。
【図３】１次元の分散の種類の例を示す。
【図４】分散の種類毎の関数の一例を示す。
【図５】関数gtol2の一例を示す。
【図６】関数ltog2の一例を示す。
【図７】関数gtog2の一例を示す。
【図８Ａ】関数gtol3の一例（その１）を示す。
【図８Ｂ】関数gtol3の一例（その２）を示す。
【図９】関数ltog3の一例を示す。
【図１０Ａ】関数gtog3の一例（その１）を示す。
【図１０Ｂ】関数gtog3の一例（その２）を示す。
【図１１】２次元の通信データ [N1, N2]と対応するグローバルインデックスの例を示す。
【図１２】データの送受信方法を説明するための図である。
【図１３】仮想グローバル配列間の代入とノード間の多対多通信の関係の一例を示す。
【図１４】比較例におけるPut手順１の一例を示す。
【図１５】比較例におけるGet手順１の一例を示す。
【図１６】比較例におけるバッファなし両側通信の送信ノード通信手順１の一例を示す。
【図１７】比較例におけるバッファなし両側通信の受信ノード通信手順１の一例を示す。
【図１８】比較例におけるバッファあり両側通信の送信ノード通信手順２の一例を示す。
【図１９】比較例におけるバッファあり両側通信の受信ノード通信手順２の一例を示す。
【図２０】実施形態の送信処理に係る情報処理装置の構成の一例を示す。
【図２１】実施形態の送信処理に係る情報処理装置の動作の一例を示す。
【図２２】実施形態の受信処理に係る情報処理装置の構成の一例を示す。
【図２３】実施形態の受信処理に係る情報処理装置の動作の一例を示す。
【図２４】実施形態に係る通信システムの構成の一例を示す。
【図２５】実施形態に係るバッファなしPut通信の処理を図解したフローチャートの一例を示す。
【図２６】連続データput処理の詳細の一例を示す。
【図２７】通信情報テーブルの構成の一例（その１）を示す
【図２８】通信情報テーブルの構成の一例（その２）を示す
【図２９】通信情報テーブルの構成の一例（その３）を示す
【図３０】通信情報テーブルの構成の一例（その４）を示す。
【図３１】状態１プログラムの解析のアルゴリズムの一例（その１）を示す。
【図３２】状態１プログラムの解析のアルゴリズムの一例（その２）を示す。
【図３３】状態１プログラムの解析のアルゴリズムの一例（その３）を示す。
【図３４】連続データ単位検出手順のアルゴリズムの一例を示す。
【図３５】連続データ単位put手順のアルゴリズムの一例を示す。
【図３６】連続データ単位put手順の処理を図解したフローチャートの一例を示す。
【図３７】連続‐連続データ単位検出手順のアルゴリズムの一例（その１）を示す。
【図３８】連続‐連続データ単位検出手順のアルゴリズムの一例（その２）を示す。
【図３９】Jcr-listを得る処理の様子を示す図を示す。
【図４０】連続-連続データ単位put手順のアルゴリズムの一例を示す。
【図４１】実施形態に係るバッファありPut通信の処理を図解したフローチャートの一例を示す。
【図４２】矩形データput処理の一例を示す。
【図４３】矩形データ単位検出手順のアルゴリズムの一例を示す。
【図４４】矩形データ単位put手順のアルゴリズムの一例を示す。
【図４５】矩形データ単位put手順の処理を図解したフローチャートの一例を示す。
【図４６】矩形‐連続データ単位検出手順のアルゴリズムの一例（その１）を示す。
【図４７】矩形‐連続データ単位検出手順のアルゴリズムの一例（その２）を示す。
【図４８】矩形-連続データ単位put手順の処理を図解したフローチャートの一例を示す。
【図４９】矩形データ単位pack手順のアルゴリズムの一例を示す。
【図５０】実施形態に係るバッファなしGet通信の処理を図解したフローチャートの一例を示す。
【図５１】連続データget処理の詳細の一例を示す。
【図５２】連続データ単位get手順のアルゴリズムの一例を示す。
【図５３】連続データ単位get手順の処理を図解したフローチャートの一例を示す。
【図５４】連続-連続データ単位get手順のアルゴリズムの一例を示す。
【図５５】実施形態に係るバッファありGet通信の処理を図解したフローチャートの一例を示す。
【図５６】矩形データget処理の詳細の一例を示す。
【図５７】矩形データ単位get手順のアルゴリズムの一例を示す。
【図５８】矩形データ単位get手順の処理を図解したフローチャートの一例を示す。
【図５９】矩形-連続データ単位get手順の処理を図解したフローチャートの一例を示す。
【図６０】矩形データ単位unpack手順のアルゴリズムの一例を示す。
【図６１】実施形態に係るバッファあり両側通信の処理を図解したフローチャートの一例を示す。
【図６２】送信処理の詳細の一例を示す。
【図６３】受信処理の詳細の一例を示す。
【図６４】矩形性優先pivoting手順のアルゴリズムの一例を示す。
【図６５】共通矩形データ単位検出手順のアルゴリズムの一例を示す。
【図６６】共通矩形データ単位送信処理の内容を図解したフローチャートの一例を示す。
【図６７】送信バッファ準備手順のアルゴリズムの一例を示す。
【図６８】共通矩形データ単位pack手順のアルゴリズムの一例を示す。
【図６９】共通矩形データ単位send手順のアルゴリズムの一例を示す。
【図７０】共通矩形データ単位受信処理の内容を図解したフローチャートの一例を示す。
【図７１】共通矩形データ単位recv手順のアルゴリズムの一例を示す。
【図７２】共通矩形データ単位unpack手順のアルゴリズムの一例を示す。
【図７３】XcalableMPプログラムのgmove構文で表現されている通信の一例を示す。
【図７４】状態１プログラムの解析で得られた通信情報テーブルの内容を示す。
【図７５】状態１プログラムの解析により得られたノード(0,1)における通信情報テーブルの内容と、通信データとローカルデータの関係を示す図である。
【図７６】連続データ単位検出手順の実施の様子を示す図である。
【図７７】ループ１において、最初の反復で呼び出される連続データ単位put手順の処理の一例（その１）を示す。
【図７８】ループ１において、最初の反復で呼び出される連続データ単位put手順の処理の一例（その２）を示す。
【図７９】ループ１において、２回目の反復で呼び出される連続データ単位put手順の処理の一例を示す。
【図８０】ループ１において、１１回目の反復で呼び出される連続データ単位put手順の処理の一例を示す。
【図８１】一次側ノード(0,1)から二次側ノード(0,0,2)または(0,0,3)へputされた結果を示す図である。
【図８２】実施形態に係るノードのハードウェア構成の一例を示す。
【発明を実施するための形態】
【００１４】
グローバルデータは、複数のノードにマッピングされる。図１は、グローバルデータの各ノードへのマッピングを説明するための図である。図１において、プログラム中に記述されるグローバル配列A、Bは、ノードを意識しない仮想的なグローバル名前空間中に存在し、それらのデータ要素は多次元のグローバルインデックスによって特定される。コンパイラはプログラマの指示に従って、グローバル配列A、Bに対応するローカル配列a、bを複数のノードに定義し、各ノードにおけるグローバルインデックスとローカルインデックスのマッピング（対応付け）を決める。これをデータの分散（distribution）と呼ぶ。AとBの分散先は、一部または全部が同じノードであってもよいし、別々のノードであってもよい。最後にコンパイラは、変数a、bに対応するメモリの割付けを行う。このときのローカルインデックスとアドレスのマッピングは、コンパイラの実装に依存する。同じ変数のベースアドレスはノード間で異なっていてもよい。ただし、実施形態においては、１次元目のローカルインデックスが連続する場合、連続するローカルインデックスに対応するアドレスも連続するものとする。
【００１５】
なお、実施形態における「アドレス」は、通信機構から見たアドレスであり、ノードのCentral Processing Unit（ＣＰＵ）から見た仮想メモリのアドレスとも物理メモリのアドレスとも異なる場合がある。システムによっては、同じデータでも別々のノードから観測したときのアドレスは異なるかもしれない。
【００１６】
データの分散について、さらに詳しく説明する。M次元のグローバル配列の実体は、1以上のノードにM次元ローカル配列として分割して割付けられる。割り付け先となるノードは、仮想的な配列（以下、ノード配列と記す）を形成する。図２は、２次元のグローバル配列Aを大きさ４の１次元のノード配列Pに分散配置する例を示す。図２において、グローバル配列Aの２次元目が４つのブロックに分割され、ノード配列Pの各々の要素で示される各ノードに配置されている。グローバル配列Aの１次元目は分散されないので、各ノードのローカル配列aの１次元目はグローバル配列と同じ長さをもつ。グローバル配列Aの２次元目は４つのブロックに分割されているので、各ノードのローカル配列aの２次元目の長さは、8又は6となっている。このように各次元の長さは、分割の方法に応じた長さとなる。
【００１７】
図２においては、２次元目が４つのブロックに分散されている。分散にはいくつかの種類があるが、次に分散の種類について説明する。図３は、１次元の分散の種類の例を示す。図３に示すように、１次元の分散の種類には、ブロック、サイクリック、ブロック・サイクリック、不均等ブロック、及び不規則分散の種類がある。
【００１８】
図３（Ａ）は、ブロック分散の一例を示す。ブロック分散においては、インデックスが連続する複数の要素を１つのブロックとしてまとめて、各ノードに割り付けられる。ブロックの数はノード配列の長さと等しくなる。各ブロックの長さ（要素数）は、グローバル配列における分割対象の次元の長さを、ノード配列の長さで割った値となる。このため、各ノードには均等の長さのブロックが割り付けられる。ただし、図３（Ａ）のように、分割する次元の長さが、ブロックの数で割り切れない場合は、例えば最後のブロックの長さは、他のブロックの長さより小さな値となる。
【００１９】
図３（Ｂ）は、サイクリック分割の一例を示す。サイクリック分割においては、分割する次元の各要素は、ノード配列の各ノードに対して、例えばインデックスの小さい順に順番に割り付けられる。グローバル配列の要素がノード配列の最後のノードに割り付けられると、最後のノードに割り付けられた要素の次の要素は、ノード配列の最初のノードに割り付けられる。
【００２０】
図３（Ｃ）は、ブロック・サイクリック分割の一例を示す。ブロック・サイクリック分割においては、複数のグローバル配列の要素を含むブロック毎に、サイクリックにノード配列のノードに割り付けられる。
【００２１】
図３（Ｄ）は、不均等ブロック分割の一例を示す。不均等ブロック分割においては、各ノードに割り付けられるブロックの長さが、ノード毎に異なる。
【００２２】
図３（Ｅ）は、不規則な分割の一例を示す。不規則な分割においては、分割は不規則に行われる。
【００２３】
以下の説明では、グローバル配列の添字をグローバルインデックスと記し、ローカル配列の添字をローカルインデックスと記す。また、ノード配列の添字をノードインデックスと記す。
【００２４】
HPFなどのプログラミング言語では、分散の種類ごとにグローバルインデックスとノードインデックスの対応付けが定義されている。図４は、分散の種類毎の関数の一例を示す。図４において、「gtop(k)」列は、グローバルインデックスとノードインデックスの対応付けを示す関数の一例を示す。
【００２５】
図４において、Pはノード配列の着目する次元の寸法である。Nは、グローバル配列の着目する次元の寸法である。ここで着目する次元とは分散を行う対象の次元である。分散対象の次元は、例えば図２のように分散が行われる場合、２次元目となる。
【００２６】
ブロック分散においては、wは、ブロック幅（ブロックの長さ）である。wは、利用者が指定してもよいし、w＝ceil(N／P)としてもよい。例えば図２の場合は、w＝ceil(N／P)＝ceil(30／4)＝8となる。このとき、例えばk＝20の要素は、ブロック分散のノードインデックスは、floor(k／w)であるので、floor(20／8)＝2となり、ノードインデックスが2のノード（P（2））に配置されることが算出される。
【００２７】
不均等ブロック分散においては、W（p），0≦p＜Pは、ノードpにおけるブロック幅であり、利用者が指定する。B（p），0≦p≦Pは、ノードpにおけるグローバルインデックスの下限値であり、以下のようになる。
【００２８】
B(p) = sum{W(q) | 0≦q＜p}  for p < P
B(p) = N                     for p = P
【００２９】
不規則分散においては、Mは、マッピング配列と呼ばれ、利用者が指定する。M（k）はkに対応するノードを示す。GTOL（k），0≦k＜NおよびLTOG（i，p），0≦p＜Pはテーブルであり、Mから導出される。
【００３０】
尚、実施形態では、正規化を仮定しているので、すべての変数配列とテンプレート配列とノード配列の宣言形状は0を下限としている。なお、この正規化は必須ではなく、その後の処理で扱う変換式を簡単にするための工夫である。もし正規化を行わないなら、図４に現れる式はパラメタが増えるためより複雑なものになる。
【００３１】
グローバルインデックスとローカルインデックスのマッピング（対応付け）の一例を、図４の「gtol(k, p)」、「ltog(i, p)」の列に示す。尚、図４に示すマッピングは一例であり、グローバルインデックスとローカルインデックスのマッピング（対応付け）は、実装に依存する。
【００３２】
図４を用いると、例えば図２で示したデータの分散では、グローバル配列Aの要素A(ix, iy)を参照するには、ノードP(gtop(iy))にあるローカル配列要素a(ix, gtol(iy, P(gtop(iy)))を参照すればよい。逆に、ノードP(kk)に置かれたローカル配列要素a(ii, jj)は、グローバル配列要素A(ii, ltog(jj, kk))の実体である。
【００３３】
コンパイラや実行時ライブラリは、これらの変換を使うことでローカル配列を利用者から隠蔽し、グローバル配列によるプログラミングを可能にしている。コンパイラや実行時ライブラリによって、ローカルインデックスはメモリアドレスに変換され、ノードインデックスはノードを特定するためのIPアドレスなどに変換される。
【００３４】
グローバルインデックスの区間とローカルインデックスの区間の相互変換の定義の一例について説明する。
【００３５】
図５は、グローバルインデックスの区間 k1 : k2からローカルインデックスの区間i1 : i2へ変換する関数gtol2の一例を示す。すなわちgtol2は、「(i1,i2) = gtol2(k1,k2,p)」のように表現できる。図５のgtol2を実行することにより、グローバルインデックスの連続区間k1:k2 = k1, k1+1, k1+2, ..., k2に対応するローカルインデックスのうち、プロセッサpにおけるローカルインデックスの連続区間i1:i2 = i1, i1+1, i1+2, ..., i2を得られる。i1 > i2のときは、要素がないことを意味する。図５のgtol2においては、グローバルインデックスが連続区間であるとき、各ノードのローカルインデックスもまた連続区間になる。このマッピングでは、図５に見られるように、グローバルインデックスが連続した区間であるとき、対応するローカルインデックスもまた長さ0以上の連続した区間になることが保障されている。尚、他のマッピングでは、必ずしもこれは保証されない。
【００３６】
図６は、ローカルインデックスの区間i1 : i2からグローバルインデックスの区間 k1 : k2への変換を行う関数ltog2の一例を示す。すなわちltog2は、「(k1,k2,k3) = ltog2(i1,i2,p)」のように表現できる。図６のltog2を実行することにより、プロセッサpのローカルインデックスの連続区間i1:i2に対応する、グローバルインデックスの三つ組k1:k2:k3を得られる。ローカルインデックスが連続区間であるとき、block分散、不均等分散、非分散ではグローバルインデックスは連続区間になり、cyclic分散では、グローバルインデックスは三つ組になる。block-cyclic分散と不規則分散では、グローバルインデックスは三つ組になることが保障されない。
【００３７】
図７は、グローバルインデックスの連続区間k1:k2に対応する、プロセッサpに分散されるグローバルインデックスの三つ組kx1:kx2:kx3を取得するための関数gtog2の一例を示す。すなわちgtog2は、「(kx1,kx2, kx3) = gtog2(k1,k2,p)」のように表現できる。図７のgtog2において、入力のグローバルインデックスが連続区間であるとき、block分散、不均等分散、非分散ではグローバルインデックスは連続区間になり、cyclic分散では、グローバルインデックスは三つ組になる。block-cyclic分散と不規則分散では、グローバルインデックスは三つ組になることが保障されない。
【００３８】
図８Ａ、図８Ｂは、グローバルインデックスの三つ組k1:k2:k3に対応する、プロセッサpにおけるローカルインデックスの三つ組i1:i2:i3のi1とi2とi3を取得するための関数gtol3の一例を示す。すなわちgtol3は、「(i1,i2,i3) = gtol3(k1,k2,k3,p)」のように表現できる。図８のgtol3において、グローバルインデックスが三つ組であるとき、block-cyclic分散と不規則分散を除いて、各ノードのローカルインデックスもまた三つ組になる。
【００３９】
図９は、プロセッサpのローカルインデックス三つ組i1:i2:i3に対応する、グローバルインデックス三つ組k1:k2:k3のk1とk2とk3を取得するための関数ltog3の一例を示す。すなわちltog3は、「(k1,k2,k3) = ltog3(i1,i2,i3,p)」のように表現できる。図９のltog3において、ローカルインデックスが三つ組であるとき、block-cyclic分散と不規則分散を除いて、グローバルインデックスもまた三つ組になる。
【００４０】
図１０は、グローバルインデックスの三つ組k1:k2:k3に対応する、プロセッサpに分散されるグローバルインデックスの三つ組kx1:kx2:kx3を取得するための関数gtog3の一例を示す。すなわちgtog3は、「(kx1,kx2, kx3) = gtog3(k1,k2,k3,p)」のように表現できる。図１０のgtog3において、入力のグローバルインデックスが連続区間であるとき、block分散、不均等分散、非分散ではグローバルインデックスは連続区間になり、cyclic分散では、グローバルインデックスは三つ組になる。block-cyclic分散と不規則分散では、グローバルインデックスは三つ組になることが保障されない。
【００４１】
図１１は、２次元の通信データ[N1, N2]と対応するグローバルインデックスの例を示す。図１１において、図１１(b)は形状[N1, N2]のグローバル配列で、この全体配列を通信の対象とする場合を表している。図１１(c)は、図１１(b)よりもサイズが大きなグローバル配列であり、図１１(c)の部分配列が通信の対象となっている。図１１(d)は、グローバル配列において通信対象データの原点がシフトされた例である。図１１(e)は、グローバル配列において通信対象データの原点がシフトされ、さらに通信対象データは、グローバル配列の２次元目方向に一定間隔cのストライドをもつ例である。図１１(f)は、グローバル配列において通信対象データが負のストライドをもつ例である。図１１(g)と図１１(h)は、グローバル配列において親変数の断面を通信データとする例である。
【００４２】
図１１(a)〜(h)のそれぞれに、通信データのインデックスjからグローバルインデックスへのマッピングを示している。尚、例えば(e)に示すように、添字三つ組k1:k2:k3は、通信データのインデックスjからグローバルインデックスへのマッピング「j → k3 * j + k1」があることを意味している。
【００４３】
グローバルデータのノード間通信において、ノードの実行状態は以下の３通りに分けられる。ここで、送信ノード、受信ノードとは、それぞれ、送信されるデータの分散先のノード、受信されるデータの分散先のノードを意味する。
状態１：送信ノードのすべてが実行している状態
状態２：受信ノードのすべてが実行している状態
状態３：送信ノードと受信ノードのすべてが、集団的（collective）な実行をしている状態
【００４４】
状態１は状態３を含み、状態２にもまた状態３を含む。状態３はSingle Program/Multiple Data（ＳＰＭＤ）と呼ばれる実行形態であり、Message Passing Interface（ＭＰＩ）ライブラリの両側通信や集団通信が使用できる状態である。グローバルビュー言語の実行で最もよく現れるのがこの状態３である。これに対して、状態１と状態２は、自ノードと他のノード（複数であってもよい）との間の通信である。状態１における通信が発生する場合は、同時に同じプログラムを実行していないノードのメモリや、プロセッサを持たないノードのディスクへ、送信ノードがデータを書き出す場合である。状態２における通信が発生する場合は、同時に同じプログラムを実行していないノードのメモリやディスクから、受信ノードがデータを読み込む場合である。グローバルビューの並列言語では、これら３通りの状態について、グローバル配列間の代入を実現する。
【００４５】
実際のシステムでは、どんなデータでも一度にまとめて通信できるわけではない。アドレスが連続するデータについては１パケットで一度に通信できる場合がある。しかしながら、不連続なデータに対しては、データは、コンパイラの実行時ライブラリ、ＭＰＩなどの通信ライブラリ、または通信に関わるハードウェアのいずれかの階層で、小さなパケットに分けられて、通信されることが多い。
【００４６】
そこで、不連続なデータを送信するときには、送信ノードは、通信データが連続になるように一度バッファ領域にコピーし（pack）、その後、バッファ領域から一度に外部に送信する場合がある。同様に、不連続データを受信するときには、受信ノードは、通信データを連続データとして外部からバッファ領域に受信し、その後、バッファ領域から不連続データをコピーする（unpack）場合がある。
【００４７】
図１２は、データの送受信方法を説明するための図である。図１２（A）は、連続データの送受信の様子を示す。図１２（B）は、不連続データの送受信の様子を示す。図１２（C）は、通信データが送信ノードにおいて不連続であって、受信ノードにおいて連続である場合の送受信の様子を示す。図１２（D）は、通信データが送信ノードにおいて連続であって、受信ノードにおいて不連続である場合の送受信の様子を示す。
【００４８】
送信側と受信側の両方が連続データであるとあらかじめ分かっている場合には、図１２（A）のように、バッファ等の作業領域へのコピーなしで通信を行うことができる。この通信を、以下の説明では、バッファなし通信（non-buffered communication）と呼ぶ。送信側または受信側が不連続データの場合には、図１２（B）から（D）のように、バッファ領域を仲介した通信を行う。これらの通信を、以下の説明では、バッファあり通信（buffered communication）と呼ぶ。
【００４９】
バッファなし通信は、（式1）におけるLatencyが小さいので通信効率がよい。しかし、送信側と受信側で共通に連続なデータ範囲を選択する必要があるので、データ量nを大きくするのが難しい。近年の並列計算機では、Latencyを通信全体の時間の半分以下とするには、例えばデータ量nを数千バイト以上としなければいけない場合がある。一方、バッファあり通信は、バッファを介して通信することで、一度に通信されるデータ量nを大きくすることができる。しかし、自ノードと通信先の両方のデータ分散に対応したバッファリングやアンバッファリングは複雑であり、これを効率よく行うことは難しい。
【００５０】
上述したように、グローバルビューを持つ並列言語におけるノード間通信のパターンは、多くの場合、Ｆｏｒｔｒａｎの配列代入文の形で表現できる。これに対応して生成される通信は、分散されたデータから分散されたデータへの、多対多のノード間通信となる。
【００５１】
図１３は、仮想グローバル配列間の代入とノード間の多対多通信の関係の一例を示す。
コンパイラは、グローバルインデックスで表現された配列の代入を、複数ノードのローカルインデックス間の代入に変換し、さらに、複数ノードのアドレス間の多対多通信に変換する。図１３においては、グローバル配列Aからグローバル配列Bへの代入は、複数のノードのローカル配列aからローカル配列bへの代入に変換される。そしてさらに、複数のノードのローカル配列aに対応するアドレス空間に格納されたデータが、ローカル配列bに対応するアドレス空間に代入される。
【００５２】
グローバル配列間の代入は、上述した３通りの実行状態に対して実行される。通信には、バッファリングのオーバーヘッドコストを避けるためのバッファなし通信と、バッファリングによって通信の一括化を狙うバッファあり通信がある。
【００５３】
以下の説明では、共通に以下の文字を用いる。すなわち、Dは、通信データの次元数である。N[d]（d = 1, ..., D）は、通信データ配列である。Aは、任意の次元で分散された送信側のグローバル配列である。Uは、Aの次元数である。k[u]（u = 1, ..., U）は、k[u] = fu( j )と表記できるjの関数である。Bは、任意の次元で分散された受信側のグローバル配列である。Vは、Bの次元数である。k’[v]（v = 1, ..., V）は、k’[v]= gv( j ) と表記できるjの関数である。
【００５４】
実施形態では、A、Bに対応するノード配列P、Qは、それぞれA、Bと同じ次元数をもち、A、Bの同じ次元番号の次元がマッピングされるよう正規化されているとする。この正規化はP、Qを単純に次元拡張するだけであり容易である。グローバルインデックスk[u]は、配列Aのパラメタに応じた関数gtopAと関数gtolAによって、Pのu次元目のノードインデックスx[u]と、ローカル配列aのu次元目のローカルインデックスi[u]にそれぞれ変換できる。同様に、グローバルインデックスk’[v]は、配列Bのパラメタに応じた関数gtopBと関数gtolBによって、Qのv番目のノードインデックスy[v]と、ローカル変数bのv番目のローカルインデックスi’[v]に、それぞれ変換できる。
【００５５】
次に、実施形態に対する比較例として、データ通信の一例について説明する。ここでは上述した３つのパターンのプログラムの実行状態のそれぞれにおけるデータ通信について説明する。尚、以下の説明では、Put通信においては、送信側ノードを一次側ノードと記し、受信側ノードを二次側ノードと記す。また、Get通信においては、受信側ノードを一次側ノードと記し、送信側ノードを二次側ノードと記す。
【００５６】
（比較例におけるバッファなしPut通信）
先ず、比較例におけるバッファなしPut通信の一例について説明する。比較例におけるバッファなしPut通信は、実行状態１、すなわち、送信ノードのすべてが実行している状態における通信である。配列A（送信側）の分散先である一次側ノードで通信に関する処理が実行される。配列B（受信側）の分散先である二次側ノードは、受動的な動作を行う。この通信をグローバルデータ間の代入の形式では、以下のように表現される。
【００５７】
forall ( j = 0 : N-1 )
B(g(j)) = A(f(j))
【００５８】
比較例におけるバッファなしPut通信の具体的な動作について説明する。
先ず一次側ノードは、二次側のすべてのノード
y = (y[1], ..., y[V]); y[1] = 0, ..., Y[1] - 1; ...; y[V] = 0, ..., Y[V] - 1
に問い合わせ、それぞれのローカル配列bのベースアドレスを受け取る。
【００５９】
次に、一次側ノードは、すべての通信データのインデックス
j = (j[1], ..., j[D]); j[1] = 0, ..., N[1] - 1; ...; j[D] = 0, ..., N[D] - 1
について、以下の多重ループを実施する（Ｓ２）。この多重ループにおいて、一次側ノードはPut手順１を実行する。
【００６０】
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
（Put手順１）を実施
end for
...
end for
【００６１】
図１４は、比較例におけるPut手順１の一例を示す。図１４においては、一次側ノードは先ず、jに基づいて、一次側のグローバルインデックスkを取得する（Ｓ２−１）。すなわち、一次側ノードは、以下の手順を実行する。
【００６２】
for u = 1 to U
k[u] = fu( j )
end for
【００６３】
次に、一次側ノードは、kに基づいて、一次側のノードインデックスxとローカルインデックスiを取得する（Ｓ２−２）。すなわち、一次側ノードは、以下の手順を実行する。
【００６４】
for u = 1 to U
x[u] = gtopA(k[u]) 
i[u] = gtolA(k[u])
end for
【００６５】
次に、一次側ノードは、xが自ノードか否かを確認する（Ｓ２−３）。そして、xが自ノードのインデックスでないときには、一次側ノードは、Ｓ２−４からＳ２−７は実施せずループにおける次のjに対する処理を実行する。
【００６６】
xが自ノードである場合、一次側ノードは、jに基づいて、二次側のグローバルインデックスk’を取得する（Ｓ２−４）。すなわち、一次側ノードは、以下の手順を実行する。
【００６７】
for v = 1 to V
k’[v] = gv( j )
end for
【００６８】
次に、一次側ノードは、k’に基づいて、二次側のノードインデックスyとローカルインデックスi’を取得する（Ｓ２−５）。すなわち、一次側ノードは、以下の手順を実行する。
【００６９】
for v = 1 to V
y[v] = gtopB(k’[v]) 
i’[v] = gtolB(k’[v])
end for
【００７０】
次に、一次側ノードは、yにおけるbのベースアドレスとi’に基づいて、二次側のアドレスを算出する（Ｓ２−６）。
【００７１】
次に一次側ノードは、自ノードのa( i ) の１要素を、ノードyの二次側のアドレスへputする（Ｓ２−７）。そして、一次側ノードは、次のjに対する処理を実行する。
【００７２】
（比較例におけるバッファなしGet通信）
次に、比較例におけるバッファなしGet通信の一例について説明する。比較例におけるバッファなしGet通信は、実行状態２、すなわち、受信ノードのすべてが実行している状態における通信である。配列A（受信側）の分散先である一次側ノードで通信に関する処理が実行される。配列B（送信側）の分散先である二次側ノードは、受動的な動作のみ行う。この通信をグローバルデータ間の代入の形式では、以下のように表現される。
【００７３】
forall ( j = 0 : N-1 )
A(f(j)) = B(g(j))
【００７４】
比較例におけるバッファなしGet通信の具体的な動作について説明する。
先ず、一次側ノードは、二次側のすべてのノード
y = (y[1], ..., y[V]); y[1] = 0, ..., Y[1] - 1; ...; y[V] = 0, ..., Y[V] - 1 
に問い合わせ、それぞれのローカル配列bのベースアドレスを受け取る。
【００７５】
次に、一次側ノードは、すべての通信データのインデックス
j = (j[1], ..., j[D]); j[1] = 0, ..., N[1] - 1; ...; j[D] = 0, ..., N[D] - 1 
について、以下の多重ループを実施する（Ｓ３）。この多重ループにおいて、一次側ノードはGet手順１を実行する。
【００７６】
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
（Get手順１）を実施
end for
...
end for
【００７７】
図１５は、比較例におけるGet手順１の一例を示す。処理の詳細については、一次側のすべてのノードxは、（Ｓ２−７）においてputの代わりにgetを用いる（Ｓ３−７）以外は、図１４に示した(比較例におけるバッファないPut通信)におけるものと同じである。（Ｓ３−ｎ）（1≦n≦6、nは整数）の各ステップは、それぞれ（Ｓ２−ｎ）に対応する。
【００７８】
比較例における、バッファなしPut通信とバッファなしGet通信の方法では、通信は配列要素の１要素ずつに対して生成されているため、通信遅延時間の総和は非常に大きくなる。比較例における、バッファなしPut通信とバッファなしGet通信のアルゴリズムは、データの連続性が判断できないアルゴリズムであるため、通信の一括化ができない。また、自ノードがもつ分散後の範囲ではなく、グローバルな通信データの要素数だけすべてのノードでループ処理が行われるため、アルゴリズムのスケーラビリティも悪い。
（比較例におけるバッファなし両側通信）
【００７９】
次に、比較例におけるバッファなし両側通信の一例について説明する。比較例におけるバッファなし両側通信は、実行状態３、すなわち、送信ノードと受信ノードのすべてが、集団的な実行をしている状態である。比較例におけるバッファなし両側通信は、配列Aの分散先である送信ノードと、配列Bの分散先である受信ノードの、協調によって実行される。この通信をグローバルデータ間の代入の形式では、以下のように表現される。
【００８０】
forall ( j = 0 : N-1 )
B(g(j)) = A(f(j))
【００８１】
比較例におけるバッファなし両側通信の具体的な動作について説明する。
先ず送信ノードの動作について説明する。送信ノードは、すべての通信データのインデックス
j = (j[1], ..., j[D]) ; j[1] = 0, ..., N[1] - 1;...; j[D] = 0, ..., N[D] - 1
について、以下の多重ループを実施する。この多重ループにおいて、送信ノードは送信ノード通信手順１を実行する。
【００８２】
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
（送信ノード通信手順１）
end for
...
end for
【００８３】
図１６は、比較例におけるバッファなし両側通信の送信ノード通信手順１の一例を示す。図１６において送信ノードは先ず、jに基づいて、送信側のグローバルインデックスkを取得する（Ｓ４−１）。すなわち、送信ノードは、以下の手順を実行する。
【００８４】
for u = 1 to U
k[u] = fu( j )
end for
【００８５】
次に、送信ノードは、kに基づいて、送信側のノードインデックスxとローカルインデックスiを取得する（Ｓ４−２）。すなわち、送信ノードは、以下の手順を実行する。
【００８６】
for u = 1 to U
x[u] = gtopA(k[u]) 
i[u] = gtolA(k[u])
end for
【００８７】
次に、送信ノードは、xが自ノードか否かを確認する（Ｓ４−３）。そして、xが自ノードのインデックスでないときには、送信ノードは、Ｓ４−４からＳ４−６は実施せず次のjに対する処理を実行する。
【００８８】
xが自ノードである場合、送信ノードは、jに基づいて、受信側のグローバルインデックスk’を取得する（Ｓ４−４）。すなわち、送信ノードは、以下の手順を実行する。
【００８９】
for v = 1 to V
k’[v] = gv( j )
end for
【００９０】
次に、送信ノードは、k’に基づいて、受信側のノードインデックスyを取得する（Ｓ４−５）。すなわち、送信ノードは、以下の手順を実行する。
【００９１】
for v = 1 to V
y[v] = gtopB(k’[v]) 
end for
【００９２】
次に送信ノードは、自ノードのa(i)の１要素を、ノードyへ送信する（Ｓ４−６）。このとき送信ノードは、同じ(x,y)の組をもつ、後述する手順Ｓ５−６の受信と対応するようにタグ付けする。
【００９３】
そして、送信ノードは、次のjに対する処理を実行する。
【００９４】
次に受信ノードの動作について説明する。受信ノードは、すべての通信データのインデックス
j = (j[1], ..., j[D]) ; j[1] = 0, ..., N[1] - 1;...; j[D] = 0, ..., N[D] - 1
について、以下の多重ループを実施する。この多重ループにおいて、受信ノードは受信ノード通信手順１を実行する。
【００９５】
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
（受信ノード通信手順１）
end for
...
end for
【００９６】
図１７は、比較例におけるバッファなし両側通信の受信ノード通信手順１の一例を示す。図１７において受信ノードは先ず、jに基づいて、受信側のグローバルインデックスk’を取得する（Ｓ５−１）。すなわち、受信ノードは、以下の手順を実行する。
【００９７】
for v = 1 to V
k’[v] = gv( j )
end for
【００９８】
次に、受信ノードは、k’に基づいて、受信側のノードインデックスyとローカルインデックスi’を取得する（Ｓ５−２）。すなわち、受信ノードは、以下の手順を実行する。
【００９９】
for v = 1 to V
y[v] = gtopB(k’[v]) 
i’[v] = gtolB(k’[v])
end for
【０１００】
次に、受信ノードは、yが自ノードか否かを確認する（Ｓ５−３）。そして、yが自ノードのインデックスでないときには、受信ノードは、Ｓ５−４からＳ５−６は実施せず次のjに対する処理を実行する。
【０１０１】
yが自ノードである場合、受信ノードは、jに基づいて、送信側のグローバルインデックスkを取得する（Ｓ５−４）。すなわち、受信ノードは、以下の手順を実行する。
【０１０２】
for u = 1 to U
k[u] = fu( j )
end for
【０１０３】
次に、受信ノードは、kに基づいて、送信側のノードインデックスxを取得する（Ｓ５−５）。すなわち、受信ノードは、以下の手順を実行する。
【０１０４】
for u = 1 to U
x[u] = gtopA(k[u]) 
end for
【０１０５】
次に受信ノードは、ノードxから、１要素を自ノードのb( i’ ) に受信する（Ｓ５−６）。このとき受信ノードは、同じ(x,y)の組をもつ手順Ｓ４−６の送信と対応するようにタグ付けする。
【０１０６】
そして、送信ノードは、次のjに対する処理を実行する。
【０１０７】
尚、送信ノードと受信ノードの両方に属すノードは、図１６と図１７を任意の順序で実施してよい。
【０１０８】
（比較例におけるバッファあり両側通信）
次に、比較例におけるバッファなし両側通信の一例について説明する。比較例におけるバッファあり両側通信は、実行状態３、すなわち、送信ノードと受信ノードのすべてが、集団的な実行をしている状態である。バッファあり両側通信においては、配列Aの分散先である送信ノードと、配列Bの分散先である受信ノードが協調して動作する。
【０１０９】
比較例におけるバッファあり両側通信の具体的な動作について説明する。先ず送信ノードは、十分な長さの送信バッファSendBuffを、受信ノードの数だけ確保する。また受信ノードは、十分な長さの受信バッファRecvBuffを、送信ノードの数だけ確保する。
【０１１０】
次に送信ノードは、すべての通信データのインデックス
j = (j[1], ..., j[D]) ; j[1] = 0, ..., N[1] - 1;...; j[D] = 0, ..., N[D] - 1 
について、以下の多重ループを実施する（Ｓ６）。この多重ループにおいて、送信ノードは送信ノード通信手順２を実行する。
【０１１１】
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
（送信ノード通信手順２）
end for
...
end for
【０１１２】
図１８は、比較例におけるバッファあり両側通信の送信ノード通信手順２の一例を示す。図１８において送信ノードは先ず、jに基づいて、送信側のグローバルインデックスkを取得する（Ｓ６−１）。すなわち、送信ノードは、以下の手順を実行する。
【０１１３】
for u = 1 to U
k[u] = fu( j )
end for
【０１１４】
次に、送信ノードは、kに基づいて、送信側のノードインデックスxとローカルインデックスiを取得する（Ｓ６−２）。すなわち、送信ノードは、以下の手順を実行する。
【０１１５】
for u = 1 to U
x[u] = gtopA(k[u]) 
i[u] = gtolA(k[u])
end for
【０１１６】
次に、送信ノードは、xが自ノードか否かを確認する（Ｓ６−３）。そして、xが自ノードのインデックスでないときには、送信ノードは、Ｓ６−４〜Ｓ６−６は実施せず次のjに対する処理を実行する。
【０１１７】
xが自ノードである場合、送信ノードは、jに基づいて、受信側のグローバルインデックスk’を取得する（Ｓ６−４）。すなわち、送信ノードは、以下の手順を実行する。
【０１１８】
for v = 1 to V
k’[v] = gv( j )
end for
【０１１９】
次に、送信ノードは、k’に基づいて、受信側のノードインデックスyを取得する（Ｓ６−５）。すなわち、送信ノードは、以下の手順を実行する。
【０１２０】
for v = 1 to V
y[v] = gtopB(k’[v]) 
end for
【０１２１】
次に送信ノードは、自ノードのa( i ) の１要素をコピーし、SendBuff[y]の末尾へ加える（Ｓ６−６）。
【０１２２】
そして、送信ノードは、次のjに対する処理を実行する。
次に、送信ノードは、SendBuffのデータを対応する受信ノードへ送信する（Ｓ７−１）。
【０１２３】
次に受信ノードの動作について説明する。受信ノードは、RecvBuffに対応する送信ノードからのデータを受信する（Ｓ７−２）。そして、受信ノードは、すべての通信データのインデックス
j = (j[1], ..., j[D]) ; j[1] = 0,..., N[1] - 1; ...; j[D] = 0, ..., N[D] - 1 
について、以下の多重ループを実施する。この多重ループにおいて、受信ノードは受信ノード通信手順２を実行する。
【０１２４】
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
（受信ノード通信手順２）
end for
...
end for
【０１２５】
図１９は、比較例におけるバッファあり両側通信の受信ノード通信手順２の一例を示す。図１９において受信ノードは先ず、jに基づいて、受信側のグローバルインデックスk’を取得する（Ｓ８−１）。すなわち、受信ノードは、以下の手順を実行する。
【０１２６】
for v = 1 to V
k’[v] = gv( j )
end for
【０１２７】
次に、受信ノードは、k’に基づいて、受信側のノードインデックスyとローカルインデックスi’を取得する（Ｓ８−２）。すなわち、受信ノードは、以下の手順を実行する。
【０１２８】
for v = 1 to V
y[v] = gtopB(k’[v]) 
i’[v] = gtolB(k’[v])
end for
【０１２９】
次に、受信ノードは、yが自ノードか否かを確認する（Ｓ８−３）。そして、yが自ノードのインデックスでないときには、受信ノードは、Ｓ８−４からＳ８−６は実施せず次のjに対する処理を実行する。
【０１３０】
yが自ノードである場合、受信ノードは、jに基づいて、送信側のグローバルインデックスkを取得する（Ｓ８−４）。すなわち、受信ノードは、以下の手順を実行する。
【０１３１】
for u = 1 to U
k[u] = fu( j )
end for
【０１３２】
次に、受信ノードは、kに基づいて、送信側のノードインデックスxを取得する（Ｓ８−５）。すなわち、受信ノードは、以下の手順を実行する。
【０１３３】
for u = 1 to U
x[u] = gtopA(k[u]) 
end for
【０１３４】
次に受信ノードは、RecvBuff[x]の先頭から１要素を取り出し、b( i’ ) へコピーする（Ｓ８−６）。
【０１３５】
そして、送信ノードは、次のjに対する処理を実行する。
【０１３６】
以上、比較例における通信の手順について説明した。比較例における、バッファなしPut通信、バッファなしGet通信、バッファなし両側通信等のバッファなし通信では、配列要素の１要素ずつに対して通信が生成されているため、通信遅延時間の総和は非常に大きくなる。限定されたケースでは、送信ノードは、通信データが連続であると判断できて、データを一括化して通信することができることがある。例えば、送信側と受信側でグローバル配列の１次元目の長さが同じで、かつ分散されていないと分かっている場合には、送信ノードは、グローバル配列のうち１次元目の長さまで連続データとして扱うことができる。しかし、比較例における送信ノードにとって、対応する送信データと受信データの両方が連続であることを判断することは難しい。
【０１３７】
比較例におけるバッファなし両側通信等のバッファあり通信では、データ分散に対応するとバッファリングのコストが大きくなる。これは、通信データの全要素に対してノードインデックスとローカルインデックスを計算しているため、１要素のバッファリングにかけるコストが非常に大きくなるからである。
【０１３８】
状態１と状態２においては、二次側のノードは能動的に実行していないことが前提なので、put通信における受信側と、get通信における送信側のバッファリングは困難である。二次側のプロセッサへの割り込みや、デーモンプロセスまたはスレッドにより、二次側のバッファリングは実現可能であるが、二次側に負荷がかかることになり、システム全体の性能が下がる原因になる。
【０１３９】
以上から、自由なデータ分散とグローバルビューの通信を許す並列言語では、コンパイラは通信の性能を出すことが難しい。
【０１４０】
比較例における通信方法では、１要素の通信またはバッファリングのために多数の手順の実施が必要であり、効率が悪い。これに対して、以下で説明する実施形態に係る通信方法は、バッファあり通信においてもバッファなし通信においても、データの連続性を抽出して、連続するデータ毎にデータを通信する。これにより、通信の効率化を図ることができる。ここで連続するデータとは、それらのデータが格納されるアドレスが連続するデータである。
【０１４１】
また実施形態に係るバッファなし通信では、送信ノードxと受信ノードyの組み合わせに対して、送信側と受信側で共通に連続である区間を判定する。ここで送信側と受信側で共通に連続である区間とは、送信側ノードにおいてデータが格納されている領域のアドレスが連続する区間であって、受信側ノードにおいてデータが格納される領域のアドレスが連続する該区間である。尚、送信側と受信側で共通して連続であるデータとは、送信側と受信側で共通に連続である区間に格納されたデータを指す。送信側と受信側で共通に連続である区間のデータを一度に通信することで、通信の効率化を図ることができる。
【０１４２】
さらに実施形態に係るバッファあり通信では、packやunpackの処理を必要としない連続区間を事前に検出し、データとバッファの間で単純なメモリコピーを行う。これによりバッファへのデータのコピー、またはバッファからのデータのコピーを高速化でき、その結果、通信の効率化を図ることができる。
【０１４３】
また、実施形態に係る通信方法は、複数の要素や要素の区間を対象として通信を行うことで、メモリからバッファへの集積（pack）と、バッファからメモリへの分配（unpack）に要するコストを小さくすることができる。packとunpackに要するコストは、通信遅延時間に加算されるものである。実施形態に係る通信方法では、通信の効率化を図ることができる。
【０１４４】
データの連続性を阻害する要因は、後述のように多数あり、要因も複雑であるため、これらを正しくかつ効率よく判定して長い連続区間を抽出することは難しい。そこで、実施形態に係る通信方法は、グローバルでなくローカルな通信データ範囲についての反復処理を行うことで、効率的なデータの通信を実現し、高並列時の無駄な反復や判断のコストを抑えることにより、データの連続性を効率よく判定する。また、例えばＦｏｒｔｒａｎの多次元配列のように、次元を跨ぐデータの連続性が仕様で保障されている言語が用いられる場合、次元を跨いだ連続性の抽出が行われる。
【０１４５】
比較例におけるバッファあり両側通信では、送信バッファと受信バッファの適切なサイズを決めることは難しい。また、各ノードに全ノード分のバッファを用意しなければならず、高並列になるとメモリ使用量が増大し、高並列の通信の実現が困難になる。実施形態に係るバッファあり通信方式では、バッファの割付けが通信で使用する最小限のサイズで行われる。そのため、高並列でもバッファ領域のためのメモリ使用量を小さく抑えることができる。
【０１４６】
また、実施形態に係る通信方法は、正規化された通信を対象とし、オーバーヘッドコストによる遅延時間の増加を抑えながら一度に通信するデータの量を大きくすることで、通信を高速に実現する。実施形態に係る通信方法は、コンパイラの中で通信コード生成に利用することもできるし、実行時ライブラリの実装に利用することもできる。
【０１４７】
ここで、グローバルデータの連続性を壊す要因について説明する。グローバルデータの連続性を壊す要因には、例えば以下のようなものがある。
【０１４８】
（１．不連続な添字）
アクセス対象のデータの指定に配列の添字式が使用される場合、指定される添字式の範囲が不連続だと、アクセス対象のデータは不連続になる。添字三つ組や間接参照による部分配列の参照がこれに当たる。これは、具体的には例えばA(2:8:2)やA(IX(1:8))などのようにアクセス対象データが指定された場合である。
【０１４９】
（２．添字範囲／次元跨ぎ）
Ｆｏｒｔｒａｎでは、参照されるデータがk-次元目において連続であっても、k-次元目の下限から上限までの全てが参照されていなければ、参照されるデータは(k+1)-次元目に跨る連続とはならない。例えば、宣言形状がA(8,8)のとき、A(1:8, 2:3)は次元を跨ぐ8*2=16要素の連続となるが、A(1:7, 2:3)は次元を跨ぐ連続とはならず、7要素の連続となる。
【０１５０】
なお、Ｆｏｒｔｒａｎでは最も左の添字、Ｃ言語では最も右の添字が１次元目となる。次元を跨ぐ配列要素の並び順が規定されていない言語では、次元を跨ぐ連続性は保障されない。
【０１５１】
（３．分散の実装方法）
分散の実装方法によっては、グローバル配列の添字が連続であっても、対応するローカル配列の添字が連続であると保障されない場合がある。例えば、cyclic分散について分散データが圧縮されずに割り付けられる実装方法では、A(1:100)が３ノードにcyclic分散されると、分散されるデータは、それぞれストライド幅3の不連続なアドレスに割り付けられるかもしれない。
【０１５２】
（４．分散の端数／次元跨ぎ）
k-次元目の分散でインデックスがノード数で割り切れない場合、割り付けの大きさをノード間で一定にする実装では、(k+1)-次元目に跨る連続とならない。例えば、宣言形状がA(8,8)のデータが、１次元目がblock分散で３ノードに分散される場合、割り当てがそれぞれA(1:3, 1:8), A(4:6, 1:8), A(7:8, 1:8)となる。このとき、最後のノードだけ１次元目の割り当てが少なくなる。このような場合にすべてのノードで同じサイズの領域が割り付けられると、最後のノードだけは次元を跨ぐ連続にならない。
【０１５３】
（５．不均等な分散／次元跨ぎ）
k-次元目が不均等block分散、block-cyclic分散、またはindirect分散の場合、たとえインデックスがノード数で割り切れても、(k+1)-次元目に跨る連続とならない場合がある。例えば、１次元目が不均等block分散でその分散幅がノード毎にそれぞれ1,3,3,2である場合、各ノードの割付けの大きさが、分散幅の最大値３で統一される実装では、第１と第４のノードでは２次元目に跨る連続にならない。
【０１５４】
（６．間接的なマッピング／次元跨ぎ）
ＨＰＦなどの言語では、グローバル配列を直接ノードに分散するのでなく、テンプレートと呼ばれる仮想的な配列に整列（align）させ、テンプレートを分散することにより、間接的にグローバルデータを分散させることができる。このようなとき、グローバル配列のk-次元目の大きさがテンプレートの対応する次元の大きさと一致する場合を除いて、(k+1)次元目に跨る連続にならない。例えば、グローバル配列の形状がA(10,8)、テンプレートの形状がT(12,8)で、A(i,j) が T(i+1, j) に整列され、１次元目が４ノードにblock分散される場合を考える。このとき、各ノードへのTの分散は、それぞれT(1:3, 1:8), T(4:6, 1:8), T(7:9, 1:8), T(10:12, 1:8)となり、各ノードへのAの分散は、それぞれA(1:2, 1:8), A(3:5, 1:8), A(6:8, 1:8), A(9:10, 1:8)となる。テンプレートの形状でメモリ割付けが行われる実装では、第１と第４のノードでは１次元目がテンプレートの１次元目の大きさより小さいので、２次元目に跨る連続にならない。
【０１５５】
以上、グローバルデータの連続性を壊す要因の一例を説明した。
【０１５６】
図２０は、実施形態の送信処理に係る情報処理装置の構成の一例を示す。図２０において、情報処理システム１０においては、複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている。そして情報処理システム１０は、第１ノード１１と第２ノード１２を含む。情報処理装置１１は、情報処理システムに含まれる第１ノード１１である。
【０１５７】
情報処理装置（第１ノード）１１は、記憶部１３、取得部１４、検出部１５、送信部１６、及び確保部１７を含む。
【０１５８】
記憶部１３は、所定の単位に区画された第１の記憶領域に、第１ノード１１に割り当てられたローカルデータを記憶する。ここで区画は、記憶領域の所定のアドレスの範囲で示される連続領域である。
【０１５９】
取得部１４は、第１ノード１１から第２ノード１２に対する書き込み対象である対象ローカルデータの書き込み指示を取得する。
【０１６０】
検出部１５は、格納領域情報に基づき、第２ノード１２が備える他の記憶部において所定の単位に区画された第２の記憶領域のうち、対象ローカルデータを書き込む連続する複数の連続区画を検出する。格納領域情報は、グローバルデータにおいて対象ローカルデータが対応するデータを特定する情報である。ここで連続する区画同士は、一方の区画の末尾アドレスと一方の区画の先頭アドレスとが連続する関係となる。
【０１６１】
送信部１６は、第１の記憶領域に格納されたローカルデータを、検出部１５が検出した連続区画の区画数だけ取り出して第２ノード１２に送信する。
【０１６２】
送信部１６が、第２ノード１２における第２の記憶領域の区画のうち、連続する複数の区画に格納されるデータ毎に、記憶部１３からローカルデータを取り出して第２ノード１２へ送信することで、通信の効率化を図ることができる。
【０１６３】
また、格納領域情報は、第１ノード１１に割り当てられた対象ローカルデータを特定する情報と、第２ノード１２に割り当てられた対象ローカルデータを特定する情報を含む。この格納領域情報に基づいて、検出部１５は、第２の記憶領域の連続区画のうち、当該連続区画に書き込まれる対象ローカルデータが格納された第１の記憶領域の区画が連続する複数の連続区画を検出する。そして送信部１６は、第１の記憶領域に格納されたローカルデータを、検出部１５が検出した連続区画の区画数だけ取り出して第２ノード１２に送信する。
【０１６４】
送信部１６が、第１の記憶領域と第２の記憶領域で共通に連続する複数の区画に格納されるデータ毎に、記憶部１３からローカルデータを取り出して第２ノード１２へ送信することで、通信の効率化を図ることができる。
【０１６５】
また、送信部１６は、記憶部１３から、連続区画の区画数だけ、第１の記憶領域に格納されたローカルデータを取り出して、所定のバッファ領域に格納し、該バッファ領域に格納したローカルデータを、所定の単位で、第２ノード１２へ送信する。
【０１６６】
送信部１６が、検出部１５により検出された連続する複数の区画数に対応する区画数分のローカルデータを記憶部１３から取り出して所定のバッファ領域に格納することで、バッファへの効率的なデータの格納が可能になる。
【０１６７】
確保部１７は、検出部１５により検出された連続区画の区画数に応じたサイズのバッファ領域を確保する。これにより、バッファ領域のサイズを、通信で使用する最小限のサイズに抑えることができ、通信で使用されるメモリ使用量を抑制することができる。
【０１６８】
第２ノード１２は第１ノード１１と通信を行う情報処理装置である。第２ノード１２は、第１ノード１１から連続区画の区画数のローカルデータを受信して、第２の記憶領域に格納する。
【０１６９】
格納領域情報は、例えば多次元配列で表現された、第２ノード１２のローカル配列情報を含んでもよい。検出部１５は、格納領域情報の多次元配列のインデックスの連続性に基づいて、連続する複数の区画を検出する。具体的には例えば、検出部１５は、格納領域情報の多次元配列の一次元目のインデックスが連続する多次元配列の区間に対応する区画を、連続する複数の区画であると判定する。また例えば、検出部１５は、格納領域情報の多次元配列のインデックスが次元を跨いで連続する多次元配列の区間に対応する区画を、連続する複数の区画であると判定する。さらに格納領域情報は、例えば多次元配列で表現された、第１ノード１１のローカル配列情報を含んでもよい。
【０１７０】
また格納領域情報は、具体的には例えば、受信側のノード配列の各次元の寸法、分散の種別を示す情報、及び、ノード配列の各次元に対するグローバル配列の情報を含んでもよい。これについては後ほど図３０を用いて説明する。
【０１７１】
ここで、実施形態に係る送信処理に係る情報処理装置の動作の一例を説明する。図２１は、実施形態に係る送信処理に係る情報処理装置の動作の一例を示す。図２１においては、グローバル配列Ａのデータをグローバル配列Ｂに代入する操作に対応する通信の例である。グローバル配列Ａ、Ｂはそれぞれ、複数のノードに分散されて配置される。第１ノード１１は、グローバル配列Ａが分散されて配置された複数のノードのうちの１つである。第２ノード１２は、グローバル配列Ｂが分散されて配置された複数のノードのうちの１つである。
【０１７２】
図２１において、第１ノード１１から第２ノード１２へのバッファを介さないデータの書き込みについて考える。先ず、第１ノード１１は、格納領域情報に基づき、第１ノード１１の対象ローカルデータが格納された領域と、第２ノード１２の対象ローカルデータが書き込まれる領域との間で、共通して連続する複数の連続区画を検出する（Ａ１）。そして第１ノード１１は、検出した連続区画の区画数毎にデータを第２ノードに送信する（Ａ２）。この通信の詳細については、後ほど（バッファなしPut通信）において説明する。
【０１７３】
図２２は、実施形態の受信処理に係る情報処理装置の構成の一例を示す。図２２において、情報処理システム２０においては、複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている。そして情報処理システム２０は、第１ノード２１と第２ノード２２を含む。情報処理装置２２は、情報処理システムに含まれる第２ノード２２である。
【０１７４】
情報処理装置（第２ノード）２２は、記憶部２３、取得部２４、検出部２５、要求部２６、受信部２７、及び確保部２８を含む。
【０１７５】
記憶部２３は、所定の単位に区画された第２の記憶領域を含む。記憶部２３は、情報処理装置２２にローカルデータ領域を割り当てられる。
【０１７６】
取得部２４は、第２ノード２２に対する第１ノード２１からの読み込み対象である対象ローカルデータの読み込み指示を取得する。
【０１７７】
検出部２５は、格納領域情報に基づき、第１ノード２１が備える他の記憶部において所定の単位に区画された第１の記憶領域のうち、対象ローカルデータを読み出す連続する複数の連続区画を検出する。格納領域情報は、グローバルデータにおいて対象ローカルデータが対応するデータを特定する情報である。
【０１７８】
要求部２６は、第１の記憶領域に格納されたローカルデータを、検出部２５が検出した連続区画の区画数だけ取り出して第２ノード２２に送信することを、第１ノード２１に要求する。
【０１７９】
受信部２７は、第１ノード２１から、要求部２６による要求に応じて送信された連続区画の区画数のローカルデータを受信して第２の記憶領域に格納する。
【０１８０】
受信部２７が、第１ノード２１における第１の記憶領域の区画のうち、連続する複数の区画に格納されたデータ毎に、第１ノード２１からローカルデータを受信することで、通信の効率化を図ることができる。
【０１８１】
また、格納領域情報は、第１ノード２１に割り当てられた対象ローカルデータを特定する情報と、第２ノード２２に割り当てられた対象ローカルデータを特定する情報を含む。この格納領域情報に基づいて、検出部２５は、第１の記憶領域の連続区画のうち、当該連続区画からデータが読み出されて格納される第２の記憶領域の区画が連続する複数の連続区画を検出する。そして受信部２７は、第１ノード２１から、要求部２６による要求に応じて送信された連続区画の区画数のローカルデータを受信して第２の記憶領域に格納する。
【０１８２】
受信部２７が、第１の記憶領域と第２の記憶領域で共通に連続する複数の区画に格納されるデータ毎に、第１ノード２１からローカルデータを受信することで、通信の効率化を図ることができる。
【０１８３】
また、受信部２７は、ローカルデータを受信して所定のバッファ領域に格納し、該バッファ領域から、検出部２５が検出した連続区画の区画数だけ取り出して第２の記憶領域に格納する。
【０１８４】
受信部２７が、検出部２５により検出された連続区画の区画数分のローカルデータをバッファ領域から取り出して記憶領域に格納することで、バッファ領域から記憶領域への効率的なデータの格納が可能になる。
【０１８５】
確保部２８は、検出部２５により検出された連続区画の区画数に応じたサイズのバッファ領域を確保する。これにより、バッファ領域のサイズを、通信で使用する最小限のサイズに抑えることができ、通信で使用されるメモリ使用量を抑制することができる。
【０１８６】
第１ノード２１は、第２ノード２２と通信を行う情報処理装置である。第２ノード２２からの要求に応じて、第１の記憶領域に格納されたローカルデータを、連続区画の区画数だけ取り出して第２ノード２２に送信する。
【０１８７】
格納領域情報は、例えば多次元配列で表現された、第１ノード２１のローカル配列情報を含んでもよい。また格納領域情報は、例えば多次元配列で表現された、第２ノード２２のローカル配列情報を含んでもよい。格納領域情報は、具体的には例えば、送信側のノード配列の各次元の寸法、分散の種別を示す情報、及び、ノード配列の各次元に対するグローバル配列の情報を含んでもよい。
検出部２５は、検出部１５と同様にして、連続区画を検出する。尚、情報処理装置１１と情報処理装置２２は、同じ情報処理装置であっても良い。
【０１８８】
ここで、実施形態に係る受信処理に係る情報処理装置の動作の一例を説明する。図２３は、実施形態に係る送信処理に係る情報処理装置の動作の一例を示す。図２３においては、グローバル配列Ａのデータをグローバル配列Ｂに代入する操作に対応する通信の例である。グローバル配列Ａ、Ｂはそれぞれ、複数のノードに分散されて配置される。第１ノード２１は、グローバル配列Ａが分散されて配置された複数のノードのうちの１つである。第２ノード２２は、グローバル配列Ｂが分散されて配置された複数のノードのうちの１つである。
【０１８９】
図２３において、第１ノード２１から第２ノード２２へのバッファを介さないデータの読み出しについて考える。先ず、第２ノード２１は、格納領域情報に基づき、第１ノード２１の対象ローカルデータが格納された領域と、第２ノード２２の対象ローカルデータが書き込まれる領域との間で、共通して連続する複数の連続区画を検出する（Ｂ１）。そして第２ノード２１は、検出した連続区画の区画数毎にデータを第１ノード２１から取得する（Ｂ２）。この通信の詳細については、後ほど（バッファなしGet通信）において説明する。
【０１９０】
図２４は、実施形態に係る通信システムの構成の一例を示す。図２４において通信システム４０は、複数のノード３０（３０ａ〜３０ｃ）を含む。各ノード３０は互いに、インターコネクトや、Local Area Network（ＬＡＮ）等の通信ネットワークを介して接続される。
【０１９１】
通信システム４０においては、プログラミング言語で定義された仮想グローバル空間に置かれるグローバルデータや、ストライピングなどストレージを跨いで配置されたデータは、仮想多次元ノード配列に分散配置されたグローバル配列として抽象化される。通信システム４０における通信は送信側グローバル配列Aと受信側グローバル配列Bの全体または部分配列間の代入として表現できる。グローバル配列は、通信システム４０に含まれるノード群の全体または部分に分散されていても、単一のノードに置かれていてもよい。
【０１９２】
通信システム４０におけるノード間通信は、例えば以下のＦｏｒｔｒａｎのforall構文を使って表現できる。
【０１９３】
forall ( j[1] = 0 : N[1]-1, ..., j[D] = 0 : N[D]-1 )
B( g1(j), ..., gV(j) ) = A( f1(j), ..., fU(j) )
【０１９４】
グローバル配列Aに対応するノード配列Pは、グローバル配列Aと同じ次元数をもち、次元の対応付けは恒等的になるように定義される。同様に、グローバル配列Bに対応するノード配列Qは、グローバル配列Bと同じ次元数をもち、次元の対応付けは恒等的になるように定義される。このノード配列Pとノード配列Qは、グローバル配列Aとグローバル配列Bの分散先としてプログラムに記述されたノード配列とは必ずしも一致しないが、次元拡張と軸回転により容易に変換できる。ノード配列Pとノード配列Qに属するノードは、物理的に同じであっても、一部が重なっていても、すべてが異なっていてもよい。
【０１９５】
通信システム４０では、分散の種類は図３を参照して説明した５種類と、これに非分散を加えた６種類から１つが、配列の各次元に対して選択される。尚、分散の種類はこれら６種類に限定されない。
【０１９６】
ノード配列Pとノード配列Qの両方のすべてのノードのプロセッサが能動的であるとは限らず、上述したように通信システム４０におけるノードの実行状態には３つの状態がある。通信システム４０では、ノード配列Pが能動的な場合にはノード配列Pからのput通信、ノード配列Qが能動的な場合にはノード配列Qからのget通信が利用される。両方が能動的な場合には、実施形態に係る通信システムでは、両側通信とput通信とget通信のうちのどれが利用されてもよい。
【０１９７】
実施形態に係るバッファなし通信では、通信を行うノードはバッファリングを行わないことで、通信遅延時間の短縮を行う。また、実施形態に係るバッファなし通信では、通信を行うノードは送信側データと受信側データで共通に連続である区間を正確に検出することによって、一度に通信するデータ量を大きくする。
【０１９８】
実施形態に係るバッファあり通信では、通信を行うノードは、バッファリングによって一度に通信するデータ量を増やす。また、実施形態に係るバッファあり通信では、通信を行うノードは、通信相手に対応する自ノードのデータの連続である区間を正確に検出することによって、バッファリングを高速化する。
【０１９９】
実施形態に係る通信システムでは、プログラムの実行状態、及び、バッファを使用するか否かに応じて、５種類の通信が行われる。実施形態に係る通信の種類は、すなわち、バッファなしPut通信、バッファありPut通信、バッファなしGet通信、バッファありGet通信、バッファあり両側通信である。
【０２００】
以下の説明において、「評価する」とは、実行時ライブラリでの実装ではその値を得ることを意味し、コンパイラでの実装では内部表現の数式として作成または簡単化することを意味する。
【０２０１】
各ノード３０は、通信がグローバル配列Aとグローバル配列B間の代入の形式で表現される場合、ノード配列P、Qのいずれかまたは両方に含まれる。すなわち、各ノード３０は、グローバル配列A、Bのいずれかまたは両方に対応するローカル配列を記憶する。
【０２０２】
各ノード３０は、記憶部３１（３１ａ〜３１ｃ）、取得部３２（３２ａ〜３２ｃ）、解析部３３（３３ａ〜３３ｃ）、整列部３４（３４ａ〜３４ｃ）、検出部３５（３５ａ〜３５ｃ）、及び、通信部３６（３６ａ〜３６ｃ）を含む。さらに各ノード３０は、バッファ確保部３７（３７ａ〜３７ｃ）、及び、バッファ制御部３８（３８ａ〜３８ｃ）を含む。
【０２０３】
ノード３０は、情報処理装置１１、及び情報処理装置２２の一例である。また、ノード３０は、第２ノード１２、及び第２ノード２２の一例である。記憶部３１は、情報処理装置１１の記憶部１３、及び、情報処理装置２２の記憶部２３の一例である。取得部３２は、情報処理装置１１の取得部１４、及び、情報処理装置２２の取得部２４の一例である。検出部３５は、情報処理装置１１の検出部１５、及び、情報処理装置２２の検出部２５の一例である。通信部３６は、情報処理装置１１の送信部１６、及び、情報処理装置２２の要求部２６と受信部２７の一例である。バッファ確保部３７は、情報処理装置１１の確保部１７、及び、情報処理装置２２の確保部２８の一例である。バッファ制御部３８は、情報処理装置１１の送信部１６、及び、情報処理装置２２の受信部２７の一例である。
【０２０４】
記憶部３１は、複数のノード間のデータ通信の通信対象となるデータ（以下、通信データと記す）を格納する。具体的には記憶部３１は、通信がグローバル配列Aとグローバル配列B間のグローバル配列間の代入の形式で表現される場合、グローバル配列A、Bのいずれかまたは両方の実体が分割して割り付けられたローカル配列を記憶する。通信データは対象ローカルデータの一例である。
【０２０５】
また、記憶部３１は、通信情報テーブルを記憶する。通信情報テーブルは、格納領域情報を含む。通信情報テーブルには、送信ノード及び受信ノードにおいて、通信データが格納される領域に関する情報が格納される。すなわち、通信がグローバル配列Aとグローバル配列B間の代入の形式で表現される場合、通信情報テーブルは、グローバル配列Aのノード配列及びローカル配列に関する情報と、グローバル配列Bのノード配列及びローカル配列に関する情報とを記憶する。通信情報テーブルの詳細については後ほど説明する。
【０２０６】
取得部３２は、複数のノード間のデータ通信の指示を取得する。具体的には例えば、取得部３２は、通信の指示が記載されたプログラムを受信する。通信の指示は、プログラムにおいて、例えば、グローバル配列Aとグローバル配列Bの間のようなグローバル配列間の代入の形式で表現される。このような通信の指示において、通信対象の一方のグローバル配列に対応するローカル配列は記憶部３１に記憶されている。また、通信対象の他方のグローバル配列に対応するローカル配列は、ノード３０に接続される他のノードに記憶されている。
【０２０７】
解析部３３は、取得部３２が取得した指示に対応する通信に関連する情報を収集して、その結果を通信情報テーブルに格納する。具体的には解析部３３は、取得部が取得した通信の指示が記載されたプログラムの解析を行うことにより、着目する通信に関連する情報を収集する。解析部３３は、送信ノードと受信ノードの実行状態の組合せに対応したプログラムの解析を行う。
【０２０８】
整列部３４は、通信データのインデックスを並び替える。通信データのインデックスとは、通信データを配列で表現した場合の、配列のインデックスを指す。並べ替えの方法は、通信の種類に応じて異なる。バッファなしPut通信、及びバッファなしGet通信においては、整列部３４は、一次側または二次側データのアクセスができるだけ連続になるように、通信データのインデックスを並び替える。バッファありPut通信、及びバッファありGet通信においては、整列部３４は、二次側データのアクセスができるだけ連続になり、一次側データの下位インデックスのアクセスが出来るだけ矩形になるように、通信データのインデックスを並び替える。バッファあり両側通信においては、整列部３４は、送信側と受信側の下位インデックスのアクセスができるだけ矩形になるように、２つの通信データのインデックスを並び替える。ここで、アクセスが矩形となるとは、すなわち、アクセス対象のデータが配列の添字式で表現される場合、その添字式が、区間、三つ組またはスカラで表現されるアクセスを指す。尚、実施形態において添字式が区間で表現できるデータは、連続データである。
【０２０９】
検出部３５は、複数のノード間のデータ通信において、送信側と受信側で共通なデータ単位を検出する。送信側と受信側で共通なデータ単位は、通信の種類に応じて異なる。バッファなしPut通信、及びバッファなしGet通信においては、検出部３５は、通信情報テーブルの情報に基づいて、一次側と二次側で共通して連続であるデータ単位を検出する。バッファありPut通信、及びバッファありGet通信においては、検出部３５は、通信情報テーブルの情報に基づいて、一次側において矩形データであって、二次側において連続であるデータ単位を検出する。矩形データ単位とは、データが区間、三つ組またはスカラで表現される通信データのインデックス範囲（以下、通信インデックス範囲と記す場合がある）を指す。バッファあり両側通信においては、検出部３５は、通信情報テーブルの情報に基づいて、送信側と受信側に共通な矩形データ単位（以下、共通矩形データ単位と記す場合がある）を検出する。尚、一次側と二次側で共通なデータ単位は、次元を跨いでもよい。共通矩形データは、すなわち、一次側にいて矩形データであるデータが、二次側でも矩形データとなっているデータである。
【０２１０】
通信部３６は、データの送受信を行う。データの送受信の単位は通信の種類に応じて異なり、検出部３５が検出したデータ単位で通信部３６はデータの送受信を行う。このように、送信側と受信側で共通なデータ単位で、一度にデータを通信することにより、通信の効率化を図ることができる。
【０２１１】
バッファ確保部３７は、バッファあり両側通信において、共通矩形データ単位に対する受信側のノードインデックスに対応する送信バッファを確保する。またバッファ確保部３７は、共通矩形データ単位に対する送信側ノードインデックスに対応する受信バッファを確保する。このように共通矩形データ単位に応じてバッファを確保することにより、確保するバッファのサイズを、通信で使用するバッファの最小限のサイズに抑えることができる。また、バッファの確保において、バッファ溢れを回避するための実行時オーバヘッドも発生しない。この結果、通信が高並列で実行される場合であっても、実際に通信が行われる相手のノードに対してだけバッファが確保されるため、各ノードにおけるバッファ領域のためのメモリ使用量を小さく抑えることができる。
【０２１２】
バッファ制御部３８は、バッファありPut通信において、矩形データ単位に対応する自ノードのローカルデータを、送信バッファに集約（pack）する。またバッファ制御部３８は、バッファありGet通信において、受信バッファにあるデータを、矩形データ単位に対応する自ノードのローカルデータ領域に分配（unpack）する。さらに、バッファ制御部３８は、バッファあり両側通信において、共通矩形データ単位の送信データを、送信バッファへ集約（pack）するコードを生成する。またバッファあり両側通信において、バッファ制御部３８は、共通矩形データ単位の受信データを、受信バッファから分配（unpack）する。このようにバッファ制御部３８は、メモリ上のデータの連続性に基づいて、packまたはunpack処理を実行する。このため、packまたはunpack処理を高速化できる。また、バッファ制御部３８は、pack及びunpackを、グローバルでなくローカルな通信データ範囲におけるデータ単位で、反復して行う。このため、通信が高並列で実行される場合であっても、無駄な反復処理や判断のコストが抑えることができる。
【０２１３】
（バッファなしPut通信）
実施形態に係るバッファなしPut通信において、通信データは一次側ノードxから二次側ノードyに送信される。一次側と二次側で対応するデータが共に連続している範囲を、一度にputする通信データ単位とする。データは、通信データ単位毎に分割され、一次側も二次側もバッファなしでput通信される。通信データ単位にはxとyで共通に連続な区間Jccが選択される。
【０２１４】
図２５は、実施形態に係るバッファなしPut通信の処理を図解したフローチャートの一例である。
【０２１５】
図２５において、先ず取得部３２は、Put通信の指示を受信する（Ｓ１０１）。このPut通信の指示は、状態１の通信が表現されているプログラムである。このプログラムは、具体的には例えば、グローバル配列間の代入の形式で表現されるプログラムである。
【０２１６】
次に、解析部３３は、状態１プログラムの解析を行う（Ｓ１０２）。状態１プログラムの解析を行うことにより解析部３３は、着目する通信に関連する情報を通信情報テーブルに格納する。状態１プログラムの解析、及び、通信情報テーブルの詳細については後ほど説明する。
【０２１７】
次に整列部３４は、連続性優先pivoting手順を実行する（Ｓ１０３）。連続性優先pivoting手順を実行することにより整列部３４は、一次側または二次側データのアクセスができるだけ連続になるように、通信データのインデックスを並び替える。連続性優先pivoting手順の詳細については、後ほど説明する。尚、Ｓ１０３は、実行されなくてもよい。
【０２１８】
次に検出部３５は、連続データ単位検出手順を実行する（Ｓ１０４）。検出部３５は、連続データ単位検出手順により、一次側自ノードにおいて次元を跨いで連続する通信インデックスの範囲（連続データ単位）を検出する。これにより検出部３５は、連続データ単位の下位インデックスJc = (jc[1], ..., jc[Dc])と次元数Dc（0≦Dc≦D）を取得する。同時に検出部３５は、Jc, Dcに対応する一次側の下位ローカルインデックス範囲Ic = (ic[1], ..., ic[Uc])と次元数Uc（0≦Uc≦U）を取得する。この手順で得られる値は一次側のノード毎に異なる。
【０２１９】
次に通信部３６は、連続データput処理を実行する（Ｓ１０５）。すなわち通信部３６は、一次側で連続なデータ単位ごとの処理を反復して実施する。
【０２２０】
図２６は、連続データput処理の詳細の一例を示す。図２６において、各ループでは、連続データ単位put手順が実行されている。連続データ単位put手順については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現されてもよい。
【０２２１】
ここで図２６において、通信部３６は、jx1[d], jx2[d], jx3[d]（Dc+1≦d≦D）を通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部３６は、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するすべてのjx[d]について、処理を反復実行する（u = DtoU[d]）。
【０２２２】
連続データput処理の実行が完了すると、処理は終了する。
【０２２３】
（通信情報テーブル）
次に、通信情報テーブルについて説明する。図２７〜図３０は、通信情報テーブルの構成の一例（その１〜その４）を示す。尚、図２７〜図３０は、まとめて一つの通信情報テーブルとしてもよい。また通信情報テーブルは、各項目の対応関係が保持されれば、テーブルの形式に限定されない。
【０２２４】
図２７において、通信情報テーブルは、通信データに関する以下のデータ項目を含む。すなわち通信情報テーブルは、通信データの次元数Dを含む。また通信情報テーブルは、通信データの各次元d = 1, ..., Dに対する、寸法N[d]、ループ変数名j[d]、対応する一次側データの次元u = DtoU[d]、及び対応する二次側データの次元v = DtoV[d]を含む。また通信情報テーブルは、一次側に関する以下のデータ項目を含む。すなわち通信情報テーブルは、一次側ノード配列の次元数Uを含む。また通信情報テーブルは、一次側ノード配列の各次元u = 1, ..., Uに対する、グローバル配列の寸法、ローカル配列の割付け寸法、ノードの寸法X[u]、分散種別、分散パラメタ、グローバル添字式k[u] = fu、及び対応する通信データの次元d = UtoD[u]を含む。さらに通信情報テーブルは、一次側ノード配列の各次元u = 1, ..., Uに対する、グローバル添字のタイプ（「スカラ」、「区間」、「三つ組」、または「その他」）、グローバル添字三つ組パラメタk1[u], k2[u], k3[u]を含む。ノードの寸法X[v]は、一次側ノード配列のv次元目の寸法である。
【０２２５】
図２８において、通信情報テーブルは、通信データに関する以下のデータ項目を含む。すなわち通信情報テーブルは、ノードインデックスpをふくむ。また、通信情報テーブルは、通信データの各次元d = 1, ..., Dに対する、自ノードデータに対応する三つ組パラメタjx1[d], jx2[d], jx3[d]を含む。
【０２２６】
図２９において、通信情報テーブルは、一次側に関する以下のデータ項目を含む。すなわち通信情報テーブルは、ノードインデックスｐを含む。また通信情報テーブルは、一次側ローカル配列の各次元u = 1, ..., Uに対する、ローカル配列添字のタイプ（「スカラ」、「区間」、「三つ組」、または「その他」）を含む。さらに、通信情報テーブルは、一次側ローカル配列の各次元u = 1, ..., Uに対する、fullSpan[u]、ローカル配列添字三つ組パラメタi1[u], i2[u], i3[u]、ローカル配列添字に対応するグローバル添字三つ組パラメタkx1[u], kx2[u], kx3[u]を含む。fullSpan[u]は、ローカル配列添字が割付け寸法の全体を張るか否かを示す。
【０２２７】
図３０において、通信情報テーブルは、二次側に関する以下のデータ項目を含む。すなわち通信情報テーブルは、二次側ノード配列の次元数Vを含む。また通信情報テーブルは、二次側ノード配列の各次元v = 1, ..., Vに対する、グローバル配列の寸法、ローカル配列の割付け寸法、ノードの寸法Y[v]、分散種別、分散パラメタ、及び、グローバル添字式k’[v] = gvを含む。さらに、通信情報テーブルは、二次側ノード配列の各次元v = 1, ..., Vに対する、対応する通信データの次元d = VtoD[v]、及び、グローバル添字のタイプ（「スカラ」、「区間」、「三つ組」、または「その他」）を含む。そしてさらに、通信情報テーブルは、二次側ノード配列の各次元v = 1, ..., Vに対する、グローバル添字三つ組k1’[v], k2’[v], k3’[v]を含む。ノードの寸法Y[v]は、二次側ノード配列のv次元目の寸法である。
【０２２８】
格納領域情報は、少なくとも、グローバル配列において通信対象の二次側のローカル配列が対応するデータを特定する情報を含む。すなわち格納領域情報は少なくとも、図３０において、例えばノードの寸法Y[v]、分散種別、二次側ノード配列の各次元v = 1, ..., Vに対する、グローバル添字三つ組k1’[v], k2’[v], k3’[v]を含む。具体的な処理の詳細については、一例として、図７３〜７９を用いて後ほど説明する。
【０２２９】
実施形態においては、各々の三つ組パラメタ X1, X2, X3 は、添字のタイプが「スカラ」、「区間」または「三つ組」のときその添字を表現する。タイプが「三つ組」のとき、添字三つ組X1:X2:X3を意味する。タイプが「区間」のとき、下限がX1、上限がX2である区間を意味し、X3は意味をもたない。タイプが「スカラ」のとき、スカラ値X1を意味し、X2とX3は意味をもたない。
【０２３０】
（状態１プログラムの解析）
次に、状態１プログラムの解析について説明する。状態１プログラムの解析では、着目する通信に関連する情報を通信情報テーブルに格納する処理が実行される。解析部３３は、取得部３２が取得した状態１の通信が表現されているプログラムを入力として、状態１プログラムの解析を実行する。尚、状態１プログラムの解析では、送信ノードが一次側、受信ノードが二次側となる。
【０２３１】
図３１〜図３３は、状態１プログラムの解析のアルゴリズムの一例（その１〜その３）を示す。解析部３３は、図３１〜図３３に示す状態１プログラムの解析アルゴリズムの処理を実行することにより、着目する通信に関する情報が格納された通信情報テーブルを得る。
【０２３２】
（連続性優先pivoting手順）
次に、連続性優先pivoting手順について説明する。整列部３４は、通信情報テーブルと、一次側と二次側のどちらを優先するかを示す情報と、を入力として、連続性優先pivoting手順の処理を開始する。
【０２３３】
連続性優先pivoting手順の出力として、整列部３４は、通信データのD個の情報の並びがソートされた通信情報テーブルを取得する。すなわち、出力される通信情報テーブルにおいては、通信データのD個の情報の並びは、優先側のローカルデータができるだけ昇順にアクセスされるようにソートされ、それに合わせて変換テーブルUtoDとVtoDの値も変換される。
【０２３４】
連続性優先pivoting手順において、整列部３４は先ず、通信情報テーブルの中の通信データ次元dに対する項目N, j, DtoU, DtoV, jx1, jx2, jx3について、一次側優先の場合にはDtoUの値、二次側優先の場合にはDtoVの値をキーとして、昇順になるようソートする。キーの値が0または負数の場合は、１対１に対応するデータ次元がないことを意味するので、整列部３４は、大きなキーと見なして最後の位置に移動させる。そして整列部３４は、ソート前とソート後の位置dがどう変わったかを示す新旧テーブルを作成する。
【０２３５】
そして整列部３４は、作成した新旧テーブルを参照して、UtoDとVtoDの値dを新しい値に置き換える。
【０２３６】
（連続データ単位検出手順）
次に、連続データ単位検出手順について説明する。検出部３５は、通信情報テーブルを入力として、連続データ単位検出手順を実行する。
【０２３７】
図３４は、連続データ単位検出手順のアルゴリズムの一例を示す。検出部３５は、図３４に示す連続データ単位検出手順のアルゴリズムの処理を実行することにより、出力として以下の情報を得る。すなわち、連続データ単位検出手順の出力として、検出部３５は、一次側データが次元を跨いで連続であるローカルインデックス範囲Ic = (ic[1], ..., ic[Uc])、及び、Icの次元数Uc（0≦Uc≦U）を得る。さらに連続データ単位検出手順の出力として検出部３５は、連続データ単位、すなわち、Icに対応する通信データインデックス範囲Jc = (jc[1], ..., jc[Dc])、Jcの次元数Dc（0≦Dc≦D, Dc≦Uc）、及び、IcのサイズLcを得る。ここでic[u]は、スカラic1[u]または区間ic1[u] : ic2[u] （1≦u≦Uc）である。
【０２３８】
尚、連続データ単位検出手順の結果はノード毎の判断の結果である。すなわち、出力値（戻り値）も、ノード毎に結果が異なることがある。
【０２３９】
（連続データ単位put手順）
次に、連続データ単位put手順について説明する。通信部３６は、連続データ単位リスト（以下、Jc-listと記す場合がある）、Jcの連続次元数Dc（0≦Dc≦D）、及び通信情報テーブルを入力として、連続データ単位put手順の処理を開始する。
【０２４０】
Jc-listは、連続データ単位Jcのリスト（初期状態は単一要素）である。各Jcは、下位Dc次元について添字がスカラ、区間または三つ組jc[d] = jc1[d] : jc2[d] : jc3[d](1≦d≦Dc)で表現され、上位次元jc[d]（Dc+1≦d≦D）はスカラである。各Jcは、配列要素の並び順に次元を跨いで一次側データが連続で、かつ、Jc間はその並び順に一次側データが連続している。
【０２４１】
図３５は、連続データ単位put手順のアルゴリズムの一例を示す。図３５に示すアルゴリズムを実行することにより通信部３６は、Jc-listに含まれるJcをすべてput通信する。
【０２４２】
図３６は、連続データ単位put手順の処理を図解したフローチャートの一例である。図３６において先ず、通信部３６は、連続データ単位put手順において未処理の連続データが存在するか否かを判定する（Ｓ２０１）。すなわち通信部３６は、Jc-listが空か否かを判定する。未処理の連続データが存在しないと判定した場合（Ｓ２０１でＮｏ）、処理は終了する。
【０２４３】
一方、未処理の連続データが存在すると通信部３６により判定された場合（Ｓ２０１でＹｅｓ）、検出部３５は、連続-連続データ単位検出手順を実行する（Ｓ２０２）。連続‐連続データ単位検出手順により、検出部３５は、一次側と二次側で共通して連続であるデータ単位を検出する。具体的には検出部３５は、Jcと起点を同じくし、かつ、一次側、二次側とも次元を跨いで連続になるJcの部分配列Jccと、その通信データの次元数（連続‐連続次元）Dcc（0≦Dcc≦Dc）を得る。同時に検出部３５は、JcからJccを除いた部分Jcr-listを得る。連続‐連続データ単位検出手順の詳細については後ほど説明する。
【０２４４】
次に通信部３６は、連続-連続データ単位put手順を実行する（Ｓ２０３）。ここで通信部３６は、Jccを通信データ単位とする。連続-連続データ単位put手順により、通信部３６は、通信データ単位について、一次側から二次側へputする。すなわち通信部３６は、送信側と受信側で共通に連続であるデータ単位で、一次側から二次側へデータをputする。これにより、通信の効率化を図ることができる。連続-連続データ単位put手順の詳細については後ほど説明する。
【０２４５】
次に通信部３６は、Jc-listの先頭に、Jcr-listを追加結合する。そして通信部３６は、再度Ｓ２０１の処理を実行する。
【０２４６】
（連続‐連続データ単位検出手順）
次に、連続‐連続データ単位検出手順について説明する。検出部３５は、連続データ単位Jc = (jc[1], ..., jc[D])、Jcの連続次元数Dc（0≦Dc≦D）、及び通信情報テーブルを入力として、連続‐連続データ単位検出手順の処理を開始する。ここで、連続データ単位Jcは、対応する一次側データが次元を跨いで連続である通信データインデックス範囲である。
【０２４７】
図３７及び図３８は、連続‐連続データ単位検出手順のアルゴリズムの一例（その１、その２）を示す。図３７及び図３８で示す連続‐連続データ単位検出手順のアルゴリズムを実行することにより、検出部３５は出力として、以下の情報を得る。すなわち検出部３５は、連続‐連続データ単位Jcc = (jcc[1], ..., jcc[D])、連続‐連続データ単位残余リストJcr-list = ( ) または( Jcr )、及び、連続-連続データ単位の長さLccを得る。さらに検出部３５は、通信データの連続‐連続データ単位次元数Dcc、二次側ノードインデックスycc = (ycc[1], ..., ycc[V])、及び二次側ローカルインデックス起点Icc1’ = (icc1’[1], ..., icc1’[V])を得る。
【０２４８】
連続‐連続データ単位Jcc = (jcc[1], ..., jcc[D])は、Jcの部分配列であり、起点(jc1[1], ..., jc1[D])を共通にし、かつ、対応する一次側ノードと二次側ノードのローカルデータが共に連続であるインデックス範囲である。対応する二次側のローカルデータは次元を跨ぐ連続でもよい。ただし対応する二次側のローカルデータは、複数の二次側ノードに跨ることはない。jcc[d]は、スカラjcc1[d]、もしくは、区間または三つ組jcc1[d]:jcc2[d]:jcc3[d] （1≦d≦Dc）で表現される。
【０２４９】
ある次元Dcc（1≦Dcc≦Dc）が存在し、d<Dccに対し、jcc1[d] = jc1[d], jcc2[d] = jc2[d], jcc3[d] = jc3[d]である。また、d=Dccに対し、jcc1[d] = jc1[d], jc1[d]≦jcc2[d]≦jc2[d], jcc3[d] = jc3[d]である。また、d>Dccに対し、jcc[d]はスカラであり、jcc1[d] = jc1[d]である。
【０２５０】
連続‐連続データ単位残余リストJcr-list = ( ) または( Jcr )は、JcからJccを除いた残りの部分である。連続‐連続データ単位残余リストJcr-list = ( ) または( Jcr )の要素数は0または1となる。
【０２５１】
図３８の「4 Jcr-listを得る」についての処理の様子を図３９に示す。図３９は、Dc = 3, Dcc = 1でjc3[1] = jc3[2] = jc3[3] = 1の場合の例であり、dd = 1から3までの反復でJcr-listには次に通信を生成すべき３つの多次元矩形が設定される。
【０２５２】
（連続-連続データ単位put手順）
次に、連続-連続データ単位put手順について説明する。通信部３６は、以下のデータ項目を入力として、連続-連続データ単位put手順の処理を開始する。入力はすなわち、通信データ単位Jcc = (jcc[1], ..., jcc[D])、連続‐連続次元数Dcc、及び、二次側（受信側）ノードインデックスycc = (ycc[1], ..., ycc[V])である。これらに加えて、入力は、二次側ローカルインデックスの起点icc1’ = (icc1’[1], ..., icc1’[V])、通信データ単位の長さLcc、及び、通信情報テーブルである。
【０２５３】
図４０は、連続-連続データ単位put手順のアルゴリズムの一例を示す。図４０に示すアルゴリズムの処理を実行することにより、通信部３６は、連続-連続データ単位で、一次ノードから二次ノードへデータをputする。
【０２５４】
（バッファありPut通信）
実施形態に係るバッファありPut通信において、通信データは一次側ノードxから二次側ノードyに送信される。一度にputする通信データ単位は、一次側では効率のよいバッファリングが可能で、かつ、二次側ではデータが連続している範囲とする。データは、通信データ単位毎に分けられ、一次側ではバッファを介して、二次側ではバッファを介さずput通信される。通信データ単位には、一次側は三つ組で表される領域、二次側は連続である領域であるJtcが選択される。
【０２５５】
図４１は、実施形態に係るバッファありPut通信の処理を図解したフローチャートの一例である。
【０２５６】
図４１において先ず取得部３２は、Put通信の指示を受信する（Ｓ３０１）。このPut通信の指示は、状態１の通信が表現されているプログラムである。このプログラムは、具体的には例えば、グローバル配列間の代入の形式で表現されるプログラムである。
【０２５７】
次に、解析部３３は、状態１プログラムの解析を行う（Ｓ３０２）。状態１プログラムの解析により解析部３３は、着目する通信に関連する情報を通信情報テーブルに格納する。この状態１プログラムの解析は、実施形態に係るバッファなしPut通信において説明したものと同様である。
【０２５８】
次に整列部３４は、連続性優先pivoting手順を実行する（Ｓ３０３）。連続性優先pivoting手順を実行することにより整列部３４は、二次側データのアクセスができるだけ連続になり、一次側データの下位インデックスのアクセスが出来るだけ矩形になるように、通信データのインデックスを並び替える。尚、整列部３４は、一次側データを優先して通信データのインデックスを並び替えてもよい。また、Ｓ３０３は、実行されなくてもよい。この連続性優先pivoting手順は、実施形態に係るバッファなしPut通信において説明したものと同様である。
【０２５９】
次に検出部３５は、矩形データ単位検出手順を実行する（Ｓ３０４）。矩形データ単位検出手順を実行することにより検出部３５は、一次側自ノードにおいて三つ組またはスカラで表現できる通信インデックスの範囲（矩形データ単位）を検出する。これにより検出部３５は、矩形データ単位の下位インデックスJt = (jt[1], ..., jt[Dt])と次元数Dt（0≦Dt≦D）を得る。同時に検出部３５は、Jt, Dtに対応する一次側の下位ローカルインデックス範囲It = (it[1], ..., it[Ut])と次元数Ut（0≦Ut≦U）を得る。この手順で得られる値は一次側のノード毎に異なる。
【０２６０】
次に通信部３６は、矩形データput処理を実行する（Ｓ３０５）。すなわち通信部３６は、矩形データ単位ごとの処理を反復して実施する。図４２は矩形データput処理の一例を示す。図４２において、各ループでは、矩形データ単位put手順が実行されている。矩形データ単位put手順については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現してもよい。
【０２６１】
ここで図４２において、通信部３６は、jx1[d], jx2[d], jx3[d]（Dt+1≦d≦D）を通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部３６は、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するすべてのjx[d]について反復実行する（u = DtoU[d]）。
【０２６２】
矩形データ処理の実行が完了すると、処理は終了する。
【０２６３】
（矩形データ単位検出手順）
次に、矩形データ単位検出手順について説明する。検出部３５は、通信情報テーブルを入力として、矩形データ単位検出手順の処理を開始する。
【０２６４】
図４３は、矩形データ単位検出手順のアルゴリズムの一例を示す。図４３に示す矩形データ単位検出手順のアルゴリズムを実行することにより、検出部３５は、出力として以下の情報を得る。すなわち矩形データ単位検出手順の出力として検出部３５は、一次側データが矩形状であるローカルインデックス範囲It = (it[1], ..., it[Ut])、及び、Itの次元数Ut（0≦Ut≦U）を得る。さらに、矩形データ単位検出手順の出力として検出部３５は、矩形データ単位、すなわち、Itに対応する通信データインデックス範囲Jt = (jt[1], ..., jt[Dt])、Jtの次元数Dt（0≦Dt≦D）、及び、ItのサイズLtを得る。ここでit[u]は、スカラit1[u]、区間または三つ組it1[u] : it2[u] : it3[u] （1≦u≦Ut）である。
【０２６５】
尚、矩形データ単位検出手順の結果はノード毎の判断の結果である。すなわち、出力値（戻り値）も、ノード毎に結果が異なることがある。
【０２６６】
（矩形データ単位put手順）
次に、矩形データ単位put手順について説明する。通信部３６は、矩形データ単位リスト（以下、Jt-listと記す場合がある）、Jtの矩形次元数Dt（0≦Dt≦D）、及び、信情報テーブルを入力として、矩形データ単位put手順の処理を開始する。
【０２６７】
矩形データ単位put手順において、入力となるJt-listは、矩形データ単位Jtのリスト（初期状態は単一要素）である。また各Jtは、下位Dt次元について添字がスカラ、区間または三つ組jt[d] = jt1[d] : jt2[d] : jt3[d](1≦d≦Dt)で表現され、上位次元jt[d]（Dt+1≦d≦D）はスカラである。
【０２６８】
図４４は、矩形データ単位put手順のアルゴリズムの一例を示す。図４４に示す矩形データ単位put手順を実行することにより通信部３６は、Jt-listに含まれるJtをすべてput通信する。
【０２６９】
図４５は、矩形データ単位put手順の処理を図解したフローチャートの一例である。図４５において先ず、通信部３６は、矩形データ単位put手順において未処理の矩形データが存在するか否かを判定する（Ｓ４０１）。すなわち通信部３６は、Jt-listが空か否かを判定する。未処理の矩形データが存在しないと判定した場合（Ｓ４０１でＮｏ）、処理は終了する。
【０２７０】
一方、未処理の矩形データが存在すると通信部３６により判定された場合（Ｓ４０１でＹｅｓ）、検出部３５はJt-listの先頭からJt-listの要素を１つ取り出して、Jtとする。そして検出部３５は、取り出したJtに対して、矩形‐連続データ単位検出手順を実行する（Ｓ４０２）。矩形‐連続データ単位検出手順により、検出部３５は、一次側において矩形データであって、二次側において連続であるデータ単位を検出する。具体的には検出部３５は、Jtと起点を同じくし、かつ、二次側が次元を跨いで連続になるJtの部分配列Jtcと、その通信データの次元数（矩形-連続次元）Dtc（0≦Dtc≦Dt）を得る。また同時に検出部３５は、JtからJtcを除いた部分Jtr-listを得る。矩形‐連続データ単位検出手順の詳細については後ほど説明する。
【０２７１】
次に通信部３６は、矩形-連続データ単位put手順を実行する（Ｓ４０３）。ここで通信部３６は、Jtcを、通信データ単位とする。矩形‐連続データ単位put手順において、バッファ制御部３８は、通信データ単位について、一次側でデータをバッファリングする。その後、通信部３６は、バッファから通信データ単位で、データを二次側へputする。ここで通信部３６は、二次側の連続区間を事前に検出し、データが格納された領域とバッファの間で単純なメモリコピーを行うため、通信の効率化を図ることができる。また通信部３６は、受信側で連続であるデータ単位で、一次側から二次側へデータをputする。これにより、一度の通信で大きなサイズのデータを送信することができ、通信の効率化を図ることができる。矩形-連続データ単位put手順の詳細については後ほど説明する。
【０２７２】
次に通信部３６は、Jt-listの先頭に、Jtr-listを追加結合する。そして通信部３６は、再度Ｓ４０１の処理を実行する。
【０２７３】
（矩形‐連続データ単位検出手順）
次に、矩形‐連続データ単位検出手順について説明する。検出部３５は、矩形データ単位Jt = (jt[1], ..., jt[D])、Jtの次元数Dt（0≦Dt≦D）、Jtの上位インデックス(jt[Dt+1], ..., jt[D])、及び、通信情報テーブルを入力として、矩形‐連続データ単位検出手順の処理を開始する。ここで、矩形データ単位Jtは、対応する一次側データが区間、三つ組またはスカラで表現される通信インデックス範囲である。
【０２７４】
図４６及び図４７は、矩形‐連続データ単位検出手順のアルゴリズムの一例（その１、その２）を示す。図４６及び図４７に示す矩形‐連続データ単位検出手順を実行することにより、検出部３５は出力として、以下の情報を得る。すなわち検出部３５は、矩形‐連続データ単位Jtc = (jtc[1], ..., jtc[D])、矩形‐連続データ単位残余リストJtr-list、及び、矩形-連続データ単位の長さLtcを得る。さらに検出部３５は、通信データの矩形‐連続データ単位次元数Dtc、二次側ノードインデックスytc = (ytc[1], ..., ytc[V])、及び、二次側ローカルインデックス起点Itc1’ = (itc1’[1], ..., itc1’[V])を得る。
【０２７５】
矩形‐連続データ単位Jtc = (jtc[1], ..., jtc[D])は、Jtの部分配列であり、起点(jt1[1], ..., jt1[D])を共通にし、かつ、対応する二次側のローカルデータが連続であるインデックス範囲である。対応する二次側のローカルデータは次元を跨ぐ連続であってもよい。ただし、対応する二次側のローカルデータは複数の二次側ノードに跨ることはない。jtc[d]はスカラjtc1[d]、もしくは、区間または三つ組jtc1[d]:jtc2[d]:jtc3[d] （1≦d≦Dt）で表現される。
【０２７６】
ある次元Dtc（1≦Dtc≦Dt）が存在し、d<Dtcのとき、jtc1[d] = jt1[d], jtc2[d] = jt2[d], jtc3[d] = jt3[d]である。また、d=Dtcのとき、jtc1[d] = jt1[d], jt1[d]≦jtc2[d]≦jt2[d], jtc3[d]はjt3[d]の倍数である。また、d>Dtcのとき、jtc[d]はスカラであり、jtc1[d] = jt1[d]である。
【０２７７】
矩形‐連続データ単位残余リストJtr-listは、JtからJtcを除いた残りの部分である。尚、矩形‐連続データ単位残余リストJtr-listの要素数は0以上である。
【０２７８】
（矩形-連続データ単位put手順）
次に、矩形-連続データ単位put手順について説明する。通信部３６は、以下のデータ項目を入力として、矩形-連続データ単位put手順の処理を開始する。入力はすなわち、通信データ単位Jtc = (jtc[1], ..., jtc[D])、矩形‐連続次元数Dtc、及び、二次側（受信側）ノードインデックスytc = (ytc[1], ..., ytc[DtoV[Dtc]])である。これらに加えて、入力は、二次側ローカルインデックスの起点itc1’ = (itc1’[1], ..., itc1’[DtoV[Dtc]])、通信データ単位の長さLtc、及び、通信情報テーブルである。
【０２７９】
矩形-連続データ単位put手順において、通信部３６は、矩形-連続データ単位で、一次ノードから二次ノードへデータをputする。図４８は、矩形-連続データ単位put手順の処理を図解したフローチャートの一例を示す。
【０２８０】
図４８において、通信部３６は、先ず、二次側のノードインデックス、及び、二次側のローカルインデックスの起点の上位インデックスを取得する（Ｓ４１１）。すなわち通信部３６は、ytcとitc1’の上位インデックスを得る。具体的には通信部３６は、すべてのv = DtoV[Dtc] + 1, ..., Vについて、以下の処理を実行する。
【０２８１】
ytc[v] = gtopB(gv(jtc1))
itc1’[v] = gtolB(gv(jtc1))
【０２８２】
次にバッファ確保部３７は、送信バッファSendBufを長さLtcで確保する（Ｓ４１２）。次にバッファ制御部３８は、矩形データ単位pack手順により、Jtcに対応する一次側ローカルデータを、SendBufに集める（Ｓ４１３）。矩形データ単位pack手順の詳細については、後ほど説明する。
【０２８３】
次に通信部３６は、ＭＰＩライブラリなどを使って、SendBufの先頭から長さLtcの連続データを、ノードytcのb(itc1’)からの連続領域にputする（Ｓ４１４）。
【０２８４】
次にバッファ確保部３７は、Ｓ４１２で確保した送信バッファSendBufの領域を解放する（Ｓ４１５）。そして処理は終了する。
【０２８５】
（矩形データ単位pack手順）
次に、矩形データ単位pack手順について説明する。バッファ制御部３８は、以下のデータ項目を入力として、矩形データ単位pack手順の処理を開始する。入力はすなわち、各次元が三つ組パラメタで表現できる矩形データ単位Jt = (jt[1], ..., jt[Dt])、矩形次元数Dt、上位次元 (jt[Dt+1], ..., jt[D])、送信バッファSendBufの先頭アドレス、及び、通信情報テーブルである。ただし、各次元が三つ組パラメタで表現できる矩形データ単位Jt = (jt[1], ..., jt[Dt])は、１つの送信先ノードに対応する。
【０２８６】
図４９は、矩形データ単位pack手順のアルゴリズムの一例を示す。図４９に示す矩形データ単位pack手順を実行することにより、バッファ制御部３８は、矩形データ単位に対応する自ノードのローカルデータを、送信バッファに集約（pack）する。バッファ制御部３８は、ローカルデータの連続性を考慮したメモリコピーを実行しているため、pack処理を高速化できる。また、図４９においてバッファ制御部３８は、一次側データを長さLcの連続区間ごとに反復してpack処理を行うことで、pack処理を高速化できる。
【０２８７】
（バッファなしGet通信）
実施形態に係るバッファなしGet通信において、一次側ノードxは、二次側ノードyからデータを受け取る。一度にgetする通信データ単位は、一次側と二次側で対応するデータが共に連続している範囲となる。データは、通信データ単位毎に分けられ、一次側も二次側もバッファなしでget通信される。通信データ単位にはxとyで共通に連続な区間Jccが選択される。
【０２８８】
図５０は、実施形態に係るバッファなしGet通信の処理を図解したフローチャートの一例である。
【０２８９】
図５０において先ず取得部３２は、Get通信の指示を受信する（Ｓ５０１）。このGet通信の指示は、状態２の通信が表現されているプログラムである。このプログラムは、具体的には例えば、グローバル配列間の代入の形式で表現されるプログラムである。
【０２９０】
次に解析部３３は、状態２プログラムの解析を行う（Ｓ５０２）。状態２プログラムの解析により解析部３３は、着目する通信に関連する情報を通信情報テーブルに格納する。状態２プログラムの解析の詳細については、後ほど説明する。
【０２９１】
次に整列部３４は、連続性優先pivoting手順を実行する（Ｓ５０３）。連続性優先pivoting手順を実行することにより整列部３４は、一次側または二次側データのアクセスができるだけ連続になるように、通信データのインデックスを並び替える。尚、Ｓ５０３は、実行されなくてもよい。この連続性優先pivoting手順は、実施形態に係るバッファなしPut通信において説明したものと同様である。
【０２９２】
次に検出部３５は、連続データ単位検出手順を実行する（Ｓ５０４）。連続データ単位検出手順を実行することにより検出部３５は、一次側自ノードにおいて次元を跨いで連続する通信インデックスの範囲（連続データ単位）を検出する。これにより検出部３５は、連続データ単位の下位インデックスJc = (jc[1], ..., jc[Dc])と次元数Dc（0≦Dc≦D）を得る。同時に検出部３５は、Jc, Dcに対応する一次側の下位ローカルインデックス範囲Ic = (ic[1], ..., ic[Uc])と次元数Uc（0≦Uc≦U）を得る。この手順で得られる値は一次側のノード毎に異なる。この連続データ単位検出手順は、実施形態に係るバッファなしPut通信において説明したものと同様である。
【０２９３】
次に通信部３６は、連続データget処理を実行する（Ｓ５０５）。すなわち通信部３６は、一次側が連続なデータ単位ごとの処理を反復して実施する。図５１は、連続データget処理の詳細の一例を示す。図５１において、各ループでは、連続データ単位get手順が実行されている。連続データ単位get手順については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現してもよい。
【０２９４】
ここで図５１において、通信部３６は、jx1[d], jx2[d], jx3[d]（Dc+1≦d≦D）を通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部３６は、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するすべてのjx[d]について、処理を反復実行する（u = DtoU[d]）。
【０２９５】
連続データget処理の実行が完了すると、処理は終了する。
【０２９６】
（状態２プログラムの解析）
次に、状態２プログラムの解析について説明する。状態２プログラムの解析では、着目する通信に関連する情報を通信情報テーブルに格納する処理が実行される。解析部３３は、取得部３２が取得した状態２の通信が表現されているプログラムを入力として、状態２プログラムの解析を実行する。尚、状態２プログラムの解析では、受信ノードが一次側、送信ノードが二次側となる。
【０２９７】
状態２プログラムの解析の出力として、解析部３３は、着目する通信に関する情報が格納された通信情報テーブルを取得する。
【０２９８】
状態２プログラムの解析のアルゴリズムは、図３１及び図３２を参照して説明した状態１プログラムの解析のアルゴリズムと同様である。ただし、受信ノードが一次側、送信ノードが二次側となる。
【０２９９】
（連続データ単位get手順）
次に、連続データ単位get手順について説明する。通信部３６は、連続データ単位リストJc-list、Jcの連続次元数Dc（0≦Dc≦D）、及び通信情報テーブルを入力として、連続データ単位get手順の処理を開始する。
【０３００】
Jc-listは、連続データ単位Jcのリスト（初期状態は単一要素）である。各Jcは、下位Dc次元について添字が三つ組jc[d] = jc1[d] : jc2[d] : jc3[d (1≦d≦Dc)で表現され、上位次元jc[d]（Dc+1≦d≦D）はスカラである。各Jcは、配列要素の並び順に次元を跨いで一次側データが連続で、かつ、Jc間はその並び順に一次側データが連続している。
【０３０１】
図５２は、連続データ単位get手順のアルゴリズムの一例を示す。図５２に示す連続データ単位get手順を実行することにより通信部３６は、Jc-listに含まれるJcをすべてget通信する。
【０３０２】
図５３は、連続データ単位get手順の処理を図解したフローチャートの一例である。図５３において先ず、通信部３６は、連続データ単位get手順において未処理の連続データが存在するか否かを判定する（Ｓ６０１）。すなわち通信部３６は、Jc-listが空か否かを判定する。未処理の連続データが存在しないと判定した場合（Ｓ６０１でＮｏ）、処理は終了する。
【０３０３】
一方、未処理の連続データが存在すると通信部３６により判定された場合（Ｓ６０１でＹｅｓ）、検出部３５は、連続-連続データ単位検出手順を実行する（Ｓ６０２）。連続‐連続データ単位検出手順により、検出部３５は、一次側と二次側で共通して連続であるデータ単位を検出する。具体的には検出部３５は、Jcと起点を同じくし、かつ、一次側、二次側とも次元を跨いで連続になるJcの部分配列Jccと、その通信データの次元数（連続‐連続次元）Dcc（0≦Dcc≦Dc）を得る。同時に検出部３５は、JcからJccを除いた部分Jcr-listを得る。この連続-連続データ単位検出手順は、実施形態に係るバッファなしPut通信において説明したものと同様である。
【０３０４】
次に通信部３６は、連続-連続データ単位get手順を実行する（Ｓ６０３）。ここで通信部３６は、Jccを通信データ単位とする。連続-連続データ単位get手順により、通信部３６は、通信データ単位について、二次側から一次側にgetする。すなわち通信部３６は、送信側と受信側で共通に連続であるデータ単位で、二次側から一次側にデータをgetする。これにより、通信の効率化を図ることができる。連続-連続データ単位get手順の詳細については後ほど説明する。
【０３０５】
次に通信部３６は、Jc-listの先頭に、Jcr-listを追加結合する。そして通信部３６は、再度Ｓ６０１の処理を実行する。
【０３０６】
（連続-連続データ単位get手順）
次に、連続-連続データ単位get手順について説明する。通信部３６は、以下のデータ項目を入力として、連続-連続データ単位get手順の処理を開始する。入力はすなわち、通信データ単位Jcc = (jcc[1], ..., jcc[D])、連続‐連続次元数Dcc、及び、二次側（受信側）ノードインデックスycc = (ycc[1], ..., ycc[V])である。これらに加えて、入力は、二次側ローカルインデックスの起点icc1’ = (icc1’[1], ..., icc1’[V])、通信データ単位の長さLcc、及び、通信情報テーブルである。
【０３０７】
連続-連続データ単位get手順において、通信部３６は、送信側と受信側で共通に連続であるデータ単位で、二次ノードから一次ノードへデータをgetする。
【０３０８】
図５４は、連続-連続データ単位get手順のアルゴリズムの一例を示す。通信部３６は、先ず、Jccに対応する一次側ローカルインデックスの起点icc1 = (icc1[1], ..., icc1[U])を得る。具体的には通信部３６は、すべてのu = 1, ..., DtoU[Dcc]について、以下の処理を実行する。
【０３０９】
d = UtoD[u]
icc1[u] = i1[u] + jcc1[U] * i3[u]
【０３１０】
次に通信部３６は、すべてのu = DtoU[Dcc] + 1, ..., Uについて、以下の処理を実行する。
【０３１１】
icc1[u] = gtolA(fu(jcc1))
【０３１２】
このようにして、一次側ローカルインデックスの起点icc1を取得すると、通信部３６は、ＭＰＩライブラリなどを使って、ノードyccの配列要素b(icc1’)から長さLccの連続データを、自ノードの配列要素a(icc1)からの連続領域にgetする。そして処理は終了する。
【０３１３】
（バッファありGet通信）
実施形態に係るバッファありGet通信において、一次側ノードxは、二次側ノードyからデータを受け取る。一度にgetする通信データ単位は、二次側ではデータが連続していて、かつ、一次側では効率のよいアンバッファリングが可能な範囲とする。データは、通信データ単位毎に分けられ、一次側ではバッファを介して、二次側ではバッファを介さずget通信される。通信データ単位には、一次側は三つ組で表現できる領域、二次側は連続である領域であるJtcが選択される。
【０３１４】
図５５は、実施形態に係るバッファありGet通信の処理を図解したフローチャートの一例である。
【０３１５】
図５５において先ず取得部３２は、Get通信の指示を受信する（Ｓ７０１）。このGet通信の指示は、状態２の通信が表現されているプログラムである。このプログラムは、具体的には例えば、グローバル配列間の代入の形式で表現されるプログラムである。
次に解析部３３は、状態２プログラムの解析を行う（Ｓ７０２）。状態２プログラムの解析を行うことにより解析部３３は、着目する通信に関連する情報を通信情報テーブルに格納する。この状態１プログラムの解析は、実施形態に係るバッファなしGet通信において説明したものと同様である。
【０３１６】
次に整列部３４は、連続性優先pivoting手順を実行する（Ｓ７０３）。連続性優先pivoting手順を実行することにより整列部３４は、二次側データのアクセスができるだけ連続になり、一次側データの下位インデックスのアクセスが出来るだけ矩形になるように、通信データのインデックスを並び替える。尚、整列部３４は、一次側データを優先して通信データのインデックスを並び替えてもよい。また、Ｓ７０３は、実行されなくてもよい。この連続性優先pivoting手順は、実施形態に係るバッファなしPut通信において説明したものと同様である。
【０３１７】
次に検出部３５は、矩形データ単位検出手順を実行する（Ｓ７０４）。矩形データ単位検出手順を実行することにより検出部３５は、一次側自ノードにおいて三つ組またはスカラで表現できる通信インデックスの範囲（矩形データ単位）を検出する。これにより検出部３５は、矩形データ単位の下位インデックスJt = (jt[1], ..., jt[Dt])と次元数Dt（0≦Dt≦D）を得る。同時に検出部３５は、Jt, Dtに対応する一次側の下位ローカルインデックス範囲It = (it[1], ..., it[Ut])と次元数Ut（0≦Ut≦U）を得る。この手順で得られる値は一次側のノード毎に異なる。この矩形データ単位検出手順は、実施形態に係るバッファありPut通信において説明したものと同様である。
【０３１８】
次に通信部３６は、矩形データget処理を実行する（Ｓ７０５）。すなわち通信部３６は、矩形データ単位ごとの処理を反復して実施する。図５６は矩形データget処理の詳細の一例を示す。図５６において、各ループでは、矩形データ単位get手順が実行されている。矩形データ単位get手順については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現してもよい。
【０３１９】
ここで図５６において、通信部３６は、jx1[d], jx2[d], jx3[d]（Dt+1≦d≦D）を通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部３６は、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するすべてのjx[d]について、処理を反復実行する（u = DtoU[d]）。
【０３２０】
矩形データ処理の実行が完了すると、処理は終了する。
【０３２１】
（矩形データ単位get手順）
次に、矩形データ単位get手順について説明する。通信部３６は、矩形データ単位リストJt-list、Jtの矩形次元数Dt（0≦Dt≦D）、及び、通信情報テーブルを入力として、矩形データ単位get手順の処理を開始する。
【０３２２】
矩形データ単位get手順において入力となるJt-listは、矩形データ単位Jtのリスト（初期状態は単一要素）である。また各Jtは、下位Dt次元について添字が三つ組jt[d] = jt1[d] : jt2[d] : jt3[d] (1≦d≦Dt)で表現され、上位次元jt[d]（Dt+1≦d≦D）はスカラである。
【０３２３】
図５７は、矩形データ単位get手順のアルゴリズムの一例を示す。図５７に示す矩形データ単位get手順を実行することにより通信部３６は、Jt-listに含まれるJtをすべてget通信する。
【０３２４】
図５８は、矩形データ単位get手順の処理を図解したフローチャートの一例である。図５８において先ず、通信部３６は、矩形データ単位get手順において未処理の矩形データが存在するか否かを判定する（Ｓ８０１）。すなわち通信部３６は、Jt-listが空か否かを判定する。未処理の矩形データが存在しないと判定した場合（Ｓ８０１でＮｏ）、処理は終了する。
【０３２５】
一方、未処理の矩形データが存在すると通信部３６により判定された場合（Ｓ８０１でＹｅｓ）、検出部３５はJt-listの先頭からJt-listの要素を１つ取り出して、Jtとする。そして検出部３５は、取り出したJtに対して、矩形‐連続データ単位検出手順を実行する（Ｓ８０２）。矩形‐連続データ単位検出手順により、検出部３５は、一次側において矩形データであって、二次側において連続であるデータ単位を検出する。具体的には検出部３５は、Jtと起点を同じくし、かつ、二次側が次元を跨いで連続になるJtの部分配列Jtcと、その通信データの次元数（矩形-連続次元）Dtc（0≦Dtc≦Dt）を得る。また同時に検出部３５は、JtからJtcを除いた部分Jtr-listを得る。この矩形‐連続データ単位検出手順は、実施形態に係るバッファありPut通信において説明したものと同様である。
【０３２６】
次に通信部３６は、矩形-連続データ単位get手順を実行する（Ｓ８０３）。ここで通信部３６は、Jtcを、通信データ単位とする。矩形-連続データ単位get手順により、通信部３６は、通信データ単位で、二次側から一次側の受信バッファへデータをgetする。ここで通信部３６は、一次側の連続区間を事前に検出し、データとバッファの間で単純なメモリコピーを行うため、通信の効率化を図ることができる。また通信部３６は、送信側で連続であるデータ単位で、二次側から一次側へデータをgetする。これにより、通信の効率化を図ることができる。矩形-連続データ単位get手順の詳細については後ほど説明する。
【０３２７】
次に通信部３６は、Jt-listの先頭に、Jtr-listを追加結合する。そして通信部３６は、再度Ｓ８０１の処理を実行する。
【０３２８】
（矩形-連続データ単位get手順）
次に、矩形-連続データ単位get手順について説明する。通信部３６は、以下のデータ項目を入力として、矩形-連続データ単位get手順の処理を開始する。入力はすなわち、通信データ単位Jtc = (jtc[1], ..., jtc[D])、矩形‐連続次元数Dtc、及び、二次側（送信側）ノードインデックスytc = (ytc[1], ..., ytc[DtoV[Dtc]])である。これらに加えて、入力は、二次側ローカルインデックスの起点itc1’ = (itc1’[1], ..., itc1’[DtoV[Dtc]])、通信データ単位の長さLtc、及び、通信情報テーブルである。
【０３２９】
矩形-連続データ単位get手順において、通信部３６は、矩形-連続データ単位で、二次ノードから一次ノードにデータをgetする。
【０３３０】
図５９は、矩形-連続データ単位get手順の処理を図解したフローチャートの一例を示す。通信部３６は、先ず、二次側のノードインデックス、及び、二次側のローカルインデックスの起点の上位インデックスを取得する（Ｓ８１１）。すなわち通信部３６は、ytcとitc1’の上位インデックスを得る。具体的には通信部３６は、すべてのv = DtoV[Dtc] + 1, ..., Vについて、以下の処理を実行する。
【０３３１】
ytc[v] = gtopB(gv( jtc1 ))
itc1’[v] = gtolB(gv( jtc1 ))
【０３３２】
次にバッファ確保部３７は、受信バッファRecvBufを長さLtcで確保する（Ｓ８１２）。次に通信部３６は、ＭＰＩライブラリなどを使って、ノードytcのb( itc1’ ) から長さLtcの連続データを、RecvBufの先頭からの連続領域にgetする（Ｓ８１３）。
【０３３３】
次にバッファ制御部３８は、矩形データ単位unpack手順により、RecvBufからの長さLtcの連続データを、Jtcに対応する一次側ローカルデータに分配する（Ｓ８１４）。矩形データ単位unpack手順の詳細については、後ほど説明する。
【０３３４】
次にバッファ確保部３７は、Ｓ８１２で確保した受信バッファRecvBufの領域を解放する（Ｓ８１５）。そして処理を終了する。
【０３３５】
（矩形データ単位unpack手順）
次に、矩形データ単位unpack手順について説明する。バッファ制御部３８は、以下のデータ項目を入力として、矩形データ単位pack手順の処理を開始する。入力はすなわち、各次元が三つ組パラメタで表現できる矩形データ単位Jt = (jt[1], ..., jt[Dt])、矩形次元数Dt、上位次元 (jt[Dt+1], ..., jt[D])、受信バッファRecvBufの先頭アドレス、及び、通信情報テーブルである。ただし、各次元が三つ組パラメタで表現できる矩形データ単位Jt = (jt[1], ..., jt[Dt])は、１つの送信先ノードに対応する。
【０３３６】
図６０は、矩形データ単位unpack手順のアルゴリズムの一例を示す。図６０に示す矩形データ単位unpack手順を実行することにより、バッファ制御部３８は、受信バッファにあるデータを、矩形データ単位に対応する自ノードのローカルデータ領域に分配（unpack）する。バッファ制御部３８は、ローカルデータの連続性を考慮したメモリコピーを実行しているため、unpack処理を高速化できる。また、バッファ制御部３８は、連続区間ごとに反復して受信バッファからローカル配列に格納する処理を行うことで、unpack処理を高速化できる。
【０３３７】
（バッファあり両側通信）
実施形態に係るバッファあり両側通信において、一度に送受信する通信データ単位は、送信側では効率のよいpackを伴うバッファリングが可能で、かつ、受信側では効率のよいunpackを伴うアンバッファリングが可能なデータの範囲とする。データは、通信データ単位毎に分けられ、送信側も受信側もバッファを介して両側通信（two-sided communication）される。通信データ単位には、送信側ノードxと受信側ノードyで共通に、区間または三つ組で表現される領域Jtが選択される。
【０３３８】
図６１は、実施形態に係るバッファあり両側通信の処理を図解したフローチャートの一例である。尚、送信側ノードxと受信側ノードyのすべてが、図６１の処理を実施する。また、図６１の処理を実行するノード（自ノードと記す場合がある）は送信側と受信側のどちらかまたは両方に属す。
【０３３９】
図６１において先ず取得部３２は、両側通信の指示を受信する（Ｓ９０１）。この両側通信の指示は、状態３の通信が表現されているプログラムである。このプログラムは、具体的には例えば、グローバル配列間の代入の形式で表現されるプログラムである。
【０３４０】
次に、解析部３３は、状態３プログラムの解析を行う（Ｓ９０２）。状態３プログラムの解析を行うことにより解析部３３は、着目する通信に関連する情報を送信側と受信側の２つの通信情報テーブルに格納する。状態３プログラムの解析の詳細については、後ほど説明する。
【０３４１】
次に整列部３４は、矩形性優先pivoting手順を実行する（Ｓ９０３）。矩形性優先pivoting手順を実行することにより整列部３４は、送信側と受信側の下位インデックスのアクセスができるだけ矩形になるように、２つの通信データのインデックスを並び替える。尚、Ｓ９０３は、実行されなくてもよい。矩形性優先pivoting手順の詳細については、後ほど説明する。
【０３４２】
次に検出部３５は、共通矩形データ単位検出手順により、送信側と受信側に共通な、区間、三つ組またはスカラで表現できる範囲（共通矩形データ単位）を検出する（Ｓ９０４）。これにより検出部３５は、共通矩形データ単位の下位インデックスJt = (jt[1], ..., jt[Dt])と次元数Dt（0≦Dt≦D）を得る。ここで得られるJt, Dtは全ノードで同じ値である。
【０３４３】
次に通信部３６は、自ノードが、バッファあり両側通信において通信データを送信する送信ノードであるか否かを判定する（Ｓ９０５）。自ノードが送信ノードであると判定した場合（Ｓ９０５でＹｅｓ）、通信部３６は処理をＳ９０６に遷移させる。一方、自ノードが送信ノードでない、すなわち、受信ノードであると判定した場合（Ｓ９０５でＮｏ）、通信部３６は処理をＳ９０７に遷移させる。
【０３４４】
Ｓ９０６において、通信部３６は送信処理を実行する。すなわち通信部３６は、共通矩形データ単位ごとのsend処理を反復して実施する。図６２は、送信処理の詳細の一例を示す。図６２において、各ループでは、共通矩形データ単位送信処理が実行されている。共通矩形データ単位送信処理については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現してもよい。
【０３４５】
ここで図６２において、通信部３６は、jx1A[d], jx2A[d], jx3A[d]（Dt+1≦d≦D）を送信用の通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部３６は、すべてのjx[d] = 1, ..., N[d]-1のうち、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するjx[d]について、処理を反復実行する（u = DtoU[d]）。
【０３４６】
送信処理の実行が完了すると、処理は終了する。
【０３４７】
Ｓ９０７において、通信部３６は受信処理を実行する。すなわち通信部３６は、共通矩形データ単位ごとのrecieve処理を反復して実施する。図６３は、受信処理の詳細の一例を示す。図６３において、各ループでは、共通矩形データ単位受信処理が実行されている。共通矩形データ単位受信処理については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現してもよい。
【０３４８】
ここで図６２において、通信部３６は、jx1B[d], jx2B[d], jx3B[d]（Dt+1≦d≦D）を受信用の通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部３６は、すべてのjx[d] = 1, ..., N[d]-1のうち、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するjx[d]について、処理を反復実行する（u = DtoU[d]）。
【０３４９】
受信処理の実行が完了すると、処理は終了する。
【０３５０】
（状態３プログラムの解析）
次に、状態３プログラムの解析について説明する。状態３プログラムの解析では、着目する通信に関連する情報を通信情報テーブルに格納する処理が実行される。解析部３３は、取得部３２が取得した状態３の通信が表現されているプログラムを入力として、状態３プログラムの解析を実行する。
【０３５１】
状態３プログラムの解析の出力として、解析部３３は、着目する通信に関する情報が格納された送信側の通信情報テーブル及び受信側の通信情報テーブルを取得する。
【０３５２】
状態３プログラムの解析の処理は、送信側の通信情報テーブルの作成処理と、受信側の通信情報テーブルの作成処理の２つの処理を含む。送信側の通信情報テーブルの作成処理においては、解析部３３は、送信側を一次側、受信側を二次側として、図３１〜図３３を参照して説明した状態１プログラムの解析と同じ手順を実施する。受信側の通信情報テーブルの作成処理は、解析部３３は、受信側を一次側、送信側を二次側として、図３１〜図３３を参照して説明した状態１プログラムの解析と同じ手順を実施する。
【０３５３】
なお、送信側情報テーブルと受信側情報テーブルは、大部分が同じ情報を含むので、解析部３３は、一方を他方のコピーにするか共有することによって、作成手順の一部を省略してもよい。送信側情報テーブルと受信側情報テーブルの対応は以下のようになる。すなわち、通信データの次元数D、寸法N[d]、ループ変数名j[d]は、共通している。また、一方のUtoD, DtoUは、他方のVtoD, DtoVとそれぞれ同じである。そして、一方の一次側の情報は、他方の二次側の情報と同じである。ただし、一次側ローカル配列添字の情報は、そのデータを持っているノードにしか存在しない。
【０３５４】
（矩形性優先pivoting手順）
次に、矩形性優先pivoting手順について説明する。整列部３４は、送信側と受信側の通信情報テーブルを入力として、矩形性優先pivoting手順の処理を開始する。
【０３５５】
図６４は、矩形性優先pivoting手順のアルゴリズムの一例を示す。整列部３４は、図６４に示す矩形性優先pivoting手順を実行することにより、通信データのD個の情報の並びがソートされた、送信側と受信側の同じ２つの通信情報テーブルを得る。すなわち、出力される通信情報テーブルにおいては、通信データのD個の情報の並びは、優先側のローカルデータができるだけ昇順にアクセスされるようにソートされており、それに合わせて変換テーブルUtoDとVtoDの値も変換されている。
【０３５６】
（共通矩形データ単位検出手順）
次に、共通矩形データ単位検出手順について説明する。検出部３５は、送信側と受信側の通信情報テーブルを入力として、共通矩形データ単位検出手順の処理を開始する。
【０３５７】
共通矩形データ単位検出手順は送信側と受信側の全ノードに共通する値を返す。図６５は、共通矩形データ単位検出手順のアルゴリズムの一例を示す。検出部３５は、図６５に示す共通矩形データ単位検出手順を実行することにより、送信データと受信側データの交わりが区間または三つ組で表現できる、通信データインデックス範囲の次元数Dt（0≦Dt≦D）を得る。
【０３５８】
（共通矩形データ単位送信処理）
次に、共通矩形データ単位送信処理について説明する。通信部３６は、共通矩形データ単位Jt = (jt [1], ..., jt [D])、Jtの共通矩形次元数、及び、送信側の通信情報テーブルを入力として、共通矩形データ単位送信処理を実行する。ここで、Jtの共通矩形次元数は、すなわち矩形である下位インデックスの次元数Dt（0≦Dt≦D）である。
【０３５９】
共通矩形データ単位送信処理において、通信部３６は、共通矩形データ単位毎に、自ノードに確保したバッファを介して対応する全受信ノードにデータを送信する。
【０３６０】
尚、実施形態においては、同じ共通矩形データ単位について、すべての送信ノードと受信ノードが、それぞれ共通矩形データ単位send手順と共通矩形データ単位recv手順を、集団的（collective）に実施することを仮定している。
【０３６１】
図６６は、共通矩形データ単位送信処理の内容を図解したフローチャートの一例である。
【０３６２】
図６６において先ず、バッファ確保部３７は、送信バッファ準備手順により、共通矩形データ単位に対応して自ノードから二次側ノードへ送信するためのY[DtoV[1]] * ... * Y[DtoV[Dt]]本の送信バッファと、アクセスパターンの情報を獲得する（Ｓ１００１）。送信バッファ準備手順の詳細については後ほど説明する。
【０３６３】
次にバッファ制御部３８は、共通矩形データ単位pack手順により、ローカルデータを送信バッファに集約する（Ｓ１００２）。共通矩形データ単位pack手順の詳細については後ほど説明する。
【０３６４】
次に通信部３６は、共通矩形データ単位send手順により、送信バッファから二次側へデータを送信する（Ｓ１００３）。共通矩形データ単位send手順の詳細については後ほど説明する。そしてバッファ確保部３７は、送信バッファ領域を解放して処理を終了する。
【０３６５】
（送信バッファ準備手順）
次に送信バッファ準備手順について説明する。送信バッファ準備手順においては、送信側を一次側、受信側を二次側とする。バッファ確保部３７は、共通矩形次元数、及び、一次側の通信情報テーブルを入力として送信バッファ準備手順を実行する。ここで、共通矩形次元数は、すなわち、通信データの矩形である下位インデックスの次元数Dt（0≦Dt≦D）である。
【０３６６】
図６７は、送信バッファ準備手順のアルゴリズムの一例を示す。図６７に示す送信バッファ準備手順を実行することにより、バッファ確保部３７は出力として、共通矩形データ単位に対応する、バッファリングパターンのリストy_countList[Dt]を取得する。そして送信バッファ準備手順を実行することで、バッファ確保部３７は、共通矩形データ単位に対する二次側ノードインデックスに対応する、Y[DtoV[1]] * ... * Y[DtoV[Dt]]本の送信バッファSendBufを確保する。このようにバッファ確保部３７は、共通矩形データ単位に応じてバッファを確保することにより、確保するバッファのサイズを、通信で使用するバッファの最小限のサイズに抑えることができる。
【０３６７】
（共通矩形データ単位pack手順）
次に、共通矩形データ単位pack手順について説明する。バッファ制御部３８は、共通矩形データ単位Jt = (jt[1], ..., jt[D])、共通矩形次元数、バッファリングパターンのリストy_countList[Dt]、及び、一次側（送信側）の通信情報テーブルを入力として、共通矩形データ単位pack手順を実行する。ここで、共通矩形次元数は、すなわち矩形である下位インデックスの次元数Dt（0≦Dt≦D）である。
【０３６８】
図６８は、共通矩形データ単位pack手順のアルゴリズムの一例を示す。図６８に示す共通矩形データ単位pack手順を実行することにより、共通矩形データ単位pack手順において、バッファ制御部３８は、共通矩形データ単位の送信データを、送信バッファへ集約（pack）する。すなわちバッファ制御部３８は、共通矩形データ単位で、ローカル配列から送信データを取り出し、送信バッファに格納する。このようにバッファ制御部３８は、メモリ上のデータの連続性に基づいて、pack処理を実行するため、pack処理を高速化できる。
【０３６９】
図６８において、最内ループは、矩形データ単位pack手順を用いてさらに高速化を図ることもできる。また図６８において、バッファ制御部３８は多次元の連続性を抽出することもできる。
【０３７０】
（共通矩形データ単位send手順）
次に、共通矩形データ単位send手順について説明する。通信部３６は、以下のデータ項目を入力として、共通矩形データ単位send手順を実行する。入力はすなわち、共通矩形次元数Dt（0≦Dt≦D）、共通矩形データ単位Jt = (jt[1], ..., jt[D])、及び、送信側の通信情報テーブルである。これらに加えて、入力は、一次側（送信側）の送信バッファSendBuf[Y[DtoV[1]]]...[Y[DtoV[Dt]]]、及び送信バッファの次元dの各受信ノードインデックスに対応する寸法bufExtent[d][y[DtoV[d]]]である。
【０３７１】
図６９は、共通矩形データ単位send手順のアルゴリズムの一例を示す。図６９に示す共通矩形データ単位send手順を実行することにより、通信部３６は、共通矩形データ単位で、自ノードの送信バッファから対応する二次側ノードへデータを送信（send）する。
【０３７２】
通信部３６は、すべての送信バッファに対して、図６９に示すように、自ノードの送信バッファから二次側のノードへsendを発行する。このsend通信は、同じタグをもつrecv（receive）通信と対応付けられる。
【０３７３】
図６９において、タグは以下の計算値とすれば、一つの整数値とすることができる。(jt[Dt+1] + N[Dt+1] * (jt[Dt+2] + N[Dt+2] * (... jt[D]) ...)) mod m 
ここでmは、同じ送受信ノード間でのsend-recveive通信についてそれ以上の数の追い越しが起こらないと保証できる十分大きな数であればよい。
【０３７４】
（共通矩形データ単位受信処理）
次に、共通矩形データ単位受信処理について説明する。通信部３６は、共通矩形データ単位Jt = (jt[1], ..., jt[D])、Jtの矩形次元数、及び、受信側の通信情報テーブルを入力として、共通矩形データ単位受信処理を実行する。ここで、Jtの矩形次元数は、すなわち矩形である下位インデックスの次元数Dt（0≦Dt≦D）である。
【０３７５】
共通矩形データ単位受信処理において、通信部３６は、共通矩形データ単位を、自ノードに確保したバッファを介して対応する全送信ノードから受信する。
【０３７６】
尚、実施形態においては、同じ共通矩形データ単位について、すべての送信ノードと受信ノードが、それぞれ共通矩形データ単位send手順と共通矩形データ単位recv手順を、集団的（collective）に実施することを仮定している。
【０３７７】
図７０は、共通矩形データ単位受信処理の内容を図解したフローチャートの一例である。図７０において先ず、バッファ確保部３７は、受信バッファ準備手順により、共通矩形データ単位に対応して二次側ノードから自ノードへ受信するためのY[DtoV[1]] * ... * Y[DtoV[Dt]]本の受信バッファ領域と、アクセスパターンの情報を獲得する（Ｓ１１０１）。受信バッファ準備手順の詳細については後ほど説明する。
【０３７８】
次に通信部３６は、共通矩形データ単位recv手順により、二次側から送信されたデータを受信バッファに受信する（Ｓ１１０２）。共通矩形データ単位recv手順の詳細については後ほど説明する。
【０３７９】
次にバッファ制御部３８は、共通矩形データ単位unpack手順により、受信バッファのデータをローカルデータへ分配する（Ｓ１１０３）。共通矩形データ単位unpack手順の詳細については後ほど説明する。そしてバッファ確保部３７は、受信バッファ領域を解放して処理を終了する。
【０３８０】
（受信バッファ準備手順）
次に、受信バッファ準備手順について説明する。受信バッファ準備手順においては、受信側を一次側、送信側を二次側とする。バッファ確保部３７は、共通矩形次元数、及び、一次側の通信情報テーブルを入力として、受信バッファ準備手順を実行する。ここで、共通矩形次元数は、すなわち、通信データの矩形である下位インデックスの次元数Dt（0≦Dt≦D）である。
【０３８１】
受信バッファ準備手順の出力として、バッファ確保部３７は、共通矩形データ単位に対応する、バッファリングパターンのリストy_countList[Dt]を取得する。そして受信バッファ準備手順を実行することで、バッファ確保部３７は、共通矩形データ単位に対する二次側ノードインデックスに対応する、Y[DtoV[1]] * ... * Y[DtoV[Dt]]本の受信バッファRecvBufを確保する。このようにバッファ確保部３７は、共通矩形データ単位に応じてバッファを確保することにより、確保するバッファのサイズを、通信で使用するバッファの最小限のサイズに抑えることができる。
【０３８２】
受信バッファ準備手順のアルゴリズムは、図６７に示した送信バッファ準備手順のアルゴリズムと同様である。ただし、受信バッファ準備手順のアルゴリズムは、図６７において、SendBufをRecvBufに置き換えたものである。
【０３８３】
（共通矩形データ単位recv手順）
次に、共通矩形データ単位recv手順について説明する。通信部３６は、以下のデータ項目を入力として、共通矩形データ単位recv手順を実行する。入力はすなわち、共通矩形次元数Dt（0≦Dt≦D）、共通矩形データ単位 Jt = (jt[1], ..., jt[D])、及び、受信側の通信情報テーブルである。これらに加えて、入力は、一次側（受信側）の受信バッファRecvBuf[Y[DtoV[1]]]...[Y[DtoV[Dt]]]、及び、受信バッファの次元dの各送信ノードインデックスに対応する寸法bufExtent[d][y[DtoV[d]]]である。
【０３８４】
図７１は、共通矩形データ単位recv手順のアルゴリズムの一例を示す。図７１に示す共通矩形データ単位recv手順を実行することにより、通信部３６は、共通矩形データ単位について、自ノードの受信バッファに対応する二次ノードからreceive(受信)する。
【０３８５】
図７１において、タグは以下の計算値とすれば、一つの整数値とすることができる。
(jt[Dt+1] + N[Dt+1] * (jt[Dt+2] + N[Dt+2] * (... jt[D] ) ...)) mod m 
ここでmは、同じ送受信ノード間でのsend-recveive通信についてそれ以上の数の追い越しが起こらないと保証できる十分大きな数であればよい。
【０３８６】
（共通矩形データ単位unpack手順）
次に、共通矩形データ単位unpack手順について説明する。バッファ制御部３８は、共通矩形データ単位Jt = (jt[1], ..., jt[Dt])、共通矩形次元数、バッファリングパターンのリストy_countList[Dt]、及び、一次側（受信側）の通信情報テーブルを入力として、共通矩形データ単位unpack手順を実行する。ここで、共通矩形次元数は、すなわち、矩形である下位インデックスの次元数Dt（0≦Dt≦D）である。
【０３８７】
図７２は、共通矩形データ単位unpack手順のアルゴリズムの一例を示す。図７２に示す共通矩形データ単位unpack手順を実行することにより、バッファ制御部３８は、共通矩形データ単位の受信データを、受信バッファから分配（unpack）する。すなわち、バッファ制御部３８は、共通矩形データ単位で、受信バッファの受信データを取り出し、ローカル配列に格納する。このようにバッファ制御部３８は、メモリ上のデータの連続性に基づいて、unpack処理を実行するため、unpack処理を高速化できる。
【０３８８】
図７２において、最内ループは、矩形データ単位unpack手順を用いてさらに高速化を図ることもできる。また図７２において、バッファ制御部３８は多次元の連続性を抽出することもできる。
【０３８９】
次にバッファなしPut通信の処理について、実際の通信プログラムの例を用いて説明する。図７３は、並列言語の一種であるXcalableMPプログラムのgmove構文で表現されている通信の一例を示す。ここでは、図７３の通信において、ノードP(1,1), p(2,1), p(1,2), p(2,2), p(1,3), p(2,3)を一次側ノードとしてバッファなしputを実施したときの例を示す。一次側が送信側のA, P、二次側が受信側のB, Qである。n2は実行時に決まる変数である。
【０３９０】
先ず取得部３２は、図７３の通信プログラムを取得する。すると解析部３３は、状態１プログラムの解析を実施する。結果として解析部３３は、図２７〜図３０に示す通信情報テーブルを得る。この例は配列代入文なので、ループ変数名は存在しないが、仮の名前$1と$2を与えた。ノード配列Qはグローバル配列Bと次元数を合わせるため、Q(1,1,4)と正規化された。尚、図２７〜図３０において、数式の形となるものは、ランタイムライブラリによって実行時に評価してもよいし、数式のままコンパイラの出力として生成してもよい。
【０３９１】
図７４は、状態１プログラムの解析で得られた通信情報テーブルの内容を示す。図７４において、ドット部分が送受信される通信データ、点線がデータ分散の境界である。
【０３９２】
状態１プログラムの解析において、図３２に示すアルゴリズムの手順６の結果を代入した結果が、図２８及び図２９に示されている。通信情報テーブルは、ノードによって有する値が異なるが、図２８及び図２９の通信情報テーブルでは、例として一次側ノード(0,0), (1,0), (0,1)の情報が示されている。なお、これらのノードは、入力プログラムのノードP(1,1), P(2,1), P(1,2)とそれぞれ対応する。実行時のコストを小さくするため、数式はできるだけ簡単化する方がよい。
【０３９３】
図７５は、状態１プログラムの解析により得られたノード(0,1)における通信情報テーブルの内容と、通信データとローカルデータの関係を示す図である。通信情報テーブルは、実行時に決まる変数（図７３の例では変数「n2」）に依存して異なる通信パターンを、まとめて表現している。図７５（A）は、n2≦80の時の、通信データとローカルデータの関係を示す。図７５（B）は、80≦n2≦100の時の、通信データとローカルデータの関係を示す。図７５（C）は、100≦n2の時の、通信データとローカルデータの関係を示す。
【０３９４】
連続性優先pivoting手順は、図７３の例ではDtoUもDtoVも元々昇順なので効果がない。仮に、gmove構文が配列代入文ではなくforall文の形
forall (i=0:99, j=0:119)  B(i,60,j) = A(i+10,j+n2)
で与えられているのであれば、連続データアクセスとなる可能性があるループ変数iが先、そうでないループ変数jが後になるように、整列部３４はソートした方がよい。
【０３９５】
次に、検出部３５は、連続データ単位検出手順を実施する。図７６は、連続データ単位検出手順の実施の様子を示す図である。
【０３９６】
以下の説明においては、一次側ノード(0,1)の動作を記す。プログラム中の変数n2は実行時に20と評価されているとする。
【０３９７】
図７６において、一次側データを360バイトごとに連続データ単位とすることが決定された。一次側データの１次元目の区間10:99は通信データ配列の１次元目の0:89に対応するので、ノード(0,1)がput通信すべき連続データ単位のリストは、
((0:89, jx1[2]), (0:89, jx1[2] + jx3[2]), (0:89, jx1[2] + 2 * jx3[2]), ..., (0:89, jx2[2]))
となる。jx1[2], jx2[2], jx3[2]は通信情報テーブルから得られる。
【０３９８】
次に、通信部３６は、以下のループ１の処理の反復実行を行う。D=2, Dc=1なので処理は１重ループとなる。
【０３９９】
（ループ１）
for jx[2] = jx1[2] to jx2[2] step jx3[2]
Jc-list = ((0:89))
call 連続データ単位put手順
end for
【０４００】
実行時にn2 = 20と決定されると、jx1[2] = max(0, 100-n2) = 80, jx2[2] = min(119, 199-n2) = 119, jx3[2] = 1と評価される。
【０４０１】
ローカル配列添字のタイプが「区間」または「三つ組」の場合にはループ１のようなループとすることができる。「スカラ」の場合には固定値となるのでループでなくてもよい。「その他」の場合には、ループは、通信データのその次元の全区間のうち、自ノードに対応するインデックスだけが選択されて実行される。
【０４０２】
ループ１において、最初の反復は、以下となる。
【０４０３】
jx[2] = jx1[2] = 80
Jc-list = ((0:89, 80))
連続データ単位put手順を実施
【０４０４】
図７７及び図７８は、ループ１において、最初の反復で呼び出される連続データ単位put手順の処理の一例（その１、その２）を示す。尚、ループ１において、最初の反復で呼び出される連続データ単位put手順の入力としては、「Jc-list = ((0:89, 80)), Dc = 1」が含まれる。
【０４０５】
ループ１において、2回目の反復は以下となる。
【０４０６】
jx[2] = jx [2] + jx3[2] = 80 + 1 = 81
Jc-list = ((0:89, 81))
連続データ単位put手順を実施
【０４０７】
以降の説明では、前の反復との差分のみを記述する。図７９は、ループ１において、2回目の反復で呼び出される連続データ単位put手順の処理の一例を示す。尚、ループ１において、２回目の反復で呼び出される連続データ単位put手順の入力としては、「Jc-list = ((0:89, 81))、Dc = 1」が含まれる。
【０４０８】
同様にして、通信部３６はループ１の処理を実行する。ループ１において、１１回目の反復は以下となる。
【０４０９】
jx[2] = 90
Jc-list = ((0:89, 90))
連続データ単位put手順を実施
【０４１０】
図８０は、ループ１において、１１回目の反復で呼び出される連続データ単位put手順の処理の一例を示す。尚、ループ１において、2回目の反復で呼び出される連続データ単位put手順の入力としては、「Jc-list = ((0:89, 90))、Dc = 1」が含まれる。
【０４１１】
同様にして、通信部３６はループ１の処理を実行し、最後にjx[2] = jx2[2] = 119の反復を実行して、a(10, 39)から360バイトのデータを、ノード(0,0,3)のb(0,60,29)へputする。そして処理が終了する。
【０４１２】
図８１は、一次側ノード(0,1)から二次側ノード(0,0,2)または(0,0,3)へputされた結果を示す図である。図８１に示す30パケットが一次側ノード(0,1)から二次側ノード(0,0,2)または(0,0,3)へputされる。図７５（Ａ）の斜線部分がこの一次側ローカルデータに対応する。他の３つの一次側ノードにおいても同時にこの手順を実施することにより、全体としてすべての通信データが一次側から二次側に通信される。
【０４１３】
次に、ノード３０のハードウェア構成の一例を説明する。図８２は、実施形態に係るノードのハードウェア構成の一例を示す。
【０４１４】
図８２において、ノード３０は、ＣＰＵ４１、メモリ４２、記憶装置４３、読取装置４４、及び通信インターフェース４５を含む。ＣＰＵ４１、メモリ４２、記憶装置４３、読取装置４４、及び通信インターフェース４５はバス等を介して接続される。
【０４１５】
ＣＰＵ４１は、メモリ４２を利用して上述のフローチャートの手順を記述したプログラムを実行することにより、取得部３２、解析部３３、整列部３４、検出部３５、通信部３６、バッファ確保部３７、及びバッファ制御部３８の一部または全部の機能を提供する。また、ＣＰＵ４１はコンパイラの機能も提供する。
【０４１６】
メモリ４２は、例えば半導体メモリであり、Random Access Memory（ＲＡＭ）領域およびRead Only Memory（ＲＯＭ）領域を含んで構成される。メモリ４２には、送信バッファまたは受信バッファが確保される。記憶装置４３は、例えばハードディスクである。なお、記憶装置４３は、フラッシュメモリ等の半導体メモリであってもよい。また、記憶装置４３は、外部記録装置であってもよい。記憶装置４３は記憶部３１の一部または全部の機能を提供する。
【０４１７】
読取装置４４は、ＣＰＵ４１の指示に従って着脱可能記憶媒体５０にアクセスする。着脱可能記憶媒体５０は、たとえば、半導体デバイス（ＵＳＢメモリ等）、磁気的作用により情報が入出力される媒体（磁気ディスク等）、光学的作用により情報が入出力される媒体（ＣＤ−ＲＯＭ、ＤＶＤ等）などにより実現される。尚、読取装置４４はノード３０に含まれなくてもよい。
【０４１８】
通信インターフェース４５は、ＣＰＵ４１の指示に従って通信ネットワークまたはインターコネクト等を介して、他のノード３０と通信する。
【０４１９】
実施形態のプログラムは、例えば、下記の形態でノード３０に提供される。
（１）記憶装置４３に予めインストールされている。
（２）着脱可能記憶媒体５０により提供される。
（３）プログラムサーバ（図示せず）から通信インターフェース４５を介して提供される。
【０４２０】
さらに、実施形態のノードの一部は、ハードウェアで実現してもよい。或いは、実施形態のノードは、ソフトウェアおよびハードウェアの組み合わせで実現してもよい。
【０４２１】
尚、第２ノード１２、及び第２ノード２２は、例えばハードディスクまたはフラッシュメモリ等の半導体メモリを含む記憶装置であってもよい。
【０４２２】
尚、本実施形態は、以上に述べた実施の形態に限定されるものではなく、本実施形態の要旨を逸脱しない範囲内で種々の構成または実施形態を取ることができる。
【０４２３】
上記実施形態に関し、更に以下の付記を開示する。
（付記１）
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置において、
所定の単位に区画された第１の記憶領域に、前記情報処理装置に割り当てられたローカルデータを記憶する記憶部と、
前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出する検出部と、
前記第１の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する送信部と
を有する情報処理装置。
（付記２）
前記格納領域情報は、前記情報処理装置に割り当てられた前記対象ローカルデータを特定する情報と、前記他の情報処理装置に割り当てられた前記対象ローカルデータを特定する情報を含み、
前記検出部は、前記格納領域情報に基づいて、前記第２の記憶領域の前記連続区画のうち、該連続区画に書き込まれる対象ローカルデータが格納された前記第１の記憶領域の区画が連続する複数の連続区画を検出する
ことを特徴とする付記１に記載の情報処理装置。
（付記３）
前記送信部は、前記記憶部から、前記連続区画の区画数だけ、前記第１の記憶領域に格納されたローカルデータを取り出して、所定のバッファ領域に格納し、該バッファ領域に格納したローカルデータを、所定の単位で、前記第２ノードへ送信する
ことを特徴とする付記１または２に記載の情報処理装置。
（付記４）
前記情報処理装置は、さらに、
前記検出した連続区画の区画数に応じたサイズの前記バッファ領域を確保する確保部と、
を備えることを特徴とする付記３に記載の情報処理装置。
（付記５）
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置において、
所定の単位に区画された第１の記憶領域に、前記情報処理装置にローカルデータ領域を割り当てられた記憶部と、
前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出する検出部と、
前記第２の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求する要求部と
前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第１の記憶領域に格納する受信部と、
を備えることを特徴とする情報処理装置。
（付記６）
前記格納領域情報は、前記情報処理装置に割り当てられた前記対象ローカルデータを特定する情報と、前記他の情報処理装置に割り当てられた前記対象ローカルデータを特定する情報を含み、
前記検出部は、前記格納領域情報に基づいて、前記第２の記憶領域の前記連続区画のうち、該連続区画からデータが読み出されて格納される前記第１の記憶領域の区画が連続する複数の連続区画を検出する
ことを特徴とする付記５に記載の情報処理装置。
（付記７）
前記受信部は、前記ローカルデータを受信して所定のバッファ領域に格納し、該バッファ領域から、検出した前記連続区画の区画数だけ取り出して前記第１の記憶領域に格納する
ことを特徴とする付記５または６に記載の情報処理装置。
（付記８）
前記情報処理装置は、さらに、
前記検出した連続区画の区画数に応じたサイズの前記バッファ領域を確保する確保部と、
を備えることを特徴とする付記７に記載の情報処理装置。
（付記９）
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置は、
前記情報処理装置に割り当てられたローカルデータのうち、前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出し、
所定の単位に区画された第１の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する
ことを特徴とする通信方法。
（付記１０）
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置は、
前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出し、
前記第２の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求し、
前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して、所定の単位に区画された第１の記憶領域に格納する
ことを特徴とする通信方法。
（付記１１）
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置に、
前記情報処理装置に割り当てられたローカルデータのうち、前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出し、
所定の単位に区画された第１の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する
処理を実行させることを特徴とする通信プログラム。
（付記１２）
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置に、
前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出し、
前記第２の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求し、
前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して、所定の単位に区画された第１の記憶領域に格納する
処理を実行させることを特徴とする通信プログラム。
（付記１３）
複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている情報処理システムであって、
第１情報処理装置と第２情報処理装置を備え、
前記第１情報処理装置は、
所定の単位に区画された第１の記憶領域に、前記第１情報処理装置に割り当てられたローカルデータを記憶する記憶部と、
前記第１情報処理装置から前記第２情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記第２情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出する検出部と、
前記第１の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第２情報処理装置に送信する送信部と、を有し、
前記第２情報処理装置は、前記第１情報処理装置から前記連続区画の区画数のローカルデータを受信して、前記第２の記憶領域に格納する
ことを特徴とする情報処理システム。
（付記１４）
複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている情報処理システムであって、
第１情報処理装置と第２情報処理装置を備え、
前記第１情報処理装置は、
所定の単位に区画された第１の記憶領域に、前記第１情報処理装置にローカルデータ領域を割り当てられた記憶部と、
前記第１情報処理装置に対する第２情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記第２情報処理装置が備える他の記憶部において前記所定の単位に区画された第２の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出する検出部と、
前記第２の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第１情報処理装置に送信することを、前記第２情報処理装置に要求する要求部と
前記第２情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第１の記憶領域に格納する受信部と、を有し、
前記第２情報処理装置は、前記第１情報処理装置からの前記要求に応じて、前記第２の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第１情報処理装置に送信する
ことを特徴とする情報処理システム。
【符号の説明】
【０４２４】
１０    情報処理システム
１１    情報処理装置
１２    第２ノード
１３    記憶部
１４    取得部
１５    検出部
１６    送信部
１７    確保部
２０    情報処理システム
２１    情報処理装置
２２    第２ノード
２３    記憶部
２４    取得部
２５    検出部
２６    要求部
２７    受信部
２８    確保部
３０    通信ノード
３１    記憶部
３２    取得部
３３    解析部
３４    整列部
３５    検出部
３６    通信部
３７    バッファ確保部
３８    バッファ制御部
【図１】
0006402598.tif 000002
【図２】
0006402598.tif 000003
【図３】
0006402598.tif 000004
【図４】
0006402598.tif 000005
【図５】
0006402598.tif 000006
【図６】
0006402598.tif 000007
【図７】
0006402598.tif 000008
【図８Ａ】
0006402598.tif 000009
【図８Ｂ】
0006402598.tif 000010
【図９】
0006402598.tif 000011
【図１０Ａ】
0006402598.tif 000012
【図１０Ｂ】
0006402598.tif 000013
【図１１】
0006402598.tif 000014
【図１２】
0006402598.tif 000015
【図１３】
0006402598.tif 000016
【図１４】
0006402598.tif 000017
【図１５】
0006402598.tif 000018
【図１６】
0006402598.tif 000019
【図１７】
0006402598.tif 000020
【図１８】
0006402598.tif 000021
【図１９】
0006402598.tif 000022
【図２０】
0006402598.tif 000023
【図２１】
0006402598.tif 000024
【図２２】
0006402598.tif 000025
【図２３】
0006402598.tif 000026
【図２４】
0006402598.tif 000027
【図２５】
0006402598.tif 000028
【図２６】
0006402598.tif 000029
【図２７】
0006402598.tif 000030
【図２８】
0006402598.tif 000031
【図２９】
0006402598.tif 000032
【図３０】
0006402598.tif 000033
【図３１】
0006402598.tif 000034
【図３２】
0006402598.tif 000035
【図３３】
0006402598.tif 000036
【図３４】
0006402598.tif 000037
【図３５】
0006402598.tif 000038
【図３６】
0006402598.tif 000039
【図３７】
0006402598.tif 000040
【図３８】
0006402598.tif 000041
【図３９】
0006402598.tif 000042
【図４０】
0006402598.tif 000043
【図４１】
0006402598.tif 000044
【図４２】
0006402598.tif 000045
【図４３】
0006402598.tif 000046
【図４４】
0006402598.tif 000047
【図４５】
0006402598.tif 000048
【図４６】
0006402598.tif 000049
【図４７】
0006402598.tif 000050
【図４８】
0006402598.tif 000051
【図４９】
0006402598.tif 000052
【図５０】
0006402598.tif 000053
【図５１】
0006402598.tif 000054
【図５２】
0006402598.tif 000055
【図５３】
0006402598.tif 000056
【図５４】
0006402598.tif 000057
【図５５】
0006402598.tif 000058
【図５６】
0006402598.tif 000059
【図５７】
0006402598.tif 000060
【図５８】
0006402598.tif 000061
【図５９】
0006402598.tif 000062
【図６０】
0006402598.tif 000063
【図６１】
0006402598.tif 000064
【図６２】
0006402598.tif 000065
【図６３】
0006402598.tif 000066
【図６４】
0006402598.tif 000067
【図６５】
0006402598.tif 000068
【図６６】
0006402598.tif 000069
【図６７】
0006402598.tif 000070
【図６８】
0006402598.tif 000071
【図６９】
0006402598.tif 000072
【図７０】
0006402598.tif 000073
【図７１】
0006402598.tif 000074
【図７２】
0006402598.tif 000075
【図７３】
0006402598.tif 000076
【図７４】
0006402598.tif 000077
【図７５】
0006402598.tif 000078
【図７６】
0006402598.tif 000079
【図７７】
0006402598.tif 000080
【図７８】
0006402598.tif 000081
【図７９】
0006402598.tif 000082
【図８０】
0006402598.tif 000083
【図８１】
0006402598.tif 000084
【図８２】
0006402598.tif 000085