スタンフォード大学のMichael Flynn教授は、SIMD、MIMDなどのコンピュータの区分を提唱したことなどで有名なコンピュータアーキテクチャ界の重鎮である。Flynn教授は2010年6月1日から筑波で開催されるInternational Conference on Supercomputing(ICS'10)のために来日しており、5月24日に慶応大学で特別講義を行った。今回の特別講義は、ICS'10初日となる6月1日の午後に予定されているFlynn教授を始めとする4人の講師陣によるチュートリアルのあらすじを説明するというものであった。

慶応大学で講義を行うFlynn教授

Flynn教授はFPGAで計算速度を飛躍的に改善するMaxeler Technologiesという会社を設立しており、すでに、同社は石油探査会社などにFPGAベースのアクセラレータを販売した実績がある。

海底油田の探査では、母船からパルス音を発生させ、海底地層からの反射音を曳航する3万個ものマイクで捉える。船を移動させながらこれを10秒ごとに繰り返すので、結果として、1日にテラバイト級のデータが採取されるという。この反射波のデータを使って、得られた反射波と一致するような海底地層を計算で求める。この計算は膨大で、数1000枚のブレードサーバを使っても何日もかかる。Flynn教授は、このような計算をMonolithic Computationと呼んでいる。

計算された海底地層の例

Maxelerはこのような巨大な計算をFPGAベースのアクセラレータで高速化する。このような計算ではコアの計算部分が99%以上の時間を占めるので、その部分の高速化に的を絞る。その部分の処理内容をプログラムレベルからゲートレベルまで理解し、複数のストリームで処理できる形に変形する。この時、DRAMメモリからのデータの読み出し、FPGAでのストリーム処理、そしてDRAMメモリへの結果の書き出しが一連のパイプとして動作するように作るというのがポイントである。

通常のプロセサでは、中間結果をメモリに書き出して、次の処理で読み込むというような処理があり、それに伴ってキャッシュミスなども発生する。しかし、FPGAベースのストリーム処理の場合は、原則、データの受け渡しは直接次の処理ステージに渡され、メモリを経由しない。タイミングを合わせるためにバッファ機能が必要になる場合もあるが、これはFPGAの内部メモリで対応する。このようにFPGA内でデータを受け渡してしまうので、キャッシュミスも発生しない。

ストリーム処理によるアクセラレータの構造(出典:HotChips20でのFlynn教授の発表資料)

海底油田探査のデータ処理をIntelのXeonで行うと、10浮動小数点演算に1回のキャッシュミスが発生し、平均して1サイクルに1命令程度しか実行できない。また、演算以外のデータの移動などの命令も実行する必要がある。これに対してMaxelerではXilinxのFPGA「Virtex-5」1個に4つのデータを並列に処理する468段のパイプラインを実装した。

地層計算処理のFPGA実装(出典:HotChips20でのFlynn教授の発表資料)

このFPGAでは8点のデータを並列に計算することができ、パイプラインの各段で毎サイクル演算を実行できる。また、計算以外の余計な命令は無いので、実行効率が2倍に高まる。一方、FPGAのクロックはXeonの1/20と遅いが、それを考慮しても全体では374倍高速に処理することができるという。

ただし、Xeonでは計算を浮動小数点演算で行っているのに対して、FPGAではアプリケーションにとって必要な計算精度を達成することができる桁数の固定小数点演算で計算を行っており、ハードウェア処理という観点からは同じ処理を行っているわけではない。しかし、海底の地層を計算するユーザは必要な精度が達成されていればよいので、内部処理が浮動小数点演算であるか、桁数の少ない固定小数点演算で行われているかは問題ではない。むしろ、エネルギー消費の少ない固定小数点計算の方が望ましい。

しかし、このような高速化を実現するのは簡単ではない。まず、アプリケーションを理解し、コアの計算部分を取り出して並列ストリーム実行できるようにプログラムを書き直す。そしてMaxelerのツールを使って処理のデータフローグラフを作る。データフローグラフは、個々の計算をノードとして、その入力データを供給する各ノードからの矢印を書き、また、結果を供給する各ノードを矢印で結んだ図である。そして、各ノードは入力矢印のデータが揃えば演算を実行するというデータフローモデルで動作させる。

1つの例では、データフローグラフは4866ノードとなり、幅が250で高さが100程度になった。このデータフローグラフ全体は1個のFPGAには収まらないので、FPGAに収容できるゲート数とピン数を考慮してデータフローグラフを分割して実装する。

また、先の例にもみられるように、元のアプリケーションが浮動小数点で計算を行っていても、アプリケーションを理解して、必要な精度の固定小数点演算に置き換えるというようなプログラムの変形も行う。これにより必要ゲート数が減少するだけでなく、必要なメモリバンド幅も減少し、ひいては計算に必要なエネルギーも減少する。

しかし、このような最適化されたストリーム処理をFPGAに実装するのは簡単ではない。Maxelerでは、通常、2人の専門家がペアで仕事をし、FPGA実装のプロトタイプを作ってデモを行うまでに3カ月、その後、納入する製品レベルに仕上げるのにさらに3カ月程度かかり、全体では1人年程度を必要とするという。Flynn教授は、ツールは重要であるが、それだけでは高性能を達成することはできない。高性能を達成するためには努力が必要と強調していた。このようにFPGAの開発には1人年程度の工数がかかるので、コア処理部がストリーム的に処理でき、かつ、年間を通じて処理時間の長いMonolithicな巨大計算でないとペイしないが、このような条件を満足するケースでは汎用CPUを使用するのに比べて大幅な高速化と低電力化を実現できる手法である。