yamaguchi.txt

開発日記。備忘録代わりだよ。

CERNでの仕事と生活

日本を離れる日、成田空港の国際線ターミナルCPU実験の記事を投稿してからあっという間に7ヶ月が経ちました。

日本人の知り合いが一人もいない状態でジュネーブに単身移住しアゼルバイジャン人とシェアハウスしながらヨーロッパ人しかいないCERNのソフトウェアチームでブルガリア人の上司を持ちC++標準化委員のリーダーと働くとはどういう感じなのかが伝われば幸いです。

ちょっと前ですが類さんに関連する話を収録していただきました。
15. CERNでのソフトウェアエンジニアリング (高橋祐花)

仕事編

f:id:yamaguchi_1024:20181009071808j:plain
ウェブが生まれたところがそこら辺にある。

なんの仕事してるの?

答えるのがめんどくさい時の返答
物理解析に使うROOTというソフトウェアを開発しています!

中くらいの返答
CERNで研究開発のインターンをしています。検出器で検出された大量のデータを解析するためにROOTという物理解析ツールがあります。ROOTは巨大ライブラリ群みたいなものなのですが、そのバックエンドでClang/LLVMを用いたClingというC++インタープリターが動いており、その最適化や結果として発生するメンテナンスやバグフィックスもしています。

ちゃんとした返答
ジュネーブにあるCERNという研究機関でAssociate Memberとして1年間研究開発をしています。最初の半年はCincinnati大学、後の半年はPrinceton大学の所属としてCERNとUS FundingのDIANA-HEPというところからお給料を頂いています。CERNにはLHCという加速器の他にAtlas, CMS, LHCb, Alice等々のexperiment(用語)があり、それらが検出したデータを解析するためにROOTというオープンソースのソフトウェアが使われています。ROOTとはインタラクティブに動くソフトウェアかつライブラリで、Math, Graphics, Machine Learning, Python bindings, Fittingなど解析者に便利な機能が提供されHEP(High Energy Physics)界隈ではスタンダードなツールです。かの有名なHiggs粒子の解析ももちろんROOTを使って行われ、有名なHiggsのグラフもROOTのヒストグラムを使って描かれました。ROOTのバックエンドではClingというC++ Interpreterが動いており、これはInteractive Promptと実行時のReflection Informationを提供するために使われています。ROOTの全ての機能はこのインタプリタを通して提供されるため、インタプリタのパフォーマンスはROOT全体のパフォーマンスに直結します。データセンターでもROOTは動いているのでそれを効率よくすることは費用的にも利があります。私の仕事はC++ Modulesという技術を用いてClingのパフォーマンスを最適化することです。バックで使用されているClang/LLVMやClingといったコンパイラインタプリタは大変な複雑さを持つもので、分かっている人は少ないためその辺りが壊れた際のバグフィックスやユーザー(この場合はインタプリタの関数を使っているROOTの開発者)をサポートしたりもしています。これ以上の技術的な話に興味がある方はぜひROOT Users workshopで発表したスライドを見て下さい。

仕事は"どう?"

楽しいですよ。もちろん仕事なので楽しくないこともありますけど。

技術的にはC++コンパイラインタプリタはとても複雑で面白いしオープンソースに貢献出来ているというのは嬉しいです。C++ ModulesはGoogleAppleが最大の開発者でありユーザーなのでその人たちと隔週でミーティングしているのも産業界と繋がっている気がして悪くないです。一番自分の為になったのはコンパイラという超巨大なソフトウェアも所詮ただの関数の集まりでしか無くて、ASTやシンボルなどというものもそういうクラスがあってインスタンスが関数の中を飛び回っているだけなんだという事を知れた事です。それが分かったことで、コンパイラやOSなどの巨大ソフトウェアに対する恐怖心がほぼ無くなりました。巨大ソフトウェアは何か怖いもので読んでも分からないしプロしか触れないものでは無いのです。本当にただの関数の集まりなので怖がらずに一つ一つ紐解いていけば誰でも分かるという事を学びました。

人間関係は悪くないです。同じ上司を持つウクライナ人の妹みたいなポジションになっており、オフィスでも常に一緒、昼ごはんも常に一緒、カンファレンスに行ったら同じ部屋に泊まりトイレ以外常に一緒にいてついでの旅行も一緒に行くみたいな居心地の良い感じになっています。上司は東欧人男性あるあるのツンデレですがいい人で、チームリーダーは本当にめちゃくちゃ優秀で尊敬しています。他のメンバーに比べて圧倒的に年下かつ非ヨーロッパ人なので多少不審な挙動をしても多めに見られている気がします。先日リーダーにファンディング探してくるからもっと長くいない?と言われたので働いてない訳ではないようです。大学に戻らないといけないので断りました。

給料はシリコンバレーインターンなどと比べると安いですがそれでも高い家賃と食費と旅行に行きまくっているのを差し引いてもまあまあ貯まりそうです。アカデミアあるあるですが、予算が限られているのでポジション争いが激しくほぼ全員が任期付き雇用だし昼ごはんは無料じゃないし、単純に給料や福祉のことだけを考えるなら企業に行った方が良さそうです。CERNで働いている人はソフトウェアチームでも全員が当たり前にPhDを持っていて、学会で成果を発表することが要求されるのでプログラミングだけではなく発表したりジャーナルに出したりしたい!という人には向いていそうです。

海外出張や発表が多いこともユニークな点です。今年は7月にCHEPという学会で発表して9月にROOT Users workshopでまた二つ発表、10月のLLVM dev meetingも行くことになっていて10月末にはジャーナルの締め切りもあります。大きめのもの以外にもインターナルなミーティングで発表などはしょっちゅうあり、スライドを作るのに費やされる時間が多いです。発表が多いことは慣れる点ではとても良いですが、あまりそれに時間を費やしすぎると普段の開発に支障が出るのでバランスが大事です。概ね、開発をする->焦ってスライドを作って練習する->発表する->開発をする->..というサイクルで動いている気がします。

生活編

生活が落ち着くまでに苦労したこと

住むところが見つからない。出国前の1月は毎分CERNマーケットのウェブページをリロードして新着の物件がないか探していました。ここでのアパート探しは気に入った物件がある->大家に自分がどれだけ信頼に値する人間かメールする->大家が選ぶ というプロセスなので何十通も仕事に応募するようなメールを書くことになります。今住んでいるアパートは見た瞬間これだと思い、日本にいるので下見は当然出来ませんが即決しました。今ではかなり気に入っていて、これ以上いいところはなかなか無いんじゃないかなと思います。シェアメイトは博士課程の男性なので心配されたりするのですが逆に男性の方がキッチン使わないしお風呂も短いし部屋に籠っているしで気楽です。

料理が本当に不味い。これには本当に驚愕しました。CERNの食堂で昼ごはん一食1500円くらいするのに不味すぎて喉を通らなかった・・。電子レンジと炊飯器と米を頑張って買って来て餓死を免れました。

最初は結構孤独でした。社交的でも無いのでオフィスに行ってコンパイラと格闘して家に帰って掃除して料理して寝るしかしてませんでした。当時は誰にも弱音を吐いていなかったと思うんですが思い返すといきなり涙が出て来たりしてた覚えがあるので実は辛かったんだと思います。つらいことはすぐ忘れるタイプなのであまり覚えてないですが、当時はこれ私じゃなきゃ心折れてるよなみたいな事を思っていた気がします。よく頑張ったなあ。

平均的な平日

朝遅めに起きて遅めにCERNに行く。メールなどが来たら返信してコードレビューが来ていたらなんとかする。Nightly buildやIncremental buildが故障してないかとかも確認して壊れていたらなんとかする。同じ机に座っている仲のいい同僚が話をしたいムードの時は話をしながら仕事をする。CERNの食堂は普通のランチタイムだと飽和状態になるため先の同僚と11:30くらいに食堂に行き毎回メニューがいかに酷いかを嘆く。パスタは往往にしてマシなのでパスタに10CHF払いさっさとランチを食べエスプレッソを飲んでオフィスに戻る。忙しくなければだいたいそこで話が弾み1時間くらい話をする。午後はまあ普通にプログラミングをしたりミーティング行ったり誰かを説得したりして気付いたら夜になる。家に帰ってもしょうがないからオフィスで仕事をしながら関係ない大学の研究したりロシア語の勉強したり趣味の開発をしたりして結局帰るのは21時だとかなり早いくらいになる。家に帰って家族や彼氏に日本から持って来てもらったレトルトカレーを食べて寝る。
f:id:yamaguchi_1024:20181009075220j:plain
毎日カレーしか食べていない

週2くらいで友達と家で料理を作ったり外に食べに行ったり観劇しに行ったりといったイベントがある。

週末は何してるの?

旅行・カンファレンス・何かのイベントで家の外にいるのが70%くらい、家に引きこもってカタカタしているのが30%くらいです。親や友達や彼氏が結構頻繁に来るので案内したり、学会のついでに旅行をしていたり、バーベキューみたいなイベントがあったり様々です。最初の2ヶ月くらいは友達もいないし一人で旅行していたんですが、最近はずっと誰かと一緒に旅行している気がします。

この7ヶ月で行ったところ
3月 チュニジア(旅行)
5月 バルセロナ(旅行)
6月 ウィーン(旅行)
7月 ブルガリア(CHEPという学会)
7月 日本(CHEPからの一時帰国)
8月 バンクーバー(SIGGRAPHという学会)
8月 オランダ(SIGGRAPHのついでの旅行)
9月 ボスニア・ヘルツェゴビナ(ROOT Users workshop)
9月 クロアチア(ROOT Users workshopのついでの旅行)
9月 ブダペスト(ROOT Users workshopのついでの旅行)
9月 ミラノ(ROOT Users workshopのついでの旅行)
9月 ウクライナ(旅行)

この他にも家族が友人や彼氏が来た時にスイス国内や近隣の国に色々行ったり山に登ったりしているのでちょっと遊びすぎですね。

ジュネーヴぐらし!

ジュネーヴはお世辞にも暮らしやすい場所とは言えません。個人的にはかなり最悪に近いです。(注 私が好きな街はウクライナキエフとブラジルのサンパウロです

物価が高いです。東京の3倍くらいする気がします。アイス買ったり水買ったりするのもお金の無駄だなあと思いながらなので精神的にあまり良くないです。おまけにご飯がとても不味いです。
f:id:yamaguchi_1024:20181009075022j:plain
おととい食べた牡蠣一皿で70CHF(8000円)

ジュネーブには何もないです。劇を見たかったら下北に行って美術館に行きたかったら上野に行って当日思い立って渋谷に映画を見に行ける贅沢にどっぷり浸かった東京生まれ東京育ちには厳しいです。本当に何もない。遠くにモンブランが見えます。

スイス人、特にフランス系スイス人は優しくないです。もちろん例外は存在しますが、スーパーや街で見かける普通の人間の質は高くないです。でもフランス語圏あるあるの人とすれ違ったらBonjourというのは良い文化ですね。

学びと友人

CERNは友達がたくさん出来る場所とは言えません。成熟した研究機関なので、大学のようにクラスでグループワークみたいな事もないし若い人で集まって騒ぐみたいなイベントもあまり無いです。やろうと思えば家とオフィスの往復だけで同僚以外と話さずに終える事もできます。自分から話しかけに行くか自然に仲良くなるのを待つか話しかけてもらうかしないと友達は出来なさそうです。

私は何人か友達が出来ました。二人のウクライナ人は元と現オフィスメイトで、イタリア人は日本語教えて!って出国前にメール来たのがきっかけで、スイス側日本人グループは私がトラムで話しかけたのがきっかけでした。友達とは言えないまでも色々な国籍の知り合いが増えました。広く浅く知り合いになるよりはひとりの人とずっと一緒にいたいタイプなので最後までこんな感じでいたい。

人間として成長した部分もあります。ここに来る前はちょっと引いていた他文化の行動・考え(友達や同僚の集まりに彼女や彼氏を連れて来る、日本では許容されないくらい国粋主義的・差別的な発言をする、子供が何歳になっても結婚せず事実婚カップル、告白という文化がなくセックスしてから付き合う、日曜日は家族で過ごさないといけないという脅迫観念、ありえないほど長い休暇を取る、イスラム教の女性のヒジャブハラール、そもそも一神教を信じている、などなどなどなど・・)を受け入れるとまではいかないものの、直ちに反感を持つことは無くなりました。

自分に馴染みのない意見を持っていたり行動を取る人でもとても優秀で尊敬できてすごく仲良くなれる人はいて、よくよく話を聞くと「なるほどそういう背景があったのか。自分も同じ立場だったらそうするなあ」と納得できる事が多いです。先進国じゃなかったりする環境で育って自分の想像もしなかった世界を見て育った人がいるかもしれない、そういう人とすごく仲良くなれるかもしれない、彼・彼女の価値観をもっと理解したいと思うかもしれない。外国で暮らしているだけでこんなに自分の人生が豊かになるなんてなんてお得なんだろうと思います。



何か質問やコメントがあればどうぞ。

追記

コメントなど色々ありがとうございます。外国で暮らしている人の話って面白いですよね、私も人のブログ読むのは好きです。

外国ぐらし!はアクシデントとハプニングの連続ですが(リュック盗まれそうになったり家のオートロックにパジャマ一枚で弾き出されてフランスの友達の家までヒッチハイクしたり)、日本にいては出会えないような人と会えて思ってもいなかった人生の変化があります(語学やったりウクライナ移住が人生の目標になったり)。まだ5ヶ月頑張るのでよろしくお願いします。

> どうやってそのポジションにたどり着いたのでしょうか?
なんてことはない、去年のGSoCのメンターが今の上司です。

> 全然関係ないがブリュッセルNATO本部の食堂が化学兵器並みにマズいという話を思い出した。https://www.politico.eu/article/nato-under-attack-from-bad-food-cafeteria-aramark-catering/
めっちゃ笑いました。

> シェアハウスについて
最初は若干ビビりましたがなんてことはないです。シェアハウスってしてみると分かるのですがお互い忙しすぎて週一でまともに会話できれば多い方くらいになってしまうので、あまり関わりがありません。家賃が高すぎるので友人たちもみんな男女混合でシェアハウスしてますね。

> 大変そう(イージーモードロサンゼルスから視線)
アメリカにはアメリカなりの大変さがありそう、興味あります。

> エル プサイ コングルゥ
シュタゲ、後半面白くなると聞いていてのですが前半のノリが無理で途中で見るのをやめてしましました。

> CERNのネットワークに侵入してLHCをリモート操作するのは可能でしょうか。それやったら命狙われますか。
コントロールルームは隔離されているのでネットワークに侵入するだけでは厳しいと思います。Europolとかに捕まるかもですね。

> 困ったときの中華料理屋ってわけにもいかない環境なのか
ジュネーブにも中華料理屋はあり比較的安いので日本人とご飯いくかーみたいな時は行ったりします。ヨーロッパではケバブがファーストフードとしての地位を確立しているのでケバブやシャワラマは安くて美味しいご飯です。

> 私の記憶が正しければ、CERNで採用されたC++インタプリタは日本人の後藤さんが作製したもの。だよね?
昔のC++インタプリタCINTは後藤さんが開発したもののようです。ROOT Version 6から後はClingというLLVMバックエンドの新しいインタプリタが使われています。

私が海外で暮らしている・これからも暮らしたいと思っているのは日本が嫌だからではありません。日本(東京しか住んだことないけど)はすごく住みやすい国だしご飯は美味しいし人は優しいし文化的な活動が色々あるし私を20年間育ててくれた訳だしで、文句は全くありません。私が例えばスイスで生まれ育ったら東京に住んでみたいと思うと思います。なぜ海外に住むのが好きかというと、その方が刺激的だし東京に20年間住んでいるので流石に飽きてきたというだけです。

一人称の揺れは気分です。

> 去年のGsoCのメンターがCernでの上司とのことですが、物理学の人じゃない場合そういうコネが無いとやっぱりそのポジションを得るのは厳しいですか?あと大学を休学して仕事しているんでしょうか?
私は物理学の人ではなく、去年LLVMGoogle Summer of Codeに参加した情報系の学生です。CERNで情報系の職を日本人が得たいなら、コネというか実力を認めてくれて引っ張ってくれる人は必要です。なぜなら、ヨーロッパ等のMember Stateと呼ばれる国の学生ならSummer StudentやTechnical StudentといったオフィシャルなCERNのプログラムに応募する資格がありますが、日本はMember Stateではないので他のFundingを探さないといけないからです。もし興味があるならCERN HSF Google Summer of Codeに応募し、頑張ってメンターに実力を認めてもらってその後の機会に繋げるのが良いと思います。大学はそうですね、話すとちょっと長くなるのですがCERNにいる間はお休みしています。

CERN語

最近CERNにいる期間が残り少ないことに気付いてメランコリーな気分になったので忘れないように思ったことを纏めます。

CERN語について

CERNでの公用語は英語とフランス語。オフィシャルなメールなどは英語+フランス語で送られてくるがたまにフランス語だけなこともある。事務系の仕事はフランス人またはフランス語が流暢なイタリア人が多いからだと思う。CERNの英語はCERinglishと言われるくらいひどく、色々な国の人が好きなアクセントで好きに話している。

CERNで働く物理学者なら大学ごとに部屋やチームが閉じているので日本人なら日本語会話だけで仕事することも可能(というか多い)らしい。私がいるROOTチームは日本人は一人だが、英語のネイティブスピーカーが一人もおらず英語のレベルは全体的に高くないので、英語で劣等感を感じたり苦労することは特になかった。フランス人特有のアクセントはお世辞にも上手いとは言えないし、ミーティングで英語でなんて言うか分からない単語があったらフランス語で言ってみてそれが分かった人が英語で言うみたいな事もあるので、私のチームでは英語の能力はあまり必要ではない。

色々な言語を話す人がいるので、その場にいる人の最大公約数を取って言語を選択するというのがよく行われる。例えばイタリア人二人とスペイン人ならイタリア語あたりに落ち着くし、ドイツ人とフランス人ならフランス語で話しているし、post-USSRの国々の人々が集まったらロシア語で話している。別に何語で話してもいいのだ。

私はアングロサクソン至上主義みたいなのが嫌いで、日本人が海外で仕事をする時にアングロサクソンのカルチャーに合わせないといけないという強迫観念のような物を持たなくてもいいと思う。ちゃんと喋れてさえいれば完璧なアクセントでなくてもいいのだ。聞き返されたら聞き取れなかった方が悪いのだ。アングロサクソンのアクセントでないことを恥に思う必要は全くないのだとCERNの人々を見て思う。

英語について

上手い人は上手いし下手な人は本当に下手。でも正直そんなことはあまり関係なく、当然技術的な実力の方が重視される。意思疎通さえしっかりできれば良いのだ。

小学生の時1年間イギリスに住んでいた事があり、帰国後も割とちゃんと勉強していたのでそれくらいのレベルで別に困らなかった。稀だが、会話の中で聞いたことない単語があればその場で意味を聞いているし相手も分からなかったら聞いてくる。英語のレベルが云々より堂々としていること、伝えるだけの内容を持つこと、ちゃんと相手に分かりやすいように説明をすることが大事である。コミットメッセージのタイポはたまに指摘される。

フランス語について

ジュネーヴはフランス語圏なので、当然日々の暮らしではフランス語が必要である。CERNに勤める人々は基本的なフランス語会話はできる場合が多い。

私は出国前にDuolingoのフランス語を40%くらいやってから行ったが、最初はそもそも相手が言っている単語をパース出来なかった。無声音やリエゾンなどがありごにょごにょ言っているようにしか聞こえないのだ。しかし流石に日々暮らしていると色々と慣れ、まずはトラムの駅を通過するごとに駅名の読み方を覚えトラムのアナウンスを覚え料理を注文する時によく使う表現をフランス人に教えてもらい・・などしているうちに買い物などをするだけなら困らないようになった。ちゃんとした会話ができるレベルでは到底無いが、ちゃんとした会話をしたいと思う相手は英語が喋れるので困っていない。フランス語は困らないレベルに達したらあまり勉強しなくなってしまった。

スペイン語について

CERNにはドイツとイギリスが最大の出資をしているにも関わらず、CERNにはラテン系の人が多い。理由としてはイタリアやスペイン、ポルトガルなどでは賃金が高く無いので研究者はCERNに来たがり、イギリスなどではすでに高いのでわざわざ応募するインセンティブが無いのだろう。故に日々聞こえてくるスペイン語も多い。

前期教養の時に友達が選んだからという理由でスペイン語を選んだ。授業ではあまり真面目にはやっていなかったが、2016年に南米に1ヶ月旅行に行った時に南米はスペイン語しか通じないので死ぬ気で勉強した。本当に英語が全く通じなかった。結局南米が大好きになり、その後も継続的に勉強したりスペイン人を見つけては練習台になってもらったりしている。スペイン語話者はフランス語話者と比べて適当な文法でも分かってくれるしちょっと話せると喜んでくれるし親切に教えてくれるし最高である。

ドイツ語について

ドイツ人はドイツ語のことをEnglish++と言っている。ドイツ人は英語が平均的に上手いのでドイツ語を勉強する必要はあまり無い。

私は中学の時に中二病NANAを聞いたりドイツ語を齧ったりしていた。去年の冬に自分の中でドイツ語ブームが訪れDuolingoを50-60%くらいやったりドイツ語選択の教科書貸してもらったりドイツ人にドイツ語でメッセージを送りつけるなどしていた。スイスの四つの公用語のうちの一つがドイツ語で、話者も多いのでBernやZermattに行くときはお店で使うかなくらい。ドイツ人もフランス人と比べるとちゃんとドイツ語聞いてくれるし優しいしで最高である。

ロシア語について

ここ最近のブームである。CERNに来て1ヶ月もしない頃から同僚から聞いてもいないのにロシア語のアルファベットиの読み方をいきなり教えられたのが始まりだった。何故か私の周りにはpost-USSRの人々が多いのでオフィスでの会話の大部分がロシア語で、流石に一日中聞いていたら脳内頻度分析がされ「もーじゅな」「はらしょー」「やにぱにまーゆ」ってよく言ってるなあとは分かってくるものである。

その後も事あるごとにロシア語のアルファベットや単語をたまに教えられその都度へーと思い、カチューシャをロシア語で歌えるように練習して歌詞で出て来たアルファベットの読みを覚えなどやっているうちにキリル文字がなんとなく読めるようになった。先日ウクライナに行って惚れ込んでからはロシア語話者を練習台にして迷惑がられている。

ウクライナが好き

9/28から10/2までウクライナに旅行に行っていて、結論から言うと感情の塊になったので感情を整理するためにブログを書きます。

背景

現在同じ机に座っているウクライナ人Oちゃんと、5月までオフィスにいたウクライナ人V君の影響でCERNに来てからロシアンラップを聞くようになったりロシア語教えてもらったりしていた。二人は政治的に対照的で、同時に両方の耳から真逆の視点の話を聞くうちに当然ウクライナに興味を持ち自分の目で確かめたくなった。

V君がキエフに帰ってしまったので遊びに行くよ!と約束しつつ夏の間は忙しくて9月末まで行けなかった。イタリア人のLちゃんを7月ごろに旅行に誘い、Lちゃんのウクライナ人の友達DちゃんとDちゃんの友達Lsちゃんとその彼氏、Oちゃんの友達Aちゃんとその彼氏も巻き込んだかなり濃密な旅行になった。

9/28 キエフで講演

Dちゃんが主催している科学イベントでLちゃんと共にCERNについて話してくれないかと言われ、快諾した。イベントは金曜の夜だったので仕事を休み昼過ぎにキエフに到着した。空港から市内までは電車がないのでバスで移動した。Lsちゃんの家に泊めてもらえることになっており、40分くらい迷いつつ家に到着した。

www.facebook.com

会場は本屋兼カフェ兼イベントもできるよみたいな場所で、とても良かった。誰が聴衆なのか知らなかったが行ってみたら科学者が多く、V君も来てくれてプレッシャーを感じつつなんとか話を終えた。パブに移動し、質問をされたり行くべき観光場所を教えてもらったりした。こういうイベントに来る人だからだろうが、向上心と好奇心が強くコミュニケーション力も高い人が多くて感心した。外国人が来て科学について話すようなイベントはあまり無いらしく、とても喜んでもらえて嬉しかった。

9/29 キエフ観光とバレエ

V君とLちゃんと三人でキエフ観光をしていた。

私はアラベスクという漫画を小さい時から愛読していた。主人公はキエフ出身のバレリーナで、あらすじは(当時の)レニングラードバレエ団に入団しプリマになっていくシンデレラストーリーだった。この漫画をきっかけにバレエが好きになり、特に(レニングラード)マリンスキーバレエ団、ボリジョイ、キエフは私の中でホワイトバレエのメッカになりずっとずっと憧れていた。この日程を選んだ理由の一つが土曜日にくるみ割り人形の講演があったからだった。Sugar plum fairy danceが死ぬほど好きで、死ぬほど生で見たかった。

f:id:yamaguchi_1024:20181003055932j:plain

バレエは最高だった。ロシアの踊りと花のワルツはとても印象に残った。パドトゥは本当に最高で、女性のバリエーション(sugar plum fairy dance)は期待値が高かったので生で見れて感動したし男性のバリエーションはあまり期待していなかったがジャンプが高く、鳥肌がたった。無理やり連れて来てしまったあまりバレエに興味ない二人も感動していたのでとても良かった。

f:id:yamaguchi_1024:20181003055642j:plain
徴兵拒否運動を起こした学生たちへの罰としてニコライ1世が赤く塗りつぶしたキエフ大学の赤い門。

f:id:yamaguchi_1024:20181003055822j:plain
ウクライナ人はデモが好きらしい。2004年2014年のデモはとても有名だ。独立広場には2014年に亡くなった人の写真や政治的プロパガンダ、花や国旗が飾られていて心が痛む雰囲気だった。

f:id:yamaguchi_1024:20181003055829j:plain
歴史博物館にあった写真で2014年の革命でレーニン像が破壊されている様子。

キエフの人々にとって2014年のデモは記憶に新しく、それに続くロシアのクリミア編入とドンバスの分離主義武装勢力との対立は現在も最大の関心事のようだった。東西に1500kmにも及ぶウクライナは西、真ん中、東で政治的に意見が異なり、歴史的にポーランドハプスブルク家支配下にあり混血も進んだLvivなどの西側地域では親ヨーロッパで独立意識が強く、スターリンによって強制移住させられたロシア人が多い東側の地域では親ロシアな人が多く互いに対立している。日本人にとって戦争とは70年前に終わった出来事だが、ウクライナ人にとっては友人や家族が殺されている現在進行形の悲劇であり、ウクライナ人のロシアに対する憎しみや怒り、またはロシア系ウクライナ人のウクライナ政府に対する憎しみが痛いほど伝わって来て心が揺さ振られた。来年の三月に大統領選挙が行われるが、大衆迎合的なティモシェンコ(美しすぎる首相と日本でも話題になった)と対立する現職のポロシェンコがeducatedな人々にとっては推しのようだった。ウクライナの平和を願うばかりである。

9/30 チェルノブイリ

V君とLちゃんと1986年に原発事故があったチェルノブイリに行った。ウクライナを含めて30ヶ国を旅して来たが、チェルノブイリは本当に特別な場所だった。これは行ったらちょっと人生が変わるかもしれない。

ウクライナ人は寿司が好きらしい。朝8時にツアーのバスが出発するのでLちゃんと5時半起きして頑張って中央駅まで行き、ウクライナの寿司はヤバイと聞いていたのでチェーンの日本食レストランに入った。日本食は人気らしく、街を歩いていると1分に一度のペースで見かけることができる。ジュネーブにも欲しいね!と二人で感激していたが、サラダの中に芋虫を見つけて無言になった。

事故が起こったチェルノブイリ原子力発電所第4号炉の周りは10km, 30kmのexclusion zoneになっており、バスで通り抜ける際は事前登録した情報と照らし合わせるためのパスポートコントロールがあった。exclusion zone内には複数の街(今は廃墟)+原子力発電所+ソ連のミサイル発見レーダー(OTHレーダー)があり、それらをガイドさんが丁寧に説明してくれた。

f:id:yamaguchi_1024:20181003070058j:plain
1986年発行のソ連の新聞がそのまま放置されている。

f:id:yamaguchi_1024:20181003070106j:plain
廃墟の一つにあったチェブラーシュカのぬいぐるみ

ベラルーシとの国境に位置し、今では10kmゾーンに入っているプリピャチという街はチェルノブイリ原発で働く労働者のために設計された計画都市で、"The best city of Soviet Union"と言っていたらしい。バスの中で見た事故前のプリピャチの街は美しく、川も文化センターも運動場もある完璧なソビエトの街だった。

f:id:yamaguchi_1024:20181003070417j:plain
ガイドが持っている写真が同じ位置のビフォーアフター。完璧なソビエトの街は森になってしまった。

f:id:yamaguchi_1024:20181003070331j:plain
Red forestという事故発生時に風下に位置し、放射線で葉が赤く枯れてしまったことでそう名付けられた森。汚染された木は地下に埋められ新たな木が植林されたが、汚染物質は地下に埋められただけなので放射線濃度は依然として高く、誰もここから先は立ち入ることができない。

f:id:yamaguchi_1024:20181003070301j:plain
チェルノブイリの食堂でいただいたソビエト人民食。労働者は同じメニューだが2倍の量を食べるらしい。CERNの不味いレストランに慣れているLちゃんと私はこっちの方が健康的で良いと思った。

f:id:yamaguchi_1024:20181003070237j:plainf:id:yamaguchi_1024:20181003070250j:plain
(元)保育園での写真。ハーモニーという映画の一シーンを彷彿させる。

f:id:yamaguchi_1024:20181003070221j:plain
OTHレーダー。写真だとサイズ感がよく分からないが高さ150mあり、かなり壮観であった。当時はソビエトの秘密軍事基地で、労働者は年に数日しかここを離れることが許されなかった。これは受信機で、送信機はソビエト内に三箇所存在したらしい。

f:id:yamaguchi_1024:20181003070456j:plain
活躍した除染員や消防士を讃える石碑。生き延びた消防士達の手によって掘られたらしい。今でも4/26にはサイレンを鳴らしながら原発を周り、犠牲者を追悼するらしい。

とても語りきれない。

三人で最高のウクライナ料理の晩御飯を食べ、V君に別れを告げLちゃんと共に西方最大の都市、Lvivに夜行電車で向かった。

10/1, 2 Lviv

Lvivはチョコレートやコーヒーが有名で、お気に入りの店を見つけ二日連続で行ったりした。Oちゃんの親友Aちゃんを紹介してもらい彼女の彼氏とともにフリーメイソンのバーやUkrainian Nationalist Style Restaurant (笑)に行ってどれも最高だったがチェルノブイリのことを書いた後だと書く気がしない。

f:id:yamaguchi_1024:20181003073939j:plain
フリーマーケットUSSRの軍人のバッジを手に入れた。私はこういうのが好きである。

最後に

ウクライナは私のお気に入りの国、キエフは私のお気に入りの街になった。

主食はじゃがいものようである。全体的に食べ物のクオリティは高く値段は安く、24時間営業のスーパーも沢山ありスイスに慣れている我々は泣き出さんばかりであった。Lvivで食べたブラウニーとココアは人生の中でダントツの味だった。

ウクライナ人は優しくて美しい。アメリカ人のような超絶フレンドリーな接客はしないが、困っていたら助けてくれるし気が効くし観光客にとても親切だし、裏表のない素直な性格をしている。

キエフに住んでみたい。ロシア語を勉強したい。キエフ以外にも色々な東欧の街に住んでみたい。ウクライナ人が何を考えているのか理解したい。V君やOちゃんの気持ちを理解したい。ジュネーブに帰りたくない。日本に帰りたくない。

私は完全にファンになってしまった。

高校受験の選択と反省

人生の選択に参考になる人のブログを読むのが好きなので、私もどこかの中学生の選択の参考になることを書きたいと思う。何故今更高校受験かというと選択をしてから一定期間経たないと客観的に語れないと思うから。(それでもちょっと恥ずかしいけど)

回想開始

中1から塾に通い始めた。小学生の頃は多摩川で泳ぐか本を読むかしかしていなかった子供なので親が流石に心配したらしい。塾では常にトップのクラスだったが、初めて他人に勉強で負けるという経験をした。記憶がある中で初めて悔し泣きをした。

中学は普通の公立中で、仲良い人達も特に勉強に興味があるわけでもなかったのでテニス部をしたり図書委員長をしたりコミケに行ったり一年に読んだ本の数を競ったりして標準的なオタク中学生の生活を送っていた。塾では初めて本気で競い合えるライバル的な友達が出来てとても楽しかった。

中3になって、受験のことを真剣に考えざるを得なくなった。数学が壊滅的に出来なくて(日比谷高校の過去問で9点とか取ったこともあった…)塾長に心配されていたが受験期には満点取れるようになった。親は日比谷高校推しだったが塾の仲良い人が西高を受けるというので西高を受けることにした。

先生は進学実績作りたいし親は私が頭いいことを信じれないらしいらしく滑り止めを受けさせたがったので、たくさん受験した。市川、國學院久我山、豊島岡、慶応女子、学芸大附属、西高の推薦と一般入試を受けて西高の推薦以外全部受かった。


そして、人生で一番迷ったくらいの迷いが生じた。正直高校は大学に受かるまでの間にどう遊ぶかだと思っていたので、楽しそうかつ同級生がある程度優秀ならこだわりは無かった。男子と話すのが楽なタイプだったので女子校は除外、市川と國學院久我山はレベルがちょっと低いから除外して西高と学芸で死ぬほど迷った。

家から近いしレベル高いしセーラー服可愛いしで学芸に傾きかけて、入試後の説明会に行った。そこで校長が「我が校は日本一優秀で(意訳)、受験に囚われずに自由な勉学を(意訳)」のような事を言っているのを聞いて幻滅してしまった。ちなみに慶応女子の説明会も校長が「慶応大学は東京大学より優秀じゃないけど映画スターからなんとかまで幅広い人材を排出しています!(意訳)」みたいなことを言っていて幻滅した。

そのことと、仲が良い塾の友達が西高に行くので西高に行くことにした。彼らは本当に頭が良くて本当に尊敬していて、彼らの成長が間近で見たいと思った。

回想終わり


賢そうじゃない子供だったしあまり勉学に興味無かったので、高校に受かるまでは本当に自分の頭が良いのか自信が全く持てなかった。裏を返すと高校受験を通して勉強に自信が持てるようになって良かった。

反省点としては、友達に流されすぎたこと。結果的に西高は高校の中ではマシな高校だったが、進学先を決めるのに友達が行くからだとちょっと恥ずかしかった。振り返ると情報オリンピックやなんとかオリンピックや課外活動を重視している高校〜などを考慮に入れても良かったかもしれない。

東大のCPU実験で自作コア上の自作OS上で自作シェルを動かした話

東大の情報科学科では3年の秋学期にCPU実験という、自分たちでCPU、コンパイラ、シミュレーターを作ってレイトレーシングを動かすことが単位要件の名物実験があります。僕らの班では12月初旬に単位要件を満たすCPUは出来ていたので、2/20にあった成果報告会までの間にIwashi班という自作CPU上でlinuxを動かすことを目標とした余興班を作ってこのエントリのタイトルにあるような結果に終わったのでその報告をしたいと思います。

コンテキストスイッチしている画像:
f:id:yamaguchi_1024:20180227131550j:plain

目次

対象とする読者

  • (メイン)これから情報科学科に入ってCPU実験をして面白い余興をしようと思っている後輩
  • 後輩の進捗を覗きに来たISの先輩
  • その他面白いと思ってくれた界隈の人

CPU実験でははじめにFPGAとコンテストサーバーを渡されてレイトレをしろと言われるだけで基本的には何も教えてはくれないので学生は先輩のブログなどを読んで情報を収集します。自分達も先輩のブログに助けられたので今度は後輩が参考になるようなブログを書きたいと思います。

自己紹介

私の班でIwashi班の元となった班が6班で、メンバーは僕(コア)、maane123(コンパイラ)、mdj982(シミュレーター)とあと一人最終的に失踪してしまったしかく係*1で構成されていました。Iwashi班のメンバー*2は僕(コア書いた、linuxのデバドラ書いた、シェル書いた、発案したり人々に仕事振ったりした)、kcz146(CでフルスクラッチでOS書いた、QEMUに追加命令実装した)、mdj982(シミュレーター書いたりデバッグ手伝ってもらったり色々)、hikalium(QEMUのバグ直した、カーネルパニックさせた)です。

Adelie(6班1stアーキ)のソースコードここ、Iwacpu(班横断2ndアーキ)のソースコードここです。

できたこととできなかったこと

  • コアでlinux動かすのはできなかった

f:id:yamaguchi_1024:20180227171514p:plain

  • 自作OSがコア上で動いた!

シェルが動いている動画(バックで話しているのでとてもうるさい):
youtu.be

コンテキストスイッチしている動画:
youtu.be

技術的な詳細

ISA

僕らの班ではISAはriscvのものを元にした。理由は私が将来性を感じて好きだったから(当時)。東大であったriscv dayにも行ったりなどもしてriscvについてはかなり知見を深めたので今ではいいところと悪いところが見えてきた。

よかったところ

他の班はMIPSPPCを元にしていたが、それよりはずっとマシだったと思う。MIPSPPCは良くも悪くも古いので、なんでこんな仕様にしたんだ・・・という仕様が沢山ありそれが嫌だったので自分たちで修正しました・・というような班が多かった。その点、riscvは反省を元に作られているので単純かつ必要十分で仕様に対して怒りが湧くことはほぼなかった。おすすめできるISAである。また、riscvに関する書籍は限られているためFPGAマガジンのRISCV特集という本がとても役に立った。コンパイラとシミュレーターにRV32Iの仕様書を渡してこれでいくからよろしく!と言ったら大体形にはなる。仕様はここに書いてある。

悪かったところ

riscv, ISAは良い。ISAは良いが・・・・。他が発展途上すぎる。全体的に理想論すぎるという印象を受けている。riscvはバークレーが「オープンソースならぬオープンISAを作ることによって企業の興隆にソフトウェア資源が依存するのをやめよう」というモチベーションで始められたもので、バークレーMIPSの開発元でもありアーキテクチャ関係ではとても強い大学なので流石にしっかりしているが、アーキテクチャの仕様というのはISAだけではないだろう。riscvはISA以外の仕様はほぼないので実装任せな部分が非常に大きく、結局実装任せじゃないか・・という気持ちになった。バークレーのOBが作ったベンチャーのSiFiveという会社がriscv実装のチップを提供していて、こことバークレーくらいしか諸々のソフトウェア資源のメンテナンスをしていない。例えば、ここからビルドできるgnu-toolchain,pkやriscv-qemu, riscv-linuxなど。実装されてはduplicateされているオプションなどもあったり、freedom-u-sdkというSiFiveが提供しているtoolchain wrapperなども32bitがunsupportedなどととても発展途上である。いくらISAが綺麗でも環境が整備されて使われなければなんの意味もないので本当に頑張ってほしい。

結論

riscvのISAは、自分で実装するのはおすすめだ。実際riscvのFounderであるKrste*3も、中小企業で小さいCPUを作らなければならなくなったら是非riscvを使って欲しいと言っていた。その需要は現に僕が使ったのであると思う。しかし、チップの性能はISAでは決まるものではないしIntelなどのCPUを量産するような大企業にとってはriscvを採用するアドバンテージが何一つないので普及するかはかなり疑問である。

1stアーキテクチャ(Adelie)で実際に使われていた命令*4:
   LUI: Load Upper Immediate *5
   JAL: Jump And Link by Immediate
   JALR: Jump And Link by Register
   BEQ: Branch on Equal
   BNE: Branch on Not Equal
   BLT: Branch on Less than
   LW: Load Word
   SW: Store Word
   ADDI: Add by Immediate
   ADD: Add
   SUB: Sub
   SLLI: Shift Left Logically by Immediate
   SRAI: Shift Right Arithmatically by Immediate
  
   FLW: Floating-point Load Word
   FSW: Floating-point Store Word
   FADDS: Floating-point Add
   FSUBS: Floating-point Sub
   FMULS: Floating-point Multiply
   FDIVS: Floating-point Divide
   FSQRTS: Floating-point Square-Root
   FEQS: FLoating-point Equal Setting
   FLES: Floating-point Less-or-Equal Setting *6
   FSGNJXS: Floating-point Sign-Injection in Xor *7
   FMVSX: Move to Floating-point register from Integer register *8
   FCVTWS: Convert to Integer register from Floating-point register *9
   FCVTSW: Convert to Floating-point register from Integer register *10
  
以下の3つはRISCVの仕様にはない独自命令
   OUT: Output *11
   IN: Input *12
   ROT: Rotate Endian *13

Iwacpuで実際に使われていた命令*14:
lui
addi
jalr
sb
sw
lw
lbu
jal
add
slli
bne
bltu
bge
blt
sub
and
andi
or
beq

in
out

ステート管理

fetch, decode, execute, writeback, memoryという5段階に加えてfloatingやuartもあるのでstoleも付けた。細かくステートで分けるのは良かったと思う。実装も難しくないし愚直に実装しても300Mz余裕で出たので結果的に結構早くなる。詳細はコードを見て欲しい、結構コメントも書いてあるので読みやすいと思う。

Floating point

IPコアが使えるので楽勝である。ISAのところでも書いたが、浮動小数点関係の命令はFLW,FSW,FADDS,FSUBS,FMULS,FDIVS,FSQRTS,FEQS,FLES,FSGNJXS,FMVSX,FCVTWS,FCVTSWを実装した。

UART

方針としては 1. axi uartliteを使う2. axi uartを使う があると思う。MMIOや夏学期に実装するオレオレuartを使う手もあるが正直全然おすすめしない。僕らの班はuartliteを使った。axi uartよりは若干単純なのでとりあえず動かしたい班にはとてもいいと思うが、僕らは最終的にOSを動かしたくてDRAMも使いたかったのでDRAMを使うモチベーションがある人はuartを使うと二度手間にならなくていいと思う。

UARTはナメている人が多いがギリギリまで完動しなかった班はUARTでバグらせていたり、UART書き換えたら完動したという班もあったのでちゃんとloopback回路を作ってbaud rate上げても大丈夫なこと確認する、としっかりやったほうが後々無限にバグらせることがなくて良いと思う。

自作OS/Shellの仕様

タイムラインのセクションでも順を追って詳しく話しているので2月のところを読んで欲しいが、まとめると以下のようになる。

動機

Linuxは冷静に考えてこの数日で無理なので、小さいOSを動かしたい。OSの本質の1つとして、タイマ割り込みからのコンテキストスイッチによるマルチタスクがあるので、ここを実装すれば、OSを動かせたことになる。(たぶん)

やること

  • ノイマン型。命令メモリ・データメモリをわけず、1つのメモリを共有する。-> とりあえずデュアルポートにしようと思う
  • シミュレータとコアに、MMUによる仮想アドレス→物理アドレス変換を実装する。
  • シミュレータとコアに、雑タイマ割り込みを実装する。
  • コンテキストスイッチをする、OS Kernelを実装する。

実装方針

1ページは4096byte。32ページによる仮想アドレス空間。つまり仮想メモリアドレスは0x20000未満。よって、下12bitがページ内オフセット、それ以外がページ番号を指す。

増えるレジスタ

  • Page Register 32bit 32個: 32個のページが、物理アドレスのどこから始まるかを表す。
  • MMU Control Register 1bit: MMUによる仮想アドレス機能を有効/無効にする。無効のときは、メモリアドレスは、そのまま物理アドレスを表す。
  • OS Handler Address Register 32bit: タイマ割り込みハンドラの関数アドレス(物理アドレス)を格納する。タイマ割り込み時は、MMUを無効に設定しつつ、この関数に飛ぶ。
  • Next Program Counter Regiter(NPC) 32bit: タイマ割り込みハンドラから戻るべき先を格納する。常に仮想アドレスが入っている。
  • (カウンタレジスタ) 適当bit: もう既にコアにもシミュレータにもあるって言ってた。MMUが有効である間、一命令実行する毎にインクリメントされる。これが一定数(1000くらい?)になったとき、タイマ割り込み動作を行う。total_cnt, 10’b1111111111ごとに初期化する。

増える命令

  • mvptg %r2, %p7 (MV GeneralReg <- PageReg)
  • mvgtp %p7, %r2 (MV PageReg <- GeneralReg)
  • iret (Return From Interruption Handler): MMUを有効化しつつ、PCにNPCを代入
  • mvgto %r7 (MV OS handler reg <- General Reg)
  • mvnpctg %r7 (MV General Reg <- NextPC)
  • mvgtnpc %r7 (MV NextPC <- General Reg)

atomic命令はnop

すべて R-type, custom-2 (opcode = 0b1011011)

mvptg %r2, %p7 (MV GeneralReg <- PageReg)
funct3=0b000
funct7=0b0000000
ps1=PageReg
rs2=0
rd= GeneralReg

mvgtp %p7, %r2 (MV PageReg <- GeneralReg)
funct3=0b000
funct7=0b0100000
rs1=GeneralReg
rs2=0
pd=PageReg

mvgto %r7 (MV OS handler reg <- General Reg)
funct3=0b001
funct7=0b0000000
rs1=GeneralReg
rs2, rd = 0

mvnpctg %r7 (MV General Reg <- NextPC)
funct3=0b010
funct7=0b0000000
rd=GeneralReg
rs1, rs2 = 0

mvgtnpc %r7 (MV NextPC <- General Reg)
funct3=0b010
funxt7=0b0100000
rs1=GeneralReg
rs2, rd = 0

iret (Return From Interruption Handler)
funct3=0b111
funct7=0b0000000
rs1, rs2, rd = 0

MMUの挙動

上述したとおり、仮想アドレスがあったとき、Offsetは下12bit。PCを元に命令をとってくるとき、およびメモリ読み出し・書き込みいずれにおいても、MMUが有効であるなら、仮想アドレスをPageNumとOffsetに分けたとき、物理アドレスPageReg[PageNum] + Offsetにアクセスする。MMUが無効であるなら、それはそのまま物理アドレスである。

タイマ割り込みの挙動

コア・シミュレータは、命令を実行するたびに、「MMUが有効であるならば、カウンタレジスタをインクリメントする」をする。この直後、カウンタレジスタが、一定値(とりあえず#define TIME_INT_PERIOD 1000とする。)以上のとき、次に示すタイマ割り込みを行う。そうでないときは、普通に次の命令に進める。

タイマ割り込み:
カウンタレジスタに0を代入
MMUを無効化する
NPCを本来次に実行すべきPCにセット
PCをOS Handler Registerの内容にセット

iretの挙動

MMUを有効化する。
PC <- NextPCをする。

Kernelの実装

コンテキストスイッチをする。

シェル

書けそうなコマンド
echo: やるだけ
kill: プロセス構造体を壊す 生きてるかどうかboolをpsに足す
ps: プロセス構造体にアクセスする

カーネルはメモリ読み込み
inでプロセス3つくらい読む、一つはshell
fib, ポエムのプロセス
in, out 終わるまで割り込まないで

タイムライン

  • 9月

初授業に出る。班がくじで決まる。mdj982が遅刻してきたので最初はしかく係だったがシミュレーター書いてくれてシミュレーターになった。

  • 10月

最初はモチベが高かったので一週間で足し算くらいは動いて中旬にはfibが動いて月末には浮動小数点数の実装を始めた。

  • 11月

11月はLLVM dev meetingなどがあり前半から中盤はコアの進捗はほぼ0、代わりにコンパイラとシミュレーターが頑張ってくれていた。後半にやる気が出て浮動小数点数やuartの実装を始めた。

  • 12月

12月に入ってから怒涛のやる気が出て4日間学校に泊まりデバッグをした結果12/05に完動した。それから1週間2nd用にmul, divの命令を増やしたりコードを読みやすくかなり書き換えたりしたが結局この期間のコードは最終的に使わなかった。冬休みより1週間早く自主冬休みにしてヨーロッパ行くなどした。

  • 1月

試験勉強をしていた。後半は研究室行ったり渡航関係の細々したことしたり人と会ったりしていて進捗は出なかった。

  • 2月

20日の発表会の2週間前から怒涛のやる気が出た。ここから細かく見ていく。

  • 2/8

riscv-toolchainを使ってとりあえずlinuxをビルドしてみる。32bitでビルドし、ブートローダーを持ってきてシミュレーターにこのlinuxブートローダーが動くようなシミュレーター作ってとお願いする。

  • 2/9

gccをビルドする際にRV32IのみだけではなくRV32gcというデフォルトでビルドしていたためcompressed命令が含まれていてシミュレーターが頭をひねる。linuxカーネルコンフィグをいじって最小構成にしようと試みる。
Iwashidoc - Google ドキュメント

  • 2/10

GitHub - sifive/freedom-u-sdk: Freedom Unleashed Software Development Kit このsifiveというバークレー発のriscv実装している会社が提供しているツールチェインが32bitサポートされていなくてチーンとなる。

  • 2/11

hikaliumやkczらと地下で泊まりをする。この時点ではデバドラやQEMUに追加命令は実装していない生のriscvだが、QEMU上でlinuxカーネルパニックが見れる。

  • 2/12

寝てた。

  • 2/13

Emperorと命名して命令を足したりリファクタリングをしていた2ndコアが動かないことが判明し、1stのAdelieを元に浮動小数点数命令をはじめとした使わない命令を消して動くコアにした。

  • 2/14

linuxデバドラとQEMUに追加uart io命令を書く。シミュレーターはlinuxがelfなのでelfのヘッダー読むように変えていた。

  • 2/15

自作アーキ用にパッチを当てたlinuxQEMU上でカーネルパニックをするようになった。次はコアだが
- kernelは展開すると仮想アドレスだしかなり大きくなってしまうので、elfやgzipなどで圧縮してブートローダで展開しないといけないが実装とてもつらい
- ハードウェアの検出部分で死んでいると考えられるのでそこらへんの関数全部無効にしないといけない
- riscvの仕様通りに仮想メモリやシステムレジスタを実装するの厳しい
等の理由でlinux移植は現実的に無理だろうという話になり、目標を自作コア上で自作OSを動かすことに軌道修正した。
f:id:yamaguchi_1024:20180221064151p:plain
その時のslack
この時kczと地下で会議をして2時間くらいで自作OSの仕様が決まり、じゃあこれを実装していこうという話になった。
自作OS仕様 - Google ドキュメント

  • 2/16

コア、シミュレーター、OS共に自作OS用に実装を始める。この日に三人とも大体実装が終わる。この日から2/20の発表会まで僕は地下に泊まり込む。TSG*15でxv6分科会をしてxv6のコードを読んだり書いたりしてたのがだいぶ役に立ったっぽい。

  • 2/17

OSがコードを綺麗にしたり微修正したりする。シミュレーターとコアはmin-rtで使われてないけどカーネルでは使われている命令(lbu, sb)などのデバッグカーネル用に作った命令のデバッグなどをする。コアがなんとなく動く。

  • 2/18

カーネルをcoeにしてコアに読み込ませてからのコアデバッグが始まる。MMUのon/offがちゃんとできているか、タイマー割り込みで動いているか、ちゃんと割り込みハンドラに飛んでいるか、レジスタは退避されてるか、など。in/out命令で半日以上溶かしたが、inやoutでuartで通信している際にタイマー割り込みが来るとuartのstatusを管理しているレジスタが退避されず保存されるので次のin/outで死ぬということだった。

  • 2/19

動く
f:id:yamaguchi_1024:20180221065530p:plain
シェルの実装を始める。適当に2時間くらいで書いた。せっかくマルチタスクなのでpsとkillは実装したかったのでそのためにカーネルがプロセスを起動する際にレジスタでプロセス構造体のアドレスとプロセス数を渡すように変える。シミュレーターでは動きコアは何も変えてないのに無限にバグらせていて時間を溶かしていたらgccがmul命令を吐いていてコアでは実装されてないので動かないがシミュレーターでは動くという事案でとてもああああとなっていた。gcc, どうやら構造体のサイズが一定値を超えるとオフセットでアクセスしたいのかmulをしたくなるらしい、知るかそんなの。
f:id:yamaguchi_1024:20180221070019p:plain

  • 2/20

ということでシェルが動く。ちょっとしたシェルスクリプト動くようにしてみる?ということでシミュレーターが変数を実装する。
これめっちゃ面白い。
f:id:yamaguchi_1024:20180221070239p:plain

プレゼンをする。まあまあ受けたっぽくてよかった。

感想

本当に現代のパソコンはすごい。張り合おうという気が全く起こらない。すごすぎる。

個人的に今日(2018/2/27現在)からスイスに行ってしまうので17erの最後にとても良い思い出作りが出来てよかった。メンバーの人には本当に感謝している。kczは彼の班のコアをやりながらOSを一瞬で書いてくれたしmdjは優秀だし無限に精神が安定しているので無限に頼らせて頂いた。地下で4連泊などしながら大声で喚きまくっていたので一緒にいた他の人々にも感謝である。

質問や疑問があればお気軽にどうぞ。

追記

たくさん反応やコメントを頂いて、フォロワー以外にそんなに読んでもらえると思ってなかったので驚いています。理情の後輩や先輩を対象に書いてしまったのでバックグラウンドの説明が全然なくて混乱した方もいると思います。背景や歴史が気になる方は是非先輩たちのブログを読んでみてください。
CPU実験で自作CPUにUNIXライクOS (xv6) を移植した話 - 豆腐の豆腐和え
東大理情名物のCPU実験で毎週徹夜したお話(概要編) | eureka tech blog
自作CPU向けCコンパイラをつくってOS動かした話 (CPU実験まとめ) - kw-udonの日記

頂いたコメントに対してなんとなく空中リプしてみようかと思います。

「自分たちでCPU、コンパイラ、シミュレーターを作ってレイトレーシングを動かすことが単位要件」←いつ頃からやってるんだ?CPUとかスクラッチから作るわけじゃないんだよね?

CPUとシミュレーターはサンプルコードも無く、フルスクラッチで作ります。コンパイラはmin-camlという言語のコンパイラここにあるので、これを元にして自分たちのアーキテクチャに移植したり最適化をしたりします。

レイトレーシングだけやたら高レイヤーの話だな。レイトレーシングを指定している意図はなんだろう。記事中でレイトレの話は出てこないしどうしてたんだ。

レイトレは、min-rtというmin-camlで書かれたレイトレのコードが与えられるのでそれをコンパイルして自分のCPUで実行してこんな感じの画像が出てくるのが単位要件という話です。
f:id:yamaguchi_1024:20180301082330j:plain

車輪の再

車輪の再再再再再再再再再再 くらいですね。しかし再発明って言うからには自分で0から考えないといけない気がしますが僕らはかなり前提知識があったので再発明ですらないですね。

半期でFPGAでCPUを実装してOS乗せてアプリを走らせる、なんて授業はコンピュータアーキテクチャの勉強の総ざらいとして良さそう。大学の授業で出来る時代なのね→ほぼソフトウェアですもの

理情のハードウェア構成法の講師の先生は冗談抜きでFPGAはソフトウェアと言っているので本当にそうだと思います。

さすが。ところでトランジスタとかの組み合わせて一つ一つの CPU 命令を実装して写真の基板で一つの CPU ってこと?電子回路超苦手だった

いや流石にそんなことはないです・・。写真のFPGAはkcu105というのを使っていて授業の最初に貸し出されます。電子回路を扱う授業は2,3年でありましたがCPU実験で回路図書くようなことはない気がします。流石にタイミングチャートくらいは書きますが。

何を言ってるのかよく分からない

すいません・・・。

RISC Vがriscv表記だったので、最初なんだかわからんかった

てきとうに書いていましたが正式名称はRISC Vです。

*1:去年からFPGAのボードが新しくなりFPUがIPコアで与えられるようになったので4人班の1人が定職にあぶれ、一番最初の授業で誰かが役割の所に四角を書いたことでしかく係という名称が定着しました。僕らの班のしかく係は失踪してしまいましたが他の班ではライブラリ書いたり他の仕事をしているしかく係もいました。

*2:slackにはもっといるんだけどここではgithubにコミット履歴がある人しか書いてない

*3:奥さんが日本人ということで日本に来ていた!

*4:シミュレータがまとめてくれたものを貼っただけ。持つべきものは優秀なシミュレータである。

*5:上位20bitの即値生成、即値は全てLUIとADDIで行われる

*6:比較結果1or0を整数レジスタにセット

*7:二つの浮動小数点の符号のXorをとり、片方の浮動小数点の符号をその結果としたものを出力、ある浮動小数点数の絶対値を取る時に使われている

*8:32bitそのまま浮動小数レジスタにコピーする、浮動小数点即値の生成に用いる

*9:浮動小数点数を、変換して整数レジスタに格納

*10:整数を、変換して浮動小数点数に格納

*11:整数レジスタの下位8bitを出力する

*12:整数レジスタの下位8bitに読み取る、上位24bitはそのまま

*13:例えば、0x12345678を0x78563412にする、INとSLLIと組み合わせて 32bit整数の読み取りに用いた。今回のコンテストサーバにはビッグエンディアンモードが一応あるが、リトルエンディアンが普通だと思ったので…

*14:sb, lbuはAdelieでは使われていなくてIwashiではchar型などをコンパイルするためにsb, lbuが新しく使われたのでバグらせた・・・。

*15:東京大学コンピュータ系サークル TSG 東大の新入生是非入部して〜〜

GSoCを終えました

ずっと書かなきゃ書かなきゃと思っていたのですが、ズルズルと引き伸ばされ結局正式な終了から二ヶ月後五ヶ月後(下書きを書いた時点では二ヶ月後だった..) になってしまいました。2月の中旬に今年のプロジェクトが公開されるので報告&勧誘エントリを書こうと思い立ちました。これを見にきてくれる人のほとんどは僕のプロジェクトに興味がある訳ではなく、これからプロポーザルを出そうか迷っている人々だと思うので、GSoCと大学の授業を両立してどういう感じだったかということに主眼を置きたいと思います。キツめのことを書いているので不愉快に思ったらごめんなさい。

Acceptされるまでの話

以下のエントリを見てください。
yamaguchi-1024.hatenablog.com

大学との両立

これに書いたように留年したくせに三年生の授業に普通に出ていたため、期間中は平日フルに授業&一週間40時間の労働という過密スケジュールをこなすことになりました。忙しくなることは分かりきっていたので出来るだけ予定を入れないようにして、課題とGSoCでかなり睡眠時間を削りながら頑張りました。かなりつらかったですが、睡眠はいつでも出来るがGSoCは学生のうちしか出来ないので自分の中でどう優先順位をつけるかという問題だと思います。

Organizationやプロジェクトの選び方

正直に言って、もしGSoCをきっかけにシリコンバレーインターンに言ったり海外の企業に就職したいと思うなら、メンターをReconしてどういう所に勤めているとか役職など調べた方がいいと思います。(僕は当時そこまで頭が回らなかったのでしませんでしたが...) LLVMは仕事でやっている人がほとんどですがOrganizationによっては趣味でやっている人もいるようで、そういう人はちょっとやる気がなさそうだなぁと思ったこともありました。

一つ分かったのは、GSoCとは一口にいっても入るOrganizationによってだいぶ毛色が違うようです。結果的にはLLVMは大正解でした。OSSというと怖い大人にマサカリを投げられるという状況を想像しますが、LLVMの開発者はみんな親切で怖い思いをすることがありませんでした。メンターも本当に親切で期間中ほぼ毎日進捗報告をしたり土日でもレビューしてくれたりしました。(毎日進捗報告はそれはそれで辛かったけど...) 10月にサンノゼであったLLVM dev meetingにスピーカーとして呼んでいただいたり、本当にいい経験をさせてもらいました。英語の能力も圧倒的に向上しました。3月からCERNで働くのもGSoC繋がりです。

まとめ

日本にいながら海外で著名度の高い実績を残せる機会は論文以外だとなかなか無いと思います。GSoCは応募の前にコントリビューションが必要だったり応募用紙を書くのに無限時間掛かったりと応募のハードルが高いとは思いますが挑戦する価値はあると思います。「自分の今の技術レベルで出来るのかな...」というのは完全に杞憂です、というかあなたが心配することでは無いです。こいつは出来ると思われれば採択されるし思われなければ落ちるだけなのでそれは向こう側が判断することで、全力で応募をして採択されたら素直に喜んでリジェクトされたら謙虚になればいいと思います。

GSoCは終わってしまいましたが、LLVMの開発はCERNで今年も続けていくことになりそうです。一番貴重だったのは人との繋がりです。世界中に友達ができて本当に楽しかった。関わってくれた全ての人にお礼を言いたいです。

日本人もっと増えろー!という感情があるので何か質問があれば遠慮なく聞いてください。


summerofcode.withgoogle.com
僕の去年のプロジェクトのプロジェクトページです。

6月のLLVM活記録

時系列順に書く

1. ⚙ D33237 [GSoC] Shell autocompletion for clang
一番はじめのGSoCのパッチ。とりあえずclang内からflagを動的に取ってきて補完するという機能を実装した。

2. ⚙ D33383 [GSoC] Flag value completion for clang
力作なパッチ。`-stdlib=[tab]`などした時に取りうる引数が補完で表示されるようにした。関数の可愛さに注目して見て欲しい。

3. ⚙ D34055 Be more strict when checking the -flto option value
コードを読んでたらここもっと良くなるよなと思って投げたやつ。

4. ⚙ D34196 Use getLastArgValue instead of getString
LLD初コミット!LLDのコード読んでたらLLVMにすでにある関数と同じような関数を作って使っていたので元々あるLLVMの関数で置き換えた。

5. ⚙ D34558 [GSoC] Add support for CC1 options.
2でやった引数の補完にcc1のflagも追加した。

6. ⚙ D34595 Changed Opts.EABIVersion type string to llvm::EABI enum class
コード読んでてもっと良くなるよなと思ったやつ。

7. ⚙ D34607 [Bash-autocompletion] Check clang version in Bash
最新のclangじゃなくても大丈夫なようにした

8. ⚙ D34761 [Bash-autocompletion] Invoke clang where user called
ほぼBug fixみたいな。

9. ⚙ D34770 [Bash-autocompletion] Auto complete cc1 options if -cc1 is specified
やり途中だけどcc1のオプションはかなり少数の開発者しか使わないからむやみに補完されないようにする。

感想

GSoC進捗報告を毎週するのはめんどくさくなってしまったので月に一回ブログでまとめるくらいでいいかな。7/19にLLVM5.0のブランチが切られるのでそれを目標にやりたい。