2次元メッシュネットワーク

リングではプロセサコア数に比例してネットワーク直径が増加するので、プロセサコア数が多い場合には通信遅延時間が大きくなってしまう。このため、よりコア数が多いTileraの64コア、あるいは100コアチップでは2次元メッシュ接続が使われている。また、IntelのSingle-chip Cluster Computer(SCC)と呼ぶ48コアの実験チップも2次元メッシュ接続を採用している。

図5.3 16コアを接続する2次元メッシュ

図5.3に示す2次元メッシュのノードも、プロセサと小さなスイッチがペアになっている。リングの場合はスイッチは3ポートであったが、2次元メッシュでは5ポートのスイッチが必要となる。しかし、16プロセサの接続の場合、最も遠いプロセサ間のスイッチ通過段数は7段で双方向リングの8段に比べて1段少ない。また、赤や青の破線(2分面)を横切る接続は4本であり、双方向リングに比べて2倍のバンド幅を持っている。

16プロセサコアの場合では、双方向リングとの違いはそれほど大きくないが、64プロセサになると、双方向リングのネットワーク直径は32であるのに対して、2次元メッシュの直径は15となる。また、双方向リングの2分バンド幅は2Bのままであるが、2次元メッシュでは8Bとなる。このように接続するプロセサ数が多くなると、双方向リングに比べて2次元メッシュが有利になり、スケーラビリティーが高いネットワーク構成であると言える。

2次元トーラスネットワーク

2次元メッシュネットワークのX+方向の端とX-方向の端を繋ぎ円筒状にして、次にY+とY-方向の端を繋いでドーナツ状にすると、2次元トーラスネットワークが得られる。トーラスネットワークではX、Yのリングの近い方のパスを使えばよいので、メッシュに比べてネットワーク直径を半減することができる。このため、CRAYのXT~XKシリーズまでのスパコンでは、ノード間の接続トポロジは3次元トーラスが使われている。また、IBMのBlieGeneも3~5次元のトーラス、「京」も大規模な接続は3次元トーラスを用いている。

なお、ノードという単語とコアと言う単語が出てくる。ノードの方が広い概念で、ノードは、1つのコアでも良いし、複数のコアとそれらを接続する小さなスイッチを含んだものでも良い。しかし、以下では、ノードとコアは殆ど同じ意味で使っている。

図5.4は4×5ノードの2次元メッシュと2次元トーラス接続を示すものである。なお、トーラスを作る場合、ループを作るために右端のノードと左端のノードを繋ぐとその部分だけに長い配線ができ、この長い配線で伝送遅延が決まってしまうので、右側の図のように、1つ置きにノードを接続し、端はループになるように必要に応じて隣接するノードを接続する。

この図にみられるように、ノードの行の間に存在するリンクの本数は2次元メッシュでは4本であるのに2次元トーラスでは8本であり、メッシュをトーラス化するには2倍の配線を必要とする。

図5.4 4×5の2次元メッシュ(左)と2次元トーラス(右)の接続

そして、トーラスでノードの行、列間の配線をメッシュと同じ本数にしようとするとループに含まれるノード数を2倍にする必要があり、チップ上に形成する配線量一定という条件では、トーラスにしても殆ど性能的なメリットがない。このため、メニーコアチップでは、コア間の接続には2次元メッシュを用いるのが一般的である。

2次元メッシュネットワークのデータ伝送

2次元メッシュネットワークでは、送信元のノードから宛先のノードまでの経路の取り方は数多く存在するが、良く用いられるのは次元ルーティングというやり方である。次元ルーティングでは、まず、送信元ノードからX方向の接続を使って、宛先ノードとX座標が等しくなるノードまで進み、そこでY方向の接続に乗り換えて宛先のY座標になるまで進むというようにデータの転送を行う。このようにすれば、送信元と宛先のX、Y座標が決まれば、経路は一通りに決まってしまう。

2次元メッシュネットワークのスイッチは、5ポートのスイッチであり、図5.5に示すように5×5のクロスバと、FIFO構造の入力バッファと出力レジスタから構成されている。なお、この図では入力バッファや出力レジスタはX-ポートにしか書かれていないが、同じ構造が全てのポートに設けられている。

図5.5 2次メッシュ用スイッチの構成

入力バッファは隣接ノードからのパケットの先頭フリットを受け取り、宛先情報などから、どのポートに出力するかという経路計算を行う。そして、出力ポートのレジスタが空いており情報を受け取れる状態になっているかを確認する。同時に、同じ出力ポートを使用する他の入力ポートからの要求とアービトレーションを行う。

ここで、出力ポートの使用がOKとなると、クロスバを切り替えて入力バッファのデータを出力レジスタに転送する。そして、出力レジスタは接続された隣接ノードの入力バッファに空きがあればデータを転送する。

このように、経路計算に1サイクル、アービトレーションとクロスバの切り替えに1サイクル、入力バッファから出力レジスタへのデータ転送に1サイクル、出力レジスタから隣接ノードの入力バッファへのデータ転送に1サイクルで、スイッチの通過に4サイクルかかるというのが基本的な作りであるが、実際の設計では、複数の機能を1サイクルに押し込んで通過に必要なサイクル数を減らす努力が行われている。

出力レジスタにデータが溜まっていたり、他のポートとのアービトレーションに負けてデータが転送できない場合は、データは入力バッファに溜まったままとなる。そして、入力バッファが一杯になると、その前のノードの出力レジスタのデータ転送が出来なくなるという風に、パケットの伝送がブロックされる。

次元ルーティングのような固定経路のルーティングでは、このようなケースではパケットの転送が止まってしまうが、大規模なネットワークでは渋滞している部分を迂回してパケットを送る適応型のルーティングも用いられている。適応型のルーティングを行うとデータ伝送がブロックされたリンクを避けて空いているリンクを有効利用するので、ネットワークの実効バンド幅が改善されるが、迂回の有無で宛先までのホップ数(スイッチ通過数)が変わり、パケットの到着順が逆転することがあるので、受信側でパケットの並べ替えが必要となるなど面倒なことも発生する。このため、比較的規模が小さいオンチップのネットワークでは、次元ルーティングのような固定的なルーティング使うのが一般的である。

また、このようなネットワークでは、次のノードがデータを受け取れない状態となるとパケットの伝送が止まってしまう。このパケットが届かないと、巡り巡って次のノードのバッファが空かないというような関係になってしまうと、デッドロックに陥ってしまう。このため、X、Yともにプラス方向にしか進まないメッシュと、X、Yともにマイナス方向にしか進まないメッシュを組み合わせて使いパケットの流れを一方向とし、要求を送るメッシュと応答を受け取るメッシュは独立のネットワークを使うなどの方法でデッドロックが起こらないようにすることが必要である。