スパコンの性能ランキングであるTop500に使われるのはLINPACKという連立一次方程式を解くという計算である。解くべき連立一次方程式の次数(未知数の数)が決まれば、それを解くのに必要な演算量は決まるので、演算量を答えを得るまでの計算時間で割ったFlop/sでという値でランキングを行う。

Green500はスパコンのエネルギー効率、具体的には、LINPACKプログラムのFlop/sをその実行を行うのに必要な電力で割った値をランキングの指標として用いる。このため、LINPACKプログラムを走らせて実行時間を測定し、同時に消費電力を測定すれば良いのであるが、消費電力は一定ではないので、ことはそれほど簡単ではない。

連立一次方程式を解くには

連立一次方程式は

a11×x1+a12×x2+a13×x3+…=b1
a21×x1+a22×x2+a13×x3+…=b2
a31×x3+A32×x2+a33×x3+…=b3
……

のようにn本の1次方程式が並んでいる。

この最初の式の両辺をa11で割れば、変数x1の係数は1となる。次に2行目の式の両辺をa21で割れば、これもx1の係数は1となる。そして、2行目の式から1行目の式を引くと、x1の係数はゼロとなり、2行目の式はx1を含まない形になる。同じことを3行目以降の式に対して行うと、1行目以外の式はx1を含まない形になる。

そして、2行目以降の式でこれを繰り返してx2を消去する。さらにこれを繰り返してx3、x4、…と消去していくと、係数行列の対角線上にあるaiiはすべて1、対角線の左下の要素はすべてゼロで非ゼロの要素は対角線の上だけにあるという三角行列になる。このように変形できれば、最後の式はann×xn=bnであり、bn/annを計算すればxnが求まる。次は求まったxnをすべての式に代入して、その次はxn-1を求めるということを繰り返せばすべてのxが求まる。

ここでは、説明を簡単にするために、1行ずつの処理で説明したが、実際には、例えば256行×256列を1まとめのブロックにして処理するというような方法が取られる。

そして、多数のプロセサを有効に働かせるために、次の図のように、左上の最初のブロックをプロセサ0(P0)、右隣をP1、次をP2というようにブロック単位で各プロセサに仕事を割り当てる。当初は、ブロックの数が非常に多いので、各プロセサに1個ずつのブロックを割り当てても、ブロックが残る。その場合は2巡目、3巡目と各プロセサに何個ものブロックを割り当てて行く。

係数行列のブロック分割とプロセサ割り当て

Green500が創設された頃は、プロセサの数もそれほど多くは無かったので、すべてのプロセサが多数のブロックを受け持ち、LINPACKの計算を行なっている間はほとんどフル稼働になっていた。次の図に示すように、計算のコアフェーズの平均電力が398.7kWに対して、開始直後の20%の期間では398.1kW、最後の20%では398.2kWと僅かに小さい値であるが、中央の期間では消費電力はほとんど変動が無かった。

Green500創始のころのLINPACK実行時の消費電力の推移 (これ以降のスライドの出典は、SC15のGreen500 BoFでの発表資料)

最初と最後を除けばどのタイミングで電力を測っても同じということから、Green500のレベル1という測定では、コアフェーズの中の最初と最後の10%の期間を除いた中央の80%の期間の内の20%の期間の消費電力を測定すれば良いというルールになっている。なお、より精度が高い測定であるレベル2とレベル3では、コアフェーズ全体での測定というルールになっている。

しかし、処理が進んで残っているブロックの行と列の数が小さくなってくると、各プロセサが受け持つブロック数が少なくなってくる。そうすると、残りのブロック数がプロセサ数で割り切れない場合は、例えば5ブロック受け持っているプロセサと4ブロックしか受け持っていないプロセサが出てくるというアンバランスが起こる。そうなると、4ブロックのプロセサは80%しか仕事をしないので、消費電力が下がってくる。

次の図は、当初からブロック数を小さくして、アンバランスが目立ちやすくした実行の例であるが、コアフェーズ全体の平均電力は810.1kWであるが、70%~90%の期間の平均電力は576.1kWと29%も少ない。このような測定が行われると、Green500のスコアが40%あまりインフレになってしまう。

意図的に短い実行をさせて、後半の消費電力を小さくした例

このため、次回のGreen500からは、レベル1測定でも、コアフェーズ全体の消費電力を測定するというルールに変更されることとなった。