(57)【特許請求の範囲】
【請求項１】
演算処理を実行する演算処理装置とデータを記憶する主記憶装置とをそれぞれ備える複数のノードを有する情報処理装置において、
一のノードに属する演算処理装置は、
ジョブ実行指示に応じて、並列演算処理における各演算処理装置が分担する並列演算データを、前記主記憶装置以外の主記憶装置から自己の主記憶装置へ転送処理するためのＩ／Ｏスレッドを、前記各演算処理装置に作成し、
前記複数のノードの各演算処理装置は、前記Ｉ／Ｏスレッドを実行して、演算処理装置が分担する並列演算データを、前記主記憶装置以外の主記憶装置から自己の主記憶装置へ転送する処理を分散して行う
ことを特徴とする情報処理装置。
【請求項２】
請求項１において、
前記一のノードの演算処理装置に作成されたユーザスレッドを実行することに伴って、他の演算処理装置に、並列演算処理するためのユーザスレッドを作成し、
前記複数のノードの各演算処理装置が各ユーザスレッドを実行して、前記分担する並列演算データを、前記主記憶装置から読み出し、並列演算処理し、前記主記憶装置に書き込む
ことを特徴とする情報処理装置。
【請求項３】
請求項２において、
前記複数のノードの各演算処理装置は、前記ユーザスレッドの実行後、前記Ｉ／Ｏスレッドを実行して、分担した並列演算の結果データを、前記自己の主記憶装置から前記主記憶装置以外の主記憶装置へ転送する処理を分散して行う
ことを特徴とする情報処理装置。
【請求項４】
演算処理を実行する演算処理装置とデータを記憶する主記憶装置とをそれぞれ備える複数のノードを有する情報処理装置の制御方法において、
一のノードに属する演算処理装置は、
ジョブ実行指示に応じて、並列演算処理における各演算処理装置が分担する並列演算データを、前記主記憶装置以外の主記憶装置から自己の主記憶装置へ転送処理するためのＩ／Ｏスレッドを、前記各演算処理装置に作成し、
前記複数のノードの各演算処理装置は、前記Ｉ／Ｏスレッドを実行して、演算処理装置が分担する並列演算データを、前記主記憶装置以外の主記憶装置から自己の主記憶装置へ転送する処理を分散して行う
ことを特徴とする情報処理装置の制御方法。
【請求項５】
演算処理を実行する演算処理装置とデータを記憶する主記憶装置とをそれぞれ備える複数のノードを有する情報処理装置の制御プログラムであって、
一のノードに属する演算処理装置に、
ジョブ実行指示に応じて、並列演算処理における各演算処理装置が分担する並列演算データを、前記主記憶装置以外の主記憶装置から自己の主記憶装置へ転送処理するためのＩ／Ｏスレッドを、前記各演算処理装置に作成することをさせ、
前記複数のノードの各演算処理装置に、前記Ｉ／Ｏスレッドを実行して、演算処理装置が分担する並列演算データを、前記主記憶装置以外の主記憶装置から自己の主記憶装置へ転送する処理を分散して行うことをさせるための
情報処理装置の制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラムに関する。
【背景技術】
【０００２】
非均一メモリアクセス(NUMA：Non-Uniform Memory Access)アーキテクチャを利用した情報処理装置(以下、「NUMA型情報処理装置」と適宜記す)が提案されている。NUMA型情報処理装置は、演算処理装置としてのプロセッサ(CPU(Central Processing Unit)コアとも呼ぶ)と主記憶装置としてのメモリとを有する複数のノードを有し、インターコネクトを介してノード間を接続する構成を有する。
【０００３】
NUMA型情報処理装置において、各ノードは、例えば、インターコネクトを介してストレージ装置に接続される。NUMA型情報処理装置は、例えば、ノード間や、ノード内のメモリとストレージ装置との間でデータ転送を行う。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１１−２３８２７８号公報
【特許文献２】特開平１１−１２０１１６号公報
【特許文献３】特開２００６−１１９１３号公報
【特許文献４】特開２００３−６７３５７号公報
【特許文献５】特開平０７−１８２２９８号公報
【特許文献６】特開２００２−１４０２２９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
NUMA型情報処理装置において、例えば、ハードウェアリソースを効率的に利用するためや、処理速度を高速化するために、演算に関連するデータの転送を効率的に行うことが望ましい。
【０００６】
本実施の形態の一つの側面は、情報処理装置におけるデータ転送を効率的に行うことを目的とする。
【課題を解決するための手段】
【０００７】
本実施の形態の第１の側面は、演算処理を実行する演算処理装置とデータを記憶する主記憶装置とをそれぞれ備える複数のノードを有する情報処理装置において、一のノードに属する演算処理装置は、ジョブ実行指示に応じて、並列演算処理における各演算処理装置が分担する並列演算データを、前記主記憶装置以外の主記憶装置から自己の主記憶装置へ転送処理するためのＩ／Ｏスレッドを、前記各演算処理装置に作成し、前記複数のノードの各演算処理装置は、前記Ｉ/Ｏスレッドを実行して、演算処理装置が分担する並列演算データを、前記主記憶装置以外の主記憶装置から自己の主記憶装置へ転送する処理を分散して行うことを特徴とする情報処理装置である。
【発明の効果】
【０００８】
第１の側面によれば、情報処理装置におけるデータ転送を効率的に行うことができる。
【図面の簡単な説明】
【０００９】
【図１】図1は、本実施の形態に関連する技術を説明する図である。
【図２】図2は、本実施の形態における情報処理システムSYSのシステム構成を示す図である。
【図３】図3は、図2の並列情報処理システム1のハードウェア構成図である。
【図４】図4は、図2の並列情報処理システム1のソフトウェア構成図である。
【図５】図5は、図3のコアが図4で説明したソフトウェアを実行している状態を示した図である。
【図６】図6は、図3のストレージシステムとメモリとを説明する図である。
【図７】図7は、図6のリード用配列、ライト用配列を説明する図である。
【図８】図8は、演算用ファイルFAを説明する図である。
【図９】図9は、演算結果ファイルFBを説明する図である。
【図１０】図10は、並列情報処理の流れを説明するフロー図である。
【図１１】図11は、図10のステップS1における並列I/O初期化処理を説明するフロー図である。
【図１２】図12は、物理メモリのアドレスで示される領域が属するNUMAノードの特定を説明する図である。
【図１３】図13は、図10のステップS3におけるリード要求処理の概略を説明するフロー図である。
【図１４】図14は、図13のリード処理用ページリストの作成を説明するフロー図である。
【図１５】図15は、リード処理用ページリストを説明する図である。
【図１６】図16は、図13のリード処理や図17のライト処理を説明するフロー図である。
【図１７】図17は、図10のステップS13におけるライト要求処理の概略を説明するフロー図である。
【図１８】図18は、図17のライト処理用ページリストの作成を説明するフロー図である。
【図１９】図19は、ライト処理用ページリストを説明する図である。
【発明を実施するための形態】
【００１０】
[非均一メモリアクセス]
図1は、本実施の形態に関連する技術を説明する図である。なお、以下の図の説明において、同じ要素については同一の符号を付して、一度した説明を省略する。
【００１１】
図1の並列情報処理システム1000は、非均一メモリアクセス(以下、NUMAと適宜記す)により並列情報処理を実行する。並列情報処理システム1000は、第1のNUMAノード1100、第2のNUMAノード1200と、ストレージシステム1300とを有する。なお、NUMAノードの数は例示である。
【００１２】
(NUMAノード)
第1のNUMAノード1100、第2のNUMAノード1200は、それぞれ、複数のCPUコア(以下、コアと適宜記す)と、1つのメモリを有する。このメモリは、物理メモリであり、例えばDRAM(Dynamic Random Access Memory)である。
【００１３】
第1のNUMAノード1100は、第1のコア1110と、第2のコア1120と、第1のメモリ1130とを有する。第2のNUMAノード1200は、第3のコア1210と、第4のコア1220と、第2のメモリ1230とを有する。
【００１４】
第1のコア1110と、第2のコア1120と、第1のメモリ1130と、第3のコア1210と、第4のコア1220と、第2のメモリ1230と、ストレージシステム1300は、バスBに接続されている。
【００１５】
(CPUコア)
第1のコア1110は、ユーザアプリケーションのユーザスレッドUTH1を実行する。ユーザアプリケーションは、例えば、演算用データに対して、並列情報処理を実行し、演算結果を出力するアプリケーションである。
【００１６】
なお、スレッドとは、ある処理を複数の処理に分割し同時に実行する場合において、分割される処理単位である。換言すれば、スレッドとは、CPU利用の実行単位、すなわち、プログラムの実行単位である。
【００１７】
第1のコア1110は、さらに、データの転送(入出力処理とも呼ぶ)を実行するI/OスレッドIOTHを実行する。I/OスレッドIOTHは、例えば、オペレーティングシステム(OS：Operating System)のカーネルにより実行される。I/OスレッドIOTHは、ユーザスレッドにより呼び出され、データの入出力処理を行う。
【００１８】
第2のコア1120は、前記したユーザアプリケーションのユーザスレッドUTH2を実行する。第3のコア1210は、前記したユーザアプリケーションのユーザスレッドUTH3を実行する。第4のコア1220は、前記したユーザアプリケーションのユーザスレッドUTH4を実行する。
【００１９】
ユーザスレッドUTH1〜UTH4の各々は、演算用データに対して、各スレッドに割り当てられた並列情報処理を実行し、演算結果を出力する。
【００２０】
(NUMA最適化)
NUMA型情報処理装置においては、あるノードのコアが別のノードのメモリ(リモートメモリとも呼ぶ)にアクセスする時間は、このノードのコアが自ノードのメモリ(ローカルメモリとも呼ぶ)にアクセスする時間よりも長くなる。
【００２１】
そこで、並列情報処理システム1000は、コアがアクセスするデータを可能な限りこのコアから近いメモリ(ローカルメモリ)に配置するメモリ割り当て制御を行う。かかるメモリ割り当て制御を"NUMA最適化"と適宜記す。
【００２２】
オペレーティングシステム本体以外のアプリケーションが動作するメモリ空間（ユーザ空間と適宜記す）でのプログラム動作に基づく"NUMA 最適化"技術においては、コア毎の処理負荷が均一になるように、各コアが実行するユーザスレッドにユーザアプリケーションの処理が割り当てられる。そして、かかる技術は、ユーザスレッドが頻繁にアクセスするデータを、このユーザスレッドを実行するコアに近いメモリに配置する。すなわち、かかる技術では、ユーザアプリケーションのデータアクセスパターンに応じて、メモリへのデータ配置を決定している。
【００２３】
(データ読み出し、書き込み処理の一例)
並列情報処理においては、ストレージシステム1300からデータを読み出す処理、メモリ(例えば、第1のメモリ1130)からデータを読み出し、ストレージシステム1300に書き込む処理が実行される。
【００２４】
このデータ読み出し処理、データ書き込み処理において、ストレージシステム1300とメモリとの間でデータが直接転送されるメモリ領域は、オペレーティングシステムの
のメモリ空間（以下、カーネル空間とも呼ぶ）内に確保されたバッファ領域である。そして、ユーザ空間とストレージシステム1300との間のデータ転送は、このバッファ領域を介して間接的に行われる。すなわち、オペレーティングシステムによって、カーネル空間のバッファ領域とユーザ空間との間で、コアを使用してデータがコピーされる。なお、このコピー処理は、ユーザアプリケーションがオペレーティングシステムに対して発行するシステムコールの延長で実行される。
【００２５】
(演算用データの読み出し)
ユーザスレッドUTH1〜UTH4が前記した並列情報処理を実行する前に、I/OスレッドIOTHは、例えばストレージシステム1300から演算用データを読み出し、メモリに記憶する。
【００２６】
この記憶において、I/OスレッドIOTHは、例えば、ローカルメモリである第1のメモリ1130の第2のバッファ1182に演算用データを読み込む。次いで、I/OスレッドIOTHは、第2のバッファ1182に読み込んだ演算用データを、第1のバッファ1181にコピーする。ここで、第2のバッファ1182は、カーネル空間のバッファ領域である。そして、第1のバッファ1181は、いわゆるユーザ空間のバッファ領域である。
【００２７】
(並列情報処理)
ここで、ユーザスレッドUTH1、UTH2は、第1のメモリ1130の第1のバッファ1181にアクセス(ローカルアクセス)し、ユーザスレッドUTH1、UTH2用の演算用データに並列情報処理を行う。そして、ユーザスレッドUTH1、UTH2は、第1のバッファ1181に並列情報処理の結果を示す結果データを書き込む。
【００２８】
また、ユーザスレッドUTH3、UTH4は、第1のメモリ1130の第1のバッファ1181にアクセス(リモートアクセス)し、ユーザスレッドUTH3、UTH4用の演算用データを読み出し、第2のメモリ1230の第1のバッファ1281に書き込む。そして、ユーザスレッドUTH3、UTH4は、ユーザスレッドUTH3、UTH4用の演算用データに並列情報処理を行う。そして、ユーザスレッドUTH3、UTH4は、第1のバッファ1281に並列情報処理の結果を示す結果データを書き込む。
【００２９】
I/OスレッドIOTHは、ユーザスレッドUTH3、UTH4が実行する結果データの書き込みが終了するまで待ち状態に入っている。
【００３０】
ユーザスレッドUTH3、UTH4は、前記したように第1のメモリ1130にリモートアクスして、ユーザスレッドUTH3、UTH4用の演算用データを読み出し、第2のメモリ1230の第1のバッファ1281に書き込む。このリモートアクセスは、前記したように、ローカルアクセスに比べて時間がかかる。
【００３１】
そのため、ユーザスレッドUTH1、UTH2の演算処理の開始時点よりも、ユーザスレッドUTH3、UTH4の演算処理の開始時点が遅れる。その結果、ユーザスレッドUTH1、UTH2が、第1のバッファ1181に対する結果データの書き込みが終了した時点よりも遅れて、ユーザスレッドUTH3、UTH4は、第1のバッファ1281に対する結果データの書き込みを終了する。この遅れ(終了タイミングのばらつきとも呼ばれる)により、I/OスレッドIOTHにおける前記した待ち状態の時間が長くなる。
【００３２】
(演算結果データの書き込み)
この待ち状態が終了すると、I/OスレッドIOTHは、第1のメモリ1130における第1のバッファ1181に書き込まれた演算結果データを第2のバッファ1182にコピーする。そして、I/OスレッドIOTHは、コピーした演算結果データをストレージシステム1300に書き込む。
【００３３】
この書き込みが終了すると、I/OスレッドIOTHは、第2のメモリ1230における第1のバッファ1281に書き込まれた演算結果データを第2のバッファ1282にコピーする。そして、I/OスレッドIOTHは、コピーした演算結果データをストレージシステム1300に書き込む。
【００３４】
なお、I/OスレッドIOTHは、ユーザスレッドからの書き込み要求を受けると、このユーザスレッドが動作するCPUコアで実行され、前記した書き込みを行う。また、第2のバッファ1282は、カーネル空間のバッファ領域である。そして、第1のバッファ1281は、いわゆるユーザ空間のバッファ領域である。
【００３５】
(データ転送におけるNUMA最適化)
前記したように、リモートアクセスにより、I/Oスレッドの待ち状態が長くなると処理時間が長くなるだけでなく、コア、メモリのリソースが無駄になる。
【００３６】
ここで、データ転送における"NUMA最適化"の有無により、ノード内のメモリとストレージシステム1300との間のデータ転送の効率が大きく異なる。データ転送の動作主体は、オペレーティングシステム側のI/OスレッドIOTHであるので、このデータ転送に"NUMA最適化"を適用することは困難である。この困難な理由を説明する。
【００３７】
データ転送において、I/OスレッドIOTHは、ユーザアプリケーション(ユーザスレッド)によるメモリアクセスの要求を受け、この要求に基づき、メモリにアクセスする。すなわち、I/OスレッドIOTHは、いわばユーザスレッドのメモリアクセスを代行するように動作している。そのため、I/OスレッドIOTHは、このユーザスレッドのデータアクセスパターンなどの"NUM最適化"に必要な情報を持たない。
【００３８】
このデータアクセスパターンは、あるユーザスレッドが、記憶装置に記憶されたどの演算用データに対して演算処理を実行するのかを示すパターンである。
【００３９】
このように、I/OスレッドIOTHは、"NUM最適化"に必要な情報を持たないので、このデータ転送に"NUMA最適化"を適用することは困難である。
【００４０】
(データ転送の効率向上)
さて、図1の例では、1つのコアが、ノード内のメモリとストレージシステム1300との間のデータ転送を実行するため、このコアに対する処理負荷が増大し、このコアの処理能力が低下することがある。その結果、このデータ転送の効率が低下する。そこで、このデータ転送処理を各コアに並列処理させて、このデータ転送処理を分散すれば、コアが実行する転送処理の負荷が分散される。その結果、このデータ転送の効率が向上する。
【００４１】
このデータ転送処理の分散において、終了タイミングのばらつきを抑えるためには、並列情報処理装置は、以下の処理が求められる。この処理とは、コアの各々が、前記したデータアクセスパターンに基づき、アクセスするデータをストレージ装置から読み出し、ローカルメモリに書き込む処理である。以下、ノード内のメモリとストレージ装置との間でデータ転送を効率的に行う並列情報処理装置について説明する。
【００４２】
［情報処理システムのシステム構成］
図2は、本実施の形態における情報処理システムSYSのシステム構成を示す図である。情報処理システムSYSは、並列情報処理システム(並列情報処理装置)1と、ログインノード2と、第1の操作用端末31〜第i(小文字のiは、3以上の整数)の操作用端末3iとを有する。以下、並列情報処理システム(並列情報処理装置)1を並列情報処理システム1と記す。
【００４３】
並列情報処理システム1とログインノード2とはネットワークNT1を介して接続され、ログインノード2と第1の操作用端末31〜第iの操作用端末3iとはネットワークNT2を介して接続している。ネットワークNT1、NT2は、例えばLAN(Local Area Network)である。
【００４４】
並列情報処理システム1は、複数のコア(プロセッサコアとも呼ばれる)を利用して並列に情報処理を行うことで、プログラムを高速に実行する。並列情報処理システム1は、例えば、NUMAアーキテクチャを利用した情報処理装置である。
【００４５】
ログインノード2は、ユーザのログイン処理や、プログラム開発や、並列情報処理システム1に対するジョブ操作を実行する。例えば、ログインノード2は、ジョブキューイングシステムを有し、並列情報処理システム1にジョブの実行指示を行い、並列情報処理システム1にジョブを実行させる。並列情報処理システム1は、ジョブの実行指示に応答し、図3で説明するNUMAノード内の複数のコアの1つにメインスレッドを生成させ、この1つのコアにこのメインスレッドを実行させる。すると、メインスレッドは、他のコアの各々にサブスレッドを生成させ、他のコアの各々にサブスレッドを実行させる。
【００４６】
また、ログインノード2は、並列情報処理システム1において実行されるジョブの管理、スケジューリング、監視を実行する。
【００４７】
第1の操作用端末31〜第iの操作用端末3iは、ログインノード2を介して、並列情報処理システム1にジョブの実行を指示する。ログインノード2は、この指示に応答し、ジョブをキューイングし、キューイングされたジョブの実行を並列情報処理システム1に指示する。
【００４８】
さらに、第1の操作用端末31〜第iの操作用端末3iは、このジョブの実行により並列情報処理システム1が出力したジョブの結果(演算結果)を受信し、例えば、表示装置(図示しない)に演算結果を出力する。
【００４９】
[ハードウェア構成]
図3は、図2の並列情報処理システム1のハードウェア構成図である。並列情報処理システム1は、第1のNUMAノードND1〜第4のNUMAノードND4と、ストレージシステム（記憶装置）STRと、接続装置CNCとを有する。ストレージシステム（記憶装置）STRをストレージシステムSTRと記す。
【００５０】
並列情報処理システム1は、演算処理装置としてのプロセッサ(コアとも呼ぶ)と、主記憶装置としてのメモリとを有する複数のノードを有する情報処理装置(コンピュータとも呼ぶ)の一例である。
【００５１】
第j(jは1〜4の整数)のNUMAノードNDjは、それぞれ、複数のコアと、1つ以上のメモリとを有する。このメモリは、例えばDRAMである。図3の例では、第jのNUMAノードNDjは、2つのコアと、第jのメモリMjを有する。
【００５２】
例えば、第1のNUMAノードND1は、第1のコアC1と、第2のコアC2と、第1のメモリM1とを有する。第2のNUMAノードND2は、第3のコアC3と、第4のコアC4と、第2のメモリM2とを有する。第3のNUMAノードND3は、第5のコアC5と、第6のコアC6と、第3のメモリM3とを有する。第4のNUMAノードND4は、第7のコアC7と、第8のコアC8と、第4のメモリM4とを有する。
【００５３】
第k(kは1〜8の整数)のコアCkは、それぞれ第kのスレッド群Tkを実行する。例えば、第1のコアC1は、第1のスレッド群T1を実行する。
【００５４】
並列情報処理システム1は、上記したNUMAノードの構成により、マルチプロセスを実行可能である。そして、並列情報処理システム1は、8つのコアの各々が実行するユーザスレッド(演算スレッドとも呼ぶ)で並列情報処理するマルチスレッドモデルの並列情報処理アプリケーション(プログラム)を実行する。なお、マルチプロセスかつマルチスレッドモデルはハイブレッドモデルとも呼ばれる。
【００５５】
ストレージシステムSTRは、1以上の大容量記憶装置を有する。大容量記憶装置は、例えば、補助記憶装置としてのハードディスクドライブや、ソリッドステートドライブでもよい。ストレージシステムSTRは、例えば、ノード内の主記憶装置以外の主記憶装置の一例である。
【００５６】
接続装置CNCは、図2のログインノード2に対する接続インターフェイスとして機能し、ネットワークNT1に接続する。
【００５７】
第1のコアC1〜第8のコアC8、第1のメモリM1〜第4のメモリM4、ストレージシステムSTR、接続装置CNCは、それぞれ、バスBに接続する。なお、ストレージシステムSTRとバスBとをPCI(Peripheral Component Interconnect)バスにより接続してもよい。
【００５８】
なお、図3で説明したNUMAノードの数(4つ)、各NUMAノードが有するコアの数(2つ)、メモリの数(1つ)は、例示であり、その他の数であってもよい。
【００５９】
[ソフトウェア構成]
図4は、図2の並列情報処理システム1のソフトウェア構成図である。ユーザアプリケーション10は、図1で説明した、例えば、演算対象となるデータである演算用データに対して、並列情報処理を実行し、演算結果を出力するアプリケーションである。
【００６０】
ユーザアプリケーション10は、図5に示す第1のユーザスレッド(演算処理部)101〜第8のユーザスレッド(演算処理部)108を含む。以下、ユーザスレッド(演算処理部)をユーザスレッドと記す。
【００６１】
第1のユーザスレッド101〜第8のユーザスレッド108は、演算用データに対して、各スレッドに割り当てられた並列情報処理を実行し、演算結果を出力する。なお、この演算処理は、様々な演算処理を含み、情報処理とも呼ばれる。第1のユーザスレッド101〜第8のユーザスレッド108は、演算処理を実行する演算処理部の一例である。
【００６２】
I/Oサブシステム20は、ストレージシステムSTRから演算用データを読み出し、第1のメモリM1〜第4のメモリM4に書き込む処理(以下、リード処理と適宜記す)を実行する。
【００６３】
第1のユーザスレッド101〜第8のユーザスレッド108は、自スレッドを実行するコアが属するノード内のメモリに書き込まれた演算用データに対して前記した並列情報処理を実行する。そして、第1のユーザスレッド101〜第8のユーザスレッド108は、自スレッドを実行するコアが属するノード内のメモリ（自スレッドのメモリ）に演算結果を示すデータ(以下、演算結果データと適宜記す)を書き込む。なお、同一コアで実行されるI/Oスレッドとユーザスレッドとを、ペアのI/Oスレッド、ユーザスレッドと呼ぶ。
【００６４】
I/Oサブシステム20は、第1のメモリM1〜第4のメモリM4に書き込まれた演算結果データをストレージシステムSTRに書き込む処理(以下、ライト処理と適宜記す)を実行する。
【００６５】
I/Oサブシステム20は、並列I/O処理初期化部21と、並列I/O処理部22と、I/Oスレッド23と、ページリスト取得部(特定部)24とを有する。以下、ページリスト取得部(特定部)24をページリスト取得部24と記す。
【００６６】
並列I/O処理初期化部21は、I/Oスレッド23を作成する。並列I/O処理部22は、I/Oスレッド23にリード処理、ライト処理の実行を指示する。
【００６７】
I/Oスレッド23は、図5に示す、第1のI/Oスレッド(転送部)231〜第8のI/Oスレッド(転送部)238を含みリード処理、ライト処理を実行する。以下、I/Oスレッド(転送部)をI/Oスレッドと記す。第1のI/Oスレッド231〜第8のI/Oスレッド238は、演算処理に関連するデータを転送する転送部の一例である。
【００６８】
ページリスト取得部24は、メモリにおける記憶位置(記憶領域とも呼ぶ)のアドレスを格納するリストを取得する。この記憶位置のアドレスは、第1のI/Oスレッド231〜第8のI/Oスレッド238が、演算用データを書き込む、第jのメモリMjにおける記憶位置を示すアドレスである。また、このメモリにおける領域のアドレスは、第jのメモリMjにおいて演算結果データが書き込まれる記憶位置を示すアドレスである。
【００６９】
カーネル30は、オペレーティングシステムの基本的機能を実行するソフトウェアである。この基本的機能は、例えば、ストレージシステムSTR、第1のメモリM1〜第4のメモリM4などのハードウェア資源の管理、割り込み処理、スレッド間通信などである。
【００７０】
[ソフトウェアの実行]
図5は、図3のコアが図4で説明したソフトウェアを実行している状態を示した図である。
【００７１】
第k(kは1〜8の整数)のコアCkは、第kのスレッド群THk、第kのカーネル30kを実行する。第kのスレッド群THkは、第kのユーザスレッド10k、第kのI/Oスレッド23kの何れか1、または、2つを含むスレッド群である。図5では、第kのスレッド群THkは、第kのユーザスレッド10kと第kのI/Oスレッド23kとを含むように示している。
【００７２】
例えば、第1のコアC1は、第1のユーザスレッド101、第1のI/Oスレッド231、第1のカーネル301を実行する。
【００７３】
第k(kは1〜8の整数)のコアCkは、第kのユーザスレッド10kと、第kのI/Oスレッド23kとを実行するプロセッサの一例である。
【００７４】
図4のカーネル30は、第1のコアC1〜第8のコアC8の何れかの1以上のコアで動作している。例えば、第kのユーザスレッド10kが、システムコールを利用してカーネル30が提供する処理の実行をカーネル30に指示する。すると、カーネル30は、第kのユーザスレッド10kが動作している第kのコアCkで動作し、実行指示を受けた処理を行う。このように、第kのコアCkでカーネル30が動作している状態を、図4における符号30k(301〜308)で模式的に示している。
【００７５】
さらに、第1のコアC1は、並列I/O処理初期化部21と、並列I/O処理部22と、ページリスト取得部24とを実行する。
【００７６】
[ストレージシステムとメモリ]
図6は、図3のストレージシステムとメモリとを説明する図である。ストレージシステムSTRは、演算用ファイルFA、演算結果ファイルFB、プログラムPG1を記憶する。さらに、ストレージシステムSTRは、演算用ファイルFAのファイルポインタ情報(第1のアドレス情報)IN1、対応情報(第2のアドレス情報)IN2、演算結果ファイルFBのファイルポインタ情報(第3のアドレス情報)IN3を記憶する。以下、ファイルポインタ情報(第1のアドレス情報)IN1、対応情報(第2のアドレス情報)IN2、ファイルポインタ情報 (第3のアドレス情報)IN3については、それぞれ、ファイルポインタ情報IN1、対応情報IN2、ファイルポインタ情報IN3と記す。
【００７７】
なお、ファイルポインタ情報IN1については図8で説明し、対応情報IN2については図12で説明し、ファイルポインタ情報IN3については図9で説明する。
【００７８】
演算用ファイルFAは、演算用データが格納されるファイルである。演算結果ファイルFBは、演算結果データが格納されるファイルである。
【００７９】
プログラムPG1は、ユーザアプリケーション10、I/Oサブシステム20、カーネル30の実行ファイルである。例えば、第1のコアC1は、並列情報処理システム1の起動時に、ストレージシステムSTRからプログラムPG1を読み出し、例えば第1のメモリM1に展開する。このプログラムPG1の展開により、ユーザアプリケーション10、I/Oサブシステム20、カーネル30が実行される。
【００８０】
なお、この実行ファイルを外部記憶媒体(図示しない)に記憶してもよい。この記憶媒体(記録媒体とも呼ばれる)は、例えば、CD-ROM(Compact Disc Read Only Memory)、DVD(Digital Versatile Disc)などの可搬型記憶媒体である。この場合、並列情報処理システム1は、例えば、接続インターフェイス(図示しない)を介して、外部記憶媒体に記憶されたデータを読み取る記憶媒体読み取り装置(図示しない)と接続する。
【００８１】
第j(jは1〜4の整数)のメモリMjは、リード用配列Rjと、ライト用配列Wjと、テンポラリバッファTBjとを有する。例えば、第1のメモリM1は、リード用配列R1と、ライト用配列W1と、テンポラリバッファTB1とを有する。
【００８２】
第jのメモリMjのリード用配列Rjは、演算用ファイルFAに格納されている演算用データの一部を記憶する配列である。第jのメモリMjのライト用配列Wjは、演算結果データが書き込まれる配列である。なお、図6における、"リード処理"、"ライト処理"、"コピー"については、図16で説明する。
【００８３】
図7は、図6のリード用配列、ライト用配列を説明する図である。なお、図7においては、図を簡略化するため、メモリ以外のハードウェア構成や、図6に示したテンポラリバッファTB1〜TB4の図示を省略している。リード用配列、ライト用配列の対応領域については、図10のステップS2で説明する。
【００８４】
[演算用ファイル]
図8は、演算用ファイルFAを説明する図である。演算用ファイルFAは、演算処理の対象である演算用データ(対象データとも呼ぶ)を格納するファイルである。演算用ファイルFAには、第k(kは1〜8の整数)のユーザスレッド10k用の演算用データが区分されて格納されている。なお、演算用ファイルFAは、ヘッダ情報などの各種制御情報を有するが、この各種制御情報の図示を省略している。
【００８５】
ファイルポインタPTR1a〜ファイルポインタPTR9aは、ストレージシステムSTRにおける演算用ファイルFAのアドレス(ファイルポインタとも呼ぶ)を示している。
【００８６】
第kのユーザスレッド10kの演算用データは、ファイルポインタPTR(k)a〜PTR(k+1)aで示される領域に格納されている。ここで、"(k)"は、"1"〜"8"の整数を示し、"(k+1)"は、"k"に、"1"を加算した整数を示す。
【００８７】
例えば、第1のユーザスレッド101の演算用データは、ファイルポインタPTR1a〜PTR2aで示される領域に格納されている。第2のユーザスレッド102の演算用データは、ファイルポインタPTR2a〜PTR3aで示される領域に格納されている。第3のユーザスレッド103の演算用データは、ファイルポインタPTR3a〜PTR4aで示される領域に格納されている。
【００８８】
第4のユーザスレッド104の演算用データは、ファイルポインタPTR4a〜PTR5aで示される領域に格納されている。第6のユーザスレッド106の演算用データは、ファイルポインタPTR6a〜PTR7aで示される領域に格納されている。第7のユーザスレッド107の演算用データは、ファイルポインタPTR7a〜PTR8aで示される領域に格納されている。第8のユーザスレッド108の演算用データは、ファイルポインタPTR8a〜PTR9aで示される領域に格納されている。
【００８９】
図6に示したファイルポインタ情報IN1は、ストレージシステムSTRにおける、第kのユーザスレッド10kの演算用データの記憶位置を示すファイルポインタPTR(k)a〜PTR(k+1)aである。なお、ファイルポインタ情報IN1は、前記した第1のアドレス情報(図6参照)の一例である。前記した第1のアドレス情報は、ストレージシステムSTRにおける、第kのユーザスレッド10kの演算処理の対象となる演算用データの記憶位置を示す情報である。
【００９０】
ユーザアプリケーション10の開発者(以下、開発者と適宜記す)は、演算用ファイルFA、ファイルポインタ情報IN1を作成し、ストレージシステムSTRに記憶する。
【００９１】
なお、開発者は、ファイルポインタ情報IN1を、ユーザアプリケーション10の開発時に、ユーザアプリケーション10に予め設定してもよいし、ユーザアプリケーション10の実行開始時に、ユーザアプリケーション10に設定してもよい。
【００９２】
他にも、開発者は、ファイルポインタ情報IN1を、演算用ファイルFAのヘッダ領域に格納してもよい。
【００９３】
[演算結果ファイル]
図9は、演算結果ファイルFBを説明する図である。演算結果ファイルFBには、第k(kは1〜8の整数)のユーザスレッド10kの演算結果データが区分されて格納される。なお、演算結果ファイルFBは、ヘッダ情報などの各種制御情報を有するが、この各種制御情報の図示を省略している。
【００９４】
ファイルポインタPTR1b〜ファイルポインタPTR9bは、ストレージシステムSTRにおける演算結果ファイルFBのアドレスを示している。
【００９５】
第kのユーザスレッド10kの演算結果データは、ファイルポインタPTR(k)b〜PTR(k+1)bで示される領域に格納される。
【００９６】
例えば、第1のユーザスレッド101の演算結果データは、ファイルポインタPTR1b〜PTR2bで示される領域に格納される。
【００９７】
図6に示したファイルポインタ情報IN3は、ストレージシステムSTRにおける、第kのユーザスレッド10kの演算結果データの記憶位置を示すファイルポインタPTR(k)b〜PTR(k+1)bである。なお、ファイルポインタ情報IN3は、前記した第3のアドレス情報(図6参照)の一例である。前記した第3のアドレス情報は、ストレージシステムSTRにおける、第kのユーザスレッド10kの演算処理の結果を示す演算結果データの記憶位置を示す情報である。
【００９８】
開発者は、ファイルポインタ情報IN3をストレージシステムSTRに記憶する。なお、開発者は、ファイルポインタ情報IN3を、ユーザアプリケーション10の開発時に、ユーザアプリケーション10に予め設定してもよいし、ユーザアプリケーション10の実行開始時に、ユーザアプリケーション10に設定してもよい。
【００９９】
他にも、開発者は、ファイルポインタ情報IN3を、演算結果ファイルFBのヘッダ領域に格納してもよい。
【０１００】
［ストレージシステム-メモリ間のデータ転送］
以下に、本実施の形態におけるストレージシステム-メモリ間のデータ転送について説明する。複数のノードの各々に属する第k(kは1〜8の整数)のコアCk(演算処理装置)は、第kのユーザスレッド10kと、第kのI/Oスレッド23kとを有する。
【０１０１】
第kのI/Oスレッド(転送部)23kは、第kのユーザスレッド10kが演算処理を実行する対象データを、ストレージシステムSTRにおける記憶位置を示す第1のアドレス情報(ファイルポインタ情報IN1)に基づいてストレージシステムSTRから読み出す。そして、第kのI/Oスレッド23kは、読み出した対象データを、第kのコアCkが属するノードのメモリ(すなわち、自ノードのメモリ)に書き込む。
【０１０２】
次いで、複数のノードの各々に属する第kのコアCkの第kのユーザスレッド10kは、第kのコアCkが属するノードのメモリに書き込まれた演算用データに演算処理を実行する。この演算処理は、例えば並列情報処理である。
【０１０３】
そして、第kのコアCkの第kのユーザスレッド10kは、演算結果を示す演算結果データを、第kのコアCkが属するノードのメモリに書き込む。
【０１０４】
第kのコアCkの第kのI/Oスレッド23kは、第kのコアCkが属するノードのメモリに書き込まれた演算結果データをストレージシステムSTRに書き込む。この書き込みにおいて、第kのコアCkの第kのI/Oスレッド23kは、第kのコアCkが属するノードのメモリに書き込まれた演算結果データを読み出す。そして、第kのI/Oスレッド23kは、ファイルポインタ情報IN3に基づき、読み出した演算結果データをストレージシステムSTRに書き込む。
【０１０５】
図3〜図9を参照して本実施の形態のデータ転送を詳細に説明する。
【０１０６】
[並列情報処理の流れ]
図10は、並列情報処理の流れを説明するフロー図である。図10の説明では、図4のカーネル30が例えば、第1のNUMAノードND1の第1のコアC1で動作している。そして、第1のコアC1のカーネル30は、並列情報処理用のプログラム(図6のプログラムPG1参照)を読み出し、例えば、第1のメモリM1に展開する。第1のコアC1は、この展開により、図5に示したように、並列I/O処理初期化部21、並列I/O処理部22、ページリスト取得部24、第1のユーザスレッド101の実行を開始する。
【０１０７】
カーネル30が動作している状態において、ログインノード2が、並列情報処理用のジョブの実行を並列情報処理システム1に指示する。以後、ステップS1以下の処理が開始される。なお、以下のフロー図の説明において、"Ss"(小文字sは1以上の整数)は、ステップSsを意味し、このステップという文字を適宜省略する。
【０１０８】
(並列I/O初期化)
ステップS1:第1のユーザスレッド101は、並列I/O処理初期化部21に並列I/O初期化を指示する。並列I/O処理初期化部21は、この指示に応答して、図5に示したように、第k(kは1〜8の整数)のI/Oスレッド23kを作成し第kのコアCkで実行させる。なお、並列I/O初期化処理については、図11で詳細に説明する。
【０１０９】
(リード用配列、ライト用配列の確保)
ステップS2: 第1のユーザスレッド101は、第j(jは1〜4の整数)のメモリMjにリード用配列Rjの領域、ライト用配列Wjの領域を確保する。この確保は、例えば、カーネル30に対するシステムコールの読み出しにより実行される。
【０１１０】
S2の確保を図7を参照して説明する。例えば、第1のユーザスレッド101は、第1のメモリM1にリード用配列R1を確保する。そして、第1のユーザスレッド101は、リード用配列R1内に、第1のI/Oスレッド231に対応する第1の対応領域RS1と、第2のI/Oスレッド232に対応する第2の対応領域RS2とを確保する。そして、第1のユーザスレッド101は、第1のメモリM1にライト用配列W1を確保する。そして、第1のユーザスレッド101は、ライト用配列W1内に、第1のI/Oスレッド231に対応する第1の対応領域WS1と、第2のI/Oスレッド232に対応する第2の対応領域WS2とを確保する。
【０１１１】
第1のユーザスレッド101は、第2のメモリM2にリード用配列R2を確保する。そして、第1のユーザスレッド101は、リード用配列R2内に、第3のI/Oスレッド233に対応する第3の対応領域RS3と、第4のI/Oスレッド234に対応する第4の対応領域RS4とを確保する。第1のユーザスレッド101は、第2のメモリM2にライト用配列W2を確保する。そして、第1のユーザスレッド101は、ライト用配列W2内に、第3のI/Oスレッド233に対応する第3の対応領域WS3と、第4のI/Oスレッド234に対応する第4の対応領域WS4とを確保する。
【０１１２】
第1のユーザスレッド101は、第3のメモリM3にリード用配列R3を確保する。そして、第1のユーザスレッド101は、リード用配列R3内に、第5のI/Oスレッド235に対応する第5の対応領域RS5と、第6のI/Oスレッド236に対応する第6の対応領域RS6とを確保する。第1のユーザスレッド101は、第3のメモリM3にライト用配列W3を確保する。そして、第1のユーザスレッド101は、ライト用配列W3内に、第5のI/Oスレッド235に対応する第5の対応領域WS5と、第6のI/Oスレッド236に対応する第6の対応領域WS6とを確保する。
【０１１３】
第1のユーザスレッド101は、第4のメモリM4にリード用配列R4を確保する。そして、第1のユーザスレッド101は、リード用配列R4内に、第7のI/Oスレッド237に対応する第7の対応領域RS7と、第8のI/Oスレッド238に対応する第8の対応領域RS8とを確保する。第1のユーザスレッド101は、第4のメモリM4にライト用配列W4を確保する。第1のユーザスレッド101は、ライト用配列W4内に、第7のI/Oスレッド237に対応する第7の対応領域WS7と、第8のI/Oスレッド238に対応する第8の対応領域WS8とを確保する。
【０１１４】
なお、第1のユーザスレッド101は、第j（jは1〜4の整数）のメモリMjに確保したリード用配列Rj、ライト用配列Wjの仮想アドレスを例えばカーネル30から取得している。
【０１１５】
第1のユーザスレッド101は、リード用配列Rj内の対応領域を識別する識別子、ライト用配列Wjの対応領域を識別する識別子を、図11のステップS11で説明する、スレッド識別子に対応付けて第1のメモリM1に記憶してもよい。
【０１１６】
（リード処理）
ステップS3:第1のユーザスレッド101は、並列I/O処理部22にリード処理を要求する。並列I/O処理部22は、リード処理の要求に応答して、第1のI/Oスレッド231〜第8のI/Oスレッド238にリード処理の実行を指示する。
【０１１７】
第k（kは1〜8の整数）のI/Oスレッド23kは、このリード指示に応答して、ストレージシステムSTRからファイルポインタ情報IN1を読み出す。そして、第kのI/Oスレッド23kは、ファイルポインタ情報IN1に基づき、演算用ファイルFAにおけるファイルポインタPTR(k)a〜PTR(k+1)aで示される領域に格納された演算用データを読み出す。次いで、第kのI/Oスレッド23kは、自スレッドのリード用配列において、第kのユーザスレッド10kに対応して確保されている第kの対応領域RSkに、読み出した演算用データを書き込む。なお、自スレッドのリード用配列とは、自スレッドを実行しているコアが属するノード内のメモリに確保されたリード用配列である。
【０１１８】
例えば、第1のI/Oスレッド231は、このリード指示に応答して、ストレージシステムSTRの演算用ファイルFAから、ペアの第1のユーザスレッド101の演算用データを読み出し、自スレッドのリード用配列R1の第1の対応領域RS1に書き込む。
【０１１９】
第1のユーザスレッド101の演算用データは、図8で示した、演算用ファイルFAにおけるファイルポインタPTR1a〜PTR2aで示される領域に格納された演算用データである。
【０１２０】
第2のI/Oスレッド232は、このリード指示に応答して、ストレージシステムSTRの演算用ファイルFAから、ペアの第2のユーザスレッド102の演算用データを読み出し、自スレッドのリード用配列R1の第2の対応領域RS2に書き込む。
【０１２１】
第2のユーザスレッド102の演算用データは、図8で示した、演算用ファイルFAにおけるファイルポインタPTR2a〜PTR3aで示される領域に格納された演算用データである。
【０１２２】
第3のI/Oスレッド233〜第8のI/Oスレッド238も、第1のI/Oスレッド231、第2のI/Oスレッド232と同様な、読み出し、書き込み処理を行う。S3の時点では、第2のユーザスレッド102〜第8のユーザスレッド108は、作成されておらず、次のS4で作成される。なお、リード処理については、図13で詳細に説明する。
【０１２３】
（ユーザスレッドの作成）
ステップS4: 第1のユーザスレッド101は、ユーザスレッドを作成する。具体的には、第1のユーザスレッド101は、第m(mは2〜8の整数)のコアCmで動作する、第mのユーザスレッド10mを作成する。例えば、第1のユーザスレッド101は、図5で示したように、第2のコアC2〜第8のコアC8でそれぞれ動作する第2のユーザスレッド102〜第8のユーザスレッド108を作成する。第2のユーザスレッド102〜第8のユーザスレッド108は、子スレッドとも呼ばれる。
【０１２４】
(親スレッドの処理)
以下、S5〜S8では、親スレッド(マスタースレッドとも呼ばれる)である第1のユーザスレッド101が実行する処理について説明する。
【０１２５】
ステップS5:第1のユーザスレッド101は、自身が動作する第1のコアC1に自身をバインドする。このバインドにより、第1のユーザスレッド101は、第1のコアC1以外のコアでの実行が抑止される。
【０１２６】
ステップS6: 第1のユーザスレッド101は、自スレッドのリード用配列R1(図6、図7参照)の第1の対応領域RS1に記憶された演算用データを使い、自スレッドに割り当てられた並列情報処理を実行する。
【０１２７】
ステップS7: 第1のユーザスレッド101は、並列情報処理が終了すると、自スレッドのライト用配列W1(図6、図7参照)の第1の対応領域WS1に、並列情報処理の結果を示すデータ(演算結果データ)を書き込む。
【０１２８】
ステップS8: 第1のユーザスレッド101は、全ての子スレッド(第2のユーザスレッド〜第8のユーザスレッド)のデータ書き込みの終了を待ち合わせる。全ての子スレッドのデータ書き込みが終了すると、S13に移る。
【０１２９】
(子スレッド)
以下、S9〜S12では、子スレッドが実行する処理について説明する。
【０１３０】
ステップS9: 第m(mは2〜8の整数)のユーザスレッド10mは、自身が動作する第mのコアCmに自身をバインドする。このバインドにより、第mのユーザスレッド10mは、第mのコアCm以外のコアでの実行が抑止される。例えば、第2のユーザスレッド102は、自身が動作する第2のコアC2にバインドする。
【０１３１】
ステップS10: 第mのユーザスレッド10mは、自スレッドのリード用配列(図6、図7参照)の対応領域RSmに記憶された演算用データを使い、自スレッドに割り当てられた並列情報処理を実行する。例えば、第2のユーザスレッド102は、自スレッドのリード用配列R1の第2の対応領域RS2に記憶された演算用データを使い並列情報処理を実行する。また、第3のユーザスレッド103、第4のユーザスレッド104は、それぞれ、自スレッドのリード用配列R2の第3、第4の対応領域RS3、RS4に記憶された演算用データを使い並列情報処理を実行する。また、第5のユーザスレッド105、第6のユーザスレッド106は、それぞれ、自スレッドのリード用配列R3の第5、第6の対応領域RS5、RS6に記憶された演算用データを使い並列情報処理を実行する。また、第7のユーザスレッド107、第8のユーザスレッド108は、それぞれ、自スレッドのリード用配列R4の第7、第8の対応領域RS7、RS8に記憶された演算用データを使い並列情報処理を実行する。
【０１３２】
ステップS11:第m(mは2〜8の整数)のユーザスレッド10mは、並列情報処理が終了すると、自スレッドのライト用配列の第mの対応領域WSmに、並列情報処理の結果を示すデータ(演算結果データ)を書き込む。
【０１３３】
例えば、第2のユーザスレッド102は、並列情報処理が終了すると、自スレッドのライト用配列W1の第2の対応領域WS2に、並列情報処理の演算結果データを書き込む。
【０１３４】
また、第3のユーザスレッド103、第4のユーザスレッド104は、並列情報処理が終了すると、それぞれ、自スレッドのライト用配列W2の第3、第4の対応領域WS3、WS4に、並列情報処理の演算結果データを書き込む。
【０１３５】
また、第5のユーザスレッド105、第6のユーザスレッド106は、並列情報処理が終了すると、それぞれ、自スレッドのライト用配列W3の第5、第6の対応領域WS5、WS6に、並列情報処理の演算結果データを書き込む。
【０１３６】
また、第7のユーザスレッド107、第8のユーザスレッド108は、並列情報処理が終了すると、それぞれ、自スレッドのライト用配列W4の第7、第8の対応領域WS7、WS8に、並列情報処理の演算結果データを書き込む。
【０１３７】
ステップS12: 第m(mは2〜8の整数)のユーザスレッド10mは、演算結果データの書き込みが終了すると、その旨を第1のユーザスレッド101に通知する。
【０１３８】
(ライト処理)
ステップS13: 第1のユーザスレッド101は、S12の通知を受信すると、並列I/O処理部22にライト処理を要求する。並列I/O処理部22は、ライト処理の要求に応答して、第1のI/Oスレッド231〜第8のI/Oスレッド238にライト処理の実行を指示する。
【０１３９】
第k（kは1〜8の整数）のI/Oスレッド23kは、このライト指示に応答して、ストレージシステムSTRからファイルポインタ情報IN3を読み出す。また、第kのI/Oスレッド23kは、自スレッドのライト用配列の対応領域WSkに記憶された演算結果データを読み出す。そして、第kのI/Oスレッド23kは、読み出した演算結果データを、ファイルポインタ情報IN3に基づき、ストレージシステムSTRの演算結果ファイルFBの対応領域に書き込む。演算結果ファイルFBの対応領域は、演算結果ファイルFBにおけるファイルポインタPTR(k)b〜PTR(k+1)bで示される領域である。なお、ライト処理については、図16で詳細に説明する。
【０１４０】
図10のS1で説明したように、第kのコアCkは、自ノードに属するメモリ(ローカルメモリ)とストレージシステムSTRとのデータ転送を実行する第k(kは1〜8の整数)のI/Oスレッド23kを同時に実行する。このように、各コアが、自ノードに属するメモリとストレージシステムSTRとのデータ転送を実行するので、転送処理が分散される。この分散により、処理負荷が削減され、さらに、転送開始から転送終了までの時間が短縮される。その結果、データ転送の効率が向上する。
【０１４１】
さらに、第k（kは1〜8の整数）のコアCkは、並列情報処理する演算用データを自ノードに属するメモリ(ローカルメモリ)に書き込む(図10のS3)。そして、第kのコアCkは、自ノードに属するメモリにアクセスしてこの演算用データに並列情報処理を実行する(図10のS6、S10)。そのため、第kのコアCkは、他ノードのメモリ(リモートメモリ)にアクセスすることなく並列情報処理を実行できるので、メモリアクセスのレイテンシを抑制することができる。
【０１４２】
さらに、第kのコアCkは、並列情報処理の実行により得られた演算結果データを自ノードに属するメモリに書き込む(S7。S11)。そして、第kのコアCkは、自ノードに属するメモリに書き込まれた演算結果データを読み出して、読み出した演算結果データをストレージシステムSTRに書き込む(S13)。このように、第kのコアCkは、他ノードのメモリ(リモートメモリ)から演算結果データを読み出して、読み出した演算結果データをストレージシステムSTRに書き込まない。そのため、前記したレイテンシを抑制することができる。前記したレイテンシを抑制することにより、ノード内のメモリとストレージ装置との間でデータ転送を効率的に行うことができる。
【０１４３】
[並列I/O初期化]
図11は、図10のステップS1における並列I/O初期化処理を説明するフロー図である。
【０１４４】
ステップS11: 並列I/O処理初期化部21は、並列I/O初期化の指示(図10のS1参照)に応答して、図5に示したように、第k(kは1〜8の整数)のI/Oスレッド23kを作成し第kのコアCkで実行させる。すなわち、第kのコアCkは、第kのI/Oスレッド23kを実行する。具体的には、第1のコアC1〜第8のコアC8は、それぞれ、第1のI/Oスレッド231〜第8のI/Oスレッド238を同時に実行する。
【０１４５】
並列I/O処理初期化部21は、第kのI/Oスレッド23kの作成順に、作成したスレッドを識別するスレッド識別子を作成し、第1のメモリM1に記憶し、管理する。
【０１４６】
ステップS12:作成された第k(kは1〜8の整数)のI/Oスレッド23kは、自身が動作する第kのコアCkに自身をバインドする。例えば、第1のI/Oスレッド231は、自身が動作する第1のコアC1に自身をバインドする。このバインドにより、第kのI/Oスレッド23kは、第kのコアCk以外のコアでの実行が抑止される。
【０１４７】
S12の終了後、図10のリード用配列、ライト用配列の確保処理が実行され(S2)、リード要求処理が行われる(S3)。
【０１４８】
［リード処理要求］
次に、リード処理要求(図10のS3)について、図12〜図16を参照して説明する。
【０１４９】
(アドレス対応)
図12は、物理メモリのアドレスで示される領域が属するNUMAノードの特定を説明する図である。図12は、対応情報IN2を示す。対応情報IN2は、複数のノードの各々に属するメモリの領域を示す第2の情報の一例である。カーネル30は、対応情報IN2を管理する。以下、物理メモリのアドレスを物理アドレスと適宜記す。
【０１５０】
図12の対応情報IN2は、物理アドレスADR(j)〜ADR(j+1)で示される領域（メモリ空間とも呼ぶ）が、第jのNUMAノードNDjに属する第jのメモリMjのある領域に対応することを示している。なお、"(j)"は"1"〜"4"の整数を示し、"(j+1)"は、"j"に、"1"を加算した整数を示す。
【０１５１】
例えば、対応情報IN2は、物理アドレスADR1〜ADR2で示される領域が、第1のNUMAノードND1に属する第1のメモリM1のある領域に対応することを示している。また、対応情報IN2は、物理アドレスADR2〜ADR3で示される領域が、第2のNUMAノードND2に属する第2のメモリM2のある領域に対応することを示している。
【０１５２】
また、対応情報IN2は、物理アドレスADR3〜ADR4で示される領域が、第3のNUMAノードND3に属する第3のメモリM3のある領域に対応することを示している。また、対応情報IN2は、物理アドレスADR4〜ADR5で示される領域が、第4のNUMAノードND4に属する第4のメモリM4のある領域に対応することを示している。
【０１５３】
なお、斜め線のハッチングで示す長方形は、カーネル30がメモリを管理する際の管理単位(ページとも呼ぶ)を模式的に示している。管理単位のバイト数は、例えば、4キロバイトである。管理単位については、後記する。
【０１５４】
複数のノードの各々に属する第k(kは1〜8の整数)のコアCkの第kのI/Oスレッド23kは、対応情報IN2に基づき、ストレージシステムSTRから読み出した対象データを第kのコアCkが属するノードのメモリに書き込む。この対象データは、演算処理の対象となる演算用データの一例である。なお、この書き込みについては、図16で説明する。
【０１５５】
[リード処理]
図13〜図16は、図10のステップS3におけるリード要求処理を説明するフロー図である。図13は、図10のステップS3におけるリード要求処理の概略を説明するフロー図である。図14は、図13のリード処理用ページリストの作成を説明するフロー図である。図15は、リード処理用ページリストを説明する図である。図16は、図13のリード処理や図17のライト処理を説明するフロー図である。最初に図13のフロー図から説明する。
【０１５６】
(ページリストの取得)
図13のステップS31: 並列I/O処理部22は、第1のユーザスレッド101からのリード処理の要求を受け付けると、リード処理用ページリストの作成をページリスト取得部24に指示する。ページリスト取得部24は、この指示に応答して、リード処理用ページリストを作成する。図14、図15を参照して、リード処理用ページリストの作成を説明する。
【０１５７】
(リード処理用ページリストの作成)
図14のステップS311:ページリスト取得部24は、第1のメモリM1〜第4のメモリM4のぞれぞれに確保されたリード用配列R1〜R4の領域に対応する仮想アドレスを物理アドレスに変換する。なお、通常、ユーザスレッド、I/Oスレッドは、仮想メモリのアドレスを指定して、カーネルを介して物理メモリにアクセスしている。そのため、ユーザスレッド、I/Oスレッドは、物理メモリのアドレスについての情報を保持していない。そこで、ユーザスレッド、I/Oスレッドが、物理メモリのアドレスの情報を保持するため、S311の変換処理を行う。
【０１５８】
この変換のため、ページリスト取得部24は、仮想アドレスと物理アドレスとの対応関係を示したページテーブルをカーネル30から取得する。
【０１５９】
ページリスト取得部24は、取得したページテーブルに基づき、第1のメモリM1〜第4のメモリM4のぞれぞれに確保されたリード用配列R1〜R4の仮想アドレスを物理アドレスに変換する。
【０１６０】
(NUMAノードの識別子を特定)
ステップS312:ページリスト取得部24は、図12の対応情報IN2に基づき、変換後の物理アドレスで示されるメモリ領域を含むメモリ（物理メモリ）が属するNUMAノードの識別子を特定する。NUMAノードの識別子は、図3で示したNUMAノードを示す符号"ND1"〜"ND4"に対応する。
【０１６１】
第j（jは1〜4の整数）のメモリMjに確保されたリード用配列Rj(図7参照)の物理アドレスが、図12のアドレスADR(j)〜ADR(j+1)の範囲内の場合を想定する。この場合、ページリスト取得部24は、この物理アドレスで示されるメモリ領域を含むメモリが属するNUMAノードの識別子は、第jのNUMAノードの"NDj"と特定する。
【０１６２】
例えば、第1のメモリM1に確保されたリード用配列R1の物理アドレスが、図12のアドレスADR1〜ADR2の範囲内の場合を想定する。この想定の場合、ページリスト取得部24は、このリード用配列R1の物理アドレスで示されるメモリ領域を含むメモリが属するNUMAノードの識別子は、第1のNUMAノードの"ND1"と特定する。
【０１６３】
(ページリスト作成)
ステップS313: ページリスト取得部24は、リード処理用のページリストを作成する。
【０１６４】
図12、図15を参照して、ページリストの作成について説明する。まず、ページリスト取得部24は、例えば、第1のメモリM1の領域に、ページリスト記憶用の領域を確保する。
【０１６５】
ページリスト取得部24は、図12の対応情報IN2に基づき、第j(jは1〜4の整数)のメモリMjのリード用配列Rjのページ毎のアドレスを格納する第jのNUMAノードNDjのリード処理用ページリストLSTrjを作成する。
【０１６６】
例えば、ページリスト取得部24は、リード処理用ページリストLSTr1〜リード処理用ページリストLSTr4を作成する。
【０１６７】
リード処理用ページリストLSTr1は、第1のNUMAノードND1に属する第1のメモリM1のリード用配列R1の各ページ(PGr1〜PGrp1)のアドレスを格納する。リード処理用ページリストLSTr2は、第2のNUMAノードND2に属する第2のメモリM2のリード用配列R2の各ページ(PGr2〜PGrp2)のアドレスを格納する。
【０１６８】
リード処理用ページリストLSTr3は、第3のNUMAノードND3に属する第3のメモリM3のリード用配列R3の各ページ(PGr3〜PGrp3)のアドレスを格納する。リード処理用ページリストLSTr4は、第4のNUMAノードND4に属する第4のメモリM4のリード用配列R4の各ページ(PGr4〜PGrp4)のアドレスを格納する。ここで、"p1"〜"p4"は、2以上の整数である。
【０１６９】
なお、ページリスト取得部24は、作成したリード処理用ページリストを、確保したページリスト記憶用の領域に記憶する。ページリストの作成が終了すると、図13のS32に移る。
【０１７０】
(ページリストの分割と割り当て)
図13のステップS32:並列I/O処理部22は、リード処理用ページリストLSTr1〜LSTr4を分割(区切るとも呼ぶ)する。そして、並列I/O処理部22は、各I/OスレッドにリードのI/O要求サブセットとして、区切ったリード処理用ページリストを割り当てる。なお、ページリスト取得部24が、S32の処理を実行してもよい。
【０１７１】
まず、この区切りについて図15を参照して説明する。ここで、第j(jは1〜4の整数)のNUMAノードNDjは、2つのユーザスレッドを実行している。例えば、第1のNUMAノードND1は、第1のユーザスレッド101、第2のユーザスレッド102を実行している。そこで、並列I/O処理部22は、1つのリード処理用ページリストを2つに区切る。
【０１７２】
例えば、並列I/O処理部22は、第1のNUMAノードND1のリード処理用ページリストLSTr1を、第1のユーザスレッド101用のページリストと、第2のユーザスレッド102用のページリストとに区切る。この区切りを図15の一点鎖線で示す。なお、並列I/O処理部22は、この区切りにおいて、分割されたページリストにおける複数のページで示される総メモリ容量が、ユーザスレッド用の演算用データの容量以上になるようにする。
【０１７３】
第1のユーザスレッド101のリード処理用ページリストは、リード用配列R1の第1の対応領域RS1(図7参照)のページのアドレスを格納する。そして、第2のユーザスレッド102のリード処理用ページリストは、リード用配列R1の第2の対応領域RS2(図7参照)のページのアドレスを格納する。
【０１７４】
また、並列I/O処理部22は、第2のNUMAノードND2のリード処理用ページリストLSTr2を、第3のユーザスレッド103のリード処理用ページリストと、第4のユーザスレッド104のリード処理用ページリストとに区切る。
【０１７５】
第3のユーザスレッド103のリード処理用ページリストは、リード用配列R2の第3の対応領域RS3(図7参照)のページのアドレスを格納する。そして、第4のユーザスレッド104のリード処理用ページリストは、リード用配列R2の第4の対応領域RS4(図7参照)のページのアドレスを格納する。
【０１７６】
また、並列I/O処理部22は、第3のNUMAノードND3のリード処理用ページリストLSTr3を、第5のユーザスレッド105のリード処理用ページリストと、第6のユーザスレッド106のリード処理用ページリストとに区切る。
【０１７７】
第5のユーザスレッド105のリード処理用ページリストは、リード用配列R3の第5の対応領域RS5(図7参照)のページのアドレスを格納する。そして、第6のユーザスレッド106のリード処理用ページリストは、リード用配列R3の第6の対応領域RS6(図7参照)のページのアドレスを格納する。
【０１７８】
また、並列I/O処理部22は、第4のNUMAノードND4のリード処理用ページリストLSTr4を、第7のユーザスレッド107のリード処理用ページリストと、第8のユーザスレッド108のリード処理用ページリストとに区切る。
【０１７９】
第7のユーザスレッド107のリード処理用ページリストは、リード用配列R4の第7の対応領域RS7(図7参照)のページのアドレスを格納する。そして、第8のユーザスレッド108のリード処理用ページリストは、リード用配列R4の第8の対応領域RS8(図7参照)のページのアドレスを格納する。
【０１８０】
次いで、並列I/O処理部22は、第kのユーザスレッド10kのリード処理用ページリストを、第kのユーザスレッド10kとペアの第kのI/Oスレッド23kに割り当てる。
【０１８１】
第kのI/Oスレッド23kに割り当てられたページリストには、第kのI/Oスレッド23kがアクセスする物理メモリの領域(ページ)のアドレスが格納されている。従って、この割り当てにより、第kのI/Oスレッド23kは、アクセスするローカルメモリのページを特定できる。
【０１８２】
図13のS31、S32の処理により、ページリスト取得部24は、対応情報INに基づき、第kのI/Oスレッド23kを実行する第kのコアCkが属するノードのメモリにおいて演算用データを書き込む位置(リード用配列の位置)を特定する。そして、ページリスト取得部24は、演算用データを書き込む位置における複数のページのアドレスを格納したリード処理用ページリストを作成する。
【０１８３】
そして、図16で説明するように、複数のノードの各々に属する第kのコアCkの第kのI/Oスレッド23kは、特定されたアドレスに基づき、ストレージシステムSTRから読み出した演算用データを第kのコアCkが属するノードのメモリに書き込む。この演算用データは、演算処理が実行される対象データの一例である。
【０１８４】
ステップS33: 並列I/O処理部22は、各I/Oスレッドに、リードのI/O要求サブセットの実行指示を行う。具体的には、並列I/O処理部22は、第1のI/Oスレッド231〜第8のI/Oスレッド238に、リードのI/O要求サブセットの実行指示を行う。なお、実行指示を受け付けたI/Oスレッドが実行する処理については、図16で説明する。
【０１８５】
ステップS34: 並列I/O処理部22は、実行指示を行った各I/Oスレッドからの完了通知を待ち受ける。
【０１８６】
図16を参照して、リードのI/O要求サブセットの実行指示を受け付けたI/Oスレッドが実行するリード処理を説明する。
【０１８７】
リードのI/O要求サブセットの実行指示(図13のS33)を受け付けた第k(kは1〜8の整数)のI/Oスレッド23kは、S201〜S206の処理を実行する。
【０１８８】
(I/O要求サブセットの受信)
ステップS201:第kのI/Oスレッド23kは、リードまたはライトのI/O要求サブセットの実行指示の受信待ち状態にある。
【０１８９】
ステップS202:第kのI/Oスレッド23kは、I/O要求サブセットを受信し、受信したI/O要求サブセットが、リードのI/O要求サブセットか判定する。リードのI/O要求サブセットではない場合(S202/NO)、S207に移る。リードのI/O要求サブセットの場合(S202/YES)、S203に移る。
【０１９０】
(テンポラリバッファの領域確保)
ステップS203:第kのI/Oスレッド23kは、自スレッドの物理メモリにテンポラリバッファの領域を確保する。
【０１９１】
例えば、第1のI/Oスレッド231は、自スレッドの物理メモリである第1のメモリM1にテンポラリバッファTB1(図6参照)を確保する。
【０１９２】
なお、テンポラリバッファの領域が既に確保されている場合は、第kのI/Oスレッド23kは、S203の処理は実行しない。
【０１９３】
ここで、各I/Oスレッドは、オンデマンド以外にも様々な方法によりテンポラリバッファの領域を確保できる。例えば、各I/Oスレッドは、自身の使用するキャッシュページを一部プールして、この一部プールしたキャッシュページの領域をテンポラリバッファの領域として確保してもよい。かかる確保により、領域確保の応答性を高めることができる。なお、キャッシュページのプールとしては、I/Oスレッド初期化の段階で特定のキャッシュページを確保しておき、不要になったキャッシュを戻すことで補填できる。
【０１９４】
(演算用データの書き込み)
ステップS204: 第k(kは1〜8の整数)のI/Oスレッド23kは、ストレージシステムSTRの演算用ファイルFAから、ペアの第kのユーザスレッド10kの演算用データを読み出す。そして、第kのI/Oスレッド23kは、自スレッドのテンポラリバッファに読み出した演算用データを書き込む。ここで自スレッドのテンポラリバッファとは、自スレッドを実行しているコアが属するノード内のメモリに確保されたテンポラリバッファである。
【０１９５】
図6、図8を参照し、S204の処理を説明する。第1のI/Oスレッド231は、演算用ファイルFAのファイルポインタ情報INに基づき、図8の演算用ファイルFAから、ファイルポインタPTR1a〜PTR2aで示す範囲の演算用データを読み出す。そして、第1のI/Oスレッド231は、読み出した演算用データを、第1のメモリM1のテンポラリバッファTB1に書き込む(図6の"リード処理"参照)。第2のI/Oスレッド232〜第8のI/Oスレッド238も、第1のI/Oスレッド231と同様に、演算用ファイルFAから、ペアのユーザスレッドの演算用データを読み出し、自スレッドのテンポラリバッファに読み出した演算用データを書き込む。
【０１９６】
以上説明したように、第kのI/Oスレッド23kは、演算用ファイルFAのファイルポインタ情報INにより、第kのユーザスレッド10kが実行する演算処理の対象となる演算用データを図8の演算用ファイルFAから読み出すことができる。
【０１９７】
(コピー処理)
ステップS205:第kのI/Oスレッド23kは、自スレッドのテンポラリバッファに書き込んだ演算用データを自スレッドのリード用配列にコピーする。図6〜図8、図15を参照し、S205を説明する。
【０１９８】
第kのI/Oスレッド23kは、第kのI/Oスレッド23kとペアの第kのユーザスレッド10kのリード処理用ページリストに格納されたアドレスで示される領域に、自スレッドのテンポラリバッファの演算用データをコピーする。
【０１９９】
例えば、第1のI/Oスレッド231は、リード用配列R1の第1の対応領域RS1(図7参照)にテンポラリバッファTB1に書き込んだ第1のユーザスレッド101用の演算用データをコピー(図6の"コピー"参照)する。ここで、リード用配列R1の第1の対応領域RS1は、図15のリード処理用ページリストLSTr1における第1のユーザスレッド101用の複数のページのアドレスで示される領域である。また、テンポラリバッファTB1に書き込んだ第1のユーザスレッド101用の演算用データは、図8で示した、演算用ファイルFAにおけるファイルポインタPTR1a〜PTR2aで示される領域に格納された演算用データである。
【０２００】
また、第2のI/Oスレッド232は、リード用配列R1の第2の対応領域RS2(図7参照)にテンポラリバッファTB1に書き込んだ第2のユーザスレッド102用の演算用データをコピーする。ここで、リード用配列R1の第2の対応領域RS2は、図15のリード処理用ページリストLSTr1における第2のユーザスレッド102用の複数のページのアドレスで示される領域である。また、テンポラリバッファTB1に書き込んだ第2のユーザスレッド102用の演算用データは、図8で示した、演算用ファイルFAにおけるファイルポインタPTR2a〜PTR3aで示される領域に格納された演算用データである。
【０２０１】
また、第3のI/Oスレッド233は、リード用配列R2の第3の対応領域RS3(図7参照)にテンポラリバッファTB2に書き込んだ第3のユーザスレッド103用の演算用データをコピーする。ここで、リード用配列R2の第3の対応領域RS3は、図15のリード処理用ページリストLSTr2における第3のユーザスレッド103用の複数のページのアドレスで示される領域である。また、テンポラリバッファTB2に書き込んだ第3のユーザスレッド103用の演算用データは、図8で示した、演算用ファイルFAにおけるファイルポインタPTR3a〜PTR4aで示される領域に格納された演算用データである。
【０２０２】
また、第4のI/Oスレッド234は、リード用配列R2の第4の対応領域RS4(図7参照)にテンポラリバッファTB2に書き込んだ第4のユーザスレッド104用の演算用データをコピーする。ここで、リード用配列R2の第4の対応領域RS4は、図15のリード処理用ページリストLSTr2における第4のユーザスレッド104用の複数のページのアドレスで示される領域である。また、テンポラリバッファTB2に書き込んだ第4のユーザスレッド104用の演算用データは、図8で示した、演算用ファイルFAにおけるファイルポインタPTR4a〜PTR5aで示される領域に格納された演算用データである。
【０２０３】
また、第5のI/Oスレッド235は、リード用配列R3の第5の対応領域RS5(図7参照)にテンポラリバッファTB3に書き込んだ第5のユーザスレッド105用の演算用データをコピーする。ここで、リード用配列R3の第5の対応領域RS5は、図15のリード処理用ページリストLSTr3における第5のユーザスレッド105用の複数のページのアドレスで示される領域である。また、テンポラリバッファTB3に書き込んだ第5のユーザスレッド105用の演算用データは、図8で示した、演算用ファイルFAにおけるファイルポインタPTR5a〜PTR6aで示される領域に格納された演算用データである。
【０２０４】
また、第6のI/Oスレッド236は、リード用配列R3の第6の対応領域RS6(図7参照)にテンポラリバッファTB3に書き込んだ第6のユーザスレッド106用の演算用データをコピーする。ここで、リード用配列R3の第6の対応領域RS6は、図15のリード処理用ページリストLSTr3における第6のユーザスレッド106用の複数のページのアドレスで示される領域である。また、テンポラリバッファTB3に書き込んだ第6のユーザスレッド106用の演算用データは、図8で示した、演算用ファイルFAにおけるファイルポインタPTR6a〜PTR7aで示される領域に格納された演算用データである。
【０２０５】
また、第7のI/Oスレッド237は、リード用配列R4の第7の対応領域RS7(図7参照)にテンポラリバッファTB4に書き込んだ第7のユーザスレッド107用の演算用データをコピーする。ここで、リード用配列R4の第7の対応領域RS7は、図15のリード処理用ページリストLSTr4における第7のユーザスレッド107用の複数のページのアドレスで示される領域である。また、テンポラリバッファTB4に書き込んだ第7のユーザスレッド107用の演算用データは、図8で示した、演算用ファイルFAにおけるファイルポインタPTR7a〜PTR8aで示される領域に格納された演算用データである。
【０２０６】
また、第8のI/Oスレッド238は、リード用配列R4の第8の対応領域RS8(図7参照)にテンポラリバッファTB4に書き込んだ第8のユーザスレッド108用の演算用データをコピーする。ここで、リード用配列R4の第8の対応領域RS8は、図15のリード処理用ページリストLSTr4における第8のユーザスレッド108用の複数のページのアドレスで示される領域である。また、テンポラリバッファTB4に書き込んだ第8のユーザスレッド108用の演算用データは、図8で示した、演算用ファイルFAにおけるファイルポインタPTR8a〜PTR9aで示される領域に格納された演算用データである。
【０２０７】
リード処理用ページリストにより、第kのコアCkの第kのI/Oスレッド23kは、ペアの第kのユーザスレッド10kが実行する演算処理の対象となるデータを、第kのコアCkが属するノードのメモリに書き込むことができる。
【０２０８】
(完了通知)
ステップS206:第kのI/Oスレッド23kは、S205のコピー、または、後記するS209の登録が終了すると、I/O完了通知を読み出し元のユーザスレッドに通知する。通知後、第kのI/Oスレッド23kは、実行指示待ち状態(S201)に移る。なお、S207〜S209については、図18の後で説明する。
【０２０９】
並列I/O処理部22は、リードのI/O要求サブセットの実行指示(図13のS33)をした全てのI/OスレッドからのI/O完了通知を待ち受ける(図13のS34)。並列I/O処理部22は、全てのI/OスレッドからのI/O完了通知を受信すると、図10のS4に戻る。S4に戻ると、S4〜S12が順次実行され、並列I/O処理部22は、ライト処理の要求に応答して、第1のI/Oスレッド231〜第8のI/Oスレッド238にライト処理の実行を指示する(S13)。
【０２１０】
[ライト処理]
図17、図18は、図10のステップS13におけるライト要求処理を説明するフロー図である。図17は、図10のステップS13におけるライト要求処理の概略を説明するフロー図である。図18は、図17のライト処理用ページリストの作成を説明するフロー図である。図19は、ライト処理用ページリストを説明する図である。
【０２１１】
(ページリストの取得)
ステップS131: 並列I/O処理部22は、第1のユーザスレッド101からのライト処理の要求を受け付けると、ライト処理用ページリストの作成をページリスト取得部24に指示する。ページリスト取得部24は、この指示に応答して、ライト処理用ページリストを作成する。図18、図19を参照して、ライト処理用ページリストの作成を説明する。
【０２１２】
(ライト処理用ページリストの作成)
図18のステップS1311:ページリスト取得部24は、第1のメモリM1〜第4のメモリM4のぞれぞれに確保されたライト用配列W1〜W4の領域に対応する仮想アドレスを物理アドレスに変換する。この変換を行う理由は、図14のS311で説明した理由と同じである。
【０２１３】
この変換のため、ページリスト取得部24は、仮想アドレスと物理アドレスとの対応関係を示したページテーブルをカーネル30から取得する。
【０２１４】
ページリスト取得部24は、取得したページテーブルに基づき、第1のメモリM1〜第4のメモリM4のぞれぞれに確保されたライト用配列W1〜W4の仮想アドレスを物理アドレスに変換する。
【０２１５】
(NUMAノードの識別子を特定)
ステップS1312:ページリスト取得部24は、図12の対応情報IN2に基づき、変換後の物理アドレスで示されるメモリ領域を含むメモリ（物理メモリ）が属するNUMAノードの識別子を特定する。NUMAノードの識別子は、図3で示したNUMAノードを示す符号"ND1"〜"ND4"に対応する。
【０２１６】
第j（jは1〜4の整数）のメモリMjに確保されたライト用配列Wj(図7参照)の物理アドレスが、図12のアドレスADR(j)〜ADR(j+1)の範囲内の場合を想定する。この場合、ページリスト取得部24は、この物理アドレスで示されるメモリ領域を含むメモリが属するNUMAノードの識別子は、第jのNUMAノードの"NDj"と特定する。
【０２１７】
例えば、第1のメモリM1に確保されたライト用配列W1の物理アドレスが、図12のアドレスADR1〜ADR2の範囲内の場合を想定する。この想定の場合、ページリスト取得部24は、このライト用配列W1の物理アドレスで示されるメモリ領域を含むメモリが属するNUMAノードの識別子は、第1のNUMAノードの"ND1"と特定する。
【０２１８】
(ページリスト作成)
ステップS1313: ページリスト取得部24は、ライト処理用のページリストを作成する。
【０２１９】
図12、図19を参照して、ページリストの作成について説明する。まず、ページリスト取得部24は、例えば、第1のメモリM1の領域に、ページリスト記憶用の領域を確保する。
【０２２０】
ページリスト取得部24は、図12の対応情報IN2に基づき、第j(jは1〜4の整数)のNUMAノードNDjのライト処理用ページリストLSTwjを作成する。第jのNUMAノードNDjのライト処理用ページリストLSTwjは、第jのNUMAノードNDjに属する第jのメモリMjのライト用配列Wjのページ毎のアドレスを格納するリストである。
【０２２１】
ページリスト取得部24は、ライト処理用ページリストLSTw1〜ライト処理用ページリストLSTw4を作成する。
【０２２２】
ライト処理用ページリストLSTw1は、第1のNUMAノードND1に属する第1のメモリM1のライト用配列W1の各ページ(PGw1〜PGwp1)のアドレスを格納する。ライト処理用ページリストLSTw2は、第2のNUMAノードND2に属する第2のメモリM2のライト用配列W2の各ページ(PGw2〜PGwp2)のアドレスを格納する。
【０２２３】
ライト処理用ページリストLSTw3は、第3のNUMAノードND3に属する第3のメモリM3のライト用配列W3の各ページ(PGw3〜PGwp3)のアドレスを格納する。ライト処理用ページリストLSTw4は、第4のNUMAノードND4に属する第4のメモリM4のライト用配列W4の各ページ(PGw4〜PGwp4)のアドレスを格納する。ここで、"p1"〜"p4"は、2以上の整数である。
【０２２４】
なお、ページリスト取得部24は、作成したライト処理用ページリストを、確保したページリスト記憶用の領域に記憶する。ページリストの作成が終了すると、図17のS132に移る。
【０２２５】
(ページリストの分割と割り当て)
図17のステップS132:並列I/O処理部22は、ライト処理用ページリストLSTw1〜LSTw4を分割(区切るとも呼ぶ)する。そして、並列I/O処理部22は、各I/OスレッドにライトのI/O要求サブセットとして、区切ったライト処理用ページリストを割り当てる。なお、ページリスト取得部24が、S132の処理を実行してもよい。
【０２２６】
まず、この区切りについて図19を参照して説明する。ここで、第j(jは1〜4の整数)のNUMAノードNDjは、2つのユーザスレッドを実行している。例えば、第1のNUMAノードND1は、第1のユーザスレッド101、第2のユーザスレッド102を実行している。そこで、並列I/O処理部22は、1つのライト処理用ページリストを2つに区切る。
【０２２７】
例えば、並列I/O処理部22は、第1のNUMAノードND1のライト処理用ページリストLSTw1を、第1のユーザスレッド101のライト処理用ページリストと、第2のユーザスレッド102のライト処理用ページリストとに区切る。この区切りを図19の一点鎖線で示す。なお、並列I/O処理部22は、この区切りにおいて、分割されたページリストにおける複数のページで示される総メモリ容量が、ユーザスレッドの演算結果データの容量以上になるようにする。
【０２２８】
第1のユーザスレッド101のライト処理用ページリストは、ライト用配列W1の第1の対応領域WS1(図7参照)のページのアドレスを格納する。そして、第2のユーザスレッド102のライト処理用ページリストは、ライト用配列W1の第2の対応領域WS2(図7参照)のページのアドレスを格納する。
【０２２９】
また、並列I/O処理部22は、第2のNUMAノードND2のライト処理用ページリストLSTw2を、第3のユーザスレッド103のライト処理用ページリストと、第4のユーザスレッド104のライト処理用ページリストとに区切る。
【０２３０】
第3のユーザスレッド103のライト処理用ページリストは、ライト用配列W2の第3の対応領域WS3(図7参照)のページのアドレスを格納する。そして、第4のユーザスレッド104のライト処理用ページリストは、ライト用配列W2の第4の対応領域WS4(図7参照)のページのアドレスを格納する。
【０２３１】
また、並列I/O処理部22は、第3のNUMAノードND3のライト処理用ページリストLSTw3を、第5のユーザスレッド105のライト処理用ページリストと、第6のユーザスレッド106のライト処理用ページリストとに区切る。
【０２３２】
第5のユーザスレッド105のライト処理用ページリストは、ライト用配列W3の第5の対応領域WS5(図7参照)のページのアドレスを格納する。そして、第6のユーザスレッド106のライト処理用ページリストは、ライト用配列W3の第6の対応領域WS6(図7参照)のページのアドレスを格納する。
【０２３３】
また、並列I/O処理部22は、第4のNUMAノードND4のライト処理用ページリストLSTw4を、第7のユーザスレッド107のライト処理用ページリストと、第8のユーザスレッド108のライト処理用ページリストとに区切る。
【０２３４】
第7のユーザスレッド107のライト処理用ページリストは、ライト用配列W4の第7の対応領域WS7(図7参照)のページのアドレスを格納する。そして、第8のユーザスレッド108のライト処理用ページリストは、ライト用配列W4の第8の対応領域WS8(図7参照)のページのアドレスを格納する。
【０２３５】
次いで、並列I/O処理部22は、第kのユーザスレッド10kのライト処理用ページリストを、第kのユーザスレッド10kとペアの第kのI/Oスレッド23kに割り当てる。第kのI/Oスレッド23kに割り当てられたページリストには、第kのI/Oスレッド23kがアクセスする物理メモリの領域(ページ)のアドレスが格納されている。従って、この割り当てにより、第kのI/Oスレッド23kは、アクセスするローカルメモリのページを特定できる。
【０２３６】
図17のS131、S132の処理により、ページリスト取得部24は、対応情報INに基づき、第kのI/Oスレッド23kを実行する第kのコアCkが属するノードのメモリにおいて演算結果データを書き込む領域(ライト用配列の領域)を特定する。そして、ページリスト取得部24は、演算結果データを書き込む領域における複数のページのアドレスを格納したライト処理用ページリストを作成する。
【０２３７】
そして、図16で説明するように、複数のノードの各々に属する第kのコアCkの第kのI/Oスレッド23kは、特定されたアドレスに基づき、演算結果データを読み出す。
【０２３８】
ステップS133: 並列I/O処理部22は、各I/Oスレッドに、ライトのI/O要求サブセットの実行指示を行う。具体的には、並列I/O処理部22は、第1のI/Oスレッド231〜第8のI/Oスレッド238に、ライトのI/O要求サブセットの実行指示を行う。なお、実行指示を受け付けたI/Oスレッドが実行する処理については、図16で説明する。
【０２３９】
ステップS134: 並列I/O処理部22は、実行指示を行った各I/Oスレッドからの完了通知を待ち受ける。
【０２４０】
図16を参照して、ライトのI/O要求サブセットの実行指示を受け付けたI/Oスレッドが実行するライト処理を説明する。
【０２４１】
ライトのI/O要求サブセットの実行指示(図17のS133)を受け付けた第k(kは1〜8の整数)のI/Oスレッド23kは、S201、S202、S207〜S209、S206の処理を実行する。なお、S201、S202については、既に説明したので、その説明を省略する。
【０２４２】
(I/O要求サブセットの受信)
第kのI/Oスレッド23kは、I/O要求サブセットを受信し、受信したI/O要求サブセットが、リードのI/O要求サブセットであるかを判定する(S202)。リードのI/O要求サブセットではない場合、すなわちライトのI/O要求サブセットの場合(S202/NO)、S207に移る。
【０２４３】
(テンポラリバッファの領域確保)
ステップS207:第kのI/Oスレッド23kは、自スレッドの物理メモリにテンポラリバッファの領域を確保する。
【０２４４】
例えば、第1のI/Oスレッド231は、自スレッドの物理メモリである第1のメモリM1にテンポラリバッファTB1(図6参照)を確保する。
【０２４５】
なお、テンポラリバッファの領域が既に確保されている場合は、第kのI/Oスレッド23kは、S203の処理は実行しない。
【０２４６】
(コピー)
ステップS208:第k(kは1〜8の整数)のI/Oスレッド23kは、割り当てられたライト処理用ページリストに基づき、自スレッドのライト用配列の第kの対応領域WSkに書き込まれた演算結果データを自スレッドのテンポラリバッファにコピーする。
【０２４７】
例えば、第1のI/Oスレッド231は、自スレッドのライト用配列W1の第1の対応領域WS1（図7参照）に書き込まれた演算結果データを自スレッドのテンポラリバッファTB1にコピーする。なお、ライト用配列W1の第1の対応領域WS1は、図19のライト処理用ページリストLSTw1における第1のユーザスレッド101用の複数のページのアドレスで示される領域である。
【０２４８】
また、第2のI/Oスレッド232は、自スレッドのライト用配列W1の第2の対応領域WS2（図7参照）に書き込まれた演算結果データを自スレッドのテンポラリバッファTB1にコピーする。
【０２４９】
第3のI/Oスレッド233〜第8のI/Oスレッド238も、第1のI/Oスレッド231、第2のI/Oスレッド232と同様なコピーを行う。
【０２５０】
(登録)
ステップS209:第kのI/Oスレッド23kは、自スレッドのテンポラリバッファにコピーされた演算結果データをストレージシステムSTRに書き込む処理を、例えばキューに登録する。バッファに記憶されたデータをI/Oスレッドによりファイルに書き込む処理は、非同期に実行されるので、S209の処理を実行する。なお、S209の実行後、第kのI/Oスレッド23kは、I/O完了通知を読み出し元のユーザスレッドに通知する(S206)。
【０２５１】
第kのI/Oスレッド23kは、演算結果データの書き込みタイミングに至ると、以下の書き込み処理を実行する。
【０２５２】
第kのI/Oスレッド23kは、自スレッドのテンポラリバッファにコピーされた、第kのI/Oスレッド23kとペアの第kのユーザスレッド10kの演算結果データを読み出す。そして、第kのI/Oスレッド23kは、読み出した演算結果データを、図9で示した、演算結果ファイルFBにおけるファイルポインタPTR(k)b〜PTR(k+1)bで示されるストレージシステムSTRの領域に書き込む。図6、図19を参照し、この書き込みを説明する。
【０２５３】
第1のI/Oスレッド231は、テンポラリバッファTB1に記憶した、第1のユーザスレッド101の演算結果データを図9で示した、演算結果ファイルFBにおけるファイルポインタPTR1b〜PTR2bで示されるストレージシステムSTRの領域に書き込む。この書き込みについては、図6の"ライト処理"参照。
【０２５４】
また、第2のI/Oスレッド232は、テンポラリバッファTB1に記憶した、第2のユーザスレッド102の演算結果データを図9で示した、演算結果ファイルFBにおけるファイルポインタPTR2b〜PTR3bで示されるストレージシステムSTRの領域に書き込む。
【０２５５】
第3のI/Oスレッド233〜第8のI/Oスレッド238も、第1のI/Oスレッド231、第2のI/Oスレッド232と同様な書き込み処理を行う。
【０２５６】
以後、例えば、ログインノード2は、演算結果が格納された演算結果ファイルFBを読み出し、第1の操作用端末31に送信する。第1の操作用端末31は、演算結果ファイルFBの内容を表示装置などに出力する。
【０２５７】
[変形例など]
図10のS1では、ユーザアプリケーション10からの指示を受け付けて、並列I/O処理初期化部21は、第k(kは1〜8の整数)のI/Oスレッド23kを作成し第kのコアCkで実行させた。
【０２５８】
他にも、並列I/O処理初期化部21がメモリに展開されて動作状態に移行したタイミングで、並列I/O処理初期化部21は、第kのI/Oスレッド23kを作成し第kのコアCkで実行させてもよい。
【０２５９】
また、第1のユーザスレッド101が、並列I/O処理部22にリード処理を要求したタイミングで、並列I/O処理初期化部21が第kのI/Oスレッド23kを作成し第kのコアCkで実行させてもよい。
【０２６０】
図10の配列確保(S2)において、第1のユーザスレッド101は、例えば、カーネル30が提供する専用のNUMA操作用のライブラリ機能を利用して、前記した配列の確保を実行してもよい。この確保においては、第1のユーザスレッド101は、NUMA最適化を考慮し、各スレッドによりアクセスされるデータが、各スレッドの動作するコアから近いメモリに配置されるように、リード用配列、ライト用配列毎にメモリの配置を細かく設定する。
【０２６１】
第1のユーザスレッド101は、この設定において、カーネル30が提供するメモリ配置指定関数を利用する。
【０２６２】
第1のユーザスレッド101は、この設定において、明に物理メモリの割り当てを指定し、仮想メモリ(仮想領域)の割り当てのみならず物理メモリをも割り当てるものとする。この割り当ての理由は、以下の通りである。すなわち、並列情報処理プログラムでは各スレッドでの処理のばらつき（ブレとも呼ぶ）が全体同期の遅延に繋がってしまうため、演算中のメモリアクセス時に物理メモリを割り当てるような動作（デマンドページングと呼ぶ）を避けるためである。
【０２６３】
また、カーネルは、一般に提供されている各種カーネルを利用することができる。
【０２６４】
以上の実施の形態をまとめると、次の付記のとおりである。
【０２６５】
（付記１）
演算処理を実行する演算処理装置とデータを記憶する主記憶装置とをそれぞれ備える複数のノードを有する情報処理装置において、
前記複数のノードの各々に属する演算処理装置は、
演算処理を実行する演算処理部と、
前記演算処理部が演算処理を実行する対象データを、前記主記憶装置以外の主記憶装置における記憶位置を示す第1のアドレス情報に基づいて前記主記憶装置以外の主記憶装置から読み出し、読み出した前記対象データを、前記演算処理装置が属するノードの主記憶装置に書き込む転送部とを有することを特徴とする情報処理装置。
【０２６６】
（付記２）
付記1において、
前記演算処理装置の転送部は、前記複数のノードの各々に属する主記憶装置の領域を示す第2のアドレス情報に基づき、前記主記憶装置以外の主記憶装置から読み出した前記対象データを前記主記憶装置に書き込む
ことを特徴とする情報処理装置。
【０２６７】
（付記３）
付記2において、
何れかの前記演算処理装置は、さらに、特定部を実行し、
前記特定部は、前記第2のアドレス情報に基づき、前記主記憶装置において前記対象データを書き込む位置を特定し、
前記転送部は、前記主記憶装置以外の主記憶装置から読み出した前記対象データを、特定された前記位置に書き込む
ことを特徴とする情報処理装置。
【０２６８】
（付記４）
付記1において、
前記演算処理装置の演算処理部は、演算結果を示す結果データを、当該演算処理装置が属するノードの主記憶装置に書き込み、
前記演算処理装置の転送部は、当該演算処理装置が属するノードの主記憶装置に書き込まれた前記結果データを前記主記憶装置以外の主記憶装置に書き込む
ことを特徴とする情報処理装置。
【０２６９】
（付記５）
付記4において、
前記演算処理装置の転送部は、当該演算処理装置が属するノードの主記憶装置に書き込まれた前記結果データを読み出し、前記主記憶装置以外の主記憶装置における当該結果データの記憶位置を示す第3のアドレス情報に基づき、読み出した前記結果データを前記主記憶装置以外の主記憶装置に書き込む
ことを特徴とする情報処理装置。
【０２７０】
（付記６）
付記5において、
何れかの前記演算処理装置は、さらに、特定部を実行し、
前記特定部は、前記複数のノードの各々に属する主記憶装置の領域を示す第2のアドレス情報に基づき、前記主記憶装置において前記結果データが書き込まれる領域を特定し、
前記転送部は、特定された前記領域から前記結果データを読み出す
ことを特徴とする情報処理装置。
【０２７１】
（付記７）
付記1において、
前記演算処理部は、前記演算処理として並列演算処理を実行する
ことを特徴とする情報処理装置。
【０２７２】
（付記８）
演算処理を実行する演算処理装置とデータを記憶する主記憶装置とをそれぞれ備える複数のノードを有する情報処理装置の制御方法において、
前記複数のノードの各々に属する演算処理装置が有する演算処理部が演算処理を実行する対象データを、前記演算処理装置が有する転送部が、前記主記憶装置以外の主記憶装置における記憶位置を示すアドレス情報に基づいて前記主記憶装置以外の主記憶装置から読み出し、
前記転送部が、読み出された前記対象データを、前記演算処理装置が属するノードの主記憶装置に書き込み、
前記演算処理部が、前記主記憶装置に書き込まれた対象データを用いて演算処理を実行することを特徴とする情報処理装置の制御方法。
【０２７３】
（付記９）
演算処理を実行する演算処理装置とデータを記憶する主記憶装置とをそれぞれ備える複数のノードを有する情報処理装置の制御プログラムにおいて、
前記複数のノードの各々に属する演算処理装置が有する演算処理部が演算処理を実行する対象データを、前記演算処理装置が有する転送部に、前記主記憶装置以外の主記憶装置における記憶位置を示すアドレス情報に基づいて前記主記憶装置から読み出させ、
前記転送部に、読み出された前記対象データを、前記演算処理装置が属するノードの主記憶装置に書き込ませ、
前記演算処理部に、前記主記憶装置に書き込まれた対象データを用いて演算処理を実行させることを特徴とする情報処理装置の制御プログラム。
【０２７４】
（付記１０）
演算処理を実行する演算処理装置とデータを記憶する主記憶装置とをそれぞれ備える複数のノードを有するコンピュータで実行され、前記コンピュータによって読み取り可能であり、前記コンピュータにデジタル信号処理を実行させるプログラムを記録した記録媒体であって、
前記デジタル信号処理は、
前記複数のノードの各々に属する演算処理装置が有する演算処理部が演算処理を実行する対象データを、前記演算処理装置が有する転送部に、前記主記憶装置以外の主記憶装置における記憶位置を示すアドレス情報に基づいて前記主記憶装置から読み出させ、
前記転送部に、読み出された前記対象データを、前記演算処理装置が属するノードの主記憶装置に書き込ませ、
前記演算処理部に、前記主記憶装置に書き込まれた対象データを用いて演算処理を実行させる
ことを特徴とする記録媒体。
【符号の説明】
【０２７５】
1…並列情報処理システム(並列情報処理装置)、2…ログインノード、31〜3i…第1の操作用端末〜第iの操作用端末、ND1〜ND4…第1のNUMAノード〜第4のNUMAノード、C1〜C8…第1のコア〜第8のコア、TH1〜TH8…第1のスレッド群〜第8のスレッド群、M1〜M4…第1のメモリ〜第4のメモリ、STR…ストレージシステム、CSC…接続装置、NT1、NT2…ネットワーク、10…ユーザアプリケーション、20…I/Oサブシステム、21…I/O初期化処理部、22…並列I/O処理部、23…I/Oスレッド、30…カーネル、101〜108…第1のユーザスレッド(演算処理部)〜第8のユーザスレッド(演算処理部)、231〜238…第1のI/Oスレッド(転送部)〜第8のI/Oスレッド(転送部)、24…ページリスト取得部(特定部)、301〜308…第1のカーネル〜第8のカーネル、1000…並列情報処理システム、1100、1200…第1、第2のNUMAノード、1110、1120、1210、1220…第1〜第4のコア、UTH1〜UTH4…ユーザスレッド、1130、1230…第1、第2のメモリ、1300…ストレージシステム。
【図１】
0006582367.tif 000002
【図２】
0006582367.tif 000003
【図３】
0006582367.tif 000004
【図４】
0006582367.tif 000005
【図５】
0006582367.tif 000006
【図６】
0006582367.tif 000007
【図７】
0006582367.tif 000008
【図８】
0006582367.tif 000009
【図９】
0006582367.tif 000010
【図１０】
0006582367.tif 000011
【図１１】
0006582367.tif 000012
【図１２】
0006582367.tif 000013
【図１３】
0006582367.tif 000014
【図１４】
0006582367.tif 000015
【図１５】
0006582367.tif 000016
【図１６】
0006582367.tif 000017
【図１７】
0006582367.tif 000018
【図１８】
0006582367.tif 000019
【図１９】
0006582367.tif 000020