マルチスレッド

マルチコアは物理的に複数のプロセサコアを1つのチップに集積するが、1つのプロセサコアを複数のプロセサのように見せるマルチスレッドという技術がある。

4命令並列デコードを行うアウトオブオーダプロセサでも、キャッシュミスなどが発生すると命令の実行が止まってしまい、プログラム全体を見ると1サイクルに実行できる命令数は0.7~1.5命令程度である。つまり、最大4命令を並列に実行できるハードウェアであるが、通常の実行状態は、かなり、ハードウェアが遊んでいる状態である。これはもったいないということで、最近のプロセサでは複数の命令列(プログラム)を並行的に実行することにより遊びを減らしてハードウェアを有効利用するマルチスレッドプロセサが増加している。

なお、IBMが1998年に発表した1コアのPOWER3プロセサはマルチスレッド機構を持ち、2つのプログラムを並行して実行することができたが、性能向上の度合いが小さく、Poorman's multiprocessor(貧乏人のマルチプロセサ)などという陰口を叩かれたが、チップ全体の数%程度の面積という僅かな追加のハードウェアで20~30%程度の性能向上が得られることから、最近では、採用するプロセサが増えている。

しかし、実は、マルチスレッドは最近始まったものではない。1964年に出荷された初期のスパコンである「CDC6600」は10個の周辺プロセサを持っていたが、これらのプロセサは1つのハードウェアをタイムスライスで順番に使用することで実現されており、見方によっては、1個のプロセサが10個のI/Oプログラムを並列に実行するマルチスレッドということが出来る。

最初の商用的なマルチスレッドプロセサは、1982年に発表されたDenelcorのHEP(Heterogeneous Element Processor)というスパコンである。HEPはクロックサイクルごとにタイムスライスで64本のスレッドを順番に切り替えて実行するプロセサであった。

このような実行を行うと、スレッド0でメモリのリードアクセスがあっても、スレッド1~63を実行して、次にスレッド0に実行権が戻って来るのは64サイクル後であり、その時にはメモリからのリードデータが到着しており、待ち時間は発生しなかった。また、後続命令が浮動小数点演算のような実行時間の長い命令の結果に依存する場合も、実行権が戻るまでに完了しており、待ちは発生しない。というように、HEPは64本のスレッドを順次実行することにより、ハードウェアをストールさせることなく、効率よく命令を実行することができた。

HEPでは毎サイクル異なるスレッドを実行する必要があり、このスレッドの切り替えをサイクルごとに行うため、プログラムカウンタやアーキテクチャレジスタなどは、スレッドごとに持つ構造となっている。

このHEPの考え方は、Teraのシステムに受け継がれ、さらにCrayのMTAマシンに受け継がれている。このHEPのアーキテクトは、TeraのChief Scientistで、最近までCrayのCTOであり、現在はMicrosoftのフェローを勤めているBurton Smith氏である。このHEPのマルチスレッドアーキテクチャは、Denelcor、Tera、Crayと同氏の異動とともに受け継がれてきているが、Microsoftがこの手のマルチスレッドプロセサを作るかどうかは疑問である。

それはともかく、HEPは論理的には64個の同じプロセサがあるシステムであり、Heterogeneousはおかしいと思い、筆者は、Smith氏にヘテロジニアスではなくホモジニアスではないかと質問したことがある。そうすると、当時、このスパコンは米国の国防関係のプロジェクトに売り込んでおり、その時に営業担当が、なにか特徴のあるキャッチフレーズが欲しいので、ちょっとエキゾチックなヘテロジニアスという言葉を使った。私は、この命名には関与していなかったという答えであった。

SunのNiagara(正式名称はUltraSPARC Tシリーズ)プロセサは8個のプロセサコアを集積するマルチコアプロセサであるが、それぞれのプロセサコアは8本のスレッドを順次、切り替えて実行するマルチスレッドプロセサであり、HEPの考え方を受け継いでいると言える。なお、8スレッドではHEPのようにメインメモリのアクセスレーテンシを隠蔽することはできないが、1次キャッシュミス、2次キャシュヒットのケースではレーテンシの大部分を隠蔽することができる。また、何らかの原因で待ちになっているスレッドは飛ばして次のスレッドを実行するというメカニズムを加えることにより、スループットを改善している。