豊橋技術科学大学体験実習行ってきた

いってきました。テーマは「ソフトウェアの性能測定と性能チューニング」。内容については、最終日につくったまとめを以下に貼っておくので参考にしてください。感想としては、楽しかったですよ。担当の先生にも研究とはとか進路の話とか、実例を交えながらメタな話をしてもらえましたし、実習は知識と実際の関係を知ることが出来てよかったです。

どうもありがとうございました。

実施内容
 ベクトルのノルムの2乗を計算するプログラム norm.c について, ベクトルの長さやアクセス方法を変化させて性能を測定した. これにより, プログラムの性能が低下する要因, 特にキャッシュ構造による物の性質を学んだ.
 性能低下の原因を取り除いた上での高速化の手法として, ループ展開と特化命令の活用を実施した.

性能とは
 性能は単位時間あたりに実行する演算の個数で計ることができる. 特に一秒あたりに実行する浮動小数点数演算の数のことを Flops という. ある計算機の最大性能は仕様から求めることができるが, 実際の問題ではそれを発揮することができない.

データ長と性能
 実行したい演算を行うもっとも内側のループを最内ループという. しかしそれの他にもデータの初期化などの定数時間なオーバーヘッドが存在する. そのために一度のループにおいて演算がより多く行われれば, そうなるほどデータ量が多ければ, オーバーヘッドの影響を小さくすることができる.
 演算を実行するにはデータをメモリから取得する必要がある. しかしメモリは演算器に比べ動作が遅く, 演算器は待たされることになる. それを緩和するために, キャッシュという小容量で高速なメモリが演算器の近くに置かれる.
 そのために, 計算に必要なデータがキャッシュサイズより大きいときは(容量性あふれが起こるときは), メモリからデータを取得することになるため性能が低下してしまう.
 またデータ構造の都合から, メモリ上の一定間隔で離れたデータに連続してアクセスすることがある(ストライドアクセス). この場合もキャッシュの構造上の都合から実行的なキャッシュ容量が低下して見えることがある.

性能の向上
 性能はもっとも劣った点によって制限され, 性能低下の要因を除かなければ他の部分に工夫を施しても性能は向上しない. 性能低下の要因が除かれればプロセッサの構造を生かすことで高速化をすることができる可能性がある.
 プロセッサが持つ高速化のための機構として, パイプラインがある. これによって前後の命令に依存しない命令を次々と実行することができる. その余地を増やす方法としてループ展開という手法がある. ループ展開を行うことで同時に実行されうる命令を増やし高速化される. データの依存性を減らすため, ループ展開と共に結合変換も多くは行う.
 また, ある種の演算には, より多くのデータに対して同時に演算を行えたりする特化命令が存在することがある. これを活用することでより高速化を行うことができる.

まとめ
 高速化のための手法は, その問題に固有の条件が多く容易に一般化できる物でないことがわかった. また性能の向上は人の直観から離れた挙動を示すこともある. 測定による評価は大事だとわかった. 性能改善の手法を見て, 計算機の構造を実感で感じられてよかったと思う.