調べたこと、作ったことをメモしています。
こちらに移行中: https://blog.shimazu.me/

これからのコンピューターを夢想してみる - EEIC Advent Calendar Day 13

この記事はeeic Advent Calendar 2015の13日目の記事になります。

はじめに

僕はτ研で次世代不揮発性メモリ向けのLinuxファイルシステムを作っています。このテーマは僕がM1のときに、「5年〜10年後のコンピューターシステムについてて考えてみよう」と思っていろいろ調べてみたのをきっかけにして思いついた内容になります。せっかくそのときにいろいろ調べたので、知識のupdateも兼ねて僕の考えるこれからのコンピューターについて適当にまとめつつ、eeic Advent Calendarなので最後にウチの研究室おいでよという宣伝もしとこうかな。

ただ、あくまでもこれは一人の修士学生が考えた(しかもゆるふわブログ向けの)内容ですので、大いに間違いや思い込みが含まれている可能性があります。指摘やご意見等気軽にしていただけると喜びます。 (引用はできるだけしたいですが、調べてると時間がかかるので嘘を覚悟で僕が覚えていること、考えていることをひとまずごっちゃでかいちゃいます。)

もくじ

ネットワーク…も重要な要素だけど、全く知らないのでこれは割愛。

いろいろなコンピューターとCPUのトレンド

最近では、CPUといってもいろいろなタイプのものがあります。ノーパやデスクトップといったいわゆる「パソコン」に搭載されているような, Core iシリーズやAtomなんかもそうですし、Xeonのような高性能サーバー向けや、ARMに代表されるようなモバイル向けなんかは有名なところだとおもいます。さらに、Intelが出しているEdisonCurieといったIoT向けの超低消費電力な、SoC (System on Chip) と呼ばれる種類のものもあります。

このように多彩な"CPU"が出てきている背景には、開発のトレンドの推移があると考えられます。 ここ数年は、1コアの性能が頭打ちになってきていて、たくさんのコア(~16物理コア程度)のCPUが手軽に、秋葉原なんかで買えるようになっている、というのは有名な話かと思います。この理由は、 「デナードスケーリング」が完全には成り立たなくなっているということがあります。これは簡単に言うと、1/kのプロセスでつくれば電圧は1/kになり、遅延は1/kになり、消費電力/デバイスは1/k2になるので、同じ大きさのプロセッサにたくさんトランジスタを載せても電力は変わらず性能が上がるという素晴らしい法則です。ただ、現在では、スイッチング速度をあげるのに重要だった低電圧化も電圧がスレッショルド電圧に近づき、単純に1/kにはできなくなった、という現状があるようです。(ちなみに、こういう内容は大学院のアドバンスド・コンピューターアーキテクチャで軽く勉強したりします。) そこで、クロックを上げるのではなく、トランジスタ数で勝負!となったけど、たくさんトランジスタつかって複雑なこと(スーパースカラ、アウトオブオーダー、賢いキャッシュ、SIMD命令によるベクトル演算など)をやってもあんまりいい感じにならないな、ということで出てきたのがマルチコアです。 (ちなみに、簡単なプログラムではどれくらい”いい感じ”にならないかというのを最後にAppendixとして載せておきます。)

しかし、プロセスを微細化してたくさんたくさんトランジスタを載せ、ぎちぎちに積むと、スケーリングが成り立たない今では消費電力が増えていってしまいます。特に問題になるのがリーク電流とよばれるもので、これは微細化したトランジスタのOFF時に流れちゃう電流、ということでいいのかな?(このへんは詳しくない)なので、すべてのトランジスタを常時利用して、フルパワーで全部動かす、というのは電力供給という点で難しいようで、同時には使えない領域が生まれていまいます。これが「ダークシリコン」と呼ばれる問題です[参考:モバイルSoCにおけるダークシリコンの呪縛]。今は電力供給が問題、と言っていますが、それが問題無くなったとしても、発熱の面で問題なのではないでしょうか。

エンジニアリング的な回避策として、ターボブーストと呼ばれる、1コアだけを高クロックで動かす技術はこのために生まれたもののようです。 ほかにも、QSVというIntelのCPUにくっついてる動画エンコード用のハードウェアなんかも、余ったトランジスタの利用先として都合よかったのかな、なんて個人的に思ったりしています。このように、余ったトランジスタの利用先を、特定用途の回路に用いるというのが現在のダークシリコンの利用策のようです。この「特定用途の回路」の究極系(たぶん)として、FPGAを統合しようという動きもあるようです。Intelが2大FPGAメーカーのうちのひとつ、Alteraを買収したのは記憶にあたらしいことだと思います。[参考:なぜインテルはアルテラを買収し、FPGAをXeonに統合しようとしているのか?] FPGAは最近どうやらアプリケーションレベルでも興味を持たれているようで、特にHFT (High Frequency Trading) の分野では意欲的に取り組まれているようです。[参考:文字通り「ネットワークがコンピューター」な金融HFTでのFPGAの使われ方] IntelXeon FPGAに関してはこの記事がとてもよくまとめてくれています。[参考:インテル、ISCA 2015でXeon+FPGAの詳細を公開] コンピュータアーキテクチャ系のトップカンファレンスであるISCAで今年IntelFPGAについて公演してくれていたみたいですね。今後OpenCLFPGAを高位合成、さらにそれをverilogかなんかでチューニングできるエンジニアが重宝されていくのかもしれません。勉強しなきゃな。

さて、今こんな現状なので、高速化ではなく、低消費電力の方向に舵をきってすすめているというトレンドもあります。これは最近のCoreシリーズの紹介の仕方や、特にあたらしくモバイル向けにできたCore Mシリーズや、Atomシリーズの力のいれようからもわかりますね。もともとモバイル、タブレットではARMが強かったので、今後はIntelとARMのせめぎあいが起こるようです。このあたりは、ある程度の性能をできるだけ低消費電力で実現するという分野なので、ダークシリコン問題を回避する策のひとつともいえるかもしれません。

またもうひとつダークシリコンの回避方法として、動作周波数が低い、弱いコアをたくさんのせるという手法もあります。これはメニーコア, MIC (Meny Integrated Core) なんて呼ばれています。これに関しては次に述べます。

高性能計算におけるCPUとGPU

メニーコアとは、簡単に言ってしまえばコア数を10や20というオーダーから数百、数千というレベルにまでふやしたマルチコア・プロセッサのことです。IntelはこれをMIC Architectureと呼んでいて、現在はXeon Phiというコプロセッサとして、60コア/240スレッドのプロセッサを利用することができます。(τ研にもXeon Phiのマシンあるよ!)現在のXeon PhiではPCI Expressに挿して使うような、いわゆる”アクセラレータ”に過ぎませんが、2015年末に出ると言われていた (まだ出てない) Knights Landingというバージョンでは、ホストプロセッサとして利用できるようになると言われています。このKnights LandingはAtomプロセッサのSilvermontをベースにしていると言われています。なので、2命令のOut-of-Order実行できるスーパースカラプロセッサになるのかな?このへんの性能がCore iシリーズやXeonなんかより低く、クロック周波数も低いので、1コアの性能は低いです。

さらに、この低い性能のコアでできるだけ高性能な計算をやるにあたって、SIMD演算というのが重要になってきます。(このリンク先のマイナビの記事は、コンピューターアーキテクチャの勉強をするためにググると必ず見ることになる、ような気がします。とてもよくまとまっていてすごいです。)SIMD演算は簡単に説明すると、ベクトルの演算みたいなものです。複数要素の足し算を1クロックでやる、とか、そういうことです。Xeon Phiでは512bitのレジスタがつかえるので、単精度の浮動小数点(float)だったら、32bit * 16要素を詰め込める、つまり16要素の演算が同時に行えるということになります。ただforループで足し算するだけならこのSIMD命令を利用するのは簡単かもしれませんが、ちょっと分岐が入ったり、ちょっと余計なことをするとすぐに使えなくなってしまいます。なので、これを簡単に扱えるようなことをする研究を後輩がやってたりします。

とここまでの話のなかで、よく知っている人であれば「え、これってGPUとなにが違うの???」と疑問をもつかもしれません。GPUはもともとグラフィックの処理に特化しているので、それぞれのピクセルに対して同じような計算をする、というシチュエーションに特化したアーキテクチャになっています。つまり、弱いコアを多数載せ、SIMD演算も大量につかって高速に処理をする、というアプローチを取っています。このGPUを汎用的につかうGPGPU (General Purpose GPU) もここしばらく流行っていて、たくさんの論文が出ています。

さて、ここまでの話のなかでGPGPUとMICの違いが不明瞭になってきました。実際、GPUはもともと別のメモリを持っていて、明示的にデータを転送しないと利用できなかったのですが、最近になってHSAやCUDA6のUnified Memoryなんていう仕組みがでてきています。これは、GPUとCPUのアドレス空間を統一的に扱えるとか、HSAではタスクのスケジューリングに関してもグラフィックと汎用演算とを自由にスケジュールできるように仕様がきまっていたりだとかするようです。ますますCPUとGPUの境界が近づいていると感じますね。

ただ、GPUはあくまでも一つの命令でたくさんのデータを動かすのが得意なプロセッサである、という決定的な違いがあります。CPUはもともと汎用演算のためにつくられているので、ifによる分岐の予測だとか、投機的実行だとか、そういうややこしいことをたくさんやって1つのスレッドを高速に動かそうという気持ちでつくられています。一方で、GPUはデカイデータに対して同じ演算をガーッとかけるために作られています。その根本が違うため、GPUではいろいろ分岐するようなプログラムは効率よく動作させることができません。また、GPU単体ですべてのプログラムを動作させるわけではないため、ホストのCPUで準備をし、GPUに仕事を投げ、もどってくるという複雑なプログラミングモデルを取らないといけなくなります。

個人的な意見としては、GPUは今盛り上がっていますが、今後はMICのほうが先が明るいのではないか、なんていうふうに思っています。このあたりの境界は曖昧ですが、すくなくとも、アクセラレータとしてのGPUPCI Expressのようなバスを通した通信がボトルネックになってすぐに頭打ちになるのではないかな、と思います。GPUとCPUがもっと密にくっついて、速い幾つかのコアと小さい多数コア、どちらも命令セットは同じでスケジューラーがいい感じにやってくれる、なんていう世界が来たりするかな、なんて思ってたりします。と書きながら、これってARMのbig.LITTLEのLITTLEがたくさんバージョンなのでは・・・??と今書きながら思ってきました。

よりシンプルなアーキテクチャが最終的には生き残るのではないかな、と思っているので、シンプルにいい感じにMICが広がっていく、というものを個人的には想像しています。

メモリバンド幅の問題、TSVとHBM

コアが増えると、それだけメモリにアクセスする頻度が上がるということになります。これにより、1:コアあたりの利用可能なメモリ量が減る、2:コアあたりの利用可能なメモリバンド幅が減るという2つの問題が生じます。

まず1つめのメモリ量に関しては、DRAMのチップ当たりの容量が増加しにくくなっているという背景から、単純には解決できない問題となっているようです。そこで、現在はDRAMを3次元に積層するという方向で開発が進められており、それを実現するためにTSV (Through Silicon Via) という技術が注目されています[参考:【IRPS 2012レポート】 次世代シリコンの3次元実装技術「TSV」]。 TSVはシリコン上に穴を開けて、上下に複数枚のシリコンダイをくっつけちゃおうというお話になります。話としては単純ですが、シリコンの微細加工にあたって問題があったようで、最近ようやく実用化が進んできたところのようです。

また、TSVはただ上下がくっつくだけではなく、配線距離が短くなるという別の利点があります。これにより電気的な特性がよくなり、より高速な通信規格を利用できるようになります。ここにフォーカスした話がHBM (High Bandwidth Memory) になり、2つ目のバンド幅の問題を解決する方法の1つになります。

HBMに関してはこのへん[TSV技術で積層するGDDR5後継メモリ「HBM」の詳細]が詳しく説明してくれてるっぽいので、詳細についてはこっちに譲り、ここでは簡単な紹介をします。 HBMの基礎となるのは、2.5Dスタッキングという方法です。これは、インタポーザーと呼ばれるシリコンの基板の上に、CPUなどのプロセッサとDRAMを載せ、TSVをつかって配線する手法です。これにより、HBMは256GB/s程度まではいけるだろうと言われています。

また、もう一つのバンド幅に関する対応策として、eDDRと呼ばれるものがあります。これは、プロセッサの上に高速なDRAMを積んで、L4として使おうという試みです。これはHaswellから?の機能のようですが、Xeon PhiのKnights LandingもこのようなL4キャッシュに似た仕組みを導入するようです[参考:ISC 2015 - Intelが語った次世代Xeon Phi「Knights Landing」]。

このように、DRAMに関しては、積層技術の応用によって、容量やバンド幅はまだしばらくは増加していきそうな気配がします。

ストレージ:SSDスワップとしての利用、NVDIMMと次世代不揮発性メモリ

今回のブログ最後のネタはストレージです。身近な話としては、一般に売られているノートPCにもSSDが載るようになって、HDDに比較し高い性能であることは体感しているかと思います。直近の話として、このSSDをフルに扱おうという動きがあります。OpenNVMではいくつかのインターフェースを提案していますが、特に個人的に面白いなと思ったのは、スワップ領域にSSDを利用しようというものです。現在はDRAMが一杯一杯になってしまった場合にしかたなくHDDにスワップをすることでなんとか動作を維持しよう、というような役割ですが、積極的にスワップを利用することで、大量のDRAMが存在するかのようなシステムを構成することができます。これは、SSDはHDDに比較するとランダムアクセス性能は高いという特徴を活かした面白い試みかと思います。

さらに、現在のストレージ向けの通信にはmSATAやPCI Expressといった規格が利用されていますが、これらは十分にランダムアクセス性能の高さを利用することができないため、DIMM(メモリがささっているところ)に刺すという機能が最近実装されつつあるようです[参考:NANDフラッシュをDIMMに載せたら ]。Linux kernel 4.2では、libnvdimmというもののサポートが行われたようです[参考:Linux 4.2 Will Bring LIBNVDIMM Support For Non-Volatile Memory Devices]。

しかし、SSDでもなおDRAMに比較すると十分とは言えません。まず、読み書き性能はHDDに比較すると十分スループットが出るとはいえ、そのレイテンシは依然としてmsオーダーだったりします[参考:M550 mSATA NAND Flash SSD]。この理由にも関係しますが、SSDに利用されている素子であるNAND Flashはページ単位でしか書き込みができない上に、書き換え回数に制限があります。そこで現在注目を浴びているのが、次世代不揮発性メモリです。

次世代不揮発性メモリはPersistent Memory, Storage Class Memoryなどとも呼ばれ、おおよそDRAMと同等の性能を持つとされる素子の総称です。代表的な手法に、PCM (Phase Change Memory)[参考], ReRAM (Resistive RAM)[参考], STT-RAM (Spin Torque Transfer RAM)[参考1, 参考2], Memristor[参考1, 参考2]といったものがあります。特にMemristorなんかは、1971年に"The missing circuit element"なんていう論文が出され、2008年に"The missing memristor found"という論文がでているという流れが非常にカッコいいですね。抵抗・コンデンサキャパシタ)・コイル(インダクタ)に続く第4の受動素子だそうです。

これらの次世代不揮発性メモリはそれぞれ多少特性が異なるものの、概ね(1)DRAMに匹敵する読み書き性能(とくにload/storeの発行からのレイテンシが低い), (2) NAND Flashに比較し書き換え回数の飛躍的増大 (3) バイト単位での永続化 というような特徴を持ちます。このようなデバイスの実現によりプログラミングモデルが変わると考えられていて、現在研究が盛んになっています。この辺りを去年の冬の輪講でまとめたので、そのときのスライドも見ていただけるといろいろな話があるんだ、とわかっていただけるかもしれません。

すでに次世代不揮発性メモリの商用化にむけた動きは始まっていて、Intelが3D XPointというのを発表しています[参考:3D XPoint™ Unveiled—The Next Breakthrough in Memory Technology]。特にこの記事なんかはとてもわかり易く3D XPointについてまとめてくださっていると思います。1000倍速い!1000倍書き換え回数が多い!なんて言われていますが、これは次世代不揮発性メモリの特徴そのものです。

個人的にはこの分野はちょうどいま面白いところに来ていると思っています。従来の"ブロック単位"での書き換えが前提だった世界からいかにして"バイト単位"の世界にシステムの設計を持ってくるのか。このへん、ページキャッシュの仕組みやmmapしたときのページフォルトの仕組みなど、ファイルシステム周りの変化がとても大きいんじゃないかなぁ、と感じています。DIMMにささってDRAMと同じアドレス空間をもつとなると、デバイスドライバの入る必要性がなくなるため、OSのファイルシステムは大きく変化せざるを得ないでしょう。 また、これに関連して、十分性能を活かそうと思うと仮想化まわりにもいろいろ考える余地がありそうですね。

まとめ

CPU、メモリ、ストレージに関して、僕の考えていることを交えながらざざっとまとめてみました。 ホントは非ノイマン型のCPUとか全部FPGAの世界とかも話書きたかったけど、ちょっと疲れちゃったので断念。 とりあえず、HPC (High Performance Computing) 向けにしろ、モバイル向けにしろ、ここから更に大きく発展していきそうだという僕の感じているワクワク感を共有できたら嬉しいなと思います。もし興味ある人がいたらぜひ語りましょう!

あと、こういう比較的低レイヤな話に興味を持ってくれるB3は、ぜひウチ研に来てくれるといいかなとおもいます!笑

書いてるうちにいろいろ触れたい話が増えていって、おもってたより長文になっちゃいました・・・ ここまで読んでくれた方、お疲れ様でした、ありがとうございます!!

Appendix

ただの行列行列積を何も考えずに1コアで実行すると、こんな感じです。ちなみに、ソースコードここ

> ./mm.bin
== Matrix Multiplication Test ==
Matrix size: 1024
Elapsed [ms]: 8207.92
Flops [GFLOPS]: 0.26

これを実行した環境はVAIO Pro 13です。使ってるCPUはi7-4500U CPU @ 1.80GHz, turbo boostで3.0GHzなので、1コアで本来なら3.0GHz * 2(FMA) * 4(要素) = 24GFLOPSくらいは出ることが期待できます。(SIMD命令はクロックが落ちるような気がしたけど、探してもみつからない・・・) ということで、ただの3重ループのなんの変哲もない行列積だと理論値性能の1%程度の性能しか出ないことがわかりました。

ちなみに、行列積のスパコンやXeonPhiノードを利用した高速化コンペティション、という課題がτ研の新B4向けの勉強会で開かれたりします。たのしみにしてください!