256コアマシン向けのOSを作る

お手持ちのマシンのCPUコア、何個でしょうか?

え、4個?8個?うーん、ショボイ。ハイパースレッディング入れて64個?まあ頑張ってますね。

今時、ちょっと奮発して256コア積んだマシンにした方が絶対お得でしょ〜。

なんて会話がもう少ししたら当たり前に聞こえて来るかもしれません。ま、かなり奮発すれば256コアマシンは手に入るので、している所では既にしているでしょう。

Xeon Phi

たぶん???となっている方もいるような気がするので、解説します。

最近、Intelが製造しているプロダクトに、Xeon Phiという製品があります。1GHz程度のショボイコアを64個くらい並べて、並列コンピューティングやると早いよ!(たぶん)っていう代物です。ちなみに、各コアに2つ演算ユニットがついて、さらにハイパースレッディングを積んでるので、物理64コアのXeon PhiはOSから見ると256コアになります。マジでcat /proc/cpuinfoやると256個出てくるよ!

そういえばIntelはPen4の周波数上げができなくなって、Core2とかのマルチコア製品に手を出し始めたわけですが、結局Coreシリーズもコア数をどんどん増やす事はなく、頭打ちになりました。というわけで、プロセス微細化を頑張ってきたのですが、ここにきてまたコア数を増やしていくという戦略を取ったようです。まあムーアの法則、崩壊しかけてるからね、仕方ないね。

Xeon Phiは当然その設計上、シングルスレッド性能は大した事はないです。だから並列アプリケーションとかでないと、その真価を発揮できないわけです。或いは、Web界隈とかだともしかすると使えるかもしれません。全コアでWebサーバープロセスを立てて、片っ端から処理する、みたいな。256コアもあれば、先にネットワークの帯域がボトルネックになりそう。知らんけど。

並列コンピューティングっていうといろいろあって、ネットワーク越しにMPIでほげほげする奴とか、マルチコアを頑張ってガリガリ使うのとか、後最近流行ってるのはGPUですよね。Xeon Phiの一番のライバルとなるのは、明らかにGPUなので、Xeon Phi使い方指南書みたいな本には、「GPUよりも使いやすいぜ!」とか「GPUよりも早いぜ!」とかいろいろ書かれています。「GPU絶対殺ス」っていうIntelの意思が伝わってきて、大変素晴らしいですね、はい。

個人的には、ショボイ並列コンピューティングクラスタ並のコア数でかつ、コア間の通信遅延が少ない、という意味において、すごい時代になったなぁ、って思ってます。もちろん、Xeon Phiを更に並列につなげて並列コンピューティングをしても良いわけで、実際そういうスパコンはあります。かのTianhe-2もそうですし、最近日本の某大学と某大学に入って京の性能を超えてしまったOakforest-PACSとかいうのもそうです。

あと、Xeon Phiのもうひとつ注目すべき点としては、クラスタ状になっているコアの横に帯域幅のめちゃくちゃ広いDRAM(MCDRAM – Many Core DRAM)がくっついた事です。既存のメモリだと256コアがバリバリメモリアクセスする事で帯域幅を使いきってしまうので、こっちを使いましょう、と用意された物ですね。

こいつは所謂NUMAで、コアとメモリコントローラとの間の距離がコアによって違います。もう遅延とかは気にせず、とにかく帯域出そうぜって所に男気を感じますね(?)

まあ、そんな上手くいくのか良くわからない微妙な物を作ってるんですよ、っていうIntelさんのお話です。

KNC

ここからはXeon Phiの世代間アーキテクチャーについて説明していきます。Xeon Phiは世代が変わるごとに大きく設計が変わるので、区別すべき所ではきちんと言い分けなければなりません。

とりあえず、第2世代のKnights Cornerから行きましょう。第1世代のKnights Ferryは製品化されてないのでスルー。

Knights Cornerはリング状のクラスタ構造を持っていました。(「Knights Corner ring」でgoogle画像検索すると沢山画像が出てくる)リング状というのは、単純で設計しやすい反面、コア間の遅延が大きくなるし、帯域使い果たしちゃうし、であまり良い設計とは言えません。実際、聞く限りではそれほど性能はスケールしないようです。残念。ちなみに、Tianhe-2はこれ。(時代的にこれしかなかったからね、しょうがないね)

あと、KNC世代の製品は全てコプロセッサでした。つまりGPUみたいな形をしてて、PCIeにブスっと差して、ホストのCPUからプログラムを転送する、みたいな使われ方をしてた、という事です。コプロセッサといっても、中ではLinuxが動いててsshする事ができたので、それはそれで面白い事ができたのかもしれません。

僕はこいつを一回破壊してるので、もうあまり触りたくはないです。はい。

KNL

で、我らが第三世代、Knights Landingです。こいつはクラスタ構造がメッシュで、遅延も小さくなるし、帯域も広くなったしで、そこそこスケールすると評判です。(例によって「Knights Landing mesh」でgoogle画像検索)Oakforest-PACSはこれ。

さて、ここからが本題。

「「「Knights LandingからはLGA CPUソケット上に乗るようになり、自力でOSをブートできる!」」」

こりゃもうKnights Landing向けにOSを書くしかないじゃない!ってのが今回のお話です。

前置き長かった。。。

あ、KNLでもコプロセッサは残ってます。コプロセッサならPCIeの帯域が許す限り1ノードにコアを増やし続けられるよ!やったね!

あと、KNLはもはやCPUじゃねーかそれ、って感じですが、IntelはCPUと呼びたくないらしいです。なんででしょうね。既存のCPUと同じにされたくないのかな?それならXeonって名前は紛らわしいから辞めた方がいいと思うんだよなぁ。。。

KNL向けのToy OS開発

メニーコアともなると、OSを0から作りなおさなきゃいけないような気がしますが、全くそんな事はないです。ってか、そうなってないのが流石Intelって感じでした。

言うなれば、KNLはOSからすると、ただコアが256個に増えたXeonなんですよね。いやだからもうそれCPUじゃん。

KNL本にもシステムプログラム向けの解説は一切なくて、並列化テクニックの話ばかり書かれています。

OSを作るのに必要な情報は、Intelの技術資料(最新版)に100%乗ってます。Intelの設計すげぇ。

というわけで、ここではマルチコア対応とKNL対応の差異について説明したいと思います。マルチコアをどう実装するか分からない?こっちで軽く解説してるので、割愛→マルチコア

メニーコアの初期化

まず、マルチコアに対応するだけであれば、LegacyなAPIC(xAPIC)のサポートだけで良かったのですが、残念な事にxAPICではAPIC ID(CPUのコア番号)が8bitしかないんですよね。Xeon Phiは途中のAPIC IDが欠番(製造プロセス上、途中にダミーのコアがある)なので、256番目のコアのAPIC IDは295です。つまりxAPICでは全てのコアを扱えないんですね。

というわけで、x2APICのサポートが必須となります。256個使わなくて良いなら、xAPICだけでも動くには動きます。

ココらへんのあーだこーだしてた話がlivaの雑記帳(2016/10)の10/1にあるので、物好きな方はどうぞ。

まあでも逆に言うと、x2APICさえサポートしてしまえば、マルチコアOSでも普通に動きます。Intelすげぇ。

MCDRAM情報の取得

MCDRAMはいろいろまたこいつが面白くてですね。KNLはチップ内にMCDRAMを16GB積んでるのですが、こいつをメインメモリ(DDR4)のキャッシュとして使うモードと、普通に直接MCDRAM使うモード、そしてちょっとだけキャッシュとして使って、残りを直接扱うモードの3つが用意されています。

一番最初のケースだと、OSからはMCDRAMを管理する必要がないので、対応は不要です。まあでもこういうのって、プログラム側が明示的に使いたいものですし、某研究所の偉い人曰く、Flat Mode(直接使うモード)で使うべきとの事なので、ちゃちゃっと実装しました。例によってlivaの雑記帳(2016/10)の10/27にそこら辺の話が軽くあります。

MCDRAMは名前こそかっこいい(?)ですが、実態はただのNUMAノードで、システム的にもNUMAとして扱われます。NUMAという事は、NUMAを取り扱う機構がIntelアーキテクチャー上に既に存在するので、Xeon Phi向けの特殊実装をする必要がないという事です。Intelすげぇ(n度目)

NUMAの情報はACPIのSRATというテーブルから取ってこれます。(ACPIの仕様書は参考資料に記載)テーブル読むだけで良いので、ACPICAとか使わずに自力で解析しても大丈夫です。

で、テーブル読めば分かるのですが、DDR4もMCDRAMも同じ物理メモリ空間にマッピングされていて、先頭の0〜XX GB(XX=搭載DDR4メモリ)がDDR4、XX〜XX+16 GBがMCDRAMという形になっています。なので、メモリアドレスを変えるだけで、アクセスを切り替えられる、というわけですね。楽ちん。

後はプロセスからのNUMA要求があったら、MCDRAMがマッピングされているメモリ空間を適当にページングで仮想メモリ空間にマッピングしてあげればよろし。

最後に

いかがでしたでしょうか?メニーコアマシンとて、恐るるに足らず、といった事が分かってもらえたと思います。256コアマシンがお手元にある方は、Linuxを動かして満足せずに、OSをパパっと作っちゃいましょう。

256コアマシンの素晴らしい所は、マルチスレッディング周りの実装エラーがポンポン発現する(それまで16コアマシンで出なかった、スピンロックの実装ミスが毎起動時に発生したりとか)ので、デバッグにも大変役に立ちます。まあそれだけでXeon Phi導入するのはコスパ悪すぎますけどね。

とはいえ、非常識な値段でもないです。かなり潤ってる社会人なら頑張れば買えるかなー、って感じ。Mac Pro2台分くらいですかね。会社の研究用予算で落とすとか、研究室の予算で落とすとか、が一番楽だと思います。中高生は・・・時が解決するさ。

あと、メニーコアマシンはLinuxだといろいろ辛い部分があるので、それこそ自分たちでOSを作る人達が生きのびる余地がある領域だと思います。楽しいよ!メニーコアマシン!皆もやってみよう!

Q&A

Q. 256コアだとタスクマネージャーどうなるの?

A. やばい

Q. うるさそう

A. 水冷マシンなので、僕の個人用デスクトップPCより静か

Q. 電力やばそう

A. 600W電源でいける

Q. どこで買えるの

A. 業者発注。そうそう、Xeon Phiの取り寄せをしてくれた業者さんが、他にも発注があれば是非うちに、商社通すよりは安くできるよ!って言ってたので、興味があればお気軽にご連絡下さい(?)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中