高速化: 概要


計算手順を表す プログラムが長くなると、人手による計算ではミスが生じ やすい。また人手でデータを記憶するのもミスが生じやすい。計算の正確さのた めに計算機の利用が有効である。またたとえプログラムが比較的単純であったと しても、プログラムが扱う データ量 操作回数が大規模になれば人 手による計算は事実上不可能となる。そのような大規模な計算は計算機が得意と するところである。

通常、計算機ハードウェアは、 プロセッサがメモリに格納されている 機械語プログラムを決められた通りに実行するという機能しか持たない。計算 機がシステムとして提供すべき高度な機能はソフトウェアにより実現される。通 常、ソフトウェアを構成するプログラムは基本的には人が設計する。プログラム の作成には計算機システムが持つ既存のエディタやコンパイラなどの助けも受け られるが、プログラムの基本的な設計を自動的にかつ人と同程度に行う計算機シ ステムは知られていない。

同じ内容の計算を速く実行する(つまり短い時間で計算を完了する)ためには、高 速な計算機ハードウェアを使って計算すればよいのはもちろんであるが、計算機 ハードウェアの種類がすでに決まっている場合は:

となるようにする工夫が考えられる。

「すでにプログラムが与えられたとき、それを同じ内容の計算をより速く実行す るプログラムに変形する」ことを(実行速度について) 最適化するという。 最適化は上記の工夫をすることになるが、いくつかの最適化手法は自動化可能で コンパイラの最適化フェーズなどで使われている。近年のスーパスカラのプロセッ サでは命令の並列実行が自動的に行われるがそのための最適化も考えられる。 VLIWやマルチプロセッサ(マルチコア)向けに明示的に並列実行するようにプロ グラムを変形すること( 並列化) も、最適化の一種といえ自動化はそこ そこ可能である。そのようなコンパイラは 自動並列化コンパイラと呼 ばれ、複数のプロセッサ(コア)を持つ並列計算機向けとしてはHPFコンパイラな どが有名であるが、本実験・演習では、手動でマルチプロセッサ(マルチコア) 計算機向けの並列化を行うこととする。

最適化するとしても、元となる最初のプログラムを作成する必要があり、すでに 述べたようにプログラムの基本的な設計は計算システムではなく我々人間が行う。 創意工夫により良いプログラムを考えなくてはならない。特に、 アルゴリ ズムをよくすることが最重要である。アルゴリズムとはある種類の問題が与え られたとき、有限の時間で正しい答を得るための曖昧な点のない計算手順のこと である。アルゴリズムの計算量の議論では、ある一定の値 n_0 以上の大きさ n の問題を解いたときの計算時間がある定数 c を用いて cn 以下であるならば、 オーダが n であるといい、O(n)と表記する。同じ問題に対して別のアル ゴリズムでは計算時間が定数 d を用いて dn^2 以下であるならば、O(n^2) と表記する。 係数の c や d の値がいくらであっても、 n を十分に大き くすれば O(n) のアルゴリズムはO(n^2) のアルゴリズムより高速となるため、 アルゴリズムの計算量の議論では係数の値は無視するわけである。

アルゴリズムのオーダを優れたものにできれば、次の段階では係数 c などを無 視せず実際の計算時間を考えることになる。最適化の程度によっては、数倍以上 高速になることも珍しくない。(最適化によりオーダが変わることもあるかもし れないが、それはよりオーダの優れたアルゴリズムがあるのに用いていなかった ということに過ぎない。) 本実験ではオーダの改良だけではなく、係数の改良も 含めた高速化を考える。係数の改良はオーダの改良と比べれば本質的ではないが、 今日までのめざましい計算機システムの高速化は(アルゴリズム上の発見を除け ば)基本的には係数が変わっただけであることにも注意したい。複数のプロセッ サを用いた並列化も、基本的には P 台のプロセッサ(コア)を用いて係数を P 分の1にすることを目標とするものである。


Masahiro Yasugi