卒研の総括

昨日(2月17日)に卒業論文を提出し,1年間に渡った卒業研究に一先ずピリオドが打たれました.
ということで,今回のエントリーでは卒研の総括をしてみようかと思います.

きっかけ

大雑把なテーマが決まったのは去年(2011年)の2月半ばでした.私が所属している研究室の場合だと

  • 歩行者特性解析
  • 車両特性解析
    • CAによる高速道路の渋滞シミュレーション
    • 排気ガス遷移遷移解析
  • (市販の解析ソフトを用いた)衝撃波シミュレーション(SPH法を用いる)

というようなテーマが用意されていました.今回の私の研究テーマは上記のリストで言うと衝撃波シミュレーションに相当するのですが,最初は別のテーマを希望していて,そのテーマは他にやりたい人がいて自分よりも具体的な点を考えていたこと,私が進学希望だったこともあって衝撃波シミュレーションを担当することになりました.この時は不安を覚えていたのが正直なところでした.

CUDAとの出会い

最初は市販の解析ソフトを使って研究を行う予定だったのですが,3月某日に担当の先生から「GPGPU(CUDA)を使おうと思ってるんだけどどうかな?」と提案があり私も「せっかくこの研究室に入ることが出来たのにプログラミングをしないのもあれだし,やってみよう」と思って承諾しました.これが1年に渡って続くGPGPUとの出会いでした.こうして卒研テーマが「SPH法のGPGPUによる並列化」という方向に定まることとなります.

SPH法

SPH法の理論の理解は想像以上に大変でした.何にせよ応用数学のベクトル解析の内容が基礎と言えるレベルなので.今でも完全に理解できているわけではありませんが,少なくとも処理の流れや近傍粒子探索で何を行なっているかなどのプログラムの実装に大きく関わる部分はなんとか理解できるレベルまでにはなったのかな,と感じています.

FORTRANからCへの変換

SPH法解析プログラムはFORTRAN77で記されており,並列化を行う前にまずC言語のプログラムに変換することが必要でした.そのため先生が大学時代教科書として使っていたFORTRAN77の本を見ながらC言語への変換を行なっていったは良いのですが,FORTRAN77の文法がC言語にそれなりに慣れていた私には曲者で(多分にプログラムのソースの綺麗さにも関わるとは思いますが),正しい処理が行えるように変換が完了するまでに一時中断期間を含むと数カ月単位の時間が過ぎて行きました.今考えるとこれがもっと早く完了していればなぁ…と思わずにはいられませんでした.

合同ゼミ

卒研で大変だった点の一つです.これは私の属している研究室がCAを用いた解析を主に扱っており,複雑系の分野に関わることから複雑系の理論的な面を研究している研究室との合同ゼミがほぼ毎月1回のペースで行われました.
毎回5時間半〜6時間程かかる長丁場で質疑応答がエンドレスだったこともあり,回によっては研究に自信を失うことも.また前期の合同ゼミではよく声が小さいと怒られていました.自分でも前期の合同ゼミでは後期に起こることになる二度のブレイクスルーによって自分でも分かるレベルで成長することになろうとは全く考えていませんでした.

Linuxと向き合う

CUDAの開発環境はLinux上に組むことになり,Linuxディストリビューションをどうするかという話に.私がたまたまUbuntuのインストールディスクを持っていたのでUbuntuをインストールして以後ずっとUbuntuを使っていくことになります.
Linuxを本格的に使うのはこれが始めてだったこともあって,始めの頃はWindowsとの操作性の違い(主にターミナル)に戸惑う日々でした.CUDAのインストールも一発で成功せず,CUDAインストール失敗⇒OSの再セットアップというのが定番化していました.CUDAのインストールが自分一人で完璧に出来るようになるまでには約1ヶ月を費やしました.Linuxの操作になれるまでにはさらに数ヶ月要しました.

夏季休業:自練と卒研の間で

夏季休業を利用して運転免許を取ろうと考えていた私は,自練に通い始めたのは良かったのですが,このことが卒研に思わぬ影響を与えてしまうことになるとは自練に入る前の私は思いもしませんでした.単刀直入に言ってしまうと,自練に通いながら卒研をするのは想像以上に大変です.正直言うと推奨できません.

琉球大学との交流研究会

琉球大学との交流研究会は今年度からの試み,ということで実際に発表するまではかなり不安だったのが正直なところでした.研究もまともに進んでいたわけではなく,こんな内容で発表していいのか?という感じでした.でも実際発表してみると,「高専生ってもっと自信持って良いんだな」と気付かされたり,後述するプレゼンテーションが上手な大学生がいたりと,今となっては私の中で糧になるいい機会だったと感じています.

プレゼンテーションスタイルの改善

以前の記事でも触れましたが,琉球大学の交流研究会でプレゼンテーションが上手な大学生がいて懇親会でその人から色々とアドバイスを頂いたのでいつかはああいうプレゼンをしてみたいなぁ…と思うようになりました.そして中間発表の時,私の前に発表していた人がマイクを使わず地声で発表していたので*1,私も同じようにやってみよう,ということで生まれたのが操作台の前に立ち,プレゼンターを持ってマイクを使わないでプレゼンテーションを行うという形式になったのでした.発表後後ろの方に座ってた人に声が聞こえていたか確認してみたら聞こえていた,と言ってくれてそれが自信に繋がりました.これがプレゼンにおけるブレイクスルーでした.

テーマの変更

当初は私の学校の校長先生の研究テーマとの関連で,(SPH法ベースの)爆轟衝撃波解析モデルを並列化する,というのを最終的な目標として設定していました.ですが,11月に入って研究の進捗の悪さを先述の合同ゼミで指摘され,担当教員と相談の結果今年度はSPH法の並列化だけを行い,並列化を先行研究とは異なるアプローチで行う,というテーマに変更することになりました.先行研究では近傍粒子探索の効率化に重きを置いていたのですが,他学科のSPH法を扱っている研究室と合同ゼミを行った際,指導教員が「カーネル関数に条件分岐が使われているから,ここを変更すれば速くなるのではないか」という点に気づきました.そこから,最終的には「カーネルを変更することでSPH法の計算時間短縮を行う」という目標が設定されることになります.

いざ並列化,でも…

SPH法の解析プログラムの並列化を始めたのは11月に入ってからでした.結果を早く出さないといけない状況だったにも関わらず2ヶ月程年明け1月までまともな結果が出せずじまいで,並列化プログラミングの難しさを感じたり,同時に「この卒研結果出せるのかな…クソな卒研になってしまうんじゃないか…?」と不安に駆られる日々でした.
1月上旬に7[sec]台の結果が出て喜んだのは良かったものの,後できちんと調べてみると計算結果の値が初期値から更新されていないことが分かり,その後1月下旬まで成果がどんどん悪化する残念な日々が続きました.背水の陣でとある処理を並列化してみたところ思いの外速度向上が見受けられたので続けてもう一つあった計算量の大きい処理を並列化するとCPU比2.5倍の成果まで出すことができ,最終発表で恥を欠かずには済みました.しかし,2.5倍ならCPUを変更してしまえば容易に達成できてしまうレベルのものだったので,更なる速度向上を行おうとデータのやり取り周りの処理の工夫を行いましたが殆ど計算時間には反映されることはありませんでした.
そんな時,ある先生から「数学関数で書かずに普通に書いたほうが処理が速くなるのではないか」とアドバイスを受けて改良してみたところ,1月上旬の時に出た7[sec],いやそれ以下の計算時間に短縮され,計算結果のデータを確認してみると初期値から値が更新されているのを確認できました.この時の私は内心「またいつか7[sec]台のタイムを出してやる」と思っていましたが,まさか本当に再びその機会が訪れるとは思いもしなかったのです.これが私の研究自体におけるブレイクスルーでした.

卒業論文

卒論で数式がたくさん出てくるのは分かっていたのと,なんとなくやってみたいという好奇心に駆られて卒業論文TeXで書くことにしました.私の学科はWordで書くのがデファクトスタンダードなので,同じ研究室の友人からは「この時期に及んで新しいもの(TeX)を勉強するってすごいな」と言われたりしました*2
TeXで数式は何度か書いたことありましたが,長文のレポートを作るのは今回が始めてでした.TeXをやっていて最も悩まされたのがレイアウトで,最適なレイアウト(余白)設定方法を見つけるのに数日費やしました.分からないことが出てきてGoogle先生や書籍で調べることを繰り返すと,気がつけばTeXについて毎日が新しい発見の連続でTeXの利便性を鑑みることが出来ました.進学先の大学でもTeXを使っていく方向で考えています.

卒研で得られたもの・総括

私が思う卒研で得られたものといえば,

  • CUDAの基本プログラミング技術
  • プレゼンテーション能力
  • 科学技術文章の基本的な書き方
  • LinuxTeXの基本操作

が挙げられるでしょうか.私の卒研室は1年を通してみてみるとそこまでガツガツだったわけではなく*3,研究の進捗管理は自己責任だという印象が強かったです.私自信は年間を通して結果が出た時の喜びより結果が出ないことによる苦難の方が多かったと感じていますが,それでも1月下旬から2月上旬に掛けてのブレイクスルーがあったことで得られた結果としては恥ずかしくないレベルになったのかな,と思っている今日この頃です.
教訓としては,理論の理解に時間を費やしすぎてしまい,CUDAプログラミングを行う時間が極めて少なくなってしまったために,高度な部分まで踏み込めなかった点が挙げられます.なので,来年度は理論の理解と並行してCUDAプログラミングをちょっとずつでいいからやっていけばより素晴らしい成果が出せるのではないか,といったところでしょうか.
しかしながらこの1年間の卒研を通して,自分でも分かるレベルで成長出来たのかな,と思うようになってきました.学科の授業を一通り受けてきた段階では「自分は本当に成長しているのか…?」と疑問符を投げたくなることが殆どでしたが,卒研に関してはそうではなかったのかな,と思っている今日この頃です.
卒研室の指導教員,同じ研究室の仲間たちには深甚な万謝をささげる次第であります.
今日は卒研の総括でしたが,後日5年間の高専生活の総括エントリーを更新する予定です.
ということで,今日はこの辺で.

*1:あとで本人に聞いてみたら単にマイクを使うのを忘れていただけだったそうです.でもそのミスが私のプレゼンスタイルの改善のきっかけになったのでちょっと変な気もしますが彼に感謝しています.

*2:引き替えにWordのトラブルシューティングが行えずご迷惑をおかけすることに…

*3:後期後半(12月〜2月)はさすがにガツガツでしたが.