JP6402598B2 - 情報処理装置、通信方法、通信プログラム、及び、情報処理システム - Google Patents

情報処理装置、通信方法、通信プログラム、及び、情報処理システム Download PDF

Info

Publication number
JP6402598B2
JP6402598B2 JP2014230227A JP2014230227A JP6402598B2 JP 6402598 B2 JP6402598 B2 JP 6402598B2 JP 2014230227 A JP2014230227 A JP 2014230227A JP 2014230227 A JP2014230227 A JP 2014230227A JP 6402598 B2 JP6402598 B2 JP 6402598B2
Authority
JP
Japan
Prior art keywords
information processing
data
communication
local data
unit
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2014230227A
Other languages
English (en)
Other versions
JP2016095596A (ja
Inventor
英俊 岩下
英俊 岩下
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2014230227A priority Critical patent/JP6402598B2/ja
Priority to US14/887,382 priority patent/US9841919B2/en
Priority to EP15190676.5A priority patent/EP3021210A1/en
Publication of JP2016095596A publication Critical patent/JP2016095596A/ja
Application granted granted Critical
Publication of JP6402598B2 publication Critical patent/JP6402598B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/453Data distribution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/0644Management of space entities, e.g. partitions, extents, pools
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/0604Improving or facilitating administration, e.g. storage management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/0671In-line storage system
    • G06F3/0683Plurality of storage devices
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/0671In-line storage system
    • G06F3/0683Plurality of storage devices
    • G06F3/0689Disk arrays, e.g. RAID, JBOD
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/38Information transfer, e.g. on bus
    • G06F13/382Information transfer, e.g. on bus using universal interface adapter
    • G06F13/385Information transfer, e.g. on bus using universal interface adapter for adaptation of a particular data processing system to different peripheral devices
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/38Information transfer, e.g. on bus
    • G06F13/382Information transfer, e.g. on bus using universal interface adapter
    • G06F13/387Information transfer, e.g. on bus using universal interface adapter for adaptation of different data processing systems to different peripheral devices, e.g. protocol converters for incompatible systems, open system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/38Information transfer, e.g. on bus
    • G06F13/42Bus transfer protocol, e.g. handshake; Synchronisation
    • G06F13/4204Bus transfer protocol, e.g. handshake; Synchronisation on a parallel bus
    • G06F13/4221Bus transfer protocol, e.g. handshake; Synchronisation on a parallel bus being an input/output bus, e.g. ISA bus, EISA bus, PCI bus, SCSI bus
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/38Information transfer, e.g. on bus
    • G06F13/42Bus transfer protocol, e.g. handshake; Synchronisation
    • G06F13/4204Bus transfer protocol, e.g. handshake; Synchronisation on a parallel bus
    • G06F13/4234Bus transfer protocol, e.g. handshake; Synchronisation on a parallel bus being a memory bus
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/10Providing a specific technical effect
    • G06F2212/1016Performance improvement
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/60Details of cache memory

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Human Computer Interaction (AREA)
  • Software Systems (AREA)
  • Multi Processors (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Description

本発明は、情報処理装置、通信方法、通信プログラム、及び、情報処理システムに関する。
High Performance Fortran(HPF)やUnified Parallel C(UPC)などのグローバルビューを持つ並列プログラミング言語では、データは仮想的なグローバル空間上にある。プログラマはノード番号を意識しないでグローバルなデータのやりとりを記述する。また、ストレージのRedundant Arrays of Inexpensive Disks(RAID)技術では、実際には複数のハードディスクに跨って分割配置されているデータを、仮想的な1つの連続データとしてユーザに見せている。以下の説明では、このようなデータをグローバルデータと呼び、グローバルデータである仮想的な多次元矩形に名前を付けたものをグローバル配列と呼ぶ。ノードへのグローバルデータのマッピングは、コンパイラなどのミドルウェアによって行われる。
グローバルビューのプログラミング言語における通信は、グローバルデータの参照(読み出し)と定義(書き込み)である。具体的には、式中でのグローバル配列の参照、グローバル配列への代入、グローバルデータに関わる入出力文、グローバルデータを引数とする手続き呼出し、通信を明示する構文や通信ライブラリの呼出しなどがある。また、ノード間に分散配置されたファイルを1つのデータとして扱うときには、これもグローバルデータの参照または定義であると言える。グローバルビューのプログラミング言語における通信は、以下のFortranの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)。これらは実際には、スカラ、または、Fortranの添字三つ組k1 : k2 : k3でも表現できる単一インデックスのアフィン関数 fu(j) = k1 + k3 * j であることが多い。jの張るD次元空間 [ N[1], ..., N[D] ] を通信データ配列と呼ぶ。ただしFORALL文におけるインデックスj[1], ..., j[D]の出現順序は意味をもたないので、通信データ配列の次元の順序は通信が高速になるように任意に選択することができる。
ノード間の通信は、ネットワークのスループット(througuput, バイト/秒)が高いほど高速であり、遅延時間(latency, 秒)が小さいほど高速である。ここでいう遅延時間は、通信の立ち上がりと完了待ちに要するソフトウェアとハードウェアの時間であり、基本的にデータ量には無関係な値である。1パケットで通信するデータ量をn(バイト)とすると、1回の通信に要する時間は、
T(n) = Latency + n / Throughput [秒] (式1)
と表すことができる。(式1)に示すように、一度に通信するデータ量nを大きくするほど、通信時間に占める遅延時間の影響を相対的に小さくすることができる。
特開平9−34855公報 特開2005−285042号公報
通信が配列要素(区画)の1要素ずつに対して生成される場合には、一度に通信されるデータ量が少ないため、全配列要素を通信する場合、遅延時間の総和が非常に大きくなる。
1つの側面では、本発明は、グローバルデータの通信の効率化を図ることを目的とする。
一態様の情報処理装置は、複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置である。情報処理装置は、記憶部、取得部、検出部、及び送信部を含む。記憶部は、所定の単位に区画された第1の記憶領域に、情報処理装置に割り当てられたローカルデータを記憶する。取得部は、情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得する。検出部は、格納領域情報に基づき、他の情報処理装置が備える他の記憶部において所定の単位に区画された第2の記憶領域のうち、対象ローカルデータを書き込む連続する複数の連続区画を検出する。格納領域情報は、グローバルデータにおいて対象ローカルデータが対応するデータを特定する情報である。送信部は、第1の記憶領域に格納されたローカルデータを、連続区画の区画数だけ取り出して他の情報処理装置に送信する。
また、一態様の情報処理装置は、複数の情報処理装置のうち、複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置である。情報処理装置は、記憶部、取得部、検出部、要求部、及び受信部を含む。記憶部は、所定の単位に区画された第1の記憶領域に、情報処理装置にローカルデータ領域を割り当てられる。取得部は、情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得する。検出部は、格納領域情報に基づき、他の情報処理装置が備える他の記憶部において所定の単位に区画された第2の記憶領域のうち、対象ローカルデータを読み出す連続する複数の連続区画を検出する。格納領域情報は、グローバルデータにおいて対象ローカルデータが対応するデータを特定する情報である。要求部は、第2の記憶領域に格納されたローカルデータを、連続区画の区画数だけ取り出して情報処理装置に送信することを、他の情報処理装置に要求する。受信部は、他の情報処理装置から、要求に応じて送信された連続区画の区画数のローカルデータを受信して第1の記憶領域に格納する。
一態様によれば、グローバルデータの通信の効率化を図ることができる。
グローバルデータの各ノードへのマッピングを説明するための図である。 2次元のグローバル配列Aを大きさ4の1次元のノード配列Pに分散配置する例を示す。 1次元の分散の種類の例を示す。 分散の種類毎の関数の一例を示す。 関数gtol2の一例を示す。 関数ltog2の一例を示す。 関数gtog2の一例を示す。 関数gtol3の一例(その1)を示す。 関数gtol3の一例(その2)を示す。 関数ltog3の一例を示す。 関数gtog3の一例(その1)を示す。 関数gtog3の一例(その2)を示す。 2次元の通信データ [N1, N2]と対応するグローバルインデックスの例を示す。 データの送受信方法を説明するための図である。 仮想グローバル配列間の代入とノード間の多対多通信の関係の一例を示す。 比較例におけるPut手順1の一例を示す。 比較例におけるGet手順1の一例を示す。 比較例におけるバッファなし両側通信の送信ノード通信手順1の一例を示す。 比較例におけるバッファなし両側通信の受信ノード通信手順1の一例を示す。 比較例におけるバッファあり両側通信の送信ノード通信手順2の一例を示す。 比較例におけるバッファあり両側通信の受信ノード通信手順2の一例を示す。 実施形態の送信処理に係る情報処理装置の構成の一例を示す。 実施形態の送信処理に係る情報処理装置の動作の一例を示す。 実施形態の受信処理に係る情報処理装置の構成の一例を示す。 実施形態の受信処理に係る情報処理装置の動作の一例を示す。 実施形態に係る通信システムの構成の一例を示す。 実施形態に係るバッファなしPut通信の処理を図解したフローチャートの一例を示す。 連続データput処理の詳細の一例を示す。 通信情報テーブルの構成の一例(その1)を示す 通信情報テーブルの構成の一例(その2)を示す 通信情報テーブルの構成の一例(その3)を示す 通信情報テーブルの構成の一例(その4)を示す。 状態1プログラムの解析のアルゴリズムの一例(その1)を示す。 状態1プログラムの解析のアルゴリズムの一例(その2)を示す。 状態1プログラムの解析のアルゴリズムの一例(その3)を示す。 連続データ単位検出手順のアルゴリズムの一例を示す。 連続データ単位put手順のアルゴリズムの一例を示す。 連続データ単位put手順の処理を図解したフローチャートの一例を示す。 連続‐連続データ単位検出手順のアルゴリズムの一例(その1)を示す。 連続‐連続データ単位検出手順のアルゴリズムの一例(その2)を示す。 Jcr-listを得る処理の様子を示す図を示す。 連続-連続データ単位put手順のアルゴリズムの一例を示す。 実施形態に係るバッファありPut通信の処理を図解したフローチャートの一例を示す。 矩形データput処理の一例を示す。 矩形データ単位検出手順のアルゴリズムの一例を示す。 矩形データ単位put手順のアルゴリズムの一例を示す。 矩形データ単位put手順の処理を図解したフローチャートの一例を示す。 矩形‐連続データ単位検出手順のアルゴリズムの一例(その1)を示す。 矩形‐連続データ単位検出手順のアルゴリズムの一例(その2)を示す。 矩形-連続データ単位put手順の処理を図解したフローチャートの一例を示す。 矩形データ単位pack手順のアルゴリズムの一例を示す。 実施形態に係るバッファなしGet通信の処理を図解したフローチャートの一例を示す。 連続データget処理の詳細の一例を示す。 連続データ単位get手順のアルゴリズムの一例を示す。 連続データ単位get手順の処理を図解したフローチャートの一例を示す。 連続-連続データ単位get手順のアルゴリズムの一例を示す。 実施形態に係るバッファありGet通信の処理を図解したフローチャートの一例を示す。 矩形データget処理の詳細の一例を示す。 矩形データ単位get手順のアルゴリズムの一例を示す。 矩形データ単位get手順の処理を図解したフローチャートの一例を示す。 矩形-連続データ単位get手順の処理を図解したフローチャートの一例を示す。 矩形データ単位unpack手順のアルゴリズムの一例を示す。 実施形態に係るバッファあり両側通信の処理を図解したフローチャートの一例を示す。 送信処理の詳細の一例を示す。 受信処理の詳細の一例を示す。 矩形性優先pivoting手順のアルゴリズムの一例を示す。 共通矩形データ単位検出手順のアルゴリズムの一例を示す。 共通矩形データ単位送信処理の内容を図解したフローチャートの一例を示す。 送信バッファ準備手順のアルゴリズムの一例を示す。 共通矩形データ単位pack手順のアルゴリズムの一例を示す。 共通矩形データ単位send手順のアルゴリズムの一例を示す。 共通矩形データ単位受信処理の内容を図解したフローチャートの一例を示す。 共通矩形データ単位recv手順のアルゴリズムの一例を示す。 共通矩形データ単位unpack手順のアルゴリズムの一例を示す。 XcalableMPプログラムのgmove構文で表現されている通信の一例を示す。 状態1プログラムの解析で得られた通信情報テーブルの内容を示す。 状態1プログラムの解析により得られたノード(0,1)における通信情報テーブルの内容と、通信データとローカルデータの関係を示す図である。 連続データ単位検出手順の実施の様子を示す図である。 ループ1において、最初の反復で呼び出される連続データ単位put手順の処理の一例(その1)を示す。 ループ1において、最初の反復で呼び出される連続データ単位put手順の処理の一例(その2)を示す。 ループ1において、2回目の反復で呼び出される連続データ単位put手順の処理の一例を示す。 ループ1において、11回目の反復で呼び出される連続データ単位put手順の処理の一例を示す。 一次側ノード(0,1)から二次側ノード(0,0,2)または(0,0,3)へputされた結果を示す図である。 実施形態に係るノードのハードウェア構成の一例を示す。
グローバルデータは、複数のノードにマッピングされる。図1は、グローバルデータの各ノードへのマッピングを説明するための図である。図1において、プログラム中に記述されるグローバル配列A、Bは、ノードを意識しない仮想的なグローバル名前空間中に存在し、それらのデータ要素は多次元のグローバルインデックスによって特定される。コンパイラはプログラマの指示に従って、グローバル配列A、Bに対応するローカル配列a、bを複数のノードに定義し、各ノードにおけるグローバルインデックスとローカルインデックスのマッピング(対応付け)を決める。これをデータの分散(distribution)と呼ぶ。AとBの分散先は、一部または全部が同じノードであってもよいし、別々のノードであってもよい。最後にコンパイラは、変数a、bに対応するメモリの割付けを行う。このときのローカルインデックスとアドレスのマッピングは、コンパイラの実装に依存する。同じ変数のベースアドレスはノード間で異なっていてもよい。ただし、実施形態においては、1次元目のローカルインデックスが連続する場合、連続するローカルインデックスに対応するアドレスも連続するものとする。
なお、実施形態における「アドレス」は、通信機構から見たアドレスであり、ノードのCentral Processing Unit(CPU)から見た仮想メモリのアドレスとも物理メモリのアドレスとも異なる場合がある。システムによっては、同じデータでも別々のノードから観測したときのアドレスは異なるかもしれない。
データの分散について、さらに詳しく説明する。M次元のグローバル配列の実体は、1以上のノードにM次元ローカル配列として分割して割付けられる。割り付け先となるノードは、仮想的な配列(以下、ノード配列と記す)を形成する。図2は、2次元のグローバル配列Aを大きさ4の1次元のノード配列Pに分散配置する例を示す。図2において、グローバル配列Aの2次元目が4つのブロックに分割され、ノード配列Pの各々の要素で示される各ノードに配置されている。グローバル配列Aの1次元目は分散されないので、各ノードのローカル配列aの1次元目はグローバル配列と同じ長さをもつ。グローバル配列Aの2次元目は4つのブロックに分割されているので、各ノードのローカル配列aの2次元目の長さは、8又は6となっている。このように各次元の長さは、分割の方法に応じた長さとなる。
図2においては、2次元目が4つのブロックに分散されている。分散にはいくつかの種類があるが、次に分散の種類について説明する。図3は、1次元の分散の種類の例を示す。図3に示すように、1次元の分散の種類には、ブロック、サイクリック、ブロック・サイクリック、不均等ブロック、及び不規則分散の種類がある。
図3(A)は、ブロック分散の一例を示す。ブロック分散においては、インデックスが連続する複数の要素を1つのブロックとしてまとめて、各ノードに割り付けられる。ブロックの数はノード配列の長さと等しくなる。各ブロックの長さ(要素数)は、グローバル配列における分割対象の次元の長さを、ノード配列の長さで割った値となる。このため、各ノードには均等の長さのブロックが割り付けられる。ただし、図3(A)のように、分割する次元の長さが、ブロックの数で割り切れない場合は、例えば最後のブロックの長さは、他のブロックの長さより小さな値となる。
図3(B)は、サイクリック分割の一例を示す。サイクリック分割においては、分割する次元の各要素は、ノード配列の各ノードに対して、例えばインデックスの小さい順に順番に割り付けられる。グローバル配列の要素がノード配列の最後のノードに割り付けられると、最後のノードに割り付けられた要素の次の要素は、ノード配列の最初のノードに割り付けられる。
図3(C)は、ブロック・サイクリック分割の一例を示す。ブロック・サイクリック分割においては、複数のグローバル配列の要素を含むブロック毎に、サイクリックにノード配列のノードに割り付けられる。
図3(D)は、不均等ブロック分割の一例を示す。不均等ブロック分割においては、各ノードに割り付けられるブロックの長さが、ノード毎に異なる。
図3(E)は、不規則な分割の一例を示す。不規則な分割においては、分割は不規則に行われる。
以下の説明では、グローバル配列の添字をグローバルインデックスと記し、ローカル配列の添字をローカルインデックスと記す。また、ノード配列の添字をノードインデックスと記す。
HPFなどのプログラミング言語では、分散の種類ごとにグローバルインデックスとノードインデックスの対応付けが定義されている。図4は、分散の種類毎の関数の一例を示す。図4において、「gtop(k)」列は、グローバルインデックスとノードインデックスの対応付けを示す関数の一例を示す。
図4において、Pはノード配列の着目する次元の寸法である。Nは、グローバル配列の着目する次元の寸法である。ここで着目する次元とは分散を行う対象の次元である。分散対象の次元は、例えば図2のように分散が行われる場合、2次元目となる。
ブロック分散においては、wは、ブロック幅(ブロックの長さ)である。wは、利用者が指定してもよいし、w=ceil(N/P)としてもよい。例えば図2の場合は、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を下限としている。なお、この正規化は必須ではなく、その後の処理で扱う変換式を簡単にするための工夫である。もし正規化を行わないなら、図4に現れる式はパラメタが増えるためより複雑なものになる。
グローバルインデックスとローカルインデックスのマッピング(対応付け)の一例を、図4の「gtol(k, p)」、「ltog(i, p)」の列に示す。尚、図4に示すマッピングは一例であり、グローバルインデックスとローカルインデックスのマッピング(対応付け)は、実装に依存する。
図4を用いると、例えば図2で示したデータの分散では、グローバル配列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アドレスなどに変換される。
グローバルインデックスの区間とローカルインデックスの区間の相互変換の定義の一例について説明する。
図5は、グローバルインデックスの区間 k1 : k2からローカルインデックスの区間i1 : i2へ変換する関数gtol2の一例を示す。すなわちgtol2は、「(i1,i2) = gtol2(k1,k2,p)」のように表現できる。図5のgtol2を実行することにより、グローバルインデックスの連続区間k1:k2 = k1, k1+1, k1+2, ..., k2に対応するローカルインデックスのうち、プロセッサpにおけるローカルインデックスの連続区間i1:i2 = i1, i1+1, i1+2, ..., i2を得られる。i1 > i2のときは、要素がないことを意味する。図5のgtol2においては、グローバルインデックスが連続区間であるとき、各ノードのローカルインデックスもまた連続区間になる。このマッピングでは、図5に見られるように、グローバルインデックスが連続した区間であるとき、対応するローカルインデックスもまた長さ0以上の連続した区間になることが保障されている。尚、他のマッピングでは、必ずしもこれは保証されない。
図6は、ローカルインデックスの区間i1 : i2からグローバルインデックスの区間 k1 : k2への変換を行う関数ltog2の一例を示す。すなわちltog2は、「(k1,k2,k3) = ltog2(i1,i2,p)」のように表現できる。図6のltog2を実行することにより、プロセッサpのローカルインデックスの連続区間i1:i2に対応する、グローバルインデックスの三つ組k1:k2:k3を得られる。ローカルインデックスが連続区間であるとき、block分散、不均等分散、非分散ではグローバルインデックスは連続区間になり、cyclic分散では、グローバルインデックスは三つ組になる。block-cyclic分散と不規則分散では、グローバルインデックスは三つ組になることが保障されない。
図7は、グローバルインデックスの連続区間k1:k2に対応する、プロセッサpに分散されるグローバルインデックスの三つ組kx1:kx2:kx3を取得するための関数gtog2の一例を示す。すなわちgtog2は、「(kx1,kx2, kx3) = gtog2(k1,k2,p)」のように表現できる。図7のgtog2において、入力のグローバルインデックスが連続区間であるとき、block分散、不均等分散、非分散ではグローバルインデックスは連続区間になり、cyclic分散では、グローバルインデックスは三つ組になる。block-cyclic分散と不規則分散では、グローバルインデックスは三つ組になることが保障されない。
図8A、図8Bは、グローバルインデックスの三つ組k1:k2:k3に対応する、プロセッサpにおけるローカルインデックスの三つ組i1:i2:i3のi1とi2とi3を取得するための関数gtol3の一例を示す。すなわちgtol3は、「(i1,i2,i3) = gtol3(k1,k2,k3,p)」のように表現できる。図8のgtol3において、グローバルインデックスが三つ組であるとき、block-cyclic分散と不規則分散を除いて、各ノードのローカルインデックスもまた三つ組になる。
図9は、プロセッサpのローカルインデックス三つ組i1:i2:i3に対応する、グローバルインデックス三つ組k1:k2:k3のk1とk2とk3を取得するための関数ltog3の一例を示す。すなわちltog3は、「(k1,k2,k3) = ltog3(i1,i2,i3,p)」のように表現できる。図9のltog3において、ローカルインデックスが三つ組であるとき、block-cyclic分散と不規則分散を除いて、グローバルインデックスもまた三つ組になる。
図10は、グローバルインデックスの三つ組k1:k2:k3に対応する、プロセッサpに分散されるグローバルインデックスの三つ組kx1:kx2:kx3を取得するための関数gtog3の一例を示す。すなわちgtog3は、「(kx1,kx2, kx3) = gtog3(k1,k2,k3,p)」のように表現できる。図10のgtog3において、入力のグローバルインデックスが連続区間であるとき、block分散、不均等分散、非分散ではグローバルインデックスは連続区間になり、cyclic分散では、グローバルインデックスは三つ組になる。block-cyclic分散と不規則分散では、グローバルインデックスは三つ組になることが保障されない。
図11は、2次元の通信データ[N1, N2]と対応するグローバルインデックスの例を示す。図11において、図11(b)は形状[N1, N2]のグローバル配列で、この全体配列を通信の対象とする場合を表している。図11(c)は、図11(b)よりもサイズが大きなグローバル配列であり、図11(c)の部分配列が通信の対象となっている。図11(d)は、グローバル配列において通信対象データの原点がシフトされた例である。図11(e)は、グローバル配列において通信対象データの原点がシフトされ、さらに通信対象データは、グローバル配列の2次元目方向に一定間隔cのストライドをもつ例である。図11(f)は、グローバル配列において通信対象データが負のストライドをもつ例である。図11(g)と図11(h)は、グローバル配列において親変数の断面を通信データとする例である。
図11(a)〜(h)のそれぞれに、通信データのインデックスjからグローバルインデックスへのマッピングを示している。尚、例えば(e)に示すように、添字三つ組k1:k2:k3は、通信データのインデックスjからグローバルインデックスへのマッピング「j → k3 * j + k1」があることを意味している。
グローバルデータのノード間通信において、ノードの実行状態は以下の3通りに分けられる。ここで、送信ノード、受信ノードとは、それぞれ、送信されるデータの分散先のノード、受信されるデータの分散先のノードを意味する。
状態1:送信ノードのすべてが実行している状態
状態2:受信ノードのすべてが実行している状態
状態3:送信ノードと受信ノードのすべてが、集団的(collective)な実行をしている状態
状態1は状態3を含み、状態2にもまた状態3を含む。状態3はSingle Program/Multiple Data(SPMD)と呼ばれる実行形態であり、Message Passing Interface(MPI)ライブラリの両側通信や集団通信が使用できる状態である。グローバルビュー言語の実行で最もよく現れるのがこの状態3である。これに対して、状態1と状態2は、自ノードと他のノード(複数であってもよい)との間の通信である。状態1における通信が発生する場合は、同時に同じプログラムを実行していないノードのメモリや、プロセッサを持たないノードのディスクへ、送信ノードがデータを書き出す場合である。状態2における通信が発生する場合は、同時に同じプログラムを実行していないノードのメモリやディスクから、受信ノードがデータを読み込む場合である。グローバルビューの並列言語では、これら3通りの状態について、グローバル配列間の代入を実現する。
実際のシステムでは、どんなデータでも一度にまとめて通信できるわけではない。アドレスが連続するデータについては1パケットで一度に通信できる場合がある。しかしながら、不連続なデータに対しては、データは、コンパイラの実行時ライブラリ、MPIなどの通信ライブラリ、または通信に関わるハードウェアのいずれかの階層で、小さなパケットに分けられて、通信されることが多い。
そこで、不連続なデータを送信するときには、送信ノードは、通信データが連続になるように一度バッファ領域にコピーし(pack)、その後、バッファ領域から一度に外部に送信する場合がある。同様に、不連続データを受信するときには、受信ノードは、通信データを連続データとして外部からバッファ領域に受信し、その後、バッファ領域から不連続データをコピーする(unpack)場合がある。
図12は、データの送受信方法を説明するための図である。図12(A)は、連続データの送受信の様子を示す。図12(B)は、不連続データの送受信の様子を示す。図12(C)は、通信データが送信ノードにおいて不連続であって、受信ノードにおいて連続である場合の送受信の様子を示す。図12(D)は、通信データが送信ノードにおいて連続であって、受信ノードにおいて不連続である場合の送受信の様子を示す。
送信側と受信側の両方が連続データであるとあらかじめ分かっている場合には、図12(A)のように、バッファ等の作業領域へのコピーなしで通信を行うことができる。この通信を、以下の説明では、バッファなし通信(non-buffered communication)と呼ぶ。送信側または受信側が不連続データの場合には、図12(B)から(D)のように、バッファ領域を仲介した通信を行う。これらの通信を、以下の説明では、バッファあり通信(buffered communication)と呼ぶ。
バッファなし通信は、(式1)におけるLatencyが小さいので通信効率がよい。しかし、送信側と受信側で共通に連続なデータ範囲を選択する必要があるので、データ量nを大きくするのが難しい。近年の並列計算機では、Latencyを通信全体の時間の半分以下とするには、例えばデータ量nを数千バイト以上としなければいけない場合がある。一方、バッファあり通信は、バッファを介して通信することで、一度に通信されるデータ量nを大きくすることができる。しかし、自ノードと通信先の両方のデータ分散に対応したバッファリングやアンバッファリングは複雑であり、これを効率よく行うことは難しい。
上述したように、グローバルビューを持つ並列言語におけるノード間通信のパターンは、多くの場合、Fortranの配列代入文の形で表現できる。これに対応して生成される通信は、分散されたデータから分散されたデータへの、多対多のノード間通信となる。
図13は、仮想グローバル配列間の代入とノード間の多対多通信の関係の一例を示す。
コンパイラは、グローバルインデックスで表現された配列の代入を、複数ノードのローカルインデックス間の代入に変換し、さらに、複数ノードのアドレス間の多対多通信に変換する。図13においては、グローバル配列Aからグローバル配列Bへの代入は、複数のノードのローカル配列aからローカル配列bへの代入に変換される。そしてさらに、複数のノードのローカル配列aに対応するアドレス空間に格納されたデータが、ローカル配列bに対応するアドレス空間に代入される。
グローバル配列間の代入は、上述した3通りの実行状態に対して実行される。通信には、バッファリングのオーバーヘッドコストを避けるためのバッファなし通信と、バッファリングによって通信の一括化を狙うバッファあり通信がある。
以下の説明では、共通に以下の文字を用いる。すなわち、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]に、それぞれ変換できる。
次に、実施形態に対する比較例として、データ通信の一例について説明する。ここでは上述した3つのパターンのプログラムの実行状態のそれぞれにおけるデータ通信について説明する。尚、以下の説明では、Put通信においては、送信側ノードを一次側ノードと記し、受信側ノードを二次側ノードと記す。また、Get通信においては、受信側ノードを一次側ノードと記し、送信側ノードを二次側ノードと記す。
(比較例におけるバッファなしPut通信)
先ず、比較例におけるバッファなしPut通信の一例について説明する。比較例におけるバッファなしPut通信は、実行状態1、すなわち、送信ノードのすべてが実行している状態における通信である。配列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
について、以下の多重ループを実施する(S2)。この多重ループにおいて、一次側ノードはPut手順1を実行する。
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
(Put手順1)を実施
end for
...
end for
図14は、比較例におけるPut手順1の一例を示す。図14においては、一次側ノードは先ず、jに基づいて、一次側のグローバルインデックスkを取得する(S2−1)。すなわち、一次側ノードは、以下の手順を実行する。
for u = 1 to U
k[u] = fu( j )
end for
次に、一次側ノードは、kに基づいて、一次側のノードインデックスxとローカルインデックスiを取得する(S2−2)。すなわち、一次側ノードは、以下の手順を実行する。
for u = 1 to U
x[u] = gtopA(k[u])
i[u] = gtolA(k[u])
end for
次に、一次側ノードは、xが自ノードか否かを確認する(S2−3)。そして、xが自ノードのインデックスでないときには、一次側ノードは、S2−4からS2−7は実施せずループにおける次のjに対する処理を実行する。
xが自ノードである場合、一次側ノードは、jに基づいて、二次側のグローバルインデックスk’を取得する(S2−4)。すなわち、一次側ノードは、以下の手順を実行する。
for v = 1 to V
k’[v] = gv( j )
end for
次に、一次側ノードは、k’に基づいて、二次側のノードインデックスyとローカルインデックスi’を取得する(S2−5)。すなわち、一次側ノードは、以下の手順を実行する。
for v = 1 to V
y[v] = gtopB(k’[v])
i’[v] = gtolB(k’[v])
end for
次に、一次側ノードは、yにおけるbのベースアドレスとi’に基づいて、二次側のアドレスを算出する(S2−6)。
次に一次側ノードは、自ノードのa( i ) の1要素を、ノードyの二次側のアドレスへputする(S2−7)。そして、一次側ノードは、次のjに対する処理を実行する。
(比較例におけるバッファなしGet通信)
次に、比較例におけるバッファなしGet通信の一例について説明する。比較例におけるバッファなしGet通信は、実行状態2、すなわち、受信ノードのすべてが実行している状態における通信である。配列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
について、以下の多重ループを実施する(S3)。この多重ループにおいて、一次側ノードはGet手順1を実行する。
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
(Get手順1)を実施
end for
...
end for
図15は、比較例におけるGet手順1の一例を示す。処理の詳細については、一次側のすべてのノードxは、(S2−7)においてputの代わりにgetを用いる(S3−7)以外は、図14に示した(比較例におけるバッファないPut通信)におけるものと同じである。(S3−n)(1≦n≦6、nは整数)の各ステップは、それぞれ(S2−n)に対応する。
比較例における、バッファなしPut通信とバッファなしGet通信の方法では、通信は配列要素の1要素ずつに対して生成されているため、通信遅延時間の総和は非常に大きくなる。比較例における、バッファなしPut通信とバッファなしGet通信のアルゴリズムは、データの連続性が判断できないアルゴリズムであるため、通信の一括化ができない。また、自ノードがもつ分散後の範囲ではなく、グローバルな通信データの要素数だけすべてのノードでループ処理が行われるため、アルゴリズムのスケーラビリティも悪い。
(比較例におけるバッファなし両側通信)
次に、比較例におけるバッファなし両側通信の一例について説明する。比較例におけるバッファなし両側通信は、実行状態3、すなわち、送信ノードと受信ノードのすべてが、集団的な実行をしている状態である。比較例におけるバッファなし両側通信は、配列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
について、以下の多重ループを実施する。この多重ループにおいて、送信ノードは送信ノード通信手順1を実行する。
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
(送信ノード通信手順1)
end for
...
end for
図16は、比較例におけるバッファなし両側通信の送信ノード通信手順1の一例を示す。図16において送信ノードは先ず、jに基づいて、送信側のグローバルインデックスkを取得する(S4−1)。すなわち、送信ノードは、以下の手順を実行する。
for u = 1 to U
k[u] = fu( j )
end for
次に、送信ノードは、kに基づいて、送信側のノードインデックスxとローカルインデックスiを取得する(S4−2)。すなわち、送信ノードは、以下の手順を実行する。
for u = 1 to U
x[u] = gtopA(k[u])
i[u] = gtolA(k[u])
end for
次に、送信ノードは、xが自ノードか否かを確認する(S4−3)。そして、xが自ノードのインデックスでないときには、送信ノードは、S4−4からS4−6は実施せず次のjに対する処理を実行する。
xが自ノードである場合、送信ノードは、jに基づいて、受信側のグローバルインデックスk’を取得する(S4−4)。すなわち、送信ノードは、以下の手順を実行する。
for v = 1 to V
k’[v] = gv( j )
end for
次に、送信ノードは、k’に基づいて、受信側のノードインデックスyを取得する(S4−5)。すなわち、送信ノードは、以下の手順を実行する。
for v = 1 to V
y[v] = gtopB(k’[v])
end for
次に送信ノードは、自ノードのa(i)の1要素を、ノードyへ送信する(S4−6)。このとき送信ノードは、同じ(x,y)の組をもつ、後述する手順S5−6の受信と対応するようにタグ付けする。
そして、送信ノードは、次のjに対する処理を実行する。
次に受信ノードの動作について説明する。受信ノードは、すべての通信データのインデックス
j = (j[1], ..., j[D]) ; j[1] = 0, ..., N[1] - 1;...; j[D] = 0, ..., N[D] - 1
について、以下の多重ループを実施する。この多重ループにおいて、受信ノードは受信ノード通信手順1を実行する。
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
(受信ノード通信手順1)
end for
...
end for
図17は、比較例におけるバッファなし両側通信の受信ノード通信手順1の一例を示す。図17において受信ノードは先ず、jに基づいて、受信側のグローバルインデックスk’を取得する(S5−1)。すなわち、受信ノードは、以下の手順を実行する。
for v = 1 to V
k’[v] = gv( j )
end for
次に、受信ノードは、k’に基づいて、受信側のノードインデックスyとローカルインデックスi’を取得する(S5−2)。すなわち、受信ノードは、以下の手順を実行する。
for v = 1 to V
y[v] = gtopB(k’[v])
i’[v] = gtolB(k’[v])
end for
次に、受信ノードは、yが自ノードか否かを確認する(S5−3)。そして、yが自ノードのインデックスでないときには、受信ノードは、S5−4からS5−6は実施せず次のjに対する処理を実行する。
yが自ノードである場合、受信ノードは、jに基づいて、送信側のグローバルインデックスkを取得する(S5−4)。すなわち、受信ノードは、以下の手順を実行する。
for u = 1 to U
k[u] = fu( j )
end for
次に、受信ノードは、kに基づいて、送信側のノードインデックスxを取得する(S5−5)。すなわち、受信ノードは、以下の手順を実行する。
for u = 1 to U
x[u] = gtopA(k[u])
end for
次に受信ノードは、ノードxから、1要素を自ノードのb( i’ ) に受信する(S5−6)。このとき受信ノードは、同じ(x,y)の組をもつ手順S4−6の送信と対応するようにタグ付けする。
そして、送信ノードは、次のjに対する処理を実行する。
尚、送信ノードと受信ノードの両方に属すノードは、図16と図17を任意の順序で実施してよい。
(比較例におけるバッファあり両側通信)
次に、比較例におけるバッファなし両側通信の一例について説明する。比較例におけるバッファあり両側通信は、実行状態3、すなわち、送信ノードと受信ノードのすべてが、集団的な実行をしている状態である。バッファあり両側通信においては、配列Aの分散先である送信ノードと、配列Bの分散先である受信ノードが協調して動作する。
比較例におけるバッファあり両側通信の具体的な動作について説明する。先ず送信ノードは、十分な長さの送信バッファSendBuffを、受信ノードの数だけ確保する。また受信ノードは、十分な長さの受信バッファRecvBuffを、送信ノードの数だけ確保する。
次に送信ノードは、すべての通信データのインデックス
j = (j[1], ..., j[D]) ; j[1] = 0, ..., N[1] - 1;...; j[D] = 0, ..., N[D] - 1
について、以下の多重ループを実施する(S6)。この多重ループにおいて、送信ノードは送信ノード通信手順2を実行する。
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
(送信ノード通信手順2)
end for
...
end for
図18は、比較例におけるバッファあり両側通信の送信ノード通信手順2の一例を示す。図18において送信ノードは先ず、jに基づいて、送信側のグローバルインデックスkを取得する(S6−1)。すなわち、送信ノードは、以下の手順を実行する。
for u = 1 to U
k[u] = fu( j )
end for
次に、送信ノードは、kに基づいて、送信側のノードインデックスxとローカルインデックスiを取得する(S6−2)。すなわち、送信ノードは、以下の手順を実行する。
for u = 1 to U
x[u] = gtopA(k[u])
i[u] = gtolA(k[u])
end for
次に、送信ノードは、xが自ノードか否かを確認する(S6−3)。そして、xが自ノードのインデックスでないときには、送信ノードは、S6−4〜S6−6は実施せず次のjに対する処理を実行する。
xが自ノードである場合、送信ノードは、jに基づいて、受信側のグローバルインデックスk’を取得する(S6−4)。すなわち、送信ノードは、以下の手順を実行する。
for v = 1 to V
k’[v] = gv( j )
end for
次に、送信ノードは、k’に基づいて、受信側のノードインデックスyを取得する(S6−5)。すなわち、送信ノードは、以下の手順を実行する。
for v = 1 to V
y[v] = gtopB(k’[v])
end for
次に送信ノードは、自ノードのa( i ) の1要素をコピーし、SendBuff[y]の末尾へ加える(S6−6)。
そして、送信ノードは、次のjに対する処理を実行する。
次に、送信ノードは、SendBuffのデータを対応する受信ノードへ送信する(S7−1)。
次に受信ノードの動作について説明する。受信ノードは、RecvBuffに対応する送信ノードからのデータを受信する(S7−2)。そして、受信ノードは、すべての通信データのインデックス
j = (j[1], ..., j[D]) ; j[1] = 0,..., N[1] - 1; ...; j[D] = 0, ..., N[D] - 1
について、以下の多重ループを実施する。この多重ループにおいて、受信ノードは受信ノード通信手順2を実行する。
for j[D] = 0 to N[D] - 1
...
for j[1] = 0 to N[1] - 1
(受信ノード通信手順2)
end for
...
end for
図19は、比較例におけるバッファあり両側通信の受信ノード通信手順2の一例を示す。図19において受信ノードは先ず、jに基づいて、受信側のグローバルインデックスk’を取得する(S8−1)。すなわち、受信ノードは、以下の手順を実行する。
for v = 1 to V
k’[v] = gv( j )
end for
次に、受信ノードは、k’に基づいて、受信側のノードインデックスyとローカルインデックスi’を取得する(S8−2)。すなわち、受信ノードは、以下の手順を実行する。
for v = 1 to V
y[v] = gtopB(k’[v])
i’[v] = gtolB(k’[v])
end for
次に、受信ノードは、yが自ノードか否かを確認する(S8−3)。そして、yが自ノードのインデックスでないときには、受信ノードは、S8−4からS8−6は実施せず次のjに対する処理を実行する。
yが自ノードである場合、受信ノードは、jに基づいて、送信側のグローバルインデックスkを取得する(S8−4)。すなわち、受信ノードは、以下の手順を実行する。
for u = 1 to U
k[u] = fu( j )
end for
次に、受信ノードは、kに基づいて、送信側のノードインデックスxを取得する(S8−5)。すなわち、受信ノードは、以下の手順を実行する。
for u = 1 to U
x[u] = gtopA(k[u])
end for
次に受信ノードは、RecvBuff[x]の先頭から1要素を取り出し、b( i’ ) へコピーする(S8−6)。
そして、送信ノードは、次のjに対する処理を実行する。
以上、比較例における通信の手順について説明した。比較例における、バッファなしPut通信、バッファなしGet通信、バッファなし両側通信等のバッファなし通信では、配列要素の1要素ずつに対して通信が生成されているため、通信遅延時間の総和は非常に大きくなる。限定されたケースでは、送信ノードは、通信データが連続であると判断できて、データを一括化して通信することができることがある。例えば、送信側と受信側でグローバル配列の1次元目の長さが同じで、かつ分散されていないと分かっている場合には、送信ノードは、グローバル配列のうち1次元目の長さまで連続データとして扱うことができる。しかし、比較例における送信ノードにとって、対応する送信データと受信データの両方が連続であることを判断することは難しい。
比較例におけるバッファなし両側通信等のバッファあり通信では、データ分散に対応するとバッファリングのコストが大きくなる。これは、通信データの全要素に対してノードインデックスとローカルインデックスを計算しているため、1要素のバッファリングにかけるコストが非常に大きくなるからである。
状態1と状態2においては、二次側のノードは能動的に実行していないことが前提なので、put通信における受信側と、get通信における送信側のバッファリングは困難である。二次側のプロセッサへの割り込みや、デーモンプロセスまたはスレッドにより、二次側のバッファリングは実現可能であるが、二次側に負荷がかかることになり、システム全体の性能が下がる原因になる。
以上から、自由なデータ分散とグローバルビューの通信を許す並列言語では、コンパイラは通信の性能を出すことが難しい。
比較例における通信方法では、1要素の通信またはバッファリングのために多数の手順の実施が必要であり、効率が悪い。これに対して、以下で説明する実施形態に係る通信方法は、バッファあり通信においてもバッファなし通信においても、データの連続性を抽出して、連続するデータ毎にデータを通信する。これにより、通信の効率化を図ることができる。ここで連続するデータとは、それらのデータが格納されるアドレスが連続するデータである。
また実施形態に係るバッファなし通信では、送信ノードxと受信ノードyの組み合わせに対して、送信側と受信側で共通に連続である区間を判定する。ここで送信側と受信側で共通に連続である区間とは、送信側ノードにおいてデータが格納されている領域のアドレスが連続する区間であって、受信側ノードにおいてデータが格納される領域のアドレスが連続する該区間である。尚、送信側と受信側で共通して連続であるデータとは、送信側と受信側で共通に連続である区間に格納されたデータを指す。送信側と受信側で共通に連続である区間のデータを一度に通信することで、通信の効率化を図ることができる。
さらに実施形態に係るバッファあり通信では、packやunpackの処理を必要としない連続区間を事前に検出し、データとバッファの間で単純なメモリコピーを行う。これによりバッファへのデータのコピー、またはバッファからのデータのコピーを高速化でき、その結果、通信の効率化を図ることができる。
また、実施形態に係る通信方法は、複数の要素や要素の区間を対象として通信を行うことで、メモリからバッファへの集積(pack)と、バッファからメモリへの分配(unpack)に要するコストを小さくすることができる。packとunpackに要するコストは、通信遅延時間に加算されるものである。実施形態に係る通信方法では、通信の効率化を図ることができる。
データの連続性を阻害する要因は、後述のように多数あり、要因も複雑であるため、これらを正しくかつ効率よく判定して長い連続区間を抽出することは難しい。そこで、実施形態に係る通信方法は、グローバルでなくローカルな通信データ範囲についての反復処理を行うことで、効率的なデータの通信を実現し、高並列時の無駄な反復や判断のコストを抑えることにより、データの連続性を効率よく判定する。また、例えばFortranの多次元配列のように、次元を跨ぐデータの連続性が仕様で保障されている言語が用いられる場合、次元を跨いだ連続性の抽出が行われる。
比較例におけるバッファあり両側通信では、送信バッファと受信バッファの適切なサイズを決めることは難しい。また、各ノードに全ノード分のバッファを用意しなければならず、高並列になるとメモリ使用量が増大し、高並列の通信の実現が困難になる。実施形態に係るバッファあり通信方式では、バッファの割付けが通信で使用する最小限のサイズで行われる。そのため、高並列でもバッファ領域のためのメモリ使用量を小さく抑えることができる。
また、実施形態に係る通信方法は、正規化された通信を対象とし、オーバーヘッドコストによる遅延時間の増加を抑えながら一度に通信するデータの量を大きくすることで、通信を高速に実現する。実施形態に係る通信方法は、コンパイラの中で通信コード生成に利用することもできるし、実行時ライブラリの実装に利用することもできる。
ここで、グローバルデータの連続性を壊す要因について説明する。グローバルデータの連続性を壊す要因には、例えば以下のようなものがある。
(1.不連続な添字)
アクセス対象のデータの指定に配列の添字式が使用される場合、指定される添字式の範囲が不連続だと、アクセス対象のデータは不連続になる。添字三つ組や間接参照による部分配列の参照がこれに当たる。これは、具体的には例えばA(2:8:2)やA(IX(1:8))などのようにアクセス対象データが指定された場合である。
(2.添字範囲/次元跨ぎ)
Fortranでは、参照されるデータがk-次元目において連続であっても、k-次元目の下限から上限までの全てが参照されていなければ、参照されるデータは(k+1)-次元目に跨る連続とはならない。例えば、宣言形状がA(8,8)のとき、A(1:8, 2:3)は次元を跨ぐ8*2=16要素の連続となるが、A(1:7, 2:3)は次元を跨ぐ連続とはならず、7要素の連続となる。
なお、Fortranでは最も左の添字、C言語では最も右の添字が1次元目となる。次元を跨ぐ配列要素の並び順が規定されていない言語では、次元を跨ぐ連続性は保障されない。
(3.分散の実装方法)
分散の実装方法によっては、グローバル配列の添字が連続であっても、対応するローカル配列の添字が連続であると保障されない場合がある。例えば、cyclic分散について分散データが圧縮されずに割り付けられる実装方法では、A(1:100)が3ノードにcyclic分散されると、分散されるデータは、それぞれストライド幅3の不連続なアドレスに割り付けられるかもしれない。
(4.分散の端数/次元跨ぎ)
k-次元目の分散でインデックスがノード数で割り切れない場合、割り付けの大きさをノード間で一定にする実装では、(k+1)-次元目に跨る連続とならない。例えば、宣言形状がA(8,8)のデータが、1次元目がblock分散で3ノードに分散される場合、割り当てがそれぞれA(1:3, 1:8), A(4:6, 1:8), A(7:8, 1:8)となる。このとき、最後のノードだけ1次元目の割り当てが少なくなる。このような場合にすべてのノードで同じサイズの領域が割り付けられると、最後のノードだけは次元を跨ぐ連続にならない。
(5.不均等な分散/次元跨ぎ)
k-次元目が不均等block分散、block-cyclic分散、またはindirect分散の場合、たとえインデックスがノード数で割り切れても、(k+1)-次元目に跨る連続とならない場合がある。例えば、1次元目が不均等block分散でその分散幅がノード毎にそれぞれ1,3,3,2である場合、各ノードの割付けの大きさが、分散幅の最大値3で統一される実装では、第1と第4のノードでは2次元目に跨る連続にならない。
(6.間接的なマッピング/次元跨ぎ)
HPFなどの言語では、グローバル配列を直接ノードに分散するのでなく、テンプレートと呼ばれる仮想的な配列に整列(align)させ、テンプレートを分散することにより、間接的にグローバルデータを分散させることができる。このようなとき、グローバル配列のk-次元目の大きさがテンプレートの対応する次元の大きさと一致する場合を除いて、(k+1)次元目に跨る連続にならない。例えば、グローバル配列の形状がA(10,8)、テンプレートの形状がT(12,8)で、A(i,j) が T(i+1, j) に整列され、1次元目が4ノードに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)となる。テンプレートの形状でメモリ割付けが行われる実装では、第1と第4のノードでは1次元目がテンプレートの1次元目の大きさより小さいので、2次元目に跨る連続にならない。
以上、グローバルデータの連続性を壊す要因の一例を説明した。
図20は、実施形態の送信処理に係る情報処理装置の構成の一例を示す。図20において、情報処理システム10においては、複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている。そして情報処理システム10は、第1ノード11と第2ノード12を含む。情報処理装置11は、情報処理システムに含まれる第1ノード11である。
情報処理装置(第1ノード)11は、記憶部13、取得部14、検出部15、送信部16、及び確保部17を含む。
記憶部13は、所定の単位に区画された第1の記憶領域に、第1ノード11に割り当てられたローカルデータを記憶する。ここで区画は、記憶領域の所定のアドレスの範囲で示される連続領域である。
取得部14は、第1ノード11から第2ノード12に対する書き込み対象である対象ローカルデータの書き込み指示を取得する。
検出部15は、格納領域情報に基づき、第2ノード12が備える他の記憶部において所定の単位に区画された第2の記憶領域のうち、対象ローカルデータを書き込む連続する複数の連続区画を検出する。格納領域情報は、グローバルデータにおいて対象ローカルデータが対応するデータを特定する情報である。ここで連続する区画同士は、一方の区画の末尾アドレスと一方の区画の先頭アドレスとが連続する関係となる。
送信部16は、第1の記憶領域に格納されたローカルデータを、検出部15が検出した連続区画の区画数だけ取り出して第2ノード12に送信する。
送信部16が、第2ノード12における第2の記憶領域の区画のうち、連続する複数の区画に格納されるデータ毎に、記憶部13からローカルデータを取り出して第2ノード12へ送信することで、通信の効率化を図ることができる。
また、格納領域情報は、第1ノード11に割り当てられた対象ローカルデータを特定する情報と、第2ノード12に割り当てられた対象ローカルデータを特定する情報を含む。この格納領域情報に基づいて、検出部15は、第2の記憶領域の連続区画のうち、当該連続区画に書き込まれる対象ローカルデータが格納された第1の記憶領域の区画が連続する複数の連続区画を検出する。そして送信部16は、第1の記憶領域に格納されたローカルデータを、検出部15が検出した連続区画の区画数だけ取り出して第2ノード12に送信する。
送信部16が、第1の記憶領域と第2の記憶領域で共通に連続する複数の区画に格納されるデータ毎に、記憶部13からローカルデータを取り出して第2ノード12へ送信することで、通信の効率化を図ることができる。
また、送信部16は、記憶部13から、連続区画の区画数だけ、第1の記憶領域に格納されたローカルデータを取り出して、所定のバッファ領域に格納し、該バッファ領域に格納したローカルデータを、所定の単位で、第2ノード12へ送信する。
送信部16が、検出部15により検出された連続する複数の区画数に対応する区画数分のローカルデータを記憶部13から取り出して所定のバッファ領域に格納することで、バッファへの効率的なデータの格納が可能になる。
確保部17は、検出部15により検出された連続区画の区画数に応じたサイズのバッファ領域を確保する。これにより、バッファ領域のサイズを、通信で使用する最小限のサイズに抑えることができ、通信で使用されるメモリ使用量を抑制することができる。
第2ノード12は第1ノード11と通信を行う情報処理装置である。第2ノード12は、第1ノード11から連続区画の区画数のローカルデータを受信して、第2の記憶領域に格納する。
格納領域情報は、例えば多次元配列で表現された、第2ノード12のローカル配列情報を含んでもよい。検出部15は、格納領域情報の多次元配列のインデックスの連続性に基づいて、連続する複数の区画を検出する。具体的には例えば、検出部15は、格納領域情報の多次元配列の一次元目のインデックスが連続する多次元配列の区間に対応する区画を、連続する複数の区画であると判定する。また例えば、検出部15は、格納領域情報の多次元配列のインデックスが次元を跨いで連続する多次元配列の区間に対応する区画を、連続する複数の区画であると判定する。さらに格納領域情報は、例えば多次元配列で表現された、第1ノード11のローカル配列情報を含んでもよい。
また格納領域情報は、具体的には例えば、受信側のノード配列の各次元の寸法、分散の種別を示す情報、及び、ノード配列の各次元に対するグローバル配列の情報を含んでもよい。これについては後ほど図30を用いて説明する。
ここで、実施形態に係る送信処理に係る情報処理装置の動作の一例を説明する。図21は、実施形態に係る送信処理に係る情報処理装置の動作の一例を示す。図21においては、グローバル配列Aのデータをグローバル配列Bに代入する操作に対応する通信の例である。グローバル配列A、Bはそれぞれ、複数のノードに分散されて配置される。第1ノード11は、グローバル配列Aが分散されて配置された複数のノードのうちの1つである。第2ノード12は、グローバル配列Bが分散されて配置された複数のノードのうちの1つである。
図21において、第1ノード11から第2ノード12へのバッファを介さないデータの書き込みについて考える。先ず、第1ノード11は、格納領域情報に基づき、第1ノード11の対象ローカルデータが格納された領域と、第2ノード12の対象ローカルデータが書き込まれる領域との間で、共通して連続する複数の連続区画を検出する(A1)。そして第1ノード11は、検出した連続区画の区画数毎にデータを第2ノードに送信する(A2)。この通信の詳細については、後ほど(バッファなしPut通信)において説明する。
図22は、実施形態の受信処理に係る情報処理装置の構成の一例を示す。図22において、情報処理システム20においては、複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている。そして情報処理システム20は、第1ノード21と第2ノード22を含む。情報処理装置22は、情報処理システムに含まれる第2ノード22である。
情報処理装置(第2ノード)22は、記憶部23、取得部24、検出部25、要求部26、受信部27、及び確保部28を含む。
記憶部23は、所定の単位に区画された第2の記憶領域を含む。記憶部23は、情報処理装置22にローカルデータ領域を割り当てられる。
取得部24は、第2ノード22に対する第1ノード21からの読み込み対象である対象ローカルデータの読み込み指示を取得する。
検出部25は、格納領域情報に基づき、第1ノード21が備える他の記憶部において所定の単位に区画された第1の記憶領域のうち、対象ローカルデータを読み出す連続する複数の連続区画を検出する。格納領域情報は、グローバルデータにおいて対象ローカルデータが対応するデータを特定する情報である。
要求部26は、第1の記憶領域に格納されたローカルデータを、検出部25が検出した連続区画の区画数だけ取り出して第2ノード22に送信することを、第1ノード21に要求する。
受信部27は、第1ノード21から、要求部26による要求に応じて送信された連続区画の区画数のローカルデータを受信して第2の記憶領域に格納する。
受信部27が、第1ノード21における第1の記憶領域の区画のうち、連続する複数の区画に格納されたデータ毎に、第1ノード21からローカルデータを受信することで、通信の効率化を図ることができる。
また、格納領域情報は、第1ノード21に割り当てられた対象ローカルデータを特定する情報と、第2ノード22に割り当てられた対象ローカルデータを特定する情報を含む。この格納領域情報に基づいて、検出部25は、第1の記憶領域の連続区画のうち、当該連続区画からデータが読み出されて格納される第2の記憶領域の区画が連続する複数の連続区画を検出する。そして受信部27は、第1ノード21から、要求部26による要求に応じて送信された連続区画の区画数のローカルデータを受信して第2の記憶領域に格納する。
受信部27が、第1の記憶領域と第2の記憶領域で共通に連続する複数の区画に格納されるデータ毎に、第1ノード21からローカルデータを受信することで、通信の効率化を図ることができる。
また、受信部27は、ローカルデータを受信して所定のバッファ領域に格納し、該バッファ領域から、検出部25が検出した連続区画の区画数だけ取り出して第2の記憶領域に格納する。
受信部27が、検出部25により検出された連続区画の区画数分のローカルデータをバッファ領域から取り出して記憶領域に格納することで、バッファ領域から記憶領域への効率的なデータの格納が可能になる。
確保部28は、検出部25により検出された連続区画の区画数に応じたサイズのバッファ領域を確保する。これにより、バッファ領域のサイズを、通信で使用する最小限のサイズに抑えることができ、通信で使用されるメモリ使用量を抑制することができる。
第1ノード21は、第2ノード22と通信を行う情報処理装置である。第2ノード22からの要求に応じて、第1の記憶領域に格納されたローカルデータを、連続区画の区画数だけ取り出して第2ノード22に送信する。
格納領域情報は、例えば多次元配列で表現された、第1ノード21のローカル配列情報を含んでもよい。また格納領域情報は、例えば多次元配列で表現された、第2ノード22のローカル配列情報を含んでもよい。格納領域情報は、具体的には例えば、送信側のノード配列の各次元の寸法、分散の種別を示す情報、及び、ノード配列の各次元に対するグローバル配列の情報を含んでもよい。
検出部25は、検出部15と同様にして、連続区画を検出する。尚、情報処理装置11と情報処理装置22は、同じ情報処理装置であっても良い。
ここで、実施形態に係る受信処理に係る情報処理装置の動作の一例を説明する。図23は、実施形態に係る送信処理に係る情報処理装置の動作の一例を示す。図23においては、グローバル配列Aのデータをグローバル配列Bに代入する操作に対応する通信の例である。グローバル配列A、Bはそれぞれ、複数のノードに分散されて配置される。第1ノード21は、グローバル配列Aが分散されて配置された複数のノードのうちの1つである。第2ノード22は、グローバル配列Bが分散されて配置された複数のノードのうちの1つである。
図23において、第1ノード21から第2ノード22へのバッファを介さないデータの読み出しについて考える。先ず、第2ノード21は、格納領域情報に基づき、第1ノード21の対象ローカルデータが格納された領域と、第2ノード22の対象ローカルデータが書き込まれる領域との間で、共通して連続する複数の連続区画を検出する(B1)。そして第2ノード21は、検出した連続区画の区画数毎にデータを第1ノード21から取得する(B2)。この通信の詳細については、後ほど(バッファなしGet通信)において説明する。
図24は、実施形態に係る通信システムの構成の一例を示す。図24において通信システム40は、複数のノード30(30a〜30c)を含む。各ノード30は互いに、インターコネクトや、Local Area Network(LAN)等の通信ネットワークを介して接続される。
通信システム40においては、プログラミング言語で定義された仮想グローバル空間に置かれるグローバルデータや、ストライピングなどストレージを跨いで配置されたデータは、仮想多次元ノード配列に分散配置されたグローバル配列として抽象化される。通信システム40における通信は送信側グローバル配列Aと受信側グローバル配列Bの全体または部分配列間の代入として表現できる。グローバル配列は、通信システム40に含まれるノード群の全体または部分に分散されていても、単一のノードに置かれていてもよい。
通信システム40におけるノード間通信は、例えば以下のFortranの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に属するノードは、物理的に同じであっても、一部が重なっていても、すべてが異なっていてもよい。
通信システム40では、分散の種類は図3を参照して説明した5種類と、これに非分散を加えた6種類から1つが、配列の各次元に対して選択される。尚、分散の種類はこれら6種類に限定されない。
ノード配列Pとノード配列Qの両方のすべてのノードのプロセッサが能動的であるとは限らず、上述したように通信システム40におけるノードの実行状態には3つの状態がある。通信システム40では、ノード配列Pが能動的な場合にはノード配列Pからのput通信、ノード配列Qが能動的な場合にはノード配列Qからのget通信が利用される。両方が能動的な場合には、実施形態に係る通信システムでは、両側通信とput通信とget通信のうちのどれが利用されてもよい。
実施形態に係るバッファなし通信では、通信を行うノードはバッファリングを行わないことで、通信遅延時間の短縮を行う。また、実施形態に係るバッファなし通信では、通信を行うノードは送信側データと受信側データで共通に連続である区間を正確に検出することによって、一度に通信するデータ量を大きくする。
実施形態に係るバッファあり通信では、通信を行うノードは、バッファリングによって一度に通信するデータ量を増やす。また、実施形態に係るバッファあり通信では、通信を行うノードは、通信相手に対応する自ノードのデータの連続である区間を正確に検出することによって、バッファリングを高速化する。
実施形態に係る通信システムでは、プログラムの実行状態、及び、バッファを使用するか否かに応じて、5種類の通信が行われる。実施形態に係る通信の種類は、すなわち、バッファなしPut通信、バッファありPut通信、バッファなしGet通信、バッファありGet通信、バッファあり両側通信である。
以下の説明において、「評価する」とは、実行時ライブラリでの実装ではその値を得ることを意味し、コンパイラでの実装では内部表現の数式として作成または簡単化することを意味する。
各ノード30は、通信がグローバル配列Aとグローバル配列B間の代入の形式で表現される場合、ノード配列P、Qのいずれかまたは両方に含まれる。すなわち、各ノード30は、グローバル配列A、Bのいずれかまたは両方に対応するローカル配列を記憶する。
各ノード30は、記憶部31(31a〜31c)、取得部32(32a〜32c)、解析部33(33a〜33c)、整列部34(34a〜34c)、検出部35(35a〜35c)、及び、通信部36(36a〜36c)を含む。さらに各ノード30は、バッファ確保部37(37a〜37c)、及び、バッファ制御部38(38a〜38c)を含む。
ノード30は、情報処理装置11、及び情報処理装置22の一例である。また、ノード30は、第2ノード12、及び第2ノード22の一例である。記憶部31は、情報処理装置11の記憶部13、及び、情報処理装置22の記憶部23の一例である。取得部32は、情報処理装置11の取得部14、及び、情報処理装置22の取得部24の一例である。検出部35は、情報処理装置11の検出部15、及び、情報処理装置22の検出部25の一例である。通信部36は、情報処理装置11の送信部16、及び、情報処理装置22の要求部26と受信部27の一例である。バッファ確保部37は、情報処理装置11の確保部17、及び、情報処理装置22の確保部28の一例である。バッファ制御部38は、情報処理装置11の送信部16、及び、情報処理装置22の受信部27の一例である。
記憶部31は、複数のノード間のデータ通信の通信対象となるデータ(以下、通信データと記す)を格納する。具体的には記憶部31は、通信がグローバル配列Aとグローバル配列B間のグローバル配列間の代入の形式で表現される場合、グローバル配列A、Bのいずれかまたは両方の実体が分割して割り付けられたローカル配列を記憶する。通信データは対象ローカルデータの一例である。
また、記憶部31は、通信情報テーブルを記憶する。通信情報テーブルは、格納領域情報を含む。通信情報テーブルには、送信ノード及び受信ノードにおいて、通信データが格納される領域に関する情報が格納される。すなわち、通信がグローバル配列Aとグローバル配列B間の代入の形式で表現される場合、通信情報テーブルは、グローバル配列Aのノード配列及びローカル配列に関する情報と、グローバル配列Bのノード配列及びローカル配列に関する情報とを記憶する。通信情報テーブルの詳細については後ほど説明する。
取得部32は、複数のノード間のデータ通信の指示を取得する。具体的には例えば、取得部32は、通信の指示が記載されたプログラムを受信する。通信の指示は、プログラムにおいて、例えば、グローバル配列Aとグローバル配列Bの間のようなグローバル配列間の代入の形式で表現される。このような通信の指示において、通信対象の一方のグローバル配列に対応するローカル配列は記憶部31に記憶されている。また、通信対象の他方のグローバル配列に対応するローカル配列は、ノード30に接続される他のノードに記憶されている。
解析部33は、取得部32が取得した指示に対応する通信に関連する情報を収集して、その結果を通信情報テーブルに格納する。具体的には解析部33は、取得部が取得した通信の指示が記載されたプログラムの解析を行うことにより、着目する通信に関連する情報を収集する。解析部33は、送信ノードと受信ノードの実行状態の組合せに対応したプログラムの解析を行う。
整列部34は、通信データのインデックスを並び替える。通信データのインデックスとは、通信データを配列で表現した場合の、配列のインデックスを指す。並べ替えの方法は、通信の種類に応じて異なる。バッファなしPut通信、及びバッファなしGet通信においては、整列部34は、一次側または二次側データのアクセスができるだけ連続になるように、通信データのインデックスを並び替える。バッファありPut通信、及びバッファありGet通信においては、整列部34は、二次側データのアクセスができるだけ連続になり、一次側データの下位インデックスのアクセスが出来るだけ矩形になるように、通信データのインデックスを並び替える。バッファあり両側通信においては、整列部34は、送信側と受信側の下位インデックスのアクセスができるだけ矩形になるように、2つの通信データのインデックスを並び替える。ここで、アクセスが矩形となるとは、すなわち、アクセス対象のデータが配列の添字式で表現される場合、その添字式が、区間、三つ組またはスカラで表現されるアクセスを指す。尚、実施形態において添字式が区間で表現できるデータは、連続データである。
検出部35は、複数のノード間のデータ通信において、送信側と受信側で共通なデータ単位を検出する。送信側と受信側で共通なデータ単位は、通信の種類に応じて異なる。バッファなしPut通信、及びバッファなしGet通信においては、検出部35は、通信情報テーブルの情報に基づいて、一次側と二次側で共通して連続であるデータ単位を検出する。バッファありPut通信、及びバッファありGet通信においては、検出部35は、通信情報テーブルの情報に基づいて、一次側において矩形データであって、二次側において連続であるデータ単位を検出する。矩形データ単位とは、データが区間、三つ組またはスカラで表現される通信データのインデックス範囲(以下、通信インデックス範囲と記す場合がある)を指す。バッファあり両側通信においては、検出部35は、通信情報テーブルの情報に基づいて、送信側と受信側に共通な矩形データ単位(以下、共通矩形データ単位と記す場合がある)を検出する。尚、一次側と二次側で共通なデータ単位は、次元を跨いでもよい。共通矩形データは、すなわち、一次側にいて矩形データであるデータが、二次側でも矩形データとなっているデータである。
通信部36は、データの送受信を行う。データの送受信の単位は通信の種類に応じて異なり、検出部35が検出したデータ単位で通信部36はデータの送受信を行う。このように、送信側と受信側で共通なデータ単位で、一度にデータを通信することにより、通信の効率化を図ることができる。
バッファ確保部37は、バッファあり両側通信において、共通矩形データ単位に対する受信側のノードインデックスに対応する送信バッファを確保する。またバッファ確保部37は、共通矩形データ単位に対する送信側ノードインデックスに対応する受信バッファを確保する。このように共通矩形データ単位に応じてバッファを確保することにより、確保するバッファのサイズを、通信で使用するバッファの最小限のサイズに抑えることができる。また、バッファの確保において、バッファ溢れを回避するための実行時オーバヘッドも発生しない。この結果、通信が高並列で実行される場合であっても、実際に通信が行われる相手のノードに対してだけバッファが確保されるため、各ノードにおけるバッファ領域のためのメモリ使用量を小さく抑えることができる。
バッファ制御部38は、バッファありPut通信において、矩形データ単位に対応する自ノードのローカルデータを、送信バッファに集約(pack)する。またバッファ制御部38は、バッファありGet通信において、受信バッファにあるデータを、矩形データ単位に対応する自ノードのローカルデータ領域に分配(unpack)する。さらに、バッファ制御部38は、バッファあり両側通信において、共通矩形データ単位の送信データを、送信バッファへ集約(pack)するコードを生成する。またバッファあり両側通信において、バッファ制御部38は、共通矩形データ単位の受信データを、受信バッファから分配(unpack)する。このようにバッファ制御部38は、メモリ上のデータの連続性に基づいて、packまたはunpack処理を実行する。このため、packまたはunpack処理を高速化できる。また、バッファ制御部38は、pack及びunpackを、グローバルでなくローカルな通信データ範囲におけるデータ単位で、反復して行う。このため、通信が高並列で実行される場合であっても、無駄な反復処理や判断のコストが抑えることができる。
(バッファなしPut通信)
実施形態に係るバッファなしPut通信において、通信データは一次側ノードxから二次側ノードyに送信される。一次側と二次側で対応するデータが共に連続している範囲を、一度にputする通信データ単位とする。データは、通信データ単位毎に分割され、一次側も二次側もバッファなしでput通信される。通信データ単位にはxとyで共通に連続な区間Jccが選択される。
図25は、実施形態に係るバッファなしPut通信の処理を図解したフローチャートの一例である。
図25において、先ず取得部32は、Put通信の指示を受信する(S101)。このPut通信の指示は、状態1の通信が表現されているプログラムである。このプログラムは、具体的には例えば、グローバル配列間の代入の形式で表現されるプログラムである。
次に、解析部33は、状態1プログラムの解析を行う(S102)。状態1プログラムの解析を行うことにより解析部33は、着目する通信に関連する情報を通信情報テーブルに格納する。状態1プログラムの解析、及び、通信情報テーブルの詳細については後ほど説明する。
次に整列部34は、連続性優先pivoting手順を実行する(S103)。連続性優先pivoting手順を実行することにより整列部34は、一次側または二次側データのアクセスができるだけ連続になるように、通信データのインデックスを並び替える。連続性優先pivoting手順の詳細については、後ほど説明する。尚、S103は、実行されなくてもよい。
次に検出部35は、連続データ単位検出手順を実行する(S104)。検出部35は、連続データ単位検出手順により、一次側自ノードにおいて次元を跨いで連続する通信インデックスの範囲(連続データ単位)を検出する。これにより検出部35は、連続データ単位の下位インデックスJc = (jc[1], ..., jc[Dc])と次元数Dc(0≦Dc≦D)を取得する。同時に検出部35は、Jc, Dcに対応する一次側の下位ローカルインデックス範囲Ic = (ic[1], ..., ic[Uc])と次元数Uc(0≦Uc≦U)を取得する。この手順で得られる値は一次側のノード毎に異なる。
次に通信部36は、連続データput処理を実行する(S105)。すなわち通信部36は、一次側で連続なデータ単位ごとの処理を反復して実施する。
図26は、連続データput処理の詳細の一例を示す。図26において、各ループでは、連続データ単位put手順が実行されている。連続データ単位put手順については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現されてもよい。
ここで図26において、通信部36は、jx1[d], jx2[d], jx3[d](Dc+1≦d≦D)を通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部36は、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するすべてのjx[d]について、処理を反復実行する(u = DtoU[d])。
連続データput処理の実行が完了すると、処理は終了する。
(通信情報テーブル)
次に、通信情報テーブルについて説明する。図27〜図30は、通信情報テーブルの構成の一例(その1〜その4)を示す。尚、図27〜図30は、まとめて一つの通信情報テーブルとしてもよい。また通信情報テーブルは、各項目の対応関係が保持されれば、テーブルの形式に限定されない。
図27において、通信情報テーブルは、通信データに関する以下のデータ項目を含む。すなわち通信情報テーブルは、通信データの次元数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次元目の寸法である。
図28において、通信情報テーブルは、通信データに関する以下のデータ項目を含む。すなわち通信情報テーブルは、ノードインデックスpをふくむ。また、通信情報テーブルは、通信データの各次元d = 1, ..., Dに対する、自ノードデータに対応する三つ組パラメタjx1[d], jx2[d], jx3[d]を含む。
図29において、通信情報テーブルは、一次側に関する以下のデータ項目を含む。すなわち通信情報テーブルは、ノードインデックスpを含む。また通信情報テーブルは、一次側ローカル配列の各次元u = 1, ..., Uに対する、ローカル配列添字のタイプ(「スカラ」、「区間」、「三つ組」、または「その他」)を含む。さらに、通信情報テーブルは、一次側ローカル配列の各次元u = 1, ..., Uに対する、fullSpan[u]、ローカル配列添字三つ組パラメタi1[u], i2[u], i3[u]、ローカル配列添字に対応するグローバル添字三つ組パラメタkx1[u], kx2[u], kx3[u]を含む。fullSpan[u]は、ローカル配列添字が割付け寸法の全体を張るか否かを示す。
図30において、通信情報テーブルは、二次側に関する以下のデータ項目を含む。すなわち通信情報テーブルは、二次側ノード配列の次元数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次元目の寸法である。
格納領域情報は、少なくとも、グローバル配列において通信対象の二次側のローカル配列が対応するデータを特定する情報を含む。すなわち格納領域情報は少なくとも、図30において、例えばノードの寸法Y[v]、分散種別、二次側ノード配列の各次元v = 1, ..., Vに対する、グローバル添字三つ組k1’[v], k2’[v], k3’[v]を含む。具体的な処理の詳細については、一例として、図73〜79を用いて後ほど説明する。
実施形態においては、各々の三つ組パラメタ X1, X2, X3 は、添字のタイプが「スカラ」、「区間」または「三つ組」のときその添字を表現する。タイプが「三つ組」のとき、添字三つ組X1:X2:X3を意味する。タイプが「区間」のとき、下限がX1、上限がX2である区間を意味し、X3は意味をもたない。タイプが「スカラ」のとき、スカラ値X1を意味し、X2とX3は意味をもたない。
(状態1プログラムの解析)
次に、状態1プログラムの解析について説明する。状態1プログラムの解析では、着目する通信に関連する情報を通信情報テーブルに格納する処理が実行される。解析部33は、取得部32が取得した状態1の通信が表現されているプログラムを入力として、状態1プログラムの解析を実行する。尚、状態1プログラムの解析では、送信ノードが一次側、受信ノードが二次側となる。
図31〜図33は、状態1プログラムの解析のアルゴリズムの一例(その1〜その3)を示す。解析部33は、図31〜図33に示す状態1プログラムの解析アルゴリズムの処理を実行することにより、着目する通信に関する情報が格納された通信情報テーブルを得る。
(連続性優先pivoting手順)
次に、連続性優先pivoting手順について説明する。整列部34は、通信情報テーブルと、一次側と二次側のどちらを優先するかを示す情報と、を入力として、連続性優先pivoting手順の処理を開始する。
連続性優先pivoting手順の出力として、整列部34は、通信データのD個の情報の並びがソートされた通信情報テーブルを取得する。すなわち、出力される通信情報テーブルにおいては、通信データのD個の情報の並びは、優先側のローカルデータができるだけ昇順にアクセスされるようにソートされ、それに合わせて変換テーブルUtoDとVtoDの値も変換される。
連続性優先pivoting手順において、整列部34は先ず、通信情報テーブルの中の通信データ次元dに対する項目N, j, DtoU, DtoV, jx1, jx2, jx3について、一次側優先の場合にはDtoUの値、二次側優先の場合にはDtoVの値をキーとして、昇順になるようソートする。キーの値が0または負数の場合は、1対1に対応するデータ次元がないことを意味するので、整列部34は、大きなキーと見なして最後の位置に移動させる。そして整列部34は、ソート前とソート後の位置dがどう変わったかを示す新旧テーブルを作成する。
そして整列部34は、作成した新旧テーブルを参照して、UtoDとVtoDの値dを新しい値に置き換える。
(連続データ単位検出手順)
次に、連続データ単位検出手順について説明する。検出部35は、通信情報テーブルを入力として、連続データ単位検出手順を実行する。
図34は、連続データ単位検出手順のアルゴリズムの一例を示す。検出部35は、図34に示す連続データ単位検出手順のアルゴリズムの処理を実行することにより、出力として以下の情報を得る。すなわち、連続データ単位検出手順の出力として、検出部35は、一次側データが次元を跨いで連続であるローカルインデックス範囲Ic = (ic[1], ..., ic[Uc])、及び、Icの次元数Uc(0≦Uc≦U)を得る。さらに連続データ単位検出手順の出力として検出部35は、連続データ単位、すなわち、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手順について説明する。通信部36は、連続データ単位リスト(以下、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間はその並び順に一次側データが連続している。
図35は、連続データ単位put手順のアルゴリズムの一例を示す。図35に示すアルゴリズムを実行することにより通信部36は、Jc-listに含まれるJcをすべてput通信する。
図36は、連続データ単位put手順の処理を図解したフローチャートの一例である。図36において先ず、通信部36は、連続データ単位put手順において未処理の連続データが存在するか否かを判定する(S201)。すなわち通信部36は、Jc-listが空か否かを判定する。未処理の連続データが存在しないと判定した場合(S201でNo)、処理は終了する。
一方、未処理の連続データが存在すると通信部36により判定された場合(S201でYes)、検出部35は、連続-連続データ単位検出手順を実行する(S202)。連続‐連続データ単位検出手順により、検出部35は、一次側と二次側で共通して連続であるデータ単位を検出する。具体的には検出部35は、Jcと起点を同じくし、かつ、一次側、二次側とも次元を跨いで連続になるJcの部分配列Jccと、その通信データの次元数(連続‐連続次元)Dcc(0≦Dcc≦Dc)を得る。同時に検出部35は、JcからJccを除いた部分Jcr-listを得る。連続‐連続データ単位検出手順の詳細については後ほど説明する。
次に通信部36は、連続-連続データ単位put手順を実行する(S203)。ここで通信部36は、Jccを通信データ単位とする。連続-連続データ単位put手順により、通信部36は、通信データ単位について、一次側から二次側へputする。すなわち通信部36は、送信側と受信側で共通に連続であるデータ単位で、一次側から二次側へデータをputする。これにより、通信の効率化を図ることができる。連続-連続データ単位put手順の詳細については後ほど説明する。
次に通信部36は、Jc-listの先頭に、Jcr-listを追加結合する。そして通信部36は、再度S201の処理を実行する。
(連続‐連続データ単位検出手順)
次に、連続‐連続データ単位検出手順について説明する。検出部35は、連続データ単位Jc = (jc[1], ..., jc[D])、Jcの連続次元数Dc(0≦Dc≦D)、及び通信情報テーブルを入力として、連続‐連続データ単位検出手順の処理を開始する。ここで、連続データ単位Jcは、対応する一次側データが次元を跨いで連続である通信データインデックス範囲である。
図37及び図38は、連続‐連続データ単位検出手順のアルゴリズムの一例(その1、その2)を示す。図37及び図38で示す連続‐連続データ単位検出手順のアルゴリズムを実行することにより、検出部35は出力として、以下の情報を得る。すなわち検出部35は、連続‐連続データ単位Jcc = (jcc[1], ..., jcc[D])、連続‐連続データ単位残余リストJcr-list = ( ) または( Jcr )、及び、連続-連続データ単位の長さLccを得る。さらに検出部35は、通信データの連続‐連続データ単位次元数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となる。
図38の「4 Jcr-listを得る」についての処理の様子を図39に示す。図39は、Dc = 3, Dcc = 1でjc3[1] = jc3[2] = jc3[3] = 1の場合の例であり、dd = 1から3までの反復でJcr-listには次に通信を生成すべき3つの多次元矩形が設定される。
(連続-連続データ単位put手順)
次に、連続-連続データ単位put手順について説明する。通信部36は、以下のデータ項目を入力として、連続-連続データ単位put手順の処理を開始する。入力はすなわち、通信データ単位Jcc = (jcc[1], ..., jcc[D])、連続‐連続次元数Dcc、及び、二次側(受信側)ノードインデックスycc = (ycc[1], ..., ycc[V])である。これらに加えて、入力は、二次側ローカルインデックスの起点icc1’ = (icc1’[1], ..., icc1’[V])、通信データ単位の長さLcc、及び、通信情報テーブルである。
図40は、連続-連続データ単位put手順のアルゴリズムの一例を示す。図40に示すアルゴリズムの処理を実行することにより、通信部36は、連続-連続データ単位で、一次ノードから二次ノードへデータをputする。
(バッファありPut通信)
実施形態に係るバッファありPut通信において、通信データは一次側ノードxから二次側ノードyに送信される。一度にputする通信データ単位は、一次側では効率のよいバッファリングが可能で、かつ、二次側ではデータが連続している範囲とする。データは、通信データ単位毎に分けられ、一次側ではバッファを介して、二次側ではバッファを介さずput通信される。通信データ単位には、一次側は三つ組で表される領域、二次側は連続である領域であるJtcが選択される。
図41は、実施形態に係るバッファありPut通信の処理を図解したフローチャートの一例である。
図41において先ず取得部32は、Put通信の指示を受信する(S301)。このPut通信の指示は、状態1の通信が表現されているプログラムである。このプログラムは、具体的には例えば、グローバル配列間の代入の形式で表現されるプログラムである。
次に、解析部33は、状態1プログラムの解析を行う(S302)。状態1プログラムの解析により解析部33は、着目する通信に関連する情報を通信情報テーブルに格納する。この状態1プログラムの解析は、実施形態に係るバッファなしPut通信において説明したものと同様である。
次に整列部34は、連続性優先pivoting手順を実行する(S303)。連続性優先pivoting手順を実行することにより整列部34は、二次側データのアクセスができるだけ連続になり、一次側データの下位インデックスのアクセスが出来るだけ矩形になるように、通信データのインデックスを並び替える。尚、整列部34は、一次側データを優先して通信データのインデックスを並び替えてもよい。また、S303は、実行されなくてもよい。この連続性優先pivoting手順は、実施形態に係るバッファなしPut通信において説明したものと同様である。
次に検出部35は、矩形データ単位検出手順を実行する(S304)。矩形データ単位検出手順を実行することにより検出部35は、一次側自ノードにおいて三つ組またはスカラで表現できる通信インデックスの範囲(矩形データ単位)を検出する。これにより検出部35は、矩形データ単位の下位インデックスJt = (jt[1], ..., jt[Dt])と次元数Dt(0≦Dt≦D)を得る。同時に検出部35は、Jt, Dtに対応する一次側の下位ローカルインデックス範囲It = (it[1], ..., it[Ut])と次元数Ut(0≦Ut≦U)を得る。この手順で得られる値は一次側のノード毎に異なる。
次に通信部36は、矩形データput処理を実行する(S305)。すなわち通信部36は、矩形データ単位ごとの処理を反復して実施する。図42は矩形データput処理の一例を示す。図42において、各ループでは、矩形データ単位put手順が実行されている。矩形データ単位put手順については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現してもよい。
ここで図42において、通信部36は、jx1[d], jx2[d], jx3[d](Dt+1≦d≦D)を通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部36は、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するすべてのjx[d]について反復実行する(u = DtoU[d])。
矩形データ処理の実行が完了すると、処理は終了する。
(矩形データ単位検出手順)
次に、矩形データ単位検出手順について説明する。検出部35は、通信情報テーブルを入力として、矩形データ単位検出手順の処理を開始する。
図43は、矩形データ単位検出手順のアルゴリズムの一例を示す。図43に示す矩形データ単位検出手順のアルゴリズムを実行することにより、検出部35は、出力として以下の情報を得る。すなわち矩形データ単位検出手順の出力として検出部35は、一次側データが矩形状であるローカルインデックス範囲It = (it[1], ..., it[Ut])、及び、Itの次元数Ut(0≦Ut≦U)を得る。さらに、矩形データ単位検出手順の出力として検出部35は、矩形データ単位、すなわち、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手順について説明する。通信部36は、矩形データ単位リスト(以下、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)はスカラである。
図44は、矩形データ単位put手順のアルゴリズムの一例を示す。図44に示す矩形データ単位put手順を実行することにより通信部36は、Jt-listに含まれるJtをすべてput通信する。
図45は、矩形データ単位put手順の処理を図解したフローチャートの一例である。図45において先ず、通信部36は、矩形データ単位put手順において未処理の矩形データが存在するか否かを判定する(S401)。すなわち通信部36は、Jt-listが空か否かを判定する。未処理の矩形データが存在しないと判定した場合(S401でNo)、処理は終了する。
一方、未処理の矩形データが存在すると通信部36により判定された場合(S401でYes)、検出部35はJt-listの先頭からJt-listの要素を1つ取り出して、Jtとする。そして検出部35は、取り出したJtに対して、矩形‐連続データ単位検出手順を実行する(S402)。矩形‐連続データ単位検出手順により、検出部35は、一次側において矩形データであって、二次側において連続であるデータ単位を検出する。具体的には検出部35は、Jtと起点を同じくし、かつ、二次側が次元を跨いで連続になるJtの部分配列Jtcと、その通信データの次元数(矩形-連続次元)Dtc(0≦Dtc≦Dt)を得る。また同時に検出部35は、JtからJtcを除いた部分Jtr-listを得る。矩形‐連続データ単位検出手順の詳細については後ほど説明する。
次に通信部36は、矩形-連続データ単位put手順を実行する(S403)。ここで通信部36は、Jtcを、通信データ単位とする。矩形‐連続データ単位put手順において、バッファ制御部38は、通信データ単位について、一次側でデータをバッファリングする。その後、通信部36は、バッファから通信データ単位で、データを二次側へputする。ここで通信部36は、二次側の連続区間を事前に検出し、データが格納された領域とバッファの間で単純なメモリコピーを行うため、通信の効率化を図ることができる。また通信部36は、受信側で連続であるデータ単位で、一次側から二次側へデータをputする。これにより、一度の通信で大きなサイズのデータを送信することができ、通信の効率化を図ることができる。矩形-連続データ単位put手順の詳細については後ほど説明する。
次に通信部36は、Jt-listの先頭に、Jtr-listを追加結合する。そして通信部36は、再度S401の処理を実行する。
(矩形‐連続データ単位検出手順)
次に、矩形‐連続データ単位検出手順について説明する。検出部35は、矩形データ単位Jt = (jt[1], ..., jt[D])、Jtの次元数Dt(0≦Dt≦D)、Jtの上位インデックス(jt[Dt+1], ..., jt[D])、及び、通信情報テーブルを入力として、矩形‐連続データ単位検出手順の処理を開始する。ここで、矩形データ単位Jtは、対応する一次側データが区間、三つ組またはスカラで表現される通信インデックス範囲である。
図46及び図47は、矩形‐連続データ単位検出手順のアルゴリズムの一例(その1、その2)を示す。図46及び図47に示す矩形‐連続データ単位検出手順を実行することにより、検出部35は出力として、以下の情報を得る。すなわち検出部35は、矩形‐連続データ単位Jtc = (jtc[1], ..., jtc[D])、矩形‐連続データ単位残余リストJtr-list、及び、矩形-連続データ単位の長さLtcを得る。さらに検出部35は、通信データの矩形‐連続データ単位次元数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手順について説明する。通信部36は、以下のデータ項目を入力として、矩形-連続データ単位put手順の処理を開始する。入力はすなわち、通信データ単位Jtc = (jtc[1], ..., jtc[D])、矩形‐連続次元数Dtc、及び、二次側(受信側)ノードインデックスytc = (ytc[1], ..., ytc[DtoV[Dtc]])である。これらに加えて、入力は、二次側ローカルインデックスの起点itc1’ = (itc1’[1], ..., itc1’[DtoV[Dtc]])、通信データ単位の長さLtc、及び、通信情報テーブルである。
矩形-連続データ単位put手順において、通信部36は、矩形-連続データ単位で、一次ノードから二次ノードへデータをputする。図48は、矩形-連続データ単位put手順の処理を図解したフローチャートの一例を示す。
図48において、通信部36は、先ず、二次側のノードインデックス、及び、二次側のローカルインデックスの起点の上位インデックスを取得する(S411)。すなわち通信部36は、ytcとitc1’の上位インデックスを得る。具体的には通信部36は、すべてのv = DtoV[Dtc] + 1, ..., Vについて、以下の処理を実行する。
ytc[v] = gtopB(gv(jtc1))
itc1’[v] = gtolB(gv(jtc1))
次にバッファ確保部37は、送信バッファSendBufを長さLtcで確保する(S412)。次にバッファ制御部38は、矩形データ単位pack手順により、Jtcに対応する一次側ローカルデータを、SendBufに集める(S413)。矩形データ単位pack手順の詳細については、後ほど説明する。
次に通信部36は、MPIライブラリなどを使って、SendBufの先頭から長さLtcの連続データを、ノードytcのb(itc1’)からの連続領域にputする(S414)。
次にバッファ確保部37は、S412で確保した送信バッファSendBufの領域を解放する(S415)。そして処理は終了する。
(矩形データ単位pack手順)
次に、矩形データ単位pack手順について説明する。バッファ制御部38は、以下のデータ項目を入力として、矩形データ単位pack手順の処理を開始する。入力はすなわち、各次元が三つ組パラメタで表現できる矩形データ単位Jt = (jt[1], ..., jt[Dt])、矩形次元数Dt、上位次元 (jt[Dt+1], ..., jt[D])、送信バッファSendBufの先頭アドレス、及び、通信情報テーブルである。ただし、各次元が三つ組パラメタで表現できる矩形データ単位Jt = (jt[1], ..., jt[Dt])は、1つの送信先ノードに対応する。
図49は、矩形データ単位pack手順のアルゴリズムの一例を示す。図49に示す矩形データ単位pack手順を実行することにより、バッファ制御部38は、矩形データ単位に対応する自ノードのローカルデータを、送信バッファに集約(pack)する。バッファ制御部38は、ローカルデータの連続性を考慮したメモリコピーを実行しているため、pack処理を高速化できる。また、図49においてバッファ制御部38は、一次側データを長さLcの連続区間ごとに反復してpack処理を行うことで、pack処理を高速化できる。
(バッファなしGet通信)
実施形態に係るバッファなしGet通信において、一次側ノードxは、二次側ノードyからデータを受け取る。一度にgetする通信データ単位は、一次側と二次側で対応するデータが共に連続している範囲となる。データは、通信データ単位毎に分けられ、一次側も二次側もバッファなしでget通信される。通信データ単位にはxとyで共通に連続な区間Jccが選択される。
図50は、実施形態に係るバッファなしGet通信の処理を図解したフローチャートの一例である。
図50において先ず取得部32は、Get通信の指示を受信する(S501)。このGet通信の指示は、状態2の通信が表現されているプログラムである。このプログラムは、具体的には例えば、グローバル配列間の代入の形式で表現されるプログラムである。
次に解析部33は、状態2プログラムの解析を行う(S502)。状態2プログラムの解析により解析部33は、着目する通信に関連する情報を通信情報テーブルに格納する。状態2プログラムの解析の詳細については、後ほど説明する。
次に整列部34は、連続性優先pivoting手順を実行する(S503)。連続性優先pivoting手順を実行することにより整列部34は、一次側または二次側データのアクセスができるだけ連続になるように、通信データのインデックスを並び替える。尚、S503は、実行されなくてもよい。この連続性優先pivoting手順は、実施形態に係るバッファなしPut通信において説明したものと同様である。
次に検出部35は、連続データ単位検出手順を実行する(S504)。連続データ単位検出手順を実行することにより検出部35は、一次側自ノードにおいて次元を跨いで連続する通信インデックスの範囲(連続データ単位)を検出する。これにより検出部35は、連続データ単位の下位インデックスJc = (jc[1], ..., jc[Dc])と次元数Dc(0≦Dc≦D)を得る。同時に検出部35は、Jc, Dcに対応する一次側の下位ローカルインデックス範囲Ic = (ic[1], ..., ic[Uc])と次元数Uc(0≦Uc≦U)を得る。この手順で得られる値は一次側のノード毎に異なる。この連続データ単位検出手順は、実施形態に係るバッファなしPut通信において説明したものと同様である。
次に通信部36は、連続データget処理を実行する(S505)。すなわち通信部36は、一次側が連続なデータ単位ごとの処理を反復して実施する。図51は、連続データget処理の詳細の一例を示す。図51において、各ループでは、連続データ単位get手順が実行されている。連続データ単位get手順については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現してもよい。
ここで図51において、通信部36は、jx1[d], jx2[d], jx3[d](Dc+1≦d≦D)を通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部36は、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するすべてのjx[d]について、処理を反復実行する(u = DtoU[d])。
連続データget処理の実行が完了すると、処理は終了する。
(状態2プログラムの解析)
次に、状態2プログラムの解析について説明する。状態2プログラムの解析では、着目する通信に関連する情報を通信情報テーブルに格納する処理が実行される。解析部33は、取得部32が取得した状態2の通信が表現されているプログラムを入力として、状態2プログラムの解析を実行する。尚、状態2プログラムの解析では、受信ノードが一次側、送信ノードが二次側となる。
状態2プログラムの解析の出力として、解析部33は、着目する通信に関する情報が格納された通信情報テーブルを取得する。
状態2プログラムの解析のアルゴリズムは、図31及び図32を参照して説明した状態1プログラムの解析のアルゴリズムと同様である。ただし、受信ノードが一次側、送信ノードが二次側となる。
(連続データ単位get手順)
次に、連続データ単位get手順について説明する。通信部36は、連続データ単位リスト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間はその並び順に一次側データが連続している。
図52は、連続データ単位get手順のアルゴリズムの一例を示す。図52に示す連続データ単位get手順を実行することにより通信部36は、Jc-listに含まれるJcをすべてget通信する。
図53は、連続データ単位get手順の処理を図解したフローチャートの一例である。図53において先ず、通信部36は、連続データ単位get手順において未処理の連続データが存在するか否かを判定する(S601)。すなわち通信部36は、Jc-listが空か否かを判定する。未処理の連続データが存在しないと判定した場合(S601でNo)、処理は終了する。
一方、未処理の連続データが存在すると通信部36により判定された場合(S601でYes)、検出部35は、連続-連続データ単位検出手順を実行する(S602)。連続‐連続データ単位検出手順により、検出部35は、一次側と二次側で共通して連続であるデータ単位を検出する。具体的には検出部35は、Jcと起点を同じくし、かつ、一次側、二次側とも次元を跨いで連続になるJcの部分配列Jccと、その通信データの次元数(連続‐連続次元)Dcc(0≦Dcc≦Dc)を得る。同時に検出部35は、JcからJccを除いた部分Jcr-listを得る。この連続-連続データ単位検出手順は、実施形態に係るバッファなしPut通信において説明したものと同様である。
次に通信部36は、連続-連続データ単位get手順を実行する(S603)。ここで通信部36は、Jccを通信データ単位とする。連続-連続データ単位get手順により、通信部36は、通信データ単位について、二次側から一次側にgetする。すなわち通信部36は、送信側と受信側で共通に連続であるデータ単位で、二次側から一次側にデータをgetする。これにより、通信の効率化を図ることができる。連続-連続データ単位get手順の詳細については後ほど説明する。
次に通信部36は、Jc-listの先頭に、Jcr-listを追加結合する。そして通信部36は、再度S601の処理を実行する。
(連続-連続データ単位get手順)
次に、連続-連続データ単位get手順について説明する。通信部36は、以下のデータ項目を入力として、連続-連続データ単位get手順の処理を開始する。入力はすなわち、通信データ単位Jcc = (jcc[1], ..., jcc[D])、連続‐連続次元数Dcc、及び、二次側(受信側)ノードインデックスycc = (ycc[1], ..., ycc[V])である。これらに加えて、入力は、二次側ローカルインデックスの起点icc1’ = (icc1’[1], ..., icc1’[V])、通信データ単位の長さLcc、及び、通信情報テーブルである。
連続-連続データ単位get手順において、通信部36は、送信側と受信側で共通に連続であるデータ単位で、二次ノードから一次ノードへデータをgetする。
図54は、連続-連続データ単位get手順のアルゴリズムの一例を示す。通信部36は、先ず、Jccに対応する一次側ローカルインデックスの起点icc1 = (icc1[1], ..., icc1[U])を得る。具体的には通信部36は、すべてのu = 1, ..., DtoU[Dcc]について、以下の処理を実行する。
d = UtoD[u]
icc1[u] = i1[u] + jcc1[U] * i3[u]
次に通信部36は、すべてのu = DtoU[Dcc] + 1, ..., Uについて、以下の処理を実行する。
icc1[u] = gtolA(fu(jcc1))
このようにして、一次側ローカルインデックスの起点icc1を取得すると、通信部36は、MPIライブラリなどを使って、ノードyccの配列要素b(icc1’)から長さLccの連続データを、自ノードの配列要素a(icc1)からの連続領域にgetする。そして処理は終了する。
(バッファありGet通信)
実施形態に係るバッファありGet通信において、一次側ノードxは、二次側ノードyからデータを受け取る。一度にgetする通信データ単位は、二次側ではデータが連続していて、かつ、一次側では効率のよいアンバッファリングが可能な範囲とする。データは、通信データ単位毎に分けられ、一次側ではバッファを介して、二次側ではバッファを介さずget通信される。通信データ単位には、一次側は三つ組で表現できる領域、二次側は連続である領域であるJtcが選択される。
図55は、実施形態に係るバッファありGet通信の処理を図解したフローチャートの一例である。
図55において先ず取得部32は、Get通信の指示を受信する(S701)。このGet通信の指示は、状態2の通信が表現されているプログラムである。このプログラムは、具体的には例えば、グローバル配列間の代入の形式で表現されるプログラムである。
次に解析部33は、状態2プログラムの解析を行う(S702)。状態2プログラムの解析を行うことにより解析部33は、着目する通信に関連する情報を通信情報テーブルに格納する。この状態1プログラムの解析は、実施形態に係るバッファなしGet通信において説明したものと同様である。
次に整列部34は、連続性優先pivoting手順を実行する(S703)。連続性優先pivoting手順を実行することにより整列部34は、二次側データのアクセスができるだけ連続になり、一次側データの下位インデックスのアクセスが出来るだけ矩形になるように、通信データのインデックスを並び替える。尚、整列部34は、一次側データを優先して通信データのインデックスを並び替えてもよい。また、S703は、実行されなくてもよい。この連続性優先pivoting手順は、実施形態に係るバッファなしPut通信において説明したものと同様である。
次に検出部35は、矩形データ単位検出手順を実行する(S704)。矩形データ単位検出手順を実行することにより検出部35は、一次側自ノードにおいて三つ組またはスカラで表現できる通信インデックスの範囲(矩形データ単位)を検出する。これにより検出部35は、矩形データ単位の下位インデックスJt = (jt[1], ..., jt[Dt])と次元数Dt(0≦Dt≦D)を得る。同時に検出部35は、Jt, Dtに対応する一次側の下位ローカルインデックス範囲It = (it[1], ..., it[Ut])と次元数Ut(0≦Ut≦U)を得る。この手順で得られる値は一次側のノード毎に異なる。この矩形データ単位検出手順は、実施形態に係るバッファありPut通信において説明したものと同様である。
次に通信部36は、矩形データget処理を実行する(S705)。すなわち通信部36は、矩形データ単位ごとの処理を反復して実施する。図56は矩形データget処理の詳細の一例を示す。図56において、各ループでは、矩形データ単位get手順が実行されている。矩形データ単位get手順については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現してもよい。
ここで図56において、通信部36は、jx1[d], jx2[d], jx3[d](Dt+1≦d≦D)を通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部36は、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するすべてのjx[d]について、処理を反復実行する(u = DtoU[d])。
矩形データ処理の実行が完了すると、処理は終了する。
(矩形データ単位get手順)
次に、矩形データ単位get手順について説明する。通信部36は、矩形データ単位リスト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)はスカラである。
図57は、矩形データ単位get手順のアルゴリズムの一例を示す。図57に示す矩形データ単位get手順を実行することにより通信部36は、Jt-listに含まれるJtをすべてget通信する。
図58は、矩形データ単位get手順の処理を図解したフローチャートの一例である。図58において先ず、通信部36は、矩形データ単位get手順において未処理の矩形データが存在するか否かを判定する(S801)。すなわち通信部36は、Jt-listが空か否かを判定する。未処理の矩形データが存在しないと判定した場合(S801でNo)、処理は終了する。
一方、未処理の矩形データが存在すると通信部36により判定された場合(S801でYes)、検出部35はJt-listの先頭からJt-listの要素を1つ取り出して、Jtとする。そして検出部35は、取り出したJtに対して、矩形‐連続データ単位検出手順を実行する(S802)。矩形‐連続データ単位検出手順により、検出部35は、一次側において矩形データであって、二次側において連続であるデータ単位を検出する。具体的には検出部35は、Jtと起点を同じくし、かつ、二次側が次元を跨いで連続になるJtの部分配列Jtcと、その通信データの次元数(矩形-連続次元)Dtc(0≦Dtc≦Dt)を得る。また同時に検出部35は、JtからJtcを除いた部分Jtr-listを得る。この矩形‐連続データ単位検出手順は、実施形態に係るバッファありPut通信において説明したものと同様である。
次に通信部36は、矩形-連続データ単位get手順を実行する(S803)。ここで通信部36は、Jtcを、通信データ単位とする。矩形-連続データ単位get手順により、通信部36は、通信データ単位で、二次側から一次側の受信バッファへデータをgetする。ここで通信部36は、一次側の連続区間を事前に検出し、データとバッファの間で単純なメモリコピーを行うため、通信の効率化を図ることができる。また通信部36は、送信側で連続であるデータ単位で、二次側から一次側へデータをgetする。これにより、通信の効率化を図ることができる。矩形-連続データ単位get手順の詳細については後ほど説明する。
次に通信部36は、Jt-listの先頭に、Jtr-listを追加結合する。そして通信部36は、再度S801の処理を実行する。
(矩形-連続データ単位get手順)
次に、矩形-連続データ単位get手順について説明する。通信部36は、以下のデータ項目を入力として、矩形-連続データ単位get手順の処理を開始する。入力はすなわち、通信データ単位Jtc = (jtc[1], ..., jtc[D])、矩形‐連続次元数Dtc、及び、二次側(送信側)ノードインデックスytc = (ytc[1], ..., ytc[DtoV[Dtc]])である。これらに加えて、入力は、二次側ローカルインデックスの起点itc1’ = (itc1’[1], ..., itc1’[DtoV[Dtc]])、通信データ単位の長さLtc、及び、通信情報テーブルである。
矩形-連続データ単位get手順において、通信部36は、矩形-連続データ単位で、二次ノードから一次ノードにデータをgetする。
図59は、矩形-連続データ単位get手順の処理を図解したフローチャートの一例を示す。通信部36は、先ず、二次側のノードインデックス、及び、二次側のローカルインデックスの起点の上位インデックスを取得する(S811)。すなわち通信部36は、ytcとitc1’の上位インデックスを得る。具体的には通信部36は、すべてのv = DtoV[Dtc] + 1, ..., Vについて、以下の処理を実行する。
ytc[v] = gtopB(gv( jtc1 ))
itc1’[v] = gtolB(gv( jtc1 ))
次にバッファ確保部37は、受信バッファRecvBufを長さLtcで確保する(S812)。次に通信部36は、MPIライブラリなどを使って、ノードytcのb( itc1’ ) から長さLtcの連続データを、RecvBufの先頭からの連続領域にgetする(S813)。
次にバッファ制御部38は、矩形データ単位unpack手順により、RecvBufからの長さLtcの連続データを、Jtcに対応する一次側ローカルデータに分配する(S814)。矩形データ単位unpack手順の詳細については、後ほど説明する。
次にバッファ確保部37は、S812で確保した受信バッファRecvBufの領域を解放する(S815)。そして処理を終了する。
(矩形データ単位unpack手順)
次に、矩形データ単位unpack手順について説明する。バッファ制御部38は、以下のデータ項目を入力として、矩形データ単位pack手順の処理を開始する。入力はすなわち、各次元が三つ組パラメタで表現できる矩形データ単位Jt = (jt[1], ..., jt[Dt])、矩形次元数Dt、上位次元 (jt[Dt+1], ..., jt[D])、受信バッファRecvBufの先頭アドレス、及び、通信情報テーブルである。ただし、各次元が三つ組パラメタで表現できる矩形データ単位Jt = (jt[1], ..., jt[Dt])は、1つの送信先ノードに対応する。
図60は、矩形データ単位unpack手順のアルゴリズムの一例を示す。図60に示す矩形データ単位unpack手順を実行することにより、バッファ制御部38は、受信バッファにあるデータを、矩形データ単位に対応する自ノードのローカルデータ領域に分配(unpack)する。バッファ制御部38は、ローカルデータの連続性を考慮したメモリコピーを実行しているため、unpack処理を高速化できる。また、バッファ制御部38は、連続区間ごとに反復して受信バッファからローカル配列に格納する処理を行うことで、unpack処理を高速化できる。
(バッファあり両側通信)
実施形態に係るバッファあり両側通信において、一度に送受信する通信データ単位は、送信側では効率のよいpackを伴うバッファリングが可能で、かつ、受信側では効率のよいunpackを伴うアンバッファリングが可能なデータの範囲とする。データは、通信データ単位毎に分けられ、送信側も受信側もバッファを介して両側通信(two-sided communication)される。通信データ単位には、送信側ノードxと受信側ノードyで共通に、区間または三つ組で表現される領域Jtが選択される。
図61は、実施形態に係るバッファあり両側通信の処理を図解したフローチャートの一例である。尚、送信側ノードxと受信側ノードyのすべてが、図61の処理を実施する。また、図61の処理を実行するノード(自ノードと記す場合がある)は送信側と受信側のどちらかまたは両方に属す。
図61において先ず取得部32は、両側通信の指示を受信する(S901)。この両側通信の指示は、状態3の通信が表現されているプログラムである。このプログラムは、具体的には例えば、グローバル配列間の代入の形式で表現されるプログラムである。
次に、解析部33は、状態3プログラムの解析を行う(S902)。状態3プログラムの解析を行うことにより解析部33は、着目する通信に関連する情報を送信側と受信側の2つの通信情報テーブルに格納する。状態3プログラムの解析の詳細については、後ほど説明する。
次に整列部34は、矩形性優先pivoting手順を実行する(S903)。矩形性優先pivoting手順を実行することにより整列部34は、送信側と受信側の下位インデックスのアクセスができるだけ矩形になるように、2つの通信データのインデックスを並び替える。尚、S903は、実行されなくてもよい。矩形性優先pivoting手順の詳細については、後ほど説明する。
次に検出部35は、共通矩形データ単位検出手順により、送信側と受信側に共通な、区間、三つ組またはスカラで表現できる範囲(共通矩形データ単位)を検出する(S904)。これにより検出部35は、共通矩形データ単位の下位インデックスJt = (jt[1], ..., jt[Dt])と次元数Dt(0≦Dt≦D)を得る。ここで得られるJt, Dtは全ノードで同じ値である。
次に通信部36は、自ノードが、バッファあり両側通信において通信データを送信する送信ノードであるか否かを判定する(S905)。自ノードが送信ノードであると判定した場合(S905でYes)、通信部36は処理をS906に遷移させる。一方、自ノードが送信ノードでない、すなわち、受信ノードであると判定した場合(S905でNo)、通信部36は処理をS907に遷移させる。
S906において、通信部36は送信処理を実行する。すなわち通信部36は、共通矩形データ単位ごとのsend処理を反復して実施する。図62は、送信処理の詳細の一例を示す。図62において、各ループでは、共通矩形データ単位送信処理が実行されている。共通矩形データ単位送信処理については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現してもよい。
ここで図62において、通信部36は、jx1A[d], jx2A[d], jx3A[d](Dt+1≦d≦D)を送信用の通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部36は、すべてのjx[d] = 1, ..., N[d]-1のうち、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するjx[d]について、処理を反復実行する(u = DtoU[d])。
送信処理の実行が完了すると、処理は終了する。
S907において、通信部36は受信処理を実行する。すなわち通信部36は、共通矩形データ単位ごとのrecieve処理を反復して実施する。図63は、受信処理の詳細の一例を示す。図63において、各ループでは、共通矩形データ単位受信処理が実行されている。共通矩形データ単位受信処理については後ほど説明する。この多重ループはネストの深さが実行時に決まるので、再帰的手続呼出しを使って実現してもよい。
ここで図62において、通信部36は、jx1B[d], jx2B[d], jx3B[d](Dt+1≦d≦D)を受信用の通信情報テーブルから取得する。通信情報テーブルに設定がない場合には、通信部36は、すべてのjx[d] = 1, ..., N[d]-1のうち、自ノードにマッピングされるjx[d]、すなわち、gtop(fu(jx[d]))が自ノードの第uノードインデックスと一致するjx[d]について、処理を反復実行する(u = DtoU[d])。
受信処理の実行が完了すると、処理は終了する。
(状態3プログラムの解析)
次に、状態3プログラムの解析について説明する。状態3プログラムの解析では、着目する通信に関連する情報を通信情報テーブルに格納する処理が実行される。解析部33は、取得部32が取得した状態3の通信が表現されているプログラムを入力として、状態3プログラムの解析を実行する。
状態3プログラムの解析の出力として、解析部33は、着目する通信に関する情報が格納された送信側の通信情報テーブル及び受信側の通信情報テーブルを取得する。
状態3プログラムの解析の処理は、送信側の通信情報テーブルの作成処理と、受信側の通信情報テーブルの作成処理の2つの処理を含む。送信側の通信情報テーブルの作成処理においては、解析部33は、送信側を一次側、受信側を二次側として、図31〜図33を参照して説明した状態1プログラムの解析と同じ手順を実施する。受信側の通信情報テーブルの作成処理は、解析部33は、受信側を一次側、送信側を二次側として、図31〜図33を参照して説明した状態1プログラムの解析と同じ手順を実施する。
なお、送信側情報テーブルと受信側情報テーブルは、大部分が同じ情報を含むので、解析部33は、一方を他方のコピーにするか共有することによって、作成手順の一部を省略してもよい。送信側情報テーブルと受信側情報テーブルの対応は以下のようになる。すなわち、通信データの次元数D、寸法N[d]、ループ変数名j[d]は、共通している。また、一方のUtoD, DtoUは、他方のVtoD, DtoVとそれぞれ同じである。そして、一方の一次側の情報は、他方の二次側の情報と同じである。ただし、一次側ローカル配列添字の情報は、そのデータを持っているノードにしか存在しない。
(矩形性優先pivoting手順)
次に、矩形性優先pivoting手順について説明する。整列部34は、送信側と受信側の通信情報テーブルを入力として、矩形性優先pivoting手順の処理を開始する。
図64は、矩形性優先pivoting手順のアルゴリズムの一例を示す。整列部34は、図64に示す矩形性優先pivoting手順を実行することにより、通信データのD個の情報の並びがソートされた、送信側と受信側の同じ2つの通信情報テーブルを得る。すなわち、出力される通信情報テーブルにおいては、通信データのD個の情報の並びは、優先側のローカルデータができるだけ昇順にアクセスされるようにソートされており、それに合わせて変換テーブルUtoDとVtoDの値も変換されている。
(共通矩形データ単位検出手順)
次に、共通矩形データ単位検出手順について説明する。検出部35は、送信側と受信側の通信情報テーブルを入力として、共通矩形データ単位検出手順の処理を開始する。
共通矩形データ単位検出手順は送信側と受信側の全ノードに共通する値を返す。図65は、共通矩形データ単位検出手順のアルゴリズムの一例を示す。検出部35は、図65に示す共通矩形データ単位検出手順を実行することにより、送信データと受信側データの交わりが区間または三つ組で表現できる、通信データインデックス範囲の次元数Dt(0≦Dt≦D)を得る。
(共通矩形データ単位送信処理)
次に、共通矩形データ単位送信処理について説明する。通信部36は、共通矩形データ単位Jt = (jt [1], ..., jt [D])、Jtの共通矩形次元数、及び、送信側の通信情報テーブルを入力として、共通矩形データ単位送信処理を実行する。ここで、Jtの共通矩形次元数は、すなわち矩形である下位インデックスの次元数Dt(0≦Dt≦D)である。
共通矩形データ単位送信処理において、通信部36は、共通矩形データ単位毎に、自ノードに確保したバッファを介して対応する全受信ノードにデータを送信する。
尚、実施形態においては、同じ共通矩形データ単位について、すべての送信ノードと受信ノードが、それぞれ共通矩形データ単位send手順と共通矩形データ単位recv手順を、集団的(collective)に実施することを仮定している。
図66は、共通矩形データ単位送信処理の内容を図解したフローチャートの一例である。
図66において先ず、バッファ確保部37は、送信バッファ準備手順により、共通矩形データ単位に対応して自ノードから二次側ノードへ送信するためのY[DtoV[1]] * ... * Y[DtoV[Dt]]本の送信バッファと、アクセスパターンの情報を獲得する(S1001)。送信バッファ準備手順の詳細については後ほど説明する。
次にバッファ制御部38は、共通矩形データ単位pack手順により、ローカルデータを送信バッファに集約する(S1002)。共通矩形データ単位pack手順の詳細については後ほど説明する。
次に通信部36は、共通矩形データ単位send手順により、送信バッファから二次側へデータを送信する(S1003)。共通矩形データ単位send手順の詳細については後ほど説明する。そしてバッファ確保部37は、送信バッファ領域を解放して処理を終了する。
(送信バッファ準備手順)
次に送信バッファ準備手順について説明する。送信バッファ準備手順においては、送信側を一次側、受信側を二次側とする。バッファ確保部37は、共通矩形次元数、及び、一次側の通信情報テーブルを入力として送信バッファ準備手順を実行する。ここで、共通矩形次元数は、すなわち、通信データの矩形である下位インデックスの次元数Dt(0≦Dt≦D)である。
図67は、送信バッファ準備手順のアルゴリズムの一例を示す。図67に示す送信バッファ準備手順を実行することにより、バッファ確保部37は出力として、共通矩形データ単位に対応する、バッファリングパターンのリストy_countList[Dt]を取得する。そして送信バッファ準備手順を実行することで、バッファ確保部37は、共通矩形データ単位に対する二次側ノードインデックスに対応する、Y[DtoV[1]] * ... * Y[DtoV[Dt]]本の送信バッファSendBufを確保する。このようにバッファ確保部37は、共通矩形データ単位に応じてバッファを確保することにより、確保するバッファのサイズを、通信で使用するバッファの最小限のサイズに抑えることができる。
(共通矩形データ単位pack手順)
次に、共通矩形データ単位pack手順について説明する。バッファ制御部38は、共通矩形データ単位Jt = (jt[1], ..., jt[D])、共通矩形次元数、バッファリングパターンのリストy_countList[Dt]、及び、一次側(送信側)の通信情報テーブルを入力として、共通矩形データ単位pack手順を実行する。ここで、共通矩形次元数は、すなわち矩形である下位インデックスの次元数Dt(0≦Dt≦D)である。
図68は、共通矩形データ単位pack手順のアルゴリズムの一例を示す。図68に示す共通矩形データ単位pack手順を実行することにより、共通矩形データ単位pack手順において、バッファ制御部38は、共通矩形データ単位の送信データを、送信バッファへ集約(pack)する。すなわちバッファ制御部38は、共通矩形データ単位で、ローカル配列から送信データを取り出し、送信バッファに格納する。このようにバッファ制御部38は、メモリ上のデータの連続性に基づいて、pack処理を実行するため、pack処理を高速化できる。
図68において、最内ループは、矩形データ単位pack手順を用いてさらに高速化を図ることもできる。また図68において、バッファ制御部38は多次元の連続性を抽出することもできる。
(共通矩形データ単位send手順)
次に、共通矩形データ単位send手順について説明する。通信部36は、以下のデータ項目を入力として、共通矩形データ単位send手順を実行する。入力はすなわち、共通矩形次元数Dt(0≦Dt≦D)、共通矩形データ単位Jt = (jt[1], ..., jt[D])、及び、送信側の通信情報テーブルである。これらに加えて、入力は、一次側(送信側)の送信バッファSendBuf[Y[DtoV[1]]]...[Y[DtoV[Dt]]]、及び送信バッファの次元dの各受信ノードインデックスに対応する寸法bufExtent[d][y[DtoV[d]]]である。
図69は、共通矩形データ単位send手順のアルゴリズムの一例を示す。図69に示す共通矩形データ単位send手順を実行することにより、通信部36は、共通矩形データ単位で、自ノードの送信バッファから対応する二次側ノードへデータを送信(send)する。
通信部36は、すべての送信バッファに対して、図69に示すように、自ノードの送信バッファから二次側のノードへsendを発行する。このsend通信は、同じタグをもつrecv(receive)通信と対応付けられる。
図69において、タグは以下の計算値とすれば、一つの整数値とすることができる。(jt[Dt+1] + N[Dt+1] * (jt[Dt+2] + N[Dt+2] * (... jt[D]) ...)) mod m
ここでmは、同じ送受信ノード間でのsend-recveive通信についてそれ以上の数の追い越しが起こらないと保証できる十分大きな数であればよい。
(共通矩形データ単位受信処理)
次に、共通矩形データ単位受信処理について説明する。通信部36は、共通矩形データ単位Jt = (jt[1], ..., jt[D])、Jtの矩形次元数、及び、受信側の通信情報テーブルを入力として、共通矩形データ単位受信処理を実行する。ここで、Jtの矩形次元数は、すなわち矩形である下位インデックスの次元数Dt(0≦Dt≦D)である。
共通矩形データ単位受信処理において、通信部36は、共通矩形データ単位を、自ノードに確保したバッファを介して対応する全送信ノードから受信する。
尚、実施形態においては、同じ共通矩形データ単位について、すべての送信ノードと受信ノードが、それぞれ共通矩形データ単位send手順と共通矩形データ単位recv手順を、集団的(collective)に実施することを仮定している。
図70は、共通矩形データ単位受信処理の内容を図解したフローチャートの一例である。図70において先ず、バッファ確保部37は、受信バッファ準備手順により、共通矩形データ単位に対応して二次側ノードから自ノードへ受信するためのY[DtoV[1]] * ... * Y[DtoV[Dt]]本の受信バッファ領域と、アクセスパターンの情報を獲得する(S1101)。受信バッファ準備手順の詳細については後ほど説明する。
次に通信部36は、共通矩形データ単位recv手順により、二次側から送信されたデータを受信バッファに受信する(S1102)。共通矩形データ単位recv手順の詳細については後ほど説明する。
次にバッファ制御部38は、共通矩形データ単位unpack手順により、受信バッファのデータをローカルデータへ分配する(S1103)。共通矩形データ単位unpack手順の詳細については後ほど説明する。そしてバッファ確保部37は、受信バッファ領域を解放して処理を終了する。
(受信バッファ準備手順)
次に、受信バッファ準備手順について説明する。受信バッファ準備手順においては、受信側を一次側、送信側を二次側とする。バッファ確保部37は、共通矩形次元数、及び、一次側の通信情報テーブルを入力として、受信バッファ準備手順を実行する。ここで、共通矩形次元数は、すなわち、通信データの矩形である下位インデックスの次元数Dt(0≦Dt≦D)である。
受信バッファ準備手順の出力として、バッファ確保部37は、共通矩形データ単位に対応する、バッファリングパターンのリストy_countList[Dt]を取得する。そして受信バッファ準備手順を実行することで、バッファ確保部37は、共通矩形データ単位に対する二次側ノードインデックスに対応する、Y[DtoV[1]] * ... * Y[DtoV[Dt]]本の受信バッファRecvBufを確保する。このようにバッファ確保部37は、共通矩形データ単位に応じてバッファを確保することにより、確保するバッファのサイズを、通信で使用するバッファの最小限のサイズに抑えることができる。
受信バッファ準備手順のアルゴリズムは、図67に示した送信バッファ準備手順のアルゴリズムと同様である。ただし、受信バッファ準備手順のアルゴリズムは、図67において、SendBufをRecvBufに置き換えたものである。
(共通矩形データ単位recv手順)
次に、共通矩形データ単位recv手順について説明する。通信部36は、以下のデータ項目を入力として、共通矩形データ単位recv手順を実行する。入力はすなわち、共通矩形次元数Dt(0≦Dt≦D)、共通矩形データ単位 Jt = (jt[1], ..., jt[D])、及び、受信側の通信情報テーブルである。これらに加えて、入力は、一次側(受信側)の受信バッファRecvBuf[Y[DtoV[1]]]...[Y[DtoV[Dt]]]、及び、受信バッファの次元dの各送信ノードインデックスに対応する寸法bufExtent[d][y[DtoV[d]]]である。
図71は、共通矩形データ単位recv手順のアルゴリズムの一例を示す。図71に示す共通矩形データ単位recv手順を実行することにより、通信部36は、共通矩形データ単位について、自ノードの受信バッファに対応する二次ノードからreceive(受信)する。
図71において、タグは以下の計算値とすれば、一つの整数値とすることができる。
(jt[Dt+1] + N[Dt+1] * (jt[Dt+2] + N[Dt+2] * (... jt[D] ) ...)) mod m
ここでmは、同じ送受信ノード間でのsend-recveive通信についてそれ以上の数の追い越しが起こらないと保証できる十分大きな数であればよい。
(共通矩形データ単位unpack手順)
次に、共通矩形データ単位unpack手順について説明する。バッファ制御部38は、共通矩形データ単位Jt = (jt[1], ..., jt[Dt])、共通矩形次元数、バッファリングパターンのリストy_countList[Dt]、及び、一次側(受信側)の通信情報テーブルを入力として、共通矩形データ単位unpack手順を実行する。ここで、共通矩形次元数は、すなわち、矩形である下位インデックスの次元数Dt(0≦Dt≦D)である。
図72は、共通矩形データ単位unpack手順のアルゴリズムの一例を示す。図72に示す共通矩形データ単位unpack手順を実行することにより、バッファ制御部38は、共通矩形データ単位の受信データを、受信バッファから分配(unpack)する。すなわち、バッファ制御部38は、共通矩形データ単位で、受信バッファの受信データを取り出し、ローカル配列に格納する。このようにバッファ制御部38は、メモリ上のデータの連続性に基づいて、unpack処理を実行するため、unpack処理を高速化できる。
図72において、最内ループは、矩形データ単位unpack手順を用いてさらに高速化を図ることもできる。また図72において、バッファ制御部38は多次元の連続性を抽出することもできる。
次にバッファなしPut通信の処理について、実際の通信プログラムの例を用いて説明する。図73は、並列言語の一種であるXcalableMPプログラムのgmove構文で表現されている通信の一例を示す。ここでは、図73の通信において、ノードP(1,1), p(2,1), p(1,2), p(2,2), p(1,3), p(2,3)を一次側ノードとしてバッファなしputを実施したときの例を示す。一次側が送信側のA, P、二次側が受信側のB, Qである。n2は実行時に決まる変数である。
先ず取得部32は、図73の通信プログラムを取得する。すると解析部33は、状態1プログラムの解析を実施する。結果として解析部33は、図27〜図30に示す通信情報テーブルを得る。この例は配列代入文なので、ループ変数名は存在しないが、仮の名前$1と$2を与えた。ノード配列Qはグローバル配列Bと次元数を合わせるため、Q(1,1,4)と正規化された。尚、図27〜図30において、数式の形となるものは、ランタイムライブラリによって実行時に評価してもよいし、数式のままコンパイラの出力として生成してもよい。
図74は、状態1プログラムの解析で得られた通信情報テーブルの内容を示す。図74において、ドット部分が送受信される通信データ、点線がデータ分散の境界である。
状態1プログラムの解析において、図32に示すアルゴリズムの手順6の結果を代入した結果が、図28及び図29に示されている。通信情報テーブルは、ノードによって有する値が異なるが、図28及び図29の通信情報テーブルでは、例として一次側ノード(0,0), (1,0), (0,1)の情報が示されている。なお、これらのノードは、入力プログラムのノードP(1,1), P(2,1), P(1,2)とそれぞれ対応する。実行時のコストを小さくするため、数式はできるだけ簡単化する方がよい。
図75は、状態1プログラムの解析により得られたノード(0,1)における通信情報テーブルの内容と、通信データとローカルデータの関係を示す図である。通信情報テーブルは、実行時に決まる変数(図73の例では変数「n2」)に依存して異なる通信パターンを、まとめて表現している。図75(A)は、n2≦80の時の、通信データとローカルデータの関係を示す。図75(B)は、80≦n2≦100の時の、通信データとローカルデータの関係を示す。図75(C)は、100≦n2の時の、通信データとローカルデータの関係を示す。
連続性優先pivoting手順は、図73の例ではDtoUもDtoVも元々昇順なので効果がない。仮に、gmove構文が配列代入文ではなくforall文の形
forall (i=0:99, j=0:119) B(i,60,j) = A(i+10,j+n2)
で与えられているのであれば、連続データアクセスとなる可能性があるループ変数iが先、そうでないループ変数jが後になるように、整列部34はソートした方がよい。
次に、検出部35は、連続データ単位検出手順を実施する。図76は、連続データ単位検出手順の実施の様子を示す図である。
以下の説明においては、一次側ノード(0,1)の動作を記す。プログラム中の変数n2は実行時に20と評価されているとする。
図76において、一次側データを360バイトごとに連続データ単位とすることが決定された。一次側データの1次元目の区間10:99は通信データ配列の1次元目の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]は通信情報テーブルから得られる。
次に、通信部36は、以下のループ1の処理の反復実行を行う。D=2, Dc=1なので処理は1重ループとなる。
(ループ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と評価される。
ローカル配列添字のタイプが「区間」または「三つ組」の場合にはループ1のようなループとすることができる。「スカラ」の場合には固定値となるのでループでなくてもよい。「その他」の場合には、ループは、通信データのその次元の全区間のうち、自ノードに対応するインデックスだけが選択されて実行される。
ループ1において、最初の反復は、以下となる。
jx[2] = jx1[2] = 80
Jc-list = ((0:89, 80))
連続データ単位put手順を実施
図77及び図78は、ループ1において、最初の反復で呼び出される連続データ単位put手順の処理の一例(その1、その2)を示す。尚、ループ1において、最初の反復で呼び出される連続データ単位put手順の入力としては、「Jc-list = ((0:89, 80)), Dc = 1」が含まれる。
ループ1において、2回目の反復は以下となる。
jx[2] = jx [2] + jx3[2] = 80 + 1 = 81
Jc-list = ((0:89, 81))
連続データ単位put手順を実施
以降の説明では、前の反復との差分のみを記述する。図79は、ループ1において、2回目の反復で呼び出される連続データ単位put手順の処理の一例を示す。尚、ループ1において、2回目の反復で呼び出される連続データ単位put手順の入力としては、「Jc-list = ((0:89, 81))、Dc = 1」が含まれる。
同様にして、通信部36はループ1の処理を実行する。ループ1において、11回目の反復は以下となる。
jx[2] = 90
Jc-list = ((0:89, 90))
連続データ単位put手順を実施
図80は、ループ1において、11回目の反復で呼び出される連続データ単位put手順の処理の一例を示す。尚、ループ1において、2回目の反復で呼び出される連続データ単位put手順の入力としては、「Jc-list = ((0:89, 90))、Dc = 1」が含まれる。
同様にして、通信部36はループ1の処理を実行し、最後にjx[2] = jx2[2] = 119の反復を実行して、a(10, 39)から360バイトのデータを、ノード(0,0,3)のb(0,60,29)へputする。そして処理が終了する。
図81は、一次側ノード(0,1)から二次側ノード(0,0,2)または(0,0,3)へputされた結果を示す図である。図81に示す30パケットが一次側ノード(0,1)から二次側ノード(0,0,2)または(0,0,3)へputされる。図75(A)の斜線部分がこの一次側ローカルデータに対応する。他の3つの一次側ノードにおいても同時にこの手順を実施することにより、全体としてすべての通信データが一次側から二次側に通信される。
次に、ノード30のハードウェア構成の一例を説明する。図82は、実施形態に係るノードのハードウェア構成の一例を示す。
図82において、ノード30は、CPU41、メモリ42、記憶装置43、読取装置44、及び通信インターフェース45を含む。CPU41、メモリ42、記憶装置43、読取装置44、及び通信インターフェース45はバス等を介して接続される。
CPU41は、メモリ42を利用して上述のフローチャートの手順を記述したプログラムを実行することにより、取得部32、解析部33、整列部34、検出部35、通信部36、バッファ確保部37、及びバッファ制御部38の一部または全部の機能を提供する。また、CPU41はコンパイラの機能も提供する。
メモリ42は、例えば半導体メモリであり、Random Access Memory(RAM)領域およびRead Only Memory(ROM)領域を含んで構成される。メモリ42には、送信バッファまたは受信バッファが確保される。記憶装置43は、例えばハードディスクである。なお、記憶装置43は、フラッシュメモリ等の半導体メモリであってもよい。また、記憶装置43は、外部記録装置であってもよい。記憶装置43は記憶部31の一部または全部の機能を提供する。
読取装置44は、CPU41の指示に従って着脱可能記憶媒体50にアクセスする。着脱可能記憶媒体50は、たとえば、半導体デバイス(USBメモリ等)、磁気的作用により情報が入出力される媒体(磁気ディスク等)、光学的作用により情報が入出力される媒体(CD−ROM、DVD等)などにより実現される。尚、読取装置44はノード30に含まれなくてもよい。
通信インターフェース45は、CPU41の指示に従って通信ネットワークまたはインターコネクト等を介して、他のノード30と通信する。
実施形態のプログラムは、例えば、下記の形態でノード30に提供される。
(1)記憶装置43に予めインストールされている。
(2)着脱可能記憶媒体50により提供される。
(3)プログラムサーバ(図示せず)から通信インターフェース45を介して提供される。
さらに、実施形態のノードの一部は、ハードウェアで実現してもよい。或いは、実施形態のノードは、ソフトウェアおよびハードウェアの組み合わせで実現してもよい。
尚、第2ノード12、及び第2ノード22は、例えばハードディスクまたはフラッシュメモリ等の半導体メモリを含む記憶装置であってもよい。
尚、本実施形態は、以上に述べた実施の形態に限定されるものではなく、本実施形態の要旨を逸脱しない範囲内で種々の構成または実施形態を取ることができる。
上記実施形態に関し、更に以下の付記を開示する。
(付記1)
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置において、
所定の単位に区画された第1の記憶領域に、前記情報処理装置に割り当てられたローカルデータを記憶する記憶部と、
前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出する検出部と、
前記第1の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する送信部と
を有する情報処理装置。
(付記2)
前記格納領域情報は、前記情報処理装置に割り当てられた前記対象ローカルデータを特定する情報と、前記他の情報処理装置に割り当てられた前記対象ローカルデータを特定する情報を含み、
前記検出部は、前記格納領域情報に基づいて、前記第2の記憶領域の前記連続区画のうち、該連続区画に書き込まれる対象ローカルデータが格納された前記第1の記憶領域の区画が連続する複数の連続区画を検出する
ことを特徴とする付記1に記載の情報処理装置。
(付記3)
前記送信部は、前記記憶部から、前記連続区画の区画数だけ、前記第1の記憶領域に格納されたローカルデータを取り出して、所定のバッファ領域に格納し、該バッファ領域に格納したローカルデータを、所定の単位で、前記第2ノードへ送信する
ことを特徴とする付記1または2に記載の情報処理装置。
(付記4)
前記情報処理装置は、さらに、
前記検出した連続区画の区画数に応じたサイズの前記バッファ領域を確保する確保部と、
を備えることを特徴とする付記3に記載の情報処理装置。
(付記5)
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置において、
所定の単位に区画された第1の記憶領域に、前記情報処理装置にローカルデータ領域を割り当てられた記憶部と、
前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出する検出部と、
前記第2の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求する要求部と
前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第1の記憶領域に格納する受信部と、
を備えることを特徴とする情報処理装置。
(付記6)
前記格納領域情報は、前記情報処理装置に割り当てられた前記対象ローカルデータを特定する情報と、前記他の情報処理装置に割り当てられた前記対象ローカルデータを特定する情報を含み、
前記検出部は、前記格納領域情報に基づいて、前記第2の記憶領域の前記連続区画のうち、該連続区画からデータが読み出されて格納される前記第1の記憶領域の区画が連続する複数の連続区画を検出する
ことを特徴とする付記5に記載の情報処理装置。
(付記7)
前記受信部は、前記ローカルデータを受信して所定のバッファ領域に格納し、該バッファ領域から、検出した前記連続区画の区画数だけ取り出して前記第1の記憶領域に格納する
ことを特徴とする付記5または6に記載の情報処理装置。
(付記8)
前記情報処理装置は、さらに、
前記検出した連続区画の区画数に応じたサイズの前記バッファ領域を確保する確保部と、
を備えることを特徴とする付記7に記載の情報処理装置。
(付記9)
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置は、
前記情報処理装置に割り当てられたローカルデータのうち、前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出し、
所定の単位に区画された第1の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する
ことを特徴とする通信方法。
(付記10)
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置は、
前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出し、
前記第2の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求し、
前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して、所定の単位に区画された第1の記憶領域に格納する
ことを特徴とする通信方法。
(付記11)
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置に、
前記情報処理装置に割り当てられたローカルデータのうち、前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出し、
所定の単位に区画された第1の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する
処理を実行させることを特徴とする通信プログラム。
(付記12)
複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置に、
前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得し、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出し、
前記第2の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求し、
前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して、所定の単位に区画された第1の記憶領域に格納する
処理を実行させることを特徴とする通信プログラム。
(付記13)
複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている情報処理システムであって、
第1情報処理装置と第2情報処理装置を備え、
前記第1情報処理装置は、
所定の単位に区画された第1の記憶領域に、前記第1情報処理装置に割り当てられたローカルデータを記憶する記憶部と、
前記第1情報処理装置から前記第2情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記第2情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出する検出部と、
前記第1の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第2情報処理装置に送信する送信部と、を有し、
前記第2情報処理装置は、前記第1情報処理装置から前記連続区画の区画数のローカルデータを受信して、前記第2の記憶領域に格納する
ことを特徴とする情報処理システム。
(付記14)
複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている情報処理システムであって、
第1情報処理装置と第2情報処理装置を備え、
前記第1情報処理装置は、
所定の単位に区画された第1の記憶領域に、前記第1情報処理装置にローカルデータ領域を割り当てられた記憶部と、
前記第1情報処理装置に対する第2情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得する取得部と、
前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記第2情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出する検出部と、
前記第2の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第1情報処理装置に送信することを、前記第2情報処理装置に要求する要求部と
前記第2情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第1の記憶領域に格納する受信部と、を有し、
前記第2情報処理装置は、前記第1情報処理装置からの前記要求に応じて、前記第2の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第1情報処理装置に送信する
ことを特徴とする情報処理システム。
10 情報処理システム
11 情報処理装置
12 第2ノード
13 記憶部
14 取得部
15 検出部
16 送信部
17 確保部
20 情報処理システム
21 情報処理装置
22 第2ノード
23 記憶部
24 取得部
25 検出部
26 要求部
27 受信部
28 確保部
30 通信ノード
31 記憶部
32 取得部
33 解析部
34 整列部
35 検出部
36 通信部
37 バッファ確保部
38 バッファ制御部

Claims (12)

  1. 複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置において、
    所定の単位に区画された第1の記憶領域に、前記情報処理装置に割り当てられたローカルデータを記憶する記憶部と、
    前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得する取得部と、
    前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出する検出部と、
    前記第1の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する送信部と
    を有する情報処理装置。
  2. 前記格納領域情報は、前記情報処理装置に割り当てられた前記対象ローカルデータを特定する情報と、前記他の情報処理装置に割り当てられた前記対象ローカルデータを特定する情報を含み、
    前記検出部は、前記格納領域情報に基づいて、前記第2の記憶領域の前記連続区画のうち、該連続区画に書き込まれる対象ローカルデータが格納された前記第1の記憶領域の区画が連続する複数の連続区画を検出する
    ことを特徴とする請求項1に記載の情報処理装置。
  3. 前記送信部は、前記記憶部から、前記第2の記憶領域の前記連続区画の区画数だけ、前記第1の記憶領域に格納されたローカルデータを取り出して、所定のバッファ領域に格納し、該バッファ領域に格納したローカルデータを、所定の単位で、前記他の情報処理装置へ送信する
    ことを特徴とする請求項1または2に記載の情報処理装置。
  4. 複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置において、
    所定の単位に区画された第1の記憶領域に、前記情報処理装置にローカルデータ領域を割り当てられた記憶部と、
    前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得する取得部と、
    前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出する検出部と、
    前記第2の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求する要求部と
    前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第1の記憶領域に格納する受信部と、
    を備えることを特徴とする情報処理装置。
  5. 前記格納領域情報は、前記情報処理装置に割り当てられた前記対象ローカルデータを特定する情報と、前記他の情報処理装置に割り当てられた前記対象ローカルデータを特定する情報を含み、
    前記検出部は、前記格納領域情報に基づいて、前記第2の記憶領域の前記連続区画のうち、該連続区画からデータが読み出されて格納される前記第1の記憶領域の区画が連続する複数の連続区画を検出する
    ことを特徴とする請求項4に記載の情報処理装置。
  6. 前記受信部は、前記ローカルデータを受信して所定のバッファ領域に格納し、該バッファ領域から、検出した前記第2の記憶領域の前記連続区画の区画数だけ取り出して前記第1の記憶領域に格納する
    ことを特徴とする請求項4または5に記載の情報処理装置。
  7. 複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置は、
    前記情報処理装置が備える記憶部において所定の単位に区画された第1の記憶領域に、前記情報処理装置に割り当てられたローカルデータを記憶し、
    前記情報処理装置に割り当てられたローカルデータのうち、前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得し、
    前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出し、
    前記第1の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する
    ことを特徴とする通信方法。
  8. 複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置は、
    前記情報処理装置が備える記憶部において所定の単位に区画された第1の記憶領域に、前記ローカルデータのための領域を割り当て、
    前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得し、
    前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出し、
    前記第2の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求し、
    前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第1の記憶領域に格納する
    ことを特徴とする通信方法。
  9. 複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置に、
    前記情報処理装置が備える記憶部において所定の単位に区画された第1の記憶領域に、前記情報処理装置に割り当てられたローカルデータを記憶し、
    前記情報処理装置に割り当てられたローカルデータのうち、前記情報処理装置から他の情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得し、
    前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出し、
    前記第1の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記他の情報処理装置に送信する
    処理を実行させることを特徴とする通信プログラム。
  10. 複数の情報処理装置のうち、前記複数の情報処理装置間で共有するグローバルデータを分割したローカルデータのうち、いずれかのローカルデータが割り当てられる情報処理装置に、
    前記情報処理装置が備える記憶部において所定の単位に区画された第1の記憶領域に、前記ローカルデータのための領域を割り当て、
    前記情報処理装置に対する他の情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得し、
    前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記他の情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出し、
    前記第2の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記情報処理装置に送信することを、前記他の情報処理装置に要求し、
    前記他の情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第1の記憶領域に格納する
    処理を実行させることを特徴とする通信プログラム。
  11. 複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている情報処理システムであって、
    第1情報処理装置と第2情報処理装置を備え、
    前記第1情報処理装置は、
    所定の単位に区画された第1の記憶領域に、前記第1情報処理装置に割り当てられたローカルデータを記憶する記憶部と、
    前記第1情報処理装置から前記第2情報処理装置に対する書き込み対象である対象ローカルデータの書き込み指示を取得する取得部と、
    前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記第2情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを書き込む連続する複数の連続区画を検出する検出部と、
    前記第1の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第2情報処理装置に送信する送信部と、を有し、
    前記第2情報処理装置は、前記第1情報処理装置から前記連続区画の区画数のローカルデータを受信して、前記第2の記憶領域に格納する
    ことを特徴とする情報処理システム。
  12. 複数の情報処理装置間で共有するグローバルデータを分割したローカルデータが複数の情報処理装置に分散されている情報処理システムであって、
    第1情報処理装置と第2情報処理装置を備え、
    前記第1情報処理装置は、
    所定の単位に区画された第1の記憶領域に、前記第1情報処理装置にローカルデータ領域を割り当てられた記憶部と、
    前記第1情報処理装置に対する第2情報処理装置からの読み込み対象である対象ローカルデータの読み込み指示を取得する取得部と、
    前記グローバルデータにおいて前記対象ローカルデータが対応するデータを特定する格納領域情報に基づき、前記第2情報処理装置が備える他の記憶部において前記所定の単位に区画された第2の記憶領域のうち、前記対象ローカルデータを読み出す連続する複数の連続区画を検出する検出部と、
    前記第2の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第1情報処理装置に送信することを、前記第2情報処理装置に要求する要求部と
    前記第2情報処理装置から前記要求に応じて送信された前記連続区画の区画数のローカルデータを受信して前記第1の記憶領域に格納する受信部と、を有し、
    前記第2情報処理装置は、前記第1情報処理装置からの前記要求に応じて、前記第2の記憶領域に格納されたローカルデータを、前記連続区画の区画数だけ取り出して前記第1情報処理装置に送信する
    ことを特徴とする情報処理システム。
JP2014230227A 2014-11-12 2014-11-12 情報処理装置、通信方法、通信プログラム、及び、情報処理システム Active JP6402598B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2014230227A JP6402598B2 (ja) 2014-11-12 2014-11-12 情報処理装置、通信方法、通信プログラム、及び、情報処理システム
US14/887,382 US9841919B2 (en) 2014-11-12 2015-10-20 Information processing apparatus, communication method and information processing system for communication of global data shared by information processing apparatuses
EP15190676.5A EP3021210A1 (en) 2014-11-12 2015-10-20 Information processing apparatus, communication method, communication program and information processing system

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014230227A JP6402598B2 (ja) 2014-11-12 2014-11-12 情報処理装置、通信方法、通信プログラム、及び、情報処理システム

Publications (2)

Publication Number Publication Date
JP2016095596A JP2016095596A (ja) 2016-05-26
JP6402598B2 true JP6402598B2 (ja) 2018-10-10

Family

ID=54365960

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014230227A Active JP6402598B2 (ja) 2014-11-12 2014-11-12 情報処理装置、通信方法、通信プログラム、及び、情報処理システム

Country Status (3)

Country Link
US (1) US9841919B2 (ja)
EP (1) EP3021210A1 (ja)
JP (1) JP6402598B2 (ja)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11995448B1 (en) * 2018-02-08 2024-05-28 Marvell Asia Pte Ltd Method and apparatus for performing machine learning operations in parallel on machine learning hardware
US10997510B1 (en) 2018-05-22 2021-05-04 Marvell Asia Pte, Ltd. Architecture to support tanh and sigmoid operations for inference acceleration in machine learning
US10929778B1 (en) 2018-05-22 2021-02-23 Marvell Asia Pte, Ltd. Address interleaving for machine learning
US10929779B1 (en) 2018-05-22 2021-02-23 Marvell Asia Pte, Ltd. Architecture to support synchronization between core and inference engine for machine learning
US11016801B1 (en) 2018-05-22 2021-05-25 Marvell Asia Pte, Ltd. Architecture to support color scheme-based synchronization for machine learning
CA3102644C (en) 2018-06-07 2021-08-17 Siemens Aktiengesellschaft Core sealing assemblies, core-coil assemblies, and sealing methods

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3544565B2 (ja) * 1994-07-20 2004-07-21 富士通株式会社 データ転送方法とその装置
JP4079460B2 (ja) 1995-07-24 2008-04-23 富士通株式会社 パケット転送装置
WO2000045260A1 (fr) 1999-01-29 2000-08-03 Fujitsu Limited Compilateur, procede de compilation et support de stockage sur lequel est stocke un programme pour la mise en oeuvre dudit procede
US6438562B1 (en) * 1999-08-24 2002-08-20 Oracle Corporation Parallel index maintenance
JP2003271540A (ja) * 2002-03-14 2003-09-26 Ricoh Co Ltd Dmaデータ転送装置
US20050010588A1 (en) * 2003-07-08 2005-01-13 Zalewski Stephen H. Method and apparatus for determining replication schema against logical data disruptions
JP2005084939A (ja) 2003-09-09 2005-03-31 Fujitsu Ltd 並列処理正規化プログラムおよび並列処理プログラムの正規化方法
JP4117621B2 (ja) 2004-03-31 2008-07-16 日本電気株式会社 データ一括転送装置
US20050283658A1 (en) * 2004-05-21 2005-12-22 Clark Thomas K Method, apparatus and program storage device for providing failover for high availability in an N-way shared-nothing cluster system
JP4695367B2 (ja) * 2004-08-31 2011-06-08 富士通株式会社 情報処理装置,制御装置及び情報処理装置の制御方法
US7475196B2 (en) * 2006-03-23 2009-01-06 International Business Machines Corporation Processor, data processing system, and method for initializing a memory block in a data processing system having multiple coherency domains
US7818560B2 (en) * 2007-09-21 2010-10-19 Intel Corporation System information synchronization in a links-based multi-processor system
US8285670B2 (en) * 2008-07-22 2012-10-09 International Business Machines Corporation Dynamically maintaining coherency within live ranges of direct buffers
US8671074B2 (en) * 2010-04-12 2014-03-11 Microsoft Corporation Logical replication in clustered database system with adaptive cloning

Also Published As

Publication number Publication date
US20160132272A1 (en) 2016-05-12
EP3021210A1 (en) 2016-05-18
US9841919B2 (en) 2017-12-12
JP2016095596A (ja) 2016-05-26

Similar Documents

Publication Publication Date Title
JP6402598B2 (ja) 情報処理装置、通信方法、通信プログラム、及び、情報処理システム
CN107145344B (zh) 在基于图的程序中指定组件
US7089511B2 (en) Framework for hierarchical VLSI design
CN106663010B (zh) 执行基于图的程序规范
CN106687918B (zh) 编译基于图的程序规范
CN106687919B (zh) 用于控制多个组件的执行的方法、***和计算机可读介质
CN106605209B (zh) 控制数据处理任务
Azad et al. Combinatorial BLAS 2.0: Scaling combinatorial algorithms on distributed-memory systems
JP2014525640A (ja) 並列処理開発環境の拡張
Sun et al. Adaptive data placement for staging-based coupled scientific workflows
US11630986B2 (en) Graph conversion method
Zhang et al. In‐memory staging and data‐centric task placement for coupled scientific simulation workflows
Puri et al. MPI-Vector-IO: Parallel I/O and partitioning for geospatial vector data
Gropp Using node information to implement MPI Cartesian topologies
Sreepathi et al. Communication characterization and optimization of applications using topology-aware task mapping on large supercomputers
Niethammer et al. An MPI interface for application and hardware aware Cartesian topology optimization
Fresno et al. Blending extensibility and performance in dense and sparse parallel data management
Rink et al. Memory-efficient array redistribution through portable collective communication
Chavarría-Miranda et al. Topology-aware tile mapping for clusters of SMPs
Zhang et al. Enabling efficient and flexible coupling of parallel scientific applications
KR101812452B1 (ko) 클라우드 서비스에서의 질의 처리 수행 방법 및 이를 이용하는 장치
Hall et al. Big data aware virtual machine placement in cloud data centers
Li et al. 3-D partitioning for large-scale graph processing
Brock Rdma-based distributed data structures for large-scale parallel systems
Shan et al. Implementing high-performance geometric multigrid solver with naturally grained messages

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20170804

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20180629

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20180717

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20180806

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20180814

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20180827

R150 Certificate of patent or registration of utility model

Ref document number: 6402598

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150