以下に、本願の開示する情報処理システム、演算処理装置及び情報処理システムの制御方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理システム、演算処理装置及び情報処理システムの制御方法が限定されるものではない。
図1は、実施例1に係る情報処理システムのハードウェア構成図である。本実施例に係る情報処理システムは、2つのシステムボード1を有する。各システムボード1は、CPU(Central Processing Unit)2、2つのPCIスイッチ3、及び、4つのHCA(Host Channel Adaptor)4を有する。
各システムボード1上のCPU2は、相互に直接接続される。また、システムボード1上において、CPU2は、2つのPCIスイッチ3に接続される。CPU2は、操作者から入力されたジョブの命令を受けて、ジョブを後述する各演算ユニット20へ送信する。
各PCIスイッチ3は、CPU2及び2つの演算ユニット20に接続される。また、各PCIスイッチ3は、2つのHCA4に接続される。PCIスイッチ3は、CPU2及び演算ユニット20によるPCIを用いた通信時の経路選択を行う。
HCA4は、CPU2及び演算ユニット20によるインフィニバンドを用いた通信における通信インタフェースである。HCA4は、PCIスイッチ3に接続される。また、HCA4は、ネットワークスイッチ5に接続される。
ネットワークスイッチ5は、各システムボード1上のHCA4が接続される。ネットワークスイッチ5は、CPU2及び演算ユニット20によるインフィニバンドを用いた通信における経路選択を行う。
サブネットマネージャ6は、ネットワークスイッチ5を介して行われる通信の通信経路の管理を行う。例えば、サブネットマネージャ6は、ネットワーク上の1つのサーバ上で動作し、定期的に経路更新を行う。
演算ユニット20は、並列計算を行うための演算回路を有する。演算ユニット20は、例えば、GPU(Graphic Processing Unit)である。演算ユニット20は、ディープラーニングにおける演算処理などを実行する。以下では、演算ユニット20を「ノード」と呼ぶ場合がある。この演算ユニット20が、「演算処理装置」の一例にあたる。
1つのシステムボード1上には4つの演算ユニット20が配置される。そして、演算ユニット20は、隣り合う2つの演算ユニット20とインターコネクトで接続される。図1において太い実線で示した経路がインターコネクトを表す。
隣り合う2つの演算ユニット20と接続された4つの演算ユニット20は、2次元のハイパーキューブとなるように接続される。ここで、ハイパーキューブについて説明する。図2は、各種ハイパーキューブを表す図である。構成HQ1は、1次元のハイパーキューブである。構成HQ2は、2次元のハイパーキューブである。構成HQ3は、3次元のハイパーキューブである。構成HQ4は、4次元のハイパーキューブである。
各ノードにn個のビットを有する2進数のインデックスを割り当てた場合に、インデックスを表すビット列において1つのビットの値が異なるノード同士を接続することでn次元のハイパーキューブとなる。例えば、図2において構成HQ1〜HQ3の各ノードに付加した数字は、ビット列において1のビットの値が異なるノードに接続するように各ノードに割り当てた2進数のインデックスである。すなわち、図2の構成HQ1〜HQ3に例示したように、n次元のハイパーキューブは、割り当てられたインデックスを表すビット列において1つのビットの値が異なるノード間で相互通信が行われる。
例えば、本実施例に係る演算ユニット20は2次元のハイパーキューブとなるように接続される。そこで4つの演算ユニット20に00、01、10及び11のインデックスを割り当てた場合、以下のような通信を行う。すなわち、00のインデックスを有する演算ユニット20は、10及び01のインデックスを有するノードと通信を行う。また、01のインデックスを有する演算ユニット20は、00及び11のインデックスを有する演算ユニット20と通信を行う。10のインデックスを有する演算ユニット20は、00及び11のインデックスを有するノードと通信を行う。また、11のインデックスを有する演算ユニット20は、10及び01のインデックスを有する演算ユニット20と通信を行う。
また、本実施例では、演算ユニット20が2次元のハイパーキューブとなるように接続された場合で説明するが、3次元以上のハイパーキューブであっても以下に説明する機能と同様の機能を有することができる。そして、ハイパーキューブとなるように接続された演算ユニット20のうち特定の演算ユニット20と他の演算ユニット20を介さずに直接接続された演算ユニット20が、特定の演算ユニット20に「隣接する」演算ユニット20の一例にあたる。そして、特定の演算ユニット20と他の演算ユニット20を介さずに直接接続された演算ユニット20の数が、ハイパーキューブの次元にあたる。
図3は、演算ユニットのハードウェア構成図である。演算ユニット20は、並列演算装置21、演算制御部22、メモリ制御部23及びメモリ24を有する。さらに、演算ユニット20は、DMA(Direct Memory Access)エンジン部25、PCI制御部26、ジョブ管理部27、ネットワーク構成管理部28、ネットワーク制御部29、通信用バッファ30及びインターコネクト装置31を有する。ここで、図3では、並列演算装置21、演算制御部22、メモリ制御部23及びメモリ24を4つずつ記載したが、これらの数に特に制限は無い。
PCI制御部26は、DMAエンジン部25、ジョブ管理部27及びネットワーク構成管理部28とPCIスイッチ3との間のPCIを用いた通信の制御を行う。
ジョブ管理部27は、PCIスイッチ3及びPCI制御部26を介してCPU2から送信されたジョブを実行するための演算命令の入力を受ける。ジョブ管理部27は、取得した演算命令をキューとして取り扱う。ジョブ管理部27は、演算命令を演算制御部22へ出力する。その後、ジョブ管理部27は、演算結果の入力を演算制御部22から受ける。そして、ジョブ管理部27は、各演算制御部22から取得した演算結果をまとめてジョブの結果を取得する。その後、ジョブ管理部27は、ジョブの結果をPCI制御部26及びPCIスイッチ3などを介してCPU2へ出力する。
演算制御部22は、演算命令にしたがい、メモリ制御部23を介してメモリ24からデータを取得する。そして、演算制御部22は、取得したデータ及び演算命令を並列演算装置21へ出力する。その後、演算制御部22は、演算結果を並列演算装置21から取得する。次に、演算制御部22は、演算結果をジョブ管理部27へ出力する。
並列演算装置21は、データ及び演算命令の入力を演算制御部22から受ける。そして、並列演算装置21は、取得したデータを用いて指定された演算を実行する。その後、並列演算装置21は、演算結果を演算制御部22へ出力する。
ネットワーク構成管理部28は、CPU2が実行するデバイスドライバよりシステムボード1内の結線表を取得する。結線表は、演算ユニット20間のインターコネクトの接続状態を含む。ネットワーク構成管理部28は、取得した結線表をネットワーク制御部29へ出力する。
ネットワーク制御部29は、通信用バッファ30及びインターコネクト装置31と接続される。ネットワーク制御部29は、通信用バッファ30及びインターコネクト装置31を用いてインターコネクトを介した他の演算ユニット20との間の通信を制御する。具体的には、ネットワーク制御部29は、送信するデータを通信用バッファ30に書き込む。そして、ネットワーク制御部29は、インターコネクト装置31に対して通信用バッファ30に格納されたデータの送信を指示することで他の演算ユニット20へデータを送信する。
ネットワーク制御部29は、システムボード1の結線表をネットワーク構成管理部28から取得する。さらに、ネットワーク制御部29は、実行されるジョブで行う演算ユニット20間の通信の情報をジョブ管理部27から取得する。そして、ネットワーク制御部29は、取得した通信の情報にしたがい結線表を用いて通信相手及び送信するデータを決定する。次に、ネットワーク制御部29は、送信を決定したデータの取得要求をメモリ制御部23へ出力する。その後、ネットワーク制御部29は、取得要求に応じたデータの入力をメモリ制御部23から受ける。そして、ネットワーク制御部29は、取得したデータを決定した通信相手に送信する。
また、ネットワーク制御部29は、データの受信の通知をインターコネクト装置31から受ける。そして、ネットワーク制御部29は、通信用バッファ30に格納された他の演算ユニット20から受信したデータを取得する。そして、ネットワーク制御部29は、取得したデータとともに書き込みの指示をメモリ制御部23へ出力する。
ネットワーク制御部29が行う演算ユニット20間の通信には、Allreduceの処理も含まれる。ネットワーク制御部29によるインターコネクトを介したAllreduceの処理については後で詳細に説明する。
通信用バッファ30は、演算ユニット20間のインターコネクトを介した通信における一時格納領域である。通信用バッファ30には、他の演算ユニット20へ送信されるデータが格納される。また、通信用バッファ30には、他の演算ユニット20から受信したデータが格納される。
インターコネクト装置31は、インターコネクトにより他の演算ユニット20のインターコネクト装置31と接続する。インターコネクト装置31は、他の演算ユニット20との間のインターコネクトを介した通信を行う。インターコネクト装置31は、ネットワーク制御部29からのデータの送信指示を受けて、通信用バッファ30からデータを読み出す。そして、インターコネクト装置31は、読み出したデータをネットワーク制御部29から指定された通信相手の演算ユニット20へ送信する。また、インターコネクト装置31は、他の演算ユニット20からデータを受信すると、受信したデータを通信用バッファ30に格納する。さらに、インターコネクト装置31は、データの受信をネットワーク制御部29に通知する。
DMAエンジン部25は、CPU2などを介すことなく、PCIのバスで接続された他の演算ユニット20が有するメモリ24へのアクセス制御を行う。DMAエンジン部25は、ジョブにおけるPCIを用いた通信の情報の入力をジョブ管理部27から受ける。そして、DMAエンジン部25は、ジョブにおけるPCIを用いた通信の情報にしたがい、メモリ制御部23へデータの読み出しの指示を行う。その後、DMAエンジン部25は、メモリ24から読み出されたデータの入力をメモリ制御部23から受ける。そして、DMAエンジン部25は、取得したデータを送信先の演算ユニット20のメモリ24へPCI制御部26及びPCIスイッチ3を介して送信する。
また、DMAエンジン部25は、DMAにより他の演算ユニット20のDMAエンジン部25から送信されたデータをPCI制御部26から受信する。そして、DMAエンジン部25は、受信したデータの書き込みをメモリ制御部23へ指示する。
メモリ制御部23は、接続されたメモリ24に対するデータの読み出し及び書き込みを制御する。メモリ制御部23は、DMAエンジン部25からの読み出しの指示にしたがいメモリ24からデータを読み出し、読み出したデータをDMAエンジン部25へ出力する。また、メモリ制御部23は、DMAエンジン部25からの書込みの指示にしたがいメモリ24へデータを書き込む。
また、メモリ制御部23は、ネットワーク制御部29からの読み出しの指示にしたがいメモリ24からデータを読み出し、読み出したデータをDMAエンジン部25へ出力する。また、メモリ制御部23は、ネットワーク制御部29からの書込みの指示にしたがいメモリ24へデータを書き込む。
次に、ネットワーク制御部29によるAllreduceの処理の詳細について説明する。本実施例に係る演算処理システムは、Halving操作及びDoubling操作を行うことでAllreduceの処理を実行する。以下では、Halving操作を単に「Halving」といい、Doubling操作を単に「Doubling」という。さらに、Allreduceの処理のことを単に「Allreduce」という。
図4は、ネットワーク制御部のブロック図である。ネットワーク制御部29は、図4に示すように、プロセスID割当部201、スレッド生成部202、統括制御部203、送受信データサイズ算出部204、対象データ決定部205、宛先決定部206及びデータ送信部207を有する。さらに、ネットワーク制御部29は、データ受信部208及び同期処理部210を有する。
ここで、ネットワーク制御部29が有する演算回路により、図4に例示した、プロセスID割当部201、スレッド生成部202、統括制御部203、送受信データサイズ算出部204及び対象データ決定部205の機能が実現される。また、その演算回路により、宛先決定部206、データ送信部207、データ受信部208及び同期処理部210の機能が実現される。
また、ネットワーク制御部29は、図3に示すように実際には通信用バッファ30及びインターコネクト装置31を介して他の演算ユニット20と通信を行うが、説明の都合上、通信用バッファ30及びインターコネクト装置31を省略して説明する。以下の説明では、説明対象とする演算ユニット20を、他の演算ユニット20と区別するため、自演算ユニットという。
プロセスID割当部201は、ネットワーク構成管理部28から結線表を取得する。そして、プロセスID割当部201は、結線表を用いて自演算ユニット及び自演算ユニットとともにハイパーキューブとなるように接続された他の演算ユニット20に0から数えて2n−1までの個数のプロセスIDを割り当てる。この場合nは、ハイパーキューブの次元である。このプロセスIDが、演算処理装置の「識別番号情報」の一例にあたる。
ここで、プロセスID割当部201は、図2で示した各ノードに割り当てられたインデックスと同様の規則によりプロセスIDの割り当てを行う。すなわち、本実施例に係る演算ユニット20は、2次元のハイパーキューブとなるように接続されており、プロセスID割当部201は、各演算ユニット20にプロセスIDとして00、01、10及び11を割り当てる。この場合、プロセスID割当部201は、1つのビットの値が異なるプロセスIDをインターコネクトで接続された隣り合う演算ユニット20に対して割り当てる。図5は、Halvingにおける処理の流れの概要を表す図である。プロセスID割当部201は、図5に示すプロセスIDを各演算ユニット20に割り当てる。ここで、図5における紙面にむかって縦方向に並んだ8つのボックスがブロックを表し、8つのブロックの組が1つのプロセスが有するデータ列にあたる。そして、図5における各ブロック内の番号は、各プロセスで算出されたデータ列を表す。ここで、図5では、1つのプロセスに含まれる各ブロックに対応するデータ列を同じ数字で表したが、これは演算を行ったプロセスが同じことを表す。実際には、各ブロックに対応するデータ列は、それぞれ異なる値を有することが一般的である。
その後、プロセスID割当部201は、各演算ユニット20に割り当てたプロセスIDの情報を統括制御部203へ出力する。また、プロセスID割当部201は、各演算ユニット20に割り当てたプロセスIDの情報をプロセスIDの割当対象である演算ユニット20に通知する。ここで、他の演算ユニット20からプロセスIDの通知を受ける演算ユニット20の場合、プロセスID割当部201は、他の演算ユニット20から各演算ユニット20に割り当てられたプロセスIDの通知を受ける。そして、プロセスID割当部201は、取得した各演算ユニット20に割り当てられたプロセスIDの情報をスレッド生成部202へ出力する。
スレッド生成部202は、プロセスID割当部201により各演算ユニット20に割り当てられたプロセスIDを統括制御部203から取得する。さらに、スレッド生成部202は、自己が搭載された演算ユニット20で処理するプロセスの入力を統括制御部203から受ける。そして、取得したプロセスの中でAllreduceの処理の実行が指示された場合、スレッド生成部202は、以下の処理を実行する。
スレッド生成部202は、自演算ユニットを含むハイパーキューブの次元を取得する。本実施例では、スレッド生成部202は、自演算ユニットが含まれるハイパーキューブの次元として2を取得する。そして、スレッド生成部202は、取得したプロセスが算出したデータ列をn×2n個のブロックに分割する。この場合nは、ハイパーキューブの次元である。すなわち、本実施例では、スレッド生成部202は、図5に示すようにプロセスのデータ列を8個のブロックに分ける。
さらに、スレッド生成部202は、ハイパーキューブをn次元とすると、生成したブロックを2n個ずつの組に分けてn個のスレッドを生成する。すなわち、本実施例では、スレッド生成部202は、図5に示すスレッドTh1及びTh2という2個のスレッドを生成する。また、スレッド生成部202は、各スレッドにnビットのサイクリックIDを割り当てる。具体的には、スレッド生成部202は、nビットのうちs(1≦s≦n)ビット目の値が1となり、他のビットの値が0であるn個のnビットのサイクリックIDを生成し、各スレッドに割り当てる。本実施例では、スレッド生成部202は、スレッドTh1にサイクリックIDとして「01」を割り当て、スレッドTh2にサイクリックIDとして「10」を割り当てる。その後、スレッド生成部202は、生成したスレッドTh1及びTh2の情報を、それぞれのスレッドTh1及びTh2に割り当てたサイクリックIDとともに統括制御部203へ出力する。このスレッド生成部202が、「分割部」の一例にあたる。そして、スレッドが、「グループ」の一例にあたる。
統括制御部203は、自演算ユニットを含む各演算ユニット20に割り当てられたプロセスID、及び、各ブロックに含まれるデータ列の入力をスレッド生成部202から受ける。そして、統括制御部203は、自演算ユニットを含む各演算ユニット20に割り当てられたプロセスIDをスレッド生成部202へ出力する。その後、統括制御部203は、スレッドTh1及びTh2の情報、スレッドTh1及びTh2に割り当てられたサイクリックIDの入力をスレッド生成部202から受ける。
そして、統括制御部203は、Allreduceの処理の開始時であれば、Halvingの実行を決定する。そして、統括制御部203は、自演算ユニットのプロセスID、スレッドTh1及びTh2の情報、スレッドTh1及びTh2に割り当てられたサイクリックID、並びに、各ブロックのデータ列を送受信データサイズ算出部204へ出力する。統括制御部203は、スレッドTh1及びTh2の情報、スレッドTh1及びTh2に割り当てられたサイクリックID、並びに、自演算ユニットのプロセスIDを宛先決定部206へ出力する。そして、統括制御部203は、Halvingの実行を送受信データサイズ算出部204及び宛先決定部206に指示する。
その後、統括制御部203は、通信の完了の通知をメモリ制御部23から受ける。そして、統括制御部203は、前回の通信においてHalvingの実行を指示した場合、演算ユニット20が含まれるハイパーキューブの次元数の回数、Halvingが実行されたか否かを判定する。本実施例では、2次元のハイパーキューブの構成であるので、統括制御部203は、Halvingが2回実行されたか否かを判定する。
例えば、2次元のハイパーキューブの構成を有する場合、スレッドTh1について1回目の通信では、図5の1回目の通信における実線矢印で示すように、各演算ユニット20からデータ列が送信される。具体的には、プロセスIDが00の演算ユニット20とプロセスIDが01の演算ユニット20とがデータを交換し、プロセスIDが10の演算ユニット20とプロセスIDが11の演算ユニット20とがデータを交換する。また、スレッドTh2について1回目の通信では、図5の1回目の通信における破線矢印で示すようにデータ列が送信される。すなわち、プロセスIDが00の演算ユニット20とプロセスIDが10の演算ユニット20とがデータを交換し、プロセスIDが01の演算ユニット20とプロセスIDが11の演算ユニット20とがデータを交換する。また、図5における一点鎖線の矢印は、各演算ユニット20が有するデータ列の変化を表す。このHalvingにおける送信データ及び送信先の決定については後で詳細に説明する。
演算ユニット20が含まれるハイパーキューブの次元数の回数のHalvingが実行されていない場合、統括制御部203は、次のHalvingの実行を送受信データサイズ算出部204及び宛先決定部206に指示する。
例えば、2次元のハイパーキューブの構成を有する場合、スレッドTh1について2回目の通信では、図5の2回目の通信における実線矢印で示すように、各演算ユニット20からデータ列が送信される。すなわち、プロセスIDが00の演算ユニット20とプロセスIDが10の演算ユニット20とがデータを交換し、プロセスIDが01の演算ユニット20とプロセスIDが11の演算ユニット20とがデータを交換する。また、スレッドTh2について2回目の通信では、図5の2回目の通信における破線矢印で示すようにデータ列が送信される。すなわち、プロセスIDが00の演算ユニット20とプロセスIDが01の演算ユニット20とがデータを交換し、プロセスIDが10の演算ユニット20とプロセスIDが11の演算ユニット20とがデータを交換する。これにより、各演算ユニット20は、スレッドTh1における異なるブロックのデータ列をまとめたデータ列を保持する。また、各演算ユニット20は、スレッドTh2における異なるブロックのデータ列をまとめたデータ列を保持する。
一方、ハイパーキューブの次元数の回数のHalvingが実行された場合、統括制御部203は、そのハイパーキューブに含まれない演算ユニット20との間でのAllreduceの処理を行うか否かを判定する。本実施例では、図1に示すように、異なるハイパーキューブに含まれる演算ユニット20との間でもAllreduceの処理を行う。そこで、統括制御部203は、外部トポロジでのAllreduceの処理の実行を決定する。そして、統括制御部203は、外部トポロジでのAllreduceの処理を外側接続処理実行部209に依頼する。その後、統括制御部203は、外部トポロジでのAllreduceの処理の完了通知を外側接続処理実行部209から受ける。
図6は、外部トポロジ間でのAllreducesまでの処理の流れの概要を表す図である。例えば、外部トポロジでのAllreduceの処理は、図6の太線矢印で示される方法で行われる。例えば、各演算ユニット20は、システムボード1間で同じプロセスIDが割り当てられたもの同士が通信を行い、データ列の受け渡しを行う。これにより、各演算ユニット20は、処理結果250で示すように外部トポロジでのHalvingの結果を合わせたデータ列を取得することができる。
外部トポロジでのAllreduceの処理の完了通知を外側接続処理実行部209から受けると、統括制御部203は、Doublingの実行を送受信データサイズ算出部204及び宛先決定部206に指示する。その後、通信の完了の通知をメモリ制御部23から受ける。そして、統括制御部203は、前回の通信においてDoublingの実行を指示した場合、演算ユニット20が含まれるハイパーキューブの次元数の回数、Doublingが実行されたか否かを判定する。本実施例では、2次元のハイパーキューブの構成であるので、統括制御部203は、Doublingが2回実行されたか否かを判定する。
図7は、Doublingにおける処理の流れの概要を表す図である。例えば、2次元のハイパーキューブの構成を有する場合、スレッドTh1についてDoublingの1回目の通信では、図7の4回目の通信における実線矢印で示すように、各演算ユニット20からデータ列が送信される。すなわち、プロセスIDが00の演算ユニット20とプロセスIDが10の演算ユニット20とがデータを交換し、プロセスIDが01の演算ユニット20とプロセスIDが11の演算ユニット20とがデータを交換する。また、スレッドTh2についてDoublingの1回目の通信では、図7の4回目の通信における破線矢印で示すようにデータ列が送信される。すなわち、プロセスIDが00の演算ユニット20とプロセスIDが01の演算ユニット20とがデータを交換し、プロセスIDが10の演算ユニット20とプロセスIDが11の演算ユニット20とがデータを交換する。
さらに、2次元のハイパーキューブの構成を有する場合、スレッドTh1についてDoublingの2回目の通信では、図7の5回目の通信における実線矢印で示すように、各演算ユニット20からデータ列が送信される。具体的には、プロセスIDが00の演算ユニット20とプロセスIDが01の演算ユニット20とがデータを交換し、プロセスIDが10の演算ユニット20とプロセスIDが11の演算ユニット20とがデータを交換する。また、スレッドTh2についてDoublingの2回目の通信では、図7の5回目の通信における破線矢印で示すようにデータ列が送信される。すなわち、プロセスIDが00の演算ユニット20とプロセスIDが10の演算ユニット20とがデータを交換し、プロセスIDが01の演算ユニット20とプロセスIDが11の演算ユニット20とがデータを交換する。これにより、図7に示すように、5回目の通信の後は、2次元のハイパーキューブに含まれる演算ユニット20の全てが、各ブロックにおいて同じ値のデータ列を有する。このDoublingにおける送信データ及び送信先の決定については後で詳細に説明する。
ここで、本実施例とは異なり、自演算ユニットが含まれるハイパーキューブに含まれる演算ユニット20間でAllreduceの処理が完結する場合もある。その場合、統括制御部203は、Halvingの完了後、直ぐにDoublingに移る。
演算ユニット20が含まれるハイパーキューブの次元数の回数のDoublingが実行されていない場合、統括制御部203は、次のDoublingの実行を送受信データサイズ算出部204及び宛先決定部206に指示する。
これに対して、演算ユニット20が含まれるハイパーキューブの次元数の回数のDoublingが実行された場合、統括制御部203は、内側トポロジでの同期処理の実行を同期処理部210へ通知する。その後、統括制御部203は、内部トポロジでの同期の完了の通知を同期処理部210から受けると、外部トポロジでの同期処理の実行を同期処理部210へ通知する。その後、統括制御部203は、外部トポロジでの同期の完了の通知を同期処理部210から受けると、Allreduceの処理が完了したと判定する。そして、統括制御部203は、ジョブ管理部27にAllreduceの処理の完了を通知する。
送受信データサイズ算出部204は、スレッドTh1及びTh2の情報、スレッドTh1及びTh2に割り当てられたサイクリックID、並びに、各ブロックのデータ列の入力を統括制御部203から受ける。そして、送受信データサイズ算出部204は、送受信を行うデータサイズを算出する。
演算ユニット20がn次元のハイパーキューブとなるように接続された場合、Halvingの実行を指示されると、送受信データサイズ算出部204は、初回の通信では2n−1個のデータ列のブロックを送受信するデータサイズとする。その後、送受信データサイズ算出部204は、通信回数が進むにしたがい送受信するブロックを1/2倍したものをデータサイズとする。例えば、2回目の通信では、送受信データサイズ算出部204は、(2n−1)×1/2個のブロックを送受信するデータサイズとする。本実施例では、送受信データサイズ算出部204は、初回の通信における送受信するデータサイズを2個のブロックとする。さらに、送受信データサイズ算出部204は、2回目の通信における送受信するデータサイズを1個のブロックとする。その後、送受信データサイズ算出部204は、決定した送受信するデータサイズを対象データ決定部205へ出力する。また、送受信データサイズ算出部204は、スレッドTh1及びTh2の情報、スレッドTh1及びTh2に割り当てられたサイクリックID、並びに、各ブロックのデータ列を対象データ決定部205へ出力する。
一方、Doublingの実行を指示された場合、送受信データサイズ算出部204は、初回の通信では1個のデータ列のブロックを送受信するデータサイズとする。その後、送受信データサイズ算出部204は、通信回数が進むにしたがい送受信するブロックを2倍したものをデータサイズとする。例えば、2回目の通信では、送受信データサイズ算出部204は、2個のブロックを送受信するデータサイズとする。本実施例では、送受信データサイズ算出部204は、初回の通信における送受信するデータサイズを1個のブロックとする。さらに、送受信データサイズ算出部204は、2回目の通信における送受信するデータサイズを2個のブロックとする。その後、送受信データサイズ算出部204は、決定した送受信するデータサイズを対象データ決定部205へ出力する。また、送受信データサイズ算出部204は、スレッドTh1及びTh2の情報、スレッドTh1及びTh2に割り当てられたサイクリックID、並びに、各ブロックのデータ列を対象データ決定部205へ出力する。
対象データ決定部205は、送受信するデータサイズ、スレッドTh1及びTh2の情報、スレッドTh1及びTh2に割り当てられたサイクリックID、並びに、各ブロックのデータ列の入力を送受信データサイズ算出部204から受ける。対象データ決定部205は、各ブロックの並び順を固定する。対象データ決定部205は、このブロックの並び順をAllreduceの処理が完了するまで維持する。
図8は、スレッドTh1側の送受信するデータブロックの決定方法を説明するための図である。例えば、対象データ決定部205は、図8に示す順序でブロックの並び順を固定する。以下では、図8のように並び順が固定されたブロックの関係について、紙面に向かった場合の上下方向を用いて説明する。対象データ決定部205は、各スレッドTh1及びTh2について送受信するデータ列を決定する。以下に、対象データ決定部205による送受信するデータの決定方法の詳細について説明する。
Halvingの実行を指示された場合、対象データ決定部205は、送受信するデータサイズでスレッドTh1及びTh2を分割して対象判定用グループを生成する。対象データ決定部205は、1回目の通信ではスレッドTh1及びTh2を2分割し、2回目以降の通信では通信回数が増えるにしたがい前回の通信の2倍の個数でスレッドTh1及びTh2を分割する。例えば、2回目の通信であれば、対象データ決定部205は、スレッドTh1及びTh2を4分割する。
本実施例では、対象データ決定部205は、演算ユニット20のプロセスIDが00であれば、1回目の通信において、図8における対象判定用グループ301及び302にスレッドTh1を分ける。また、2回目の通信において、対象データ決定部205は、対象判定用グループ305及び306を含む4つの対象判定用グループにスレッドTh1を分ける。
同様に、演算ユニット20のプロセスIDが01であれば、対象データ決定部205は、1回目の通信において、図8における対象判定用グループ311及び312にスレッドTh1を分ける。また、2回目の通信において、対象データ決定部205は、対象判定用グループ315及び316を含む4つの対象判定用グループにスレッドTh1を分ける。以下では、対象判定用グループの並びも、ブロックの並びに対応させて紙面に向いて上下方向で説明する。
次に、対象データ決定部205は、生成した対象判定用グループに送受信対象インデックスを割り振る。ここで、対象データ決定部205は、k回目の送受信対象インデックスとして二進数で表されるkビット(k桁)の数を順次増加するように上から下に向けて対象判定用グループに割り当てる。対象データ決定部205は、1回目の通信であれば1ビットで表される2進数の数を順次増加するように送受信対象インデックスとして対象判定用グループに割り当てる。また、2回目の通信であれば、対象データ決定部205は、2ビットで表される2進数の数を順次増加するように送受信対象インデックスとして対象判定用グループに割り当てる。
本実施例では、1回目の通信において、対象データ決定部205は、演算ユニット20のプロセスIDが00であれば、図8に示すように、対象判定用グループ301に送受信対象インデックスとして「0」を割り当てる。また、対象データ決定部205は、対象判定用グループ302に送受信対象インデックスとして「1」を割り当てる。
同様に、演算ユニット20のプロセスIDが01であれば、対象データ決定部205は、1回目の通信において、対象判定用グループ311に送受信対象インデックスとして「0」を割り当てる。また、対象データ決定部205は、対象判定用グループ312に送受信対象インデックスとして「1」を割り当てる。
また、2回目の通信において、対象データ決定部205は、演算ユニット20のプロセスIDが00であれば、対象判定用グループ305に送受信対象インデックスとして「00」を割り当てる。また、対象データ決定部205は、対象判定用グループ306に送受信対象インデックスとして「01」を割り当てる。また、対象データ決定部205は、下に続く他の2つ対象判定用グループにそれぞれ送受信対象インデックスとして「10」及び「11」を割り当てる。
同様に、演算ユニット20のプロセスIDが01であれば、対象データ決定部205は、2回目の通信において、1番上の対象判定用グループに送受信対象インデックスとして「00」を割り当てる。また、対象データ決定部205は、その下の対象判定用グループに送受信対象インデックスとして「01」を割り当てる。さらに、対象データ決定部205は、対象判定用グループ315に送受信対象インデックスとして「10」を割り当て、対象判定用グループ316に送受信対象インデックスとして「11」を割り当てる。
次に、対象データ決定部205は、送受信対象グループの中から送信対象とする領域及び受信対象とする領域を決定する。ここで、受信対象とする領域とは、受信データを用いた演算対象とするデータの領域である。
具体的には、対象データ決定部205は、1回目の通信では、プロセスIDの1ビット目と送受信対象インデックスとが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部205は、プロセスIDの1ビット目を反転した値と送受信対象インデックスが同じ値である対象判定用グループを受信対象の領域とする。
例えば、プロセスIDが00であれば1ビット目が「0」であるので、対象データ決定部205は、送受信対象インデックスが「0」である対象判定用グループ301を受信対象の領域とする。また、対象データ決定部205は、送受信対象インデックスが「1」である対象判定用グループ302を送信対象の領域とする。また、プロセスIDが01であれば1ビット目が「1」であるので、対象データ決定部205は、送受信対象インデックスが「1」である対象判定用グループ312を受信対象の領域とする。また、対象データ決定部205は、送受信対象インデックスが「0」である対象判定用グループ311を送信対象の領域とする。
そして、対象データ決定部205は、受信対象の領域とした対象判定用グループに対応するブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、送信対象の領域とした対象判定用グループに対応するブロックのデータ列を送信対象のデータとする。
例えば、プロセスIDが00の演算ユニット20の対象データ決定部205は、1回目の通信において、対象判定用グループ301に対応する領域303に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、対象判定用グループ302に対応する領域304に含まれるブロックのデータ列を送信対象のデータとする。
また、プロセスIDが01の演算ユニット20の対象データ決定部205は、1回目の通信において、対象判定用グループ312に対応する領域314に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、対象判定用グループ311に対応する領域313に含まれるブロックのデータ列を送信対象のデータとする。
次に、2回目の通信では、対象データ決定部205は、プロセスIDの1ビット目の値と送受信対象インデックスの2ビット目の値とが同じ値である対象判定用グループを送受信対象の対象判定用グループとする。言い換えれば、前回の通信で受信対象の領域に含まれる対象判定用グループが今回の通信における送受信対象の対象判定用グループとなる。さらに、対象データ決定部205は、送受信対象の対象判定用グループの中から、プロセスIDの2ビット目の値と送受信対象インデックスの1ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部205は、プロセスIDの2ビット目を反転した値と送受信対象インデックスの1ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。
例えば、プロセスIDが00であれば1ビット目が「0」であるので、対象データ決定部205は、送受信対象インデックスの2ビット目が「0」である対象判定用グループ305及び306を送受信対象の対象判定用グループとする。そして、プロセスIDが00であれば2ビット目が「0」であるので、対象データ決定部205は、送受信対象インデックスの1ビット目が「0」である対象判定用グループ305を受信対象の領域とする。また、対象データ決定部205は、送受信対象インデックスが「1」である対象判定用グループ306を送信対象の領域とする。
また、プロセスIDが01であれば1ビット目が「1」であるので、対象データ決定部205は、送受信対象インデックスの2ビット目が「1」である対象判定用グループ315及び316を送受信対象の対象判定用グループとする。そして、プロセスIDが01であれば2ビット目が「0」であるので、対象データ決定部205は、送受信対象インデックスの1ビット目が「0」である対象判定用グループ315を受信対象の領域とする。また、対象データ決定部205は、送受信対象インデックスが「1」である対象判定用グループ316を送信対象の領域とする。
そして、対象データ決定部205は、受信対象の領域とした対象判定用グループに対応するブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、送信対象の領域とした対象判定用グループに対応するブロックのデータ列を送信対象のデータとする。
例えば、プロセスIDが00の演算ユニット20の対象データ決定部205は、2回目の通信において、対象判定用グループ305に対応する領域307に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、対象判定用グループ306に対応する領域308に含まれるブロックのデータ列を送信対象のデータとする。また、プロセスIDが01の演算ユニット20の対象データ決定部205は、2回目の通信において、対象判定用グループ315に対応する領域317に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、対象判定用グループ316に対応する領域318に含まれるブロックのデータ列を送信対象のデータとする。
本実施例では、2次元のハイパーキューブの場合であるので、2回目の通信でHalvingが完了する。ただし、3次元以上のハイパーキューブとなるように接続された場合、さらにHalvingの通信が継続する。p回目の通信において、スレッドTh1に関して、対象データ決定部205は、以下のように送信対象及び受信対象の領域を決定する。対象データ決定部205は、プロセスIDの1ビット目からp−1ビット目までの値を並び順を逆にした数列と送受信対象インデックスの2ビット目からpビット目までの値を並べた数列とが一致する対象判定用グループを送受信対象の対象判定用グループとする。そして、対象データ決定部205は、送受信対象の対象判定用グループの中から、プロセスIDのpビット目の値と送受信対象インデックスの1ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部205は、プロセスIDのpビット目を反転した値と送受信対象インデックスの1ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。
すなわち、プロセスIDの1ビット目からpビット目までの値の並び順を逆にした数列と送受信対象インデックスの1ビット目からpビット目までの値を並べた数列とが一致する対象判定用グループが、受信対象の領域となる。また、プロセスIDの1ビット目からpビット目までの値の並び順を逆にした数列の最下位ビットを反転させた数列と送受信対象インデックスのpビット目から1ビット目までの値を並べた数列とが一致する対象判定用グループが、送信対象の領域となる。
図9は、2次元のハイパーキューブに含まれる4つの演算ユニットによるスレッドTh1に関するHalving全体を表す図である。図9において、実線で囲われたブロックが受信対象のデータである。また、破線で囲われたブロックが送信対象のデータである。図9の紙面に向かって右側が各演算ユニット20において送受信が行われるデータにあたるブロックを表し、左側が送信対象及び受信対象の領域を表す。
ハイパーキューブに含まれる各演算ユニット20の対象データ決定部205は、通信毎にスレッドTh1に関する送信対象のデータ及び受信対象のデータを図9に示すように選択する。そして、各演算ユニット20の対象データ決定部205は、スレッドTh1に関して、図9に示す送信対象のデータを送信し、受信データ及び図9に示す受信対象のデータを用いて演算を行うことを繰り返す。
また、スレッドTh2に関して、対象データ決定部205は、送受信するデータサイズでスレッドTh2を分割して対象判定用グループを生成する。対象データ決定部205は、1回目の通信ではスレッドTh2を2分割し、2回目以降の通信では通信回数が増えるにしたがい前回の通信の2倍の個数でスレッドTh2を分割する。例えば、2回目の通信であれば、対象データ決定部205は、スレッドTh2を4分割する。図10は、HalvingにおけるスレッドTh2側の送受信するデータブロックの決定方法を説明するための図である。
例えば、本実施例では、対象データ決定部205は、演算ユニット20のプロセスIDが00であれば、1回目の通信において、図10における対象判定用グループ331及び332にスレッドTh2を分ける。また、2回目の通信において、対象データ決定部205は、対象判定用グループ335及び336を含む4つの対象判定用グループにスレッドTh2を分ける。同様に、演算ユニット20のプロセスIDが01であれば、1回目の通信において、対象データ決定部205は、図10における対象判定用グループ341及び342にスレッドTh2を分ける。また、2回目の通信において、対象データ決定部205は、対象判定用グループ345及び346を含む4つの対象判定用グループにスレッドTh2を分ける。
次に、対象データ決定部205は、スレッドTh1の場合と同様に、生成した対象判定用グループに送受信対象インデックスを割り振る。本実施例では、1回目の通信において、対象データ決定部205は、演算ユニット20のプロセスIDが00であれば、図10に示すように、対象判定用グループ331に送受信対象インデックスとして「0」を割り当てる。また、対象データ決定部205は、対象判定用グループ332に送受信対象インデックスとして「1」を割り当てる。
同様に、演算ユニット20のプロセスIDが01であれば、対象データ決定部205は、1回目の通信において、対象判定用グループ341に送受信対象インデックスとして「0」を割り当て、対象判定用グループ342に送受信対象インデックスとして「1」を割り当てる。
また、2回目の通信において、対象データ決定部205は、演算ユニット20のプロセスIDが00であれば、対象判定用グループ335に送受信対象インデックスとして「00」を割り当てる。また、対象データ決定部205は、対象判定用グループ336に送受信対象インデックスとして「01」を割り当てる。また、対象データ決定部205は、下に続く他の2つ対象判定用グループにそれぞれ送受信対象インデックスとして「10」及び「11」を割り当てる。
同様に、演算ユニット20のプロセスIDが01であれば、対象データ決定部205は、2回目の通信において、1番上の対象判定用グループに送受信対象インデックスとして「00」を割り当てる。また、対象データ決定部205は、その下の対象判定用グループに送受信対象インデックスとして「01」を割り当てる。さらに、対象データ決定部205は、対象判定用グループ345に送受信対象インデックスとして「10」を割り当て、対象判定用グループ346に送受信対象インデックスとして「11」を割り当てる。
次に、対象データ決定部205は、送受信対象グループの中から送信対象とする領域及び受信対象とする領域を決定する。具体的には、対象データ決定部205は、スレッドTh2のサイクリックIDにおいて値が1のビットの位置を確認し、値が1のビットの番号を並び替えの基準とする。本実施例では、対象データ決定部205は、2ビット目の値が1であることを確認し、2を並び替えの基準とする。
対象データ決定部205は、1回目の通信では、プロセスIDの並び替えの基準である2ビット目と送受信対象インデックスとが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部205は、プロセスIDの2ビット目を反転した値と送受信対象インデックスが同じ値である対象判定用グループを受信対象の領域とする。
例えば、プロセスIDが00であれば2ビット目が「0」であるので、対象データ決定部205は、送受信対象インデックスが「0」である対象判定用グループ331を受信対象の領域とする。また、対象データ決定部205は、送受信対象インデックスが「1」である対象判定用グループ332を送信対象の領域とする。また、プロセスIDが01であれば2ビット目が「0」であるので、対象データ決定部205は、送受信対象インデックスが「0」である対象判定用グループ341を受信対象の領域とする。また、対象データ決定部205は、送受信対象インデックスが「1」である対象判定用グループ342を送信対象の領域とする。
そして、対象データ決定部205は、受信対象の領域とした対象判定用グループに対応するブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、送信対象の領域とした対象判定用グループに対応するブロックのデータ列を送信対象のデータとする。
例えば、プロセスIDが00の演算ユニット20の対象データ決定部205は、1回目の通信において、対象判定用グループ331に対応する領域333に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、対象判定用グループ332に対応する領域334に含まれるブロックのデータ列を送信対象のデータとする。
また、プロセスIDが01の演算ユニット20の対象データ決定部205は、1回目の通信において、対象判定用グループ341に対応する領域343に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、対象判定用グループ342に対応する領域344に含まれるブロックのデータ列を送信対象のデータとする。この1回目の通信において対象データ決定部205が送信対象のデータとして決定したブロックに含まれるデータ列が、「第1データブロック」の一例にあたる。
次に、2回目の通信では、対象データ決定部205は、プロセスIDの並び替えの基準である2ビット目の値と送受信対象インデックスの2ビット目の値とが同じ値である対象判定用グループを送受信対象の対象判定用グループとする。言い換えれば、前回の通信で受信対象の領域に含まれる対象判定用グループが今回の通信における送受信対象の対象判定用グループとなる。さらに、対象データ決定部205は、送受信対象の対象判定用グループの中から、プロセスIDの1ビット目の値と送受信対象インデックスの1ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部205は、プロセスIDの1ビット目を反転した値と送受信対象インデックスの1ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。
例えば、プロセスIDが00であれば2ビット目が「0」であるので、対象データ決定部205は、送受信対象インデックスの2ビット目が「0」である対象判定用グループ335及び336を送受信対象の対象判定用グループとする。そして、プロセスIDが00であれば1ビット目が「0」であるので、対象データ決定部205は、送受信対象インデックスの1ビット目が「0」である対象判定用グループ335を受信対象の領域とする。また、対象データ決定部205は、送受信対象インデックスが「1」である対象判定用グループ336を送信対象の領域とする。
また、プロセスIDが01であれば2ビット目が「0」であるので、対象データ決定部205は、送受信対象インデックスの2ビット目が「0」である対象判定用グループ345及び346を送受信対象の対象判定用グループとする。そして、プロセスIDが01であれば1ビット目が「1」であるので、対象データ決定部205は、送受信対象インデックスの1ビット目が「1」である対象判定用グループ346を受信対象の領域とする。また、対象データ決定部205は、送受信対象インデックスが「0」である対象判定用グループ345を送信対象の領域とする。
そして、対象データ決定部205は、受信対象の領域とした対象判定用グループに対応するブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、送信対象の領域とした対象判定用グループに対応するブロックのデータ列を送信対象のデータとする。
例えば、プロセスIDが00の演算ユニット20の対象データ決定部205は、2回目の通信において、対象判定用グループ335に対応する領域337に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、対象判定用グループ336に対応する領域338に含まれるブロックのデータ列を送信対象のデータとする。また、プロセスIDが01の演算ユニット20の対象データ決定部205は、2回目の通信において、対象判定用グループ346に対応する領域348に含まれるブロックのデータ列を受信対象のデータとする。また、対象データ決定部205は、対象判定用グループ345に対応する領域347に含まれるブロックのデータ列を送信対象のデータとする。この2回目の通信において、対象データ決定部205が送信対象のデータとして決定したブロックに含まれるデータ列が、「第2データブロック」の一例にあたる。
本実施例では、演算ユニット20が2次元のハイパーキューブとなるように接続された場合であるので、スレッドTh1の場合と同様に2回目の通信でHalvingが完了する。ただし、3次元以上のハイパーキューブの場合、さらにHalvingの通信が継続する。p回目の通信において、対象データ決定部205は、スレッドTh2に関して、プロセスIDの並び替えの基準である2ビット目からpビット目までの値を並び順を逆にした数列を生成する。対象データ決定部205は、生成した数列と送受信対象インデックスのpビット目から2ビット目までの値を並べた数列とが一致する対象判定用グループを送受信対象の対象判定用グループとする。そして、対象データ決定部205は、送受信対象の対象判定用グループの中から、プロセスIDの1ビット目の値と送受信対象インデックスの1ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部205は、プロセスIDのpビット目を反転した値と送受信対象インデックスの1ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。
このp回目の通信における送信対象及び受信対象の領域は、プロセスIDの並び替えの基準の1つ下の1ビット目の値をpビット目の次のビットに移動し、ビットの番号を1〜pに振り直した状態のpビットの並び替え数列を用いて表現可能である。すなわち、この並び替え数列の1ビット目からpビット目までの値を並び順を逆にした数列と送受信対象インデックスの1ビット目からpビット目までの値を並べた数列とが一致する対象判定用グループが、受信対象の領域となる。また、この並び替え数列の1ビット目からpビット目までの値を並び順を逆にした数列の最下位ビットを反転させた数列と送受信対象インデックスの1ビット目からpビット目までの値を並べた数列とが一致する対象判定用グループが、送信対象の領域となる。
さらに、n次元のハイパーキューブの構成を有する場合、スレッドの数がn個となる。対象データ決定部205は、n個のスレッドそれぞれに関して送信対象及び受信対象のデータの決定を行う。そこで、スレッドThq(1≦q≦n)の場合について考える。対象データ決定部205は、スレッドThqのサイクリックIDにおいて値が1のビットの位置を確認し、値が1のビットの番号を並び替えの基準とする。ここでは、対象データ決定部205は、qビット目の値が1であることを確認し、qを並び替えの基準とする。
この場合、並び替え数列は、プロセスIDの1番目のビットから並び替えの基準の1つ下のq−1番目のビットまでの値の数列をpビット目の隣、すなわちp−1ビット目と反対側に移動し、ビットの番号を1〜pに振り直した状態のpビットの数列である。そして、この並び替え数列の1ビット目からpビット目までの値を並び順を逆にした数列と送受信対象インデックスの1ビット目からpビット目までの値を並べた数列とが一致する対象判定用グループが、受信対象の領域となる。また、この並び替え数列の1ビット目からpビット目までの値を並び順を逆にした数列の最下位ビットを反転させた数列と送受信対象インデックスの1ビット目からpビット目までの値を並べた数列とが一致する対象判定用グループが、送信対象の領域となる。
図11は、2次元のハイパーキューブに含まれる4つの演算ユニットによるスレッドTh2に関するHalvingを表す図である。図11において、実線で囲われたブロックが受信対象のデータである。また、破線で囲われたブロックが送信対象のデータである。図11の紙面に向かって右側が各演算ユニット20において送受信が行われるデータにあたるブロックを表し、左側が送信対象及び受信対象の領域を表す。
各演算ユニット20の対象データ決定部205は、通信毎にスレッドTh2に関する送信対象のデータ及び受信対象のデータを図11に示すように選択する。そして、各演算ユニット20の対象データ決定部205は、スレッドTh2に関して、図11に示す送信対象のデータを送信し、受信データ及び図11に示す受信対象のデータを用いて演算を行うことを繰り返す。
これに対して、Doublingの実行を指示された場合、対象データ決定部205は、Halvingのときとは逆の手順を辿るように送受信対象のデータを決定する。例えば、対象データ決定部205は、以下の方法で送受信対象のデータを決定する。
送受信するデータサイズでスレッドTh1及びTh2を分割して対象判定用グループを生成する。具体的には、n次元のハイパーキューブの構成を有する場合、対象データ決定部205は、Doublingにおける1回目の通信ではスレッドを2n分割する。2回目以降の通信では、対象データ決定部205は、通信回数が増えるにしたがい前回の通信の1/2倍の個数でスレッドTh1及びTh2を分割する。例えば、2回目の通信であれば、対象データ決定部205は、スレッドを2n−1分割する。
次に、対象データ決定部205は、Halvingの場合と同様に、生成した対象判定用グループに送受信対象インデックスを割り振る。
n+1−p回目の通信において、スレッドTh1に関して、対象データ決定部205は、以下のように送信対象及び受信対象の領域を決定する。対象データ決定部205は、プロセスIDの1ビット目からp−1ビット目までの値を並び順を逆にした数列と送受信対象インデックスの2ビット目からpビット目までの値を並べた数列とが一致する対象判定用グループを送受信対象の対象判定用グループとする。そして、対象データ決定部205は、送受信対象の対象判定用グループの中から、プロセスIDのpビット目を反転させた値と送受信対象インデックスの1ビット目の値とが同じ値である対象判定用グループを受信対象の領域とする。また、対象データ決定部205は、プロセスIDのpビット目の値と送受信対象インデックスの1ビット目の値とが同じ値である対象判定用グループを送信対象の領域とする。
すなわち、プロセスIDの1ビット目からpビット目までの値の並び順を逆にした数列と送受信対象インデックスの1ビット目からpビット目までの値を並べた数列とが一致する対象判定用グループが、送信対象の領域となる。また、プロセスIDの1ビット目からpビット目までの値の並び順を逆にした数列の最下位ビットを反転させた数列と送受信対象インデックスのpビット目から1ビット目までの値を並べた数列とが一致する対象判定用グループが、受信対象の領域となる。
さらに、n次元のハイパーキューブの構成を有する場合、スレッドの数がn個となる。対象データ決定部205は、n個のスレッドそれぞれに関して送信対象及び受信対象のデータの決定を行う。そこで、スレッドThq(1≦q≦n)の場合のn+1−p回目の通信について考える。対象データ決定部205は、スレッドThqのサイクリックIDにおいて値が1のビットの位置を確認し、値が1のビットの番号を並び替えの基準とする。ここでは、対象データ決定部205は、qビット目の値が1であることを確認し、qを並び替えの基準とする。
この場合、並び替え数列は、プロセスIDの1番目のビットから並び替えの基準の1つ下のq−1番目のビットまでの値の数列をpビット目の隣、すなわちp−1ビット目と反対側に移動し、ビットの番号を1〜pに振り直した状態のpビットの数列である。そして、この並び替え数列の1ビット目からpビット目までの値を並び順を逆にした数列と送受信対象インデックスの1ビット目からpビット目までの値を並べた数列とが一致する対象判定用グループが、受信対象の領域となる。また、この並び替え数列の1ビット目からpビット目までの値を並び順を逆にした数列の最下位ビットを反転させた数列と送受信対象インデックスの1ビット目からpビット目までの値を並べた数列とが一致する対象判定用グループが、送信対象の領域となる。
図4に戻って説明を続ける。対象データ決定部205は、スレッドTh1及びTh2における送信対象のデータの情報をデータ送信部207へ出力する。また、対象データ決定部205は、スレッドTh1及びTh2における受信対象のデータの情報をデータ受信部208へ出力する。この対象データ決定部205が、「データ選択部」の一例にあたる。
宛先決定部206は、スレッドTh1及びTh2の情報、スレッドTh1及びTh2に割り当てられたサイクリックID、並びに、自演算ユニットのプロセスIDの入力を統括制御部203から受ける。そして、宛先決定部206は、スレッド毎に以下の処理を実行して送信先の演算ユニット20を決定する。以下では、各スレッドに対して宛先決定部206が行う処理について説明する。図12は、宛先決定部による宛先決定の処理を説明するための図である。
Halvingの実行を指定された1回目の通信の場合、宛先決定部206は、プロセスIDとそのスレッドに割り当てられたサイクリックID(CyclicID)との排他的論理和を求める。そして、宛先決定部206は、求めた排他的論理和を送信先のプロセスIDとする演算ユニット20をそのスレッドにおけるデータの送信先とする。
例えば、1回目の通信であれば、図12に示すようにプロセスIDが00の場合、宛先決定部206は、プロセスIDである「00」とスレッドTh1に割り当てられたサイクリックIDである「01」との排他的論理和を求め、値として「01」を取得する。そして、宛先決定部206は、スレッドTh1のデータの送信先をプロセスIDが01である演算ユニット20に決定する。また、宛先決定部206は、プロセスIDである「00」とスレッドTh2に割り当てられたサイクリックIDである「10」との排他的論理和を求め、値として「10」を取得する。そして、宛先決定部206は、スレッドTh2のデータの送信先をプロセスIDが10である演算ユニット20に決定する。
2回目の通信の場合、宛先決定部206は、各スレッドに割り当てられたサイクリックIDの1の位置を1つ左にシフトさせる。このサイクリックIDの1の位置を1つ左にシフトさせる処理が、「1つシフトさせる」処理の一例にあたる。すなわち、宛先決定部206は、各スレッドに割り当てられたサイクリックIDの1の位置を1ビット上位へずらす。この時、宛先決定部206は、最上位ビットの値が1であるサイクリックIDの場合、1ビット目の値を1にする。例えば、宛先決定部206は、スレッドTh1のサイクリックIDを「01」から「10」に変更する。また、宛先決定部206は、スレッドTh2のサイクリックIDを「10」から「01」に変更する。
次に、宛先決定部206は、プロセスIDとそのスレッドの変更後のサイクリックIDとの排他的論理和を求める。そして、宛先決定部206は、求めた排他的論理和を送信先のプロセスIDとする演算ユニット20をそのスレッドにおけるデータの送信先とする。
例えば、2回目の通信であれば、プロセスIDが00の場合、宛先決定部206は、プロセスIDである「00」とスレッドTh1の変更後のサイクリックIDである「10」との排他的論理和を求め、値として「10」を取得する。そして、宛先決定部206は、スレッドTh1のデータの送信先をプロセスIDが10である演算ユニット20に決定する。また、宛先決定部206は、プロセスIDである「00」とスレッドTh2の変更後のサイクリックIDである「01」との排他的論理和を求め、値として「01」を取得する。そして、宛先決定部206は、スレッドTh2のデータの送信先をプロセスIDが01である演算ユニット20に決定する。
図13は、2次元ハイパーキューブにおける宛先の遷移を説明するための図である。図13の各丸が演算ユニット20を表し、各丸に付した番号が各演算ユニット20のプロセスIDを表す。1回目の通信では、実線矢印401で示すように、プロセスIDが00の演算ユニット20は、プロセスIDが01の演算ユニット20をスレッドTh1のデータの送信先とする。また、破線矢印402で示すように、プロセスIDが00の演算ユニット20は、プロセスIDが10の演算ユニット20をスレッドTh2のデータの送信先とする。次に、2回目の通信では、実線矢印403で示すように、プロセスIDが00の演算ユニット20は、プロセスIDが10の演算ユニット20をスレッドTh1のデータの送信先とする。また、破線矢印404で示すように、プロセスIDが00の演算ユニット20は、プロセスIDが01の演算ユニット20をスレッドTh2のデータの送信先とする。
このように、演算ユニット20は、1回の通信でスレッド毎に異なる演算ユニット20をデータの送信先とする。これにより、演算ユニット20は、1回の通信で隣接する全ての演算ユニット20へデータの送信を行え、使用しない経路の発生を抑制でき、帯域を十分に使うことが可能となる。
これに対して、Doublingの実行を指定された1回目の通信の場合、宛先決定部206は、Halvingの最後の通信で用いたサイクリックIDを取得する。次に、プロセスIDとそのスレッドに割り当てられたサイクリックIDとの排他的論理和を求める。そして、宛先決定部206は、求めた排他的論理和を送信先のプロセスIDとする演算ユニット20をそのスレッドにおけるデータの送信先とする。
この後、宛先決定部206は、前回の通信において各スレッドで用いたサイクリックIDの1の位置を1つ右にシフトさせる。すなわち、宛先決定部206は、前回の通信において各スレッドで用いたプロセスIDの1の位置を1ビット下位へずらす。そして、宛先決定部206は、プロセスIDとそのスレッドの変更後のサイクリックIDとの排他的論理和を求める。そして、宛先決定部206は、求めた排他的論理和を送信先のプロセスIDとする演算ユニット20をそのスレッドにおけるデータの送信先とする。
このサイクリックIDが、「巡回番号情報」の一例にあたる。そして、サイクリックIDの1の位置を1つ右シフトさせる処理が、「巡回番号情報を1つシフトさせる」処理の一例にあたる。また、宛先決定部206による排他的論理和により求められる送信先となるプロセスIDが、「各演算処理装置に割り当てられた識別番号情報と各グループに割り当てられた巡回番号情報との排他的論理和演算により得られる宛先番号情報」の一例にあたる。すなわち、宛先決定部206は、図12に示すように、巡回番号情報であるサイクリックIDと識別番号情報であるプロセスIDとの排他的論理和演算を行い、排他的論理和演算により宛先番号情報であるプロセスIDを算出する。そして、宛先決定部206は、算出したプロセスIDを図13に示す各通信における送信先の演算ユニット20のプロセスIDとする。
次に、宛先決定部206は、サイクリックIDを左にシフトさせてデータの送信先となる演算ユニット20を選ぶことで、各スレッドが保持するデータと重ならないデータを有する演算ユニット20をスレッド毎のデータの送信先とすることができる。この各スレッドが保持するデータと重ならないデータを有する演算ユニット20が、「補完相手の演算処理装置」の一例にあたる。
さらに、ここで説明した宛先決定部20による宛先決定の処理が、「識別番号情報と巡回番号情報との排他的論理和演算により得られる宛先番号情報を基に、隣接する演算処理装置の中から異なる演算処理装置を送信先として選択する」処理の一例にあたる。
図4に戻って説明を続ける。宛先決定部206は、スレッドTh1及びTh2のデータの送信先の情報をデータ送信部207へ出力する。この宛先決定部206が、「送信先選択部」の一例にあたる。
データ送信部207は、スレッドTh1及びTh2における送信対象のデータの情報の入力を対象データ決定部205から受ける。また、データ送信部207は、スレッドTh1及びTh2のデータの送信先の情報を宛先決定部206から受ける。
データ送信部207は、取得したスレッドTh1及びTh2における送信対象のデータの情報で指定されたブロックに格納されたデータ列の取得をメモリ制御部23に依頼する。その後、データ送信部207は、取得したスレッドTh1及びTh2における送信対象のデータの情報で指定されたブロックに格納されたデータ列の入力をメモリ制御部23から受ける。この取得したデータが、スレッドTh1及びTh2における送信データである。そして、データ送信部207は、スレッドTh1における送信データをスレッドTh1のデータの送信先に対して送信する。また、データ送信部207は、スレッドTh2における送信データをスレッドTh2のデータの送信先に対して送信する。
例えば、Halvingの実行の際の1回目の通信において、自演算ユニットのプロセスIDが00であれば、データ送信部207は、図8における領域304に含まれるブロックのデータ列をプロセスIDが01の演算ユニット20へ送信する。また、データ送信部207は、図10における領域334に含まれるブロックのデータ列をプロセスIDが10の演算ユニット20へ送信する。また、2回目の通信において、自演算ユニットのプロセスIDが00であれば、データ送信部207は、図8における領域308に含まれるブロックのデータ列をプロセスIDが10の演算ユニット20へ送信する。また、データ送信部207は、図10における領域338に含まれるブロックのデータ列をプロセスIDが01の演算ユニット20へ送信する。このデータ送信部207が、「送信部」の一例にあたる。
データ受信部208は、受信対象のデータの情報の入力を対象データ決定部205から受ける。そして、データ受信部208は、他の演算ユニット20から送信されたデータ列の入力を受ける。ここで、入力された各データ列はブロック毎に並べられており、データ受信部208は、各データ列が受信対象のデータのいずれのブロックに対応するかを判断することができる。その後、データ受信部208は、取得した各データ列に対応する受信対象データとそれぞれのデータ列との加算をメモリ制御部23に依頼する。このデータ受信部208が、「受信部」の一例にあたる。
外側接続処理実行部209は、外部トポロジでのAllreduceの処理の依頼を統括制御部203から受ける。そして、外側接続処理実行部209は、自演算ユニットが含まれるハイパーキューブ以外のハイパーキューブを形作る演算ユニット20との間でAllreduce処理を実行する。この外側トポロジにおけるAllreduceの処理はその手法に特に制限は無く、外側接続処理実行部209は、従来のAllreduceの処理の手順などを用いて処理を行ってもよい。また、外側接続処理実行部209は、外側トポロジにおける接続をサブネットマネージャ6に依頼して外側トポロジにおけるAllreduceの処理についての経路管理を行ってもよい。そして、外側接続処理実行部209は、外側トポロジとのAllreduce処理が完了すると、外側トポロジにおけるAllreduceの処理の完了を統括制御部203に通知する。
同期処理部210は、Doublingの実行完了後、内側トポロジでの同期処理の実行の通知を統括制御部203から受ける。そして、同期処理部210は、ハイパーキューブに含まれる各演算ユニット20の間で同じデータが共有されたか否かを確認する。例えば、同期処理部210は、他の演算ユニット20のメモリ24に格納されたデータ列を取得する。さらに、同期処理部210は、自演算ユニットが有するAllreduce処理の演算結果であるデータ列の取得をメモリ制御部23に依頼して、メモリ制御部23からデータ列を取得する。そして、同期処理部210は、各演算ユニット20のメモリ24に格納されたデータ列が同じであるか否かを確認する。同じデータが供給された場合、メモリ制御部23は、内部トポロジにおける同期完了を統括制御部203に通知する。
その後、同期処理部210は、外側トポロジでの同期処理の実行の通知を統括制御部203から受ける。同期処理部210は、Allreduceの処理を行うハイパーキューブに含まれる各演算ユニット20以外の演算ユニット20の間で同じデータが共有されたか否かを確認する。例えば、同期処理部210は、他のシステムボード1上のAllreduceの処理の対象とした演算ユニット20のうちのいずれかのメモリ24に格納されたデータ列を取得する。そして、同期処理部210は、取得したデータ列と自演算ユニットのメモリ24に格納されたデータ列が同じであるか否かを確認する。同じデータが共有された場合、メモリ制御部23は、外部トポロジにおける同期完了を統括制御部203に通知する。
メモリ制御部23は、送信対象のデータとして決定されたデータ列の取得の依頼をデータ送信部207から受ける。そして、メモリ制御部23は、指定されたデータ列をメモリ24から取得する。その後、メモリ制御部23は、取得したデータ列をデータ送信部207へ出力する。
また、メモリ制御部23は、受信データである各データ列の入力をデータ受信部208から受ける。また、メモリ制御部23は、各データ列に対応する受信対象データと各データ列との加算依頼をデータ受信部208から受信する。そして、メモリ制御部23は、各データ列に対応する受信対象データをメモリ24から取得する。そして、メモリ制御部23は、取得した受信対象データと受信データであるデータ列を並列演算装置21へ出力し、加算を依頼する。その後、メモリ制御部23は、受信データである各データ列と対応する受信対象データとの加算結果を並列演算装置21から取得する。そして、メモリ制御部23は、加算結果をそれぞれの受信対象データが格納されていたブロックに格納されるようにメモリ24に記憶させる。そして、メモリ制御部23は、1回の通信において取得したデータの演算が終了し演算結果をメモリ24への格納が完了すると統括制御部203に通信の完了を通知する。
さらに、メモリ制御部23は、自演算ユニットが有するAllreduce処理の演算結果であるデータ列の取得の依頼を同期処理部210から受ける。そして、メモリ制御部23は、Doubling処理が完了したデータ列をメモリ24から取得する。そして、メモリ制御部23は、取得したデータ列を同期処理部210へ出力する。
次に、図14を参照して、Allreduceの処理の全体的な流れについて説明する。図14は、Allreduceの処理の全体のフローチャートである。ここでは、演算ユニット20がn次元のハイパーキューブに含まれる場合で説明する。
プロセスID割当部201は、結線表をネットワーク構成管理部28から取得する。そして、プロセスID割当部201は、演算ユニット20が含まれるハイパーキューブの情報を結線表から取得する(ステップS1)。
次に、プロセスID割当部201は、ハイパーキューブに含まれる2n個の各演算ユニット20にnビットの固有のプロセスIDを割り当てる(ステップS2)。そして、プロセスID割当部201は、各演算ユニット20に割り当てたプロセスIDを統括制御部203へ出力する。
それぞれの演算ユニット20の統括制御部203は、各演算ユニット20に割り当てられたプロセスIDをプロセスID割当部201から取得する。そして、統括制御部203は、2n個のプロセスに対する並列Allreduce処理を開始する(ステップS3)。統括制御部203は、各演算ユニット20に割り当てられたプロセスIDをスレッド生成部202へ出力する。
スレッド生成部202は、各演算ユニット20に割り当てられたプロセスIDの入力を統括制御部203から受ける。そして、スレッド生成部202は、自演算ユニットが含まれるハイパーキューブの次元を取得する。ここでは、ハイパーキューブがn次元の場合で説明する。スレッド生成部202は、自演算ユニットに割り当てられたプロセスの情報をジョブ管理部27から取得する。そして、スレッド生成部202は、自演算ユニットに割り当てられたプロセスによる演算結果のデータ列をn個の組に分けてn個のスレッドTh1〜Thnを生成し、生成したスレッドそれぞれに識別番号情報を割り当てる(ステップS4)。その後、スレッド生成部202は、識別番号情報及び各スレッドTh1〜Thnに含まれるデータ列の情報を含むスレッドの情報を統括制御部203へ出力する。
統括制御部203は、スレッドの情報をスレッド生成部202から取得する。そして、統括制御部203は、n個のスレッドTh1〜Thn毎にHalvingを実行する(ステップS5〜S7)。Halvingの詳細については後で説明する。
Halving完了後、統括制御部203は、n個のスレッドTh1〜Thn毎に外側トポロジにおけるAllreduceの処理を実行する(ステップS8〜S10)。
外側トポロジにおけるAllreduceの処理完了後、統括制御部203は、n個のスレッドTh1〜Thn毎にDoublingを外側接続処理実行部209に実行させる(ステップS11〜S13)。Doublingの詳細については後で説明する。
Doublingの処理完了後、統括制御部203は、n個のスレッドTh1〜Thnの間の同期処理を同期処理部210に実行させる(ステップS14)。
その後、統括制御部203は、自演算ユニットが実行するプロセスを含む2n個のプロセス間の同期処理を同期処理部210に実行させる(ステップS15)。これにより、統括制御部203は、並列Allreduce処理を完了する。
次に、図15を参照して、Halvingの処理の流れについて説明する。図15は、Halvingのフローチャートである。図15のフローチャートは、図14におけるステップS5〜S7で実行される処理の一例にあたる。
スレッド生成部202は、各スレッドにnビットのサイクリックIDを割り当てサイクリックIDの初期化を行う(ステップS101)。統括制御部203は、各スレッドのサイクリックIDをスレッド生成部202から取得する。
次に、統括制御部203は、i=0とする(ステップS102)。
次に、統括制御部203は、自演算ユニットのプロセスID、スレッドの情報、各スレッドに割り当てられたサイクリックID、並びに、各ブロックのデータ列を送受信データサイズ算出部204へ出力する。送受信データサイズ算出部204は、初回の通信では2n−1個のデータ列のブロックを送受信するデータサイズとする。その後、送受信データサイズ算出部204は、前回の通信におけるデータサイズを1/2倍して、今回の通信において送受信するデータサイズとして算出する(ステップS103)。そして、送受信データサイズ算出部204は、送受信するデータサイズを対象データ決定部205へ出力する。また、送受信データサイズ算出部204は、各スレッドの情報、各スレッドに割り当てられたサイクリックID、並びに、各ブロックのデータ列を対象データ決定部205へ出力する。
対象データ決定部205は、送受信するデータサイズ、スレッドTh1及びTh2の情報、スレッドTh1及びTh2に割り当てられたサイクリックID、並びに、各ブロックのデータ列の入力を送受信データサイズ算出部204から受ける。次に、対象データ決定部205は、送受信を行うデータサイズで各スレッドを分割して対象判定用グループを生成する。そして、対象データ決定部205は、対象判定用グループに送受信対象インデックスを割り振り、プロセスID及び送受信対象インデックスを用いて受信対象のデータの格納領域を求める(ステップS104)。
次に、対象データ決定部205は、プロセスID及び送受信対象インデックスを用いて送信対象のデータの格納領域を求める(ステップS105)。その後、対象データ決定部205は、送信対象のデータの格納領域の情報をデータ送信部207へ出力する。また、対象データ決定部205は、受信対象のデータの格納領域の情報をデータ受信部208へ出力する。
また、宛先決定部206は、各スレッドの情報、スレッドに割り当てられたサイクリックID、並びに、自演算ユニットのプロセスIDの入力を統括制御部203から受ける。そして、宛先決定部206は、スレッド毎に、プロセスIDとサイクリックIDとの排他的論理和を求めて、スレッド毎に送信先の演算ユニット20のプロセスIDを求める(ステップS106)。その後、宛先決定部206は、スレッド毎の送信先の演算ユニット20のプロセスIDをデータ送信部207へ出力する。
データ送信部207は、送信対象のデータの格納領域の情報の入力を対象データ決定部205から受ける。また、データ送信部207は、スレッド毎の送信先の演算ユニット20のプロセスIDの入力を宛先決定部206から受ける。また、データ受信部208は、受信対象のデータの格納領域の情報の入力を対象データ決定部205から受ける。そして、データ送信部207及びデータ受信部208は、データの送受信を行う(ステップS107)。この時、データ受信部208は、他の演算ユニット20からの受信データを対応する受信対象のデータの情報とともにメモリ制御部23へ出力する。メモリ制御部23は、受信データと受信対象のデータとの演算を並列演算装置21に行わせ、演算結果をメモリ24の受信対象のデータの格納領域であった場所に格納する。その後、メモリ制御部23は、データの受信完了を統括制御部203へ通知する。
統括制御部203は、データの受信完了をメモリ制御部23から受信する。そして、統括制御部203は、各スレッドに割り当てられたサイクリックIDの値をサイクリックに左にシフトさせる(ステップS108)。
その後、統括制御部203は、i=nか否かを判定する(ステップS109)。i=nでない場合(ステップS109:否定)、統括制御部203は、iを1つインクリメントする(ステップS110)。その後、統括制御部203は、ステップS103へ戻る。
これに対して、i=nの場合(ステップS109:肯定)、統括制御部203は、Halvingの処理を終了する。
次に、図16を参照して、Doublingの処理の流れについて説明する。図16は、Doublingのフローチャートである。図16のフローチャートは、図14におけるステップS11〜S13で実行される処理の一例にあたる。
統括制御部203は、Halving終了時の送受信したデータサイズ及び各スレッドのサイクリックIDを取得する(ステップS201)。
次に、統括制御部203は、i=0とする(ステップS202)。
次に、統括制御部203は、各スレッドのサイクリックIDの値をサイクリックに右にシフトする(ステップS203)。
その後、統括制御部203は、自演算ユニットのプロセスID、スレッドの情報、各スレッドに割り当てられたサイクリックID、並びに、各ブロックのデータ列を送受信データサイズ算出部204へ出力する。送受信データサイズ算出部204は、初回の通信では1個のデータ列のブロックを送受信するデータサイズとする。その後、送受信データサイズ算出部204は、前回の通信におけるデータサイズを2倍して、今回の通信において送受信するデータサイズを計算する(ステップS204)。そして、送受信データサイズ算出部204は、送受信するデータサイズを対象データ決定部205へ出力する。また、送受信データサイズ算出部204は、各スレッドの情報、各スレッドに割り当てられたサイクリックID、並びに、各ブロックのデータ列を対象データ決定部205へ出力する。
対象データ決定部205は、送受信するデータサイズ、スレッドTh1及びTh2の情報、スレッドTh1及びTh2に割り当てられたサイクリックID、並びに、各ブロックのデータ列の入力を送受信データサイズ算出部204から受ける。次に、対象データ決定部205は、送受信を行うデータサイズで各スレッドを分割して対象判定用グループを生成する。そして、対象データ決定部205は、対象判定用グループに送受信対象インデックスを割り振り、プロセスID及び送受信対象インデックスを用いて受信対象のデータの格納領域を求める(ステップS205)。
次に、対象データ決定部205は、プロセスID及び送受信対象インデックスを用いて送信対象のデータの格納領域を求める(ステップS206)。その後、対象データ決定部205は、送信対象のデータの格納領域の情報をデータ送信部207へ出力する。また、対象データ決定部205は、受信対象のデータの格納領域の情報をデータ受信部208へ出力する。
また、宛先決定部206は、各スレッドの情報、スレッドに割り当てられたサイクリックID、並びに、自演算ユニットのプロセスIDの入力を統括制御部203から受ける。そして、宛先決定部206は、スレッド毎に、プロセスIDとサイクリックIDとの排他的論理和を求めて、スレッド毎に送信先の演算ユニット20のプロセスIDを求める(ステップS207)。その後、宛先決定部206は、スレッド毎の送信先の演算ユニット20のプロセスIDをデータ送信部207へ出力する。
データ送信部207は、送信対象のデータの格納領域の情報の入力を対象データ決定部205から受ける。また、データ送信部207は、スレッド毎の送信先の演算ユニット20のプロセスIDの入力を宛先決定部206から受ける。また、データ受信部208は、受信対象のデータの格納領域の情報の入力を対象データ決定部205から受ける。そして、データ送信部207及びデータ受信部208は、データの送受信を行う(ステップS208)。この時、データ受信部208は、他の演算ユニット20からの受信データを対応する受信対象のデータの情報とともにメモリ制御部23へ出力する。メモリ制御部23は、受信データと受信対象のデータとの演算を並列演算装置21に行わせ、演算結果をメモリ24の受信対象のデータの格納領域であった場所に格納する。その後、メモリ制御部23は、データの受信完了を統括制御部203へ通知する。
統括制御部203は、データの受信完了をメモリ制御部23から受信する。そして、統括制御部203は、i=nか否かを判定する(ステップS209)。i=nでない場合(ステップS209:否定)、統括制御部203は、iを1つインクリメントする(ステップS210)。その後、統括制御部203は、ステップS203へ戻る。
これに対して、i=nの場合(ステップS209:肯定)、統括制御部203は、Doublingの処理を終了する。
さらに、Halving及びDoublingを実行するためのプログラムについて説明する。図17は、Halving及びDoublingを実行するためのプログラムの疑似コードの一例を示す図である。
図17におけるCyclicLeftShift(val)は、valの値をサイクリックに左にシフトする関数である。また、CyclicRightShift(val)は、valの値をサイクリックに右にシフトする関数である。さらに、SendRecv(dst,scr,size,peer)は、scrのアドレスからsize分をpeerへ送り、peerから送られた分のデータをdstに上書きする関数である。また、SendRecv_Add(dst,scr,size,peer)は、scrのアドレスからsize分をpeerへ送り、peerから送られた分のデータをdstに加算する関数である。また、StepHistは、実行中のHalving又はDoublingの処理の進行状態を表す値である。
次に、図18を参照して、図17で示したプログラムのHalvingについての処理の流れを説明する。図18は、Halvingを実現するプログラムで行われる処理のフローチャートである。図18は、図15のフローチャートの処理をプログラムで実現した場合の一例にあたる。ここでは、ネットワーク制御部29が有する演算回路を動作主体として各処理について説明する。また、ここでは、スレッドの識別子として、0〜n−1までの値で表されるthredIDを用いる。
演算回路は、1つだけ1の値を有するnビットのサイクリックID(CyclicID)の1の値の場所を左に1つずつシフトさせていくことで各スレッドに割り当てるサイクリックIDを生成し、CyclicIDの初期化を行う。また、演算回路は、StepHist=0とする。さらに、演算回路は、プロセスの演算結果全体のデータサイズ(D)をnで除算した値にthredIDを乗算する。次に、演算回路は、乗算結果にメモリ24の先頭アドレス(MemAddr)を加算して、スレッド毎のoffsetを算出して、offsetの初期化を行う(ステップS301)。
次に、演算回路は、i=0とする(ステップS302)。
次に、演算回路は、StepHistの最下位に注目するビットを追加する(ステップS303)。具体的には、演算回路は、StepHistのビット列を左に1つシフトさせる。この場合、演算回路は、最下位ビットを0とする。そして、演算回路は、CyclicIDにおいて1が立つビットと同じビットが、プロセスID(processID)でも1であるかを判定する。例えば、演算回路は、サイクリックIDとプロセスIDとの論理積を求め、求めた値が0より大きいか否かを判定し、0より大きければそのビットがプロセスIDでも1であると判定し、0以下であればそのビットがプロセスIDでは0であると判定する。そして、そのビットがプロセスIDでも1である場合、演算回路は、StepHistと、同じビット数で最下位ビットが1であるビット列との排他的論理和を求めることで、StepHistの最下位ビットを1にする。これに対して、そのビットがプロセスIDでは0である場合、演算回路は、StepHistと、同じビット数ですべてのビットが0であるビット列との排他的論理和を求めることで、StepHistの最下位ビットを0にする。
次に、演算回路は、送受信を行うデータサイズを算出(ステップS304)。具体的には、演算回路は、プロセスの演算結果全体のデータサイズをnで除算した値を2のi乗で除算して、BufferSizeを求める。このBufferSizeが、送受信を行うデータサイズとなる。
次に、演算回路は、受信対象となるデータの先頭アドレスを求める(ステップS305)。具体的には、演算回路は、StepHistにBufferSizeを乗算した値にoffsetを加算することで、受信対象となるデータの先頭アドレスであるRecvAddを算出する。
より詳しく説明すると、各スレッドのブロックは2×2i個に分割される。そして、演算回路は、スレッドの分割された各領域に、1+iビットの送受信対象インデックスを割り当てる。また、この時点でStepHistも同様に1+iビットで表現される値を有する。そこで、演算回路は、送受信対象インデックスがStepHistの値と一致する領域を受信対象となるデータの領域とする。そして、演算回路は、そのインデックス倍のBufferSizeを求めることで受信対象となるデータの先頭アドレスが求められる。
次に、演算回路は、送信対象となるデータの先頭アドレスを求める(ステップS306)。具体的には、受信先の先頭アドレスに対して、最下位ビットが異なる送受信対象インデックスを有する領域が送信対象となるデータの領域となる。そこで、演算回路は、StepHistと、StepHistと同じビット数で最下位ビットが1の値との排他的論理和を求める。そして、演算回路は、求めた排他的論理和の値にBufferSizeを乗算し、乗算結果にoffsetを加算することで、送信対象となるデータの先頭アドレスであるSendAddを算出する。
次に、演算回路は、送信相手の演算ユニット20のプロセスIDを求める(ステップS307)。具体的には、演算回路は、サイクリックIDとプロセスIDとの排他的論理和を算出し、算出結果を送受信相手の演算ユニット20のプロセスIDであるPeerとする。
その後、演算回路は、データの送受信及び受信データの加算処理を実行する(ステップS308)。具体的には、演算回路は、SendRecv_Add(RecvAdd,SendAdd,BufferSize,Peer)を求める。
次に、演算回路は、CyclicLeftShift(CycicID)を行い、サイクリックIDの値をサイクリックに左にシフトする(ステップS309)。
そして、演算回路は、iがnより小さいか否かを判定する(ステップS310)。iがnより小さい場合(ステップS310:肯定)、演算処理部は、iの値を1つインクリメントし(ステップS311)、ステップS303へ戻る。
これに対して、i=nの場合(ステップS310:否定)、演算処理部は、Halvingを終了する。
次に、図19を参照して、図17で示したプログラムのDoublingについての処理の流れを説明する。図19は、Doublingを実現するプログラムで行われる処理のフローチャートである。図19は、図16のフローチャートの処理をプログラムで実現した場合の一例にあたる。ここでも、ネットワーク制御部29が有する演算回路を動作主体として各処理について説明する。
演算回路は、Halving終了時のBufferSize、サイクリックID、StepHist及びoffsetを取得する(ステップS401)。
次に、演算回路は、i=0とする(ステップS402)。
次に、演算回路は、CyclicRightShift(CyclicID)を行い、サイクリックIDの値をサイクリックに右にシフトする(ステップS403)。すなわち、演算回路は、Halvingとは逆順に通信相手とデータの交換を行う。Halvingでは、最後にデータの送受信を行った後に一度左へのシフトが実行されたため、ここでは、演算回路は、最初に右へのシフトを実行する。
次に、演算回路は、受信対象となるデータの先頭アドレスを計算する(ステップS404)。具体的には、Doublingにおいては、送受信対象のデータの領域がHalvingの時と逆になる。そこで、演算回路は、StepHistと、StepHistと同じビット数で最下位ビットが1の値との排他的論理和を求める。そして、演算回路は、求めた排他的論理和の値にBufferSizeを乗算し、乗算結果にoffsetを加算することで、受信対象となるデータの先頭アドレスであるRecvAddを算出する。
次に、演算回路は、送信対象となるデータの先頭アドレスを求める(ステップS405)。具体的には、演算回路は、StepHistにBufferSizeを乗算した値にoffsetを加算することで、送信対象となるデータの先頭アドレスであるSendAddを算出する。
次に、演算回路は、送信相手の演算ユニット20のプロセスIDを求める(ステップS406)。具体的には、演算回路は、サイクリックIDとプロセスIDとの排他的論理和を算出し、算出結果を送受信相手の演算ユニット20のプロセスIDであるPeerとする。
次に、演算回路は、次の通信時の送受信を行うデータサイズを計算(ステップS407)。具体的には、演算回路は、今回の通信におけるデータサイズを2倍にしたものを次の通信時の送受信を行うデータサイズとする。
その後、演算回路は、データの送受信及び受信データの加算処理を実行する(ステップS408)。具体的には、演算回路は、SendRecv(RecvAdd,SendAdd,CyclicID,BufferSize,Peer)を求める。
次に、演算回路は、StepHistの値を右にシフトさせる(ステップS409)。この場合の右へのシフトはサイクリックな右シフトではない。右にシフトさせることで、StepHistの1ビット目の値が消滅する。これにより、演算回路は、StepHistの値をHalvingの時の逆順で遷移させる。
そして、演算回路は、iがnより小さいか否かを判定する(ステップS410)。iがnより小さい場合(ステップS410:肯定)、演算処理部は、iの値を1つインクリメントし(ステップS411)、ステップS403へ戻る。
これに対して、i=nの場合(ステップS410:否定)、演算処理部は、Doublingを終了する。
以上に説明したように、本実施例に係る情報処理システムは、演算ユニットが含まれるハイパーキューブの次元でプロセスを分割して生成したスレッド毎に異なる演算ユニットとの間でデータの送受信を行うことでAllreduceの処理を実行する。これにより、Allreduceの処理を行うに当たり、通信をする際に不使用の通信経路の発生を抑制することができ、処理速度を向上させることができる。
図20は、実施例1に係るAllreduceの処理の効果を説明するための図である。図20は、縦軸で従来のAllreduce処理に対する通信時間の倍率を表し、横軸でハイパーキューブの次元数を表す。
1本のケーブルの帯域がbバイト/秒の場合で説明する。この場合、1本の経路でDバイトのデータの通信を行うのに係る時間は、D/b秒である。そのため、データの通信量が半分になると通信時間はD/2bとなる。すなわち、演算ユニットが2次元のハイパーキューブの構成の場合、スレッドのサイズは全体の半分になるため、送受信するデータサイズも半分になり、通信時間も半分になる。そして、1度に通信を行う経路が倍になるので、帯域は2bバイト/秒となる。また、n次元のハイパーキューブの構成の場合、帯域はnbバイト/秒であり、各経路での送受信するデータサイズはD/nバイトとなる。したがって、図20に示すように、本願に係るAllreduceの処理を実行した場合、従来のAllreduceの処理に比べて処理速度が向上する。
また、演算ユニットがネットワークスイッチで接続されたトポロジにおいて、本実施例に係るAllreduceの処理を実行した場合、各演算ユニットからネットワークスイッチに延びる1本のネットワーク上で、同時に複数のデータの送信が行われる。そのため、ネットワークスイッチへ向かう経路に負荷が集中し、速度の低下が発生するおそれがある。これは、多段のネットワークスイッチを用いた場合でも同様である。そのため、本実施例に係るAllreduceの処理を行う情報処理システムは、演算ユニットがスイッチを介さない直接結合網を有する場合でより効果を発揮できる。