課題2: 逐次版LU分解プログラムの高速化

課題1 で完成させたプログラムの高速化を試みる。LU分解 を行うC言語の関数 に対して高速化を試みる。元の関数は消さずに残しておき、 速度比較ができるよう にする。速度比較は行列のサイズ n の変化に対し,LU分解に要する時間が どう変化するか調べること。

以下にはさまざまな高速化手法を示すが、 現在重要になっているのは キャッシュなどに関する局所性を高めることである。 TLBミス,キャッシュミスについて資料・説明 や学科の講義に基づきよく理解しておくことが望ましい。

すくなくともキャッシュミスを減らすような形で高速化を行うことを必須とする が、すべての高速化手法を試す必要はない。余力がある場合、他の実験履修者の 速度を上回りたい場合などに参考にすること。

並列プログラムのサンプルの 最初の説明は高速化に関するものに なっているので参考に.


浮動小数点演算

本演習・実験で用いる計算機システムでは,Intel 386 プロセッサ(と浮動小数点コプロセッサ387)の命令セットに基づくものになって いる。実際のプロセッサは何世代も後継の Intel Core 2 Quad で, Core2 に基づくものになっているが,命令セットは同じと考えてもよい。 浮動小数点演算はPentium 4 で追加されている SSE2, あるいは Prescott (Pentium 4 改良版)で追加されている SSE3 を用いたほうがよい可能性がある.SSE3を浮動小数点演算に用いるためには, gcc [その他のオプション] -msse3 -mfpmath=sse foo.c -o foo のようにする. 逆に,SSE2(SSE3)を用いない場合は 浮動小数点演算はレジスタスタックを用いているので,少し特別に考える 必要がある。

Core 2 Quad 向けの最適化

ここ の「 インテルR 64 アーキテクチャーおよび IA-32 アーキテクチャー最適化リファレンス・マニュアル [日本語: PDF 形式 4,293 KB]」が詳しい。

もちろん、gcc に Core 2 Quad向けの最適化を指示することも有効であろう。 計算機室のCore 2 Quad 3GHzの場合は、 -mtune=core2 を指定する。 (なお、gcc バージョン3.4以降にのみ -mtune があり、 それ以前は -mcpu であった。また -march とすると指定したマシン(だけ)の 命令を生成する。)


多重ループの入れ子の交換


一時変数の導入


強さの軽減


一時的な配列の導入


行列の転置


再帰的アルゴリズム


ブロック化(blocking)


ループ・アンローリング


プリフェッチ


ソフトウェア・パイプライニング


並列プログラミング, 先頭ページへ
Masahiro Yasugi: yasugi@kuis.kyoto-u.ac.jp