複数のパケットを同時に送るスロッテッドリング

リングのデータ伝送速度が速くなってくると、リングを1周する時間と比べて1つのデータパケットを送り出すのに必要な時間が十分短くなってくる。そうするとリング上に1つのトークンで、一時には1つノードしかデータパケットを送れないのではリングが空いているのにトークン待ちでデータが送れないということが多くなり、リングの利用効率が悪くなってくる。

そこで出てきたのがリング上に複数のトークンを回すようにして、トークンを得た複数のノードが同時に送信できるようにして効率を上げようという考え方である。ただし、この方法ではトークンを保留してデータを送っている最中に次のトークンが来てしまっては困るので、データの長さはトークンの間隔が上限となる。この連続してデータを送ることができる部分を「スロット(Slot)」と呼び、このような複数のトークンを使う方式を「スロッテッドリング(Slotted Ring)」という。

図4.9 2つのトークンを使うスロテッドリング

図4.9ではノード0がトークンAを送り出しており、同時にノード4がトークンBを送り出している。そして、リング上のノードでの各サイクルの信号を見たものが図の下側に書かれている。どのノードにも送信データが無い場合は、4サイクル(ここでは、ノードの通過時間は1サイクルと想定している)ごとにトークンが通過していくことになる。送信を行う場合は、トークンをデータパケットの最初の情報であるデータ(1)に書き変え、それに続いてデータの本体などからなるデータ(2)~(4)を送る。しかし、5サイクル目にはトークンAが入ってくるので、これを通過させなければならず、データ(4)より長いパケットは送れない。

スロッテッドリングは、このようにパケットの長さに制約が付くが、トークンの数だけ同時に送信ができるので、リングの利用効率が高いというメリットがある。そして、周回させるトークンの数を増やして行けば、それに比例して伝送できるデータ量が増加する。

なお、ここではトークンの間隔は一定で、すべてのスロットのサイズは同じであるとしたが、長いスロットと短いスロットを作り、コマンドなどを送る場合は短いスロット、データを送る場合は長いスロットを使うというやり方もある。

Intelのリングバス

Intelは、2009年の「Nehalem EX(商品名はXeon 7500)プロセサ」から、プロセサコア群とシェアードキャッシュの接続にリングバスを用いている。

図4.10 IntelのNehalem EXのリングバス(出典:Hot Chips 2009)

Nehalem EXは、8個のコアとシェアードキャッシュであるLLC(Last Level Cache)のペアを持ち、それらを 図4.10で赤色で描かれた2つのリングで接続している。1つのリングは時計方向、もう一方のリングは半時計方向に回るようになっており、送信元のノードと宛先のノードの位置関係を見て、近くなる方向のリングを使用する。また、1つのリングは、32バイト幅のデータリングと、同じく32バイト幅のSnoop、Request、Acknowledgeというコヒーレンス制御やデータ転送のコントロールのための各リングからなっている。

そして、各ノードの通過遅延は1クロックで、クロックごとに1ポジション進むリングとなっている。このIntelのリングバスの詳細は発表されていないが、図4.10には、各ノード(IntelはRingstopと呼んでいる)はリング入力にデータがある場合は、そのデータを優先して通過させ、データが無く、空きの場合は自分のデータを送出するというアービトレーションを行うと書かれている。

データリングは32バイト幅で、伝送するデータはキャッシュライン単位であり、64バイトの長さがある。従って、1つのデータの伝送にはデータリングを2サイクル使用する必要がある。

それぞれのノードはEvenとOddの区別があり、リングのデータもEvenとOddのサイクルがあり、EvenのノードはEvenのサイクルから始まるデータしか受け取らない。そして、送信元ノードは、受信ノードがEvenの場合は、Evenサイクルから始まり、次のOddサイクルと合わせて2サイクルで64バイトのデータを送る。一方、受信ノードがOddの場合は、Oddサイクルで始まり、次のEvenサイクルと合わせて2サイクルでデータを送ると思われる。

このような制御は、明示的なトークンは使っていないが、Even/Oddの区別で2サイクルのスロットを実現しているスロッテッドリングと見ることもできる。

Snoop、Request、Acknowledgeの各リングも32バイト幅であり、これらのリングは1サイクルで1つの情報を送っているのではないかと思われる。

32バイト幅のリングが4つで1組であるので、1024本の信号線が必要となり、これが互いに逆方向の2リングあるので、合計2048本となり、Intelのリングには非常に多くの配線が必要になる。

しかし、Intelのノードは、コアとLLC(Last Level Cache)がペアになっている。キャッシュを構成するSRAMはトランジスタ層や1~3層のメタル配線層はびっしり使われ隙間がないが、5層以上のメタル配線はほとんど使われていない。この上層のメタルを使い、LLCの上にリングの配線を置くことにより、Intelは、チップ面積の損失がほとんど無い形でリングを実現している。

クロスバの場合は、プロセサコア数やシェアードキャッシュのWay数が変わると、それに合わせてクロスバを作り直す必要があるが、リングの場合は、ノードの数が増えても、単にノードを並べて順に繋いでいけば良いので、コア数の異なる派生製品を容易に作ることができるというメリットがある。

とは言っても、すべてのIntel製品が同じリングを使っているのではなく、4コア以下の製品ではリングは1重で、8コア以上のサーバ製品だけが時計/半時計まわりの2重のリング使っている。2重の逆方向リングは単にデータ伝送路の幅が2倍になるだけでなく、距離が近くなる方向のリングを選んで使うことにより、平均的なレーテンシ(送信元から受信先までの経由ノード数=遅延サイクル数)が1重リングに比べて1/2になるというメリットがあり、ノード数が多い構成が可能になる。