Signal Process Logic のHPに「FPGA を用いた高効率・高速数値演算」と題するペーパーをアップロードしました。
これ、HPで「没原稿」としておりますとおり、本年のHPCSで発表せんと応募したものの、見事にリジェクトされてしまった、その原稿なのですね。
まあ、こういうことをする人はあまりいないと思いますが、私が現在おこなっております試みを簡単にご紹介するには良い資料と考えて、あえて公開に踏み切ったものです。
内容は、現物を読んでいただくのが一番なのですが、本日はこの内容を簡単にご紹介しておきます。
コンピュータの中心:CPU
まず、ここで扱っておりますのは、新しい原理に基づくコンピュータです。
現在の世界では、極めて多数のコンピュータが利用されているのですが、そのほとんどすべてで中心的な役割を果たしているのはCPU(中央演算装置)でして、このデバイスがメモリーに書かれている機械語命令を一つずつ読み取り、その内容を実行してメモリーや周辺デバイスからデータを読み込んだり書き込んだりいたします。
CPUという方式が発明された結果、人類は実用的なデジタル計算器を手にいたしました。この技術の優れた点は、たった一つの万能演算器(ALU)を用いることでどのような複雑な演算も実行可能であるという点でした。つまり、複雑な演算処理の手順はメモリーに書き込んでおけばよいわけで、メモリーとして半導体回路以外に、磁気記録円板など、さまざまな手段が使用可能で比較的容量の大きいメモリーも経済的に得られるという利点もありました。
CPUを利用しないのであれば、それぞれの演算を異なる演算器でおこなわなくてはいけません。デジタル演算器は非常に複雑であり、これがたった一つで済むということは、電子回路に真空管を用いていたCPUの発明当時では、大きな意味がありました。
ところが今日では、半導体回路の集積化が進み、デジタル演算器は非常に安価に手に入るようになりました。CPUの発明された当時とは、コンピュータを取り巻く技術環境が大きく変化しております。一方で、コンピュータに要求される機能はどんどん増大し、今日では多数のCPUを並べたコンピュータもさほど珍しいものではなくなっています。そうなりますと、たった一つの演算器で済むというCPUの利点は、どんどん薄れております。
CPUの問題点
CPUには、利点もある代わりに欠点もあります。一つは、命令もデータもすべて、メモリーとCPUを接続する共通の信号線である、バスを経由しておこなわれるという点です。このため、いわゆる「フォン・ノイマン・ボトルネック」、すなわちバスの部分のデータの流れがボトルネックとなるという問題が生じます。
今日あまり問題視されてはいないのですが、そのほかにも大きな問題があると私は考えております。
CPUは、万能の演算器を用いるため、ビット幅が限定されます。今日のCPUでは、大部分の演算が64 bit幅でおこなわれており、この幅で扱わます「倍精度浮動小数点数」は十進で約16桁の有効桁数をもっております。でも、これほどの有効桁が必要な演算はそれほどない。日常生活で使われる数値の有効桁は3桁もあれば充分であり、科学技術計算で要求される高精度演算でも6桁の有効桁数で充分である場合がほとんどです。
これが意味することは、現在のコンピュータの内部では、意味を持たない無効桁の演算が大量におこなわれており、コンピュータが消費する電力の相当な部分は、無駄な演算のために消費されている、という事実です。これは省エネルギーが叫ばれている今日、大きな問題であるといえるでしょう。
実は、コンピュータが科学技術計算に使われるようになった当初は、浮動小数点数として32 bit幅のものが一般的でした。32 bit幅の「単精度浮動小数点数」は、十進で7桁の有効桁数をもち、これだけの精度があれば一般的な科学技術計算には十分であろうと考えられておりました。
ところが、コンピュータの利用が進むにしたがって、単精度浮動小数点数では有効桁を十分に表せず、桁落ちが問題となる場合があることがわかってまいりました。桁落ちの発生する確率は低くても、プログラムの規模が増大し、含まれる演算数が多くなりますと、いずれかの演算で桁落ちが発生する確率は増大します。そして、いつこのような問題が発生するかよくわからないため、安全をみて、全ての演算に倍精度浮動小数点数を用いることが一般的となっております。
でも、精度をあげれば問題は発生しないか、といえばそんな保証はどこにもありません。たしかに有効桁数を拡張しておけば、問題の発生する確率は低下するでしょうが、確率が低いというだけで、問題が起こらないという保証はどこにもないのですね。
問題が起こっていても、問題が生じたことががわかれば大きな問題とはなりません。しかし、計算対象によってはわからないこともある。そのような例に、「バタフライ効果」の発見があります。これは、アマゾンの奥地で蝶々が羽ばたくとテキサスで竜巻が起こる、というような効果を意味し、気象現象などの不安定な現象の例としてエドワード・ローレンツが紹介した効果です。
実は、これが発見されたきっかけは、同一条件下で2回おこなわれた気象現象のシミュレーションの結果が、一見正しいように見えたものの、双方の結果が全く異なっていたことによります。初回と二回目の計算で唯一異なっていた点は、二回目の計算の際に初期値の無効桁部分の数値を省略しただけだったのですね。
この計算結果が意味することは、この気象現象のシミュレーション結果には、実は、有効な桁は全く含まれていないということに他なりません。演算結果を人がみて、これがおかしければ桁落ちが発生していることがわかります。等高線が自然界ではありえないような形をしておれば、どこかで問題を生じていることがわかります。しかしながら、計算の性質によっては、有効桁が含まれていなくても、一見正しいようにみえる計算結果を出力する場合もあったのですね。
こちらの方が重大な問題であるように、私には思われます。似たような計算は天気予報の際にそこらじゅうでおこなっています。この計算結果がどこまで信頼に足るものであるか、判然としないのですね。
まあ、だから天気予報は外れることも多い、ということはいえるのでしょう。我々がテレビ画面で見ている明日の天気図は、たいていは正しい結果を示しているのだが、時には、科学的には何の意味も持たない天気図が示されているかもしれない。
外れるかもしれないけど、予報があるから明日の行動計画が立てられるという点に、天気予報の価値があるのかもしれません。もしそうであるなら、今日の気象予報士は、邪馬台国の卑弥呼と似たような役割を果たしていることにもなってしまいます。
天気予報であれば、外れたからといって大きな問題にはなりません。しかしながら、今日では人の生命にかかわるような機器の設計にもコンピュータシミュレーションが使われ、重大な事故にもつながりかねない装置の制御もコンピュータでおこなわれております。
コンピュータの演算結果が、ひょっとすると、正しくないかもしれない。このような問題は、放置してよいものでは決してありません。
CPUに代わるもの:並列演算装置
CPUの持つこのような問題点を一気に解決するのが並列演算装置です。並列演算装置とは、多数の演算装置を並べてこれらの間を信号線で接続したものです。
それぞれの演算装置は、扱うデータの有効桁にあわせたものとすることができ、無駄な演算をしないようにすることもできますし、必要な桁数分の適切な演算器を用いることもできます。また、データは個々の信号線を経由して運ばれるため、フォン・ノイマン・ボトルネックも発生しません。
並列演算器(パイプライン演算器)の最大の特徴は、きわめて高速である、という点です。ボトルネックが存在しないことも高速処理ができる一つの理由なのですが、CPUが単一の万能演算器で全ての演算処理をおこなうのに対し、並列演算器は多数の演算器が演算処理を同時におこなっておりますので、速いのも当然といえるでしょう。
並列演算装置の欠点は、多数の演算器を用いることから、回路が複雑になることなのですが、今日の半導体回路は集積度が上昇し、価格も大幅に低下しております。さらには、今回アップロードいたしましたペーパーで提案しております、演算器を切り替えて使用するオーバーレイという手法を用いれば、複雑な演算も比較的小規模の論理回路で実現することが可能です。
並列演算装置は、実は、今日でも幅広く使用されています。ハードディスクや光ディスクの信号処理回路はきわめて高速の演算処理が要求されるのですが、これらは専用の並列演算をおこなうASICと呼ばれる大規模LSIで演算処理をおこなっております。また、同様に高速演算が要求される画像処理の分野(デジタルテレビもそうです)でも、並列演算装置が用いられております。
コンピュータの利用が爆発的に増加した一つの理由に、プログラムを任意に書き換えられる「ストアード・プログラミング方式」の採用がありました。ASICでは、マスクで論理回路を書き込んでいるために、演算機能は固定されているのですが、今日ではFPGA(フィールド・プログラマブル・ゲート・アレイ)も用いられるようになりました。FPGAは、読んで字のごとく、内部の論理をユーザサイドで書き換えることができます。
FPGAの利用は、現在急速に拡大しているのですが、これにはLSIのコストが生産数量に大きく依存するという背景があります。FPGAは多数のシステムに同じデバイスを用いるため、同じデバイスが大量に使用されます。この結果、コストも低下しますし、開発費用もすぐに元が取れるため、最新のテクノロジーを素早く利用することもできる。この結果、論理書き換えのための余計な回路が含まれていても、ASICと比較して安価に高い機能のものが手に入ることとなります。
並列計算機に今不足しているもの
並列演算が優れており、そのためのデバイスも既に存在している、ならばなぜ並列演算が一般的にならないか、という疑問は当然あるでしょう。
私は、その理由が、プログラミング環境がないからではなかろうかと考えております。
並列演算装置のプログラミングには、その機能を十分に発揮させるためには、CPUのプログラミングとは異なる機能が要求されます。
そのもっとも大きな点は、それぞれの演算器で扱うビット幅を決めることでしょう。
一つの演算器がすべての演算に使用されるCPUの場合は、8 bitのchar、16 bitのshort、32 bitのlongが整数に対して準備され、浮動小数点数には32 bitのfloatと64 bitのdoubleがあれば十分でした(今日では、さらにビット幅の大きなlont longやlong doubleも使われています。)そしていずれのビット幅の変数を用いるかは、プログラマーの判断で選んでいます。
一方、並列演算器では、それぞれの演算器のビット幅は、必要な有効桁数に応じて1 bit単位で選ぶことができます。さらに、乗算をおこなう場合には有効桁の調整が必要であり、仮数部と指数部のビット幅を独立にbit単位で調整できる浮動小数点数が必要となります。これらを人が個々に設定することなどとうていできませんので、それぞれの演算器で扱うビット幅を自動的に選択する機能を持つコンパイラが必要となるのですね。
逆に、並列演算器では、信号は必ず一方向に流れ、同じレジスタの値を変更することはできません。このため、繰り返し演算は、通常のコンピュータプログラムでおこなうような形ではできません。並列演算器で繰り返し演算に相当する演算をおこなう場合には、異なるタイミングで演算するか、あるいは繰り返す数だけ演算器を並べる必要があります。
今日のコンピュータプログラミングにはC言語が多く用いられています。しかしながらC言語はCPUの機能を100%発揮させるには良い言語なのですが、並列演算装置のプログラミングにはあまり適さないという問題があります。(レイ・ブラッドベリのSFタイトルにちなんで“C is for CPU”などという人もおられます。)
そこで現在私が検討しているのは、並列演算装置の特性にあった新しいプログラミング言語をつくること、そしてそのための開発環境をつくることです。
このあたりのいきさつは、Signal Process Logicの管理人日誌に時々記述しておりますので、ご興味のある方はご参照ください。最近のまとめ記事はこちらに書いております。この管理人日誌では、並列処理をおこなう演算論理を「パイプライン」と呼んでいます。
まあ、いろいろなことをやっておりますと、開発は遅々として進まないのですが、世界が並列演算に向かって一気に進みだしているわけでもありません。ここは着実に一歩ずつ前に進めるということでやっていきたいと考えております。
なお、すでに製作された評価版はこちらのページにおきました。実行可能な評価版もここをクリックすることでダウンロードできます。
今回のエントリーで、このブログの記事総数が1,001記事となりました。最初の記事(1995.6.1付)は、実際には異なる日付で書いたテスト記事ですのでこれを無視いたしますと、本エントリーは実質1,000番目の記念すべき記事ということになります。