CPUで1GFLOPS)を持っています。FORTRANを用いてAlphaプロセッサの性能を引き出すプログラミングテクニックを紹介します。1.Alpha21164の構造と性能Alpha21164及び21164Aには浮動小数点演算用に各々7段のステージを持つ乗算、加算パイプラインが用意されています。両パイプラインはデータ投入後7クロック後に計算結果を出力することができます。CPUなら1GFLOPSのピーク性能を実現できます。ある数の乗算を行い、その結果を用いて次の乗算を行なう様なシーケンシャルなプログラムの場合、1GMFLOPSのピーク性能にも拘わらず、500/7=71MFLOPSの性能しか実現できません。t1+t2+t3+t4endプログラム1では、i番目項の乗算を行なって結果をddotに加算し、その後i+1番目の計算を行なう様にプログラムされています。FORTRANでは以下に説明する様に、加算器と乗算器を並列に実行するコードを生成してくれます。FORTRANはループの展開オプションを付けずにコンパイルするとループを展開してコンパイルするので、基本的な性能を計るためループを展開せず(/unroll:1)にコンパイルすると、実行時間は4.65マイクロ秒(110.1MFLOPS)でした。1ループ当り4.65/256=0.018マイクロ秒即ち0.018*500=9クロックで実行したことになります。加算器からの結果を待たずに次の乗算を開始し、加算と乗算を並列に実行したと推測できます。乗算器へのデータ投入後7クロック待っているのは確かです。ロ秒(225.2MFLOPS)でしたので、ループの展開によるオプティマイズが有効になっているのがわかります。改良されたプログラム2では、加算器、乗算器の間の並列だけではなく、7クロック待っている間に次のデータを投入しパイプラインをフルに稼動させようと試みています。このプログラムをループ展開せずにコンパイルしたい場合、実行時間は1.52マイクロ秒(336.1MFLOPS)に短縮され、平均して3サイクルごと加算と乗算を行ないました。式?から?は相互に関連しませんので、式?のデータがパイプラインに投入された後、その結果を待たずに式?のデータが投入されるという様に、四つの式が並列に実行されたのです。/unroll:4、/unroll:16でもほぼ同様の結果となりました。FORTRANはCPUの性能を良く引き出すことができるコンパイラであると言えるでしょう。高速化を図りたい時には、/unrollオプションにトライするのも有効でしょう。高速化を図りたい時には、プログラム2の様に相互に影響しない式を羅列し、パイプラインの効率を上げることも一つの有効な手段です。