(57)【要約】【課題】処理速度を向上させる情報処理システム、演算処理装置及び情報処理システムの制御方法を提供する。【解決手段】スレッド生成部２０２は、保持する複数のデータブロックを、自装置が搭載されたシステムボードに含まれる演算ユニット２０の数と等しい数のグループに分割する。対象データ決定部２０５は、各グループに含まれる複数のデータブロックから第１データブロックをそれぞれ選択する。宛先決定部２０６は、選択された第１データブロック毎に、各演算ユニット２０に割り当てられた識別番号情報と各グループに割り当てられた巡回番号情報との排他的論理和演算により得られる宛先番号情報に基づいて、システムボードに含まれる複数の演算ユニット２０から互いに異なる演算ユニット２０を送信先としてそれぞれ選択する。データ送信部２０７は、選択された各第１データブロックを、選択された演算ユニット２０に対して送信する。【選択図】図４
2019086976.tif 000002
【特許請求の範囲】
【請求項１】
複数の演算処理装置をそれぞれ搭載する複数の情報処理装置を有する情報処理システムであって、
前記演算処理装置は、
保持する複数のデータブロックを、自装置が搭載された前記情報処理装置に含まれる前記演算処理装置の数と等しい数のグループに分割する分割部と、
各グループに含まれる複数のデータブロックから第１データブロックをそれぞれ選択するデータ選択部と、
前記データ選択部が選択した第１データブロック毎に、各演算処理装置に割り当てられた識別番号情報と各グループに割り当てられた巡回番号情報との排他的論理和演算により得られる宛先番号情報に基づいて、前記情報処理装置に含まれる複数の演算処理装置から互いに異なる演算処理装置を送信先としてそれぞれ選択する送信先選択部と、
前記データ選択部が選択した各第１データブロックを、前記送信先選択部が選択した各演算処理装置に対してそれぞれ送信する送信部と
を備えたことを特徴とする情報処理システム。
【請求項２】
前記送信先選択部は、前記情報処理装置に含まれる複数の演算処理装置のうち自装置に隣接する前記演算処理装置の中から互いに異なる前記演算処理装置を送信先として選択することを特徴とする請求項１に記載の情報処理システム。
【請求項３】
各前記演算処理装置は、自装置に隣接する前記演算処理装置の数のビット数で表される前記識別番号情報が割り当てられ、
前記送信先選択部は、前記ビット数で表される前記巡回番号情報を各グループに割り当て、自装置に割り当てられた前記識別番号情報と、前記巡回番号情報との排他的論理和演算を行い、排他的論理和演算により得られる前記宛先番号情報と一致する前記識別番号情報が割り当てられた演算処理装置を、排他的論理和演算に用いた巡回番号情報が割り当てられたグループの送信先として選択する
ことを特徴とする請求項１又は２に記載の情報処理システム。
【請求項４】
前記演算処理装置は、他の演算処理装置から送信された第１データブロックを受信し、複数の前記データブロックのうち受信した第１データブロックに対応する所定データブロックと受信した第１データブロックとを用いて演算を行い、演算結果を前記所定データブロックのデータとする受信部をさらに備えることを特徴とする請求項１〜３のいずれか一つに記載の情報処理システム。
【請求項５】
前記送信先選択部は、前記送信部による前記第１データブロックの送信及び前記受信部による前記演算結果の格納の完了後、前記巡回番号情報を１つシフトさせることを特徴とする請求項４に記載の情報処理システム。
【請求項６】
前記データ選択部は、前記送信部による前記第１データブロックの送信及び前記受信部による前記演算結果の格納の完了後、各グループのそれぞれの中から第２データブロックを選択し、
前記送信先選択部は、前記識別番号情報と１つシフトさせた巡回番号情報との排他的論理和演算を行うことで、前記データ選択部が選択した第２データブロック毎に互いに異なり、且つ、各第２データブロックが含まれる前記グループにおける前記第１データブロックの送信先とは異なる前記演算処理装置を、前記情報処理装置に含まれる複数の演算処理装置の中から送信先として選択し、
前記送信部は、前記データ選択部が選択した各第２データブロックを、前記送信先選択部が選択した前記演算処理装置に対して送信する
ことを特徴とする請求項５に記載の情報処理システム。
【請求項７】
前記送信先選択部は、前記第２データブロックの補完相手である第３データブロックを保持する演算処理装置を送信先として選択することを特徴とする請求項６に記載の情報処理システム。
【請求項８】
前記データブロックは、前記演算処理装置が保持するデータを、隣接する前記演算処理装置の数で２をべき乗した数を隣接する演算処理装置の数に乗算した値に分割されたデータ群であることを特徴とする請求項１〜７のいずれか一つに記載の情報処理システム。
【請求項９】
前記演算処理装置は、それぞれに所定ビットで表される前記識別番号情報が割り当てられ、前記識別番号情報における１つのビットの値が異なる演算処理装置同士が接続されることを特徴とする請求項１〜８のいずれか一つに記載の情報処理システム。
【請求項１０】
保持する複数のデータブロックを自装置が搭載された情報処理装置に含まれる演算処理装置の数と等しい数のグループに分割する分割部と、
各グループに含まれる複数のデータブロックから第１データブロックをそれぞれ選択するデータ選択部と、
前記データ選択部が選択した第１データブロック毎に、各演算処理装置に割り当てられた識別番号情報と各グループに割り当てられた巡回番号情報との排他的論理和演算により得られる宛先番号情報に基づいて、前記情報処理装置に含まれる複数の演算処理装置から互いに異なる演算処理装置を送信先としてそれぞれ選択する送信先選択部と、
前記データ選択部が選択した各第１データブロックを、前記送信先選択部が選択した各演算処理装置に対して送信する送信部と
を備えたことを特徴とする演算処理装置。
【請求項１１】
複数の演算処理装置を有する情報処理システムの制御方法であって、
前記演算処理装置が保持する複数のデータブロックを、各演算処理装置が搭載された情報処理装置に含まれる演算処理装置の数と等しい数のグループに分割し、
各グループに含まれる複数のデータブロックから第１データブロックをそれぞれ選択し、
選択された第１データブロック毎に、各演算処理装置に割り当てられた識別番号情報と各グループに割り当てられた巡回番号情報との排他的論理和演算により得られる宛先番号情報に基づいて、前記情報処理装置に含まれる複数の演算処理装置から互いに異なる演算処理装置を送信先として選択し、
選択した各第１データブロックを、選択した演算処理装置に対して送信する
ことを特徴とする情報処理システムの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理システム、演算処理装置及び情報処理システムの制御方法に関する。
【背景技術】
【０００２】
ＨＰＣ（High  Performance  Computing）の分野では、ノードと呼ばれる計算機を多数接続した並列計算システムが用いられることが多い。ノードは、例えば１つのチップセットなどでもよい。近年では、並列計算機システムは、深層学習などにも利用される。
【０００３】
並列計算システムにおけるノードの接続形態には、メッシュ結合やトーラス結合がある。メッシュ結合は、複数の軸方向にメッシュ状にノードを並べ、各軸方向に隣接するノード同士をインターコネクトと呼ばれる高速ネットワークで接続する接続形態である。トーラス結合は、メッシュ結合の接続をした上で、各軸の両端のノード同士を接続する接続形態である。すべての軸がメッシュ結合またはトーラス結合であるネットワークや、一部の軸がメッシュ結合で残りの軸はトーラス結合であるような接続形態も存在する。例えば、並列計算システムには、６次元のトーラス構造となるトポロジを有する装置がある。
【０００４】
さらに、並列計算システムでは、複数のノードを搭載したシステムボードを複数有する構成が採用される場合がある。同じシステムボード上に配置されたノード間は、高速な専用のインターコネクトで接続される。これに対して、異なるシステムボードに配置されたノード間は、ＰＣＩ（Peripheral  Component  Interconnect）やインフィニバンド（登録商標）を用いてネットワークスイッチを介して接続される。ここで、同一システムボード内のノード間の接続を「内側の接続」と言い、異なるシステムボード間のネットワークスイッチを介してのノード間の接続を「外側の接続」と言う。内側の接続は、専用のインターコネクトで接続されるためＰＣＩやインフィニバンドを用いる外側の接続に比べて広い帯域幅を有し高速に通信を行うことができる。
【０００５】
そして、並列計算機システムの各ノードは、複雑な問題を解く場合に用いられるプログラムを高速で処理する。具体的には、並列計算機システムは、プログラムの実行単位であるジョブを複数のプロセスに分割し、分割したプロセスを各ノードに割り当てる。ここで、プロセスとは、各ノードが実際に演算処理を行うプログラムである。各ノードは、プロセスを取得した場合には、取得したプロセスの演算処理を実行する。各ノードは、プロセスの演算処理が完了すると、演算結果を管理サーバへ送信して、演算処理を終了する。また、並列計算機システムは、演算処理が終了したノードに対して新たなプロセスを送信し、演算処理を実行させる。そして、並列計算機システムは、各ノードが実行した演算処理の結果を管理サーバに集約し、ジョブの全体の演算結果を得る。
【０００６】
並列計算システムでは、このような演算処理においてＡｌｌｒｅｄｕｃｅの処理を行う場合がある。Ａｌｌｒｅｄｕｃｅとは、各プロセスが算出した値を集約し、集約した値を用いて演算を行うことで得られる結果を、全てのプロセスにおいて共通化する処理である。この場合、各ノードは集団通信を行う。集団通信を行うことで、各ノードが実行するプロセスは、全てのプロセスが有する値の演算結果を保持することになる。このように、Ａｌｌｒｅｄｕｃｅの処理を行う場合、各ノードは他の全てのノードが有する値を取得する。ただし、Ａｌｌｒｅｄｕｃｅの処理において、例えば、各ノードそれぞれが有する値を他の全てのノードに送信するなどした場合にはネットワーク負荷が高くなってしまう。
【０００７】
そのため、Ａｌｌｒｅｄｕｃｅの処理を行う場合、ノード間における通信データ量を削減することが好ましい。そこで、Ａｌｌｒｅｄｕｃｅにおける通信データ量を削減する技術として、Ｈａｌｖｉｎｇ＋Ｄｏｕｂｌｉｎｇ手法が提案されている。Ｈａｌｖｉｎｇ＋Ｄｏｕｂｌｉｎｇは、Ｒｅｄｕｃｅ＿ｓｃａｔｔｅｒ＋Ａｌｌｇａｔｈｅｒとも呼ばれる場合がある。
【０００８】
Ｈａｌｖｉｎｇ＋Ｄｏｕｂｌｉｎｇ手法におけるＨａｌｖｉｎｇ操作を行った場合、通信ステップ毎に通信データ量が半減する。一方、Ｄｏｕｂｌｉｎｇ操作を行った場合、通信ステップ毎に通信データ量が倍化する。すなわち、Ｈａｌｖｉｎｇ＋Ｄｏｕｂｌｉｎｇ手法では、処理開始後にＨａｌｖｉｎｇを行うことでステップが進むにつれて通信データ量が削減され、その後Ｄｏｕｂｌｉｎｇを行うことでステップが進むにつれて通信データ量が増加する。そのため、Ｈａｌｖｉｎｇ＋Ｄｏｕｂｌｉｎｇ手法では、ステップが小さい間は大きなデータによる相互通信が行われ、ステップの中間で小さいデータにより相互通信が行われ、その後ステップが増えるにつれ大きなデータによる相互通信が行われる。
【０００９】
ここで、上述したように、内側の接続と外側の接続とを有する並列計算システムでは、外側の接続の帯域幅が狭いため、外側の接続で送受信するデータのデータ量は小さいことが好ましい。そこで、内側の接続と外側の接続とを有する並列計算システムにおいて、Ａｌｌｒｅｄｕｃｅの処理を行う場合、内側の接続においてなるべくデータのサイズを小さくした上で外側の接続での通信を行うことが好ましい。例えば、次のような方法でＡｌｌｒｅｄｕｃｅの処理を行うことが考えられる。まず、内側の接続でＨａｌｖｉｎｇを行い送受信するデータ量を小さくした上で、外側の接続でのデータのＡｌｌｒｅｄｕｃｅ処理を行う。その後、内側の接続でＤｏｕｂｌｉｎｇを行い取り扱うデータ量を大きくしてＡｌｌｒｅｄｕｃｅの処理を完了する。
【００１０】
このようなＡｌｌｒｅｄｕｃｅの処理を実行する場合、ノードの接続形態はハイパーキューブとなる結合を有することが好ましい。ｎ次元のハイパーキューブは、以下の特徴を有する。すなわち、ｎ次元のハイパーキューブは２のｎ乗のノードで構成される。そして、各ノードは、ｎ本のリンクを有する。さらに、各ノードに２進数のインデックスを割り当てた場合に、各ノードは、割り当てられたインデックスのビット列が１つ異なるノードと隣接しており、且つ、接続される。すなわち、ノードがハイパーキューブを構成する接続形態を有する場合、データの送信先の特定が容易であり、Ａｌｌｒｅｄｕｃｅの処理を行う場合のデータの送受信が容易となることで処理負荷が低減する。
【００１１】
さらに、並列計算機システムにおける集団通信の技術として、全体処理時間を計算して処理時間が短い方を選択するように全データ通信と部分データ通信とを切り替えて通信を実行する従来技術がある。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開２００１−３２５２３９号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
しかしながら、ハイパーキューブを有するトポロジに単にＨａｌｖｉｎｇ＋Ｄｏｕｂｌｉｎｇを用いた場合、各ステップにおいて通信に使用されていない経路が存在する場合がある。そのため、単にＨａｌｖｉｎｇ＋Ｄｏｕｂｌｉｎｇを用いる方法では、帯域を十分に使い切れず、Ａｌｌｒｅｄｕｃｅの速度を向上させることは困難である。
【００１４】
また、全データ通信と部分データ通信とを切り替えて通信を実行する従来技術を用いても、各ステップにおいて通信に使用されない経路が発生してしまい、Ａｌｌｒｅｄｕｃｅの速度を向上させることは困難である。
【００１５】
開示の技術は、上記に鑑みてなされたものであって、処理速度を向上させた情報処理システム、演算処理装置及び情報処理システムの制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１６】
本願の開示する情報処理システム、演算処理装置及び情報処理システムの制御方法の一つの態様において、情報処理システムは、複数の演算処理装置を有する。前記演算処理装置は、以下の各部を有する。分割部は、保持する複数のデータブロックを、自装置が搭載された前記情報処理装置に含まれる前記演算処理装置の数と等しい数のグループに分割する。データ選択部は、各グループに含まれる複数のデータブロックから第１データブロックをそれぞれ選択する。送信先選択部は、前記データ選択部が選択した第１データブロック毎に、各演算処理装置に割り当てられた識別番号情報と各グループに割り当てられた巡回番号情報との排他的論理和演算により得られる宛先番号情報に基づいて、前記情報処理装置に含まれる複数の演算処理装置から互いに異なる演算処理装置を送信先としてそれぞれ選択する。送信部は、前記データ選択部が選択した各第１データブロックを、前記送信先選択部が選択した各演算処理装置に対してそれぞれ送信する。
【発明の効果】
【００１７】
１つの側面では、本発明は、処理速度を向上させることができる。
【図面の簡単な説明】
【００１８】
【図１】図１は、実施例１に係る情報処理システムのハードウェア構成図である。
【図２】図２は、各種ハイパーキューブを表す図である。
【図３】図３は、演算ユニットのハードウェア構成図である。
【図４】図４は、ネットワーク制御部のブロック図である。
【図５】図５は、Ｈａｌｖｉｎｇにおける処理の流れの概要を表す図である。
【図６】図６は、外部トポロジ間でのＡｌｌｒｅｄｕｃｅｓまでの処理の流れの概要を表す図である。
【図７】図７は、Ｄｏｕｂｌｉｎｇにおける処理の流れの概要を表す図である。
【図８】図８は、スレッドＴｈ１側の送受信するデータブロックの決定方法を説明するための図である。
【図９】図９は、２次元のハイパーキューブに含まれる４つの演算ユニットによるスレッドＴｈ１に関するＨａｌｖｉｎｇ全体を表す図である。
【図１０】図１０は、ＨａｌｖｉｎｇにおけるスレッドＴｈ２側の送受信するデータブロックの決定方法を説明するための図である。
【図１１】図１１は、２次元のハイパーキューブに含まれる４つの演算ユニットによるスレッドＴｈ２に関するＨａｌｖｉｎｇを表す図である。
【図１２】図１２は、実施例１に係る宛先決定の処理を説明するための図である。
【図１３】図１３は、２次元ハイパーキューブにおける宛先の遷移を説明するための図である。
【図１４】図１４は、Ａｌｌｒｅｄｕｃｅの処理の全体のフローチャートである。
【図１５】図１５は、Ｈａｌｖｉｎｇのフローチャートである。
【図１６】図１６は、Ｄｏｕｂｌｉｎｇのフローチャートである。
【図１７】図１７は、Ｈａｌｖｉｎｇ及びＤｏｕｂｌｉｎｇを実行するためのプログラムの疑似コードの一例を示す図である。
【図１８】図１８は、Ｈａｌｖｉｎｇを実現するプログラムで行われる処理のフローチャートである。
【図１９】図１９は、Ｄｏｕｂｌｉｎｇを実現するプログラムで行われる処理のフローチャートである。
【図２０】図２０は、実施例１に係るＡｌｌｒｅｄｕｃｅの処理の効果を説明するための図である。
【図２１】図２１は、実施例２に係る情報処理システムのハードウェア構成図である。
【図２２】図２２は、実施例２に係る宛先決定の処理を説明するための図である。
【図２３】図２３は、３次元ハイパーキューブにおける宛先の遷移を説明するための図である。
【図２４】図２４は、実施例２に係る情報処理システムにおける通信毎の通信を行う演算ユニットを表す図である。
【図２５】図２５は、実施例３に係る情報処理システムのハードウェア構成図である。
【図２６】図２６は、実施例３に係る情報処理システムにおける通信毎の通信を行う演算ユニットを表す図である。
【発明を実施するための形態】
【００１９】
以下に、本願の開示する情報処理システム、演算処理装置及び情報処理システムの制御方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理システム、演算処理装置及び情報処理システムの制御方法が限定されるものではない。
【実施例１】
【００２０】
図１は、実施例１に係る情報処理システムのハードウェア構成図である。本実施例に係る情報処理システムは、２つのシステムボード１を有する。各システムボード１は、ＣＰＵ（Central  Processing  Unit）２、２つのＰＣＩスイッチ３、及び、４つのＨＣＡ（Host  Channel  Adaptor）４を有する。
【００２１】
各システムボード１上のＣＰＵ２は、相互に直接接続される。また、システムボード１上において、ＣＰＵ２は、２つのＰＣＩスイッチ３に接続される。ＣＰＵ２は、操作者から入力されたジョブの命令を受けて、ジョブを後述する各演算ユニット２０へ送信する。
【００２２】
各ＰＣＩスイッチ３は、ＣＰＵ２及び２つの演算ユニット２０に接続される。また、各ＰＣＩスイッチ３は、２つのＨＣＡ４に接続される。ＰＣＩスイッチ３は、ＣＰＵ２及び演算ユニット２０によるＰＣＩを用いた通信時の経路選択を行う。
【００２３】
ＨＣＡ４は、ＣＰＵ２及び演算ユニット２０によるインフィニバンドを用いた通信における通信インタフェースである。ＨＣＡ４は、ＰＣＩスイッチ３に接続される。また、ＨＣＡ４は、ネットワークスイッチ５に接続される。
【００２４】
ネットワークスイッチ５は、各システムボード１上のＨＣＡ４が接続される。ネットワークスイッチ５は、ＣＰＵ２及び演算ユニット２０によるインフィニバンドを用いた通信における経路選択を行う。
【００２５】
サブネットマネージャ６は、ネットワークスイッチ５を介して行われる通信の通信経路の管理を行う。例えば、サブネットマネージャ６は、ネットワーク上の１つのサーバ上で動作し、定期的に経路更新を行う。
【００２６】
演算ユニット２０は、並列計算を行うための演算回路を有する。演算ユニット２０は、例えば、ＧＰＵ（Graphic  Processing  Unit）である。演算ユニット２０は、ディープラーニングにおける演算処理などを実行する。以下では、演算ユニット２０を「ノード」と呼ぶ場合がある。この演算ユニット２０が、「演算処理装置」の一例にあたる。
【００２７】
１つのシステムボード１上には４つの演算ユニット２０が配置される。そして、演算ユニット２０は、隣り合う２つの演算ユニット２０とインターコネクトで接続される。図１において太い実線で示した経路がインターコネクトを表す。
【００２８】
隣り合う２つの演算ユニット２０と接続された４つの演算ユニット２０は、２次元のハイパーキューブとなるように接続される。ここで、ハイパーキューブについて説明する。図２は、各種ハイパーキューブを表す図である。構成ＨＱ１は、１次元のハイパーキューブである。構成ＨＱ２は、２次元のハイパーキューブである。構成ＨＱ３は、３次元のハイパーキューブである。構成ＨＱ４は、４次元のハイパーキューブである。
【００２９】
各ノードにｎ個のビットを有する２進数のインデックスを割り当てた場合に、インデックスを表すビット列において１つのビットの値が異なるノード同士を接続することでｎ次元のハイパーキューブとなる。例えば、図２において構成ＨＱ１〜ＨＱ３の各ノードに付加した数字は、ビット列において１のビットの値が異なるノードに接続するように各ノードに割り当てた２進数のインデックスである。すなわち、図２の構成ＨＱ１〜ＨＱ３に例示したように、ｎ次元のハイパーキューブは、割り当てられたインデックスを表すビット列において１つのビットの値が異なるノード間で相互通信が行われる。
【００３０】
例えば、本実施例に係る演算ユニット２０は２次元のハイパーキューブとなるように接続される。そこで４つの演算ユニット２０に００、０１、１０及び１１のインデックスを割り当てた場合、以下のような通信を行う。すなわち、００のインデックスを有する演算ユニット２０は、１０及び０１のインデックスを有するノードと通信を行う。また、０１のインデックスを有する演算ユニット２０は、００及び１１のインデックスを有する演算ユニット２０と通信を行う。１０のインデックスを有する演算ユニット２０は、００及び１１のインデックスを有するノードと通信を行う。また、１１のインデックスを有する演算ユニット２０は、１０及び０１のインデックスを有する演算ユニット２０と通信を行う。
【００３１】
また、本実施例では、演算ユニット２０が２次元のハイパーキューブとなるように接続された場合で説明するが、３次元以上のハイパーキューブであっても以下に説明する機能と同様の機能を有することができる。そして、ハイパーキューブとなるように接続された演算ユニット２０のうち特定の演算ユニット２０と他の演算ユニット２０を介さずに直接接続された演算ユニット２０が、特定の演算ユニット２０に「隣接する」演算ユニット２０の一例にあたる。そして、特定の演算ユニット２０と他の演算ユニット２０を介さずに直接接続された演算ユニット２０の数が、ハイパーキューブの次元にあたる。
【００３２】
図３は、演算ユニットのハードウェア構成図である。演算ユニット２０は、並列演算装置２１、演算制御部２２、メモリ制御部２３及びメモリ２４を有する。さらに、演算ユニット２０は、ＤＭＡ（Direct  Memory  Access）エンジン部２５、ＰＣＩ制御部２６、ジョブ管理部２７、ネットワーク構成管理部２８、ネットワーク制御部２９、通信用バッファ３０及びインターコネクト装置３１を有する。ここで、図３では、並列演算装置２１、演算制御部２２、メモリ制御部２３及びメモリ２４を４つずつ記載したが、これらの数に特に制限は無い。
【００３３】
ＰＣＩ制御部２６は、ＤＭＡエンジン部２５、ジョブ管理部２７及びネットワーク構成管理部２８とＰＣＩスイッチ３との間のＰＣＩを用いた通信の制御を行う。
【００３４】
ジョブ管理部２７は、ＰＣＩスイッチ３及びＰＣＩ制御部２６を介してＣＰＵ２から送信されたジョブを実行するための演算命令の入力を受ける。ジョブ管理部２７は、取得した演算命令をキューとして取り扱う。ジョブ管理部２７は、演算命令を演算制御部２２へ出力する。その後、ジョブ管理部２７は、演算結果の入力を演算制御部２２から受ける。そして、ジョブ管理部２７は、各演算制御部２２から取得した演算結果をまとめてジョブの結果を取得する。その後、ジョブ管理部２７は、ジョブの結果をＰＣＩ制御部２６及びＰＣＩスイッチ３などを介してＣＰＵ２へ出力する。
【００３５】
演算制御部２２は、演算命令にしたがい、メモリ制御部２３を介してメモリ２４からデータを取得する。そして、演算制御部２２は、取得したデータ及び演算命令を並列演算装置２１へ出力する。その後、演算制御部２２は、演算結果を並列演算装置２１から取得する。次に、演算制御部２２は、演算結果をジョブ管理部２７へ出力する。
【００３６】
並列演算装置２１は、データ及び演算命令の入力を演算制御部２２から受ける。そして、並列演算装置２１は、取得したデータを用いて指定された演算を実行する。その後、並列演算装置２１は、演算結果を演算制御部２２へ出力する。
【００３７】
ネットワーク構成管理部２８は、ＣＰＵ２が実行するデバイスドライバよりシステムボード１内の結線表を取得する。結線表は、演算ユニット２０間のインターコネクトの接続状態を含む。ネットワーク構成管理部２８は、取得した結線表をネットワーク制御部２９へ出力する。
【００３８】
ネットワーク制御部２９は、通信用バッファ３０及びインターコネクト装置３１と接続される。ネットワーク制御部２９は、通信用バッファ３０及びインターコネクト装置３１を用いてインターコネクトを介した他の演算ユニット２０との間の通信を制御する。具体的には、ネットワーク制御部２９は、送信するデータを通信用バッファ３０に書き込む。そして、ネットワーク制御部２９は、インターコネクト装置３１に対して通信用バッファ３０に格納されたデータの送信を指示することで他の演算ユニット２０へデータを送信する。
【００３９】
ネットワーク制御部２９は、システムボード１の結線表をネットワーク構成管理部２８から取得する。さらに、ネットワーク制御部２９は、実行されるジョブで行う演算ユニット２０間の通信の情報をジョブ管理部２７から取得する。そして、ネットワーク制御部２９は、取得した通信の情報にしたがい結線表を用いて通信相手及び送信するデータを決定する。次に、ネットワーク制御部２９は、送信を決定したデータの取得要求をメモリ制御部２３へ出力する。その後、ネットワーク制御部２９は、取得要求に応じたデータの入力をメモリ制御部２３から受ける。そして、ネットワーク制御部２９は、取得したデータを決定した通信相手に送信する。
【００４０】
また、ネットワーク制御部２９は、データの受信の通知をインターコネクト装置３１から受ける。そして、ネットワーク制御部２９は、通信用バッファ３０に格納された他の演算ユニット２０から受信したデータを取得する。そして、ネットワーク制御部２９は、取得したデータとともに書き込みの指示をメモリ制御部２３へ出力する。
【００４１】
ネットワーク制御部２９が行う演算ユニット２０間の通信には、Ａｌｌｒｅｄｕｃｅの処理も含まれる。ネットワーク制御部２９によるインターコネクトを介したＡｌｌｒｅｄｕｃｅの処理については後で詳細に説明する。
【００４２】
通信用バッファ３０は、演算ユニット２０間のインターコネクトを介した通信における一時格納領域である。通信用バッファ３０には、他の演算ユニット２０へ送信されるデータが格納される。また、通信用バッファ３０には、他の演算ユニット２０から受信したデータが格納される。
【００４３】
インターコネクト装置３１は、インターコネクトにより他の演算ユニット２０のインターコネクト装置３１と接続する。インターコネクト装置３１は、他の演算ユニット２０との間のインターコネクトを介した通信を行う。インターコネクト装置３１は、ネットワーク制御部２９からのデータの送信指示を受けて、通信用バッファ３０からデータを読み出す。そして、インターコネクト装置３１は、読み出したデータをネットワーク制御部２９から指定された通信相手の演算ユニット２０へ送信する。また、インターコネクト装置３１は、他の演算ユニット２０からデータを受信すると、受信したデータを通信用バッファ３０に格納する。さらに、インターコネクト装置３１は、データの受信をネットワーク制御部２９に通知する。
【００４４】
ＤＭＡエンジン部２５は、ＣＰＵ２などを介すことなく、ＰＣＩのバスで接続された他の演算ユニット２０が有するメモリ２４へのアクセス制御を行う。ＤＭＡエンジン部２５は、ジョブにおけるＰＣＩを用いた通信の情報の入力をジョブ管理部２７から受ける。そして、ＤＭＡエンジン部２５は、ジョブにおけるＰＣＩを用いた通信の情報にしたがい、メモリ制御部２３へデータの読み出しの指示を行う。その後、ＤＭＡエンジン部２５は、メモリ２４から読み出されたデータの入力をメモリ制御部２３から受ける。そして、ＤＭＡエンジン部２５は、取得したデータを送信先の演算ユニット２０のメモリ２４へＰＣＩ制御部２６及びＰＣＩスイッチ３を介して送信する。
【００４５】
また、ＤＭＡエンジン部２５は、ＤＭＡにより他の演算ユニット２０のＤＭＡエンジン部２５から送信されたデータをＰＣＩ制御部２６から受信する。そして、ＤＭＡエンジン部２５は、受信したデータの書き込みをメモリ制御部２３へ指示する。
【００４６】
メモリ制御部２３は、接続されたメモリ２４に対するデータの読み出し及び書き込みを制御する。メモリ制御部２３は、ＤＭＡエンジン部２５からの読み出しの指示にしたがいメモリ２４からデータを読み出し、読み出したデータをＤＭＡエンジン部２５へ出力する。また、メモリ制御部２３は、ＤＭＡエンジン部２５からの書込みの指示にしたがいメモリ２４へデータを書き込む。
【００４７】
また、メモリ制御部２３は、ネットワーク制御部２９からの読み出しの指示にしたがいメモリ２４からデータを読み出し、読み出したデータをＤＭＡエンジン部２５へ出力する。また、メモリ制御部２３は、ネットワーク制御部２９からの書込みの指示にしたがいメモリ２４へデータを書き込む。
【００４８】
次に、ネットワーク制御部２９によるＡｌｌｒｅｄｕｃｅの処理の詳細について説明する。本実施例に係る演算処理システムは、Ｈａｌｖｉｎｇ操作及びＤｏｕｂｌｉｎｇ操作を行うことでＡｌｌｒｅｄｕｃｅの処理を実行する。以下では、Ｈａｌｖｉｎｇ操作を単に「Ｈａｌｖｉｎｇ」といい、Ｄｏｕｂｌｉｎｇ操作を単に「Ｄｏｕｂｌｉｎｇ」という。さらに、Ａｌｌｒｅｄｕｃｅの処理のことを単に「Ａｌｌｒｅｄｕｃｅ」という。
【００４９】
図４は、ネットワーク制御部のブロック図である。ネットワーク制御部２９は、図４に示すように、プロセスＩＤ割当部２０１、スレッド生成部２０２、統括制御部２０３、送受信データサイズ算出部２０４、対象データ決定部２０５、宛先決定部２０６及びデータ送信部２０７を有する。さらに、ネットワーク制御部２９は、データ受信部２０８及び同期処理部２１０を有する。
【００５０】
ここで、ネットワーク制御部２９が有する演算回路により、図４に例示した、プロセスＩＤ割当部２０１、スレッド生成部２０２、統括制御部２０３、送受信データサイズ算出部２０４及び対象データ決定部２０５の機能が実現される。また、その演算回路により、宛先決定部２０６、データ送信部２０７、データ受信部２０８及び同期処理部２１０の機能が実現される。
【００５１】
また、ネットワーク制御部２９は、図３に示すように実際には通信用バッファ３０及びインターコネクト装置３１を介して他の演算ユニット２０と通信を行うが、説明の都合上、通信用バッファ３０及びインターコネクト装置３１を省略して説明する。以下の説明では、説明対象とする演算ユニット２０を、他の演算ユニット２０と区別するため、自演算ユニットという。
【００５２】
プロセスＩＤ割当部２０１は、ネットワーク構成管理部２８から結線表を取得する。そして、プロセスＩＤ割当部２０１は、結線表を用いて自演算ユニット及び自演算ユニットとともにハイパーキューブとなるように接続された他の演算ユニット２０に０から数えて２ｎ−１までの個数のプロセスＩＤを割り当てる。この場合ｎは、ハイパーキューブの次元である。このプロセスＩＤが、演算処理装置の「識別番号情報」の一例にあたる。
【００５３】
ここで、プロセスＩＤ割当部２０１は、図２で示した各ノードに割り当てられたインデックスと同様の規則によりプロセスＩＤの割り当てを行う。すなわち、本実施例に係る演算ユニット２０は、２次元のハイパーキューブとなるように接続されており、プロセスＩＤ割当部２０１は、各演算ユニット２０にプロセスＩＤとして００、０１、１０及び１１を割り当てる。この場合、プロセスＩＤ割当部２０１は、１つのビットの値が異なるプロセスＩＤをインターコネクトで接続された隣り合う演算ユニット２０に対して割り当てる。図５は、Ｈａｌｖｉｎｇにおける処理の流れの概要を表す図である。プロセスＩＤ割当部２０１は、図５に示すプロセスＩＤを各演算ユニット２０に割り当てる。ここで、図５における紙面にむかって縦方向に並んだ８つのボックスがブロックを表し、８つのブロックの組が１つのプロセスが有するデータ列にあたる。そして、図５における各ブロック内の番号は、各プロセスで算出されたデータ列を表す。ここで、図５では、１つのプロセスに含まれる各ブロックに対応するデータ列を同じ数字で表したが、これは演算を行ったプロセスが同じことを表す。実際には、各ブロックに対応するデータ列は、それぞれ異なる値を有することが一般的である。
【００５４】
その後、プロセスＩＤ割当部２０１は、各演算ユニット２０に割り当てたプロセスＩＤの情報を統括制御部２０３へ出力する。また、プロセスＩＤ割当部２０１は、各演算ユニット２０に割り当てたプロセスＩＤの情報をプロセスＩＤの割当対象である演算ユニット２０に通知する。ここで、他の演算ユニット２０からプロセスＩＤの通知を受ける演算ユニット２０の場合、プロセスＩＤ割当部２０１は、他の演算ユニット２０から各演算ユニット２０に割り当てられたプロセスＩＤの通知を受ける。そして、プロセスＩＤ割当部２０１は、取得した各演算ユニット２０に割り当てられたプロセスＩＤの情報をスレッド生成部２０２へ出力する。
【００５５】
スレッド生成部２０２は、プロセスＩＤ割当部２０１により各演算ユニット２０に割り当てられたプロセスＩＤを統括制御部２０３から取得する。さらに、スレッド生成部２０２は、自己が搭載された演算ユニット２０で処理するプロセスの入力を統括制御部２０３から受ける。そして、取得したプロセスの中でＡｌｌｒｅｄｕｃｅの処理の実行が指示された場合、スレッド生成部２０２は、以下の処理を実行する。
【００５６】
スレッド生成部２０２は、自演算ユニットを含むハイパーキューブの次元を取得する。本実施例では、スレッド生成部２０２は、自演算ユニットが含まれるハイパーキューブの次元として２を取得する。そして、スレッド生成部２０２は、取得したプロセスが算出したデータ列をｎ×２ｎ個のブロックに分割する。この場合ｎは、ハイパーキューブの次元である。すなわち、本実施例では、スレッド生成部２０２は、図５に示すようにプロセスのデータ列を８個のブロックに分ける。
【００５７】
さらに、スレッド生成部２０２は、ハイパーキューブをｎ次元とすると、生成したブロックを２ｎ個ずつの組に分けてｎ個のスレッドを生成する。すなわち、本実施例では、スレッド生成部２０２は、図５に示すスレッドＴｈ１及びＴｈ２という２個のスレッドを生成する。また、スレッド生成部２０２は、各スレッドにｎビットのサイクリックＩＤを割り当てる。具体的には、スレッド生成部２０２は、ｎビットのうちｓ（１≦ｓ≦ｎ）ビット目の値が１となり、他のビットの値が０であるｎ個のｎビットのサイクリックＩＤを生成し、各スレッドに割り当てる。本実施例では、スレッド生成部２０２は、スレッドＴｈ１にサイクリックＩＤとして「０１」を割り当て、スレッドＴｈ２にサイクリックＩＤとして「１０」を割り当てる。その後、スレッド生成部２０２は、生成したスレッドＴｈ１及びＴｈ２の情報を、それぞれのスレッドＴｈ１及びＴｈ２に割り当てたサイクリックＩＤとともに統括制御部２０３へ出力する。このスレッド生成部２０２が、「分割部」の一例にあたる。そして、スレッドが、「グループ」の一例にあたる。
【００５８】
統括制御部２０３は、自演算ユニットを含む各演算ユニット２０に割り当てられたプロセスＩＤ、及び、各ブロックに含まれるデータ列の入力をスレッド生成部２０２から受ける。そして、統括制御部２０３は、自演算ユニットを含む各演算ユニット２０に割り当てられたプロセスＩＤをスレッド生成部２０２へ出力する。その後、統括制御部２０３は、スレッドＴｈ１及びＴｈ２の情報、スレッドＴｈ１及びＴｈ２に割り当てられたサイクリックＩＤの入力をスレッド生成部２０２から受ける。
【００５９】
そして、統括制御部２０３は、Ａｌｌｒｅｄｕｃｅの処理の開始時であれば、Ｈａｌｖｉｎｇの実行を決定する。そして、統括制御部２０３は、自演算ユニットのプロセスＩＤ、スレッドＴｈ１及びＴｈ２の情報、スレッドＴｈ１及びＴｈ２に割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列を送受信データサイズ算出部２０４へ出力する。統括制御部２０３は、スレッドＴｈ１及びＴｈ２の情報、スレッドＴｈ１及びＴｈ２に割り当てられたサイクリックＩＤ、並びに、自演算ユニットのプロセスＩＤを宛先決定部２０６へ出力する。そして、統括制御部２０３は、Ｈａｌｖｉｎｇの実行を送受信データサイズ算出部２０４及び宛先決定部２０６に指示する。
【００６０】
その後、統括制御部２０３は、通信の完了の通知をメモリ制御部２３から受ける。そして、統括制御部２０３は、前回の通信においてＨａｌｖｉｎｇの実行を指示した場合、演算ユニット２０が含まれるハイパーキューブの次元数の回数、Ｈａｌｖｉｎｇが実行されたか否かを判定する。本実施例では、２次元のハイパーキューブの構成であるので、統括制御部２０３は、Ｈａｌｖｉｎｇが２回実行されたか否かを判定する。
【００６１】
例えば、２次元のハイパーキューブの構成を有する場合、スレッドＴｈ１について１回目の通信では、図５の１回目の通信における実線矢印で示すように、各演算ユニット２０からデータ列が送信される。具体的には、プロセスＩＤが００の演算ユニット２０とプロセスＩＤが０１の演算ユニット２０とがデータを交換し、プロセスＩＤが１０の演算ユニット２０とプロセスＩＤが１１の演算ユニット２０とがデータを交換する。また、スレッドＴｈ２について１回目の通信では、図５の１回目の通信における破線矢印で示すようにデータ列が送信される。すなわち、プロセスＩＤが００の演算ユニット２０とプロセスＩＤが１０の演算ユニット２０とがデータを交換し、プロセスＩＤが０１の演算ユニット２０とプロセスＩＤが１１の演算ユニット２０とがデータを交換する。また、図５における一点鎖線の矢印は、各演算ユニット２０が有するデータ列の変化を表す。このＨａｌｖｉｎｇにおける送信データ及び送信先の決定については後で詳細に説明する。
【００６２】
演算ユニット２０が含まれるハイパーキューブの次元数の回数のＨａｌｖｉｎｇが実行されていない場合、統括制御部２０３は、次のＨａｌｖｉｎｇの実行を送受信データサイズ算出部２０４及び宛先決定部２０６に指示する。
【００６３】
例えば、２次元のハイパーキューブの構成を有する場合、スレッドＴｈ１について２回目の通信では、図５の２回目の通信における実線矢印で示すように、各演算ユニット２０からデータ列が送信される。すなわち、プロセスＩＤが００の演算ユニット２０とプロセスＩＤが１０の演算ユニット２０とがデータを交換し、プロセスＩＤが０１の演算ユニット２０とプロセスＩＤが１１の演算ユニット２０とがデータを交換する。また、スレッドＴｈ２について２回目の通信では、図５の２回目の通信における破線矢印で示すようにデータ列が送信される。すなわち、プロセスＩＤが００の演算ユニット２０とプロセスＩＤが０１の演算ユニット２０とがデータを交換し、プロセスＩＤが１０の演算ユニット２０とプロセスＩＤが１１の演算ユニット２０とがデータを交換する。これにより、各演算ユニット２０は、スレッドＴｈ１における異なるブロックのデータ列をまとめたデータ列を保持する。また、各演算ユニット２０は、スレッドＴｈ２における異なるブロックのデータ列をまとめたデータ列を保持する。
【００６４】
一方、ハイパーキューブの次元数の回数のＨａｌｖｉｎｇが実行された場合、統括制御部２０３は、そのハイパーキューブに含まれない演算ユニット２０との間でのＡｌｌｒｅｄｕｃｅの処理を行うか否かを判定する。本実施例では、図１に示すように、異なるハイパーキューブに含まれる演算ユニット２０との間でもＡｌｌｒｅｄｕｃｅの処理を行う。そこで、統括制御部２０３は、外部トポロジでのＡｌｌｒｅｄｕｃｅの処理の実行を決定する。そして、統括制御部２０３は、外部トポロジでのＡｌｌｒｅｄｕｃｅの処理を外側接続処理実行部２０９に依頼する。その後、統括制御部２０３は、外部トポロジでのＡｌｌｒｅｄｕｃｅの処理の完了通知を外側接続処理実行部２０９から受ける。
【００６５】
図６は、外部トポロジ間でのＡｌｌｒｅｄｕｃｅｓまでの処理の流れの概要を表す図である。例えば、外部トポロジでのＡｌｌｒｅｄｕｃｅの処理は、図６の太線矢印で示される方法で行われる。例えば、各演算ユニット２０は、システムボード１間で同じプロセスＩＤが割り当てられたもの同士が通信を行い、データ列の受け渡しを行う。これにより、各演算ユニット２０は、処理結果２５０で示すように外部トポロジでのＨａｌｖｉｎｇの結果を合わせたデータ列を取得することができる。
【００６６】
外部トポロジでのＡｌｌｒｅｄｕｃｅの処理の完了通知を外側接続処理実行部２０９から受けると、統括制御部２０３は、Ｄｏｕｂｌｉｎｇの実行を送受信データサイズ算出部２０４及び宛先決定部２０６に指示する。その後、通信の完了の通知をメモリ制御部２３から受ける。そして、統括制御部２０３は、前回の通信においてＤｏｕｂｌｉｎｇの実行を指示した場合、演算ユニット２０が含まれるハイパーキューブの次元数の回数、Ｄｏｕｂｌｉｎｇが実行されたか否かを判定する。本実施例では、２次元のハイパーキューブの構成であるので、統括制御部２０３は、Ｄｏｕｂｌｉｎｇが２回実行されたか否かを判定する。
【００６７】
図７は、Ｄｏｕｂｌｉｎｇにおける処理の流れの概要を表す図である。例えば、２次元のハイパーキューブの構成を有する場合、スレッドＴｈ１についてＤｏｕｂｌｉｎｇの１回目の通信では、図７の４回目の通信における実線矢印で示すように、各演算ユニット２０からデータ列が送信される。すなわち、プロセスＩＤが００の演算ユニット２０とプロセスＩＤが１０の演算ユニット２０とがデータを交換し、プロセスＩＤが０１の演算ユニット２０とプロセスＩＤが１１の演算ユニット２０とがデータを交換する。また、スレッドＴｈ２についてＤｏｕｂｌｉｎｇの１回目の通信では、図７の４回目の通信における破線矢印で示すようにデータ列が送信される。すなわち、プロセスＩＤが００の演算ユニット２０とプロセスＩＤが０１の演算ユニット２０とがデータを交換し、プロセスＩＤが１０の演算ユニット２０とプロセスＩＤが１１の演算ユニット２０とがデータを交換する。
【００６８】
さらに、２次元のハイパーキューブの構成を有する場合、スレッドＴｈ１についてＤｏｕｂｌｉｎｇの２回目の通信では、図７の５回目の通信における実線矢印で示すように、各演算ユニット２０からデータ列が送信される。具体的には、プロセスＩＤが００の演算ユニット２０とプロセスＩＤが０１の演算ユニット２０とがデータを交換し、プロセスＩＤが１０の演算ユニット２０とプロセスＩＤが１１の演算ユニット２０とがデータを交換する。また、スレッドＴｈ２についてＤｏｕｂｌｉｎｇの２回目の通信では、図７の５回目の通信における破線矢印で示すようにデータ列が送信される。すなわち、プロセスＩＤが００の演算ユニット２０とプロセスＩＤが１０の演算ユニット２０とがデータを交換し、プロセスＩＤが０１の演算ユニット２０とプロセスＩＤが１１の演算ユニット２０とがデータを交換する。これにより、図７に示すように、５回目の通信の後は、２次元のハイパーキューブに含まれる演算ユニット２０の全てが、各ブロックにおいて同じ値のデータ列を有する。このＤｏｕｂｌｉｎｇにおける送信データ及び送信先の決定については後で詳細に説明する。
【００６９】
ここで、本実施例とは異なり、自演算ユニットが含まれるハイパーキューブに含まれる演算ユニット２０間でＡｌｌｒｅｄｕｃｅの処理が完結する場合もある。その場合、統括制御部２０３は、Ｈａｌｖｉｎｇの完了後、直ぐにＤｏｕｂｌｉｎｇに移る。
【００７０】
演算ユニット２０が含まれるハイパーキューブの次元数の回数のＤｏｕｂｌｉｎｇが実行されていない場合、統括制御部２０３は、次のＤｏｕｂｌｉｎｇの実行を送受信データサイズ算出部２０４及び宛先決定部２０６に指示する。
【００７１】
これに対して、演算ユニット２０が含まれるハイパーキューブの次元数の回数のＤｏｕｂｌｉｎｇが実行された場合、統括制御部２０３は、内側トポロジでの同期処理の実行を同期処理部２１０へ通知する。その後、統括制御部２０３は、内部トポロジでの同期の完了の通知を同期処理部２１０から受けると、外部トポロジでの同期処理の実行を同期処理部２１０へ通知する。その後、統括制御部２０３は、外部トポロジでの同期の完了の通知を同期処理部２１０から受けると、Ａｌｌｒｅｄｕｃｅの処理が完了したと判定する。そして、統括制御部２０３は、ジョブ管理部２７にＡｌｌｒｅｄｕｃｅの処理の完了を通知する。
【００７２】
送受信データサイズ算出部２０４は、スレッドＴｈ１及びＴｈ２の情報、スレッドＴｈ１及びＴｈ２に割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列の入力を統括制御部２０３から受ける。そして、送受信データサイズ算出部２０４は、送受信を行うデータサイズを算出する。
【００７３】
演算ユニット２０がｎ次元のハイパーキューブとなるように接続された場合、Ｈａｌｖｉｎｇの実行を指示されると、送受信データサイズ算出部２０４は、初回の通信では２ｎ−１個のデータ列のブロックを送受信するデータサイズとする。その後、送受信データサイズ算出部２０４は、通信回数が進むにしたがい送受信するブロックを１／２倍したものをデータサイズとする。例えば、２回目の通信では、送受信データサイズ算出部２０４は、（２ｎ−１）×１／２個のブロックを送受信するデータサイズとする。本実施例では、送受信データサイズ算出部２０４は、初回の通信における送受信するデータサイズを２個のブロックとする。さらに、送受信データサイズ算出部２０４は、２回目の通信における送受信するデータサイズを１個のブロックとする。その後、送受信データサイズ算出部２０４は、決定した送受信するデータサイズを対象データ決定部２０５へ出力する。また、送受信データサイズ算出部２０４は、スレッドＴｈ１及びＴｈ２の情報、スレッドＴｈ１及びＴｈ２に割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列を対象データ決定部２０５へ出力する。
【００７４】
一方、Ｄｏｕｂｌｉｎｇの実行を指示された場合、送受信データサイズ算出部２０４は、初回の通信では１個のデータ列のブロックを送受信するデータサイズとする。その後、送受信データサイズ算出部２０４は、通信回数が進むにしたがい送受信するブロックを２倍したものをデータサイズとする。例えば、２回目の通信では、送受信データサイズ算出部２０４は、２個のブロックを送受信するデータサイズとする。本実施例では、送受信データサイズ算出部２０４は、初回の通信における送受信するデータサイズを１個のブロックとする。さらに、送受信データサイズ算出部２０４は、２回目の通信における送受信するデータサイズを２個のブロックとする。その後、送受信データサイズ算出部２０４は、決定した送受信するデータサイズを対象データ決定部２０５へ出力する。また、送受信データサイズ算出部２０４は、スレッドＴｈ１及びＴｈ２の情報、スレッドＴｈ１及びＴｈ２に割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列を対象データ決定部２０５へ出力する。
【００７５】
対象データ決定部２０５は、送受信するデータサイズ、スレッドＴｈ１及びＴｈ２の情報、スレッドＴｈ１及びＴｈ２に割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列の入力を送受信データサイズ算出部２０４から受ける。対象データ決定部２０５は、各ブロックの並び順を固定する。対象データ決定部２０５は、このブロックの並び順をＡｌｌｒｅｄｕｃｅの処理が完了するまで維持する。
【００７６】
図８は、スレッドＴｈ１側の送受信するデータブロックの決定方法を説明するための図である。例えば、対象データ決定部２０５は、図８に示す順序でブロックの並び順を固定する。以下では、図８のように並び順が固定されたブロックの関係について、紙面に向かった場合の上下方向を用いて説明する。対象データ決定部２０５は、各スレッドＴｈ１及びＴｈ２について送受信するデータ列を決定する。以下に、対象データ決定部２０５による送受信するデータの決定方法の詳細について説明する。
【００７７】
Ｈａｌｖｉｎｇの実行を指示された場合、対象データ決定部２０５は、送受信するデータサイズでスレッドＴｈ１及びＴｈ２を分割して対象判定用グループを生成する。対象データ決定部２０５は、１回目の通信ではスレッドＴｈ１及びＴｈ２を２分割し、２回目以降の通信では通信回数が増えるにしたがい前回の通信の２倍の個数でスレッドＴｈ１及びＴｈ２を分割する。例えば、２回目の通信であれば、対象データ決定部２０５は、スレッドＴｈ１及びＴｈ２を４分割する。
【００７８】
本実施例では、対象データ決定部２０５は、演算ユニット２０のプロセスＩＤが００であれば、１回目の通信において、図８における対象判定用グループ３０１及び３０２にスレッドＴｈ１を分ける。また、２回目の通信において、対象データ決定部２０５は、対象判定用グループ３０５及び３０６を含む４つの対象判定用グループにスレッドＴｈ１を分ける。
【００７９】
同様に、演算ユニット２０のプロセスＩＤが０１であれば、対象データ決定部２０５は、１回目の通信において、図８における対象判定用グループ３１１及び３１２にスレッドＴｈ１を分ける。また、２回目の通信において、対象データ決定部２０５は、対象判定用グループ３１５及び３１６を含む４つの対象判定用グループにスレッドＴｈ１を分ける。以下では、対象判定用グループの並びも、ブロックの並びに対応させて紙面に向いて上下方向で説明する。
【００８０】
次に、対象データ決定部２０５は、生成した対象判定用グループに送受信対象インデックスを割り振る。ここで、対象データ決定部２０５は、ｋ回目の送受信対象インデックスとして二進数で表されるｋビット（ｋ桁）の数を順次増加するように上から下に向けて対象判定用グループに割り当てる。対象データ決定部２０５は、１回目の通信であれば１ビットで表される２進数の数を順次増加するように送受信対象インデックスとして対象判定用グループに割り当てる。また、２回目の通信であれば、対象データ決定部２０５は、２ビットで表される２進数の数を順次増加するように送受信対象インデックスとして対象判定用グループに割り当てる。
【００８１】
本実施例では、１回目の通信において、対象データ決定部２０５は、演算ユニット２０のプロセスＩＤが００であれば、図８に示すように、対象判定用グループ３０１に送受信対象インデックスとして「０」を割り当てる。また、対象データ決定部２０５は、対象判定用グループ３０２に送受信対象インデックスとして「１」を割り当てる。
【００８２】
同様に、演算ユニット２０のプロセスＩＤが０１であれば、対象データ決定部２０５は、１回目の通信において、対象判定用グループ３１１に送受信対象インデックスとして「０」を割り当てる。また、対象データ決定部２０５は、対象判定用グループ３１２に送受信対象インデックスとして「１」を割り当てる。
【００８３】
また、２回目の通信において、対象データ決定部２０５は、演算ユニット２０のプロセスＩＤが００であれば、対象判定用グループ３０５に送受信対象インデックスとして「００」を割り当てる。また、対象データ決定部２０５は、対象判定用グループ３０６に送受信対象インデックスとして「０１」を割り当てる。また、対象データ決定部２０５は、下に続く他の２つ対象判定用グループにそれぞれ送受信対象インデックスとして「１０」及び「１１」を割り当てる。
【００８４】
同様に、演算ユニット２０のプロセスＩＤが０１であれば、対象データ決定部２０５は、２回目の通信において、１番上の対象判定用グループに送受信対象インデックスとして「００」を割り当てる。また、対象データ決定部２０５は、その下の対象判定用グループに送受信対象インデックスとして「０１」を割り当てる。さらに、対象データ決定部２０５は、対象判定用グループ３１５に送受信対象インデックスとして「１０」を割り当て、対象判定用グループ３１６に送受信対象インデックスとして「１１」を割り当てる。
【００８５】
次に、対象データ決定部２０５は、送受信対象グループの中から送信対象とする領域及び受信対象とする領域を決定する。ここで、受信対象とする領域とは、受信データを用いた演算対象とするデータの領域である。
【００８６】
具体的には、対象データ決定部２０５は、１回目の通信では、プロセスＩＤの１ビット目と送受信対象インデックスとが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部２０５は、プロセスＩＤの１ビット目を反転した値と送受信対象インデックスが同じ値である対象判定用グループを受信対象の領域とする。
【００８７】
例えば、プロセスＩＤが００であれば１ビット目が「０」であるので、対象データ決定部２０５は、送受信対象インデックスが「０」である対象判定用グループ３０１を受信対象の領域とする。また、対象データ決定部２０５は、送受信対象インデックスが「１」である対象判定用グループ３０２を送信対象の領域とする。また、プロセスＩＤが０１であれば１ビット目が「１」であるので、対象データ決定部２０５は、送受信対象インデックスが「１」である対象判定用グループ３１２を受信対象の領域とする。また、対象データ決定部２０５は、送受信対象インデックスが「０」である対象判定用グループ３１１を送信対象の領域とする。
【００８８】
そして、対象データ決定部２０５は、受信対象の領域とした対象判定用グループに対応するブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、送信対象の領域とした対象判定用グループに対応するブロックのデータ列を送信対象のデータとする。
【００８９】
例えば、プロセスＩＤが００の演算ユニット２０の対象データ決定部２０５は、１回目の通信において、対象判定用グループ３０１に対応する領域３０３に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、対象判定用グループ３０２に対応する領域３０４に含まれるブロックのデータ列を送信対象のデータとする。
【００９０】
また、プロセスＩＤが０１の演算ユニット２０の対象データ決定部２０５は、１回目の通信において、対象判定用グループ３１２に対応する領域３１４に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、対象判定用グループ３１１に対応する領域３１３に含まれるブロックのデータ列を送信対象のデータとする。
【００９１】
次に、２回目の通信では、対象データ決定部２０５は、プロセスＩＤの１ビット目の値と送受信対象インデックスの２ビット目の値とが同じ値である対象判定用グループを送受信対象の対象判定用グループとする。言い換えれば、前回の通信で受信対象の領域に含まれる対象判定用グループが今回の通信における送受信対象の対象判定用グループとなる。さらに、対象データ決定部２０５は、送受信対象の対象判定用グループの中から、プロセスＩＤの２ビット目の値と送受信対象インデックスの１ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部２０５は、プロセスＩＤの２ビット目を反転した値と送受信対象インデックスの１ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。
【００９２】
例えば、プロセスＩＤが００であれば１ビット目が「０」であるので、対象データ決定部２０５は、送受信対象インデックスの２ビット目が「０」である対象判定用グループ３０５及び３０６を送受信対象の対象判定用グループとする。そして、プロセスＩＤが００であれば２ビット目が「０」であるので、対象データ決定部２０５は、送受信対象インデックスの１ビット目が「０」である対象判定用グループ３０５を受信対象の領域とする。また、対象データ決定部２０５は、送受信対象インデックスが「１」である対象判定用グループ３０６を送信対象の領域とする。
【００９３】
また、プロセスＩＤが０１であれば１ビット目が「１」であるので、対象データ決定部２０５は、送受信対象インデックスの２ビット目が「１」である対象判定用グループ３１５及び３１６を送受信対象の対象判定用グループとする。そして、プロセスＩＤが０１であれば２ビット目が「０」であるので、対象データ決定部２０５は、送受信対象インデックスの１ビット目が「０」である対象判定用グループ３１５を受信対象の領域とする。また、対象データ決定部２０５は、送受信対象インデックスが「１」である対象判定用グループ３１６を送信対象の領域とする。
【００９４】
そして、対象データ決定部２０５は、受信対象の領域とした対象判定用グループに対応するブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、送信対象の領域とした対象判定用グループに対応するブロックのデータ列を送信対象のデータとする。
【００９５】
例えば、プロセスＩＤが００の演算ユニット２０の対象データ決定部２０５は、２回目の通信において、対象判定用グループ３０５に対応する領域３０７に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、対象判定用グループ３０６に対応する領域３０８に含まれるブロックのデータ列を送信対象のデータとする。また、プロセスＩＤが０１の演算ユニット２０の対象データ決定部２０５は、２回目の通信において、対象判定用グループ３１５に対応する領域３１７に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、対象判定用グループ３１６に対応する領域３１８に含まれるブロックのデータ列を送信対象のデータとする。
【００９６】
本実施例では、２次元のハイパーキューブの場合であるので、２回目の通信でＨａｌｖｉｎｇが完了する。ただし、３次元以上のハイパーキューブとなるように接続された場合、さらにＨａｌｖｉｎｇの通信が継続する。ｐ回目の通信において、スレッドＴｈ１に関して、対象データ決定部２０５は、以下のように送信対象及び受信対象の領域を決定する。対象データ決定部２０５は、プロセスＩＤの１ビット目からｐ−１ビット目までの値を並び順を逆にした数列と送受信対象インデックスの２ビット目からｐビット目までの値を並べた数列とが一致する対象判定用グループを送受信対象の対象判定用グループとする。そして、対象データ決定部２０５は、送受信対象の対象判定用グループの中から、プロセスＩＤのｐビット目の値と送受信対象インデックスの１ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部２０５は、プロセスＩＤのｐビット目を反転した値と送受信対象インデックスの１ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。
【００９７】
すなわち、プロセスＩＤの１ビット目からｐビット目までの値の並び順を逆にした数列と送受信対象インデックスの１ビット目からｐビット目までの値を並べた数列とが一致する対象判定用グループが、受信対象の領域となる。また、プロセスＩＤの１ビット目からｐビット目までの値の並び順を逆にした数列の最下位ビットを反転させた数列と送受信対象インデックスのｐビット目から１ビット目までの値を並べた数列とが一致する対象判定用グループが、送信対象の領域となる。
【００９８】
図９は、２次元のハイパーキューブに含まれる４つの演算ユニットによるスレッドＴｈ１に関するＨａｌｖｉｎｇ全体を表す図である。図９において、実線で囲われたブロックが受信対象のデータである。また、破線で囲われたブロックが送信対象のデータである。図９の紙面に向かって右側が各演算ユニット２０において送受信が行われるデータにあたるブロックを表し、左側が送信対象及び受信対象の領域を表す。
【００９９】
ハイパーキューブに含まれる各演算ユニット２０の対象データ決定部２０５は、通信毎にスレッドＴｈ１に関する送信対象のデータ及び受信対象のデータを図９に示すように選択する。そして、各演算ユニット２０の対象データ決定部２０５は、スレッドＴｈ１に関して、図９に示す送信対象のデータを送信し、受信データ及び図９に示す受信対象のデータを用いて演算を行うことを繰り返す。
【０１００】
また、スレッドＴｈ２に関して、対象データ決定部２０５は、送受信するデータサイズでスレッドＴｈ２を分割して対象判定用グループを生成する。対象データ決定部２０５は、１回目の通信ではスレッドＴｈ２を２分割し、２回目以降の通信では通信回数が増えるにしたがい前回の通信の２倍の個数でスレッドＴｈ２を分割する。例えば、２回目の通信であれば、対象データ決定部２０５は、スレッドＴｈ２を４分割する。図１０は、ＨａｌｖｉｎｇにおけるスレッドＴｈ２側の送受信するデータブロックの決定方法を説明するための図である。
【０１０１】
例えば、本実施例では、対象データ決定部２０５は、演算ユニット２０のプロセスＩＤが００であれば、１回目の通信において、図１０における対象判定用グループ３３１及び３３２にスレッドＴｈ２を分ける。また、２回目の通信において、対象データ決定部２０５は、対象判定用グループ３３５及び３３６を含む４つの対象判定用グループにスレッドＴｈ２を分ける。同様に、演算ユニット２０のプロセスＩＤが０１であれば、１回目の通信において、対象データ決定部２０５は、図１０における対象判定用グループ３４１及び３４２にスレッドＴｈ２を分ける。また、２回目の通信において、対象データ決定部２０５は、対象判定用グループ３４５及び３４６を含む４つの対象判定用グループにスレッドＴｈ２を分ける。
【０１０２】
次に、対象データ決定部２０５は、スレッドＴｈ１の場合と同様に、生成した対象判定用グループに送受信対象インデックスを割り振る。本実施例では、１回目の通信において、対象データ決定部２０５は、演算ユニット２０のプロセスＩＤが００であれば、図１０に示すように、対象判定用グループ３３１に送受信対象インデックスとして「０」を割り当てる。また、対象データ決定部２０５は、対象判定用グループ３３２に送受信対象インデックスとして「１」を割り当てる。
【０１０３】
同様に、演算ユニット２０のプロセスＩＤが０１であれば、対象データ決定部２０５は、１回目の通信において、対象判定用グループ３４１に送受信対象インデックスとして「０」を割り当て、対象判定用グループ３４２に送受信対象インデックスとして「１」を割り当てる。
【０１０４】
また、２回目の通信において、対象データ決定部２０５は、演算ユニット２０のプロセスＩＤが００であれば、対象判定用グループ３３５に送受信対象インデックスとして「００」を割り当てる。また、対象データ決定部２０５は、対象判定用グループ３３６に送受信対象インデックスとして「０１」を割り当てる。また、対象データ決定部２０５は、下に続く他の２つ対象判定用グループにそれぞれ送受信対象インデックスとして「１０」及び「１１」を割り当てる。
【０１０５】
同様に、演算ユニット２０のプロセスＩＤが０１であれば、対象データ決定部２０５は、２回目の通信において、１番上の対象判定用グループに送受信対象インデックスとして「００」を割り当てる。また、対象データ決定部２０５は、その下の対象判定用グループに送受信対象インデックスとして「０１」を割り当てる。さらに、対象データ決定部２０５は、対象判定用グループ３４５に送受信対象インデックスとして「１０」を割り当て、対象判定用グループ３４６に送受信対象インデックスとして「１１」を割り当てる。
【０１０６】
次に、対象データ決定部２０５は、送受信対象グループの中から送信対象とする領域及び受信対象とする領域を決定する。具体的には、対象データ決定部２０５は、スレッドＴｈ２のサイクリックＩＤにおいて値が１のビットの位置を確認し、値が１のビットの番号を並び替えの基準とする。本実施例では、対象データ決定部２０５は、２ビット目の値が１であることを確認し、２を並び替えの基準とする。
【０１０７】
対象データ決定部２０５は、１回目の通信では、プロセスＩＤの並び替えの基準である２ビット目と送受信対象インデックスとが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部２０５は、プロセスＩＤの２ビット目を反転した値と送受信対象インデックスが同じ値である対象判定用グループを受信対象の領域とする。
【０１０８】
例えば、プロセスＩＤが００であれば２ビット目が「０」であるので、対象データ決定部２０５は、送受信対象インデックスが「０」である対象判定用グループ３３１を受信対象の領域とする。また、対象データ決定部２０５は、送受信対象インデックスが「１」である対象判定用グループ３３２を送信対象の領域とする。また、プロセスＩＤが０１であれば２ビット目が「０」であるので、対象データ決定部２０５は、送受信対象インデックスが「０」である対象判定用グループ３４１を受信対象の領域とする。また、対象データ決定部２０５は、送受信対象インデックスが「１」である対象判定用グループ３４２を送信対象の領域とする。
【０１０９】
そして、対象データ決定部２０５は、受信対象の領域とした対象判定用グループに対応するブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、送信対象の領域とした対象判定用グループに対応するブロックのデータ列を送信対象のデータとする。
【０１１０】
例えば、プロセスＩＤが００の演算ユニット２０の対象データ決定部２０５は、１回目の通信において、対象判定用グループ３３１に対応する領域３３３に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、対象判定用グループ３３２に対応する領域３３４に含まれるブロックのデータ列を送信対象のデータとする。
【０１１１】
また、プロセスＩＤが０１の演算ユニット２０の対象データ決定部２０５は、１回目の通信において、対象判定用グループ３４１に対応する領域３４３に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、対象判定用グループ３４２に対応する領域３４４に含まれるブロックのデータ列を送信対象のデータとする。この１回目の通信において対象データ決定部２０５が送信対象のデータとして決定したブロックに含まれるデータ列が、「第１データブロック」の一例にあたる。
【０１１２】
次に、２回目の通信では、対象データ決定部２０５は、プロセスＩＤの並び替えの基準である２ビット目の値と送受信対象インデックスの２ビット目の値とが同じ値である対象判定用グループを送受信対象の対象判定用グループとする。言い換えれば、前回の通信で受信対象の領域に含まれる対象判定用グループが今回の通信における送受信対象の対象判定用グループとなる。さらに、対象データ決定部２０５は、送受信対象の対象判定用グループの中から、プロセスＩＤの１ビット目の値と送受信対象インデックスの１ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部２０５は、プロセスＩＤの１ビット目を反転した値と送受信対象インデックスの１ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。
【０１１３】
例えば、プロセスＩＤが００であれば２ビット目が「０」であるので、対象データ決定部２０５は、送受信対象インデックスの２ビット目が「０」である対象判定用グループ３３５及び３３６を送受信対象の対象判定用グループとする。そして、プロセスＩＤが００であれば１ビット目が「０」であるので、対象データ決定部２０５は、送受信対象インデックスの１ビット目が「０」である対象判定用グループ３３５を受信対象の領域とする。また、対象データ決定部２０５は、送受信対象インデックスが「１」である対象判定用グループ３３６を送信対象の領域とする。
【０１１４】
また、プロセスＩＤが０１であれば２ビット目が「０」であるので、対象データ決定部２０５は、送受信対象インデックスの２ビット目が「０」である対象判定用グループ３４５及び３４６を送受信対象の対象判定用グループとする。そして、プロセスＩＤが０１であれば１ビット目が「１」であるので、対象データ決定部２０５は、送受信対象インデックスの１ビット目が「１」である対象判定用グループ３４６を受信対象の領域とする。また、対象データ決定部２０５は、送受信対象インデックスが「０」である対象判定用グループ３４５を送信対象の領域とする。
【０１１５】
そして、対象データ決定部２０５は、受信対象の領域とした対象判定用グループに対応するブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、送信対象の領域とした対象判定用グループに対応するブロックのデータ列を送信対象のデータとする。
【０１１６】
例えば、プロセスＩＤが００の演算ユニット２０の対象データ決定部２０５は、２回目の通信において、対象判定用グループ３３５に対応する領域３３７に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、対象判定用グループ３３６に対応する領域３３８に含まれるブロックのデータ列を送信対象のデータとする。また、プロセスＩＤが０１の演算ユニット２０の対象データ決定部２０５は、２回目の通信において、対象判定用グループ３４６に対応する領域３４８に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部２０５は、対象判定用グループ３４５に対応する領域３４７に含まれるブロックのデータ列を送信対象のデータとする。この２回目の通信において、対象データ決定部２０５が送信対象のデータとして決定したブロックに含まれるデータ列が、「第２データブロック」の一例にあたる。
【０１１７】
本実施例では、演算ユニット２０が２次元のハイパーキューブとなるように接続された場合であるので、スレッドＴｈ１の場合と同様に２回目の通信でＨａｌｖｉｎｇが完了する。ただし、３次元以上のハイパーキューブの場合、さらにＨａｌｖｉｎｇの通信が継続する。ｐ回目の通信において、対象データ決定部２０５は、スレッドＴｈ２に関して、プロセスＩＤの並び替えの基準である２ビット目からｐビット目までの値を並び順を逆にした数列を生成する。対象データ決定部２０５は、生成した数列と送受信対象インデックスのｐビット目から２ビット目までの値を並べた数列とが一致する対象判定用グループを送受信対象の対象判定用グループとする。そして、対象データ決定部２０５は、送受信対象の対象判定用グループの中から、プロセスＩＤの１ビット目の値と送受信対象インデックスの１ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部２０５は、プロセスＩＤのｐビット目を反転した値と送受信対象インデックスの１ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。
【０１１８】
このｐ回目の通信における送信対象及び受信対象の領域は、プロセスＩＤの並び替えの基準の１つ下の１ビット目の値をｐビット目の次のビットに移動し、ビットの番号を１〜ｐに振り直した状態のｐビットの並び替え数列を用いて表現可能である。すなわち、この並び替え数列の１ビット目からｐビット目までの値を並び順を逆にした数列と送受信対象インデックスの１ビット目からｐビット目までの値を並べた数列とが一致する対象判定用グループが、受信対象の領域となる。また、この並び替え数列の１ビット目からｐビット目までの値を並び順を逆にした数列の最下位ビットを反転させた数列と送受信対象インデックスの１ビット目からｐビット目までの値を並べた数列とが一致する対象判定用グループが、送信対象の領域となる。
【０１１９】
さらに、ｎ次元のハイパーキューブの構成を有する場合、スレッドの数がｎ個となる。対象データ決定部２０５は、ｎ個のスレッドそれぞれに関して送信対象及び受信対象のデータの決定を行う。そこで、スレッドＴｈｑ（１≦ｑ≦ｎ）の場合について考える。対象データ決定部２０５は、スレッドＴｈｑのサイクリックＩＤにおいて値が１のビットの位置を確認し、値が１のビットの番号を並び替えの基準とする。ここでは、対象データ決定部２０５は、ｑビット目の値が１であることを確認し、ｑを並び替えの基準とする。
【０１２０】
この場合、並び替え数列は、プロセスＩＤの１番目のビットから並び替えの基準の１つ下のｑ−１番目のビットまでの値の数列をｐビット目の隣、すなわちｐ−１ビット目と反対側に移動し、ビットの番号を１〜ｐに振り直した状態のｐビットの数列である。そして、この並び替え数列の１ビット目からｐビット目までの値を並び順を逆にした数列と送受信対象インデックスの１ビット目からｐビット目までの値を並べた数列とが一致する対象判定用グループが、受信対象の領域となる。また、この並び替え数列の１ビット目からｐビット目までの値を並び順を逆にした数列の最下位ビットを反転させた数列と送受信対象インデックスの１ビット目からｐビット目までの値を並べた数列とが一致する対象判定用グループが、送信対象の領域となる。
【０１２１】
図１１は、２次元のハイパーキューブに含まれる４つの演算ユニットによるスレッドＴｈ２に関するＨａｌｖｉｎｇを表す図である。図１１において、実線で囲われたブロックが受信対象のデータである。また、破線で囲われたブロックが送信対象のデータである。図１１の紙面に向かって右側が各演算ユニット２０において送受信が行われるデータにあたるブロックを表し、左側が送信対象及び受信対象の領域を表す。
【０１２２】
各演算ユニット２０の対象データ決定部２０５は、通信毎にスレッドＴｈ２に関する送信対象のデータ及び受信対象のデータを図１１に示すように選択する。そして、各演算ユニット２０の対象データ決定部２０５は、スレッドＴｈ２に関して、図１１に示す送信対象のデータを送信し、受信データ及び図１１に示す受信対象のデータを用いて演算を行うことを繰り返す。
【０１２３】
これに対して、Ｄｏｕｂｌｉｎｇの実行を指示された場合、対象データ決定部２０５は、Ｈａｌｖｉｎｇのときとは逆の手順を辿るように送受信対象のデータを決定する。例えば、対象データ決定部２０５は、以下の方法で送受信対象のデータを決定する。
【０１２４】
送受信するデータサイズでスレッドＴｈ１及びＴｈ２を分割して対象判定用グループを生成する。具体的には、ｎ次元のハイパーキューブの構成を有する場合、対象データ決定部２０５は、Ｄｏｕｂｌｉｎｇにおける１回目の通信ではスレッドを２ｎ分割する。２回目以降の通信では、対象データ決定部２０５は、通信回数が増えるにしたがい前回の通信の１／２倍の個数でスレッドＴｈ１及びＴｈ２を分割する。例えば、２回目の通信であれば、対象データ決定部２０５は、スレッドを２ｎ−１分割する。
【０１２５】
次に、対象データ決定部２０５は、Ｈａｌｖｉｎｇの場合と同様に、生成した対象判定用グループに送受信対象インデックスを割り振る。
【０１２６】
ｎ＋１−ｐ回目の通信において、スレッドＴｈ１に関して、対象データ決定部２０５は、以下のように送信対象及び受信対象の領域を決定する。対象データ決定部２０５は、プロセスＩＤの１ビット目からｐ−１ビット目までの値を並び順を逆にした数列と送受信対象インデックスの２ビット目からｐビット目までの値を並べた数列とが一致する対象判定用グループを送受信対象の対象判定用グループとする。そして、対象データ決定部２０５は、送受信対象の対象判定用グループの中から、プロセスＩＤのｐビット目を反転させた値と送受信対象インデックスの１ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部２０５は、プロセスＩＤのｐビット目の値と送受信対象インデックスの１ビット目の値とが同じ値である対象判定用グループを送信対象の領域とする。
【０１２７】
すなわち、プロセスＩＤの１ビット目からｐビット目までの値の並び順を逆にした数列と送受信対象インデックスの１ビット目からｐビット目までの値を並べた数列とが一致する対象判定用グループが、送信対象の領域となる。また、プロセスＩＤの１ビット目からｐビット目までの値の並び順を逆にした数列の最下位ビットを反転させた数列と送受信対象インデックスのｐビット目から１ビット目までの値を並べた数列とが一致する対象判定用グループが、受信対象の領域となる。
【０１２８】
さらに、ｎ次元のハイパーキューブの構成を有する場合、スレッドの数がｎ個となる。対象データ決定部２０５は、ｎ個のスレッドそれぞれに関して送信対象及び受信対象のデータの決定を行う。そこで、スレッドＴｈｑ（１≦ｑ≦ｎ）の場合のｎ＋１−ｐ回目の通信について考える。対象データ決定部２０５は、スレッドＴｈｑのサイクリックＩＤにおいて値が１のビットの位置を確認し、値が１のビットの番号を並び替えの基準とする。ここでは、対象データ決定部２０５は、ｑビット目の値が１であることを確認し、ｑを並び替えの基準とする。
【０１２９】
この場合、並び替え数列は、プロセスＩＤの１番目のビットから並び替えの基準の１つ下のｑ−１番目のビットまでの値の数列をｐビット目の隣、すなわちｐ−１ビット目と反対側に移動し、ビットの番号を１〜ｐに振り直した状態のｐビットの数列である。そして、この並び替え数列の１ビット目からｐビット目までの値を並び順を逆にした数列と送受信対象インデックスの１ビット目からｐビット目までの値を並べた数列とが一致する対象判定用グループが、受信対象の領域となる。また、この並び替え数列の１ビット目からｐビット目までの値を並び順を逆にした数列の最下位ビットを反転させた数列と送受信対象インデックスの１ビット目からｐビット目までの値を並べた数列とが一致する対象判定用グループが、送信対象の領域となる。
【０１３０】
図４に戻って説明を続ける。対象データ決定部２０５は、スレッドＴｈ１及びＴｈ２における送信対象のデータの情報をデータ送信部２０７へ出力する。また、対象データ決定部２０５は、スレッドＴｈ１及びＴｈ２における受信対象のデータの情報をデータ受信部２０８へ出力する。この対象データ決定部２０５が、「データ選択部」の一例にあたる。
【０１３１】
宛先決定部２０６は、スレッドＴｈ１及びＴｈ２の情報、スレッドＴｈ１及びＴｈ２に割り当てられたサイクリックＩＤ、並びに、自演算ユニットのプロセスＩＤの入力を統括制御部２０３から受ける。そして、宛先決定部２０６は、スレッド毎に以下の処理を実行して送信先の演算ユニット２０を決定する。以下では、各スレッドに対して宛先決定部２０６が行う処理について説明する。図１２は、宛先決定部による宛先決定の処理を説明するための図である。
【０１３２】
Ｈａｌｖｉｎｇの実行を指定された１回目の通信の場合、宛先決定部２０６は、プロセスＩＤとそのスレッドに割り当てられたサイクリックＩＤ（ＣｙｃｌｉｃＩＤ）との排他的論理和を求める。そして、宛先決定部２０６は、求めた排他的論理和を送信先のプロセスＩＤとする演算ユニット２０をそのスレッドにおけるデータの送信先とする。
【０１３３】
例えば、１回目の通信であれば、図１２に示すようにプロセスＩＤが００の場合、宛先決定部２０６は、プロセスＩＤである「００」とスレッドＴｈ１に割り当てられたサイクリックＩＤである「０１」との排他的論理和を求め、値として「０１」を取得する。そして、宛先決定部２０６は、スレッドＴｈ１のデータの送信先をプロセスＩＤが０１である演算ユニット２０に決定する。また、宛先決定部２０６は、プロセスＩＤである「００」とスレッドＴｈ２に割り当てられたサイクリックＩＤである「１０」との排他的論理和を求め、値として「１０」を取得する。そして、宛先決定部２０６は、スレッドＴｈ２のデータの送信先をプロセスＩＤが１０である演算ユニット２０に決定する。
【０１３４】
２回目の通信の場合、宛先決定部２０６は、各スレッドに割り当てられたサイクリックＩＤの１の位置を１つ左にシフトさせる。このサイクリックＩＤの１の位置を１つ左にシフトさせる処理が、「１つシフトさせる」処理の一例にあたる。すなわち、宛先決定部２０６は、各スレッドに割り当てられたサイクリックＩＤの１の位置を１ビット上位へずらす。この時、宛先決定部２０６は、最上位ビットの値が１であるサイクリックＩＤの場合、１ビット目の値を１にする。例えば、宛先決定部２０６は、スレッドＴｈ１のサイクリックＩＤを「０１」から「１０」に変更する。また、宛先決定部２０６は、スレッドＴｈ２のサイクリックＩＤを「１０」から「０１」に変更する。
【０１３５】
次に、宛先決定部２０６は、プロセスＩＤとそのスレッドの変更後のサイクリックＩＤとの排他的論理和を求める。そして、宛先決定部２０６は、求めた排他的論理和を送信先のプロセスＩＤとする演算ユニット２０をそのスレッドにおけるデータの送信先とする。
【０１３６】
例えば、２回目の通信であれば、プロセスＩＤが００の場合、宛先決定部２０６は、プロセスＩＤである「００」とスレッドＴｈ１の変更後のサイクリックＩＤである「１０」との排他的論理和を求め、値として「１０」を取得する。そして、宛先決定部２０６は、スレッドＴｈ１のデータの送信先をプロセスＩＤが１０である演算ユニット２０に決定する。また、宛先決定部２０６は、プロセスＩＤである「００」とスレッドＴｈ２の変更後のサイクリックＩＤである「０１」との排他的論理和を求め、値として「０１」を取得する。そして、宛先決定部２０６は、スレッドＴｈ２のデータの送信先をプロセスＩＤが０１である演算ユニット２０に決定する。
【０１３７】
図１３は、２次元ハイパーキューブにおける宛先の遷移を説明するための図である。図１３の各丸が演算ユニット２０を表し、各丸に付した番号が各演算ユニット２０のプロセスＩＤを表す。１回目の通信では、実線矢印４０１で示すように、プロセスＩＤが００の演算ユニット２０は、プロセスＩＤが０１の演算ユニット２０をスレッドＴｈ１のデータの送信先とする。また、破線矢印４０２で示すように、プロセスＩＤが００の演算ユニット２０は、プロセスＩＤが１０の演算ユニット２０をスレッドＴｈ２のデータの送信先とする。次に、２回目の通信では、実線矢印４０３で示すように、プロセスＩＤが００の演算ユニット２０は、プロセスＩＤが１０の演算ユニット２０をスレッドＴｈ１のデータの送信先とする。また、破線矢印４０４で示すように、プロセスＩＤが００の演算ユニット２０は、プロセスＩＤが０１の演算ユニット２０をスレッドＴｈ２のデータの送信先とする。
【０１３８】
このように、演算ユニット２０は、１回の通信でスレッド毎に異なる演算ユニット２０をデータの送信先とする。これにより、演算ユニット２０は、１回の通信で隣接する全ての演算ユニット２０へデータの送信を行え、使用しない経路の発生を抑制でき、帯域を十分に使うことが可能となる。
【０１３９】
これに対して、Ｄｏｕｂｌｉｎｇの実行を指定された１回目の通信の場合、宛先決定部２０６は、Ｈａｌｖｉｎｇの最後の通信で用いたサイクリックＩＤを取得する。次に、プロセスＩＤとそのスレッドに割り当てられたサイクリックＩＤとの排他的論理和を求める。そして、宛先決定部２０６は、求めた排他的論理和を送信先のプロセスＩＤとする演算ユニット２０をそのスレッドにおけるデータの送信先とする。
【０１４０】
この後、宛先決定部２０６は、前回の通信において各スレッドで用いたサイクリックＩＤの１の位置を１つ右にシフトさせる。すなわち、宛先決定部２０６は、前回の通信において各スレッドで用いたプロセスＩＤの１の位置を１ビット下位へずらす。そして、宛先決定部２０６は、プロセスＩＤとそのスレッドの変更後のサイクリックＩＤとの排他的論理和を求める。そして、宛先決定部２０６は、求めた排他的論理和を送信先のプロセスＩＤとする演算ユニット２０をそのスレッドにおけるデータの送信先とする。
【０１４１】
このサイクリックＩＤが、「巡回番号情報」の一例にあたる。そして、サイクリックＩＤの１の位置を１つ右シフトさせる処理が、「巡回番号情報を１つシフトさせる」処理の一例にあたる。また、宛先決定部２０６による排他的論理和により求められる送信先となるプロセスＩＤが、「各演算処理装置に割り当てられた識別番号情報と各グループに割り当てられた巡回番号情報との排他的論理和演算により得られる宛先番号情報」の一例にあたる。すなわち、宛先決定部２０６は、図１２に示すように、巡回番号情報であるサイクリックＩＤと識別番号情報であるプロセスＩＤとの排他的論理和演算を行い、排他的論理和演算により宛先番号情報であるプロセスＩＤを算出する。そして、宛先決定部２０６は、算出したプロセスＩＤを図１３に示す各通信における送信先の演算ユニット２０のプロセスＩＤとする。
【０１４２】
次に、宛先決定部２０６は、サイクリックＩＤを左にシフトさせてデータの送信先となる演算ユニット２０を選ぶことで、各スレッドが保持するデータと重ならないデータを有する演算ユニット２０をスレッド毎のデータの送信先とすることができる。この各スレッドが保持するデータと重ならないデータを有する演算ユニット２０が、「補完相手の演算処理装置」の一例にあたる。
【０１４３】
さらに、ここで説明した宛先決定部２０による宛先決定の処理が、「識別番号情報と巡回番号情報との排他的論理和演算により得られる宛先番号情報を基に、隣接する演算処理装置の中から異なる演算処理装置を送信先として選択する」処理の一例にあたる。
【０１４４】
図４に戻って説明を続ける。宛先決定部２０６は、スレッドＴｈ１及びＴｈ２のデータの送信先の情報をデータ送信部２０７へ出力する。この宛先決定部２０６が、「送信先選択部」の一例にあたる。
【０１４５】
データ送信部２０７は、スレッドＴｈ１及びＴｈ２における送信対象のデータの情報の入力を対象データ決定部２０５から受ける。また、データ送信部２０７は、スレッドＴｈ１及びＴｈ２のデータの送信先の情報を宛先決定部２０６から受ける。
【０１４６】
データ送信部２０７は、取得したスレッドＴｈ１及びＴｈ２における送信対象のデータの情報で指定されたブロックに格納されたデータ列の取得をメモリ制御部２３に依頼する。その後、データ送信部２０７は、取得したスレッドＴｈ１及びＴｈ２における送信対象のデータの情報で指定されたブロックに格納されたデータ列の入力をメモリ制御部２３から受ける。この取得したデータが、スレッドＴｈ１及びＴｈ２における送信データである。そして、データ送信部２０７は、スレッドＴｈ１における送信データをスレッドＴｈ１のデータの送信先に対して送信する。また、データ送信部２０７は、スレッドＴｈ２における送信データをスレッドＴｈ２のデータの送信先に対して送信する。
【０１４７】
例えば、Ｈａｌｖｉｎｇの実行の際の１回目の通信において、自演算ユニットのプロセスＩＤが００であれば、データ送信部２０７は、図８における領域３０４に含まれるブロックのデータ列をプロセスＩＤが０１の演算ユニット２０へ送信する。また、データ送信部２０７は、図１０における領域３３４に含まれるブロックのデータ列をプロセスＩＤが１０の演算ユニット２０へ送信する。また、２回目の通信において、自演算ユニットのプロセスＩＤが００であれば、データ送信部２０７は、図８における領域３０８に含まれるブロックのデータ列をプロセスＩＤが１０の演算ユニット２０へ送信する。また、データ送信部２０７は、図１０における領域３３８に含まれるブロックのデータ列をプロセスＩＤが０１の演算ユニット２０へ送信する。このデータ送信部２０７が、「送信部」の一例にあたる。
【０１４８】
データ受信部２０８は、受信対象のデータの情報の入力を対象データ決定部２０５から受ける。そして、データ受信部２０８は、他の演算ユニット２０から送信されたデータ列の入力を受ける。ここで、入力された各データ列はブロック毎に並べられており、データ受信部２０８は、各データ列が受信対象のデータのいずれのブロックに対応するかを判断することができる。その後、データ受信部２０８は、取得した各データ列に対応する受信対象データとそれぞれのデータ列との加算をメモリ制御部２３に依頼する。このデータ受信部２０８が、「受信部」の一例にあたる。
【０１４９】
外側接続処理実行部２０９は、外部トポロジでのＡｌｌｒｅｄｕｃｅの処理の依頼を統括制御部２０３から受ける。そして、外側接続処理実行部２０９は、自演算ユニットが含まれるハイパーキューブ以外のハイパーキューブを形作る演算ユニット２０との間でＡｌｌｒｅｄｕｃｅ処理を実行する。この外側トポロジにおけるＡｌｌｒｅｄｕｃｅの処理はその手法に特に制限は無く、外側接続処理実行部２０９は、従来のＡｌｌｒｅｄｕｃｅの処理の手順などを用いて処理を行ってもよい。また、外側接続処理実行部２０９は、外側トポロジにおける接続をサブネットマネージャ６に依頼して外側トポロジにおけるＡｌｌｒｅｄｕｃｅの処理についての経路管理を行ってもよい。そして、外側接続処理実行部２０９は、外側トポロジとのＡｌｌｒｅｄｕｃｅ処理が完了すると、外側トポロジにおけるＡｌｌｒｅｄｕｃｅの処理の完了を統括制御部２０３に通知する。
【０１５０】
同期処理部２１０は、Ｄｏｕｂｌｉｎｇの実行完了後、内側トポロジでの同期処理の実行の通知を統括制御部２０３から受ける。そして、同期処理部２１０は、ハイパーキューブに含まれる各演算ユニット２０の間で同じデータが共有されたか否かを確認する。例えば、同期処理部２１０は、他の演算ユニット２０のメモリ２４に格納されたデータ列を取得する。さらに、同期処理部２１０は、自演算ユニットが有するＡｌｌｒｅｄｕｃｅ処理の演算結果であるデータ列の取得をメモリ制御部２３に依頼して、メモリ制御部２３からデータ列を取得する。そして、同期処理部２１０は、各演算ユニット２０のメモリ２４に格納されたデータ列が同じであるか否かを確認する。同じデータが供給された場合、メモリ制御部２３は、内部トポロジにおける同期完了を統括制御部２０３に通知する。
【０１５１】
その後、同期処理部２１０は、外側トポロジでの同期処理の実行の通知を統括制御部２０３から受ける。同期処理部２１０は、Ａｌｌｒｅｄｕｃｅの処理を行うハイパーキューブに含まれる各演算ユニット２０以外の演算ユニット２０の間で同じデータが共有されたか否かを確認する。例えば、同期処理部２１０は、他のシステムボード１上のＡｌｌｒｅｄｕｃｅの処理の対象とした演算ユニット２０のうちのいずれかのメモリ２４に格納されたデータ列を取得する。そして、同期処理部２１０は、取得したデータ列と自演算ユニットのメモリ２４に格納されたデータ列が同じであるか否かを確認する。同じデータが共有された場合、メモリ制御部２３は、外部トポロジにおける同期完了を統括制御部２０３に通知する。
【０１５２】
メモリ制御部２３は、送信対象のデータとして決定されたデータ列の取得の依頼をデータ送信部２０７から受ける。そして、メモリ制御部２３は、指定されたデータ列をメモリ２４から取得する。その後、メモリ制御部２３は、取得したデータ列をデータ送信部２０７へ出力する。
【０１５３】
また、メモリ制御部２３は、受信データである各データ列の入力をデータ受信部２０８から受ける。また、メモリ制御部２３は、各データ列に対応する受信対象データと各データ列との加算依頼をデータ受信部２０８から受信する。そして、メモリ制御部２３は、各データ列に対応する受信対象データをメモリ２４から取得する。そして、メモリ制御部２３は、取得した受信対象データと受信データであるデータ列を並列演算装置２１へ出力し、加算を依頼する。その後、メモリ制御部２３は、受信データである各データ列と対応する受信対象データとの加算結果を並列演算装置２１から取得する。そして、メモリ制御部２３は、加算結果をそれぞれの受信対象データが格納されていたブロックに格納されるようにメモリ２４に記憶させる。そして、メモリ制御部２３は、１回の通信において取得したデータの演算が終了し演算結果をメモリ２４への格納が完了すると統括制御部２０３に通信の完了を通知する。
【０１５４】
さらに、メモリ制御部２３は、自演算ユニットが有するＡｌｌｒｅｄｕｃｅ処理の演算結果であるデータ列の取得の依頼を同期処理部２１０から受ける。そして、メモリ制御部２３は、Ｄｏｕｂｌｉｎｇ処理が完了したデータ列をメモリ２４から取得する。そして、メモリ制御部２３は、取得したデータ列を同期処理部２１０へ出力する。
【０１５５】
次に、図１４を参照して、Ａｌｌｒｅｄｕｃｅの処理の全体的な流れについて説明する。図１４は、Ａｌｌｒｅｄｕｃｅの処理の全体のフローチャートである。ここでは、演算ユニット２０がｎ次元のハイパーキューブに含まれる場合で説明する。
【０１５６】
プロセスＩＤ割当部２０１は、結線表をネットワーク構成管理部２８から取得する。そして、プロセスＩＤ割当部２０１は、演算ユニット２０が含まれるハイパーキューブの情報を結線表から取得する（ステップＳ１）。
【０１５７】
次に、プロセスＩＤ割当部２０１は、ハイパーキューブに含まれる２ｎ個の各演算ユニット２０にｎビットの固有のプロセスＩＤを割り当てる（ステップＳ２）。そして、プロセスＩＤ割当部２０１は、各演算ユニット２０に割り当てたプロセスＩＤを統括制御部２０３へ出力する。
【０１５８】
それぞれの演算ユニット２０の統括制御部２０３は、各演算ユニット２０に割り当てられたプロセスＩＤをプロセスＩＤ割当部２０１から取得する。そして、統括制御部２０３は、２ｎ個のプロセスに対する並列Ａｌｌｒｅｄｕｃｅ処理を開始する（ステップＳ３）。統括制御部２０３は、各演算ユニット２０に割り当てられたプロセスＩＤをスレッド生成部２０２へ出力する。
【０１５９】
スレッド生成部２０２は、各演算ユニット２０に割り当てられたプロセスＩＤの入力を統括制御部２０３から受ける。そして、スレッド生成部２０２は、自演算ユニットが含まれるハイパーキューブの次元を取得する。ここでは、ハイパーキューブがｎ次元の場合で説明する。スレッド生成部２０２は、自演算ユニットに割り当てられたプロセスの情報をジョブ管理部２７から取得する。そして、スレッド生成部２０２は、自演算ユニットに割り当てられたプロセスによる演算結果のデータ列をｎ個の組に分けてｎ個のスレッドＴｈ１〜Ｔｈｎを生成し、生成したスレッドそれぞれに識別番号情報を割り当てる（ステップＳ４）。その後、スレッド生成部２０２は、識別番号情報及び各スレッドＴｈ１〜Ｔｈｎに含まれるデータ列の情報を含むスレッドの情報を統括制御部２０３へ出力する。
【０１６０】
統括制御部２０３は、スレッドの情報をスレッド生成部２０２から取得する。そして、統括制御部２０３は、ｎ個のスレッドＴｈ１〜Ｔｈｎ毎にＨａｌｖｉｎｇを実行する（ステップＳ５〜Ｓ７）。Ｈａｌｖｉｎｇの詳細については後で説明する。
【０１６１】
Ｈａｌｖｉｎｇ完了後、統括制御部２０３は、ｎ個のスレッドＴｈ１〜Ｔｈｎ毎に外側トポロジにおけるＡｌｌｒｅｄｕｃｅの処理を実行する（ステップＳ８〜Ｓ１０）。
【０１６２】
外側トポロジにおけるＡｌｌｒｅｄｕｃｅの処理完了後、統括制御部２０３は、ｎ個のスレッドＴｈ１〜Ｔｈｎ毎にＤｏｕｂｌｉｎｇを外側接続処理実行部２０９に実行させる（ステップＳ１１〜Ｓ１３）。Ｄｏｕｂｌｉｎｇの詳細については後で説明する。
【０１６３】
Ｄｏｕｂｌｉｎｇの処理完了後、統括制御部２０３は、ｎ個のスレッドＴｈ１〜Ｔｈｎの間の同期処理を同期処理部２１０に実行させる（ステップＳ１４）。
【０１６４】
その後、統括制御部２０３は、自演算ユニットが実行するプロセスを含む２ｎ個のプロセス間の同期処理を同期処理部２１０に実行させる（ステップＳ１５）。これにより、統括制御部２０３は、並列Ａｌｌｒｅｄｕｃｅ処理を完了する。
【０１６５】
次に、図１５を参照して、Ｈａｌｖｉｎｇの処理の流れについて説明する。図１５は、Ｈａｌｖｉｎｇのフローチャートである。図１５のフローチャートは、図１４におけるステップＳ５〜Ｓ７で実行される処理の一例にあたる。
【０１６６】
スレッド生成部２０２は、各スレッドにｎビットのサイクリックＩＤを割り当てサイクリックＩＤの初期化を行う（ステップＳ１０１）。統括制御部２０３は、各スレッドのサイクリックＩＤをスレッド生成部２０２から取得する。
【０１６７】
次に、統括制御部２０３は、ｉ＝０とする（ステップＳ１０２）。
【０１６８】
次に、統括制御部２０３は、自演算ユニットのプロセスＩＤ、スレッドの情報、各スレッドに割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列を送受信データサイズ算出部２０４へ出力する。送受信データサイズ算出部２０４は、初回の通信では２ｎ−１個のデータ列のブロックを送受信するデータサイズとする。その後、送受信データサイズ算出部２０４は、前回の通信におけるデータサイズを１／２倍して、今回の通信において送受信するデータサイズとして算出する（ステップＳ１０３）。そして、送受信データサイズ算出部２０４は、送受信するデータサイズを対象データ決定部２０５へ出力する。また、送受信データサイズ算出部２０４は、各スレッドの情報、各スレッドに割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列を対象データ決定部２０５へ出力する。
【０１６９】
対象データ決定部２０５は、送受信するデータサイズ、スレッドＴｈ１及びＴｈ２の情報、スレッドＴｈ１及びＴｈ２に割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列の入力を送受信データサイズ算出部２０４から受ける。次に、対象データ決定部２０５は、送受信を行うデータサイズで各スレッドを分割して対象判定用グループを生成する。そして、対象データ決定部２０５は、対象判定用グループに送受信対象インデックスを割り振り、プロセスＩＤ及び送受信対象インデックスを用いて受信対象のデータの格納領域を求める（ステップＳ１０４）。
【０１７０】
次に、対象データ決定部２０５は、プロセスＩＤ及び送受信対象インデックスを用いて送信対象のデータの格納領域を求める（ステップＳ１０５）。その後、対象データ決定部２０５は、送信対象のデータの格納領域の情報をデータ送信部２０７へ出力する。また、対象データ決定部２０５は、受信対象のデータの格納領域の情報をデータ受信部２０８へ出力する。
【０１７１】
また、宛先決定部２０６は、各スレッドの情報、スレッドに割り当てられたサイクリックＩＤ、並びに、自演算ユニットのプロセスＩＤの入力を統括制御部２０３から受ける。そして、宛先決定部２０６は、スレッド毎に、プロセスＩＤとサイクリックＩＤとの排他的論理和を求めて、スレッド毎に送信先の演算ユニット２０のプロセスＩＤを求める（ステップＳ１０６）。その後、宛先決定部２０６は、スレッド毎の送信先の演算ユニット２０のプロセスＩＤをデータ送信部２０７へ出力する。
【０１７２】
データ送信部２０７は、送信対象のデータの格納領域の情報の入力を対象データ決定部２０５から受ける。また、データ送信部２０７は、スレッド毎の送信先の演算ユニット２０のプロセスＩＤの入力を宛先決定部２０６から受ける。また、データ受信部２０８は、受信対象のデータの格納領域の情報の入力を対象データ決定部２０５から受ける。そして、データ送信部２０７及びデータ受信部２０８は、データの送受信を行う（ステップＳ１０７）。この時、データ受信部２０８は、他の演算ユニット２０からの受信データを対応する受信対象のデータの情報とともにメモリ制御部２３へ出力する。メモリ制御部２３は、受信データと受信対象のデータとの演算を並列演算装置２１に行わせ、演算結果をメモリ２４の受信対象のデータの格納領域であった場所に格納する。その後、メモリ制御部２３は、データの受信完了を統括制御部２０３へ通知する。
【０１７３】
統括制御部２０３は、データの受信完了をメモリ制御部２３から受信する。そして、統括制御部２０３は、各スレッドに割り当てられたサイクリックＩＤの値をサイクリックに左にシフトさせる（ステップＳ１０８）。
【０１７４】
その後、統括制御部２０３は、ｉ＝ｎか否かを判定する（ステップＳ１０９）。ｉ＝ｎでない場合（ステップＳ１０９：否定）、統括制御部２０３は、ｉを１つインクリメントする（ステップＳ１１０）。その後、統括制御部２０３は、ステップＳ１０３へ戻る。
【０１７５】
これに対して、ｉ＝ｎの場合（ステップＳ１０９：肯定）、統括制御部２０３は、Ｈａｌｖｉｎｇの処理を終了する。
【０１７６】
次に、図１６を参照して、Ｄｏｕｂｌｉｎｇの処理の流れについて説明する。図１６は、Ｄｏｕｂｌｉｎｇのフローチャートである。図１６のフローチャートは、図１４におけるステップＳ１１〜Ｓ１３で実行される処理の一例にあたる。
【０１７７】
統括制御部２０３は、Ｈａｌｖｉｎｇ終了時の送受信したデータサイズ及び各スレッドのサイクリックＩＤを取得する（ステップＳ２０１）。
【０１７８】
次に、統括制御部２０３は、ｉ＝０とする（ステップＳ２０２）。
【０１７９】
次に、統括制御部２０３は、各スレッドのサイクリックＩＤの値をサイクリックに右にシフトする（ステップＳ２０３）。
【０１８０】
その後、統括制御部２０３は、自演算ユニットのプロセスＩＤ、スレッドの情報、各スレッドに割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列を送受信データサイズ算出部２０４へ出力する。送受信データサイズ算出部２０４は、初回の通信では１個のデータ列のブロックを送受信するデータサイズとする。その後、送受信データサイズ算出部２０４は、前回の通信におけるデータサイズを２倍して、今回の通信において送受信するデータサイズを計算する（ステップＳ２０４）。そして、送受信データサイズ算出部２０４は、送受信するデータサイズを対象データ決定部２０５へ出力する。また、送受信データサイズ算出部２０４は、各スレッドの情報、各スレッドに割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列を対象データ決定部２０５へ出力する。
【０１８１】
対象データ決定部２０５は、送受信するデータサイズ、スレッドＴｈ１及びＴｈ２の情報、スレッドＴｈ１及びＴｈ２に割り当てられたサイクリックＩＤ、並びに、各ブロックのデータ列の入力を送受信データサイズ算出部２０４から受ける。次に、対象データ決定部２０５は、送受信を行うデータサイズで各スレッドを分割して対象判定用グループを生成する。そして、対象データ決定部２０５は、対象判定用グループに送受信対象インデックスを割り振り、プロセスＩＤ及び送受信対象インデックスを用いて受信対象のデータの格納領域を求める（ステップＳ２０５）。
【０１８２】
次に、対象データ決定部２０５は、プロセスＩＤ及び送受信対象インデックスを用いて送信対象のデータの格納領域を求める（ステップＳ２０６）。その後、対象データ決定部２０５は、送信対象のデータの格納領域の情報をデータ送信部２０７へ出力する。また、対象データ決定部２０５は、受信対象のデータの格納領域の情報をデータ受信部２０８へ出力する。
【０１８３】
また、宛先決定部２０６は、各スレッドの情報、スレッドに割り当てられたサイクリックＩＤ、並びに、自演算ユニットのプロセスＩＤの入力を統括制御部２０３から受ける。そして、宛先決定部２０６は、スレッド毎に、プロセスＩＤとサイクリックＩＤとの排他的論理和を求めて、スレッド毎に送信先の演算ユニット２０のプロセスＩＤを求める（ステップＳ２０７）。その後、宛先決定部２０６は、スレッド毎の送信先の演算ユニット２０のプロセスＩＤをデータ送信部２０７へ出力する。
【０１８４】
データ送信部２０７は、送信対象のデータの格納領域の情報の入力を対象データ決定部２０５から受ける。また、データ送信部２０７は、スレッド毎の送信先の演算ユニット２０のプロセスＩＤの入力を宛先決定部２０６から受ける。また、データ受信部２０８は、受信対象のデータの格納領域の情報の入力を対象データ決定部２０５から受ける。そして、データ送信部２０７及びデータ受信部２０８は、データの送受信を行う（ステップＳ２０８）。この時、データ受信部２０８は、他の演算ユニット２０からの受信データを対応する受信対象のデータの情報とともにメモリ制御部２３へ出力する。メモリ制御部２３は、受信データと受信対象のデータとの演算を並列演算装置２１に行わせ、演算結果をメモリ２４の受信対象のデータの格納領域であった場所に格納する。その後、メモリ制御部２３は、データの受信完了を統括制御部２０３へ通知する。
【０１８５】
統括制御部２０３は、データの受信完了をメモリ制御部２３から受信する。そして、統括制御部２０３は、ｉ＝ｎか否かを判定する（ステップＳ２０９）。ｉ＝ｎでない場合（ステップＳ２０９：否定）、統括制御部２０３は、ｉを１つインクリメントする（ステップＳ２１０）。その後、統括制御部２０３は、ステップＳ２０３へ戻る。
【０１８６】
これに対して、ｉ＝ｎの場合（ステップＳ２０９：肯定）、統括制御部２０３は、Ｄｏｕｂｌｉｎｇの処理を終了する。
【０１８７】
さらに、Ｈａｌｖｉｎｇ及びＤｏｕｂｌｉｎｇを実行するためのプログラムについて説明する。図１７は、Ｈａｌｖｉｎｇ及びＤｏｕｂｌｉｎｇを実行するためのプログラムの疑似コードの一例を示す図である。
【０１８８】
図１７におけるＣｙｃｌｉｃＬｅｆｔＳｈｉｆｔ（ｖａｌ）は、ｖａｌの値をサイクリックに左にシフトする関数である。また、ＣｙｃｌｉｃＲｉｇｈｔＳｈｉｆｔ（ｖａｌ）は、ｖａｌの値をサイクリックに右にシフトする関数である。さらに、ＳｅｎｄＲｅｃｖ（ｄｓｔ，ｓｃｒ，ｓｉｚｅ，ｐｅｅｒ）は、ｓｃｒのアドレスからｓｉｚｅ分をｐｅｅｒへ送り、ｐｅｅｒから送られた分のデータをｄｓｔに上書きする関数である。また、ＳｅｎｄＲｅｃｖ＿Ａｄｄ（ｄｓｔ，ｓｃｒ，ｓｉｚｅ，ｐｅｅｒ）は、ｓｃｒのアドレスからｓｉｚｅ分をｐｅｅｒへ送り、ｐｅｅｒから送られた分のデータをｄｓｔに加算する関数である。また、ＳｔｅｐＨｉｓｔは、実行中のＨａｌｖｉｎｇ又はＤｏｕｂｌｉｎｇの処理の進行状態を表す値である。
【０１８９】
次に、図１８を参照して、図１７で示したプログラムのＨａｌｖｉｎｇについての処理の流れを説明する。図１８は、Ｈａｌｖｉｎｇを実現するプログラムで行われる処理のフローチャートである。図１８は、図１５のフローチャートの処理をプログラムで実現した場合の一例にあたる。ここでは、ネットワーク制御部２９が有する演算回路を動作主体として各処理について説明する。また、ここでは、スレッドの識別子として、０〜ｎ−１までの値で表されるｔｈｒｅｄＩＤを用いる。
【０１９０】
演算回路は、１つだけ１の値を有するｎビットのサイクリックＩＤ（ＣｙｃｌｉｃＩＤ）の１の値の場所を左に１つずつシフトさせていくことで各スレッドに割り当てるサイクリックＩＤを生成し、ＣｙｃｌｉｃＩＤの初期化を行う。また、演算回路は、ＳｔｅｐＨｉｓｔ＝０とする。さらに、演算回路は、プロセスの演算結果全体のデータサイズ（Ｄ）をｎで除算した値にｔｈｒｅｄＩＤを乗算する。次に、演算回路は、乗算結果にメモリ２４の先頭アドレス（ＭｅｍＡｄｄｒ）を加算して、スレッド毎のｏｆｆｓｅｔを算出して、ｏｆｆｓｅｔの初期化を行う（ステップＳ３０１）。
【０１９１】
次に、演算回路は、ｉ＝０とする（ステップＳ３０２）。
【０１９２】
次に、演算回路は、ＳｔｅｐＨｉｓｔの最下位に注目するビットを追加する（ステップＳ３０３）。具体的には、演算回路は、ＳｔｅｐＨｉｓｔのビット列を左に１つシフトさせる。この場合、演算回路は、最下位ビットを０とする。そして、演算回路は、ＣｙｃｌｉｃＩＤにおいて１が立つビットと同じビットが、プロセスＩＤ（ｐｒｏｃｅｓｓＩＤ）でも１であるかを判定する。例えば、演算回路は、サイクリックＩＤとプロセスＩＤとの論理積を求め、求めた値が０より大きいか否かを判定し、０より大きければそのビットがプロセスＩＤでも１であると判定し、０以下であればそのビットがプロセスＩＤでは０であると判定する。そして、そのビットがプロセスＩＤでも１である場合、演算回路は、ＳｔｅｐＨｉｓｔと、同じビット数で最下位ビットが１であるビット列との排他的論理和を求めることで、ＳｔｅｐＨｉｓｔの最下位ビットを１にする。これに対して、そのビットがプロセスＩＤでは０である場合、演算回路は、ＳｔｅｐＨｉｓｔと、同じビット数ですべてのビットが０であるビット列との排他的論理和を求めることで、ＳｔｅｐＨｉｓｔの最下位ビットを０にする。
【０１９３】
次に、演算回路は、送受信を行うデータサイズを算出（ステップＳ３０４）。具体的には、演算回路は、プロセスの演算結果全体のデータサイズをｎで除算した値を２のｉ乗で除算して、ＢｕｆｆｅｒＳｉｚｅを求める。このＢｕｆｆｅｒＳｉｚｅが、送受信を行うデータサイズとなる。
【０１９４】
次に、演算回路は、受信対象となるデータの先頭アドレスを求める（ステップＳ３０５）。具体的には、演算回路は、ＳｔｅｐＨｉｓｔにＢｕｆｆｅｒＳｉｚｅを乗算した値にｏｆｆｓｅｔを加算することで、受信対象となるデータの先頭アドレスであるＲｅｃｖＡｄｄを算出する。
【０１９５】
より詳しく説明すると、各スレッドのブロックは２×２ｉ個に分割される。そして、演算回路は、スレッドの分割された各領域に、１＋ｉビットの送受信対象インデックスを割り当てる。また、この時点でＳｔｅｐＨｉｓｔも同様に１＋ｉビットで表現される値を有する。そこで、演算回路は、送受信対象インデックスがＳｔｅｐＨｉｓｔの値と一致する領域を受信対象となるデータの領域とする。そして、演算回路は、そのインデックス倍のＢｕｆｆｅｒＳｉｚｅを求めることで受信対象となるデータの先頭アドレスが求められる。
【０１９６】
次に、演算回路は、送信対象となるデータの先頭アドレスを求める（ステップＳ３０６）。具体的には、受信先の先頭アドレスに対して、最下位ビットが異なる送受信対象インデックスを有する領域が送信対象となるデータの領域となる。そこで、演算回路は、ＳｔｅｐＨｉｓｔと、ＳｔｅｐＨｉｓｔと同じビット数で最下位ビットが１の値との排他的論理和を求める。そして、演算回路は、求めた排他的論理和の値にＢｕｆｆｅｒＳｉｚｅを乗算し、乗算結果にｏｆｆｓｅｔを加算することで、送信対象となるデータの先頭アドレスであるＳｅｎｄＡｄｄを算出する。
【０１９７】
次に、演算回路は、送信相手の演算ユニット２０のプロセスＩＤを求める（ステップＳ３０７）。具体的には、演算回路は、サイクリックＩＤとプロセスＩＤとの排他的論理和を算出し、算出結果を送受信相手の演算ユニット２０のプロセスＩＤであるＰｅｅｒとする。
【０１９８】
その後、演算回路は、データの送受信及び受信データの加算処理を実行する（ステップＳ３０８）。具体的には、演算回路は、ＳｅｎｄＲｅｃｖ＿Ａｄｄ（ＲｅｃｖＡｄｄ，ＳｅｎｄＡｄｄ，ＢｕｆｆｅｒＳｉｚｅ，Ｐｅｅｒ）を求める。
【０１９９】
次に、演算回路は、ＣｙｃｌｉｃＬｅｆｔＳｈｉｆｔ（ＣｙｃｉｃＩＤ）を行い、サイクリックＩＤの値をサイクリックに左にシフトする（ステップＳ３０９）。
【０２００】
そして、演算回路は、ｉがｎより小さいか否かを判定する（ステップＳ３１０）。ｉがｎより小さい場合（ステップＳ３１０：肯定）、演算処理部は、ｉの値を１つインクリメントし（ステップＳ３１１）、ステップＳ３０３へ戻る。
【０２０１】
これに対して、ｉ＝ｎの場合（ステップＳ３１０：否定）、演算処理部は、Ｈａｌｖｉｎｇを終了する。
【０２０２】
次に、図１９を参照して、図１７で示したプログラムのＤｏｕｂｌｉｎｇについての処理の流れを説明する。図１９は、Ｄｏｕｂｌｉｎｇを実現するプログラムで行われる処理のフローチャートである。図１９は、図１６のフローチャートの処理をプログラムで実現した場合の一例にあたる。ここでも、ネットワーク制御部２９が有する演算回路を動作主体として各処理について説明する。
【０２０３】
演算回路は、Ｈａｌｖｉｎｇ終了時のＢｕｆｆｅｒＳｉｚｅ、サイクリックＩＤ、ＳｔｅｐＨｉｓｔ及びｏｆｆｓｅｔを取得する（ステップＳ４０１）。
【０２０４】
次に、演算回路は、ｉ＝０とする（ステップＳ４０２）。
【０２０５】
次に、演算回路は、ＣｙｃｌｉｃＲｉｇｈｔＳｈｉｆｔ（ＣｙｃｌｉｃＩＤ）を行い、サイクリックＩＤの値をサイクリックに右にシフトする（ステップＳ４０３）。すなわち、演算回路は、Ｈａｌｖｉｎｇとは逆順に通信相手とデータの交換を行う。Ｈａｌｖｉｎｇでは、最後にデータの送受信を行った後に一度左へのシフトが実行されたため、ここでは、演算回路は、最初に右へのシフトを実行する。
【０２０６】
次に、演算回路は、受信対象となるデータの先頭アドレスを計算する（ステップＳ４０４）。具体的には、Ｄｏｕｂｌｉｎｇにおいては、送受信対象のデータの領域がＨａｌｖｉｎｇの時と逆になる。そこで、演算回路は、ＳｔｅｐＨｉｓｔと、ＳｔｅｐＨｉｓｔと同じビット数で最下位ビットが１の値との排他的論理和を求める。そして、演算回路は、求めた排他的論理和の値にＢｕｆｆｅｒＳｉｚｅを乗算し、乗算結果にｏｆｆｓｅｔを加算することで、受信対象となるデータの先頭アドレスであるＲｅｃｖＡｄｄを算出する。
【０２０７】
次に、演算回路は、送信対象となるデータの先頭アドレスを求める（ステップＳ４０５）。具体的には、演算回路は、ＳｔｅｐＨｉｓｔにＢｕｆｆｅｒＳｉｚｅを乗算した値にｏｆｆｓｅｔを加算することで、送信対象となるデータの先頭アドレスであるＳｅｎｄＡｄｄを算出する。
【０２０８】
次に、演算回路は、送信相手の演算ユニット２０のプロセスＩＤを求める（ステップＳ４０６）。具体的には、演算回路は、サイクリックＩＤとプロセスＩＤとの排他的論理和を算出し、算出結果を送受信相手の演算ユニット２０のプロセスＩＤであるＰｅｅｒとする。
【０２０９】
次に、演算回路は、次の通信時の送受信を行うデータサイズを計算（ステップＳ４０７）。具体的には、演算回路は、今回の通信におけるデータサイズを２倍にしたものを次の通信時の送受信を行うデータサイズとする。
【０２１０】
その後、演算回路は、データの送受信及び受信データの加算処理を実行する（ステップＳ４０８）。具体的には、演算回路は、ＳｅｎｄＲｅｃｖ（ＲｅｃｖＡｄｄ，ＳｅｎｄＡｄｄ，ＣｙｃｌｉｃＩＤ，ＢｕｆｆｅｒＳｉｚｅ，Ｐｅｅｒ）を求める。
【０２１１】
次に、演算回路は、ＳｔｅｐＨｉｓｔの値を右にシフトさせる（ステップＳ４０９）。この場合の右へのシフトはサイクリックな右シフトではない。右にシフトさせることで、ＳｔｅｐＨｉｓｔの１ビット目の値が消滅する。これにより、演算回路は、ＳｔｅｐＨｉｓｔの値をＨａｌｖｉｎｇの時の逆順で遷移させる。
【０２１２】
そして、演算回路は、ｉがｎより小さいか否かを判定する（ステップＳ４１０）。ｉがｎより小さい場合（ステップＳ４１０：肯定）、演算処理部は、ｉの値を１つインクリメントし（ステップＳ４１１）、ステップＳ４０３へ戻る。
【０２１３】
これに対して、ｉ＝ｎの場合（ステップＳ４１０：否定）、演算処理部は、Ｄｏｕｂｌｉｎｇを終了する。
【０２１４】
以上に説明したように、本実施例に係る情報処理システムは、演算ユニットが含まれるハイパーキューブの次元でプロセスを分割して生成したスレッド毎に異なる演算ユニットとの間でデータの送受信を行うことでＡｌｌｒｅｄｕｃｅの処理を実行する。これにより、Ａｌｌｒｅｄｕｃｅの処理を行うに当たり、通信をする際に不使用の通信経路の発生を抑制することができ、処理速度を向上させることができる。
【０２１５】
図２０は、実施例１に係るＡｌｌｒｅｄｕｃｅの処理の効果を説明するための図である。図２０は、縦軸で従来のＡｌｌｒｅｄｕｃｅ処理に対する通信時間の倍率を表し、横軸でハイパーキューブの次元数を表す。
【０２１６】
１本のケーブルの帯域がｂバイト／秒の場合で説明する。この場合、１本の経路でＤバイトのデータの通信を行うのに係る時間は、Ｄ／ｂ秒である。そのため、データの通信量が半分になると通信時間はＤ／２ｂとなる。すなわち、演算ユニットが２次元のハイパーキューブの構成の場合、スレッドのサイズは全体の半分になるため、送受信するデータサイズも半分になり、通信時間も半分になる。そして、１度に通信を行う経路が倍になるので、帯域は２ｂバイト／秒となる。また、ｎ次元のハイパーキューブの構成の場合、帯域はｎｂバイト／秒であり、各経路での送受信するデータサイズはＤ／ｎバイトとなる。したがって、図２０に示すように、本願に係るＡｌｌｒｅｄｕｃｅの処理を実行した場合、従来のＡｌｌｒｅｄｕｃｅの処理に比べて処理速度が向上する。
【０２１７】
また、演算ユニットがネットワークスイッチで接続されたトポロジにおいて、本実施例に係るＡｌｌｒｅｄｕｃｅの処理を実行した場合、各演算ユニットからネットワークスイッチに延びる１本のネットワーク上で、同時に複数のデータの送信が行われる。そのため、ネットワークスイッチへ向かう経路に負荷が集中し、速度の低下が発生するおそれがある。これは、多段のネットワークスイッチを用いた場合でも同様である。そのため、本実施例に係るＡｌｌｒｅｄｕｃｅの処理を行う情報処理システムは、演算ユニットがスイッチを介さない直接結合網を有する場合でより効果を発揮できる。
【実施例２】
【０２１８】
図２１は、実施例２に係る情報処理システムのハードウェア構成図である。本実施例に係る情報処理システムは、システムボード１上に８つの演算ユニット２０が搭載される。そして、演算ユニット２０は、３次元のハイパーキューブとなるように接続される。
【０２１９】
本実施例に係る演算ユニット２０も実施例１と同様に、図３で表されるハードウェアを有する。さらに、ネットワーク制御部２９のブロック図は、図４で表される。以下の説明では、実施例１と同様の各部の機能については説明を省略する場合がある。
【０２２０】
本実施例に係るスレッド生成部２０２は、演算ユニット２０が３次元のハイパーキューブに含まれるため、図２２に示すように、１つのプロセスに対して３つのスレッドＴｈ１〜Ｔｈ３を生成する。図２２は、実施例２に係る宛先決定の処理を説明するための図である。
【０２２１】
送受信データサイズ算出部２０４は、実施例１と同様に送受信するデータサイズを決定する。送受信されるデータサイズは、図２２における太枠で囲われたブロックに格納されたデータ列のサイズである。すなわち、データサイズは、通信毎に半分のサイズとなる。
【０２２２】
また、対象データ決定部２０５は、生成した対象判定用グループに送受信対象インデックスを割り振り、実施例１と同様に受信対象とする領域及び送信対象とする領域を決定する。そして、対象データ決定部２０５は、その決定した領域に対応するデータを送信対象のデータ及び受信対象のデータとする。
【０２２３】
また、宛先決定部２０６は、図２２に示すようにスレッド毎にプロセスＩＤとサイクリックＩＤとの排他的論理和を求め、その値をそのスレッドにおける送信先のプロセスＩＤとする。図２２は、プロセスＩＤとして０００が割り当てられた演算ユニット２０による各通信における送信先のプロセスＩＤの決定を表す。図２２では、各通信においてスレッド毎にサイクリックＩＤを記載した。そして、サイクリックＩＤから延びる矢印の先にプロセスＩＤとサイクリックＩＤとの排他的論理和から求まる送信先のプロセスＩＤを記載した。
【０２２４】
この場合、図２３に示すように、通信毎に送信先の演算ユニット２０は変化する。図２３は、３次元ハイパーキューブにおける宛先の遷移を説明するための図である。図２３の各丸が演算ユニット２０を表し、各丸に付した番号が各演算ユニット２０のプロセスＩＤを表す。
【０２２５】
１回目の通信では、実線矢印４１１で示すように、プロセスＩＤが０００の演算ユニット２０は、プロセスＩＤが００１の演算ユニット２０をスレッドＴｈ１のデータの送信先とする。また、破線矢印４１２で示すように、プロセスＩＤが０００の演算ユニット２０は、プロセスＩＤが０１０の演算ユニット２０をスレッドＴｈ２のデータの送信先とする。さらに、一点鎖線矢印４１３で示すように、プロセスＩＤが０００の演算ユニット２０は、プロセスＩＤが１００の演算ユニット２０をスレッドＴｈ３のデータの送信先とする。
【０２２６】
次に、２回目の通信では、実線矢印４１４で示すように、プロセスＩＤが０００の演算ユニット２０は、プロセスＩＤが０１０の演算ユニット２０をスレッドＴｈ１のデータの送信先とする。また、破線矢印４１５で示すように、プロセスＩＤが０００の演算ユニット２０は、プロセスＩＤが１００の演算ユニット２０をスレッドＴｈ２のデータの送信先とする。さらに、一点鎖線矢印４１６で示すように、プロセスＩＤが０００の演算ユニット２０は、プロセスＩＤが００１の演算ユニット２０をスレッドＴｈ３のデータの送信先とする。
【０２２７】
次に、３回目の通信では、実線矢印４１７で示すように、プロセスＩＤが０００の演算ユニット２０は、プロセスＩＤが１００の演算ユニット２０をスレッドＴｈ１のデータの送信先とする。また、破線矢印４１８で示すように、プロセスＩＤが０００の演算ユニット２０は、プロセスＩＤが００１の演算ユニット２０をスレッドＴｈ２のデータの送信先とする。さらに、一点鎖線矢印４１９で示すように、プロセスＩＤが０００の演算ユニット２０は、プロセスＩＤが０１０の演算ユニット２０をスレッドＴｈ３のデータの送信先とする。
【０２２８】
このように、演算ユニット２０は、１回の通信でスレッド毎に異なる演算ユニット２０をデータの送信先とする。これにより、演算ユニット２０は、１回の通信で隣接する全ての演算ユニット２０へデータの送信を行え、使用しない経路の発生を抑制でき、帯域を十分に使うことが可能となる。
【０２２９】
まとめると、宛先決定部２０６は、図２２に示すように、巡回番号情報であるサイクリックＩＤと識別番号情報であるプロセスＩＤとの排他的論理和演算を行い、排他的論理和演算により宛先番号情報であるプロセスＩＤを算出する。そして、宛先決定部２０６は、算出したプロセスＩＤを図２３に示す各通信における送信先の演算ユニット２０のプロセスＩＤとする。
【０２３０】
図２４は、実施例２に係る情報処理システムにおける通信毎の通信を行う演算ユニットを表す図である。図２４では、３次元のハイパーキューブとなるように接続された８個の演算ユニット２０のそれぞれに＃００〜＃０７までの符号を割り当てて通信を行う演算ユニット２０を表現した。この場合、情報処理システムは、データ量が２４ｍのＡｌｌｒｅｄｕｃｅ処理を実行する。
【０２３１】
図２４では、パターンが付されていない通信がスレッドＴｈ１のデータを送受信する演算ユニット２０の組を表す。また、斜線パターンが付された通信がスレッドＴｈ２のデータを送受信する演算ユニット２０の組を表す。さらに、ドットパターンが付された通信がスレッドＴｈ３のデータを送受信する演算ユニット２０の組を表す。
【０２３２】
そして、通信量は、Ｈａｌｖｉｎｇが行われることにより、１回目の通信で４ｍであり、２回目の通信で半分の２ｍとなり、３回目の通信で１ｍとなる。その後、Ｄｏｕｂｌｉｎｇが行われることにより、通信量は、４回目の通信で２ｍとなり、５回目の通信で４ｍとなる。
【０２３３】
図２４に示すように、演算ユニット＃００〜＃０７は、いずれも各通信において、隣接する演算ユニット２０との通信を実行する。そして、演算ユニット＃００〜＃０７は、各通信においてスレッド毎の通信先の演算ユニット２０を変更していくことで、Ａｌｌｒｅｄｕｃｅの処理を実行する。
【０２３４】
以上に説明したように、３次元のハイパーキューブとなるように演算ユニットが接続された場合であっても、通信に使用しない経路の発生を抑えることができ、処理速度を向上させることができる。
【実施例３】
【０２３５】
図２５は、実施例３に係る情報処理システムのハードウェア構成図である。本実施例に係る情報処理システムは、１つのシステムボード１上に２つの演算ユニット２０が搭載される。そして、演算ユニット２０は、２次元のハイパーキューブとなるように接続される。そして、４つのシステムボード１がネットワークスイッチ５経由で相互に接続される。
【０２３６】
この場合も、送受信データサイズ算出部２０４は、通信毎に送受信対象のデータサイズを決定する。そして、対象データ決定部２０５は、データサイズに応じて送信対象のデータ及び受信対処のデータを決定する。ただし、２次元のハイパーキューブの場合は、１回通信でＨａｌｖｉｎｇが終了する。同様に、１回の通信でＤｏｕｂｌｉｎｇが終了する。
【０２３７】
図２６は、実施例３に係る情報処理システムにおける通信毎の通信を行う演算ユニットを表す図である。図２６では、４つのシステムボード１において１次元のハイパーキューブとなるように接続された８個の演算ユニット２０のそれぞれに＃０〜＃７までの符号を割り当てて通信を行う演算ユニット２０を表現した。この場合、情報処理システムは、データ量が２４ｍのＡｌｌｒｅｄｕｃｅ処理を実行する。
【０２３８】
この場合は、各システムボード１間でのＡｌｌｒｅｄｕｃｅ処理が行われる。すなわち、４つのシステムボード１のぞれぞれの間で相互にデータの交換が行われる。このように、Ａｌｌｒｅｄｕｃｅの対象とするシステムボード１が増えることで、ネットワークスイッチ５を介したＡｌｌｒｅｄｕｃｅの処理が増加する。
【０２３９】
以上に説明したように、１次元のハイパーキューブとなるように接続された場合であっても、通信に使用しない経路の発生を抑えることができ、処理速度を向上させることができる。ただし、システムボードが増えることで、ネットワークスイッチを介したＡｌｌｒｅｄｕｃｅ処理が増加するので、直接接続された演算ユニットを増やしてネットワークスイッチを用いたＡｌｌｒｅｄｕｃｅの処理を削減することがより好ましい。
【０２４０】
ここで、以上の実施例では、プロセスＩＤの割り当てをハイパーキューブに含まれるいずれかの演算ユニット２０が実行する場合で説明したが、これに限らず、例えば、プロセスＩＤ割当用の演算ユニット２０を配置してもよい。
【符号の説明】
【０２４１】
１  システムボード
２  ＣＰＵ
３  ＰＣＩスイッチ
４  ＨＣＡ
５  ネットワークスイッチ
６  サブネットマネージャ
２０  演算ユニット
２１  並列演算装置
２２  演算制御部
２３  メモリ制御部
２４  メモリ
２５  ＤＭＡエンジン部
２６  ＰＣＩ制御部
２７  ジョブ管理部
２８  ネットワーク構成管理部
２９  ネットワーク制御部
３０  通信用バッファ
３１  インターコネクト装置
２０１  プロセスＩＤ割当部
２０２  スレッド生成部
２０３  統括制御部
２０４  送受信データサイズ算出部
２０５  対象データ決定部
２０６  宛先決定部
２０７  データ送信部
２０８  データ受信部
２０９  外側接続処理実行部
２１０  同期処理部
【図１】
2019086976.tif 000003
【図２】
2019086976.tif 000004
【図３】
2019086976.tif 000005
【図４】
2019086976.tif 000006
【図５】
2019086976.tif 000007
【図６】
2019086976.tif 000008
【図７】
2019086976.tif 000009
【図８】
2019086976.tif 000010
【図９】
2019086976.tif 000011
【図１０】
2019086976.tif 000012
【図１１】
2019086976.tif 000013
【図１２】
2019086976.tif 000014
【図１３】
2019086976.tif 000015
【図１４】
2019086976.tif 000016
【図１５】
2019086976.tif 000017
【図１６】
2019086976.tif 000018
【図１７】
2019086976.tif 000019
【図１８】
2019086976.tif 000020
【図１９】
2019086976.tif 000021
【図２０】
2019086976.tif 000022
【図２１】
2019086976.tif 000023
【図２２】
2019086976.tif 000024
【図２３】
2019086976.tif 000025
【図２４】
2019086976.tif 000026
【図２５】
2019086976.tif 000027
【図２６】
2019086976.tif 000028