seri::diary::graduate_school

大学院修士課程での研究生活について書いています

近況

2018年12月7日

今年も残す所あと僅かであり、秋学期ABの講義期間も間もなく終わりを迎えようとしている。
秋学期ABが終わって、願わくば今受けてる講義すべてで単位が取れれば修了要件を満たすことができるため、もう講義を取る必要がなくなる。 今のペースだと必要単位数+10単位ぐらいの単位を取って修了するペースである。多分取りすぎであり、おかげで毎日のように課題のコードを書いたり専門外の論文を読んだりレポートを書いたりしている。

講義が終わったらあとは修論を仕上げるために研究に勤しむだけなのだが、入学前に思っていたよりも、多くの講義はあっさりというか簡単だったという印象である。

もっとエグい実装や論文読みを課せられる講義があるのかと身構えていたのだが、殆どの講義でそんなことはなく普通にやってれば終わってしまうような課題ばかりだった。*1 特に実装関係はホント簡単だったのでこれでいいのかという気持ちなのだが、まぁ好きで書いてる人は放っておいても書けるようになるし、研究で書く必要がない人は全く書かないし、、みたいな感じなので、実装力は重要視してないのかもしれない。この一年で自分が課題で書いたもっとも複雑なコードはrubyで500行ぐらいで書いたマルチプロセスで動作するMapReduceフレームワークのコードぐらいで、短いものだと多分10行ぐらいの穴埋め問題的なやつを書いて動作確認しただけだと思う。それ以外でも入門書のサンプルコード程度である。

このような講義を受けてきて最近思うのは、世に出ている日本語の入門書というのは実はすごく充実しているのではないかということである。自分は社会人になってから書籍に頼って勉強してきたワケだが、それらのその辺の本屋で買える入門書はとても実用性が高いものだったのではないかと感じるようになった。つまり、大学の講義レベルの内容を読むだけで学べるぐらいには良い内容の本がその辺の本屋に売っている、といっても過言ではないのかもしれない。世の中のCS専攻を出ていないエンジニア達よ、技術書を買って勉強すれば基礎分野なら十分CS専攻卒と張り合えるぞ、多分。

一方で、講義で扱わなければ恐らく一生読まなかったであろう本に出会えることもあり、こういうのはきっと大学の講義固有の価値なんだろうなと思う。
秋学期に並列システムアーキテクチャに関する講義を取っているのだが、そこで教科書として使っている本は自分にとってまさに「知らないこと」を学べる一冊だった。

Introduction to Parallel Computing

Introduction to Parallel Computing

自分は並列システムというと、マルチスレッド/マルチプロセスの実装の仕方みたいな話しか知らなかったのだが、そもそもなぜ並列化が必要なのか?という話から始まり、インストラクションレベルの並列化、つまりパイプライン、スーパースカラに代表されるプロセッサレベルの技術から解説される。ソフトとハードの両面でどのような技術が用いられて並列に動作するシステムが実現できているかを解説している。
この本の特徴として、メモリバンド幅がどれだけパフォーマンスに影響を与えるかという話をあらゆる例題を用いて説明している。一貫して「メモリシステムはCPUよりはるかに遅い」ということを繰り返し主張している。具体的には「1サイクルでアクセスできるL1キャッシュと100サイクルでアクセスできるメモリがあって、キャッシュヒット率が10%落ちるとプログラムのレイテンシがどれぐらい落ちるか」といった感じで、具体的なスペックを示したシステムを例として読者に考えさせている。
この辺の考え方はうっすらと知っていた程度で、具体的な数値について考えたことがなかった。しかし実際に計算してみることでどれぐらいキャッシュミスがパフォーマンスに影響を与えるかということがよく分かる。これは独学でやっていたら恐らく手をつけなかった、というより、この手の話は日本語だとちゃんと解説されている本が少ないと思われるので出会わなかったかも知れない。そういう意味でこの本はここで読む機会を持つことが出来てよかったし、実際キャッシュヒット率を意識した実装は重要である。単純な1000x1000ぐらいの行列同士の積を二重ループで求めるようなシンプルな処理でもキャッシュヒット率が下がると露骨に処理時間が長くなるのは他の講義でも体験した。

*1:もちろんエグい課題がある講義もあったが全体で見れば1割ぐらいである