ハイパフォーマンスコンピューティング(HPC)とは 中島浩氏：（BGM「Let It Be」を流しながら登場）さすがにビートルズの「Let It Be」ぐらいは知っているかな。皆さんが生まれるずいぶん前の歌ですけれども。 『アナ雪（アナと雪の女王）』というのがあって、あっちは「Let It Go」なんですね。こっちは「Let It Be」で、何が違うのか。英語のニュアンスはほとんど同じなんですけれども「Let It Go」のほうは少し積極的。 「Let It Be」は「まあ、いいじゃん」みたいな、そんな感じのニュアンスだと思います。 私、京都大学の中島と言いまして、今日はHPC、High Performance Computing（ハイパフォーマンスコンピューティング）の話を皆さんにしたいと思います。 皆さんのことをInfo Guysと書いていますけれども、IT屋さんの卵というかITリサーチャーの卵である皆さんに向けて、この分野というのはどういうものだということをお話しします。 これは結構クリティカルな分野で、皆さんの将来にすごく大きな影響が、少なくとも間接的には及ぼすという恐ろしいところもある話ですが、朝一番ですので真面目に聞いていてもしょうがない。 長丁場ですから、今日これが10個ぐらいあるという話で、最初から真面目に聞いていると本当に死んじゃいますので（笑）。適当にリラックスして聞いてください。 では中身ですが、一応リクルートさんのほうから注文があって、定義みたいな、これって何、というような話をしてくれというお話なので、一応定義はします。歴史もお願いしますと言われてますので、皆さんのお父さんが生まれるもっと前の頃から、私が生まれる前の話から始めます。歴史についてはTOP500というキーワードがあるんですけれども、それ以前と、それ以降という形でお話しします。 最後に「情報屋」というとちょっと聞こえが悪いんですけれども、ITの人たちにとってのHPCについてお話しします。「そんなの関係ないや」と思っていると非常にまずいという話と、何でまずいかという理由、つまり諸君の研究、あるいは将来のビジネスというのが、コンピュータの性能にかかっているということをお話しします。

コンピュータが速い理由 皆さんの将来は、コンピュータがどれだけefficientかというのにかかっているわけなんですけれども、それが何でefficientなんでしょう、という理由についてもお話しします。 コンピュータって速いと思っているか速くないと思っているかはよく知りませんけれども、速い理由というのが結構実はしょうもないという話があるので、それをお話します。そして最後に、我々からITの人たちへの期待というものでまとめたいと思います。 まず非常に簡単な定義として、狭義のHPCについてお話しします。 自然科学とか工学、いわゆる理系分野、コンピュータサイエンスではない理系分野の問題を考えます。例えば地球温暖化がどうした、どうなるかとか、次の南海トラフはいつ来るんでしょうみたいな話を、一般にものすごく大きな数値計算問題に定式化してしまうと、それは例えば巨大な連立一次方程式になります。 連立一次方程式ぐらいはもちろん皆さんは知っているわけなのですが、どのぐらい巨大かというと、何十億元とか、そろそろ1兆元とかいう、未知数が1兆個ある連立一次方程式を解くことになります。1兆個あろうが3兆個あろうが何個あろうが一次方程式は一次方程式ですから、解こうと思えば解けるんですよ、一応。 ただ解くのには大変な手間がかかるわけで、それをどうやって頑張って解くかみたいな話が出てきます。これを高速、一般には速くするためには並列コンピュータというのを使うしかないのですが、それを解くための技術だったり、解くためにどういうようなコンピュータを作ったらいいんだとか、そういうような計算技術がHPCだというわけです。 次は簡単な例で、これがポアソン方程式です。「えー！ 俺は情報なんだから電気のことはわからない」という人もいるかもしれません。私は35年ぐらい前にあなたたちの年の頃は、「電」と名がつく科目は一切取らないというポリシーで京都大学の情報工学科というところを卒業したので、ポアソン方程式なんて知ったこっちゃねえと思っていましたが、これぐらい知っている人は多いと思います。 別に難しい話じゃなくて、uという三次元の空間中に定義されたもののラプラシアンが、fという三次元の既知の関数に等しいということがわかっているとして、このときにuを求めましょうというのがポアソン方程式です。 ものすごく簡単な問題、空間が一次元だったりfがすごくわかりやすかったりすると、解析解というのがあって、よくあるのは三角関数になったり、三角関数と何とかの、くちゃくちゃくちゃっとしたふうになったりするんですが、空間が三次元になったりfが好き勝手いっていると、全く解析解がないということになります。 解析解がないという言い方が本当に正しいのかどうか知りませんが、解析的には解けないということで、相場が決まっているわけです。そこでこれを近似します。 近似するところまではまだ数学でして、例えばラプラシアンというのは一個一個バラバラにすると、uの空間に関する2階偏微分、つまりuのxとyとzに関する2階偏微分の足し算みたいなことで書けますので、これをテーラー展開か何かを使って、何とか以下を無視するという荒っぽいことをやると、まあまあの精度で右の近似式が出てきます。 そうするとこの中にΔx（デルタエックス）というのが出てくるわけなんですが、Δxは小っちゃい。1センチとか、適当に決めてやって、2階偏微分を近似します。そして、これを3つ足すとfになるよ、というわけです。fは既知だよと言っているのでx, y, zについてあらゆるところで既知ですから、このΔxきざみのところにfを定義することができます。つまりΔxきざみのところ、ΔyもΔzもありますけれども、そういう離散的なところにfとuを定義していって、そういう離散的なところでuはいくらになるんでしょう？ ということを求めるためには、Au＝fという連立一次方程式を解けばいいわけです。 解けばいいって、離散的であっても無限の空間では解けませんから、例えば1000×1000×1000とかという有限の空間を作ってやって、その中で問題を解くことになります。そうするとあっという間に離散的な点が10億個になるわけなんですけれども、とにかく10億元の連立一次方程式を解けばいいわけです。 解くやり方は山のようにありまして、本当にきりがなくなって、今日は細かい話には踏み込めませんが、大体の場合、最後はfor何とかかんとか、x＝0が何たらとか、y＝0が何たらとか、uという三次元配列があって、u[x][y][z]を＋＝すると書いていますから、自分に何かを足すというわけです。 この自分に足すという計算を、ぐるぐるぐるぐる山のように回してやると、方程式が何とか解けるということで、相場が決まっているわけです。そこで、この計算を高速にやろう、しかも並列にやろう、というわけです。並列にできるという理由は、多くの「何とか法」とか「かんとか法」とかいうのが、それぞれの(x,y,z)に関して独立に計算できる性質を持っていることです。つまり、このu[x][y][z]の計算は、こっちの点の計算とこっちの点の計算を、同時にやっても大丈夫だということが、大概の解き方で成り立つので、これは並列にできるということになります。

HPCの分野 大体この世の中のHPCの90％ぐらいはこんなことをやっているわけですが、もうちょっと広くするといろんな分野があります。例えばジェノミクスですか、遺伝子何たらとか、バイオインフォマティクスとか、何か怪しい単語があるんですが、そういう分野もあります。 それとか下手すると経済学とか、株が上がるかどうかを計算で考えるとか、どんどん怪しくなっていくんですが、こういう分野にも巨大な計算問題がありますし、非数値計算問題もあります。数値じゃない計算問題って何だと思うかもしれませんが、非数値的な問題もあるんですね。 例えばグラフとかいうのは、グラフのノードに数値がぶら下がっていることが結構ありますけれども、グラフというそのものの形というのは別に数値ではないわけで、点と点の関係みたいなものです。この関係を数値で表すこともできますけれども、外面的には数値ではない。こういうようなグラフを探索するんだというのもHPCです。これをさっきと同じようにでかい、高速な並列コンピュータを用いて解く計算技術もHPCだというわけです。 例えば典型的でも簡単でもないのですが、例えば人と人とのつながりをグラフ、ソーシャルネットワークグラフみたいなものを相手にするのが、最近の流行りであるわけです。このグラフから、所与の条件を満たすものを探索するのがグラフ探索です。 例えば興味の一致度が高いとか、阪神ファンであるとか、そういうようなものを条件とします。つまり、人と人のつながりの中で好きな野球チームが同じであるような極大連結部分グラフを列挙するということです。連結部分グラフはわかりますよね？ 全部のノードがつながっている部分グラフですよね。 極大だというのは、その部分グラフでは好きなチームが一致するけど、これ以上人を加えるともう一致しない、巨人ファンが入ってしまう、というのが極大なやつなんです。これを求める問題というのがありまして、例えばノードの数が1万5000ぐらいというかわいらしいグラフを考えて、5と書いていますけれども興味が一致する項目5以上になるという問題を考えます。 例えば、好きな野球のチームとサッカーのチームと何とかがみんな一緒、とかいうのを数えていくと、10の9乗ぐらいの答えが出てくるという、とんでもない問題です。しかも、極大のやつがこの中にちょっとだけ隠れているというわけです。 10の9乗というのは10億ですが、一般的にはこれはエクスポーネンシャルな問題になってしまっていて、2の1万5000乗ぐらいの計算時間が一番いいかげんな方法で解くとかかるという、こういう巨大な問題になります。こういうのもHPCの分野に入っています。

HPCマシンの歴史 次に歴史なのですが、一番さかのぼると1946年までさかのぼりまして、今年で戦後70年とか言っていますから69年前です。最初のコンピュータだということになっているのがENIAC（エニアック）というもので、皆さんも名前ぐらいは聞いたことがあるかもしれません。 これの主要アプリというのが砲弾、大砲の弾を撃つとどこに飛んでいくかという計算ですが、これをリアルタイムに計算するわけではない。そんなことはできるはずがない。1946年ですから。 何をするかというと、風がこう吹いたらあそこに飛ぶとか、大砲を23度の仰角にするとどこに飛ぶ、とかというのを山のように、23度のときにはあそこに飛ぶ、22.5度のときはあそこに飛ぶ、みたいなことを山のように書いた表をつくるわけです。そして相手の軍艦が近くに来ると、どのぐらい遠いとか、風はどこからどう吹いているとかをもとに、バーッと表を見て、じゃあ21.3度だとかと言ってガーンと撃つための表というのをつくるための計算をするという、とんでもないまどろっこしいことをしていたわけです。 どれだけ速いコンピュータだったかが、さすがにもう動いているわけでもないのでよくわかりません。もちろん論文も残っているのですが、大体1秒間に100キロ回、ですから10万回ぐらい足し算と引き算ができたと言われております。速いっちゃあ速いし、人間よりはずいぶん速いわけですが、全然大したことがありませんね。 これ以降何の進歩がなかったわけじゃなくて、ちゃんと進歩してきたのですが、1964年に、もう私は生まれていて、ざっとですけれども君らのお父さんたちが生まれた頃に、最初の商用、売り物のハイパーパフォーマンスコンピューティングのコンピュータというのができました。CDC6600といいます。 この年、期を同じくして、IBMという有名な会社がありますが、これがSystem360という、コンピュータ関連の歴史を語る上でこれは外せないという、有名なコンピュータを発表しています。これはもちろん科学技術計算もできますけれども、どっちかというとビジネスの計算に向いたコンピュータでした。 CDC6600というものの性能が4MFlopsと言われていまして、Flops（フロップス）というのはFloating-point Operations Per Secondです。Floating-pointというのは知っていると思いますが浮動小数点数ですね、Cでいうとdoubleとか、floatとか言っているやつですけれども、それが4M回ですから400万回ぐらいできました。また大体System360というのはこれの4分の1ぐらいだったのではないかと言われています。4MFlopsというのはおもちゃです。自分で簡単につくれます、今は。

世界初のスーパーコンピュータの性能は その後1976年になって、Cray-1という世界最初のスーパーコンピュータができました。これは計算原理がちょっと違う、別にチューリングの定理を覆すような計算できるようになっているわけでも、ムーアの法則を覆すようなことをやっているわけでもないのですが、特徴として配列データの計算が得意なコンピュータでした。 特に、1次元の配列データに対して、ひたすら同一の演算をやっていくのが得意でした。つまり、全部の要素に10を掛けるとか、ベクトルとベクトルの足し算をするとか、ベクトルのノルムを取るとか、そういうことがすごく得意なマシンで、160MFlopsという性能になりました。 160MFlopsまで来ると、だんだん知っている性能になります。これが大体スマホの一桁か、一桁半落ちぐらいですね。5年前のガラケーはいい勝負だったかもしれないというぐらいの性能なんです。これがこんなにでかくて、何百キロワットという電力を食っていたというわけです。 これとほぼ同時に、ちょっと遅れてですけれども、インテルという有名な会社が8086という、これもコンピュータの歴史を語る上で外せないプロセッサーを出しました。この8086の横っちょに、8087というFloating-point計算ユニットというのをつけることができて、大体50KFlopsぐらいだったと言われております。50Kと160Mですから3桁ちょっと違う。つまり最初のスパコンは8086の3000倍ぐらい速かったというわけです。8086は今のXeonだったりCore i7だったりのご先祖様なんですけれども、当時は8086なんてまともなコンピュータになるとはみんな思っていなかった、という話もありますが。 1984年になると、Sequent Balanceという世界最初の商用multi-microprocessor（マルチマイクロプロセッサー）というものができました。これは要するに、8086だとか80186とか286だとか、その辺のマイクロプロセッサーをたくさんつないで並列計算をやろうというものです。 これは30プロセッサで0.79MFlopsだったというわけですから、Cray-1と比べると200分の1ぐらいの性能だったらしいということです。だったらしいというか、実は私も使っていましたので、そうだったね、みたいな感じなんですけれども、そんなものができたというわけです。

スパコン番付は大人の遊び ここまでがTop500前のという話で、Top500というわけのわからないものは1993年にスタートしました。これは世界で速いほうから500位までのスパコンの番付表を、年に2回必ず更新していくという大人の遊びです。 遊びで済んでいればいいんですけれども、もちろん速いコンピュータをつくっているメーカーは、うちのが速いと言いたいわけですから、し烈な争いも同時にあるんです。 1993年に始まったときに、この単位はGFlopsですから、もうすでにこのときは10Gを超えていて100Gに近づこうとしていました。Cray-1の単位はMでしたから、その1000倍ぐらいの性能からのスタートしたわけですね。 この赤い線とか青い線が性能なんですが、日本のやつも最近Kコンピュータというのが、名前ぐらい知っていると思いますが、これが世界で一番になりました、というのはTop500というリストの一番上に載ったという話です。 個々の話はいいのですが、1993年がここで、2014年がここで、今、中国のTianhe-2というのが世界で一番速いのですが、ここの間にビーッと線を引く。どのぐらい速くなったかなと線をひくと、世界一の性能が線の上に乗るというように見えます。 恐ろしいのは、こっちの横軸はリニアなんですね。1ずつふえています。ところがこっちの縦軸はよく見ると対数軸になっていて、1つ上がると10倍になっています。 こっちがリニアで、こっちが対数のグラフにビューっと線を引けるということは、これはエクスポーネンシャルに性能が上がっているということです。実は年率1.88倍という恐ろしいスピードで上がっています。 これはものすごい成長です。88％インフレと言うと、そういう時代も例えば日本でもありましたし、いろんな国で起こったことはありますけれども、それが20年続くということがあると、いくら金持っていてもだめです。10年ぐらいたつと1000倍近くなるわけです。500倍強ぐらいになります。というようなスピードで、ガーッと上がってきたわけです。