本文へジャンプ

学科概要
  • HOME
  • 学科概要
  • 学生による学科紹介

学生による学科紹介

実際の授業をいくつか文書におこしてみました。先生方の仮想講義を体験してみてください。情報科学科の講義は90分授業です。午前中の講義は10時15分から、午後の講義は13時から始まります。14時45分からの講義がある曜日もあります。

情報科学実験 II 〜CPU実験〜 | 各教官
開講時間:月曜 5限、火曜・木曜 午後 | 1
シラバス
コンパイラ実験(コンパイラの設計・製作)
CPU実験(FPGAによる CPUの設計・製作)
ミッション
3年生の冬学期には情報科学科の名物である情報科学実験II–通称「CPU実験」が行われます。この実験を一言で説明すると、「半年かけてできるだけ速いコンピュータを作りなさい」というものです。10月の初めに4〜6人ずつの班を作り、3月に行われる発表会までに自分たち独自のコンピュータを設計・制作しコンパイラを実装することによって、課題プログラムをその上で動かすことを目標とします。全員で命令セットやアーキテクチャの設計を行うことから始め、CPUの実装を行う人・コンパイラの制作を行う人・アセンブラやシミュレータを作成する人といった具合に役割の分担を決めて開発を行っていきます。学生実験としてはかなり難しいため、必ず成功するとは限りませんが、見事完成した場合、今度は発表会で行われる課題プログラムのスピードコンテストを目指して様々な工夫を凝らしながら高速化を追求していくこととなります。この高速化のためには例年先輩からも積極的にノウハウが伝えられ、また自分たちが終わった後は後輩たちがさらに速いものを作るのを楽しみに待つといった感じで、情報科学科のOB・OGなら誰もが「CPU実験が一番楽しかった」と口を揃えるものです。半年に渡ってチームで開発を行う、というのは貴重な経験となりますし、普通にプログラムを書くだけではブラックボックスとして扱ってしまうようなコンピュータの動作原理に対して深い理解を得ることができます。ここではそのCPU実験の様子を紹介したいと思います。
ミニ知識:コンピュータが動作する原理
「コンピュータの心臓はCPUだ」「プログラムを書いたらCPUが計算してくれる」ということを知っていても、実際にCPUがどうやってプログラムを実行しているかは知らない、という人は多いと思います。そこで簡単に原理の説明をしましょう。

プログラミング言語は人間にとって読み書きが容易なように作られています。一方で、コンピュータには0と1が並んだ機械語による命令列しか理解することができません。そこで、コンパイラと呼ばれるプログラムによって機械語と命令が1対1に対応しているアセンブリ言語に変換を行います。そして、アセンブラと呼ばれるプログラムによってアセンブリ言語を機械語に変換することによって機械語の命令列を作るのです。コンパイラによる変換は一意に定まるものではなく、コンパイラの最適化次第で生成されるアセンブリ言語の実行効率は大きく変わってきます。プログラムのサイズが大きくなっている今日においては、性能が絶対的に要求される分野を除いてアセンブリ言語によるプログラミングが行われることは少なく、いかに高性能なコンパイラを作るか、というのは重要な研究分野となっています。CPUはメモリ上に保存された機械語の命令列を順次読みだして実行することによってプログラムを動作させます。メモリからCPUに転送する速度や数値の計算を行う速度などは、半導体の製造技術に依存するだけでなく、メモリの大きさや配置・命令の形式や種類・複数の命令を同時に実行する仕組み・性能の引き出しやすさといった設計にも大きく影響されます。維持費だけで年間何十億円とかかるようなスーパーコンピュータと街中に溢れている数万円の携帯電話といったように、目的が違えば許容されるコストも利用可能な半導体技術も異なってくるため、コンピュータの使用目的に応じて適切な設計を行う必要があるのです。このようなことを研究する分野はコンピュータ・アーキテクチャといい、基本設計のことは一般にアーキテクチャと呼称されています。
FPGA基板
FPGAとは内部の回路を自由に書き換えることができるという性質があるチップです。このFPGAを用いてCPUの実装を行うこととなります。FPGAの回路を書き換えることが可能である仕組みについては情報科学科の授業で習うことができます。またFPGAの周りにはメモリ(SSRAM,・SDRAM)、入出力端子(DVI・USB)・回路合成用のケーブルといったものが搭載されており、FPGAに制御回路を実装することによってこれらの周辺装置を利用することが可能になっています。拡張基板には基本的に何も搭載されていませんが、手元のコンピュータと通信するための追加の入出力端子(RS232C)・電圧を変換するチップ・開発初期のFPGAの動作を検証するためのLED・抵抗といったものをハンダ付けしていくこととなります。写真は現在CPU実験で使用している基板です。100万ゲート規模の回路が実装可能なFPGAが搭載されています。また、最新のFPGAを搭載した新しい基板を準備中であり、より一層様々な回路を実装してみることが可能となることでしょう。
全体的な設計
最初に全体的な設計を行います。この段階では命令セットやアーキテクチャといったものを決定します。命令セットとはCPUが受け付ける命令群のことです。複雑な構成にしてしまうと完成させるのが難しくなるので、最初はどの班も市場のCPUのアーキテクチャを参考にしながらシンプルな設計を行うことが多いようです。CPUの実装の難しさとコンパイラの制作の難しさのバランスをとることが重要となります。スピードコンテストでの記録更新を狙うような班になると何度も設計を行うため、シンプルだが周波数が高い・独特な命令や複雑な機構を採用、といった感じに既存の枠に囚われないアーキテクチャも登場します。ここで仕様をしっかりと固めると、各自の興味・得意不得意を考慮に入れて役割の分担を決定し、それぞれの開発にとりかかることとなります。担当毎に作業が別れた後も、進捗状況を確かめ合って手伝う・解釈に差がでないように確認する・途中で気づいた問題点を伝えてお互いに反映する、といったように活発に意見交換をおこなうことが重要になります。
CPU
FPGA内部の論理回路の実装では、回路図上でゲートを配線していく代わりにHDL(ハードウェア記述言語)が用いられます。見かけはプログラミング言語にそっくりですが、回路の動作仕様を詳細に記述することを目的として設計されている言語です。回路規模が大きくなった現在ではHDLによる設計が主流となっているのです。実際にどのような回路になるかはCADと呼ばれるソフトウェア次第ですが、逆にCADによって思い通りの回路が生成されるようなHDLを記述することが腕の見せ所となります。生成された回路をFPGA内の資源に配置・配線する作業も通常はCADが自動でおこないますが、計算量が膨大なため最適な配置・配線が行われるわけではありません。中にはFPGAの性能を限界まで引き出すために手動で配置・配線を行いだす人もいるようです。HDLで設計した論理回路はHDLシミュレータで波形図を表示することによって検証を行います。HDLのシミュレーションには非常に時間がかかりますが、この作業を丁寧に行うことが完成への近道であり、思い通りの波形図が得られるまで何度も修正を行っていきます。
コンパイラ
課題プログラムはMLというプログラミング言語が用いられているため、ML用のコンパイラを実装することが目的となります。最近ではMLで実装されたきれいでわかりやすいML用のコンパイラが存在するため、これを自分たちのアーキテクチャ用に改造してとりあえず動作させ、その後より効率の良い命令列に変換できるように最適化を施していく、という手法を選択する人が多いようです。一方で、得意な言語やこだわりのある言語でゼロからコンパイラを実装する人も例年いて、非常に自由度が高くなっています。コンパイラには様々な最適化手法が知られており、こうしたものを調べながら実装していくのが当初の目標となりますが、アーキテクチャに特化した最適化を行う段階になると試行錯誤して独自の方法を考えなくてはいけません。また、三角関数といったような一般的な関数はコンパイラに付随させる必要があります。高速化のために直接アセンブリで記述することが多いようですが、最適化の実装を頑張った結果、MLで記述したほうが速くなってしまった、なんていう人もいます。

ツール
CAD, HDLシミュレータ以外の開発に必要なツールは基本的に自分たちで作成することとなります。代表的なものは自分たちのコンピュータをソフトウェアで模擬的に再現するシミュレータです。コンパイラで作った命令列が正しいか検証したり、実行時間を予測してアーキテクチャを改良するために利用したりされます。シミュレータがなければコンパイラの開発が始まらないため、最初はとりあえず簡単な実装が行われるようです。その後も他のメンバーの要望に応じて、アーキテクチャの仕様変更に対応しやすくする・全体的な開発速度を上げるためにシミュレータを高速化する、といった改良が加えられます。また、命令の取捨選択のために各命令の呼び出し回数などの統計をとったり、アーキテクチャを改良するためにパラメータを変更して実行したり、といったことが行われます。情報科学科にはクラスタシステム等豊富な計算資源が用意されており、様々なパラメータにおけるデータを一気に取得するようなことも可能となっています。
テスト
り出来上がると、実際にFPGAにデータを送り込んでテストを行うことになります。それぞれは一見うまく動いているように見えても、どうしても不具合や仕様の解釈のずれが残ってしまいます。ここから完成までにかかる時間が一番長くなることが多いようです。流石にこのステップはあまり楽しくないようですが仕方ありません。また、検証方法をしっかり身に付けることも重要です。PCとの通信は本当にうまくいっているのか?コンパイラは正しいアセンブリを出力しているのか?アセンブリにミスはないのか?CPUは仕様通り完成しているのか?など全ての可能性を疑いながら一つ一つ丁寧に確認し問題のある個所を特定していくこととなります。ハードウェアを相手にしているため実機に不具合がある可能性などもあり、オシロスコープを利用して信号が正常に出力されているかどうかチェックを行ったりすることもあります。発熱が問題ではないかと疑ってヒートシンクをFPGAの上に載せてみたらうまく動いた、なんていうこともありました。
完成
ついに完成です。課題プログラムによるCGも正確に描画されています。これでおしまい、といきたいところですが、ここからスピードコンテストに向けての高速化CPU実験の本番であり、CPU実験の最も楽しいところであるといえます。アーキテクチャの再設計においては過去にパイプライン・レジスタフォワーディング・VLIW・スーパスカラ・キャッシュ・分岐予測・スクラッチパッドメモリなどといったものを実際に導入されています。専門用語が並んでしまいましたが、興味のある人は是非自分で調べてみてください。インターネット上でも十分に情報がみつかると思います。課題プログラムを徹底的に解析してコンパイラの最適化に反映させる人もいます。また、コンパイラの最適化によるアセンブリでは満足せずに、アセンブリに対して手作業で更なる最適化を行ってしまう人もいます。この段階になると検証のコツもつかんできているため、発表会に向けてどんどん自分たちのコンピュータが速くなっていくのは非常に気分が良いです。
発表会
には例年院生なども大勢訪れます。プレゼンテーションでは半年もかけた自分たちのアーキテクチャやコンパイラについて熱く語ることとなります。また、完成している班では課題プログラムのスピード測定が実演しながら行われます。毎年学生は入れ替わるにも関わらず年々記録が更新されているのは、先輩と触れる機会が多いという情報科学科の特色がCPU実験のノウハウの継承という形で表れているからだと言えます。数年前には「夢の20秒」なんていうフレーズもあったそうですが、今ではすっかり現実のものとなってしまいました。そして、発表会が終わっても、なぜか挑戦は続きます。だって、そこにボードがあるから。そしてついに1年後、10秒を切ってしまったという人もいるのです。そこまで熱中させる実験、それがCPU実験なのです。